diff --git a/LICENSE b/LICENSE
index 7af3211..fa95f12 100644
--- a/LICENSE
+++ b/LICENSE
@@ -17,8 +17,11 @@
 Httplib2 - in samples/third_party/httplib2
 JSON - in third_party/json
 JUnit - in third_party/junit
+NSS - in third_party/nss and third_party/net_nss
 Oauth - in samples/third_party/oauth2client
+SQLite - in third_party/sqlite
 weberknecht - in third_party/weberknecht
+zlib - in third_party/zlib
 fest - in third_party/fest
 mockito - in third_party/mockito
 
diff --git a/pkg/analysis_server/bin/dartdeps.dart b/pkg/analysis_server/bin/dartdeps.dart
index 6fdcb8b..c0eaad4 100644
--- a/pkg/analysis_server/bin/dartdeps.dart
+++ b/pkg/analysis_server/bin/dartdeps.dart
@@ -28,7 +28,7 @@
  */
 class _DartDependencyAnalyzer {
   /**
-   * The name of the application that is used to start the analyzer.
+   * The name of the application that is used to start the dependency analyzer.
    */
   static const BINARY_NAME = 'dartdeps';
 
@@ -180,6 +180,6 @@
     print('Usage: $BINARY_NAME [flags] <application_directory>');
     print('');
     print('Supported flags are:');
-    print(parser.getUsage());
+    print(parser.usage);
   }
 }
diff --git a/pkg/analysis_server/bin/fuzz.dart b/pkg/analysis_server/bin/fuzz.dart
index 8fc71d9..2ca29c2 100644
--- a/pkg/analysis_server/bin/fuzz.dart
+++ b/pkg/analysis_server/bin/fuzz.dart
@@ -25,6 +25,10 @@
  * containing sources to be analyzed.
  */
 class _FuzzTest {
+  /**
+   * The name of the application that is used to start the fuzz tester.
+   */
+  static const BINARY_NAME = 'fuzz';
 
   //TODO (danrubel) extract common behavior for use in multiple test scenarios
   //TODO (danrubel) cleanup test to use async/await for better readability
@@ -158,9 +162,9 @@
 
   /// Print information about how to use the server.
   void _printUsage(ArgParser parser) {
-    print('Usage: analyzer [flags] <application_directory>');
+    print('Usage: $BINARY_NAME [flags] <application_directory>');
     print('');
     print('Supported flags are:');
-    print(parser.getUsage());
+    print(parser.usage);
   }
 }
diff --git a/pkg/analysis_server/doc/api.html b/pkg/analysis_server/doc/api.html
index 12552c5..4b0c556 100644
--- a/pkg/analysis_server/doc/api.html
+++ b/pkg/analysis_server/doc/api.html
@@ -804,8 +804,9 @@
           </dd><dt class="field"><b><i>regions ( List&lt;<a href="#type_NavigationRegion">NavigationRegion</a>&gt; )</i></b></dt><dd>
             
             <p>
-              The navigation regions contained in the file. Each
-              navigation region represents a list of targets
+              The navigation regions contained in the file.
+              The regions are sorted by their offsets.
+              Each navigation region represents a list of targets
               associated with some range. The lists will usually
               contain a single target, but can contain more in the
               case of a part that is included in multiple libraries
@@ -2250,7 +2251,7 @@
           applied to files.
         </p>
         
-      <dl><dt class="value">ANNOTATION</dt><dt class="value">BUILT_IN</dt><dt class="value">CLASS</dt><dt class="value">COMMENT_BLOCK</dt><dt class="value">COMMENT_DOCUMENTATION</dt><dt class="value">COMMENT_END_OF_LINE</dt><dt class="value">CONSTRUCTOR</dt><dt class="value">DIRECTIVE</dt><dt class="value">DYNAMIC_TYPE</dt><dt class="value">FIELD</dt><dt class="value">FIELD_STATIC</dt><dt class="value">FUNCTION</dt><dt class="value">FUNCTION_DECLARATION</dt><dt class="value">FUNCTION_TYPE_ALIAS</dt><dt class="value">GETTER_DECLARATION</dt><dt class="value">IDENTIFIER_DEFAULT</dt><dt class="value">IMPORT_PREFIX</dt><dt class="value">KEYWORD</dt><dt class="value">LABEL</dt><dt class="value">LITERAL_BOOLEAN</dt><dt class="value">LITERAL_DOUBLE</dt><dt class="value">LITERAL_INTEGER</dt><dt class="value">LITERAL_LIST</dt><dt class="value">LITERAL_MAP</dt><dt class="value">LITERAL_STRING</dt><dt class="value">LOCAL_VARIABLE</dt><dt class="value">LOCAL_VARIABLE_DECLARATION</dt><dt class="value">METHOD</dt><dt class="value">METHOD_DECLARATION</dt><dt class="value">METHOD_DECLARATION_STATIC</dt><dt class="value">METHOD_STATIC</dt><dt class="value">PARAMETER</dt><dt class="value">SETTER_DECLARATION</dt><dt class="value">TOP_LEVEL_VARIABLE</dt><dt class="value">TYPE_NAME_DYNAMIC</dt><dt class="value">TYPE_PARAMETER</dt></dl></dd><dt class="typeDefinition"><a name="type_HoverInformation">HoverInformation: object</a></dt><dd>
+      <dl><dt class="value">ANNOTATION</dt><dt class="value">BUILT_IN</dt><dt class="value">CLASS</dt><dt class="value">COMMENT_BLOCK</dt><dt class="value">COMMENT_DOCUMENTATION</dt><dt class="value">COMMENT_END_OF_LINE</dt><dt class="value">CONSTRUCTOR</dt><dt class="value">DIRECTIVE</dt><dt class="value">DYNAMIC_TYPE</dt><dt class="value">ENUM</dt><dt class="value">ENUM_CONSTANT</dt><dt class="value">FIELD</dt><dt class="value">FIELD_STATIC</dt><dt class="value">FUNCTION</dt><dt class="value">FUNCTION_DECLARATION</dt><dt class="value">FUNCTION_TYPE_ALIAS</dt><dt class="value">GETTER_DECLARATION</dt><dt class="value">IDENTIFIER_DEFAULT</dt><dt class="value">IMPORT_PREFIX</dt><dt class="value">KEYWORD</dt><dt class="value">LABEL</dt><dt class="value">LITERAL_BOOLEAN</dt><dt class="value">LITERAL_DOUBLE</dt><dt class="value">LITERAL_INTEGER</dt><dt class="value">LITERAL_LIST</dt><dt class="value">LITERAL_MAP</dt><dt class="value">LITERAL_STRING</dt><dt class="value">LOCAL_VARIABLE</dt><dt class="value">LOCAL_VARIABLE_DECLARATION</dt><dt class="value">METHOD</dt><dt class="value">METHOD_DECLARATION</dt><dt class="value">METHOD_DECLARATION_STATIC</dt><dt class="value">METHOD_STATIC</dt><dt class="value">PARAMETER</dt><dt class="value">SETTER_DECLARATION</dt><dt class="value">TOP_LEVEL_VARIABLE</dt><dt class="value">TYPE_NAME_DYNAMIC</dt><dt class="value">TYPE_PARAMETER</dt></dl></dd><dt class="typeDefinition"><a name="type_HoverInformation">HoverInformation: object</a></dt><dd>
         <p>
           The hover information associated with a specific location.
         </p>
diff --git a/pkg/analysis_server/lib/driver.dart b/pkg/analysis_server/lib/driver.dart
index 284cf60..597dc19 100644
--- a/pkg/analysis_server/lib/driver.dart
+++ b/pkg/analysis_server/lib/driver.dart
@@ -4,6 +4,7 @@
 
 library driver;
 
+import 'dart:async';
 import 'dart:io';
 
 import 'package:analysis_server/http_server.dart';
@@ -125,12 +126,28 @@
     if (serve_http) {
       httpServer.serveHttp(port);
     }
-    stdioServer.serveStdio().then((_) {
-      if (serve_http) {
-        httpServer.close();
-      }
-      exit(0);
+    _capturePrints(() {
+      stdioServer.serveStdio().then((_) {
+        if (serve_http) {
+          httpServer.close();
+        }
+        exit(0);
+      });
+    }, httpServer.recordPrint);
+  }
+
+  /**
+   * Execute [callback], capturing any data it prints out and redirecting it to
+   * the function [printHandler].
+   */
+  dynamic _capturePrints(dynamic callback(), void printHandler(String line)) {
+    ZoneSpecification zoneSpecification = new ZoneSpecification(print:
+        (Zone self, ZoneDelegate parent, Zone zone, String line) {
+      printHandler(line);
+      // Note: we don't pass the line on to stdout, because that is reserved
+      // for communication to the client.
     });
+    return runZoned(callback, zoneSpecification: zoneSpecification);
   }
 
   /**
@@ -140,6 +157,6 @@
     print('Usage: $BINARY_NAME [flags]');
     print('');
     print('Supported flags are:');
-    print(parser.getUsage());
+    print(parser.usage);
   }
 }
diff --git a/pkg/analysis_server/lib/http_server.dart b/pkg/analysis_server/lib/http_server.dart
index 1fbd0af..ef22a81 100644
--- a/pkg/analysis_server/lib/http_server.dart
+++ b/pkg/analysis_server/lib/http_server.dart
@@ -18,6 +18,11 @@
  */
 class HttpAnalysisServer {
   /**
+   * Number of lines of print output to capture.
+   */
+  static const int MAX_PRINT_BUFFER_LENGTH = 1000;
+
+  /**
    * An object that can handle either a WebSocket connection or a connection
    * to the client over stdio.
    */
@@ -39,6 +44,11 @@
   Future<HttpServer> _server;
 
   /**
+   * Last PRINT_BUFFER_LENGTH lines printed.
+   */
+  List<String> _printBuffer = <String>[];
+
+  /**
    * Attach a listener to a newly created HTTP server.
    */
   void _handleServer(HttpServer httServer) {
@@ -61,7 +71,7 @@
    */
   void _handleGetRequest(HttpRequest request) {
     if (getHandler == null) {
-      getHandler = new GetHandler(socketServer);
+      getHandler = new GetHandler(socketServer, _printBuffer);
     }
     getHandler.handleGetRequest(request);
   }
@@ -99,4 +109,15 @@
       server.close();
     });
   }
+
+  /**
+   * Record that the given line was printed out by the analysis server.
+   */
+  void recordPrint(String line) {
+    _printBuffer.add(line);
+    if (_printBuffer.length > MAX_PRINT_BUFFER_LENGTH) {
+      _printBuffer.removeRange(0,
+          _printBuffer.length - MAX_PRINT_BUFFER_LENGTH);
+    }
+  }
 }
diff --git a/pkg/analysis_server/lib/src/analysis_server.dart b/pkg/analysis_server/lib/src/analysis_server.dart
index 6daf3e1..2ad03fd 100644
--- a/pkg/analysis_server/lib/src/analysis_server.dart
+++ b/pkg/analysis_server/lib/src/analysis_server.dart
@@ -16,7 +16,6 @@
 import 'package:analysis_server/src/operation/operation_queue.dart';
 import 'package:analysis_server/src/protocol.dart' hide Element;
 import 'package:analyzer/source/package_map_provider.dart';
-import 'package:analyzer/source/package_map_resolver.dart';
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/source.dart';
@@ -42,10 +41,10 @@
       : super(resourceProvider, packageMapProvider);
 
   @override
-  void addContext(Folder folder, Map<String, List<Folder>> packageMap) {
+  void addContext(Folder folder, UriResolver packageUriResolver) {
     AnalysisContext context = AnalysisEngine.instance.createAnalysisContext();
     analysisServer.folderMap[folder] = context;
-    context.sourceFactory = _createSourceFactory(packageMap);
+    context.sourceFactory = _createSourceFactory(packageUriResolver);
     context.analysisOptions = new AnalysisOptionsImpl.con1(defaultOptions);
     analysisServer.schedulePerformAnalysisOperation(context);
   }
@@ -71,22 +70,22 @@
   }
 
   @override
-  void updateContextPackageMap(Folder contextFolder, Map<String,
-      List<Folder>> packageMap) {
+  void updateContextPackageUriResolver(Folder contextFolder,
+                                       UriResolver packageUriResolver) {
     AnalysisContext context = analysisServer.folderMap[contextFolder];
-    context.sourceFactory = _createSourceFactory(packageMap);
+    context.sourceFactory = _createSourceFactory(packageUriResolver);
     analysisServer.schedulePerformAnalysisOperation(context);
   }
 
   /**
    * Set up a [SourceFactory] that resolves packages using the given
-   * [packageMap].
+   * [packageUriResolver].
    */
-  SourceFactory _createSourceFactory(Map<String, List<Folder>> packageMap) {
+  SourceFactory _createSourceFactory(UriResolver packageUriResolver) {
     List<UriResolver> resolvers = <UriResolver>[
         new DartUriResolver(analysisServer.defaultSdk),
         new ResourceUriResolver(resourceProvider),
-        new PackageMapUriResolver(resourceProvider, packageMap)];
+        packageUriResolver];
     return new SourceFactory(resolvers);
   }
 }
@@ -181,14 +180,15 @@
 
   /**
    * A queue of the operations to perform in this server.
-   *
-   * Invariant: when this queue is non-empty, there is exactly one pending call
-   * to [performOperation] on the event queue.  When this list is empty, there are
-   * no calls to [performOperation] on the event queue.
    */
   ServerOperationQueue operationQueue;
 
   /**
+   * True if there is a pending future which will execute [performOperation].
+   */
+  bool performOperationPending = false;
+
+  /**
    * A set of the [ServerService]s to send notifications for.
    */
   Set<ServerService> serverServices = new HashSet<ServerService>();
@@ -269,9 +269,8 @@
    * Schedules execution of the given [ServerOperation].
    */
   void scheduleOperation(ServerOperation operation) {
-    bool wasEmpty = operationQueue.isEmpty;
     addOperation(operation);
-    if (wasEmpty) {
+    if (!performOperationPending) {
       _schedulePerformOperation();
     }
   }
@@ -486,6 +485,8 @@
    * Perform the next available [ServerOperation].
    */
   void performOperation() {
+    assert(performOperationPending);
+    performOperationPending = false;
     if (!running) {
       // An error has occurred, or the connection to the client has been
       // closed, since this method was scheduled on the event queue.  So
@@ -495,6 +496,12 @@
     }
     // prepare next operation
     ServerOperation operation = operationQueue.take();
+    if (operation == null) {
+      // This can happen if the operation queue is cleared while the operation
+      // loop is in progress.  No problem; we just need to exit the operation
+      // loop and wait for the next operation to be added.
+      return;
+    }
     sendStatusNotification(operation);
     // perform the operation
     try {
@@ -791,7 +798,7 @@
     List<Source> librarySources = context.getLibrariesContaining(unitSource);
     for (Source librarySource in librarySources) {
       CompilationUnit unit =
-          context.getResolvedCompilationUnit2(unitSource, librarySource);
+          context.resolveCompilationUnit2(unitSource, librarySource);
       if (unit != null) {
         units.add(unit);
       }
@@ -801,7 +808,7 @@
   }
 
   /**
-   * Returns [AstNode]s at the given [offset] of the given [file].
+   * Returns resolved [AstNode]s at the given [offset] of the given [file].
    *
    * May be empty, but not `null`.
    */
@@ -820,7 +827,7 @@
   /**
    * Returns [Element]s at the given [offset] of the given [file].
    *
-   * May be empty if not resolved, but not `null`.
+   * May be empty if cannot be resolved, but not `null`.
    */
   List<Element> getElementsAtOffset(String file, int offset) {
     List<AstNode> nodes = getNodesAtOffset(file, offset);
@@ -912,7 +919,9 @@
    * Schedules [performOperation] exection.
    */
   void _schedulePerformOperation() {
+    assert (!performOperationPending);
     new Future(performOperation);
+    performOperationPending = true;
   }
 
   /**
diff --git a/pkg/analysis_server/lib/src/channel/byte_stream_channel.dart b/pkg/analysis_server/lib/src/channel/byte_stream_channel.dart
index 2ab4441..cc0274d 100644
--- a/pkg/analysis_server/lib/src/channel/byte_stream_channel.dart
+++ b/pkg/analysis_server/lib/src/channel/byte_stream_channel.dart
@@ -103,7 +103,10 @@
     if (_closed.isCompleted) {
       return;
     }
-    output.writeln(JSON.encode(notification.toJson()));
+    ServerCommunicationChannel.ToJson.start();
+    String jsonEncoding = JSON.encode(notification.toJson());
+    ServerCommunicationChannel.ToJson.stop();
+    output.writeln(jsonEncoding);
   }
 
   @override
@@ -113,7 +116,10 @@
     if (_closed.isCompleted) {
       return;
     }
-    output.writeln(JSON.encode(response.toJson()));
+    ServerCommunicationChannel.ToJson.start();
+    String jsonEncoding = JSON.encode(response.toJson());
+    ServerCommunicationChannel.ToJson.stop();
+    output.writeln(jsonEncoding);
   }
 
   /**
@@ -127,7 +133,9 @@
     }
     // Parse the string as a JSON descriptor and process the resulting
     // structure as a request.
+    ServerCommunicationChannel.FromJson.start();
     Request request = new Request.fromString(data);
+    ServerCommunicationChannel.FromJson.stop();
     if (request == null) {
       sendResponse(new Response.invalidRequestFormat());
       return;
diff --git a/pkg/analysis_server/lib/src/channel/channel.dart b/pkg/analysis_server/lib/src/channel/channel.dart
index 4e4ab2a..107b8b0 100644
--- a/pkg/analysis_server/lib/src/channel/channel.dart
+++ b/pkg/analysis_server/lib/src/channel/channel.dart
@@ -8,6 +8,7 @@
 import 'dart:convert';
 
 import 'package:analysis_server/src/protocol.dart';
+import 'package:analyzer/src/util/utilities_timing.dart';
 
 /**
  * The abstract class [ClientCommunicationChannel] defines the behavior of
@@ -45,6 +46,18 @@
  */
 abstract class ServerCommunicationChannel {
   /**
+   * A stopwatch used to accumulate the amount of time spent converting
+   * incomming requests from Json to objects.
+   */
+  static final CountedStopwatch FromJson = new CountedStopwatch();
+
+  /**
+   * A stopwatch used to accumulate the amount of time spent converting outgoing
+   * responses and notifications from objects to Json.
+   */
+  static final CountedStopwatch ToJson = new CountedStopwatch();
+
+  /**
    * Listen to the channel for requests. If a request is received, invoke the
    * [onRequest] function. If an error is encountered while trying to read from
    * the socket, invoke the [onError] function. If the socket is closed by the
diff --git a/pkg/analysis_server/lib/src/channel/web_socket_channel.dart b/pkg/analysis_server/lib/src/channel/web_socket_channel.dart
index 21835da..c661bfb 100644
--- a/pkg/analysis_server/lib/src/channel/web_socket_channel.dart
+++ b/pkg/analysis_server/lib/src/channel/web_socket_channel.dart
@@ -85,12 +85,18 @@
 
   @override
   void sendNotification(Notification notification) {
-    socket.add(JSON.encode(notification.toJson()));
+    ServerCommunicationChannel.ToJson.start();
+    String jsonEncoding = JSON.encode(notification.toJson());
+    ServerCommunicationChannel.ToJson.stop();
+    socket.add(jsonEncoding);
   }
 
   @override
   void sendResponse(Response response) {
-    socket.add(JSON.encode(response.toJson()));
+    ServerCommunicationChannel.ToJson.start();
+    String jsonEncoding = JSON.encode(response.toJson());
+    ServerCommunicationChannel.ToJson.stop();
+    socket.add(jsonEncoding);
   }
 
   /**
@@ -101,7 +107,9 @@
     if (data is String) {
       // Parse the string as a JSON descriptor and process the resulting
       // structure as a request.
+      ServerCommunicationChannel.FromJson.start();
       Request request = new Request.fromString(data);
+      ServerCommunicationChannel.FromJson.stop();
       if (request == null) {
         sendResponse(new Response.invalidRequestFormat());
         return;
diff --git a/pkg/analysis_server/lib/src/computer/computer_highlights.dart b/pkg/analysis_server/lib/src/computer/computer_highlights.dart
index 20f618f..50c5171 100644
--- a/pkg/analysis_server/lib/src/computer/computer_highlights.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_highlights.dart
@@ -118,7 +118,16 @@
     if (element is! ClassElement) {
       return false;
     }
-    return _addRegion_node(node, HighlightRegionType.CLASS);
+    ClassElement classElement = element;
+    // prepare type
+    HighlightRegionType type;
+    if (classElement.isEnum) {
+      type = HighlightRegionType.ENUM;
+    } else {
+      type = HighlightRegionType.CLASS;
+    }
+    // add region
+    return _addRegion_node(node, type);
   }
 
   bool _addIdentifierRegion_constructor(SimpleIdentifier node) {
@@ -156,15 +165,23 @@
     if (element is PropertyAccessorElement) {
       element = (element as PropertyAccessorElement).variable;
     }
+    // prepare type
+    HighlightRegionType type;
     if (element is FieldElement) {
-      if ((element as FieldElement).isStatic) {
-        return _addRegion_node(node, HighlightRegionType.FIELD_STATIC);
+      Element enclosingElement = element.enclosingElement;
+      if (enclosingElement is ClassElement && enclosingElement.isEnum) {
+        type = HighlightRegionType.ENUM_CONSTANT;
+      } else if ((element as FieldElement).isStatic) {
+        type = HighlightRegionType.FIELD_STATIC;
       } else {
-        return _addRegion_node(node, HighlightRegionType.FIELD);
+        type = HighlightRegionType.FIELD;
       }
+    } else if (element is TopLevelVariableElement) {
+      type = HighlightRegionType.TOP_LEVEL_VARIABLE;
     }
-    if (element is TopLevelVariableElement) {
-      return _addRegion_node(node, HighlightRegionType.TOP_LEVEL_VARIABLE);
+    // add region
+    if (type != null) {
+      return _addRegion_node(node, type);
     }
     return false;
   }
@@ -354,6 +371,18 @@
   }
 
   @override
+  Object visitAwaitExpression(AwaitExpression node) {
+    computer._addRegion_token(node.awaitKeyword, HighlightRegionType.BUILT_IN);
+    return super.visitAwaitExpression(node);
+  }
+
+  @override
+  Object visitBlockFunctionBody(BlockFunctionBody node) {
+    _addRegions_functionBody(node);
+    return super.visitBlockFunctionBody(node);
+  }
+
+  @override
   Object visitBooleanLiteral(BooleanLiteral node) {
     computer._addRegion_node(node, HighlightRegionType.KEYWORD);
     computer._addRegion_node(node, HighlightRegionType.LITERAL_BOOLEAN);
@@ -421,6 +450,12 @@
   }
 
   @override
+  Object visitEnumDeclaration(EnumDeclaration node) {
+    computer._addRegion_token(node.keyword, HighlightRegionType.KEYWORD);
+    return super.visitEnumDeclaration(node);
+  }
+
+  @override
   Object visitExportDirective(ExportDirective node) {
     computer._addRegion_node(node, HighlightRegionType.DIRECTIVE);
     computer._addRegion_token(node.keyword, HighlightRegionType.BUILT_IN);
@@ -428,6 +463,12 @@
   }
 
   @override
+  Object visitExpressionFunctionBody(ExpressionFunctionBody node) {
+    _addRegions_functionBody(node);
+    return super.visitExpressionFunctionBody(node);
+  }
+
+  @override
   Object visitFieldDeclaration(FieldDeclaration node) {
     computer._addRegion_token(node.staticKeyword, HighlightRegionType.BUILT_IN);
     return super.visitFieldDeclaration(node);
@@ -671,4 +712,24 @@
     computer._addRegion_token(node.withKeyword, HighlightRegionType.KEYWORD);
     return super.visitWithClause(node);
   }
+
+  @override
+  Object visitYieldStatement(YieldStatement node) {
+    Token keyword = node.yieldKeyword;
+    Token star = node.star;
+    int offset = keyword.offset;
+    int end = star != null ? star.end : keyword.end;
+    computer._addRegion(offset, end - offset, HighlightRegionType.BUILT_IN);
+    return super.visitYieldStatement(node);
+  }
+
+  void _addRegions_functionBody(FunctionBody node) {
+    Token keyword = node.keyword;
+    if (keyword != null) {
+      Token star = node.star;
+      int offset = keyword.offset;
+      int end = star != null ? star.end : keyword.end;
+      computer._addRegion(offset, end - offset, HighlightRegionType.BUILT_IN);
+    }
+  }
 }
diff --git a/pkg/analysis_server/lib/src/computer/computer_navigation.dart b/pkg/analysis_server/lib/src/computer/computer_navigation.dart
index 17f9af5..a21ec59 100644
--- a/pkg/analysis_server/lib/src/computer/computer_navigation.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_navigation.dart
@@ -36,10 +36,35 @@
     if (element == null || element == DynamicElementImpl.instance) {
       return;
     }
+    if (element.location == null) {
+      return;
+    }
     protocol.Element target = protocol.newElement_fromEngine(element);
     _regions.add(new protocol.NavigationRegion(offset, length, [target]));
   }
 
+  void _addRegion_nodeStart_nodeEnd(AstNode a, AstNode b, Element element) {
+    int offset = a.offset;
+    int length = b.end - offset;
+    _addRegion(offset, length, element);
+  }
+
+  void _addRegion_nodeStart_nodeStart(AstNode a, AstNode b, Element element,
+      {bool excludeLastChar: false}) {
+    int offset = a.offset;
+    int length = b.offset - offset;
+    if (excludeLastChar) {
+      length--;
+    }
+    _addRegion(offset, length, element);
+  }
+
+  void _addRegion_tokenStart_nodeEnd(Token a, AstNode b, Element element) {
+    int offset = a.offset;
+    int length = b.end - offset;
+    _addRegion(offset, length, element);
+  }
+
   void _addRegionForNode(AstNode node, Element element) {
     int offset = node.offset;
     int length = node.length;
@@ -51,24 +76,6 @@
     int length = token.length;
     _addRegion(offset, length, element);
   }
-
-  void _addRegion_nodeStart_nodeEnd(AstNode a, AstNode b, Element element) {
-    int offset = a.offset;
-    int length = b.end - offset;
-    _addRegion(offset, length, element);
-  }
-
-  void _addRegion_nodeStart_nodeStart(AstNode a, AstNode b, Element element) {
-    int offset = a.offset;
-    int length = b.offset - offset;
-    _addRegion(offset, length, element);
-  }
-
-  void _addRegion_tokenStart_nodeEnd(Token a, AstNode b, Element element) {
-    int offset = a.offset;
-    int length = b.end - offset;
-    _addRegion(offset, length, element);
-  }
 }
 
 
@@ -79,14 +86,31 @@
 
   @override
   visitAssignmentExpression(AssignmentExpression node) {
+    _safelyVisit(node.leftHandSide);
     computer._addRegionForToken(node.operator, node.bestElement);
-    return super.visitAssignmentExpression(node);
+    _safelyVisit(node.rightHandSide);
   }
 
   @override
   visitBinaryExpression(BinaryExpression node) {
+    _safelyVisit(node.leftOperand);
     computer._addRegionForToken(node.operator, node.bestElement);
-    return super.visitBinaryExpression(node);
+    _safelyVisit(node.rightOperand);
+  }
+
+  @override
+  visitCompilationUnit(CompilationUnit unit) {
+    // prepare top-level nodes sorted by their offsets
+    List<AstNode> nodes = <AstNode>[];
+    nodes.addAll(unit.directives);
+    nodes.addAll(unit.declarations);
+    nodes.sort((a, b) {
+      return a.offset - b.offset;
+    });
+    // visit sorted nodes
+    for (AstNode node in nodes) {
+      node.accept(this);
+    }
   }
 
   @override
@@ -105,7 +129,7 @@
             node.element);
       }
     }
-    return super.visitConstructorDeclaration(node);
+    super.visitConstructorDeclaration(node);
   }
 
   @override
@@ -115,7 +139,7 @@
       Element element = exportElement.exportedLibrary;
       computer._addRegion_tokenStart_nodeEnd(node.keyword, node.uri, element);
     }
-    return super.visitExportDirective(node);
+    super.visitExportDirective(node);
   }
 
   @override
@@ -125,13 +149,13 @@
       Element element = importElement.importedLibrary;
       computer._addRegion_tokenStart_nodeEnd(node.keyword, node.uri, element);
     }
-    return super.visitImportDirective(node);
+    super.visitImportDirective(node);
   }
 
   @override
   visitIndexExpression(IndexExpression node) {
+    super.visitIndexExpression(node);
     computer._addRegionForToken(node.rightBracket, node.bestElement);
-    return super.visitIndexExpression(node);
   }
 
   @override
@@ -147,13 +171,14 @@
             node.argumentList,
             element);
       } else {
-        // add region for "type" first, so that it is found before "new "
-        computer._addRegionForNode(constructorName.type, classElement);
-        // "new "
+        // "new ", excluding last character
         computer._addRegion_nodeStart_nodeStart(
             node,
             constructorName.type,
-            element);
+            element,
+            excludeLastChar: true);
+        // "ClassName"
+        computer._addRegionForNode(constructorName.type, classElement);
         // optional ".name"
         if (constructorName.period != null) {
           computer._addRegion_tokenStart_nodeEnd(
@@ -163,7 +188,7 @@
         }
       }
     }
-    return super.visitInstanceCreationExpression(node);
+    _safelyVisit(node.argumentList);
   }
 
   @override
@@ -172,7 +197,7 @@
         node.keyword,
         node.uri,
         node.element);
-    return super.visitPartDirective(node);
+    super.visitPartDirective(node);
   }
 
   @override
@@ -181,27 +206,33 @@
         node.keyword,
         node.libraryName,
         node.element);
-    return super.visitPartOfDirective(node);
+    super.visitPartOfDirective(node);
   }
 
   @override
   visitPostfixExpression(PostfixExpression node) {
+    super.visitPostfixExpression(node);
     computer._addRegionForToken(node.operator, node.bestElement);
-    return super.visitPostfixExpression(node);
   }
 
   @override
   visitPrefixExpression(PrefixExpression node) {
     computer._addRegionForToken(node.operator, node.bestElement);
-    return super.visitPrefixExpression(node);
+    super.visitPrefixExpression(node);
   }
 
   @override
   visitSimpleIdentifier(SimpleIdentifier node) {
     if (node.parent is ConstructorDeclaration) {
-    } else {
-      computer._addRegionForNode(node, node.bestElement);
+      return;
     }
-    return super.visitSimpleIdentifier(node);
+    Element element = node.bestElement;
+    computer._addRegionForNode(node, element);
+  }
+
+  void _safelyVisit(AstNode node) {
+    if (node != null) {
+      node.accept(this);
+    }
   }
 }
diff --git a/pkg/analysis_server/lib/src/context_manager.dart b/pkg/analysis_server/lib/src/context_manager.dart
index 7b9b4e1..2447fcd 100644
--- a/pkg/analysis_server/lib/src/context_manager.dart
+++ b/pkg/analysis_server/lib/src/context_manager.dart
@@ -9,8 +9,11 @@
 
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/source/package_map_provider.dart';
+import 'package:analyzer/source/package_map_resolver.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/generated/source_io.dart';
+import 'package:analyzer/src/generated/java_io.dart';
 import 'package:path/path.dart' as pathos;
 import 'package:watcher/watcher.dart';
 
@@ -66,19 +69,25 @@
   Map<String, String> packageRoots = <String, String>{};
 
   /**
+   * Same as [packageRoots], except that source folders have been normalized
+   * and non-folders have been removed.
+   */
+  Map<String, String> normalizedPackageRoots = <String, String>{};
+
+  /**
    * Provider which is used to determine the mapping from package name to
    * package folder.
    */
-  final PackageMapProvider packageMapProvider;
+  final PackageMapProvider _packageMapProvider;
 
-  ContextManager(this.resourceProvider, this.packageMapProvider) {
+  ContextManager(this.resourceProvider, this._packageMapProvider) {
     pathContext = resourceProvider.pathContext;
   }
 
   /**
    * Called when a new context needs to be created.
    */
-  void addContext(Folder folder, Map<String, List<Folder>> packageMap);
+  void addContext(Folder folder, UriResolver packageUriResolver);
 
   /**
    * Called when the set of files associated with a context have changed (or
@@ -130,8 +139,18 @@
    */
   void setRoots(List<String> includedPaths, List<String> excludedPaths,
       Map<String, String> packageRoots) {
-    // TODO(paulberry): process package roots.
     this.packageRoots = packageRoots;
+
+    // Normalize all package root sources by mapping them to folders on the
+    // filesystem.  Ignore any package root sources that aren't folders.
+    normalizedPackageRoots = <String, String>{};
+    packageRoots.forEach((String sourcePath, String targetPath) {
+      Resource resource = resourceProvider.getResource(sourcePath);
+      if (resource is Folder) {
+        normalizedPackageRoots[resource.path] = targetPath;
+      }
+    });
+
     List<Folder> contextFolders = _contexts.keys.toList();
     // included
     Set<Folder> includedFolders = new HashSet<Folder>();
@@ -160,6 +179,14 @@
         _destroyContext(contextFolder);
       }
     }
+    // Update package roots for existing contexts
+    _contexts.forEach((Folder folder, _ContextInfo info) {
+      String newPackageRoot = normalizedPackageRoots[folder.path];
+      if (info.packageRoot != newPackageRoot) {
+        info.packageRoot = newPackageRoot;
+        _recomputePackageUriResolver(info);
+      }
+    });
     // create new contexts
     for (Folder includedFolder in includedFolders) {
       bool wasIncluded = contextFolders.any((folder) {
@@ -198,8 +225,8 @@
   /**
    * Called when the package map for a context has changed.
    */
-  void updateContextPackageMap(Folder contextFolder, Map<String,
-      List<Folder>> packageMap);
+  void updateContextPackageUriResolver(Folder contextFolder,
+                                       UriResolver packageUriResolver);
 
   /**
    * Resursively adds all Dart and HTML files to the [changeSet].
@@ -266,20 +293,39 @@
   }
 
   /**
+   * Compute the appropriate package URI resolver for [folder], and store
+   * dependency information in [info].
+   */
+  UriResolver _computePackageUriResolver(Folder folder, _ContextInfo info) {
+    UriResolver packageUriResolver;
+    if (info.packageRoot != null) {
+      info.packageMapDependencies = new Set<String>();
+      packageUriResolver = new PackageUriResolver(
+          [new JavaFile(info.packageRoot)]);
+    } else {
+      PackageMapInfo packageMapInfo =
+          _packageMapProvider.computePackageMap(folder);
+      info.packageMapDependencies = packageMapInfo.dependencies;
+      packageUriResolver = new PackageMapUriResolver(
+          resourceProvider, packageMapInfo.packageMap);
+      // TODO(paulberry): if any of the dependencies is outside of [folder],
+      // we'll need to watch their parent folders as well.
+    }
+    return packageUriResolver;
+  }
+
+  /**
    * Create a new empty context associated with [folder].
    */
   _ContextInfo _createContext(Folder folder, List<_ContextInfo> children) {
-    _ContextInfo info = new _ContextInfo(folder, children);
+    _ContextInfo info = new _ContextInfo(folder, children,
+        normalizedPackageRoots[folder.path]);
     _contexts[folder] = info;
     info.changeSubscription = folder.changes.listen((WatchEvent event) {
       _handleWatchEvent(folder, info, event);
     });
-    PackageMapInfo packageMapInfo =
-        packageMapProvider.computePackageMap(folder);
-    info.packageMapDependencies = packageMapInfo.dependencies;
-    // TODO(paulberry): if any of the dependencies is outside of [folder],
-    // we'll need to watch their parent folders as well.
-    addContext(folder, packageMapInfo.packageMap);
+    UriResolver packageUriResolver = _computePackageUriResolver(folder, info);
+    addContext(folder, packageUriResolver);
     return info;
   }
 
@@ -439,14 +485,7 @@
     }
 
     if (info.packageMapDependencies.contains(path)) {
-      // TODO(paulberry): when computePackageMap is changed into an
-      // asynchronous API call, we'll want to suspend analysis for this context
-      // while we're rerunning "pub list", since any analysis we complete while
-      // "pub list" is in progress is just going to get thrown away anyhow.
-      PackageMapInfo packageMapInfo =
-          packageMapProvider.computePackageMap(folder);
-      info.packageMapDependencies = packageMapInfo.dependencies;
-      updateContextPackageMap(folder, packageMapInfo.packageMap);
+      _recomputePackageUriResolver(info);
     }
   }
 
@@ -505,6 +544,20 @@
     }
   }
 
+  /**
+   * Recompute the package URI resolver for the context described by [info],
+   * and update the client appropriately.
+   */
+  void _recomputePackageUriResolver(_ContextInfo info) {
+    // TODO(paulberry): when computePackageMap is changed into an
+    // asynchronous API call, we'll want to suspend analysis for this context
+    // while we're rerunning "pub list", since any analysis we complete while
+    // "pub list" is in progress is just going to get thrown away anyhow.
+    UriResolver packageUriResolver =
+        _computePackageUriResolver(info.folder, info);
+    updateContextPackageUriResolver(info.folder, packageUriResolver);
+  }
+
   static bool _shouldFileBeAnalyzed(File file) {
     if (!(AnalysisEngine.isDartFileName(file.path) ||
         AnalysisEngine.isHtmlFileName(file.path))) {
@@ -534,6 +587,11 @@
   final List<_ContextInfo> children;
 
   /**
+   * The package root for this context, or null if there is no package root.
+   */
+  String packageRoot;
+
+  /**
    * The [_ContextInfo] that encloses this one.
    */
   _ContextInfo parent;
@@ -561,7 +619,7 @@
    */
   Set<String> packageMapDependencies;
 
-  _ContextInfo(this.folder, this.children) {
+  _ContextInfo(this.folder, this.children, this.packageRoot) {
     pubspecPath = folder.getChild(PUBSPEC_NAME).path;
     for (_ContextInfo child in children) {
       child.parent = this;
diff --git a/pkg/analysis_server/lib/src/generated_protocol.dart b/pkg/analysis_server/lib/src/generated_protocol.dart
index 11aaca3..ccc138d 100644
--- a/pkg/analysis_server/lib/src/generated_protocol.dart
+++ b/pkg/analysis_server/lib/src/generated_protocol.dart
@@ -1542,12 +1542,13 @@
   String file;
 
   /**
-   * The navigation regions contained in the file. Each navigation region
-   * represents a list of targets associated with some range. The lists will
-   * usually contain a single target, but can contain more in the case of a
-   * part that is included in multiple libraries or in Dart code that is
-   * compiled against multiple versions of a package. Note that the navigation
-   * regions that are returned do not overlap other navigation regions.
+   * The navigation regions contained in the file. The regions are sorted by
+   * their offsets. Each navigation region represents a list of targets
+   * associated with some range. The lists will usually contain a single
+   * target, but can contain more in the case of a part that is included in
+   * multiple libraries or in Dart code that is compiled against multiple
+   * versions of a package. Note that the navigation regions that are returned
+   * do not overlap other navigation regions.
    */
   List<NavigationRegion> regions;
 
@@ -6409,6 +6410,8 @@
  *   CONSTRUCTOR
  *   DIRECTIVE
  *   DYNAMIC_TYPE
+ *   ENUM
+ *   ENUM_CONSTANT
  *   FIELD
  *   FIELD_STATIC
  *   FUNCTION
@@ -6457,6 +6460,10 @@
 
   static const DYNAMIC_TYPE = const HighlightRegionType._("DYNAMIC_TYPE");
 
+  static const ENUM = const HighlightRegionType._("ENUM");
+
+  static const ENUM_CONSTANT = const HighlightRegionType._("ENUM_CONSTANT");
+
   static const FIELD = const HighlightRegionType._("FIELD");
 
   static const FIELD_STATIC = const HighlightRegionType._("FIELD_STATIC");
@@ -6535,6 +6542,10 @@
         return DIRECTIVE;
       case "DYNAMIC_TYPE":
         return DYNAMIC_TYPE;
+      case "ENUM":
+        return ENUM;
+      case "ENUM_CONSTANT":
+        return ENUM_CONSTANT;
       case "FIELD":
         return FIELD;
       case "FIELD_STATIC":
diff --git a/pkg/analysis_server/lib/src/get_handler.dart b/pkg/analysis_server/lib/src/get_handler.dart
index f0f577f..91fe13b 100644
--- a/pkg/analysis_server/lib/src/get_handler.dart
+++ b/pkg/analysis_server/lib/src/get_handler.dart
@@ -4,9 +4,13 @@
 
 library get.handler;
 
+import 'dart:convert';
 import 'dart:io';
 
 import 'package:analysis_server/src/socket_server.dart';
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/java_engine.dart';
 
 /**
  * Instances of the class [GetHandler] handle GET requests.
@@ -23,9 +27,14 @@
   SocketServer _server;
 
   /**
+   * Buffer containing strings printed by the analysis server.
+   */
+  List<String> _printBuffer;
+
+  /**
    * Initialize a newly created handler for GET requests.
    */
-  GetHandler(SocketServer this._server);
+  GetHandler(this._server, this._printBuffer);
 
   /**
    * Handle a GET request received by the HTTP server.
@@ -63,59 +72,63 @@
           response,
           ['Context', 'ERROR', 'FLUSHED', 'IN_PROCESS', 'INVALID', 'VALID'],
           true);
-      // TODO(scheglov) replace with using folder based contexts
-//      _server.analysisServer.contextMap.forEach((String key, AnalysisContext context) {
-//        AnalysisContentStatistics statistics =
-//            (context as AnalysisContextImpl).statistics;
-//        int errorCount = 0;
-//        int flushedCount = 0;
-//        int inProcessCount = 0;
-//        int invalidCount = 0;
-//        int validCount = 0;
-//        statistics.cacheRows.forEach((AnalysisContentStatistics_CacheRow row) {
-//          errorCount += row.errorCount;
-//          flushedCount += row.flushedCount;
-//          inProcessCount += row.inProcessCount;
-//          invalidCount += row.invalidCount;
-//          validCount += row.validCount;
-//        });
-//        _writeRow(response, [
-//            '<a href="#context_$key">$key</a>',
-//            errorCount,
-//            flushedCount,
-//            inProcessCount,
-//            invalidCount,
-//            validCount]);
-//      });
+      _server.analysisServer.folderMap.forEach((Folder folder, AnalysisContextImpl context) {
+        String key = folder.shortName;
+        AnalysisContextStatistics statistics = context.statistics;
+        int errorCount = 0;
+        int flushedCount = 0;
+        int inProcessCount = 0;
+        int invalidCount = 0;
+        int validCount = 0;
+        statistics.cacheRows.forEach((AnalysisContextStatistics_CacheRow row) {
+          errorCount += row.errorCount;
+          flushedCount += row.flushedCount;
+          inProcessCount += row.inProcessCount;
+          invalidCount += row.invalidCount;
+          validCount += row.validCount;
+        });
+        _writeRow(response, [
+            '<a href="#context_${HTML_ESCAPE.convert(key)}">$key</a>',
+            errorCount,
+            flushedCount,
+            inProcessCount,
+            invalidCount,
+            validCount]);
+      });
       response.write('</table>');
-//      _server.analysisServer.contextMap.forEach((String key, AnalysisContext context) {
-//        response.write('<h2><a name="context_$key">Analysis Context: $key</a></h2>');
-//        AnalysisContentStatistics statistics = (context as AnalysisContextImpl).statistics;
-//        response.write('<table>');
-//        _writeRow(
-//            response,
-//            ['Item', 'ERROR', 'FLUSHED', 'IN_PROCESS', 'INVALID', 'VALID'],
-//            true);
-//        statistics.cacheRows.forEach((AnalysisContentStatistics_CacheRow row) {
-//          _writeRow(
-//              response,
-//              [row.name,
-//               row.errorCount,
-//               row.flushedCount,
-//               row.inProcessCount,
-//               row.invalidCount,
-//               row.validCount]);
-//        });
-//        response.write('</table>');
-//        List<CaughtException> exceptions = statistics.exceptions;
-//        if (!exceptions.isEmpty) {
-//          response.write('<h2>Exceptions</h2>');
-//          exceptions.forEach((CaughtException exception) {
-//            response.write('<p>${exception.exception}</p>');
-//          });
-//        }
-//      });
+      _server.analysisServer.folderMap.forEach((Folder folder, AnalysisContextImpl context) {
+        String key = folder.shortName;
+        response.write('<h2><a name="context_${HTML_ESCAPE.convert(key)}">Analysis Context: $key</a></h2>');
+        AnalysisContextStatistics statistics = context.statistics;
+        response.write('<table>');
+        _writeRow(
+            response,
+            ['Item', 'ERROR', 'FLUSHED', 'IN_PROCESS', 'INVALID', 'VALID'],
+            true);
+        statistics.cacheRows.forEach((AnalysisContextStatistics_CacheRow row) {
+          _writeRow(
+              response,
+              [row.name,
+               row.errorCount,
+               row.flushedCount,
+               row.inProcessCount,
+               row.invalidCount,
+               row.validCount]);
+        });
+        response.write('</table>');
+        List<CaughtException> exceptions = statistics.exceptions;
+        if (!exceptions.isEmpty) {
+          response.write('<h2>Exceptions</h2>');
+          exceptions.forEach((CaughtException exception) {
+            response.write('<p>${exception.exception}</p>');
+          });
+        }
+      });
     }
+    response.write('<h1>Most recent strings printed by analysis server</h2>');
+    response.write('<pre>');
+    response.write(HTML_ESCAPE.convert(_printBuffer.join('\n')));
+    response.write('</pre>');
     response.write('</body>');
     response.write('</html>');
     response.close();
@@ -139,20 +152,20 @@
    * [header] is `true`.
    */
   void _writeRow(HttpResponse response, List<Object> columns, [bool header = false]) {
-    if (header) {
-      response.write('<th>');
-    } else {
-      response.write('<tr>');
-    }
+    response.write('<tr>');
     columns.forEach((Object value) {
-      response.write('<td>');
+      if (header) {
+        response.write('<th>');
+      } else {
+        response.write('<td>');
+      }
       response.write(value);
-      response.write('</td>');
+      if (header) {
+        response.write('</th>');
+      } else {
+        response.write('</td>');
+      }
     });
-    if (header) {
-      response.write('</th>');
-    } else {
-      response.write('</tr>');
-    }
+    response.write('</tr>');
   }
 }
\ No newline at end of file
diff --git a/pkg/analysis_server/lib/src/services/completion/imported_computer.dart b/pkg/analysis_server/lib/src/services/completion/imported_computer.dart
index d16b80d..2cfbc81 100644
--- a/pkg/analysis_server/lib/src/services/completion/imported_computer.dart
+++ b/pkg/analysis_server/lib/src/services/completion/imported_computer.dart
@@ -48,6 +48,11 @@
   _ImportedVisitor(this.request);
 
   @override
+  Future<bool> visitArgumentList(ArgumentList node) {
+    return _addImportedElementSuggestions(node, excludeVoidReturn: true);
+  }
+
+  @override
   Future<bool> visitBlock(Block node) {
     return _addImportedElementSuggestions(node);
   }
diff --git a/pkg/analysis_server/lib/src/services/completion/invocation_computer.dart b/pkg/analysis_server/lib/src/services/completion/invocation_computer.dart
index 798e69d..3669bd4 100644
--- a/pkg/analysis_server/lib/src/services/completion/invocation_computer.dart
+++ b/pkg/analysis_server/lib/src/services/completion/invocation_computer.dart
@@ -136,6 +136,17 @@
   _InvocationElementVisitor(this.request);
 
   @override
+  Future<bool> visitClassElement(ClassElement element) {
+    if (element != null) {
+      InterfaceType type = element.type;
+      if (type != null) {
+        ClassElementSuggestionBuilder.staticSuggestionsFor(request, type.element);
+      }
+    }
+    return new Future.value(false);
+  }
+
+  @override
   Future<bool> visitElement(Element element) {
     return new Future.value(false);
   }
@@ -162,6 +173,21 @@
   }
 
   @override
+  Future<bool> visitPropertyAccessorElement(PropertyAccessorElement element) {
+    if (element != null) {
+      PropertyInducingElement elemVar = element.variable;
+      if (elemVar != null) {
+        DartType type = elemVar.type;
+        if (type != null) {
+          ClassElementSuggestionBuilder.suggestionsFor(request, type.element);
+        }
+      }
+      return new Future.value(true);
+    }
+    return new Future.value(false);
+  }
+
+  @override
   Future<bool> visitVariableElement(VariableElement element) {
     DartType type = element.type;
     if (type != null) {
diff --git a/pkg/analysis_server/lib/src/services/completion/local_computer.dart b/pkg/analysis_server/lib/src/services/completion/local_computer.dart
index 19e28f4..8e0ba88 100644
--- a/pkg/analysis_server/lib/src/services/completion/local_computer.dart
+++ b/pkg/analysis_server/lib/src/services/completion/local_computer.dart
@@ -133,17 +133,35 @@
       } else if (declaration is TopLevelVariableDeclaration) {
         _addTopLevelVarSuggestions(declaration.variables);
       } else if (declaration is ClassTypeAlias) {
-        _addSuggestion(
+        CompletionSuggestion suggestion = _addSuggestion(
             declaration.name,
             CompletionSuggestionKind.CLASS_ALIAS,
             null,
             null);
+        if (suggestion != null) {
+          suggestion.element = _createElement(
+              protocol.ElementKind.CLASS_TYPE_ALIAS,
+              declaration.name,
+              null,
+              NO_RETURN_TYPE,
+              true,
+              _isDeprecated(declaration.metadata));
+        }
       } else if (declaration is FunctionTypeAlias) {
-        _addSuggestion(
+        CompletionSuggestion suggestion = _addSuggestion(
             declaration.name,
             CompletionSuggestionKind.FUNCTION_TYPE_ALIAS,
             declaration.returnType,
             null);
+        if (suggestion != null) {
+          suggestion.element = _createElement(
+              protocol.ElementKind.FUNCTION_TYPE_ALIAS,
+              declaration.name,
+              null, // TODO (danrubel) determine parameters
+              NO_RETURN_TYPE, // TODO (danrubel) determine return type
+              true,
+              _isDeprecated(declaration.metadata));
+        }
       }
     });
   }
diff --git a/pkg/analysis_server/lib/src/services/completion/suggestion_builder.dart b/pkg/analysis_server/lib/src/services/completion/suggestion_builder.dart
index 31f6a65..391ac2a 100644
--- a/pkg/analysis_server/lib/src/services/completion/suggestion_builder.dart
+++ b/pkg/analysis_server/lib/src/services/completion/suggestion_builder.dart
@@ -94,8 +94,12 @@
  * [ClassElementSuggestionBuilder.suggestionsFor].
  */
 class ClassElementSuggestionBuilder extends _AbstractSuggestionBuilder {
+  final bool staticOnly;
 
-  ClassElementSuggestionBuilder(DartCompletionRequest request) : super(request);
+  ClassElementSuggestionBuilder(DartCompletionRequest request, {bool staticOnly:
+      false})
+      : super(request),
+        this.staticOnly = staticOnly;
 
   @override
   visitClassElement(ClassElement element) {
@@ -112,6 +116,9 @@
 
   @override
   visitFieldElement(FieldElement element) {
+    if (staticOnly && !element.isStatic) {
+      return;
+    }
     _addElementSuggestion(
         element,
         CompletionSuggestionKind.GETTER,
@@ -121,6 +128,9 @@
 
   @override
   visitMethodElement(MethodElement element) {
+    if (staticOnly && !element.isStatic) {
+      return;
+    }
     if (element.isOperator) {
       return;
     }
@@ -133,6 +143,9 @@
 
   @override
   visitPropertyAccessorElement(PropertyAccessorElement element) {
+    if (staticOnly && !element.isStatic) {
+      return;
+    }
     if (element.isGetter) {
       _addElementSuggestion(
           element,
@@ -156,6 +169,15 @@
       return element.accept(new ClassElementSuggestionBuilder(request));
     }
   }
+
+  /**
+   * Add suggestions for the visible static members in the given class
+   */
+  static void staticSuggestionsFor(DartCompletionRequest request,
+      ClassElement element) {
+    return element.accept(
+        new ClassElementSuggestionBuilder(request, staticOnly: true));
+  }
 }
 
 /**
diff --git a/pkg/analysis_server/lib/src/services/correction/fix.dart b/pkg/analysis_server/lib/src/services/correction/fix.dart
index 5812b10..22c25e8 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix.dart
@@ -68,6 +68,8 @@
       const FixKind('CREATE_FILE', 50, "Create file '{0}'");
   static const CREATE_FUNCTION =
       const FixKind('CREATE_FUNCTION', 49, "Create function '{0}'");
+  static const CREATE_LOCAL_VARIABLE =
+      const FixKind('CREATE_LOCAL_VARIABLE', 50, "Create local variable '{0}'");
   static const CREATE_METHOD =
       const FixKind('CREATE_METHOD', 50, "Create method '{0}'");
   static const CREATE_MISSING_OVERRIDES = const FixKind(
diff --git a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
index 3b57b9e..84c5890 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
@@ -202,6 +202,7 @@
       _addFix_createFunction_forFunctionType();
       _addFix_importLibrary_withType();
       _addFix_importLibrary_withTopLevelVariable();
+      _addFix_createLocalVariable();
     }
     if (errorCode == StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER) {
       _addFix_useStaticAccess_method();
@@ -722,6 +723,54 @@
     }
   }
 
+  void _addFix_createLocalVariable() {
+    SimpleIdentifier nameNode = node;
+    String name = nameNode.name;
+    // if variable is assigned, convert assignment into declaration
+    if (node.parent is AssignmentExpression) {
+      AssignmentExpression assignment = node.parent;
+      if (assignment.leftHandSide == node &&
+          assignment.operator.type == TokenType.EQ &&
+          assignment.parent is ExpressionStatement) {
+        _addInsertEdit(node.offset, 'var ');
+        _addFix(FixKind.CREATE_LOCAL_VARIABLE, [name]);
+        return;
+      }
+    }
+    // prepare target Statement
+    Statement target = node.getAncestor((x) => x is Statement);
+    if (target == null) {
+      return;
+    }
+    String prefix = utils.getNodePrefix(target);
+    // build variable declaration source
+    SourceBuilder sb = new SourceBuilder(file, target.offset);
+    {
+      // append type
+      DartType fieldType = _inferUndefinedExpressionType(node);
+      if (fieldType != null) {
+        _appendType(sb, fieldType, 'TYPE');
+      } else {
+        sb.append('var ');
+      }
+      // append name
+      {
+        sb.startPosition('NAME');
+        sb.append(name);
+        sb.endPosition();
+      }
+      sb.append(';');
+      sb.append(eol);
+      sb.append(prefix);
+    }
+    // insert source
+    _insertBuilder(sb);
+    // add linked positions
+    _addLinkedPosition3('NAME', sb, rf.rangeNode(node));
+    // add proposal
+    _addFix(FixKind.CREATE_LOCAL_VARIABLE, [name]);
+  }
+
   void _addFix_createMissingOverrides(List<ExecutableElement> elements) {
     elements = elements.toList();
     int numElements = elements.length;
diff --git a/pkg/analysis_server/lib/src/services/correction/util.dart b/pkg/analysis_server/lib/src/services/correction/util.dart
index 3bf24eb..767e399 100644
--- a/pkg/analysis_server/lib/src/services/correction/util.dart
+++ b/pkg/analysis_server/lib/src/services/correction/util.dart
@@ -765,20 +765,6 @@
   }
 
   /**
-   * Returns the start index of the line which contains given index.
-   */
-  int getLineThis(int index) {
-    while (index > 0) {
-      int c = _buffer.codeUnitAt(index - 1);
-      if (c == 0xD || c == 0xA) {
-        break;
-      }
-      index--;
-    }
-    return index;
-  }
-
-  /**
    * Returns a [SourceRange] that covers [range] and extends (if possible) to
    * cover whole lines.
    */
@@ -802,6 +788,20 @@
   }
 
   /**
+   * Returns the start index of the line which contains given index.
+   */
+  int getLineThis(int index) {
+    while (index > 0) {
+      int c = _buffer.codeUnitAt(index - 1);
+      if (c == 0xD || c == 0xA) {
+        break;
+      }
+      index--;
+    }
+    return index;
+  }
+
+  /**
    * Returns the line prefix consisting of spaces and tabs on the left from the given
    *         [AstNode].
    */
diff --git a/pkg/analysis_server/lib/src/services/generated/completion.dart b/pkg/analysis_server/lib/src/services/generated/completion.dart
index bad6d0d..fad936f 100644
--- a/pkg/analysis_server/lib/src/services/generated/completion.dart
+++ b/pkg/analysis_server/lib/src/services/generated/completion.dart
@@ -8,8 +8,10 @@
 library services.completion;
 
 import 'dart:collection';
-import 'package:analysis_server/src/protocol.dart' show
-    CompletionSuggestionKind;
+import "dart:math" as math;
+
+import 'package:analysis_server/src/protocol.dart'
+    show CompletionSuggestionKind;
 import 'package:analyzer/src/generated/java_core.dart' hide StringUtils;
 import 'package:analyzer/src/generated/java_engine.dart';
 import 'package:analyzer/src/generated/java_io.dart';
@@ -22,15 +24,16 @@
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/generated/source_io.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
+
 import 'stubs.dart';
 import 'util.dart';
 
 class AstNodeClassifier_CompletionEngine_typeOf extends CompletionEngine_AstNodeClassifier {
   final CompletionEngine CompletionEngine_this;
 
-  List<DartType> result;
+  DartType result = null;
 
-  AstNodeClassifier_CompletionEngine_typeOf(this.CompletionEngine_this, this.result) : super();
+  AstNodeClassifier_CompletionEngine_typeOf(this.CompletionEngine_this);
 
   @override
   Object visitPrefixedIdentifier(PrefixedIdentifier node) => visitSimpleIdentifier(node.identifier);
@@ -42,7 +45,7 @@
       PropertyAccessorElement accessor = elem as PropertyAccessorElement;
       if (accessor.isSynthetic) {
         PropertyInducingElement var2 = accessor.variable;
-        result[0] = CompletionEngine_this._typeSearch(var2);
+        result = CompletionEngine_this._typeSearch(var2);
       }
     }
     return null;
@@ -603,7 +606,7 @@
   void _namespaceReference(NamespaceDirective node, SimpleStringLiteral literal) {
     String lit = literal.literal.lexeme;
     if (!lit.isEmpty) {
-      lit = lit.substring(1, Math.max(lit.length - 1, 0));
+      lit = lit.substring(1, math.max(lit.length - 1, 0));
     }
     _filter = _createFilter(new Ident.con2(node, lit, literal.offset + 1));
     Set<String> packageUris = new Set();
@@ -818,16 +821,13 @@
   bool _filterDisallows2(String name) => !_filter._match2(name);
 
   List<Element> _findAllNotTypes(List<Element> elements) {
-    elements = [];
-    for (JavaIterator<Element> I = new JavaIterator(elements); I.hasNext;) {
-      Element element = I.next();
+    return elements.where((Element element) {
       ElementKind kind = element.kind;
-      if (kind == ElementKind.FUNCTION || kind == ElementKind.TOP_LEVEL_VARIABLE || kind == ElementKind.GETTER || kind == ElementKind.SETTER) {
-        continue;
-      }
-      I.remove();
-    }
-    return new List.from(elements);
+      return kind == ElementKind.FUNCTION
+          || kind == ElementKind.TOP_LEVEL_VARIABLE
+          || kind == ElementKind.GETTER
+          || kind == ElementKind.SETTER;
+      }).toList();
   }
 
   List<Element> _findAllPrefixes() {
@@ -841,16 +841,11 @@
   }
 
   List<Element> _findAllTypes2(List<Element> elements) {
-    elements = [];
-    for (JavaIterator<Element> I = new JavaIterator(elements); I.hasNext;) {
-      Element element = I.next();
+    return elements.where((Element element) {
       ElementKind kind = element.kind;
-      if (kind == ElementKind.CLASS || kind == ElementKind.FUNCTION_TYPE_ALIAS) {
-        continue;
-      }
-      I.remove();
-    }
-    return new List.from(elements);
+      return kind == ElementKind.CLASS
+          || kind == ElementKind.FUNCTION_TYPE_ALIAS;
+      }).toList();
   }
 
   List<Element> _findTopLevelElements(LibraryElement library, TopLevelNamesKind topKind) {
@@ -940,7 +935,7 @@
 
   List<ImportElement> _importsWithName(SimpleIdentifier libName) {
     String name = libName.name;
-    List<ImportElement> imports = [];
+    List<ImportElement> imports = <ImportElement>[];
     for (ImportElement imp in currentLibrary.imports) {
       PrefixElement prefix = imp.prefix;
       if (prefix != null) {
@@ -950,7 +945,7 @@
         }
       }
     }
-    return new List.from(imports);
+    return imports;
   }
 
   bool _isCompletingKeyword(Token keyword) {
@@ -1328,8 +1323,8 @@
         types.add(param.type.toString());
       }
     }
-    prop.setParameterNames(new List.from(params));
-    prop.setParameterTypes(new List.from(types));
+    prop.setParameterNames(params);
+    prop.setParameterTypes(types);
     prop.setParameterStyle(posCount, named, positional);
   }
 
@@ -1412,11 +1407,12 @@
   DartType _typeOf2(Expression expr) {
     DartType type = expr.bestType;
     if (type.isDynamic) {
-      List<DartType> result = new List<DartType>(1);
-      CompletionEngine_AstNodeClassifier visitor = new AstNodeClassifier_CompletionEngine_typeOf(this, result);
+      AstNodeClassifier_CompletionEngine_typeOf visitor
+          = new AstNodeClassifier_CompletionEngine_typeOf(this);
       expr.accept(visitor);
-      if (result[0] != null) {
-        return result[0];
+      DartType result = visitor.result;
+      if (result != null) {
+        return result;
       }
     }
     return type;
@@ -1914,7 +1910,7 @@
   void _addNamesDefinedByHierarchy2(InterfaceType type, bool forSuper) {
     List<InterfaceType> superTypes = type.element.allSupertypes;
     if (!forSuper) {
-      superTypes = ArrayUtils.addAt(superTypes, 0, type);
+      superTypes.insert(0, type);
     }
     _addNamesDefinedByTypes(superTypes);
     // Collect names defined by subtypes separately so they can be identified later.
@@ -3583,10 +3579,9 @@
   }
 
   void _removeNotMatching(List<Element> elements) {
-    for (JavaIterator<Element> I = new JavaIterator(elements); I.hasNext;) {
-      Element element = I.next();
-      if (!_match(element)) {
-        I.remove();
+    for (int i = elements.length - 1; i >= 0; i--) {
+      if (!_match(elements[i])) {
+        elements.removeAt(i);
       }
     }
   }
diff --git a/pkg/analysis_server/lib/src/services/generated/util.dart b/pkg/analysis_server/lib/src/services/generated/util.dart
index c969c96..2c89137 100644
--- a/pkg/analysis_server/lib/src/services/generated/util.dart
+++ b/pkg/analysis_server/lib/src/services/generated/util.dart
@@ -8,6 +8,8 @@
 library services.util;
 
 import 'dart:collection';
+import "dart:math" as math;
+
 import 'package:analyzer/src/generated/java_core.dart' hide StringUtils;
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/element.dart';
@@ -16,6 +18,7 @@
 import 'package:analyzer/src/generated/resolver.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/scanner.dart';
+
 import 'stubs.dart';
 
 /**
@@ -376,7 +379,7 @@
     // find min length
     int minLength = 2147483647;
     for (List<AstNode> parentList in parents) {
-      minLength = Math.min(minLength, parentList.length);
+      minLength = math.min(minLength, parentList.length);
     }
     // find deepest parent
     int i = 0;
@@ -454,7 +457,7 @@
       parents[--index] = current;
       current = current.parent;
     }
-    return JavaArrays.asList(parents);
+    return parents;
   }
 
   /**
@@ -516,7 +519,7 @@
    */
   static String getRecommentedFileNameForClass(String className) {
     int len = className.length;
-    JavaStringBuilder sb = new JavaStringBuilder();
+    StringBuffer buffer = new StringBuffer();
     bool prevWasUpper = false;
     for (int i = 0; i < len; i++) {
       int c = className.codeUnitAt(i);
@@ -527,22 +530,22 @@
           // HTTPServer
           //     ^
           if (!nextIsUpper) {
-            sb.appendChar(0x5F);
+            buffer.writeCharCode(0x5F);
           }
         } else {
           // HttpServer
           //     ^
-          sb.appendChar(0x5F);
+          buffer.writeCharCode(0x5F);
         }
         prevWasUpper = true;
         c = Character.toLowerCase(c);
       } else {
         prevWasUpper = false;
       }
-      sb.appendChar(c);
+      buffer.writeCharCode(c);
     }
-    sb.append(".dart");
-    String fileName = sb.toString();
+    buffer.write(".dart");
+    String fileName = buffer.toString();
     return fileName;
   }
 
@@ -598,27 +601,27 @@
   static List<String> getVariableNameSuggestions(String text, Set<String> excluded) {
     // filter out everything except of letters and white spaces
     {
-      JavaStringBuilder sb = new JavaStringBuilder();
+      StringBuffer buffer = new StringBuffer();
       for (int i = 0; i < text.length; i++) {
         int c = text.codeUnitAt(i);
         if (Character.isLetter(c) || Character.isWhitespace(c)) {
-          sb.appendChar(c);
+          buffer.writeCharCode(c);
         }
       }
-      text = sb.toString();
+      text = buffer.toString();
     }
     // make single camel-case text
     {
       List<String> words = StringUtils.split(text);
-      JavaStringBuilder sb = new JavaStringBuilder();
+      StringBuffer buffer = new StringBuffer();
       for (int i = 0; i < words.length; i++) {
         String word = words[i];
         if (i > 0) {
           word = StringUtils.capitalize(word);
         }
-        sb.append(word);
+        buffer.write(word);
       }
-      text = sb.toString();
+      text = buffer.toString();
     }
     // split camel-case into separate suggested names
     Set<String> res = new LinkedHashSet();
@@ -958,7 +961,7 @@
    * @return the source with changed indentation.
    */
   String getIndentSource2(String source, bool right) {
-    JavaStringBuilder sb = new JavaStringBuilder();
+    StringBuffer buffer = new StringBuffer();
     String indent = getIndent(1);
     String eol = endOfLine;
     List<String> lines = StringUtils.splitByWholeSeparatorPreserveAllTokens(source, eol);
@@ -975,10 +978,10 @@
         line = StringUtils.removeStart(line, indent);
       }
       // append line
-      sb.append(line);
-      sb.append(eol);
+      buffer.write(line);
+      buffer.write(eol);
     }
-    return sb.toString();
+    return buffer.toString();
   }
 
   /**
@@ -994,7 +997,7 @@
       }
     }
     // re-indent lines
-    JavaStringBuilder sb = new JavaStringBuilder();
+    StringBuffer buffer = new StringBuffer();
     String eol = endOfLine;
     List<String> lines = StringUtils.splitByWholeSeparatorPreserveAllTokens(source, eol);
     int lineOffset = 0;
@@ -1007,7 +1010,9 @@
       // check if "offset" is in one of the String ranges
       bool inString = false;
       for (SourceRange lineRange in lineRanges) {
-        inString = javaBooleanOr(inString, lineOffset > lineRange.offset && lineOffset < lineRange.end);
+        if (lineOffset > lineRange.offset && lineOffset < lineRange.end) {
+          inString = true;
+        }
         if (lineOffset > lineRange.end) {
           break;
         }
@@ -1018,10 +1023,10 @@
         line = "${newIndent}${StringUtils.removeStart(line, oldIndent)}";
       }
       // append line
-      sb.append(line);
-      sb.append(eol);
+      buffer.write(line);
+      buffer.write(eol);
     }
-    return sb.toString();
+    return buffer.toString();
   }
 
   /**
@@ -1308,28 +1313,28 @@
     // function type
     if (type is FunctionType) {
       FunctionType functionType = type;
-      JavaStringBuilder sb = new JavaStringBuilder();
+      StringBuffer buffer = new StringBuffer();
       // return type
       DartType returnType = functionType.returnType;
       if (returnType != null && !returnType.isDynamic) {
-        sb.append(getTypeSource2(returnType));
-        sb.appendChar(0x20);
+        buffer.write(getTypeSource2(returnType));
+        buffer.writeCharCode(0x20);
       }
       // parameter name
-      sb.append(name);
+      buffer.write(name);
       // parameters
-      sb.appendChar(0x28);
+      buffer.writeCharCode(0x28);
       List<ParameterElement> fParameters = functionType.parameters;
       for (int i = 0; i < fParameters.length; i++) {
         ParameterElement fParameter = fParameters[i];
         if (i != 0) {
-          sb.append(", ");
+          buffer.write(", ");
         }
-        sb.append(getParameterSource(fParameter.type, fParameter.name));
+        buffer.write(getParameterSource(fParameter.type, fParameter.name));
       }
-      sb.appendChar(0x29);
+      buffer.writeCharCode(0x29);
       // done
-      return sb.toString();
+      return buffer.toString();
     }
     // simple type
     return "${getTypeSource2(type)} ${name}";
@@ -1383,7 +1388,7 @@
    * @return the source to reference the given [Type] in this [CompilationUnit].
    */
   String getTypeSource2(DartType type) {
-    JavaStringBuilder sb = new JavaStringBuilder();
+    StringBuffer buffer = new StringBuffer();
     // prepare element
     Element element = type.element;
     if (element == null) {
@@ -1396,13 +1401,13 @@
     {
       ImportElement imp = _getImportElement(element);
       if (imp != null && imp.prefix != null) {
-        sb.append(imp.prefix.displayName);
-        sb.append(".");
+        buffer.write(imp.prefix.displayName);
+        buffer.write(".");
       }
     }
     // append simple name
     String name = element.displayName;
-    sb.append(name);
+    buffer.write(name);
     // may be type arguments
     if (type is InterfaceType) {
       InterfaceType interfaceType = type;
@@ -1417,19 +1422,19 @@
       }
       // append type arguments
       if (hasArguments) {
-        sb.append("<");
+        buffer.write("<");
         for (int i = 0; i < arguments.length; i++) {
           DartType argument = arguments[i];
           if (i != 0) {
-            sb.append(", ");
+            buffer.write(", ");
           }
-          sb.append(getTypeSource2(argument));
+          buffer.write(getTypeSource2(argument));
         }
-        sb.append(">");
+        buffer.write(">");
       }
     }
     // done
-    return sb.toString();
+    return buffer.toString();
   }
 
   /**
diff --git a/pkg/analysis_server/lib/src/services/index/index_contributor.dart b/pkg/analysis_server/lib/src/services/index/index_contributor.dart
index 7d94a30..5f39378 100644
--- a/pkg/analysis_server/lib/src/services/index/index_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/index/index_contributor.dart
@@ -421,6 +421,18 @@
   }
 
   @override
+  Object visitEnumDeclaration(EnumDeclaration node) {
+    ClassElement element = node.element;
+    enterScope(element);
+    try {
+      _recordElementDefinition(element);
+      return super.visitEnumDeclaration(node);
+    } finally {
+      _exitScope();
+    }
+  }
+
+  @override
   Object visitClassTypeAlias(ClassTypeAlias node) {
     ClassElement element = node.element;
     enterScope(element);
diff --git a/pkg/analysis_server/lib/src/services/refactoring/extract_local.dart b/pkg/analysis_server/lib/src/services/refactoring/extract_local.dart
index 8725031..0925b38 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/extract_local.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/extract_local.dart
@@ -513,13 +513,13 @@
 
 
 class _HasStatementVisitor extends GeneralizingAstVisitor {
-  final List<bool> result;
+  bool result = false;
 
-  _HasStatementVisitor(this.result);
+  _HasStatementVisitor();
 
   @override
   visitStatement(Statement node) {
-    result[0] = true;
+    result = true;
   }
 }
 
@@ -579,9 +579,9 @@
   }
 
   bool _hasStatements(AstNode root) {
-    List<bool> result = [false];
-    root.accept(new _HasStatementVisitor(result));
-    return result[0];
+    _HasStatementVisitor visitor = new _HasStatementVisitor();
+    root.accept(visitor);
+    return visitor.result;
   }
 
   void _tryToFindOccurrence(Expression node) {
diff --git a/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart b/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart
index e2ee357..f093266 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart
@@ -939,13 +939,10 @@
           new _Occurrence(nodeRange, ref.selectionRange.intersects(nodeRange));
       ref._occurrences.add(occurrence);
       // prepare mapping of parameter names to the occurrence variables
-      for (MapEntry<String, String> entry in getMapEntrySet(
-          nodePattern.originalToPatternNames)) {
-        String patternName = entry.getValue();
-        String originalName = entry.getKey();
+      nodePattern.originalToPatternNames.forEach((String originalName, String patternName) {
         String selectionName = patternToSelectionName[patternName];
         occurrence._parameterOldToOccurrenceName[selectionName] = originalName;
-      }
+      });
       // update static
       if (forceStatic) {
         ref._staticContext = true;
diff --git a/pkg/analysis_server/lib/src/services/refactoring/naming_conventions.dart b/pkg/analysis_server/lib/src/services/refactoring/naming_conventions.dart
index 617ced0..51fb74c 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/naming_conventions.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/naming_conventions.dart
@@ -24,40 +24,6 @@
  *   WARNING if the name is discouraged;
  *   FATAL if the name is illegal.
  */
-RefactoringStatus validateConstantName(String name) {
-  // null
-  if (name == null) {
-    return new RefactoringStatus.fatal("Constant name must not be null.");
-  }
-  // is not identifier
-  RefactoringStatus status =
-      _validateIdentifier(name, "Constant name", 'an uppercase letter or underscore');
-  if (!status.isOK) {
-    return status;
-  }
-  // is private, OK
-  int startIndex = 0;
-  if (name.codeUnitAt(0) == CHAR_UNDERSCORE) {
-    startIndex++;
-  }
-  // does not start with lower case
-  for (int i = startIndex; i < name.length; i++) {
-    int c = name.codeUnitAt(i);
-    if (!isUpperCase(c) && !isDigit(c) && c != CHAR_UNDERSCORE) {
-      return new RefactoringStatus.warning(
-          "Constant name should be all uppercase with underscores.");
-    }
-  }
-  // OK
-  return new RefactoringStatus();
-}
-
-/**
- * Returns the [RefactoringStatus] with severity:
- *   OK if the name is valid;
- *   WARNING if the name is discouraged;
- *   FATAL if the name is illegal.
- */
 RefactoringStatus validateConstructorName(String name) {
   if (name != null && name.isEmpty) {
     return new RefactoringStatus();
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_class_member.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_class_member.dart
index 88cf801..321785e 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_class_member.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_class_member.dart
@@ -73,12 +73,7 @@
   RefactoringStatus checkNewName() {
     RefactoringStatus result = super.checkNewName();
     if (element is FieldElement) {
-      FieldElement fieldElement = element as FieldElement;
-      if (fieldElement.isStatic && fieldElement.isConst) {
-        result.addStatus(validateConstantName(newName));
-      } else {
-        result.addStatus(validateFieldName(newName));
-      }
+      result.addStatus(validateFieldName(newName));
     }
     if (element is MethodElement) {
       result.addStatus(validateMethodName(newName));
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_local.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_local.dart
index b8a2d21..7effb9d 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_local.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_local.dart
@@ -56,12 +56,7 @@
   RefactoringStatus checkNewName() {
     RefactoringStatus result = super.checkNewName();
     if (element is LocalVariableElement) {
-      LocalVariableElement variableElement = element;
-      if (variableElement.isConst) {
-        result.addStatus(validateConstantName(newName));
-      } else {
-        result.addStatus(validateVariableName(newName));
-      }
+      result.addStatus(validateVariableName(newName));
     } else if (element is ParameterElement) {
       result.addStatus(validateParameterName(newName));
     } else if (element is FunctionElement) {
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_unit_member.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_unit_member.dart
index 81a69bd..9a9d65e 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_unit_member.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_unit_member.dart
@@ -76,12 +76,7 @@
   RefactoringStatus checkNewName() {
     RefactoringStatus result = super.checkNewName();
     if (element is TopLevelVariableElement) {
-      TopLevelVariableElement variable = element as TopLevelVariableElement;
-      if (variable.isConst) {
-        result.addStatus(validateConstantName(newName));
-      } else {
-        result.addStatus(validateVariableName(newName));
-      }
+      result.addStatus(validateVariableName(newName));
     }
     if (element is FunctionElement) {
       result.addStatus(validateFunctionName(newName));
diff --git a/pkg/analysis_server/test/abstract_context.dart b/pkg/analysis_server/test/abstract_context.dart
index 99f39c9..30885e8 100644
--- a/pkg/analysis_server/test/abstract_context.dart
+++ b/pkg/analysis_server/test/abstract_context.dart
@@ -80,6 +80,13 @@
     resourceResolver = new ResourceUriResolver(provider);
     context = AnalysisEngine.instance.createAnalysisContext();
     context.sourceFactory = new SourceFactory([SDK_RESOLVER, resourceResolver]);
+    {
+      AnalysisOptionsImpl options =
+          new AnalysisOptionsImpl.con1(context.analysisOptions);
+      options.enableAsync = true;
+      options.enableEnum = true;
+      context.analysisOptions = options;
+    }
   }
 
   void tearDown() {
diff --git a/pkg/analysis_server/test/analysis/notification_highlights_test.dart b/pkg/analysis_server/test/analysis/notification_highlights_test.dart
index 773d6f6..a12add9 100644
--- a/pkg/analysis_server/test/analysis/notification_highlights_test.dart
+++ b/pkg/analysis_server/test/analysis/notification_highlights_test.dart
@@ -161,6 +161,32 @@
     });
   }
 
+  test_BUILT_IN_async() {
+    addTestFile('''
+fa() async {}
+fb() async* {}
+main() {
+  bool async = false;
+}
+''');
+    return prepareHighlights().then((_) {
+      assertHasStringRegion(HighlightRegionType.BUILT_IN, 'async');
+      assertHasStringRegion(HighlightRegionType.BUILT_IN, 'async*');
+      assertNoRegion(HighlightRegionType.BUILT_IN, 'async = false');
+    });
+  }
+
+  test_BUILT_IN_await() {
+    addTestFile('''
+main() async {
+  await 42;
+}
+''');
+    return prepareHighlights().then((_) {
+      assertHasRegion(HighlightRegionType.BUILT_IN, 'await 42');
+    });
+  }
+
   test_BUILT_IN_deferred() {
     addTestFile('''
 import 'dart:math' deferred as math;
@@ -400,6 +426,21 @@
     });
   }
 
+  test_BUILT_IN_sync() {
+    addTestFile('''
+fa() sync {}
+fb() sync* {}
+main() {
+  bool sync = false;
+}
+''');
+    return prepareHighlights().then((_) {
+      assertHasStringRegion(HighlightRegionType.BUILT_IN, 'sync');
+      assertHasStringRegion(HighlightRegionType.BUILT_IN, 'sync*');
+      assertNoRegion(HighlightRegionType.BUILT_IN, 'sync = false');
+    });
+  }
+
   test_BUILT_IN_typedef() {
     addTestFile('''
 typedef A();
@@ -412,6 +453,28 @@
     });
   }
 
+  test_BUILT_IN_yield() {
+    addTestFile('''
+main() async* {
+  yield 42;
+}
+''');
+    return prepareHighlights().then((_) {
+      assertHasRegion(HighlightRegionType.BUILT_IN, 'yield 42');
+    });
+  }
+
+  test_BUILT_IN_yieldStar() {
+    addTestFile('''
+main() async* {
+  yield* [];
+}
+''');
+    return prepareHighlights().then((_) {
+      assertHasStringRegion(HighlightRegionType.BUILT_IN, 'yield*');
+    });
+  }
+
   test_CLASS() {
     addTestFile('''
 class AAA {}
@@ -528,6 +591,33 @@
     });
   }
 
+  test_ENUM() {
+    addTestFile('''
+enum MyEnum {A, B, C}
+MyEnum value;
+''');
+    return prepareHighlights().then((_) {
+      assertHasRegion(HighlightRegionType.ENUM, 'MyEnum {');
+      assertHasRegion(HighlightRegionType.ENUM, 'MyEnum value;');
+    });
+  }
+
+  test_ENUM_CONSTANT() {
+    addTestFile('''
+enum MyEnum {AAA, BBB}
+main() {
+  print(MyEnum.AAA);
+  print(MyEnum.BBB);
+}
+''');
+    return prepareHighlights().then((_) {
+      assertHasRegion(HighlightRegionType.ENUM_CONSTANT, 'AAA, ');
+      assertHasRegion(HighlightRegionType.ENUM_CONSTANT, 'BBB}');
+      assertHasRegion(HighlightRegionType.ENUM_CONSTANT, 'AAA);');
+      assertHasRegion(HighlightRegionType.ENUM_CONSTANT, 'BBB);');
+    });
+  }
+
   test_FIELD() {
     addTestFile('''
 class A {
diff --git a/pkg/analysis_server/test/analysis/notification_navigation_test.dart b/pkg/analysis_server/test/analysis/notification_navigation_test.dart
index 00ce0c9..42c2d5a 100644
--- a/pkg/analysis_server/test/analysis/notification_navigation_test.dart
+++ b/pkg/analysis_server/test/analysis/notification_navigation_test.dart
@@ -123,6 +123,17 @@
     findRegion(offset, length, false);
   }
 
+  void assertRegionsSorted() {
+    int lastEnd = -1;
+    for (NavigationRegion region in regions) {
+      int offset = region.offset;
+      if (offset < lastEnd) {
+        fail('$lastEnd was expected to be > $offset in\n' + regions.join('\n'));
+      }
+      lastEnd = offset + region.length;
+    }
+  }
+
   /**
    * Finds the navigation region with the given [offset] and [length].
    * If [length] is `-1`, then it is ignored.
@@ -156,7 +167,9 @@
 
   Future prepareNavigation() {
     addAnalysisSubscription(AnalysisService.NAVIGATION, testFile);
-    return waitForTasksFinished();
+    return waitForTasksFinished().then((_) {
+      assertRegionsSorted();
+    });
   }
 
   void processNotification(Notification notification) {
@@ -283,6 +296,19 @@
     });
   }
 
+  test_identifier_whenStrayImportDirective() {
+    addTestFile('''
+main() {
+  int aaa = 42;
+  print(aaa);
+}
+import 'dart:math';
+''');
+    return prepareNavigation().then((_) {
+      assertHasRegionTarget('aaa);', 'aaa = 42');
+    });
+  }
+
   test_instanceCreation_implicit() {
     addTestFile('''
 class A {
@@ -308,7 +334,7 @@
 ''');
     return prepareNavigation().then((_) {
       {
-        findRegion(findOffset('new '), 'new '.length, true);
+        findRegion(findOffset('new '), 'new'.length, true);
         assertHasTarget('named() {}');
       }
       {
@@ -333,7 +359,7 @@
 ''');
     return prepareNavigation().then((_) {
       {
-        findRegion(findOffset('new '), 'new '.length, true);
+        findRegion(findOffset('new '), 'new'.length, true);
         assertHasTarget('A() {}', 0);
       }
       {
@@ -343,6 +369,21 @@
     });
   }
 
+  test_multiplyDefinedElement() {
+    addFile('$projectPath/bin/libA.dart', 'library A; int TEST = 1;');
+    addFile('$projectPath/bin/libB.dart', 'library B; int TEST = 2;');
+    addTestFile('''
+import 'libA.dart';
+import 'libB.dart';
+main() {
+  TEST;
+}
+''');
+    return prepareNavigation().then((_) {
+      assertNoRegionAt('TEST');
+    });
+  }
+
   test_operator_arithmetic() {
     addTestFile('''
 class A {
diff --git a/pkg/analysis_server/test/analysis_abstract.dart b/pkg/analysis_server/test/analysis_abstract.dart
index 43703c4..e974dbf 100644
--- a/pkg/analysis_server/test/analysis_abstract.dart
+++ b/pkg/analysis_server/test/analysis_abstract.dart
@@ -232,6 +232,8 @@
     server = new AnalysisServer(
         serverChannel, resourceProvider, packageMapProvider, index,
         new MockSdk());
+    server.contextDirectoryManager.defaultOptions.enableAsync = true;
+    server.contextDirectoryManager.defaultOptions.enableEnum = true;
     handler = new AnalysisDomainHandler(server);
     // listen for notifications
     Stream<Notification> notificationStream = serverChannel.notificationController.stream;
diff --git a/pkg/analysis_server/test/analysis_server_test.dart b/pkg/analysis_server/test/analysis_server_test.dart
index b138eb6..d26041a 100644
--- a/pkg/analysis_server/test/analysis_server_test.dart
+++ b/pkg/analysis_server/test/analysis_server_test.dart
@@ -94,6 +94,7 @@
       MockServerOperation operation = new MockServerOperation(
           ServerOperationPriority.ANALYSIS, (_) { throw exceptionToThrow; });
       helper.server.operationQueue.add(operation);
+      helper.server.performOperationPending = true;
       try {
         helper.server.performOperation();
         fail('exception not rethrown');
diff --git a/pkg/analysis_server/test/context_manager_test.dart b/pkg/analysis_server/test/context_manager_test.dart
index e2ba17c..161c060 100644
--- a/pkg/analysis_server/test/context_manager_test.dart
+++ b/pkg/analysis_server/test/context_manager_test.dart
@@ -9,8 +9,10 @@
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/file_system/memory_file_system.dart';
 import 'package:analyzer/source/package_map_provider.dart';
+import 'package:analyzer/source/package_map_resolver.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/generated/source_io.dart';
 import 'package:path/path.dart';
 import 'package:unittest/unittest.dart';
 
@@ -190,14 +192,10 @@
     manager.assertContextFiles(subProjectA, [subProjectA_file]);
     manager.assertContextFiles(subProjectB, [subProjectB_file]);
     // verify package maps
-    expect(
-        manager.currentContextPackageMaps[root],
-        equals(packageMapProvider.packageMaps[root]));
-    expect(
-        manager.currentContextPackageMaps[subProjectA],
+    _checkPackageMap(root, equals(packageMapProvider.packageMaps[root]));
+    _checkPackageMap(subProjectA,
         equals(packageMapProvider.packageMaps[subProjectA]));
-    expect(
-        manager.currentContextPackageMaps[subProjectB],
+    _checkPackageMap(subProjectB,
         equals(packageMapProvider.packageMaps[subProjectB]));
   }
 
@@ -210,6 +208,35 @@
     expect(manager.currentContextFilePaths[projPath], hasLength(0));
   }
 
+  void test_setRoots_addPackageRoot() {
+    String packagePathFoo = '/package1/foo';
+    String packageRootPath = '/package2/foo';
+    Folder packageFolder = resourceProvider.newFolder(packagePathFoo);
+    packageMapProvider.packageMap = {
+      'foo': [packageFolder]
+    };
+    List<String> includedPaths = <String>[projPath];
+    List<String> excludedPaths = <String>[];
+    manager.setRoots(includedPaths, excludedPaths, <String, String>{});
+    _checkPackageMap(projPath, equals(packageMapProvider.packageMap));
+    manager.setRoots(includedPaths, excludedPaths,
+        <String, String>{ projPath: packageRootPath });
+    _checkPackageRoot(projPath, equals(packageRootPath));
+  }
+
+  void test_setRoots_changePackageRoot() {
+    String packageRootPath1 = '/package1';
+    String packageRootPath2 = '/package2';
+    List<String> includedPaths = <String>[projPath];
+    List<String> excludedPaths = <String>[];
+    manager.setRoots(includedPaths, excludedPaths,
+        <String, String>{ projPath: packageRootPath1 });
+    _checkPackageRoot(projPath, equals(packageRootPath1));
+    manager.setRoots(includedPaths, excludedPaths,
+        <String, String>{ projPath: packageRootPath2 });
+    _checkPackageRoot(projPath, equals(packageRootPath2));
+  }
+
   void test_setRoots_exclude_newRoot_withExcludedFile() {
     // prepare paths
     String project = '/project';
@@ -343,9 +370,14 @@
       'foo': [packageFolder]
     };
     manager.setRoots(<String>[projPath], <String>[], <String, String>{});
-    expect(
-        manager.currentContextPackageMaps[projPath],
-        equals(packageMapProvider.packageMap));
+    _checkPackageMap(projPath, equals(packageMapProvider.packageMap));
+  }
+
+  void test_setRoots_newFolderWithPackageRoot() {
+    String packageRootPath = '/package';
+    manager.setRoots(<String>[projPath], <String>[],
+        <String, String>{ projPath: packageRootPath });
+    _checkPackageRoot(projPath, equals(packageRootPath));
   }
 
   void test_setRoots_removeFolderWithPubspec() {
@@ -406,6 +438,22 @@
     expect(manager.currentContextFilePaths, hasLength(0));
   }
 
+  void test_setRoots_removePackageRoot() {
+    String packagePathFoo = '/package1/foo';
+    String packageRootPath = '/package2/foo';
+    Folder packageFolder = resourceProvider.newFolder(packagePathFoo);
+    packageMapProvider.packageMap = {
+      'foo': [packageFolder]
+    };
+    List<String> includedPaths = <String>[projPath];
+    List<String> excludedPaths = <String>[];
+    manager.setRoots(includedPaths, excludedPaths,
+        <String, String>{ projPath: packageRootPath });
+    _checkPackageRoot(projPath, equals(packageRootPath));
+    manager.setRoots(includedPaths, excludedPaths, <String, String>{});
+    _checkPackageMap(projPath, equals(packageMapProvider.packageMap));
+  }
+
   test_watch_addDummyLink() {
     manager.setRoots(<String>[projPath], <String>[], <String, String>{});
     // empty folder initially
@@ -630,7 +678,7 @@
     resourceProvider.newFile(dartFilePath, 'contents');
     // the created context has the expected empty package map
     manager.setRoots(<String>[projPath], <String>[], <String, String>{});
-    expect(manager.currentContextPackageMaps[projPath], isEmpty);
+    _checkPackageMap(projPath, isEmpty);
     // configure package map
     String packagePath = '/package/foo';
     resourceProvider.newFolder(packagePath);
@@ -641,13 +689,11 @@
     // package map to be picked up.
     resourceProvider.modifyFile(dartFilePath, 'new contents');
     return pumpEventQueue().then((_) {
-      expect(manager.currentContextPackageMaps[projPath], isEmpty);
+      _checkPackageMap(projPath, isEmpty);
       // However, changing the package map dependency should.
       resourceProvider.modifyFile(dependencyPath, 'new contents');
       return pumpEventQueue().then((_) {
-        expect(
-            manager.currentContextPackageMaps[projPath],
-            equals(packageMapProvider.packageMap));
+        _checkPackageMap(projPath, equals(packageMapProvider.packageMap));
       });
     });
   }
@@ -662,16 +708,38 @@
     resourceProvider.newFile(dartFilePath, 'contents');
     // the created context has the expected empty package map
     manager.setRoots(<String>[projPath], <String>[], <String, String>{});
-    expect(manager.currentContextPackageMaps[projPath], isEmpty);
+    _checkPackageMap(projPath, isEmpty);
     // Change the package map dependency so that the packageMapProvider is
     // re-run, and arrange for it to return null from computePackageMap().
     packageMapProvider.packageMap = null;
     resourceProvider.modifyFile(dependencyPath, 'new contents');
     return pumpEventQueue().then((_) {
       // The package map should have been changed to null.
-      expect(manager.currentContextPackageMaps[projPath], isNull);
+      _checkPackageMap(projPath, isNull);
     });
   }
+
+  /**
+   * Verify that package URI's for source files in [path] will be resolved
+   * using a package map matching [expectation].
+   */
+  void _checkPackageMap(String path, expectation) {
+    UriResolver resolver = manager.currentContextPackageUriResolvers[path];
+    expect(resolver, new isInstanceOf<PackageMapUriResolver>());
+    PackageMapUriResolver packageMapUriResolver = resolver;
+    expect(packageMapUriResolver.packageMap, expectation);
+  }
+
+  /**
+   * Verify that package URI's for source files in [path] will be resolved
+   * using a package root maching [expectation].
+   */
+  void _checkPackageRoot(String path, expectation) {
+    UriResolver resolver = manager.currentContextPackageUriResolvers[path];
+    expect(resolver, new isInstanceOf<PackageUriResolver>());
+    PackageUriResolver packageUriResolver = resolver;
+    expect(packageUriResolver.packagesDirectory_forTesting, expectation);
+  }
 }
 
 
@@ -698,22 +766,22 @@
       Map<String, int>>{};
 
   /**
-   * Map from context to package map.
+   * Map from context to package URI resolver.
    */
-  final Map<String, Map<String, List<Folder>>> currentContextPackageMaps =
-      <String, Map<String, List<Folder>>>{};
+  final Map<String, UriResolver> currentContextPackageUriResolvers =
+      <String, UriResolver>{};
 
   TestContextManager(MemoryResourceProvider resourceProvider,
       PackageMapProvider packageMapProvider)
       : super(resourceProvider, packageMapProvider);
 
   @override
-  void addContext(Folder folder, Map<String, List<Folder>> packageMap) {
+  void addContext(Folder folder, UriResolver packageUriResolver) {
     String path = folder.path;
     expect(currentContextPaths, isNot(contains(path)));
     currentContextTimestamps[path] = now;
     currentContextFilePaths[path] = <String, int>{};
-    currentContextPackageMaps[path] = packageMap;
+    currentContextPackageUriResolvers[path] = packageUriResolver;
   }
 
   @override
@@ -748,12 +816,12 @@
     expect(currentContextPaths, contains(path));
     currentContextTimestamps.remove(path);
     currentContextFilePaths.remove(path);
-    currentContextPackageMaps.remove(path);
+    currentContextPackageUriResolvers.remove(path);
   }
 
   @override
-  void updateContextPackageMap(Folder contextFolder, Map<String,
-      List<Folder>> packageMap) {
-    currentContextPackageMaps[contextFolder.path] = packageMap;
+  void updateContextPackageUriResolver(Folder contextFolder,
+                                       UriResolver packageUriResolver) {
+    currentContextPackageUriResolvers[contextFolder.path] = packageUriResolver;
   }
 }
diff --git a/pkg/analysis_server/test/integration/analysis/package_root_test.dart b/pkg/analysis_server/test/integration/analysis/package_root_test.dart
new file mode 100644
index 0000000..df26ee9
--- /dev/null
+++ b/pkg/analysis_server/test/integration/analysis/package_root_test.dart
@@ -0,0 +1,67 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.integration.analysis.packageRoot;
+
+import 'package:analysis_server/src/protocol.dart';
+import 'package:path/path.dart';
+import 'package:unittest/unittest.dart';
+
+import '../../reflective_tests.dart';
+import '../integration_tests.dart';
+
+@ReflectiveTestCase()
+class Test extends AbstractAnalysisServerIntegrationTest {
+  test_package_root() {
+    String projPath = sourcePath('project');
+    String mainPath = join(projPath, 'main.dart');
+    String packagesPath = sourcePath('packages');
+    String fooBarPath = join(packagesPath, 'foo', 'bar.dart');
+    String mainText = """
+library main;
+
+import 'package:foo/bar.dart'
+
+main() {
+  f();
+}
+""";
+    String fooBarText = """
+library foo.bar;
+
+f() {}
+""";
+    writeFile(mainPath, mainText);
+    String normalizedFooBarPath = writeFile(fooBarPath, fooBarText);
+    sendServerSetSubscriptions([ServerService.STATUS]);
+    sendAnalysisSetSubscriptions({AnalysisService.NAVIGATION: [mainPath]});
+    List<NavigationRegion> navigationRegions;
+    onAnalysisNavigation.listen((AnalysisNavigationParams params) {
+      expect(params.file, equals(mainPath));
+      navigationRegions = params.regions;
+    });
+    sendAnalysisSetAnalysisRoots([projPath], [],
+        packageRoots: {projPath: packagesPath});
+    return analysisFinished.then((_) {
+      // Verify that fooBarPath was properly resolved by checking that f()
+      // refers to it.
+      bool found = false;
+      for (NavigationRegion region in navigationRegions) {
+        String navigationSource =
+            mainText.substring(region.offset, region.offset + region.length);
+        if (navigationSource == 'f') {
+          found = true;
+          expect(region.targets, hasLength(1));
+          Location location = region.targets[0].location;
+          expect(location.file, equals(normalizedFooBarPath));
+        }
+      }
+      expect(found, isTrue);
+    });
+  }
+}
+
+main() {
+  runReflectiveTests(Test);
+}
diff --git a/pkg/analysis_server/test/integration/analysis/reanalyze_concurrent_test.dart b/pkg/analysis_server/test/integration/analysis/reanalyze_concurrent_test.dart
new file mode 100644
index 0000000..e65f60c
--- /dev/null
+++ b/pkg/analysis_server/test/integration/analysis/reanalyze_concurrent_test.dart
@@ -0,0 +1,64 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/**
+ * This test verifies that if reanalysis is performed while reanalysis is in
+ * progress, no problems occur.  See dartbug.com/21448.
+ */
+library test.integration.analysis.reanalyze_concurrent;
+
+import 'dart:async';
+
+import 'package:analysis_server/src/protocol.dart';
+import 'package:unittest/unittest.dart';
+
+import '../../reflective_tests.dart';
+import '../integration_tests.dart';
+
+@ReflectiveTestCase()
+class Test extends AbstractAnalysisServerIntegrationTest {
+  test_reanalyze_concurrent() {
+    String pathname = sourcePath('test.dart');
+    String text = '''
+// Do a bunch of imports so that analysis has some work to do.
+import 'dart:io';
+import 'dart:convert';
+import 'dart:async';
+
+main() {}''';
+    writeFile(pathname, text);
+    standardAnalysisSetup();
+    return analysisFinished.then((_) {
+      sendAnalysisReanalyze();
+      // Wait for reanalysis to start.
+      return onServerStatus.first.then((_) {
+        sendAnalysisReanalyze();
+        return analysisFinished.then((_) {
+          // Now that reanalysis has finished, no further analysis should occur.
+          onServerStatus.listen((ServerStatusParams data) {
+            if (data.analysis != null) {
+              if (data.analysis.isAnalyzing) {
+                // Most likely what happened is that the first reanalyze
+                // completed before the second reanalyze had a chance to start,
+                // and we are just now starting the second reanalyze.  If this is
+                // the case, then the test isn't testing what it's meant to test
+                // (because we are trying to test what happens when one reanalyze
+                // starts while another is in progress).  In which case we will
+                // need to give the analyzer more work to do.
+                fail('First reanalyze finished before second started.');
+              }
+            }
+          });
+          // Give the server an extra second to make sure it doesn't take any
+          // more actions.
+          return new Future.delayed(new Duration(seconds: 1));
+        });
+      });
+    });
+  }
+}
+
+main() {
+  runReflectiveTests(Test);
+}
diff --git a/pkg/analysis_server/test/integration/analysis/test_all.dart b/pkg/analysis_server/test/integration/analysis/test_all.dart
index e834ba4..e75dbe0 100644
--- a/pkg/analysis_server/test/integration/analysis/test_all.dart
+++ b/pkg/analysis_server/test/integration/analysis/test_all.dart
@@ -15,6 +15,9 @@
 import 'occurrences_test.dart' as occurrences_test;
 import 'outline_test.dart' as outline_test;
 import 'overrides_test.dart' as overrides_test;
+import 'package_root_test.dart' as package_root_test;
+import 'reanalyze_concurrent_test.dart' as reanalyze_concurrent_test;
+import 'reanalyze_test.dart' as reanalyze_test;
 import 'update_content_test.dart' as update_content_test;
 import 'update_content_list_test.dart' as update_content_list_test;
 
@@ -33,6 +36,9 @@
     occurrences_test.main();
     outline_test.main();
     overrides_test.main();
+    package_root_test.main();
+    reanalyze_concurrent_test.main();
+    reanalyze_test.main();
     update_content_test.main();
     update_content_list_test.main();
   });
diff --git a/pkg/analysis_server/test/integration/asynchrony_test.dart b/pkg/analysis_server/test/integration/asynchrony_test.dart
index 4ae0e19..79eb1b2 100644
--- a/pkg/analysis_server/test/integration/asynchrony_test.dart
+++ b/pkg/analysis_server/test/integration/asynchrony_test.dart
@@ -51,12 +51,14 @@
 
       // Begin processing responses from the server.
       server.listenToOutput((String event, params) {
-        // No notifications are expected.
-        fail('Unexpected notification: $event');
+        // The only expected notification is server.connected.
+        if (event != 'server.connected') {
+          fail('Unexpected notification: $event');
+        }
       });
 
       // Terminate the test when the response to the last message is received.
-      lastMessageResult.then((_) {
+      return lastMessageResult.then((_) {
         server.send("server.shutdown", null).then((_) {
           return server.exitCode;
         });
diff --git a/pkg/analysis_server/test/integration/integration_test_methods.dart b/pkg/analysis_server/test/integration/integration_test_methods.dart
index 8bc1a98..7e043dd 100644
--- a/pkg/analysis_server/test/integration/integration_test_methods.dart
+++ b/pkg/analysis_server/test/integration/integration_test_methods.dart
@@ -536,13 +536,13 @@
    *
    * regions ( List<NavigationRegion> )
    *
-   *   The navigation regions contained in the file. Each navigation region
-   *   represents a list of targets associated with some range. The lists will
-   *   usually contain a single target, but can contain more in the case of a
-   *   part that is included in multiple libraries or in Dart code that is
-   *   compiled against multiple versions of a package. Note that the
-   *   navigation regions that are returned do not overlap other navigation
-   *   regions.
+   *   The navigation regions contained in the file. The regions are sorted by
+   *   their offsets. Each navigation region represents a list of targets
+   *   associated with some range. The lists will usually contain a single
+   *   target, but can contain more in the case of a part that is included in
+   *   multiple libraries or in Dart code that is compiled against multiple
+   *   versions of a package. Note that the navigation regions that are
+   *   returned do not overlap other navigation regions.
    */
   Stream<AnalysisNavigationParams> onAnalysisNavigation;
 
diff --git a/pkg/analysis_server/test/integration/integration_tests.dart b/pkg/analysis_server/test/integration/integration_tests.dart
index 372293d..4436253 100644
--- a/pkg/analysis_server/test/integration/integration_tests.dart
+++ b/pkg/analysis_server/test/integration/integration_tests.dart
@@ -67,10 +67,14 @@
    * overwritten.
    *
    * Parent directories are created as necessary.
+   *
+   * Return a normalized path to the file (with symbolic links resolved).
    */
-  void writeFile(String pathname, String contents) {
+  String writeFile(String pathname, String contents) {
     new Directory(dirname(pathname)).createSync(recursive: true);
-    new File(pathname).writeAsStringSync(contents);
+    File file = new File(pathname);
+    file.writeAsStringSync(contents);
+    return file.resolveSymbolicLinksSync();
   }
 
   /**
@@ -150,6 +154,10 @@
       expect(serverConnected.isCompleted, isFalse);
       serverConnected.complete();
     });
+    onServerError.listen((ServerErrorParams params) {
+      // A server error should never happen during an integration test.
+      fail(params.message);
+    });
     return server.start().then((_) {
       server.listenToOutput(dispatchNotification);
       server.exitCode.then((_) {
@@ -679,10 +687,12 @@
   }
 
   /**
-   * Start the server.  If [debugServer] is true, the server will be started
-   * with "--debug", allowing a debugger to be attached.
+   * Start the server.  If [debugServer] is `true`, the server will be started
+   * with "--debug", allowing a debugger to be attached. If [profileServer] is
+   * `true`, the server will be started with "--observe" and
+   * "--pause-isolates-on-exit", allowing the observatory to be used.
    */
-  Future start({bool debugServer: false}) {
+  Future start({bool debugServer: false, bool profileServer: false}) {
     if (_process != null) {
       throw new Exception('Process already started');
     }
@@ -695,6 +705,10 @@
     if (debugServer) {
       arguments.add('--debug');
     }
+    if (profileServer) {
+      arguments.add('--observe');
+      arguments.add('--pause-isolates-on-exit');
+    }
     if (Platform.packageRoot.isNotEmpty) {
       arguments.add('--package-root=${Platform.packageRoot}');
     }
diff --git a/pkg/analysis_server/test/integration/protocol_matchers.dart b/pkg/analysis_server/test/integration/protocol_matchers.dart
index adeb2af..691cc81 100644
--- a/pkg/analysis_server/test/integration/protocol_matchers.dart
+++ b/pkg/analysis_server/test/integration/protocol_matchers.dart
@@ -1274,6 +1274,8 @@
  *   CONSTRUCTOR
  *   DIRECTIVE
  *   DYNAMIC_TYPE
+ *   ENUM
+ *   ENUM_CONSTANT
  *   FIELD
  *   FIELD_STATIC
  *   FUNCTION
@@ -1313,6 +1315,8 @@
   "CONSTRUCTOR",
   "DIRECTIVE",
   "DYNAMIC_TYPE",
+  "ENUM",
+  "ENUM_CONSTANT",
   "FIELD",
   "FIELD_STATIC",
   "FUNCTION",
diff --git a/pkg/analysis_server/test/services/completion/completion_test_util.dart b/pkg/analysis_server/test/services/completion/completion_test_util.dart
index 3c830a5..54929ec 100644
--- a/pkg/analysis_server/test/services/completion/completion_test_util.dart
+++ b/pkg/analysis_server/test/services/completion/completion_test_util.dart
@@ -112,6 +112,19 @@
     return cs;
   }
 
+  CompletionSuggestion assertSuggestClassTypeAlias(String name,
+      [CompletionRelevance relevance = CompletionRelevance.DEFAULT]) {
+    CompletionSuggestion cs =
+        assertSuggest(CompletionSuggestionKind.CLASS_ALIAS, name, relevance);
+    protocol.Element element = cs.element;
+    expect(element, isNotNull);
+    expect(element.kind, equals(protocol.ElementKind.CLASS_TYPE_ALIAS));
+    expect(element.name, equals(name));
+    expect(element.parameters, isNull);
+    expect(element.returnType, isNull);
+    return cs;
+  }
+
   CompletionSuggestion assertSuggestFunction(String name, String returnType,
       bool isDeprecated, [CompletionRelevance relevance =
       CompletionRelevance.DEFAULT]) {
@@ -136,6 +149,32 @@
     return cs;
   }
 
+  CompletionSuggestion assertSuggestFunctionTypeAlias(String name,
+      String returnType, bool isDeprecated, [CompletionRelevance relevance =
+      CompletionRelevance.DEFAULT]) {
+    CompletionSuggestion cs = assertSuggest(
+        CompletionSuggestionKind.FUNCTION_TYPE_ALIAS,
+        name,
+        relevance,
+        isDeprecated);
+    expect(cs.returnType, equals(returnType));
+    protocol.Element element = cs.element;
+    expect(element, isNotNull);
+    expect(element.kind, equals(protocol.ElementKind.FUNCTION_TYPE_ALIAS));
+    expect(element.name, equals(name));
+    expect(element.isDeprecated, equals(isDeprecated));
+    // TODO (danrubel) Determine why params are null
+//    String param = element.parameters;
+//    expect(param, isNotNull);
+//    expect(param[0], equals('('));
+//    expect(param[param.length - 1], equals(')'));
+    // TODO (danrubel) Determine why return type is null
+//    expect(
+//        element.returnType,
+//        equals(returnType != null ? returnType : 'dynamic'));
+    return cs;
+  }
+
   CompletionSuggestion assertSuggestGetter(String name, String returnType,
       [CompletionRelevance relevance = CompletionRelevance.DEFAULT]) {
     CompletionSuggestion cs =
@@ -426,6 +465,20 @@
     }
   }
 
+  CompletionSuggestion assertSuggestImportedFunctionTypeAlias(String name,
+      String returnType, [bool isDeprecated = false, CompletionRelevance relevance =
+      CompletionRelevance.DEFAULT]) {
+    if (computer is ImportedComputer) {
+      return assertSuggestFunctionTypeAlias(
+          name,
+          returnType,
+          isDeprecated,
+          relevance);
+    } else {
+      return assertNotSuggested(name);
+    }
+  }
+
   CompletionSuggestion assertSuggestImportedGetter(String name,
       String returnType, [CompletionRelevance relevance =
       CompletionRelevance.DEFAULT]) {
@@ -513,6 +566,15 @@
     }
   }
 
+  CompletionSuggestion assertSuggestLocalClassTypeAlias(String name,
+      [CompletionRelevance relevance = CompletionRelevance.DEFAULT]) {
+    if (computer is LocalComputer) {
+      return assertSuggestClassTypeAlias(name, relevance);
+    } else {
+      return assertNotSuggested(name);
+    }
+  }
+
   CompletionSuggestion assertSuggestLocalFunction(String name,
       String returnType, [bool isDeprecated = false, CompletionRelevance relevance =
       CompletionRelevance.DEFAULT]) {
@@ -523,6 +585,20 @@
     }
   }
 
+  CompletionSuggestion assertSuggestLocalFunctionTypeAlias(String name,
+      String returnType, [bool isDeprecated = false, CompletionRelevance relevance =
+      CompletionRelevance.DEFAULT]) {
+    if (computer is LocalComputer) {
+      return assertSuggestFunctionTypeAlias(
+          name,
+          returnType,
+          isDeprecated,
+          relevance);
+    } else {
+      return assertNotSuggested(name);
+    }
+  }
+
   CompletionSuggestion assertSuggestLocalGetter(String name, String returnType,
       [CompletionRelevance relevance = CompletionRelevance.DEFAULT]) {
     if (computer is LocalComputer) {
@@ -552,6 +628,21 @@
     }
   }
 
+  test_ArgumentList() {
+    // ArgumentList  MethodInvocation  ExpressionStatement  Block
+    addSource('/libA.dart', '''
+      library A;
+      bool hasLength(int expected) { }''');
+    addTestSource('''
+      import '/libA.dart'
+      main() {expect(^)}''');
+    computeFast();
+    return computeFull(true).then((_) {
+      assertSuggestLocalFunction('main', null);
+      assertSuggestImportedFunction('hasLength', 'bool');
+    });
+  }
+
   test_AssignmentExpression_name() {
     // SimpleIdentifier  VariableDeclaration  VariableDeclarationList
     // VariableDeclarationStatement  Block
@@ -912,6 +1003,8 @@
       part of libAB;
       var T1;
       PB F1() => new PB();
+      typedef PB2 F2(int blat);
+      class Clz = Object with Object;
       class PB { }''');
     addSource('/testCD.dart', '''
       class C { }
@@ -927,6 +1020,8 @@
       assertSuggestImportedClass('PB');
       assertSuggestImportedTopLevelVar('T1', null);
       assertSuggestImportedFunction('F1', 'PB');
+      assertSuggestImportedClass('Clz');
+      assertSuggestImportedFunctionTypeAlias('F2', null);
       assertNotSuggested('C');
       assertNotSuggested('D');
       assertNotSuggested('X');
@@ -984,6 +1079,8 @@
       class _B { }''');
     addTestSource('''
       import "/testA.dart";
+      typedef int F2(int blat);
+      class Clz = Object with Object;
       class C {foo(){O^} void bar() {}}''');
     computeFast();
     return computeFull(true).then((_) {
@@ -992,6 +1089,8 @@
       assertSuggestLocalClass('C');
       assertSuggestLocalMethod('foo', 'C', null);
       assertSuggestLocalMethod('bar', 'C', 'void');
+      assertSuggestLocalFunctionTypeAlias('F2', 'int');
+      assertSuggestLocalClassTypeAlias('Clz');
       assertSuggestLocalClass('C');
       assertNotSuggested('x');
       assertNotSuggested('_B');
@@ -1399,12 +1498,58 @@
     });
   }
 
+  test_PrefixedIdentifier_class_const() {
+    // SimpleIdentifier PrefixedIdentifier ExpressionStatement Block
+    addSource('/testB.dart', '''
+      lib B;
+      class I {
+        static const scI = 'boo';
+        X get f => new A();
+        get _g => new A();}
+      class B implements I {
+        static const int scB = 12;
+        var b; X _c;
+        X get d => new A();get _e => new A();
+        set s1(I x) {} set _s2(I x) {}
+        m(X x) {} I _n(X x) {}}
+      class X{}''');
+    addTestSource('''
+      import "/testB.dart";
+      class A extends B {
+        static const String scA = 'foo';
+        w() { }}
+      main() {A.^}''');
+    computeFast();
+    return computeFull(true).then((_) {
+      assertSuggestInvocationGetter('scA', 'String');
+      assertSuggestInvocationGetter('scB', 'int');
+      assertSuggestInvocationGetter('scI', null);
+      assertNotSuggested('b');
+      assertNotSuggested('_c');
+      assertNotSuggested('d');
+      assertNotSuggested('_e');
+      assertNotSuggested('f');
+      assertNotSuggested('_g');
+      assertNotSuggested('s1');
+      assertNotSuggested('_s2');
+      assertNotSuggested('m');
+      assertNotSuggested('_n');
+      assertNotSuggested('a');
+      assertNotSuggested('A');
+      assertNotSuggested('X');
+      assertNotSuggested('w');
+      assertNotSuggested('Object');
+      assertNotSuggested('==');
+    });
+  }
+
   test_PrefixedIdentifier_class_imported() {
     // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
     addSource('/testB.dart', '''
       lib B;
       class I {X get f => new A();get _g => new A();}
       class A implements I {
+        static const int sc = 12;
         var b; X _c;
         X get d => new A();get _e => new A();
         set s1(I x) {} set _s2(I x) {}
@@ -1415,6 +1560,7 @@
       main() {A a; a.^}''');
     computeFast();
     return computeFull(true).then((_) {
+      assertSuggestInvocationGetter('sc', 'int');
       assertSuggestInvocationGetter('b', null);
       assertNotSuggested('_c');
       assertSuggestInvocationGetter('d', 'X');
@@ -1439,6 +1585,7 @@
       main() {A a; a.^}
       class I {X get f => new A();get _g => new A();}
       class A implements I {
+        static const int sc = 12;
         var b; X _c;
         X get d => new A();get _e => new A();
         set s1(I x) {} set _s2(I x) {}
@@ -1446,6 +1593,7 @@
       class X{}''');
     computeFast();
     return computeFull(true).then((_) {
+      assertSuggestInvocationGetter('sc', 'int');
       assertSuggestInvocationGetter('b', null);
       assertSuggestInvocationGetter('_c', 'X');
       assertSuggestInvocationGetter('d', 'X');
@@ -1525,6 +1673,16 @@
     });
   }
 
+  test_PrefixedIdentifier_propertyAccess() {
+    // PrefixedIdentifier  ExpressionStatement  Block  BlockFunctionBody
+    addTestSource('class A {String x; int get foo {x.^}');
+    computeFast();
+    return computeFull(true).then((_) {
+      assertSuggestInvocationGetter('isEmpty', 'bool');
+      assertSuggestInvocationMethod('compareTo', 'Comparable', 'int');
+    });
+  }
+
   test_PropertyAccess_expression() {
     // SimpleIdentifier  MethodInvocation  PropertyAccess  ExpressionStatement
     addTestSource('class A {a() {"hello".to^String().length}}');
diff --git a/pkg/analysis_server/test/services/correction/fix_test.dart b/pkg/analysis_server/test/services/correction/fix_test.dart
index 9af602c..6060c94 100644
--- a/pkg/analysis_server/test/services/correction/fix_test.dart
+++ b/pkg/analysis_server/test/services/correction/fix_test.dart
@@ -37,6 +37,24 @@
   SourceChange change;
   String resultCode;
 
+  void assert_undefinedFunction_create_returnType_bool(String lineWithTest) {
+    _indexTestUnit('''
+main() {
+  bool b = true;
+  $lineWithTest
+}
+''');
+    assertHasFix(FixKind.CREATE_FUNCTION, '''
+main() {
+  bool b = true;
+  $lineWithTest
+}
+
+bool test() {
+}
+''');
+  }
+
   void assertHasFix(FixKind kind, String expected) {
     AnalysisError error = _findErrorToFix();
     fix = _assertHasFix(kind, error);
@@ -59,24 +77,6 @@
     }
   }
 
-  void assert_undefinedFunction_create_returnType_bool(String lineWithTest) {
-    _indexTestUnit('''
-main() {
-  bool b = true;
-  $lineWithTest
-}
-''');
-    assertHasFix(FixKind.CREATE_FUNCTION, '''
-main() {
-  bool b = true;
-  $lineWithTest
-}
-
-bool test() {
-}
-''');
-  }
-
   Position expectedPosition(String search) {
     int offset = resultCode.indexOf(search);
     int length = getLeadingIdentifierLength(search);
@@ -188,6 +188,54 @@
     _assertLinkedGroup(change.linkedEditGroups[0], ['Test v =', 'Test {']);
   }
 
+  void test_createConstructor_insteadOfSyntheticDefault() {
+    _indexTestUnit('''
+class A {
+  int field;
+
+  method() {}
+}
+main() {
+  new A(1, 2.0);
+}
+''');
+    assertHasFix(FixKind.CREATE_CONSTRUCTOR, '''
+class A {
+  int field;
+
+  A(int i, double d) {
+  }
+
+  method() {}
+}
+main() {
+  new A(1, 2.0);
+}
+''');
+  }
+
+  void test_createConstructor_named() {
+    _indexTestUnit('''
+class A {
+  method() {}
+}
+main() {
+  new A.named(1, 2.0);
+}
+''');
+    assertHasFix(FixKind.CREATE_CONSTRUCTOR, '''
+class A {
+  A.named(int i, double d) {
+  }
+
+  method() {}
+}
+main() {
+  new A.named(1, 2.0);
+}
+''');
+  }
+
   void test_createConstructorSuperExplicit() {
     _indexTestUnit('''
 class A {
@@ -347,54 +395,6 @@
     assertNoFix(FixKind.CREATE_CONSTRUCTOR_SUPER);
   }
 
-  void test_createConstructor_insteadOfSyntheticDefault() {
-    _indexTestUnit('''
-class A {
-  int field;
-
-  method() {}
-}
-main() {
-  new A(1, 2.0);
-}
-''');
-    assertHasFix(FixKind.CREATE_CONSTRUCTOR, '''
-class A {
-  int field;
-
-  A(int i, double d) {
-  }
-
-  method() {}
-}
-main() {
-  new A(1, 2.0);
-}
-''');
-  }
-
-  void test_createConstructor_named() {
-    _indexTestUnit('''
-class A {
-  method() {}
-}
-main() {
-  new A.named(1, 2.0);
-}
-''');
-    assertHasFix(FixKind.CREATE_CONSTRUCTOR, '''
-class A {
-  A.named(int i, double d) {
-  }
-
-  method() {}
-}
-main() {
-  new A.named(1, 2.0);
-}
-''');
-  }
-
   void test_createField_getter_multiLevel() {
     _indexTestUnit('''
 class A {
@@ -464,25 +464,6 @@
 ''');
   }
 
-  void test_createField_getter_unqualified_instance_asStatement() {
-    _indexTestUnit('''
-class A {
-  main() {
-    test;
-  }
-}
-''');
-    assertHasFix(FixKind.CREATE_FIELD, '''
-class A {
-  var test;
-
-  main() {
-    test;
-  }
-}
-''');
-  }
-
   void test_createField_getter_unqualified_instance_assignmentLhs() {
     _indexTestUnit('''
 class A {
@@ -502,6 +483,25 @@
 ''');
   }
 
+  void test_createField_getter_unqualified_instance_asStatement() {
+    _indexTestUnit('''
+class A {
+  main() {
+    test;
+  }
+}
+''');
+    assertHasFix(FixKind.CREATE_FIELD, '''
+class A {
+  var test;
+
+  main() {
+    test;
+  }
+}
+''');
+  }
+
   void test_createField_setter_qualified_instance_hasField() {
     _indexTestUnit('''
 class A {
@@ -623,6 +623,81 @@
     expect(fileEdit.edits[0].replacement, contains('library my.file;'));
   }
 
+  void test_createLocalVariable_read_typeAssignment() {
+    _indexTestUnit('''
+main() {
+  int a = test;
+}
+''');
+    assertHasFix(FixKind.CREATE_LOCAL_VARIABLE, '''
+main() {
+  int test;
+  int a = test;
+}
+''');
+  }
+
+  void test_createLocalVariable_read_typeCondition() {
+    _indexTestUnit('''
+main() {
+  if (!test) {
+    print(42);
+  }
+}
+''');
+    assertHasFix(FixKind.CREATE_LOCAL_VARIABLE, '''
+main() {
+  bool test;
+  if (!test) {
+    print(42);
+  }
+}
+''');
+  }
+
+  void test_createLocalVariable_read_typeInvocationArgument() {
+    _indexTestUnit('''
+main() {
+  f(test);
+}
+f(String p) {}
+''');
+    assertHasFix(FixKind.CREATE_LOCAL_VARIABLE, '''
+main() {
+  String test;
+  f(test);
+}
+f(String p) {}
+''');
+  }
+
+  void test_createLocalVariable_write_assignment() {
+    _indexTestUnit('''
+main() {
+  test = 42;
+}
+''');
+    assertHasFix(FixKind.CREATE_LOCAL_VARIABLE, '''
+main() {
+  var test = 42;
+}
+''');
+  }
+
+  void test_createLocalVariable_write_assignment_compound() {
+    _indexTestUnit('''
+main() {
+  test += 42;
+}
+''');
+    assertHasFix(FixKind.CREATE_LOCAL_VARIABLE, '''
+main() {
+  int test;
+  test += 42;
+}
+''');
+  }
+
   void test_createMissingOverrides_functionType() {
     _indexTestUnit('''
 abstract class A {
diff --git a/pkg/analysis_server/test/services/index/dart_index_contributor_test.dart b/pkg/analysis_server/test/services/index/dart_index_contributor_test.dart
index f0b2694..0f7d336 100644
--- a/pkg/analysis_server/test/services/index/dart_index_contributor_test.dart
+++ b/pkg/analysis_server/test/services/index/dart_index_contributor_test.dart
@@ -298,6 +298,16 @@
         _expectedLocation(classElement, 'A {}'));
   }
 
+  void test_definesClassEnum() {
+    _indexTestUnit('enum MyEnum {A, B, c}');
+    // prepare elements
+    ClassElement classElement = findElement("MyEnum");
+    // verify
+    _assertDefinesTopLevelElement(
+        IndexConstants.DEFINES,
+        _expectedLocation(classElement, 'MyEnum {'));
+  }
+
   void test_definesClassAlias() {
     _indexTestUnit('''
 class Mix {}
diff --git a/pkg/analysis_server/test/services/refactoring/naming_conventions_test.dart b/pkg/analysis_server/test/services/refactoring/naming_conventions_test.dart
index 0971db2..6a1b53f 100644
--- a/pkg/analysis_server/test/services/refactoring/naming_conventions_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/naming_conventions_test.dart
@@ -90,71 +90,6 @@
         RefactoringProblemSeverity.FATAL,
         expectedMessage: "Class name must not start or end with a blank.");
   }
-  void test_validateConstantName_OK() {
-    assertRefactoringStatusOK(validateConstantName("NAME"));
-  }
-
-  void test_validateConstantName_OK_digit() {
-    assertRefactoringStatusOK(validateConstantName("NAME2"));
-  }
-
-  void test_validateConstantName_OK_underscoreLeading() {
-    assertRefactoringStatusOK(validateConstantName("_NAME"));
-  }
-
-  void test_validateConstantName_OK_underscoreMiddle() {
-    assertRefactoringStatusOK(validateConstantName("MY_NEW_NAME"));
-  }
-
-  void test_validateConstantName_empty() {
-    assertRefactoringStatus(
-        validateConstantName(""),
-        RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Constant name must not be empty.");
-  }
-
-  void test_validateConstantName_leadingBlanks() {
-    assertRefactoringStatus(
-        validateConstantName(" NewName"),
-        RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Constant name must not start or end with a blank.");
-  }
-
-  void test_validateConstantName_notAllCaps() {
-    assertRefactoringStatus(
-        validateConstantName("NewName"),
-        RefactoringProblemSeverity.WARNING,
-        expectedMessage: "Constant name should be all uppercase with underscores.");
-  }
-
-  void test_validateConstantName_notIdentifierMiddle() {
-    assertRefactoringStatus(
-        validateConstantName("NA-ME"),
-        RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Constant name must not contain '-'.");
-  }
-
-  void test_validateConstantName_notIdentifierStart() {
-    assertRefactoringStatus(
-        validateConstantName("99_RED_BALLOONS"),
-        RefactoringProblemSeverity.FATAL,
-        expectedMessage:
-            "Constant name must begin with an uppercase letter or underscore.");
-  }
-
-  void test_validateConstantName_null() {
-    assertRefactoringStatus(
-        validateConstantName(null),
-        RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Constant name must not be null.");
-  }
-
-  void test_validateConstantName_trailingBlanks() {
-    assertRefactoringStatus(
-        validateConstantName("NewName "),
-        RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Constant name must not start or end with a blank.");
-  }
 
   void test_validateConstructorName_OK() {
     assertRefactoringStatusOK(validateConstructorName("newName"));
diff --git a/pkg/analysis_server/test/services/refactoring/rename_class_member_test.dart b/pkg/analysis_server/test/services/refactoring/rename_class_member_test.dart
index d45a37d..d7b1626 100644
--- a/pkg/analysis_server/test/services/refactoring/rename_class_member_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/rename_class_member_test.dart
@@ -271,29 +271,6 @@
     assertRefactoringStatusOK(refactoring.checkNewName());
   }
 
-  test_checkNewName_FieldElement_const() {
-    indexTestUnit('''
-class A {
-  static const int TEST = 0;
-}
-''');
-    createRenameRefactoringAtString('TEST =');
-    // null
-    refactoring.newName = null;
-    assertRefactoringStatus(
-        refactoring.checkNewName(),
-        RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Constant name must not be null.");
-    // not upper case
-    refactoring.newName = 'newName';
-    assertRefactoringStatus(
-        refactoring.checkNewName(),
-        RefactoringProblemSeverity.WARNING);
-    // OK
-    refactoring.newName = 'NEW_NAME';
-    assertRefactoringStatusOK(refactoring.checkNewName());
-  }
-
   test_checkNewName_MethodElement() {
     indexTestUnit('''
 class A {
diff --git a/pkg/analysis_server/test/services/refactoring/rename_local_test.dart b/pkg/analysis_server/test/services/refactoring/rename_local_test.dart
index 3c795b1..9fad28e 100644
--- a/pkg/analysis_server/test/services/refactoring/rename_local_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/rename_local_test.dart
@@ -242,36 +242,6 @@
     assertRefactoringStatusOK(refactoring.checkNewName());
   }
 
-  test_checkNewName_LocalVariableElement_const() {
-    indexTestUnit('''
-main() {
-  const int TEST = 0;
-}
-''');
-    createRenameRefactoringAtString('TEST = 0;');
-    // null
-    refactoring.newName = null;
-    assertRefactoringStatus(
-        refactoring.checkNewName(),
-        RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Constant name must not be null.");
-    // empty
-    refactoring.newName = '';
-    assertRefactoringStatus(
-        refactoring.checkNewName(),
-        RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Constant name must not be empty.");
-    // same
-    refactoring.newName = 'TEST';
-    assertRefactoringStatus(
-        refactoring.checkNewName(),
-        RefactoringProblemSeverity.FATAL,
-        expectedMessage: "The new name must be different than the current name.");
-    // OK
-    refactoring.newName = 'NEW_NAME';
-    assertRefactoringStatusOK(refactoring.checkNewName());
-  }
-
   test_checkNewName_ParameterElement() {
     indexTestUnit('''
 main(test) {
diff --git a/pkg/analysis_server/test/services/refactoring/rename_unit_member_test.dart b/pkg/analysis_server/test/services/refactoring/rename_unit_member_test.dart
index 7e4ec51..84a34fe 100644
--- a/pkg/analysis_server/test/services/refactoring/rename_unit_member_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/rename_unit_member_test.dart
@@ -303,28 +303,6 @@
     assertRefactoringStatusOK(refactoring.checkNewName());
   }
 
-  test_checkNewName_TopLevelVariableElement_const() {
-    indexTestUnit('''
-const TEST = 0;
-''');
-    createRenameRefactoringAtString('TEST =');
-    // null
-    refactoring.newName = null;
-    assertRefactoringStatus(
-        refactoring.checkNewName(),
-        RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Constant name must not be null.");
-    // empty
-    refactoring.newName = '';
-    assertRefactoringStatus(
-        refactoring.checkNewName(),
-        RefactoringProblemSeverity.FATAL,
-        expectedMessage: "Constant name must not be empty.");
-    // OK
-    refactoring.newName = 'NEW_NAME';
-    assertRefactoringStatusOK(refactoring.checkNewName());
-  }
-
   test_createChange_ClassElement() {
     indexTestUnit('''
 class Test implements Other {
diff --git a/pkg/analysis_server/test/timing/completion/completion_simple.dart b/pkg/analysis_server/test/timing/completion/completion_simple.dart
index 4b98eb9..aa833bb 100644
--- a/pkg/analysis_server/test/timing/completion/completion_simple.dart
+++ b/pkg/analysis_server/test/timing/completion/completion_simple.dart
@@ -5,6 +5,7 @@
 library test.timing.simple;
 
 import 'dart:async';
+import 'dart:io';
 
 import 'package:analysis_server/src/protocol.dart';
 import 'package:path/path.dart';
@@ -22,6 +23,9 @@
     print('averageTime = ${result.averageTime}');
     print('maxTime = ${result.maxTime}');
     print('standardDeviation = ${result.standardDeviation}');
+    print('');
+    print('Press return to exit');
+    return stdin.first;
   });
 }
 
diff --git a/pkg/analysis_server/test/timing/timing_framework.dart b/pkg/analysis_server/test/timing/timing_framework.dart
index cf10ee4..273bef8 100644
--- a/pkg/analysis_server/test/timing/timing_framework.dart
+++ b/pkg/analysis_server/test/timing/timing_framework.dart
@@ -89,7 +89,8 @@
     onServerConnected.listen((_) {
       serverConnected.complete();
     });
-    return server.start().then((params) {
+    skipShutdown = true;
+    return server.start(profileServer: true).then((params) {
       server.listenToOutput(dispatchNotification);
       server.exitCode.then((_) {
         skipShutdown = true;
diff --git a/pkg/analysis_server/tool/spec/spec_input.html b/pkg/analysis_server/tool/spec/spec_input.html
index 16bd463..da50b3c 100644
--- a/pkg/analysis_server/tool/spec/spec_input.html
+++ b/pkg/analysis_server/tool/spec/spec_input.html
@@ -677,8 +677,9 @@
           <field name="regions">
             <list><ref>NavigationRegion</ref></list>
             <p>
-              The navigation regions contained in the file. Each
-              navigation region represents a list of targets
+              The navigation regions contained in the file.
+              The regions are sorted by their offsets.
+              Each navigation region represents a list of targets
               associated with some range. The lists will usually
               contain a single target, but can contain more in the
               case of a part that is included in multiple libraries
@@ -2116,6 +2117,8 @@
           <value><code>CONSTRUCTOR</code></value>
           <value><code>DIRECTIVE</code></value>
           <value><code>DYNAMIC_TYPE</code></value>
+          <value><code>ENUM</code></value>
+          <value><code>ENUM_CONSTANT</code></value>
           <value><code>FIELD</code></value>
           <value><code>FIELD_STATIC</code></value>
           <value><code>FUNCTION</code></value>
diff --git a/pkg/analyzer/example/parser_driver.dart b/pkg/analyzer/example/parser_driver.dart
index cae05c6..2bbd669 100644
--- a/pkg/analyzer/example/parser_driver.dart
+++ b/pkg/analyzer/example/parser_driver.dart
@@ -52,7 +52,7 @@
 
 class _ASTVisitor extends GeneralizingAstVisitor {
   visitNode(AstNode node) {
-    print('${node.runtimeType} : <"${node.toString()}">');
+    print('${node.runtimeType} : <"$node">');
     return super.visitNode(node);
   }
 }
diff --git a/pkg/analyzer/example/resolver_driver.dart b/pkg/analyzer/example/resolver_driver.dart
index 679f16a..08e4065 100644
--- a/pkg/analyzer/example/resolver_driver.dart
+++ b/pkg/analyzer/example/resolver_driver.dart
@@ -42,7 +42,7 @@
 
 class _ASTVisitor extends GeneralizingAstVisitor {
   visitNode(AstNode node) {
-    String text = '${node.runtimeType} : <"${node.toString()}">';
+    String text = '${node.runtimeType} : <"$node">';
     if (node is SimpleIdentifier) {
       Element element = node.staticElement;
       if (element != null) {
diff --git a/pkg/analyzer/lib/source/package_map_resolver.dart b/pkg/analyzer/lib/source/package_map_resolver.dart
index 1f2f101..de2c673 100644
--- a/pkg/analyzer/lib/source/package_map_resolver.dart
+++ b/pkg/analyzer/lib/source/package_map_resolver.dart
@@ -82,7 +82,7 @@
         String pkgFolderPath = pkgFolder.path;
         if (sourcePath.startsWith(pkgFolderPath)) {
           String relPath = sourcePath.substring(pkgFolderPath.length);
-          return new Uri(path: '${PACKAGE_SCHEME}:$pkgName$relPath');
+          return new Uri(path: '$PACKAGE_SCHEME:$pkgName$relPath');
         }
       }
     }
diff --git a/pkg/analyzer/lib/source/pub_package_map_provider.dart b/pkg/analyzer/lib/source/pub_package_map_provider.dart
index cb949eaf..bb49716 100644
--- a/pkg/analyzer/lib/source/pub_package_map_provider.dart
+++ b/pkg/analyzer/lib/source/pub_package_map_provider.dart
@@ -51,7 +51,7 @@
           executable, [PUB_LIST_COMMAND], workingDirectory: folder.path);
     } on io.ProcessException catch (exception, stackTrace) {
       AnalysisEngine.instance.logger.logInformation(
-          "Error running pub $PUB_LIST_COMMAND\n${exception}\n${stackTrace}");
+          "Error running pub $PUB_LIST_COMMAND\n$exception\n$stackTrace");
     }
     if (result.exitCode != 0) {
       AnalysisEngine.instance.logger.logInformation(
@@ -62,7 +62,7 @@
       return parsePackageMap(result.stdout, folder);
     } catch (exception, stackTrace) {
       AnalysisEngine.instance.logger.logError(
-          "Malformed output from pub $PUB_LIST_COMMAND\n${exception}\n${stackTrace}");
+          "Malformed output from pub $PUB_LIST_COMMAND\n$exception\n$stackTrace");
     }
 
     return _error(folder);
diff --git a/pkg/analyzer/lib/src/analyzer_impl.dart b/pkg/analyzer/lib/src/analyzer_impl.dart
index 79ef6b4..4de0a6a1 100644
--- a/pkg/analyzer/lib/src/analyzer_impl.dart
+++ b/pkg/analyzer/lib/src/analyzer_impl.dart
@@ -172,7 +172,7 @@
       }
       exitCode = status.ordinal;
     }).catchError((ex, st) {
-      AnalysisEngine.instance.logger.logError("${ex}\n${st}");
+      AnalysisEngine.instance.logger.logError("$ex\n$st");
     });
   }
 
diff --git a/pkg/analyzer/lib/src/generated/ast.dart b/pkg/analyzer/lib/src/generated/ast.dart
index fff8270..f5506fb 100644
--- a/pkg/analyzer/lib/src/generated/ast.dart
+++ b/pkg/analyzer/lib/src/generated/ast.dart
@@ -69,9 +69,9 @@
   }
 
   @override
-  void appendStringValue(JavaStringBuilder builder) {
+  void appendStringValue(StringBuffer buffer) {
     for (StringLiteral stringLiteral in strings) {
-      stringLiteral.appendStringValue(builder);
+      stringLiteral.appendStringValue(buffer);
     }
   }
 }
@@ -197,12 +197,10 @@
    *         appeared in the original source
    */
   List<AstNode> get sortedCommentAndAnnotations {
-    List<AstNode> childList = new List<AstNode>();
-    childList.add(_comment);
-    childList.addAll(_metadata);
-    List<AstNode> children = new List.from(childList);
-    children.sort(AstNode.LEXICAL_ORDER);
-    return children;
+    return <AstNode>[]
+      ..add(_comment)
+      ..addAll(_metadata)
+      ..sort(AstNode.LEXICAL_ORDER);
   }
 }
 
@@ -995,12 +993,38 @@
 }
 
 /**
- * Instances of the class `AstCloner` implement an object that will clone any AST structure
- * that it visits. The cloner will only clone the structure, it will not preserve any resolution
- * results or properties associated with the nodes.
+ * An `AstCloner` is an AST visitor that will clone any AST structure that it
+ * visits. The cloner will only clone the structure, it will not preserve any
+ * resolution results or properties associated with the nodes.
  */
 class AstCloner implements AstVisitor<AstNode> {
-  List cloneNodeList(NodeList nodes) {
+  /**
+   * A flag indicating whether tokens should be cloned while cloning an AST
+   * structure.
+   */
+  final bool cloneTokens;
+
+  /**
+   * Initialize a newly created AST cloner to optionally clone tokens while
+   * cloning AST nodes if [cloneTokens] is `true`.
+   */
+  AstCloner([this.cloneTokens = false]);
+
+  /**
+   * Return a clone of the given [node].
+   */
+  AstNode cloneNode(AstNode node) {
+    if (node == null) {
+      return null;
+    }
+    return node.accept(this) as AstNode;
+  }
+
+  /**
+   * Return a list containing cloned versions of the nodes in the given list of
+   * [nodes].
+   */
+  List<AstNode> cloneNodeList(NodeList nodes) {
     int count = nodes.length;
     List clonedNodes = new List();
     for (int i = 0; i < count; i++) {
@@ -1009,185 +1033,484 @@
     return clonedNodes;
   }
 
-  @override
-  AdjacentStrings visitAdjacentStrings(AdjacentStrings node) => new AdjacentStrings(cloneNodeList(node.strings));
+  /**
+   * Clone the given [token] if tokens are supposed to be cloned.
+   */
+  Token cloneToken(Token token) {
+    if (cloneTokens) {
+      return (token == null ? null : token.copy());
+    } else {
+      return token;
+    }
+  }
+
+  /**
+   * Clone the given [tokens] if tokens are supposed to be cloned.
+   */
+  List<Token> cloneTokenList(List<Token> tokens) {
+    if (cloneTokens) {
+      return tokens.map((Token token) => token.copy()).toList();
+    }
+    return tokens;
+  }
 
   @override
-  Annotation visitAnnotation(Annotation node) => new Annotation(node.atSign, cloneNode(node.name), node.period, cloneNode(node.constructorName), cloneNode(node.arguments));
+  AdjacentStrings visitAdjacentStrings(AdjacentStrings node)
+      => new AdjacentStrings(cloneNodeList(node.strings));
 
   @override
-  ArgumentList visitArgumentList(ArgumentList node) => new ArgumentList(node.leftParenthesis, cloneNodeList(node.arguments), node.rightParenthesis);
+  Annotation visitAnnotation(Annotation node)
+      => new Annotation(
+          cloneToken(node.atSign),
+          cloneNode(node.name),
+          cloneToken(node.period),
+          cloneNode(node.constructorName),
+          cloneNode(node.arguments));
 
   @override
-  AsExpression visitAsExpression(AsExpression node) => new AsExpression(cloneNode(node.expression), node.asOperator, cloneNode(node.type));
+  ArgumentList visitArgumentList(ArgumentList node)
+      => new ArgumentList(
+          cloneToken(node.leftParenthesis),
+          cloneNodeList(node.arguments),
+          cloneToken(node.rightParenthesis));
 
   @override
-  AstNode visitAssertStatement(AssertStatement node) => new AssertStatement(node.keyword, node.leftParenthesis, cloneNode(node.condition), node.rightParenthesis, node.semicolon);
+  AsExpression visitAsExpression(AsExpression node)
+      => new AsExpression(
+          cloneNode(node.expression),
+          cloneToken(node.asOperator),
+          cloneNode(node.type));
 
   @override
-  AssignmentExpression visitAssignmentExpression(AssignmentExpression node) => new AssignmentExpression(cloneNode(node.leftHandSide), node.operator, cloneNode(node.rightHandSide));
+  AstNode visitAssertStatement(AssertStatement node)
+      => new AssertStatement(
+          cloneToken(node.keyword),
+          cloneToken(node.leftParenthesis),
+          cloneNode(node.condition),
+          cloneToken(node.rightParenthesis),
+          cloneToken(node.semicolon));
 
   @override
-  AwaitExpression visitAwaitExpression(AwaitExpression node) => new AwaitExpression(node.awaitKeyword, node.expression);
+  AssignmentExpression visitAssignmentExpression(AssignmentExpression node)
+      => new AssignmentExpression(
+          cloneNode(node.leftHandSide),
+          cloneToken(node.operator),
+          cloneNode(node.rightHandSide));
 
   @override
-  BinaryExpression visitBinaryExpression(BinaryExpression node) => new BinaryExpression(cloneNode(node.leftOperand), node.operator, cloneNode(node.rightOperand));
+  AwaitExpression visitAwaitExpression(AwaitExpression node)
+      => new AwaitExpression(
+          cloneToken(node.awaitKeyword),
+          cloneNode(node.expression));
 
   @override
-  Block visitBlock(Block node) => new Block(node.leftBracket, cloneNodeList(node.statements), node.rightBracket);
+  BinaryExpression visitBinaryExpression(BinaryExpression node)
+      => new BinaryExpression(
+          cloneNode(node.leftOperand),
+          cloneToken(node.operator),
+          cloneNode(node.rightOperand));
 
   @override
-  BlockFunctionBody visitBlockFunctionBody(BlockFunctionBody node) => new BlockFunctionBody(node.keyword, node.star, cloneNode(node.block));
+  Block visitBlock(Block node)
+      => new Block(
+          cloneToken(node.leftBracket),
+          cloneNodeList(node.statements),
+          cloneToken(node.rightBracket));
 
   @override
-  BooleanLiteral visitBooleanLiteral(BooleanLiteral node) => new BooleanLiteral(node.literal, node.value);
+  BlockFunctionBody visitBlockFunctionBody(BlockFunctionBody node)
+      => new BlockFunctionBody(
+          cloneToken(node.keyword),
+          cloneToken(node.star),
+          cloneNode(node.block));
 
   @override
-  BreakStatement visitBreakStatement(BreakStatement node) => new BreakStatement(node.keyword, cloneNode(node.label), node.semicolon);
+  BooleanLiteral visitBooleanLiteral(BooleanLiteral node)
+      => new BooleanLiteral(cloneToken(node.literal), node.value);
 
   @override
-  CascadeExpression visitCascadeExpression(CascadeExpression node) => new CascadeExpression(cloneNode(node.target), cloneNodeList(node.cascadeSections));
+  BreakStatement visitBreakStatement(BreakStatement node)
+      => new BreakStatement(
+          cloneToken(node.keyword),
+          cloneNode(node.label),
+          cloneToken(node.semicolon));
 
   @override
-  CatchClause visitCatchClause(CatchClause node) => new CatchClause(node.onKeyword, cloneNode(node.exceptionType), node.catchKeyword, node.leftParenthesis, cloneNode(node.exceptionParameter), node.comma, cloneNode(node.stackTraceParameter), node.rightParenthesis, cloneNode(node.body));
+  CascadeExpression visitCascadeExpression(CascadeExpression node)
+      => new CascadeExpression(
+          cloneNode(node.target),
+          cloneNodeList(node.cascadeSections));
+
+  @override
+  CatchClause visitCatchClause(CatchClause node)
+      => new CatchClause(
+          cloneToken(node.onKeyword),
+          cloneNode(node.exceptionType),
+          cloneToken(node.catchKeyword),
+          cloneToken(node.leftParenthesis),
+          cloneNode(node.exceptionParameter),
+          cloneToken(node.comma),
+          cloneNode(node.stackTraceParameter),
+          cloneToken(node.rightParenthesis),
+          cloneNode(node.body));
 
   @override
   ClassDeclaration visitClassDeclaration(ClassDeclaration node) {
-    ClassDeclaration copy = new ClassDeclaration(cloneNode(node.documentationComment), cloneNodeList(node.metadata), node.abstractKeyword, node.classKeyword, cloneNode(node.name), cloneNode(node.typeParameters), cloneNode(node.extendsClause), cloneNode(node.withClause), cloneNode(node.implementsClause), node.leftBracket, cloneNodeList(node.members), node.rightBracket);
+    ClassDeclaration copy = new ClassDeclaration(
+        cloneNode(node.documentationComment),
+        cloneNodeList(node.metadata),
+        cloneToken(node.abstractKeyword),
+        cloneToken(node.classKeyword),
+        cloneNode(node.name),
+        cloneNode(node.typeParameters),
+        cloneNode(node.extendsClause),
+        cloneNode(node.withClause),
+        cloneNode(node.implementsClause),
+        cloneToken(node.leftBracket),
+        cloneNodeList(node.members),
+        cloneToken(node.rightBracket));
     copy.nativeClause = cloneNode(node.nativeClause);
     return copy;
   }
 
   @override
-  ClassTypeAlias visitClassTypeAlias(ClassTypeAlias node) => new ClassTypeAlias(cloneNode(node.documentationComment), cloneNodeList(node.metadata), node.keyword, cloneNode(node.name), cloneNode(node.typeParameters), node.equals, node.abstractKeyword, cloneNode(node.superclass), cloneNode(node.withClause), cloneNode(node.implementsClause), node.semicolon);
+  ClassTypeAlias visitClassTypeAlias(ClassTypeAlias node)
+      => new ClassTypeAlias(
+          cloneNode(node.documentationComment),
+          cloneNodeList(node.metadata),
+          cloneToken(node.keyword),
+          cloneNode(node.name),
+          cloneNode(node.typeParameters),
+          cloneToken(node.equals),
+          cloneToken(node.abstractKeyword),
+          cloneNode(node.superclass),
+          cloneNode(node.withClause),
+          cloneNode(node.implementsClause),
+          cloneToken(node.semicolon));
 
   @override
   Comment visitComment(Comment node) {
     if (node.isDocumentation) {
-      return Comment.createDocumentationCommentWithReferences(node.tokens, cloneNodeList(node.references));
+      return Comment.createDocumentationCommentWithReferences(
+          cloneTokenList(node.tokens),
+          cloneNodeList(node.references));
     } else if (node.isBlock) {
-      return Comment.createBlockComment(node.tokens);
+      return Comment.createBlockComment(cloneTokenList(node.tokens));
     }
-    return Comment.createEndOfLineComment(node.tokens);
+    return Comment.createEndOfLineComment(cloneTokenList(node.tokens));
   }
 
   @override
-  CommentReference visitCommentReference(CommentReference node) => new CommentReference(node.newKeyword, cloneNode(node.identifier));
+  CommentReference visitCommentReference(CommentReference node)
+      => new CommentReference(
+          cloneToken(node.newKeyword),
+          cloneNode(node.identifier));
 
   @override
   CompilationUnit visitCompilationUnit(CompilationUnit node) {
-    CompilationUnit clone = new CompilationUnit(node.beginToken, cloneNode(node.scriptTag), cloneNodeList(node.directives), cloneNodeList(node.declarations), node.endToken);
+    CompilationUnit clone = new CompilationUnit(
+        cloneToken(node.beginToken),
+        cloneNode(node.scriptTag),
+        cloneNodeList(node.directives),
+        cloneNodeList(node.declarations),
+        cloneToken(node.endToken));
     clone.lineInfo = node.lineInfo;
     return clone;
   }
 
   @override
-  ConditionalExpression visitConditionalExpression(ConditionalExpression node) => new ConditionalExpression(cloneNode(node.condition), node.question, cloneNode(node.thenExpression), node.colon, cloneNode(node.elseExpression));
+  ConditionalExpression visitConditionalExpression(ConditionalExpression node)
+      => new ConditionalExpression(
+          cloneNode(node.condition),
+          cloneToken(node.question),
+          cloneNode(node.thenExpression),
+          cloneToken(node.colon),
+          cloneNode(node.elseExpression));
 
   @override
-  ConstructorDeclaration visitConstructorDeclaration(ConstructorDeclaration node) => new ConstructorDeclaration(cloneNode(node.documentationComment), cloneNodeList(node.metadata), node.externalKeyword, node.constKeyword, node.factoryKeyword, cloneNode(node.returnType), node.period, cloneNode(node.name), cloneNode(node.parameters), node.separator, cloneNodeList(node.initializers), cloneNode(node.redirectedConstructor), cloneNode(node.body));
+  ConstructorDeclaration visitConstructorDeclaration(ConstructorDeclaration node)
+      => new ConstructorDeclaration(
+          cloneNode(node.documentationComment),
+          cloneNodeList(node.metadata),
+          cloneToken(node.externalKeyword),
+          cloneToken(node.constKeyword),
+          cloneToken(node.factoryKeyword),
+          cloneNode(node.returnType),
+          cloneToken(node.period),
+          cloneNode(node.name),
+          cloneNode(node.parameters),
+          cloneToken(node.separator),
+          cloneNodeList(node.initializers),
+          cloneNode(node.redirectedConstructor),
+          cloneNode(node.body));
 
   @override
-  ConstructorFieldInitializer visitConstructorFieldInitializer(ConstructorFieldInitializer node) => new ConstructorFieldInitializer(node.keyword, node.period, cloneNode(node.fieldName), node.equals, cloneNode(node.expression));
+  ConstructorFieldInitializer visitConstructorFieldInitializer(ConstructorFieldInitializer node)
+      => new ConstructorFieldInitializer(
+          cloneToken(node.keyword),
+          cloneToken(node.period),
+          cloneNode(node.fieldName),
+          cloneToken(node.equals),
+          cloneNode(node.expression));
 
   @override
-  ConstructorName visitConstructorName(ConstructorName node) => new ConstructorName(cloneNode(node.type), node.period, cloneNode(node.name));
+  ConstructorName visitConstructorName(ConstructorName node)
+      => new ConstructorName(
+          cloneNode(node.type),
+          cloneToken(node.period),
+          cloneNode(node.name));
 
   @override
-  ContinueStatement visitContinueStatement(ContinueStatement node) => new ContinueStatement(node.keyword, cloneNode(node.label), node.semicolon);
+  ContinueStatement visitContinueStatement(ContinueStatement node)
+      => new ContinueStatement(
+          cloneToken(node.keyword),
+          cloneNode(node.label),
+          cloneToken(node.semicolon));
 
   @override
-  DeclaredIdentifier visitDeclaredIdentifier(DeclaredIdentifier node) => new DeclaredIdentifier(cloneNode(node.documentationComment), cloneNodeList(node.metadata), node.keyword, cloneNode(node.type), cloneNode(node.identifier));
+  DeclaredIdentifier visitDeclaredIdentifier(DeclaredIdentifier node)
+      => new DeclaredIdentifier(
+          cloneNode(node.documentationComment),
+          cloneNodeList(node.metadata),
+          cloneToken(node.keyword),
+          cloneNode(node.type),
+          cloneNode(node.identifier));
 
   @override
-  DefaultFormalParameter visitDefaultFormalParameter(DefaultFormalParameter node) => new DefaultFormalParameter(cloneNode(node.parameter), node.kind, node.separator, cloneNode(node.defaultValue));
+  DefaultFormalParameter visitDefaultFormalParameter(DefaultFormalParameter node)
+      => new DefaultFormalParameter(
+          cloneNode(node.parameter),
+          node.kind,
+          cloneToken(node.separator),
+          cloneNode(node.defaultValue));
 
   @override
-  DoStatement visitDoStatement(DoStatement node) => new DoStatement(node.doKeyword, cloneNode(node.body), node.whileKeyword, node.leftParenthesis, cloneNode(node.condition), node.rightParenthesis, node.semicolon);
+  DoStatement visitDoStatement(DoStatement node)
+      => new DoStatement(
+          cloneToken(node.doKeyword),
+          cloneNode(node.body),
+          cloneToken(node.whileKeyword),
+          cloneToken(node.leftParenthesis),
+          cloneNode(node.condition),
+          cloneToken(node.rightParenthesis),
+          cloneToken(node.semicolon));
 
   @override
-  DoubleLiteral visitDoubleLiteral(DoubleLiteral node) => new DoubleLiteral(node.literal, node.value);
+  DoubleLiteral visitDoubleLiteral(DoubleLiteral node)
+      => new DoubleLiteral(cloneToken(node.literal), node.value);
 
   @override
-  EmptyFunctionBody visitEmptyFunctionBody(EmptyFunctionBody node) => new EmptyFunctionBody(node.semicolon);
+  EmptyFunctionBody visitEmptyFunctionBody(EmptyFunctionBody node)
+      => new EmptyFunctionBody(cloneToken(node.semicolon));
 
   @override
-  EmptyStatement visitEmptyStatement(EmptyStatement node) => new EmptyStatement(node.semicolon);
+  EmptyStatement visitEmptyStatement(EmptyStatement node)
+      => new EmptyStatement(cloneToken(node.semicolon));
 
   @override
-  AstNode visitEnumConstantDeclaration(EnumConstantDeclaration node) => new EnumConstantDeclaration(cloneNode(node.documentationComment), cloneNodeList(node.metadata), cloneNode(node.name));
+  AstNode visitEnumConstantDeclaration(EnumConstantDeclaration node)
+      => new EnumConstantDeclaration(
+          cloneNode(node.documentationComment),
+          cloneNodeList(node.metadata),
+          cloneNode(node.name));
 
   @override
-  EnumDeclaration visitEnumDeclaration(EnumDeclaration node) => new EnumDeclaration(cloneNode(node.documentationComment), cloneNodeList(node.metadata), node.keyword, cloneNode(node.name), node.leftBracket, cloneNodeList(node.constants), node.rightBracket);
+  EnumDeclaration visitEnumDeclaration(EnumDeclaration node)
+      => new EnumDeclaration(
+          cloneNode(node.documentationComment),
+          cloneNodeList(node.metadata),
+          cloneToken(node.keyword),
+          cloneNode(node.name),
+          cloneToken(node.leftBracket),
+          cloneNodeList(node.constants),
+          cloneToken(node.rightBracket));
 
   @override
   ExportDirective visitExportDirective(ExportDirective node) {
-    ExportDirective directive = new ExportDirective(cloneNode(node.documentationComment), cloneNodeList(node.metadata), node.keyword, cloneNode(node.uri), cloneNodeList(node.combinators), node.semicolon);
+    ExportDirective directive = new ExportDirective(
+        cloneNode(node.documentationComment),
+        cloneNodeList(node.metadata),
+        cloneToken(node.keyword),
+        cloneNode(node.uri),
+        cloneNodeList(node.combinators),
+        cloneToken(node.semicolon));
     directive.source = node.source;
     directive.uriContent = node.uriContent;
     return directive;
   }
 
   @override
-  ExpressionFunctionBody visitExpressionFunctionBody(ExpressionFunctionBody node) => new ExpressionFunctionBody(node.keyword, node.functionDefinition, cloneNode(node.expression), node.semicolon);
+  ExpressionFunctionBody visitExpressionFunctionBody(ExpressionFunctionBody node)
+      => new ExpressionFunctionBody(
+          cloneToken(node.keyword),
+          cloneToken(node.functionDefinition),
+          cloneNode(node.expression),
+          cloneToken(node.semicolon));
 
   @override
-  ExpressionStatement visitExpressionStatement(ExpressionStatement node) => new ExpressionStatement(cloneNode(node.expression), node.semicolon);
+  ExpressionStatement visitExpressionStatement(ExpressionStatement node)
+      => new ExpressionStatement(
+          cloneNode(node.expression),
+          cloneToken(node.semicolon));
 
   @override
-  ExtendsClause visitExtendsClause(ExtendsClause node) => new ExtendsClause(node.keyword, cloneNode(node.superclass));
+  ExtendsClause visitExtendsClause(ExtendsClause node)
+      => new ExtendsClause(
+          cloneToken(node.keyword),
+          cloneNode(node.superclass));
 
   @override
-  FieldDeclaration visitFieldDeclaration(FieldDeclaration node) => new FieldDeclaration(cloneNode(node.documentationComment), cloneNodeList(node.metadata), node.staticKeyword, cloneNode(node.fields), node.semicolon);
+  FieldDeclaration visitFieldDeclaration(FieldDeclaration node)
+      => new FieldDeclaration(
+          cloneNode(node.documentationComment),
+          cloneNodeList(node.metadata),
+          cloneToken(node.staticKeyword),
+          cloneNode(node.fields),
+          cloneToken(node.semicolon));
 
   @override
-  FieldFormalParameter visitFieldFormalParameter(FieldFormalParameter node) => new FieldFormalParameter(cloneNode(node.documentationComment), cloneNodeList(node.metadata), node.keyword, cloneNode(node.type), node.thisToken, node.period, cloneNode(node.identifier), cloneNode(node.parameters));
+  FieldFormalParameter visitFieldFormalParameter(FieldFormalParameter node)
+      => new FieldFormalParameter(
+          cloneNode(node.documentationComment),
+          cloneNodeList(node.metadata),
+          cloneToken(node.keyword),
+          cloneNode(node.type),
+          cloneToken(node.thisToken),
+          cloneToken(node.period),
+          cloneNode(node.identifier),
+          cloneNode(node.parameters));
 
   @override
   ForEachStatement visitForEachStatement(ForEachStatement node) {
     DeclaredIdentifier loopVariable = node.loopVariable;
     if (loopVariable == null) {
-      return new ForEachStatement.con2(node.awaitKeyword, node.forKeyword, node.leftParenthesis, cloneNode(node.identifier), node.inKeyword, cloneNode(node.iterator), node.rightParenthesis, cloneNode(node.body));
+      return new ForEachStatement.con2(
+          cloneToken(node.awaitKeyword),
+          cloneToken(node.forKeyword),
+          cloneToken(node.leftParenthesis),
+          cloneNode(node.identifier),
+          cloneToken(node.inKeyword),
+          cloneNode(node.iterator),
+          cloneToken(node.rightParenthesis),
+          cloneNode(node.body));
     }
-    return new ForEachStatement.con1(node.awaitKeyword, node.forKeyword, node.leftParenthesis, cloneNode(loopVariable), node.inKeyword, cloneNode(node.iterator), node.rightParenthesis, cloneNode(node.body));
+    return new ForEachStatement.con1(
+        cloneToken(node.awaitKeyword),
+        cloneToken(node.forKeyword),
+        cloneToken(node.leftParenthesis),
+        cloneNode(loopVariable),
+        cloneToken(node.inKeyword),
+        cloneNode(node.iterator),
+        cloneToken(node.rightParenthesis),
+        cloneNode(node.body));
   }
 
   @override
-  FormalParameterList visitFormalParameterList(FormalParameterList node) => new FormalParameterList(node.leftParenthesis, cloneNodeList(node.parameters), node.leftDelimiter, node.rightDelimiter, node.rightParenthesis);
+  FormalParameterList visitFormalParameterList(FormalParameterList node)
+      => new FormalParameterList(
+          cloneToken(node.leftParenthesis),
+          cloneNodeList(node.parameters),
+          cloneToken(node.leftDelimiter),
+          cloneToken(node.rightDelimiter),
+          cloneToken(node.rightParenthesis));
 
   @override
-  ForStatement visitForStatement(ForStatement node) => new ForStatement(node.forKeyword, node.leftParenthesis, cloneNode(node.variables), cloneNode(node.initialization), node.leftSeparator, cloneNode(node.condition), node.rightSeparator, cloneNodeList(node.updaters), node.rightParenthesis, cloneNode(node.body));
+  ForStatement visitForStatement(ForStatement node)
+      => new ForStatement(
+          cloneToken(node.forKeyword),
+          cloneToken(node.leftParenthesis),
+          cloneNode(node.variables),
+          cloneNode(node.initialization),
+          cloneToken(node.leftSeparator),
+          cloneNode(node.condition),
+          cloneToken(node.rightSeparator),
+          cloneNodeList(node.updaters),
+          cloneToken(node.rightParenthesis),
+          cloneNode(node.body));
 
   @override
-  FunctionDeclaration visitFunctionDeclaration(FunctionDeclaration node) => new FunctionDeclaration(cloneNode(node.documentationComment), cloneNodeList(node.metadata), node.externalKeyword, cloneNode(node.returnType), node.propertyKeyword, cloneNode(node.name), cloneNode(node.functionExpression));
+  FunctionDeclaration visitFunctionDeclaration(FunctionDeclaration node)
+      => new FunctionDeclaration(
+          cloneNode(node.documentationComment),
+          cloneNodeList(node.metadata),
+          cloneToken(node.externalKeyword),
+          cloneNode(node.returnType),
+          cloneToken(node.propertyKeyword),
+          cloneNode(node.name),
+          cloneNode(node.functionExpression));
 
   @override
-  FunctionDeclarationStatement visitFunctionDeclarationStatement(FunctionDeclarationStatement node) => new FunctionDeclarationStatement(cloneNode(node.functionDeclaration));
+  FunctionDeclarationStatement visitFunctionDeclarationStatement(FunctionDeclarationStatement node)
+      => new FunctionDeclarationStatement(cloneNode(node.functionDeclaration));
 
   @override
-  FunctionExpression visitFunctionExpression(FunctionExpression node) => new FunctionExpression(cloneNode(node.parameters), cloneNode(node.body));
+  FunctionExpression visitFunctionExpression(FunctionExpression node)
+      => new FunctionExpression(
+          cloneNode(node.parameters),
+          cloneNode(node.body));
 
   @override
-  FunctionExpressionInvocation visitFunctionExpressionInvocation(FunctionExpressionInvocation node) => new FunctionExpressionInvocation(cloneNode(node.function), cloneNode(node.argumentList));
+  FunctionExpressionInvocation visitFunctionExpressionInvocation(FunctionExpressionInvocation node)
+      => new FunctionExpressionInvocation(
+          cloneNode(node.function),
+          cloneNode(node.argumentList));
 
   @override
-  FunctionTypeAlias visitFunctionTypeAlias(FunctionTypeAlias node) => new FunctionTypeAlias(cloneNode(node.documentationComment), cloneNodeList(node.metadata), node.keyword, cloneNode(node.returnType), cloneNode(node.name), cloneNode(node.typeParameters), cloneNode(node.parameters), node.semicolon);
+  FunctionTypeAlias visitFunctionTypeAlias(FunctionTypeAlias node)
+      => new FunctionTypeAlias(
+          cloneNode(node.documentationComment),
+          cloneNodeList(node.metadata),
+          cloneToken(node.keyword),
+          cloneNode(node.returnType),
+          cloneNode(node.name),
+          cloneNode(node.typeParameters),
+          cloneNode(node.parameters),
+          cloneToken(node.semicolon));
 
   @override
-  FunctionTypedFormalParameter visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) => new FunctionTypedFormalParameter(cloneNode(node.documentationComment), cloneNodeList(node.metadata), cloneNode(node.returnType), cloneNode(node.identifier), cloneNode(node.parameters));
+  FunctionTypedFormalParameter visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node)
+      => new FunctionTypedFormalParameter(
+          cloneNode(node.documentationComment),
+          cloneNodeList(node.metadata),
+          cloneNode(node.returnType),
+          cloneNode(node.identifier),
+          cloneNode(node.parameters));
 
   @override
-  HideCombinator visitHideCombinator(HideCombinator node) => new HideCombinator(node.keyword, cloneNodeList(node.hiddenNames));
+  HideCombinator visitHideCombinator(HideCombinator node)
+      => new HideCombinator(
+          cloneToken(node.keyword),
+          cloneNodeList(node.hiddenNames));
 
   @override
-  IfStatement visitIfStatement(IfStatement node) => new IfStatement(node.ifKeyword, node.leftParenthesis, cloneNode(node.condition), node.rightParenthesis, cloneNode(node.thenStatement), node.elseKeyword, cloneNode(node.elseStatement));
+  IfStatement visitIfStatement(IfStatement node)
+      => new IfStatement(
+          cloneToken(node.ifKeyword),
+          cloneToken(node.leftParenthesis),
+          cloneNode(node.condition),
+          cloneToken(node.rightParenthesis),
+          cloneNode(node.thenStatement),
+          cloneToken(node.elseKeyword),
+          cloneNode(node.elseStatement));
 
   @override
-  ImplementsClause visitImplementsClause(ImplementsClause node) => new ImplementsClause(node.keyword, cloneNodeList(node.interfaces));
+  ImplementsClause visitImplementsClause(ImplementsClause node)
+      => new ImplementsClause(
+          cloneToken(node.keyword),
+          cloneNodeList(node.interfaces));
 
   @override
   ImportDirective visitImportDirective(ImportDirective node) {
-    ImportDirective directive = new ImportDirective(cloneNode(node.documentationComment), cloneNodeList(node.metadata), node.keyword, cloneNode(node.uri), node.deferredToken, node.asToken, cloneNode(node.prefix), cloneNodeList(node.combinators), node.semicolon);
+    ImportDirective directive = new ImportDirective(
+        cloneNode(node.documentationComment),
+        cloneNodeList(node.metadata),
+        cloneToken(node.keyword),
+        cloneNode(node.uri),
+        cloneToken(node.deferredToken),
+        cloneToken(node.asToken),
+        cloneNode(node.prefix),
+        cloneNodeList(node.combinators),
+        cloneToken(node.semicolon));
     directive.source = node.source;
     directive.uriContent = node.uriContent;
     return directive;
@@ -1197,202 +1520,404 @@
   IndexExpression visitIndexExpression(IndexExpression node) {
     Token period = node.period;
     if (period == null) {
-      return new IndexExpression.forTarget(cloneNode(node.target), node.leftBracket, cloneNode(node.index), node.rightBracket);
+      return new IndexExpression.forTarget(
+          cloneNode(node.target),
+          cloneToken(node.leftBracket),
+          cloneNode(node.index),
+          cloneToken(node.rightBracket));
     } else {
-      return new IndexExpression.forCascade(period, node.leftBracket, cloneNode(node.index), node.rightBracket);
+      return new IndexExpression.forCascade(
+          cloneToken(period),
+          cloneToken(node.leftBracket),
+          cloneNode(node.index),
+          cloneToken(node.rightBracket));
     }
   }
 
   @override
-  InstanceCreationExpression visitInstanceCreationExpression(InstanceCreationExpression node) => new InstanceCreationExpression(node.keyword, cloneNode(node.constructorName), cloneNode(node.argumentList));
+  InstanceCreationExpression visitInstanceCreationExpression(InstanceCreationExpression node)
+      => new InstanceCreationExpression(
+          cloneToken(node.keyword),
+          cloneNode(node.constructorName),
+          cloneNode(node.argumentList));
 
   @override
-  IntegerLiteral visitIntegerLiteral(IntegerLiteral node) => new IntegerLiteral(node.literal, node.value);
+  IntegerLiteral visitIntegerLiteral(IntegerLiteral node)
+      => new IntegerLiteral(cloneToken(node.literal), node.value);
 
   @override
-  InterpolationExpression visitInterpolationExpression(InterpolationExpression node) => new InterpolationExpression(node.leftBracket, cloneNode(node.expression), node.rightBracket);
+  InterpolationExpression visitInterpolationExpression(InterpolationExpression node)
+      => new InterpolationExpression(
+          cloneToken(node.leftBracket),
+          cloneNode(node.expression),
+          cloneToken(node.rightBracket));
 
   @override
-  InterpolationString visitInterpolationString(InterpolationString node) => new InterpolationString(node.contents, node.value);
+  InterpolationString visitInterpolationString(InterpolationString node)
+      => new InterpolationString(cloneToken(node.contents), node.value);
 
   @override
-  IsExpression visitIsExpression(IsExpression node) => new IsExpression(cloneNode(node.expression), node.isOperator, node.notOperator, cloneNode(node.type));
+  IsExpression visitIsExpression(IsExpression node)
+      => new IsExpression(
+          cloneNode(node.expression),
+          cloneToken(node.isOperator),
+          cloneToken(node.notOperator),
+          cloneNode(node.type));
 
   @override
-  Label visitLabel(Label node) => new Label(cloneNode(node.label), node.colon);
+  Label visitLabel(Label node)
+      => new Label(cloneNode(node.label), cloneToken(node.colon));
 
   @override
-  LabeledStatement visitLabeledStatement(LabeledStatement node) => new LabeledStatement(cloneNodeList(node.labels), cloneNode(node.statement));
+  LabeledStatement visitLabeledStatement(LabeledStatement node)
+      => new LabeledStatement(
+          cloneNodeList(node.labels),
+          cloneNode(node.statement));
 
   @override
-  LibraryDirective visitLibraryDirective(LibraryDirective node) => new LibraryDirective(cloneNode(node.documentationComment), cloneNodeList(node.metadata), node.libraryToken, cloneNode(node.name), node.semicolon);
+  LibraryDirective visitLibraryDirective(LibraryDirective node)
+      => new LibraryDirective(
+          cloneNode(node.documentationComment),
+          cloneNodeList(node.metadata),
+          cloneToken(node.libraryToken),
+          cloneNode(node.name),
+          cloneToken(node.semicolon));
 
   @override
-  LibraryIdentifier visitLibraryIdentifier(LibraryIdentifier node) => new LibraryIdentifier(cloneNodeList(node.components));
+  LibraryIdentifier visitLibraryIdentifier(LibraryIdentifier node)
+      => new LibraryIdentifier(cloneNodeList(node.components));
 
   @override
-  ListLiteral visitListLiteral(ListLiteral node) => new ListLiteral(node.constKeyword, cloneNode(node.typeArguments), node.leftBracket, cloneNodeList(node.elements), node.rightBracket);
+  ListLiteral visitListLiteral(ListLiteral node)
+      => new ListLiteral(
+          cloneToken(node.constKeyword),
+          cloneNode(node.typeArguments),
+          cloneToken(node.leftBracket),
+          cloneNodeList(node.elements),
+          cloneToken(node.rightBracket));
 
   @override
-  MapLiteral visitMapLiteral(MapLiteral node) => new MapLiteral(node.constKeyword, cloneNode(node.typeArguments), node.leftBracket, cloneNodeList(node.entries), node.rightBracket);
+  MapLiteral visitMapLiteral(MapLiteral node)
+      => new MapLiteral(
+          cloneToken(node.constKeyword),
+          cloneNode(node.typeArguments),
+          cloneToken(node.leftBracket),
+          cloneNodeList(node.entries),
+          cloneToken(node.rightBracket));
 
   @override
-  MapLiteralEntry visitMapLiteralEntry(MapLiteralEntry node) => new MapLiteralEntry(cloneNode(node.key), node.separator, cloneNode(node.value));
+  MapLiteralEntry visitMapLiteralEntry(MapLiteralEntry node)
+      => new MapLiteralEntry(
+          cloneNode(node.key),
+          cloneToken(node.separator),
+          cloneNode(node.value));
 
   @override
-  MethodDeclaration visitMethodDeclaration(MethodDeclaration node) => new MethodDeclaration(cloneNode(node.documentationComment), cloneNodeList(node.metadata), node.externalKeyword, node.modifierKeyword, cloneNode(node.returnType), node.propertyKeyword, node.operatorKeyword, cloneNode(node.name), cloneNode(node.parameters), cloneNode(node.body));
+  MethodDeclaration visitMethodDeclaration(MethodDeclaration node)
+      => new MethodDeclaration(
+          cloneNode(node.documentationComment),
+          cloneNodeList(node.metadata),
+          cloneToken(node.externalKeyword),
+          cloneToken(node.modifierKeyword),
+          cloneNode(node.returnType),
+          cloneToken(node.propertyKeyword),
+          cloneToken(node.operatorKeyword),
+          cloneNode(node.name),
+          cloneNode(node.parameters),
+          cloneNode(node.body));
 
   @override
-  MethodInvocation visitMethodInvocation(MethodInvocation node) => new MethodInvocation(cloneNode(node.target), node.period, cloneNode(node.methodName), cloneNode(node.argumentList));
+  MethodInvocation visitMethodInvocation(MethodInvocation node)
+      => new MethodInvocation(
+          cloneNode(node.target),
+          cloneToken(node.period),
+          cloneNode(node.methodName),
+          cloneNode(node.argumentList));
 
   @override
-  NamedExpression visitNamedExpression(NamedExpression node) => new NamedExpression(cloneNode(node.name), cloneNode(node.expression));
+  NamedExpression visitNamedExpression(NamedExpression node)
+      => new NamedExpression(cloneNode(node.name), cloneNode(node.expression));
 
   @override
-  AstNode visitNativeClause(NativeClause node) => new NativeClause(node.keyword, cloneNode(node.name));
+  AstNode visitNativeClause(NativeClause node)
+      => new NativeClause(cloneToken(node.keyword), cloneNode(node.name));
 
   @override
-  NativeFunctionBody visitNativeFunctionBody(NativeFunctionBody node) => new NativeFunctionBody(node.nativeToken, cloneNode(node.stringLiteral), node.semicolon);
+  NativeFunctionBody visitNativeFunctionBody(NativeFunctionBody node)
+      => new NativeFunctionBody(
+          cloneToken(node.nativeToken),
+          cloneNode(node.stringLiteral),
+          cloneToken(node.semicolon));
 
   @override
-  NullLiteral visitNullLiteral(NullLiteral node) => new NullLiteral(node.literal);
+  NullLiteral visitNullLiteral(NullLiteral node)
+      => new NullLiteral(cloneToken(node.literal));
 
   @override
-  ParenthesizedExpression visitParenthesizedExpression(ParenthesizedExpression node) => new ParenthesizedExpression(node.leftParenthesis, cloneNode(node.expression), node.rightParenthesis);
+  ParenthesizedExpression visitParenthesizedExpression(ParenthesizedExpression node)
+      => new ParenthesizedExpression(
+          cloneToken(node.leftParenthesis),
+          cloneNode(node.expression),
+          cloneToken(node.rightParenthesis));
 
   @override
   PartDirective visitPartDirective(PartDirective node) {
-    PartDirective directive = new PartDirective(cloneNode(node.documentationComment), cloneNodeList(node.metadata), node.partToken, cloneNode(node.uri), node.semicolon);
+    PartDirective directive = new PartDirective(
+        cloneNode(node.documentationComment),
+        cloneNodeList(node.metadata),
+        cloneToken(node.partToken),
+        cloneNode(node.uri),
+        cloneToken(node.semicolon));
     directive.source = node.source;
     directive.uriContent = node.uriContent;
     return directive;
   }
 
   @override
-  PartOfDirective visitPartOfDirective(PartOfDirective node) => new PartOfDirective(cloneNode(node.documentationComment), cloneNodeList(node.metadata), node.partToken, node.ofToken, cloneNode(node.libraryName), node.semicolon);
+  PartOfDirective visitPartOfDirective(PartOfDirective node)
+      => new PartOfDirective(
+          cloneNode(node.documentationComment),
+          cloneNodeList(node.metadata),
+          cloneToken(node.partToken),
+          cloneToken(node.ofToken),
+          cloneNode(node.libraryName),
+          cloneToken(node.semicolon));
 
   @override
-  PostfixExpression visitPostfixExpression(PostfixExpression node) => new PostfixExpression(cloneNode(node.operand), node.operator);
+  PostfixExpression visitPostfixExpression(PostfixExpression node)
+      => new PostfixExpression(
+          cloneNode(node.operand),
+          cloneToken(node.operator));
 
   @override
-  PrefixedIdentifier visitPrefixedIdentifier(PrefixedIdentifier node) => new PrefixedIdentifier(cloneNode(node.prefix), node.period, cloneNode(node.identifier));
+  PrefixedIdentifier visitPrefixedIdentifier(PrefixedIdentifier node)
+      => new PrefixedIdentifier(
+          cloneNode(node.prefix),
+          cloneToken(node.period),
+          cloneNode(node.identifier));
 
   @override
-  PrefixExpression visitPrefixExpression(PrefixExpression node) => new PrefixExpression(node.operator, cloneNode(node.operand));
+  PrefixExpression visitPrefixExpression(PrefixExpression node)
+      => new PrefixExpression(
+          cloneToken(node.operator),
+          cloneNode(node.operand));
 
   @override
-  PropertyAccess visitPropertyAccess(PropertyAccess node) => new PropertyAccess(cloneNode(node.target), node.operator, cloneNode(node.propertyName));
+  PropertyAccess visitPropertyAccess(PropertyAccess node)
+      => new PropertyAccess(
+          cloneNode(node.target),
+          cloneToken(node.operator),
+          cloneNode(node.propertyName));
 
   @override
-  RedirectingConstructorInvocation visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) => new RedirectingConstructorInvocation(node.keyword, node.period, cloneNode(node.constructorName), cloneNode(node.argumentList));
+  RedirectingConstructorInvocation visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node)
+      => new RedirectingConstructorInvocation(
+          cloneToken(node.keyword),
+          cloneToken(node.period),
+          cloneNode(node.constructorName),
+          cloneNode(node.argumentList));
 
   @override
-  RethrowExpression visitRethrowExpression(RethrowExpression node) => new RethrowExpression(node.keyword);
+  RethrowExpression visitRethrowExpression(RethrowExpression node)
+      => new RethrowExpression(cloneToken(node.keyword));
 
   @override
-  ReturnStatement visitReturnStatement(ReturnStatement node) => new ReturnStatement(node.keyword, cloneNode(node.expression), node.semicolon);
+  ReturnStatement visitReturnStatement(ReturnStatement node)
+      => new ReturnStatement(
+          cloneToken(node.keyword),
+          cloneNode(node.expression),
+          cloneToken(node.semicolon));
 
   @override
-  ScriptTag visitScriptTag(ScriptTag node) => new ScriptTag(node.scriptTag);
+  ScriptTag visitScriptTag(ScriptTag node)
+      => new ScriptTag(cloneToken(node.scriptTag));
 
   @override
-  ShowCombinator visitShowCombinator(ShowCombinator node) => new ShowCombinator(node.keyword, cloneNodeList(node.shownNames));
+  ShowCombinator visitShowCombinator(ShowCombinator node)
+      => new ShowCombinator(
+          cloneToken(node.keyword),
+          cloneNodeList(node.shownNames));
 
   @override
-  SimpleFormalParameter visitSimpleFormalParameter(SimpleFormalParameter node) => new SimpleFormalParameter(cloneNode(node.documentationComment), cloneNodeList(node.metadata), node.keyword, cloneNode(node.type), cloneNode(node.identifier));
+  SimpleFormalParameter visitSimpleFormalParameter(SimpleFormalParameter node)
+      => new SimpleFormalParameter(
+          cloneNode(node.documentationComment),
+          cloneNodeList(node.metadata),
+          cloneToken(node.keyword),
+          cloneNode(node.type),
+          cloneNode(node.identifier));
 
   @override
-  SimpleIdentifier visitSimpleIdentifier(SimpleIdentifier node) => new SimpleIdentifier(node.token);
+  SimpleIdentifier visitSimpleIdentifier(SimpleIdentifier node)
+      => new SimpleIdentifier(cloneToken(node.token));
 
   @override
-  SimpleStringLiteral visitSimpleStringLiteral(SimpleStringLiteral node) => new SimpleStringLiteral(node.literal, node.value);
+  SimpleStringLiteral visitSimpleStringLiteral(SimpleStringLiteral node)
+      => new SimpleStringLiteral(cloneToken(node.literal), node.value);
 
   @override
-  StringInterpolation visitStringInterpolation(StringInterpolation node) => new StringInterpolation(cloneNodeList(node.elements));
+  StringInterpolation visitStringInterpolation(StringInterpolation node)
+      => new StringInterpolation(cloneNodeList(node.elements));
 
   @override
-  SuperConstructorInvocation visitSuperConstructorInvocation(SuperConstructorInvocation node) => new SuperConstructorInvocation(node.keyword, node.period, cloneNode(node.constructorName), cloneNode(node.argumentList));
+  SuperConstructorInvocation visitSuperConstructorInvocation(SuperConstructorInvocation node)
+      => new SuperConstructorInvocation(
+          cloneToken(node.keyword),
+          cloneToken(node.period),
+          cloneNode(node.constructorName),
+          cloneNode(node.argumentList));
 
   @override
-  SuperExpression visitSuperExpression(SuperExpression node) => new SuperExpression(node.keyword);
+  SuperExpression visitSuperExpression(SuperExpression node)
+      => new SuperExpression(cloneToken(node.keyword));
 
   @override
-  SwitchCase visitSwitchCase(SwitchCase node) => new SwitchCase(cloneNodeList(node.labels), node.keyword, cloneNode(node.expression), node.colon, cloneNodeList(node.statements));
+  SwitchCase visitSwitchCase(SwitchCase node)
+      => new SwitchCase(
+          cloneNodeList(node.labels),
+          cloneToken(node.keyword),
+          cloneNode(node.expression),
+          cloneToken(node.colon),
+          cloneNodeList(node.statements));
 
   @override
-  SwitchDefault visitSwitchDefault(SwitchDefault node) => new SwitchDefault(cloneNodeList(node.labels), node.keyword, node.colon, cloneNodeList(node.statements));
+  SwitchDefault visitSwitchDefault(SwitchDefault node)
+      => new SwitchDefault(
+          cloneNodeList(node.labels),
+          cloneToken(node.keyword),
+          cloneToken(node.colon),
+          cloneNodeList(node.statements));
 
   @override
-  SwitchStatement visitSwitchStatement(SwitchStatement node) => new SwitchStatement(node.keyword, node.leftParenthesis, cloneNode(node.expression), node.rightParenthesis, node.leftBracket, cloneNodeList(node.members), node.rightBracket);
+  SwitchStatement visitSwitchStatement(SwitchStatement node)
+      => new SwitchStatement(
+          cloneToken(node.keyword),
+          cloneToken(node.leftParenthesis),
+          cloneNode(node.expression),
+          cloneToken(node.rightParenthesis),
+          cloneToken(node.leftBracket),
+          cloneNodeList(node.members),
+          cloneToken(node.rightBracket));
 
   @override
-  SymbolLiteral visitSymbolLiteral(SymbolLiteral node) => new SymbolLiteral(node.poundSign, node.components);
+  SymbolLiteral visitSymbolLiteral(SymbolLiteral node)
+      => new SymbolLiteral(
+          cloneToken(node.poundSign),
+          cloneTokenList(node.components));
 
   @override
-  ThisExpression visitThisExpression(ThisExpression node) => new ThisExpression(node.keyword);
+  ThisExpression visitThisExpression(ThisExpression node)
+      => new ThisExpression(cloneToken(node.keyword));
 
   @override
-  ThrowExpression visitThrowExpression(ThrowExpression node) => new ThrowExpression(node.keyword, cloneNode(node.expression));
+  ThrowExpression visitThrowExpression(ThrowExpression node)
+      => new ThrowExpression(
+          cloneToken(node.keyword),
+          cloneNode(node.expression));
 
   @override
-  TopLevelVariableDeclaration visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) => new TopLevelVariableDeclaration(cloneNode(node.documentationComment), cloneNodeList(node.metadata), cloneNode(node.variables), node.semicolon);
+  TopLevelVariableDeclaration visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node)
+      => new TopLevelVariableDeclaration(
+          cloneNode(node.documentationComment),
+          cloneNodeList(node.metadata),
+          cloneNode(node.variables),
+          cloneToken(node.semicolon));
 
   @override
-  TryStatement visitTryStatement(TryStatement node) => new TryStatement(node.tryKeyword, cloneNode(node.body), cloneNodeList(node.catchClauses), node.finallyKeyword, cloneNode(node.finallyBlock));
+  TryStatement visitTryStatement(TryStatement node)
+      => new TryStatement(
+          cloneToken(node.tryKeyword),
+          cloneNode(node.body),
+          cloneNodeList(node.catchClauses),
+          cloneToken(node.finallyKeyword),
+          cloneNode(node.finallyBlock));
 
   @override
-  TypeArgumentList visitTypeArgumentList(TypeArgumentList node) => new TypeArgumentList(node.leftBracket, cloneNodeList(node.arguments), node.rightBracket);
+  TypeArgumentList visitTypeArgumentList(TypeArgumentList node)
+      => new TypeArgumentList(
+          cloneToken(node.leftBracket),
+          cloneNodeList(node.arguments),
+          cloneToken(node.rightBracket));
 
   @override
-  TypeName visitTypeName(TypeName node) => new TypeName(cloneNode(node.name), cloneNode(node.typeArguments));
+  TypeName visitTypeName(TypeName node)
+      => new TypeName(cloneNode(node.name), cloneNode(node.typeArguments));
 
   @override
-  TypeParameter visitTypeParameter(TypeParameter node) => new TypeParameter(cloneNode(node.documentationComment), cloneNodeList(node.metadata), cloneNode(node.name), node.keyword, cloneNode(node.bound));
+  TypeParameter visitTypeParameter(TypeParameter node)
+      => new TypeParameter(
+          cloneNode(node.documentationComment),
+          cloneNodeList(node.metadata),
+          cloneNode(node.name),
+          cloneToken(node.keyword),
+          cloneNode(node.bound));
 
   @override
-  TypeParameterList visitTypeParameterList(TypeParameterList node) => new TypeParameterList(node.leftBracket, cloneNodeList(node.typeParameters), node.rightBracket);
+  TypeParameterList visitTypeParameterList(TypeParameterList node)
+      => new TypeParameterList(
+          cloneToken(node.leftBracket),
+          cloneNodeList(node.typeParameters),
+          cloneToken(node.rightBracket));
 
   @override
-  VariableDeclaration visitVariableDeclaration(VariableDeclaration node) => new VariableDeclaration(null, cloneNodeList(node.metadata), cloneNode(node.name), node.equals, cloneNode(node.initializer));
+  VariableDeclaration visitVariableDeclaration(VariableDeclaration node)
+      => new VariableDeclaration(
+          null,
+          cloneNodeList(node.metadata),
+          cloneNode(node.name),
+          cloneToken(node.equals),
+          cloneNode(node.initializer));
 
   @override
-  VariableDeclarationList visitVariableDeclarationList(VariableDeclarationList node) => new VariableDeclarationList(null, cloneNodeList(node.metadata), node.keyword, cloneNode(node.type), cloneNodeList(node.variables));
+  VariableDeclarationList visitVariableDeclarationList(VariableDeclarationList node)
+      => new VariableDeclarationList(
+          null,
+          cloneNodeList(node.metadata),
+          cloneToken(node.keyword),
+          cloneNode(node.type),
+          cloneNodeList(node.variables));
 
   @override
-  VariableDeclarationStatement visitVariableDeclarationStatement(VariableDeclarationStatement node) => new VariableDeclarationStatement(cloneNode(node.variables), node.semicolon);
+  VariableDeclarationStatement visitVariableDeclarationStatement(VariableDeclarationStatement node)
+      => new VariableDeclarationStatement(
+          cloneNode(node.variables),
+          cloneToken(node.semicolon));
 
   @override
-  WhileStatement visitWhileStatement(WhileStatement node) => new WhileStatement(node.keyword, node.leftParenthesis, cloneNode(node.condition), node.rightParenthesis, cloneNode(node.body));
+  WhileStatement visitWhileStatement(WhileStatement node)
+      => new WhileStatement(
+          cloneToken(node.keyword),
+          cloneToken(node.leftParenthesis),
+          cloneNode(node.condition),
+          cloneToken(node.rightParenthesis),
+          cloneNode(node.body));
 
   @override
-  WithClause visitWithClause(WithClause node) => new WithClause(node.withKeyword, cloneNodeList(node.mixinTypes));
+  WithClause visitWithClause(WithClause node)
+      => new WithClause(
+          cloneToken(node.withKeyword),
+          cloneNodeList(node.mixinTypes));
 
   @override
-  YieldStatement visitYieldStatement(YieldStatement node) => new YieldStatement(node.yieldKeyword, node.star, node.expression, node.semicolon);
-
-  AstNode cloneNode(AstNode node) {
-    if (node == null) {
-      return null;
-    }
-    return node.accept(this) as AstNode;
-  }
+  YieldStatement visitYieldStatement(YieldStatement node)
+      => new YieldStatement(
+          cloneToken(node.yieldKeyword),
+          cloneToken(node.star),
+          cloneNode(node.expression),
+          cloneToken(node.semicolon));
 }
 
 /**
- * Instances of the class `AstComparator` compare the structure of two ASTNodes to see whether
+ * An `AstComparator` compares the structure of two AstNodes to see whether
  * they are equal.
  */
 class AstComparator implements AstVisitor<bool> {
   /**
-   * Return `true` if the two AST nodes are equal.
-   *
-   * @param first the first node being compared
-   * @param second the second node being compared
-   * @return `true` if the two AST nodes are equal
+   * Return `true` if the [first] node and the [second] node are equal.
    */
   static bool equalNodes(AstNode first, AstNode second) {
     AstComparator comparator = new AstComparator();
-    return comparator._isEqualNodes(first, second);
+    return comparator.isEqualNodes(first, second);
   }
 
   /**
@@ -1410,91 +1935,91 @@
   @override
   bool visitAnnotation(Annotation node) {
     Annotation other = this._other as Annotation;
-    return _isEqualTokens(node.atSign, other.atSign) && _isEqualNodes(node.name, other.name) && _isEqualTokens(node.period, other.period) && _isEqualNodes(node.constructorName, other.constructorName) && _isEqualNodes(node.arguments, other.arguments);
+    return isEqualTokens(node.atSign, other.atSign) && isEqualNodes(node.name, other.name) && isEqualTokens(node.period, other.period) && isEqualNodes(node.constructorName, other.constructorName) && isEqualNodes(node.arguments, other.arguments);
   }
 
   @override
   bool visitArgumentList(ArgumentList node) {
     ArgumentList other = this._other as ArgumentList;
-    return _isEqualTokens(node.leftParenthesis, other.leftParenthesis) && _isEqualNodeLists(node.arguments, other.arguments) && _isEqualTokens(node.rightParenthesis, other.rightParenthesis);
+    return isEqualTokens(node.leftParenthesis, other.leftParenthesis) && _isEqualNodeLists(node.arguments, other.arguments) && isEqualTokens(node.rightParenthesis, other.rightParenthesis);
   }
 
   @override
   bool visitAsExpression(AsExpression node) {
     AsExpression other = this._other as AsExpression;
-    return _isEqualNodes(node.expression, other.expression) && _isEqualTokens(node.asOperator, other.asOperator) && _isEqualNodes(node.type, other.type);
+    return isEqualNodes(node.expression, other.expression) && isEqualTokens(node.asOperator, other.asOperator) && isEqualNodes(node.type, other.type);
   }
 
   @override
   bool visitAssertStatement(AssertStatement node) {
     AssertStatement other = this._other as AssertStatement;
-    return _isEqualTokens(node.keyword, other.keyword) && _isEqualTokens(node.leftParenthesis, other.leftParenthesis) && _isEqualNodes(node.condition, other.condition) && _isEqualTokens(node.rightParenthesis, other.rightParenthesis) && _isEqualTokens(node.semicolon, other.semicolon);
+    return isEqualTokens(node.keyword, other.keyword) && isEqualTokens(node.leftParenthesis, other.leftParenthesis) && isEqualNodes(node.condition, other.condition) && isEqualTokens(node.rightParenthesis, other.rightParenthesis) && isEqualTokens(node.semicolon, other.semicolon);
   }
 
   @override
   bool visitAssignmentExpression(AssignmentExpression node) {
     AssignmentExpression other = this._other as AssignmentExpression;
-    return _isEqualNodes(node.leftHandSide, other.leftHandSide) && _isEqualTokens(node.operator, other.operator) && _isEqualNodes(node.rightHandSide, other.rightHandSide);
+    return isEqualNodes(node.leftHandSide, other.leftHandSide) && isEqualTokens(node.operator, other.operator) && isEqualNodes(node.rightHandSide, other.rightHandSide);
   }
 
   @override
   bool visitAwaitExpression(AwaitExpression node) {
     AwaitExpression other = this._other as AwaitExpression;
-    return _isEqualTokens(node.awaitKeyword, other.awaitKeyword) && _isEqualNodes(node.expression, other.expression);
+    return isEqualTokens(node.awaitKeyword, other.awaitKeyword) && isEqualNodes(node.expression, other.expression);
   }
 
   @override
   bool visitBinaryExpression(BinaryExpression node) {
     BinaryExpression other = this._other as BinaryExpression;
-    return _isEqualNodes(node.leftOperand, other.leftOperand) && _isEqualTokens(node.operator, other.operator) && _isEqualNodes(node.rightOperand, other.rightOperand);
+    return isEqualNodes(node.leftOperand, other.leftOperand) && isEqualTokens(node.operator, other.operator) && isEqualNodes(node.rightOperand, other.rightOperand);
   }
 
   @override
   bool visitBlock(Block node) {
     Block other = this._other as Block;
-    return _isEqualTokens(node.leftBracket, other.leftBracket) && _isEqualNodeLists(node.statements, other.statements) && _isEqualTokens(node.rightBracket, other.rightBracket);
+    return isEqualTokens(node.leftBracket, other.leftBracket) && _isEqualNodeLists(node.statements, other.statements) && isEqualTokens(node.rightBracket, other.rightBracket);
   }
 
   @override
   bool visitBlockFunctionBody(BlockFunctionBody node) {
     BlockFunctionBody other = this._other as BlockFunctionBody;
-    return _isEqualNodes(node.block, other.block);
+    return isEqualNodes(node.block, other.block);
   }
 
   @override
   bool visitBooleanLiteral(BooleanLiteral node) {
     BooleanLiteral other = this._other as BooleanLiteral;
-    return _isEqualTokens(node.literal, other.literal) && node.value == other.value;
+    return isEqualTokens(node.literal, other.literal) && node.value == other.value;
   }
 
   @override
   bool visitBreakStatement(BreakStatement node) {
     BreakStatement other = this._other as BreakStatement;
-    return _isEqualTokens(node.keyword, other.keyword) && _isEqualNodes(node.label, other.label) && _isEqualTokens(node.semicolon, other.semicolon);
+    return isEqualTokens(node.keyword, other.keyword) && isEqualNodes(node.label, other.label) && isEqualTokens(node.semicolon, other.semicolon);
   }
 
   @override
   bool visitCascadeExpression(CascadeExpression node) {
     CascadeExpression other = this._other as CascadeExpression;
-    return _isEqualNodes(node.target, other.target) && _isEqualNodeLists(node.cascadeSections, other.cascadeSections);
+    return isEqualNodes(node.target, other.target) && _isEqualNodeLists(node.cascadeSections, other.cascadeSections);
   }
 
   @override
   bool visitCatchClause(CatchClause node) {
     CatchClause other = this._other as CatchClause;
-    return _isEqualTokens(node.onKeyword, other.onKeyword) && _isEqualNodes(node.exceptionType, other.exceptionType) && _isEqualTokens(node.catchKeyword, other.catchKeyword) && _isEqualTokens(node.leftParenthesis, other.leftParenthesis) && _isEqualNodes(node.exceptionParameter, other.exceptionParameter) && _isEqualTokens(node.comma, other.comma) && _isEqualNodes(node.stackTraceParameter, other.stackTraceParameter) && _isEqualTokens(node.rightParenthesis, other.rightParenthesis) && _isEqualNodes(node.body, other.body);
+    return isEqualTokens(node.onKeyword, other.onKeyword) && isEqualNodes(node.exceptionType, other.exceptionType) && isEqualTokens(node.catchKeyword, other.catchKeyword) && isEqualTokens(node.leftParenthesis, other.leftParenthesis) && isEqualNodes(node.exceptionParameter, other.exceptionParameter) && isEqualTokens(node.comma, other.comma) && isEqualNodes(node.stackTraceParameter, other.stackTraceParameter) && isEqualTokens(node.rightParenthesis, other.rightParenthesis) && isEqualNodes(node.body, other.body);
   }
 
   @override
   bool visitClassDeclaration(ClassDeclaration node) {
     ClassDeclaration other = this._other as ClassDeclaration;
-    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualTokens(node.abstractKeyword, other.abstractKeyword) && _isEqualTokens(node.classKeyword, other.classKeyword) && _isEqualNodes(node.name, other.name) && _isEqualNodes(node.typeParameters, other.typeParameters) && _isEqualNodes(node.extendsClause, other.extendsClause) && _isEqualNodes(node.withClause, other.withClause) && _isEqualNodes(node.implementsClause, other.implementsClause) && _isEqualTokens(node.leftBracket, other.leftBracket) && _isEqualNodeLists(node.members, other.members) && _isEqualTokens(node.rightBracket, other.rightBracket);
+    return isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && isEqualTokens(node.abstractKeyword, other.abstractKeyword) && isEqualTokens(node.classKeyword, other.classKeyword) && isEqualNodes(node.name, other.name) && isEqualNodes(node.typeParameters, other.typeParameters) && isEqualNodes(node.extendsClause, other.extendsClause) && isEqualNodes(node.withClause, other.withClause) && isEqualNodes(node.implementsClause, other.implementsClause) && isEqualTokens(node.leftBracket, other.leftBracket) && _isEqualNodeLists(node.members, other.members) && isEqualTokens(node.rightBracket, other.rightBracket);
   }
 
   @override
   bool visitClassTypeAlias(ClassTypeAlias node) {
     ClassTypeAlias other = this._other as ClassTypeAlias;
-    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualTokens(node.keyword, other.keyword) && _isEqualNodes(node.name, other.name) && _isEqualNodes(node.typeParameters, other.typeParameters) && _isEqualTokens(node.equals, other.equals) && _isEqualTokens(node.abstractKeyword, other.abstractKeyword) && _isEqualNodes(node.superclass, other.superclass) && _isEqualNodes(node.withClause, other.withClause) && _isEqualNodes(node.implementsClause, other.implementsClause) && _isEqualTokens(node.semicolon, other.semicolon);
+    return isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && isEqualTokens(node.keyword, other.keyword) && isEqualNodes(node.name, other.name) && isEqualNodes(node.typeParameters, other.typeParameters) && isEqualTokens(node.equals, other.equals) && isEqualTokens(node.abstractKeyword, other.abstractKeyword) && isEqualNodes(node.superclass, other.superclass) && isEqualNodes(node.withClause, other.withClause) && isEqualNodes(node.implementsClause, other.implementsClause) && isEqualTokens(node.semicolon, other.semicolon);
   }
 
   @override
@@ -1506,259 +2031,259 @@
   @override
   bool visitCommentReference(CommentReference node) {
     CommentReference other = this._other as CommentReference;
-    return _isEqualTokens(node.newKeyword, other.newKeyword) && _isEqualNodes(node.identifier, other.identifier);
+    return isEqualTokens(node.newKeyword, other.newKeyword) && isEqualNodes(node.identifier, other.identifier);
   }
 
   @override
   bool visitCompilationUnit(CompilationUnit node) {
     CompilationUnit other = this._other as CompilationUnit;
-    return _isEqualTokens(node.beginToken, other.beginToken) && _isEqualNodes(node.scriptTag, other.scriptTag) && _isEqualNodeLists(node.directives, other.directives) && _isEqualNodeLists(node.declarations, other.declarations) && _isEqualTokens(node.endToken, other.endToken);
+    return isEqualTokens(node.beginToken, other.beginToken) && isEqualNodes(node.scriptTag, other.scriptTag) && _isEqualNodeLists(node.directives, other.directives) && _isEqualNodeLists(node.declarations, other.declarations) && isEqualTokens(node.endToken, other.endToken);
   }
 
   @override
   bool visitConditionalExpression(ConditionalExpression node) {
     ConditionalExpression other = this._other as ConditionalExpression;
-    return _isEqualNodes(node.condition, other.condition) && _isEqualTokens(node.question, other.question) && _isEqualNodes(node.thenExpression, other.thenExpression) && _isEqualTokens(node.colon, other.colon) && _isEqualNodes(node.elseExpression, other.elseExpression);
+    return isEqualNodes(node.condition, other.condition) && isEqualTokens(node.question, other.question) && isEqualNodes(node.thenExpression, other.thenExpression) && isEqualTokens(node.colon, other.colon) && isEqualNodes(node.elseExpression, other.elseExpression);
   }
 
   @override
   bool visitConstructorDeclaration(ConstructorDeclaration node) {
     ConstructorDeclaration other = this._other as ConstructorDeclaration;
-    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualTokens(node.externalKeyword, other.externalKeyword) && _isEqualTokens(node.constKeyword, other.constKeyword) && _isEqualTokens(node.factoryKeyword, other.factoryKeyword) && _isEqualNodes(node.returnType, other.returnType) && _isEqualTokens(node.period, other.period) && _isEqualNodes(node.name, other.name) && _isEqualNodes(node.parameters, other.parameters) && _isEqualTokens(node.separator, other.separator) && _isEqualNodeLists(node.initializers, other.initializers) && _isEqualNodes(node.redirectedConstructor, other.redirectedConstructor) && _isEqualNodes(node.body, other.body);
+    return isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && isEqualTokens(node.externalKeyword, other.externalKeyword) && isEqualTokens(node.constKeyword, other.constKeyword) && isEqualTokens(node.factoryKeyword, other.factoryKeyword) && isEqualNodes(node.returnType, other.returnType) && isEqualTokens(node.period, other.period) && isEqualNodes(node.name, other.name) && isEqualNodes(node.parameters, other.parameters) && isEqualTokens(node.separator, other.separator) && _isEqualNodeLists(node.initializers, other.initializers) && isEqualNodes(node.redirectedConstructor, other.redirectedConstructor) && isEqualNodes(node.body, other.body);
   }
 
   @override
   bool visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
     ConstructorFieldInitializer other = this._other as ConstructorFieldInitializer;
-    return _isEqualTokens(node.keyword, other.keyword) && _isEqualTokens(node.period, other.period) && _isEqualNodes(node.fieldName, other.fieldName) && _isEqualTokens(node.equals, other.equals) && _isEqualNodes(node.expression, other.expression);
+    return isEqualTokens(node.keyword, other.keyword) && isEqualTokens(node.period, other.period) && isEqualNodes(node.fieldName, other.fieldName) && isEqualTokens(node.equals, other.equals) && isEqualNodes(node.expression, other.expression);
   }
 
   @override
   bool visitConstructorName(ConstructorName node) {
     ConstructorName other = this._other as ConstructorName;
-    return _isEqualNodes(node.type, other.type) && _isEqualTokens(node.period, other.period) && _isEqualNodes(node.name, other.name);
+    return isEqualNodes(node.type, other.type) && isEqualTokens(node.period, other.period) && isEqualNodes(node.name, other.name);
   }
 
   @override
   bool visitContinueStatement(ContinueStatement node) {
     ContinueStatement other = this._other as ContinueStatement;
-    return _isEqualTokens(node.keyword, other.keyword) && _isEqualNodes(node.label, other.label) && _isEqualTokens(node.semicolon, other.semicolon);
+    return isEqualTokens(node.keyword, other.keyword) && isEqualNodes(node.label, other.label) && isEqualTokens(node.semicolon, other.semicolon);
   }
 
   @override
   bool visitDeclaredIdentifier(DeclaredIdentifier node) {
     DeclaredIdentifier other = this._other as DeclaredIdentifier;
-    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualTokens(node.keyword, other.keyword) && _isEqualNodes(node.type, other.type) && _isEqualNodes(node.identifier, other.identifier);
+    return isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && isEqualTokens(node.keyword, other.keyword) && isEqualNodes(node.type, other.type) && isEqualNodes(node.identifier, other.identifier);
   }
 
   @override
   bool visitDefaultFormalParameter(DefaultFormalParameter node) {
     DefaultFormalParameter other = this._other as DefaultFormalParameter;
-    return _isEqualNodes(node.parameter, other.parameter) && node.kind == other.kind && _isEqualTokens(node.separator, other.separator) && _isEqualNodes(node.defaultValue, other.defaultValue);
+    return isEqualNodes(node.parameter, other.parameter) && node.kind == other.kind && isEqualTokens(node.separator, other.separator) && isEqualNodes(node.defaultValue, other.defaultValue);
   }
 
   @override
   bool visitDoStatement(DoStatement node) {
     DoStatement other = this._other as DoStatement;
-    return _isEqualTokens(node.doKeyword, other.doKeyword) && _isEqualNodes(node.body, other.body) && _isEqualTokens(node.whileKeyword, other.whileKeyword) && _isEqualTokens(node.leftParenthesis, other.leftParenthesis) && _isEqualNodes(node.condition, other.condition) && _isEqualTokens(node.rightParenthesis, other.rightParenthesis) && _isEqualTokens(node.semicolon, other.semicolon);
+    return isEqualTokens(node.doKeyword, other.doKeyword) && isEqualNodes(node.body, other.body) && isEqualTokens(node.whileKeyword, other.whileKeyword) && isEqualTokens(node.leftParenthesis, other.leftParenthesis) && isEqualNodes(node.condition, other.condition) && isEqualTokens(node.rightParenthesis, other.rightParenthesis) && isEqualTokens(node.semicolon, other.semicolon);
   }
 
   @override
   bool visitDoubleLiteral(DoubleLiteral node) {
     DoubleLiteral other = this._other as DoubleLiteral;
-    return _isEqualTokens(node.literal, other.literal) && node.value == other.value;
+    return isEqualTokens(node.literal, other.literal) && node.value == other.value;
   }
 
   @override
   bool visitEmptyFunctionBody(EmptyFunctionBody node) {
     EmptyFunctionBody other = this._other as EmptyFunctionBody;
-    return _isEqualTokens(node.semicolon, other.semicolon);
+    return isEqualTokens(node.semicolon, other.semicolon);
   }
 
   @override
   bool visitEmptyStatement(EmptyStatement node) {
     EmptyStatement other = this._other as EmptyStatement;
-    return _isEqualTokens(node.semicolon, other.semicolon);
+    return isEqualTokens(node.semicolon, other.semicolon);
   }
 
   @override
   bool visitEnumConstantDeclaration(EnumConstantDeclaration node) {
     EnumConstantDeclaration other = this._other as EnumConstantDeclaration;
-    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualNodes(node.name, other.name);
+    return isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && isEqualNodes(node.name, other.name);
   }
 
   @override
   bool visitEnumDeclaration(EnumDeclaration node) {
     EnumDeclaration other = this._other as EnumDeclaration;
-    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualTokens(node.keyword, other.keyword) && _isEqualNodes(node.name, other.name) && _isEqualTokens(node.leftBracket, other.leftBracket) && _isEqualNodeLists(node.constants, other.constants) && _isEqualTokens(node.rightBracket, other.rightBracket);
+    return isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && isEqualTokens(node.keyword, other.keyword) && isEqualNodes(node.name, other.name) && isEqualTokens(node.leftBracket, other.leftBracket) && _isEqualNodeLists(node.constants, other.constants) && isEqualTokens(node.rightBracket, other.rightBracket);
   }
 
   @override
   bool visitExportDirective(ExportDirective node) {
     ExportDirective other = this._other as ExportDirective;
-    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualTokens(node.keyword, other.keyword) && _isEqualNodes(node.uri, other.uri) && _isEqualNodeLists(node.combinators, other.combinators) && _isEqualTokens(node.semicolon, other.semicolon);
+    return isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && isEqualTokens(node.keyword, other.keyword) && isEqualNodes(node.uri, other.uri) && _isEqualNodeLists(node.combinators, other.combinators) && isEqualTokens(node.semicolon, other.semicolon);
   }
 
   @override
   bool visitExpressionFunctionBody(ExpressionFunctionBody node) {
     ExpressionFunctionBody other = this._other as ExpressionFunctionBody;
-    return _isEqualTokens(node.functionDefinition, other.functionDefinition) && _isEqualNodes(node.expression, other.expression) && _isEqualTokens(node.semicolon, other.semicolon);
+    return isEqualTokens(node.functionDefinition, other.functionDefinition) && isEqualNodes(node.expression, other.expression) && isEqualTokens(node.semicolon, other.semicolon);
   }
 
   @override
   bool visitExpressionStatement(ExpressionStatement node) {
     ExpressionStatement other = this._other as ExpressionStatement;
-    return _isEqualNodes(node.expression, other.expression) && _isEqualTokens(node.semicolon, other.semicolon);
+    return isEqualNodes(node.expression, other.expression) && isEqualTokens(node.semicolon, other.semicolon);
   }
 
   @override
   bool visitExtendsClause(ExtendsClause node) {
     ExtendsClause other = this._other as ExtendsClause;
-    return _isEqualTokens(node.keyword, other.keyword) && _isEqualNodes(node.superclass, other.superclass);
+    return isEqualTokens(node.keyword, other.keyword) && isEqualNodes(node.superclass, other.superclass);
   }
 
   @override
   bool visitFieldDeclaration(FieldDeclaration node) {
     FieldDeclaration other = this._other as FieldDeclaration;
-    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualTokens(node.staticKeyword, other.staticKeyword) && _isEqualNodes(node.fields, other.fields) && _isEqualTokens(node.semicolon, other.semicolon);
+    return isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && isEqualTokens(node.staticKeyword, other.staticKeyword) && isEqualNodes(node.fields, other.fields) && isEqualTokens(node.semicolon, other.semicolon);
   }
 
   @override
   bool visitFieldFormalParameter(FieldFormalParameter node) {
     FieldFormalParameter other = this._other as FieldFormalParameter;
-    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualTokens(node.keyword, other.keyword) && _isEqualNodes(node.type, other.type) && _isEqualTokens(node.thisToken, other.thisToken) && _isEqualTokens(node.period, other.period) && _isEqualNodes(node.identifier, other.identifier);
+    return isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && isEqualTokens(node.keyword, other.keyword) && isEqualNodes(node.type, other.type) && isEqualTokens(node.thisToken, other.thisToken) && isEqualTokens(node.period, other.period) && isEqualNodes(node.identifier, other.identifier);
   }
 
   @override
   bool visitForEachStatement(ForEachStatement node) {
     ForEachStatement other = this._other as ForEachStatement;
-    return _isEqualTokens(node.forKeyword, other.forKeyword) && _isEqualTokens(node.leftParenthesis, other.leftParenthesis) && _isEqualNodes(node.loopVariable, other.loopVariable) && _isEqualTokens(node.inKeyword, other.inKeyword) && _isEqualNodes(node.iterator, other.iterator) && _isEqualTokens(node.rightParenthesis, other.rightParenthesis) && _isEqualNodes(node.body, other.body);
+    return isEqualTokens(node.forKeyword, other.forKeyword) && isEqualTokens(node.leftParenthesis, other.leftParenthesis) && isEqualNodes(node.loopVariable, other.loopVariable) && isEqualTokens(node.inKeyword, other.inKeyword) && isEqualNodes(node.iterator, other.iterator) && isEqualTokens(node.rightParenthesis, other.rightParenthesis) && isEqualNodes(node.body, other.body);
   }
 
   @override
   bool visitFormalParameterList(FormalParameterList node) {
     FormalParameterList other = this._other as FormalParameterList;
-    return _isEqualTokens(node.leftParenthesis, other.leftParenthesis) && _isEqualNodeLists(node.parameters, other.parameters) && _isEqualTokens(node.leftDelimiter, other.leftDelimiter) && _isEqualTokens(node.rightDelimiter, other.rightDelimiter) && _isEqualTokens(node.rightParenthesis, other.rightParenthesis);
+    return isEqualTokens(node.leftParenthesis, other.leftParenthesis) && _isEqualNodeLists(node.parameters, other.parameters) && isEqualTokens(node.leftDelimiter, other.leftDelimiter) && isEqualTokens(node.rightDelimiter, other.rightDelimiter) && isEqualTokens(node.rightParenthesis, other.rightParenthesis);
   }
 
   @override
   bool visitForStatement(ForStatement node) {
     ForStatement other = this._other as ForStatement;
-    return _isEqualTokens(node.forKeyword, other.forKeyword) && _isEqualTokens(node.leftParenthesis, other.leftParenthesis) && _isEqualNodes(node.variables, other.variables) && _isEqualNodes(node.initialization, other.initialization) && _isEqualTokens(node.leftSeparator, other.leftSeparator) && _isEqualNodes(node.condition, other.condition) && _isEqualTokens(node.rightSeparator, other.rightSeparator) && _isEqualNodeLists(node.updaters, other.updaters) && _isEqualTokens(node.rightParenthesis, other.rightParenthesis) && _isEqualNodes(node.body, other.body);
+    return isEqualTokens(node.forKeyword, other.forKeyword) && isEqualTokens(node.leftParenthesis, other.leftParenthesis) && isEqualNodes(node.variables, other.variables) && isEqualNodes(node.initialization, other.initialization) && isEqualTokens(node.leftSeparator, other.leftSeparator) && isEqualNodes(node.condition, other.condition) && isEqualTokens(node.rightSeparator, other.rightSeparator) && _isEqualNodeLists(node.updaters, other.updaters) && isEqualTokens(node.rightParenthesis, other.rightParenthesis) && isEqualNodes(node.body, other.body);
   }
 
   @override
   bool visitFunctionDeclaration(FunctionDeclaration node) {
     FunctionDeclaration other = this._other as FunctionDeclaration;
-    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualTokens(node.externalKeyword, other.externalKeyword) && _isEqualNodes(node.returnType, other.returnType) && _isEqualTokens(node.propertyKeyword, other.propertyKeyword) && _isEqualNodes(node.name, other.name) && _isEqualNodes(node.functionExpression, other.functionExpression);
+    return isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && isEqualTokens(node.externalKeyword, other.externalKeyword) && isEqualNodes(node.returnType, other.returnType) && isEqualTokens(node.propertyKeyword, other.propertyKeyword) && isEqualNodes(node.name, other.name) && isEqualNodes(node.functionExpression, other.functionExpression);
   }
 
   @override
   bool visitFunctionDeclarationStatement(FunctionDeclarationStatement node) {
     FunctionDeclarationStatement other = this._other as FunctionDeclarationStatement;
-    return _isEqualNodes(node.functionDeclaration, other.functionDeclaration);
+    return isEqualNodes(node.functionDeclaration, other.functionDeclaration);
   }
 
   @override
   bool visitFunctionExpression(FunctionExpression node) {
     FunctionExpression other = this._other as FunctionExpression;
-    return _isEqualNodes(node.parameters, other.parameters) && _isEqualNodes(node.body, other.body);
+    return isEqualNodes(node.parameters, other.parameters) && isEqualNodes(node.body, other.body);
   }
 
   @override
   bool visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
     FunctionExpressionInvocation other = this._other as FunctionExpressionInvocation;
-    return _isEqualNodes(node.function, other.function) && _isEqualNodes(node.argumentList, other.argumentList);
+    return isEqualNodes(node.function, other.function) && isEqualNodes(node.argumentList, other.argumentList);
   }
 
   @override
   bool visitFunctionTypeAlias(FunctionTypeAlias node) {
     FunctionTypeAlias other = this._other as FunctionTypeAlias;
-    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualTokens(node.keyword, other.keyword) && _isEqualNodes(node.returnType, other.returnType) && _isEqualNodes(node.name, other.name) && _isEqualNodes(node.typeParameters, other.typeParameters) && _isEqualNodes(node.parameters, other.parameters) && _isEqualTokens(node.semicolon, other.semicolon);
+    return isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && isEqualTokens(node.keyword, other.keyword) && isEqualNodes(node.returnType, other.returnType) && isEqualNodes(node.name, other.name) && isEqualNodes(node.typeParameters, other.typeParameters) && isEqualNodes(node.parameters, other.parameters) && isEqualTokens(node.semicolon, other.semicolon);
   }
 
   @override
   bool visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
     FunctionTypedFormalParameter other = this._other as FunctionTypedFormalParameter;
-    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualNodes(node.returnType, other.returnType) && _isEqualNodes(node.identifier, other.identifier) && _isEqualNodes(node.parameters, other.parameters);
+    return isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && isEqualNodes(node.returnType, other.returnType) && isEqualNodes(node.identifier, other.identifier) && isEqualNodes(node.parameters, other.parameters);
   }
 
   @override
   bool visitHideCombinator(HideCombinator node) {
     HideCombinator other = this._other as HideCombinator;
-    return _isEqualTokens(node.keyword, other.keyword) && _isEqualNodeLists(node.hiddenNames, other.hiddenNames);
+    return isEqualTokens(node.keyword, other.keyword) && _isEqualNodeLists(node.hiddenNames, other.hiddenNames);
   }
 
   @override
   bool visitIfStatement(IfStatement node) {
     IfStatement other = this._other as IfStatement;
-    return _isEqualTokens(node.ifKeyword, other.ifKeyword) && _isEqualTokens(node.leftParenthesis, other.leftParenthesis) && _isEqualNodes(node.condition, other.condition) && _isEqualTokens(node.rightParenthesis, other.rightParenthesis) && _isEqualNodes(node.thenStatement, other.thenStatement) && _isEqualTokens(node.elseKeyword, other.elseKeyword) && _isEqualNodes(node.elseStatement, other.elseStatement);
+    return isEqualTokens(node.ifKeyword, other.ifKeyword) && isEqualTokens(node.leftParenthesis, other.leftParenthesis) && isEqualNodes(node.condition, other.condition) && isEqualTokens(node.rightParenthesis, other.rightParenthesis) && isEqualNodes(node.thenStatement, other.thenStatement) && isEqualTokens(node.elseKeyword, other.elseKeyword) && isEqualNodes(node.elseStatement, other.elseStatement);
   }
 
   @override
   bool visitImplementsClause(ImplementsClause node) {
     ImplementsClause other = this._other as ImplementsClause;
-    return _isEqualTokens(node.keyword, other.keyword) && _isEqualNodeLists(node.interfaces, other.interfaces);
+    return isEqualTokens(node.keyword, other.keyword) && _isEqualNodeLists(node.interfaces, other.interfaces);
   }
 
   @override
   bool visitImportDirective(ImportDirective node) {
     ImportDirective other = this._other as ImportDirective;
-    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualTokens(node.keyword, other.keyword) && _isEqualNodes(node.uri, other.uri) && _isEqualTokens(node.asToken, other.asToken) && _isEqualNodes(node.prefix, other.prefix) && _isEqualNodeLists(node.combinators, other.combinators) && _isEqualTokens(node.semicolon, other.semicolon);
+    return isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && isEqualTokens(node.keyword, other.keyword) && isEqualNodes(node.uri, other.uri) && isEqualTokens(node.asToken, other.asToken) && isEqualNodes(node.prefix, other.prefix) && _isEqualNodeLists(node.combinators, other.combinators) && isEqualTokens(node.semicolon, other.semicolon);
   }
 
   @override
   bool visitIndexExpression(IndexExpression node) {
     IndexExpression other = this._other as IndexExpression;
-    return _isEqualNodes(node.target, other.target) && _isEqualTokens(node.leftBracket, other.leftBracket) && _isEqualNodes(node.index, other.index) && _isEqualTokens(node.rightBracket, other.rightBracket);
+    return isEqualNodes(node.target, other.target) && isEqualTokens(node.leftBracket, other.leftBracket) && isEqualNodes(node.index, other.index) && isEqualTokens(node.rightBracket, other.rightBracket);
   }
 
   @override
   bool visitInstanceCreationExpression(InstanceCreationExpression node) {
     InstanceCreationExpression other = this._other as InstanceCreationExpression;
-    return _isEqualTokens(node.keyword, other.keyword) && _isEqualNodes(node.constructorName, other.constructorName) && _isEqualNodes(node.argumentList, other.argumentList);
+    return isEqualTokens(node.keyword, other.keyword) && isEqualNodes(node.constructorName, other.constructorName) && isEqualNodes(node.argumentList, other.argumentList);
   }
 
   @override
   bool visitIntegerLiteral(IntegerLiteral node) {
     IntegerLiteral other = this._other as IntegerLiteral;
-    return _isEqualTokens(node.literal, other.literal) && (node.value == other.value);
+    return isEqualTokens(node.literal, other.literal) && (node.value == other.value);
   }
 
   @override
   bool visitInterpolationExpression(InterpolationExpression node) {
     InterpolationExpression other = this._other as InterpolationExpression;
-    return _isEqualTokens(node.leftBracket, other.leftBracket) && _isEqualNodes(node.expression, other.expression) && _isEqualTokens(node.rightBracket, other.rightBracket);
+    return isEqualTokens(node.leftBracket, other.leftBracket) && isEqualNodes(node.expression, other.expression) && isEqualTokens(node.rightBracket, other.rightBracket);
   }
 
   @override
   bool visitInterpolationString(InterpolationString node) {
     InterpolationString other = this._other as InterpolationString;
-    return _isEqualTokens(node.contents, other.contents) && node.value == other.value;
+    return isEqualTokens(node.contents, other.contents) && node.value == other.value;
   }
 
   @override
   bool visitIsExpression(IsExpression node) {
     IsExpression other = this._other as IsExpression;
-    return _isEqualNodes(node.expression, other.expression) && _isEqualTokens(node.isOperator, other.isOperator) && _isEqualTokens(node.notOperator, other.notOperator) && _isEqualNodes(node.type, other.type);
+    return isEqualNodes(node.expression, other.expression) && isEqualTokens(node.isOperator, other.isOperator) && isEqualTokens(node.notOperator, other.notOperator) && isEqualNodes(node.type, other.type);
   }
 
   @override
   bool visitLabel(Label node) {
     Label other = this._other as Label;
-    return _isEqualNodes(node.label, other.label) && _isEqualTokens(node.colon, other.colon);
+    return isEqualNodes(node.label, other.label) && isEqualTokens(node.colon, other.colon);
   }
 
   @override
   bool visitLabeledStatement(LabeledStatement node) {
     LabeledStatement other = this._other as LabeledStatement;
-    return _isEqualNodeLists(node.labels, other.labels) && _isEqualNodes(node.statement, other.statement);
+    return _isEqualNodeLists(node.labels, other.labels) && isEqualNodes(node.statement, other.statement);
   }
 
   @override
   bool visitLibraryDirective(LibraryDirective node) {
     LibraryDirective other = this._other as LibraryDirective;
-    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualTokens(node.libraryToken, other.libraryToken) && _isEqualNodes(node.name, other.name) && _isEqualTokens(node.semicolon, other.semicolon);
+    return isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && isEqualTokens(node.libraryToken, other.libraryToken) && isEqualNodes(node.name, other.name) && isEqualTokens(node.semicolon, other.semicolon);
   }
 
   @override
@@ -1770,145 +2295,145 @@
   @override
   bool visitListLiteral(ListLiteral node) {
     ListLiteral other = this._other as ListLiteral;
-    return _isEqualTokens(node.constKeyword, other.constKeyword) && _isEqualNodes(node.typeArguments, other.typeArguments) && _isEqualTokens(node.leftBracket, other.leftBracket) && _isEqualNodeLists(node.elements, other.elements) && _isEqualTokens(node.rightBracket, other.rightBracket);
+    return isEqualTokens(node.constKeyword, other.constKeyword) && isEqualNodes(node.typeArguments, other.typeArguments) && isEqualTokens(node.leftBracket, other.leftBracket) && _isEqualNodeLists(node.elements, other.elements) && isEqualTokens(node.rightBracket, other.rightBracket);
   }
 
   @override
   bool visitMapLiteral(MapLiteral node) {
     MapLiteral other = this._other as MapLiteral;
-    return _isEqualTokens(node.constKeyword, other.constKeyword) && _isEqualNodes(node.typeArguments, other.typeArguments) && _isEqualTokens(node.leftBracket, other.leftBracket) && _isEqualNodeLists(node.entries, other.entries) && _isEqualTokens(node.rightBracket, other.rightBracket);
+    return isEqualTokens(node.constKeyword, other.constKeyword) && isEqualNodes(node.typeArguments, other.typeArguments) && isEqualTokens(node.leftBracket, other.leftBracket) && _isEqualNodeLists(node.entries, other.entries) && isEqualTokens(node.rightBracket, other.rightBracket);
   }
 
   @override
   bool visitMapLiteralEntry(MapLiteralEntry node) {
     MapLiteralEntry other = this._other as MapLiteralEntry;
-    return _isEqualNodes(node.key, other.key) && _isEqualTokens(node.separator, other.separator) && _isEqualNodes(node.value, other.value);
+    return isEqualNodes(node.key, other.key) && isEqualTokens(node.separator, other.separator) && isEqualNodes(node.value, other.value);
   }
 
   @override
   bool visitMethodDeclaration(MethodDeclaration node) {
     MethodDeclaration other = this._other as MethodDeclaration;
-    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualTokens(node.externalKeyword, other.externalKeyword) && _isEqualTokens(node.modifierKeyword, other.modifierKeyword) && _isEqualNodes(node.returnType, other.returnType) && _isEqualTokens(node.propertyKeyword, other.propertyKeyword) && _isEqualTokens(node.propertyKeyword, other.propertyKeyword) && _isEqualNodes(node.name, other.name) && _isEqualNodes(node.parameters, other.parameters) && _isEqualNodes(node.body, other.body);
+    return isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && isEqualTokens(node.externalKeyword, other.externalKeyword) && isEqualTokens(node.modifierKeyword, other.modifierKeyword) && isEqualNodes(node.returnType, other.returnType) && isEqualTokens(node.propertyKeyword, other.propertyKeyword) && isEqualTokens(node.propertyKeyword, other.propertyKeyword) && isEqualNodes(node.name, other.name) && isEqualNodes(node.parameters, other.parameters) && isEqualNodes(node.body, other.body);
   }
 
   @override
   bool visitMethodInvocation(MethodInvocation node) {
     MethodInvocation other = this._other as MethodInvocation;
-    return _isEqualNodes(node.target, other.target) && _isEqualTokens(node.period, other.period) && _isEqualNodes(node.methodName, other.methodName) && _isEqualNodes(node.argumentList, other.argumentList);
+    return isEqualNodes(node.target, other.target) && isEqualTokens(node.period, other.period) && isEqualNodes(node.methodName, other.methodName) && isEqualNodes(node.argumentList, other.argumentList);
   }
 
   @override
   bool visitNamedExpression(NamedExpression node) {
     NamedExpression other = this._other as NamedExpression;
-    return _isEqualNodes(node.name, other.name) && _isEqualNodes(node.expression, other.expression);
+    return isEqualNodes(node.name, other.name) && isEqualNodes(node.expression, other.expression);
   }
 
   @override
   bool visitNativeClause(NativeClause node) {
     NativeClause other = this._other as NativeClause;
-    return _isEqualTokens(node.keyword, other.keyword) && _isEqualNodes(node.name, other.name);
+    return isEqualTokens(node.keyword, other.keyword) && isEqualNodes(node.name, other.name);
   }
 
   @override
   bool visitNativeFunctionBody(NativeFunctionBody node) {
     NativeFunctionBody other = this._other as NativeFunctionBody;
-    return _isEqualTokens(node.nativeToken, other.nativeToken) && _isEqualNodes(node.stringLiteral, other.stringLiteral) && _isEqualTokens(node.semicolon, other.semicolon);
+    return isEqualTokens(node.nativeToken, other.nativeToken) && isEqualNodes(node.stringLiteral, other.stringLiteral) && isEqualTokens(node.semicolon, other.semicolon);
   }
 
   @override
   bool visitNullLiteral(NullLiteral node) {
     NullLiteral other = this._other as NullLiteral;
-    return _isEqualTokens(node.literal, other.literal);
+    return isEqualTokens(node.literal, other.literal);
   }
 
   @override
   bool visitParenthesizedExpression(ParenthesizedExpression node) {
     ParenthesizedExpression other = this._other as ParenthesizedExpression;
-    return _isEqualTokens(node.leftParenthesis, other.leftParenthesis) && _isEqualNodes(node.expression, other.expression) && _isEqualTokens(node.rightParenthesis, other.rightParenthesis);
+    return isEqualTokens(node.leftParenthesis, other.leftParenthesis) && isEqualNodes(node.expression, other.expression) && isEqualTokens(node.rightParenthesis, other.rightParenthesis);
   }
 
   @override
   bool visitPartDirective(PartDirective node) {
     PartDirective other = this._other as PartDirective;
-    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualTokens(node.partToken, other.partToken) && _isEqualNodes(node.uri, other.uri) && _isEqualTokens(node.semicolon, other.semicolon);
+    return isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && isEqualTokens(node.partToken, other.partToken) && isEqualNodes(node.uri, other.uri) && isEqualTokens(node.semicolon, other.semicolon);
   }
 
   @override
   bool visitPartOfDirective(PartOfDirective node) {
     PartOfDirective other = this._other as PartOfDirective;
-    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualTokens(node.partToken, other.partToken) && _isEqualTokens(node.ofToken, other.ofToken) && _isEqualNodes(node.libraryName, other.libraryName) && _isEqualTokens(node.semicolon, other.semicolon);
+    return isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && isEqualTokens(node.partToken, other.partToken) && isEqualTokens(node.ofToken, other.ofToken) && isEqualNodes(node.libraryName, other.libraryName) && isEqualTokens(node.semicolon, other.semicolon);
   }
 
   @override
   bool visitPostfixExpression(PostfixExpression node) {
     PostfixExpression other = this._other as PostfixExpression;
-    return _isEqualNodes(node.operand, other.operand) && _isEqualTokens(node.operator, other.operator);
+    return isEqualNodes(node.operand, other.operand) && isEqualTokens(node.operator, other.operator);
   }
 
   @override
   bool visitPrefixedIdentifier(PrefixedIdentifier node) {
     PrefixedIdentifier other = this._other as PrefixedIdentifier;
-    return _isEqualNodes(node.prefix, other.prefix) && _isEqualTokens(node.period, other.period) && _isEqualNodes(node.identifier, other.identifier);
+    return isEqualNodes(node.prefix, other.prefix) && isEqualTokens(node.period, other.period) && isEqualNodes(node.identifier, other.identifier);
   }
 
   @override
   bool visitPrefixExpression(PrefixExpression node) {
     PrefixExpression other = this._other as PrefixExpression;
-    return _isEqualTokens(node.operator, other.operator) && _isEqualNodes(node.operand, other.operand);
+    return isEqualTokens(node.operator, other.operator) && isEqualNodes(node.operand, other.operand);
   }
 
   @override
   bool visitPropertyAccess(PropertyAccess node) {
     PropertyAccess other = this._other as PropertyAccess;
-    return _isEqualNodes(node.target, other.target) && _isEqualTokens(node.operator, other.operator) && _isEqualNodes(node.propertyName, other.propertyName);
+    return isEqualNodes(node.target, other.target) && isEqualTokens(node.operator, other.operator) && isEqualNodes(node.propertyName, other.propertyName);
   }
 
   @override
   bool visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) {
     RedirectingConstructorInvocation other = this._other as RedirectingConstructorInvocation;
-    return _isEqualTokens(node.keyword, other.keyword) && _isEqualTokens(node.period, other.period) && _isEqualNodes(node.constructorName, other.constructorName) && _isEqualNodes(node.argumentList, other.argumentList);
+    return isEqualTokens(node.keyword, other.keyword) && isEqualTokens(node.period, other.period) && isEqualNodes(node.constructorName, other.constructorName) && isEqualNodes(node.argumentList, other.argumentList);
   }
 
   @override
   bool visitRethrowExpression(RethrowExpression node) {
     RethrowExpression other = this._other as RethrowExpression;
-    return _isEqualTokens(node.keyword, other.keyword);
+    return isEqualTokens(node.keyword, other.keyword);
   }
 
   @override
   bool visitReturnStatement(ReturnStatement node) {
     ReturnStatement other = this._other as ReturnStatement;
-    return _isEqualTokens(node.keyword, other.keyword) && _isEqualNodes(node.expression, other.expression) && _isEqualTokens(node.semicolon, other.semicolon);
+    return isEqualTokens(node.keyword, other.keyword) && isEqualNodes(node.expression, other.expression) && isEqualTokens(node.semicolon, other.semicolon);
   }
 
   @override
   bool visitScriptTag(ScriptTag node) {
     ScriptTag other = this._other as ScriptTag;
-    return _isEqualTokens(node.scriptTag, other.scriptTag);
+    return isEqualTokens(node.scriptTag, other.scriptTag);
   }
 
   @override
   bool visitShowCombinator(ShowCombinator node) {
     ShowCombinator other = this._other as ShowCombinator;
-    return _isEqualTokens(node.keyword, other.keyword) && _isEqualNodeLists(node.shownNames, other.shownNames);
+    return isEqualTokens(node.keyword, other.keyword) && _isEqualNodeLists(node.shownNames, other.shownNames);
   }
 
   @override
   bool visitSimpleFormalParameter(SimpleFormalParameter node) {
     SimpleFormalParameter other = this._other as SimpleFormalParameter;
-    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualTokens(node.keyword, other.keyword) && _isEqualNodes(node.type, other.type) && _isEqualNodes(node.identifier, other.identifier);
+    return isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && isEqualTokens(node.keyword, other.keyword) && isEqualNodes(node.type, other.type) && isEqualNodes(node.identifier, other.identifier);
   }
 
   @override
   bool visitSimpleIdentifier(SimpleIdentifier node) {
     SimpleIdentifier other = this._other as SimpleIdentifier;
-    return _isEqualTokens(node.token, other.token);
+    return isEqualTokens(node.token, other.token);
   }
 
   @override
   bool visitSimpleStringLiteral(SimpleStringLiteral node) {
     SimpleStringLiteral other = this._other as SimpleStringLiteral;
-    return _isEqualTokens(node.literal, other.literal) && (node.value == other.value);
+    return isEqualTokens(node.literal, other.literal) && (node.value == other.value);
   }
 
   @override
@@ -1920,121 +2445,121 @@
   @override
   bool visitSuperConstructorInvocation(SuperConstructorInvocation node) {
     SuperConstructorInvocation other = this._other as SuperConstructorInvocation;
-    return _isEqualTokens(node.keyword, other.keyword) && _isEqualTokens(node.period, other.period) && _isEqualNodes(node.constructorName, other.constructorName) && _isEqualNodes(node.argumentList, other.argumentList);
+    return isEqualTokens(node.keyword, other.keyword) && isEqualTokens(node.period, other.period) && isEqualNodes(node.constructorName, other.constructorName) && isEqualNodes(node.argumentList, other.argumentList);
   }
 
   @override
   bool visitSuperExpression(SuperExpression node) {
     SuperExpression other = this._other as SuperExpression;
-    return _isEqualTokens(node.keyword, other.keyword);
+    return isEqualTokens(node.keyword, other.keyword);
   }
 
   @override
   bool visitSwitchCase(SwitchCase node) {
     SwitchCase other = this._other as SwitchCase;
-    return _isEqualNodeLists(node.labels, other.labels) && _isEqualTokens(node.keyword, other.keyword) && _isEqualNodes(node.expression, other.expression) && _isEqualTokens(node.colon, other.colon) && _isEqualNodeLists(node.statements, other.statements);
+    return _isEqualNodeLists(node.labels, other.labels) && isEqualTokens(node.keyword, other.keyword) && isEqualNodes(node.expression, other.expression) && isEqualTokens(node.colon, other.colon) && _isEqualNodeLists(node.statements, other.statements);
   }
 
   @override
   bool visitSwitchDefault(SwitchDefault node) {
     SwitchDefault other = this._other as SwitchDefault;
-    return _isEqualNodeLists(node.labels, other.labels) && _isEqualTokens(node.keyword, other.keyword) && _isEqualTokens(node.colon, other.colon) && _isEqualNodeLists(node.statements, other.statements);
+    return _isEqualNodeLists(node.labels, other.labels) && isEqualTokens(node.keyword, other.keyword) && isEqualTokens(node.colon, other.colon) && _isEqualNodeLists(node.statements, other.statements);
   }
 
   @override
   bool visitSwitchStatement(SwitchStatement node) {
     SwitchStatement other = this._other as SwitchStatement;
-    return _isEqualTokens(node.keyword, other.keyword) && _isEqualTokens(node.leftParenthesis, other.leftParenthesis) && _isEqualNodes(node.expression, other.expression) && _isEqualTokens(node.rightParenthesis, other.rightParenthesis) && _isEqualTokens(node.leftBracket, other.leftBracket) && _isEqualNodeLists(node.members, other.members) && _isEqualTokens(node.rightBracket, other.rightBracket);
+    return isEqualTokens(node.keyword, other.keyword) && isEqualTokens(node.leftParenthesis, other.leftParenthesis) && isEqualNodes(node.expression, other.expression) && isEqualTokens(node.rightParenthesis, other.rightParenthesis) && isEqualTokens(node.leftBracket, other.leftBracket) && _isEqualNodeLists(node.members, other.members) && isEqualTokens(node.rightBracket, other.rightBracket);
   }
 
   @override
   bool visitSymbolLiteral(SymbolLiteral node) {
     SymbolLiteral other = this._other as SymbolLiteral;
-    return _isEqualTokens(node.poundSign, other.poundSign) && _isEqualTokenLists(node.components, other.components);
+    return isEqualTokens(node.poundSign, other.poundSign) && _isEqualTokenLists(node.components, other.components);
   }
 
   @override
   bool visitThisExpression(ThisExpression node) {
     ThisExpression other = this._other as ThisExpression;
-    return _isEqualTokens(node.keyword, other.keyword);
+    return isEqualTokens(node.keyword, other.keyword);
   }
 
   @override
   bool visitThrowExpression(ThrowExpression node) {
     ThrowExpression other = this._other as ThrowExpression;
-    return _isEqualTokens(node.keyword, other.keyword) && _isEqualNodes(node.expression, other.expression);
+    return isEqualTokens(node.keyword, other.keyword) && isEqualNodes(node.expression, other.expression);
   }
 
   @override
   bool visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
     TopLevelVariableDeclaration other = this._other as TopLevelVariableDeclaration;
-    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualNodes(node.variables, other.variables) && _isEqualTokens(node.semicolon, other.semicolon);
+    return isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && isEqualNodes(node.variables, other.variables) && isEqualTokens(node.semicolon, other.semicolon);
   }
 
   @override
   bool visitTryStatement(TryStatement node) {
     TryStatement other = this._other as TryStatement;
-    return _isEqualTokens(node.tryKeyword, other.tryKeyword) && _isEqualNodes(node.body, other.body) && _isEqualNodeLists(node.catchClauses, other.catchClauses) && _isEqualTokens(node.finallyKeyword, other.finallyKeyword) && _isEqualNodes(node.finallyBlock, other.finallyBlock);
+    return isEqualTokens(node.tryKeyword, other.tryKeyword) && isEqualNodes(node.body, other.body) && _isEqualNodeLists(node.catchClauses, other.catchClauses) && isEqualTokens(node.finallyKeyword, other.finallyKeyword) && isEqualNodes(node.finallyBlock, other.finallyBlock);
   }
 
   @override
   bool visitTypeArgumentList(TypeArgumentList node) {
     TypeArgumentList other = this._other as TypeArgumentList;
-    return _isEqualTokens(node.leftBracket, other.leftBracket) && _isEqualNodeLists(node.arguments, other.arguments) && _isEqualTokens(node.rightBracket, other.rightBracket);
+    return isEqualTokens(node.leftBracket, other.leftBracket) && _isEqualNodeLists(node.arguments, other.arguments) && isEqualTokens(node.rightBracket, other.rightBracket);
   }
 
   @override
   bool visitTypeName(TypeName node) {
     TypeName other = this._other as TypeName;
-    return _isEqualNodes(node.name, other.name) && _isEqualNodes(node.typeArguments, other.typeArguments);
+    return isEqualNodes(node.name, other.name) && isEqualNodes(node.typeArguments, other.typeArguments);
   }
 
   @override
   bool visitTypeParameter(TypeParameter node) {
     TypeParameter other = this._other as TypeParameter;
-    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualNodes(node.name, other.name) && _isEqualTokens(node.keyword, other.keyword) && _isEqualNodes(node.bound, other.bound);
+    return isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && isEqualNodes(node.name, other.name) && isEqualTokens(node.keyword, other.keyword) && isEqualNodes(node.bound, other.bound);
   }
 
   @override
   bool visitTypeParameterList(TypeParameterList node) {
     TypeParameterList other = this._other as TypeParameterList;
-    return _isEqualTokens(node.leftBracket, other.leftBracket) && _isEqualNodeLists(node.typeParameters, other.typeParameters) && _isEqualTokens(node.rightBracket, other.rightBracket);
+    return isEqualTokens(node.leftBracket, other.leftBracket) && _isEqualNodeLists(node.typeParameters, other.typeParameters) && isEqualTokens(node.rightBracket, other.rightBracket);
   }
 
   @override
   bool visitVariableDeclaration(VariableDeclaration node) {
     VariableDeclaration other = this._other as VariableDeclaration;
-    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualNodes(node.name, other.name) && _isEqualTokens(node.equals, other.equals) && _isEqualNodes(node.initializer, other.initializer);
+    return isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && isEqualNodes(node.name, other.name) && isEqualTokens(node.equals, other.equals) && isEqualNodes(node.initializer, other.initializer);
   }
 
   @override
   bool visitVariableDeclarationList(VariableDeclarationList node) {
     VariableDeclarationList other = this._other as VariableDeclarationList;
-    return _isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && _isEqualTokens(node.keyword, other.keyword) && _isEqualNodes(node.type, other.type) && _isEqualNodeLists(node.variables, other.variables);
+    return isEqualNodes(node.documentationComment, other.documentationComment) && _isEqualNodeLists(node.metadata, other.metadata) && isEqualTokens(node.keyword, other.keyword) && isEqualNodes(node.type, other.type) && _isEqualNodeLists(node.variables, other.variables);
   }
 
   @override
   bool visitVariableDeclarationStatement(VariableDeclarationStatement node) {
     VariableDeclarationStatement other = this._other as VariableDeclarationStatement;
-    return _isEqualNodes(node.variables, other.variables) && _isEqualTokens(node.semicolon, other.semicolon);
+    return isEqualNodes(node.variables, other.variables) && isEqualTokens(node.semicolon, other.semicolon);
   }
 
   @override
   bool visitWhileStatement(WhileStatement node) {
     WhileStatement other = this._other as WhileStatement;
-    return _isEqualTokens(node.keyword, other.keyword) && _isEqualTokens(node.leftParenthesis, other.leftParenthesis) && _isEqualNodes(node.condition, other.condition) && _isEqualTokens(node.rightParenthesis, other.rightParenthesis) && _isEqualNodes(node.body, other.body);
+    return isEqualTokens(node.keyword, other.keyword) && isEqualTokens(node.leftParenthesis, other.leftParenthesis) && isEqualNodes(node.condition, other.condition) && isEqualTokens(node.rightParenthesis, other.rightParenthesis) && isEqualNodes(node.body, other.body);
   }
 
   @override
   bool visitWithClause(WithClause node) {
     WithClause other = this._other as WithClause;
-    return _isEqualTokens(node.withKeyword, other.withKeyword) && _isEqualNodeLists(node.mixinTypes, other.mixinTypes);
+    return isEqualTokens(node.withKeyword, other.withKeyword) && _isEqualNodeLists(node.mixinTypes, other.mixinTypes);
   }
 
   @override
   bool visitYieldStatement(YieldStatement node) {
     YieldStatement other = this._other as YieldStatement;
-    return _isEqualTokens(node.yieldKeyword, other.yieldKeyword) && _isEqualNodes(node.expression, other.expression) && _isEqualTokens(node.semicolon, other.semicolon);
+    return isEqualTokens(node.yieldKeyword, other.yieldKeyword) && isEqualNodes(node.expression, other.expression) && isEqualTokens(node.semicolon, other.semicolon);
   }
 
   /**
@@ -2057,7 +2582,7 @@
       return false;
     }
     for (int i = 0; i < size; i++) {
-      if (!_isEqualNodes(first[i], second[i])) {
+      if (!isEqualNodes(first[i], second[i])) {
         return false;
       }
     }
@@ -2065,13 +2590,13 @@
   }
 
   /**
-   * Return `true` if the given AST nodes have the same structure.
+   * Return `true` if the [first] node and the [second] node have the same
+   * structure.
    *
-   * @param first the first node being compared
-   * @param second the second node being compared
-   * @return `true` if the given AST nodes have the same structure
+   * *Note:* This method is only visible for testing purposes and should not be
+   * used by clients.
    */
-  bool _isEqualNodes(AstNode first, AstNode second) {
+  bool isEqualNodes(AstNode first, AstNode second) {
     if (first == null) {
       return second == null;
     } else if (second == null) {
@@ -2098,7 +2623,7 @@
       return false;
     }
     for (int i = 0; i < length; i++) {
-      if (!_isEqualTokens(first[i], second[i])) {
+      if (!isEqualTokens(first[i], second[i])) {
         return false;
       }
     }
@@ -2106,13 +2631,13 @@
   }
 
   /**
-   * Return `true` if the given tokens have the same structure.
+   * Return `true` if the [first] token and the [second] token have the same
+   * structure.
    *
-   * @param first the first node being compared
-   * @param second the second node being compared
-   * @return `true` if the given tokens have the same structure
+   * *Note:* This method is only visible for testing purposes and should not be
+   * used by clients.
    */
-  bool _isEqualTokens(Token first, Token second) {
+  bool isEqualTokens(Token first, Token second) {
     if (first == null) {
       return second == null;
     } else if (second == null) {
@@ -2120,7 +2645,9 @@
     } else if (identical(first, second)) {
       return true;
     }
-    return first.offset == second.offset && first.length == second.length && first.lexeme == second.lexeme;
+    return first.offset == second.offset
+        && first.length == second.length
+        && first.lexeme == second.lexeme;
   }
 }
 
@@ -4325,12 +4852,10 @@
    *         appeared in the original source
    */
   List<AstNode> get sortedDirectivesAndDeclarations {
-    List<AstNode> childList = new List<AstNode>();
-    childList.addAll(_directives);
-    childList.addAll(_declarations);
-    List<AstNode> children = new List.from(childList);
-    children.sort(AstNode.LEXICAL_ORDER);
-    return children;
+    return <AstNode>[]
+      ..addAll(_directives)
+      ..addAll(_declarations)
+      ..sort(AstNode.LEXICAL_ORDER);
   }
 }
 
@@ -4526,15 +5051,15 @@
 
   @override
   Object visitAdjacentStrings(AdjacentStrings node) {
-    JavaStringBuilder builder = new JavaStringBuilder();
+    StringBuffer buffer = new StringBuffer();
     for (StringLiteral string in node.strings) {
       Object value = string.accept(this);
       if (identical(value, NOT_A_CONSTANT)) {
         return value;
       }
-      builder.append(value);
+      buffer.write(value);
     }
-    return builder.toString();
+    return buffer.toString();
   }
 
   @override
@@ -4797,28 +5322,28 @@
 
   @override
   Object visitStringInterpolation(StringInterpolation node) {
-    JavaStringBuilder builder = new JavaStringBuilder();
+    StringBuffer buffer = new StringBuffer();
     for (InterpolationElement element in node.elements) {
       Object value = element.accept(this);
       if (identical(value, NOT_A_CONSTANT)) {
         return value;
       }
-      builder.append(value);
+      buffer.write(value);
     }
-    return builder.toString();
+    return buffer.toString();
   }
 
   @override
   Object visitSymbolLiteral(SymbolLiteral node) {
     // TODO(brianwilkerson) This isn't optimal because a Symbol is not a String.
-    JavaStringBuilder builder = new JavaStringBuilder();
+    StringBuffer buffer = new StringBuffer();
     for (Token component in node.components) {
-      if (builder.length > 0) {
-        builder.appendChar(0x2E);
+      if (buffer.length > 0) {
+        buffer.writeCharCode(0x2E);
       }
-      builder.append(component.lexeme);
+      buffer.write(component.lexeme);
     }
-    return builder.toString();
+    return buffer.toString();
   }
 
   /**
@@ -6217,6 +6742,12 @@
 
   @override
   Token get firstTokenAfterCommentAndMetadata => _name.beginToken;
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    super.visitChildren(visitor);
+    safelyVisitChild(_name, visitor);
+  }
 }
 
 /**
@@ -6304,6 +6835,13 @@
 
   @override
   Token get firstTokenAfterCommentAndMetadata => keyword;
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    super.visitChildren(visitor);
+    safelyVisitChild(_name, visitor);
+    _constants.accept(visitor);
+  }
 }
 
 /**
@@ -10825,17 +11363,17 @@
 
   @override
   String get name {
-    JavaStringBuilder builder = new JavaStringBuilder();
+    StringBuffer buffer = new StringBuffer();
     bool needsPeriod = false;
     for (SimpleIdentifier identifier in _components) {
       if (needsPeriod) {
-        builder.append(".");
+        buffer.write(".");
       } else {
         needsPeriod = true;
       }
-      builder.append(identifier.name);
+      buffer.write(identifier.name);
     }
-    return builder.toString();
+    return buffer.toString();
   }
 
   @override
@@ -11906,7 +12444,7 @@
     } on NodeLocator_NodeFoundException catch (exception) {
       // A node with the right source position was found.
     } catch (exception) {
-      AnalysisEngine.instance.logger.logInformation2("Unable to locate element at offset (${_startOffset} - ${_endOffset})", exception);
+      AnalysisEngine.instance.logger.logInformation2("Unable to locate element at offset ($_startOffset - $_endOffset)", exception);
       return null;
     }
     return _foundNode;
@@ -13089,7 +13627,7 @@
     int count = list.length;
     for (int i = 0; i < count; i++) {
       if (identical(_oldNode, list[i])) {
-        javaListSet(list, i, _newNode);
+        list[i] = _newNode;
         return true;
       }
     }
@@ -13231,12 +13769,10 @@
    *         appeared in the original source
    */
   List<AstNode> get sortedCommentAndAnnotations {
-    List<AstNode> childList = new List<AstNode>();
-    childList.add(_comment);
-    childList.addAll(_metadata);
-    List<AstNode> children = new List.from(childList);
-    children.sort(AstNode.LEXICAL_ORDER);
-    return children;
+    return <AstNode>[]
+      ..add(_comment)
+      ..addAll(_metadata)
+      ..sort(AstNode.LEXICAL_ORDER);
   }
 }
 
@@ -15739,7 +16275,8 @@
     AstNode parent = this.parent;
     if (parent is CatchClause) {
       CatchClause clause = parent;
-      return identical(this, clause.exceptionParameter) || identical(this, clause.stackTraceParameter);
+      return identical(this, clause.exceptionParameter) ||
+          identical(this, clause.stackTraceParameter);
     } else if (parent is ClassDeclaration) {
       return identical(this, parent.name);
     } else if (parent is ClassTypeAlias) {
@@ -15748,6 +16285,10 @@
       return identical(this, parent.name);
     } else if (parent is DeclaredIdentifier) {
       return identical(this, parent.identifier);
+    } else if (parent is EnumDeclaration) {
+      return identical(this, parent.name);
+    } else if (parent is EnumConstantDeclaration) {
+      return identical(this, parent.name);
     } else if (parent is FunctionDeclaration) {
       return identical(this, parent.name);
     } else if (parent is FunctionTypeAlias) {
@@ -15911,7 +16452,7 @@
    */
   Element _returnOrReportElement(AstNode parent, bool isValid, Element element) {
     if (!isValid) {
-      AnalysisEngine.instance.logger.logInformation2("Internal error: attempting to set the name of a ${parent.runtimeType.toString()} to a ${element.runtimeType.toString()}", new JavaException());
+      AnalysisEngine.instance.logger.logInformation2("Internal error: attempting to set the name of a ${parent.runtimeType} to a ${element.runtimeType}", new JavaException());
       return null;
     }
     return element;
@@ -16104,8 +16645,8 @@
   }
 
   @override
-  void appendStringValue(JavaStringBuilder builder) {
-    builder.append(value);
+  void appendStringValue(StringBuffer buffer) {
+    buffer.write(value);
   }
 }
 
@@ -16181,7 +16722,7 @@
   }
 
   @override
-  void appendStringValue(JavaStringBuilder builder) {
+  void appendStringValue(StringBuffer buffer) {
     throw new IllegalArgumentException();
   }
 
@@ -16232,29 +16773,25 @@
  */
 abstract class StringLiteral extends Literal {
   /**
-   * Return the value of the string literal, or `null` if the string is not a constant string
-   * without any string interpolation.
-   *
-   * @return the value of the string literal
+   * Return the value of the string literal, or `null` if the string is not a
+   * constant string without any string interpolation.
    */
   String get stringValue {
-    JavaStringBuilder builder = new JavaStringBuilder();
+    StringBuffer buffer = new StringBuffer();
     try {
-      appendStringValue(builder);
+      appendStringValue(buffer);
     } on IllegalArgumentException catch (exception) {
       return null;
     }
-    return builder.toString();
+    return buffer.toString();
   }
 
   /**
-   * Append the value of the given string literal to the given string builder.
-   *
-   * @param builder the builder to which the string's value is to be appended
-   * @throws IllegalArgumentException if the string is not a constant string without any string
-   *           interpolation
+   * Append the value of this string literal to the given [buffer]. Throw an
+   * [IllegalArgumentException] if the string is not a constant string without
+   * any string interpolation.
    */
-  void appendStringValue(JavaStringBuilder builder);
+  void appendStringValue(StringBuffer buffer);
 }
 
 /**
@@ -19638,7 +20175,7 @@
   void insert(int index, E node) {
     int length = _elements.length;
     if (index < 0 || index > length) {
-      throw new RangeError("Index: ${index}, Size: ${_elements.length}");
+      throw new RangeError("Index: $index, Size: ${_elements.length}");
     }
     owner.becomeParentOf(node);
     if (length == 0) {
@@ -19659,7 +20196,7 @@
   }
   E operator[](int index) {
     if (index < 0 || index >= _elements.length) {
-      throw new RangeError("Index: ${index}, Size: ${_elements.length}");
+      throw new RangeError("Index: $index, Size: ${_elements.length}");
     }
     return _elements[index] as E;
   }
@@ -19689,7 +20226,7 @@
   }
   E removeAt(int index) {
     if (index < 0 || index >= _elements.length) {
-      throw new RangeError("Index: ${index}, Size: ${_elements.length}");
+      throw new RangeError("Index: $index, Size: ${_elements.length}");
     }
     E removedNode = _elements[index] as E;
     int length = _elements.length;
@@ -19702,7 +20239,7 @@
   }
   void operator[]=(int index, E node) {
     if (index < 0 || index >= _elements.length) {
-      throw new RangeError("Index: ${index}, Size: ${_elements.length}");
+      throw new RangeError("Index: $index, Size: ${_elements.length}");
     }
     owner.becomeParentOf(node);
     _elements[index] = node;
diff --git a/pkg/analyzer/lib/src/generated/constant.dart b/pkg/analyzer/lib/src/generated/constant.dart
index fa82b57..ee68be8 100644
--- a/pkg/analyzer/lib/src/generated/constant.dart
+++ b/pkg/analyzer/lib/src/generated/constant.dart
@@ -306,7 +306,7 @@
   /**
    * RegExp that validates a non-empty non-private symbol. From sdk/lib/internal/symbol.dart.
    */
-  static RegExp _PUBLIC_SYMBOL_PATTERN = new RegExp("^(?:${ConstantValueComputer._OPERATOR_RE}\$|${_PUBLIC_IDENTIFIER_RE}(?:=?\$|[.](?!\$)))+?\$");
+  static RegExp _PUBLIC_SYMBOL_PATTERN = new RegExp("^(?:${ConstantValueComputer._OPERATOR_RE}\$|$_PUBLIC_IDENTIFIER_RE(?:=?\$|[.](?!\$)))+?\$");
 
   /**
    * Determine whether the given string is a valid name for a public symbol (i.e. whether it is
@@ -378,14 +378,12 @@
     _variableDeclarationMap = _constantFinder.variableMap;
     constructorDeclarationMap = _constantFinder.constructorMap;
     _constructorInvocations = _constantFinder.constructorInvocations;
-    for (MapEntry<VariableElement, VariableDeclaration> entry in getMapEntrySet(_variableDeclarationMap)) {
-      VariableDeclaration declaration = entry.getValue();
+    _variableDeclarationMap.values.forEach((VariableDeclaration declaration) {
       ReferenceFinder referenceFinder = new ReferenceFinder(declaration, referenceGraph, _variableDeclarationMap, constructorDeclarationMap);
       referenceGraph.addNode(declaration);
       declaration.initializer.accept(referenceFinder);
-    }
-    for (MapEntry<ConstructorElement, ConstructorDeclaration> entry in getMapEntrySet(constructorDeclarationMap)) {
-      ConstructorDeclaration declaration = entry.getValue();
+    });
+    constructorDeclarationMap.forEach((ConstructorElement element, ConstructorDeclaration declaration) {
       ReferenceFinder referenceFinder = new ReferenceFinder(declaration, referenceGraph, _variableDeclarationMap, constructorDeclarationMap);
       referenceGraph.addNode(declaration);
       bool superInvocationFound = false;
@@ -399,7 +397,7 @@
       if (!superInvocationFound) {
         // No explicit superconstructor invocation found, so we need to manually insert
         // a reference to the implicit superconstructor.
-        InterfaceType superclass = (entry.getKey().returnType as InterfaceType).superclass;
+        InterfaceType superclass = (element.returnType as InterfaceType).superclass;
         if (superclass != null && !superclass.isObject) {
           ConstructorElement unnamedConstructor = superclass.element.unnamedConstructor;
           ConstructorDeclaration superConstructorDeclaration = findConstructorDeclaration(unnamedConstructor);
@@ -419,7 +417,7 @@
           }
         }
       }
-    }
+    });
     for (InstanceCreationExpression expression in _constructorInvocations) {
       referenceGraph.addNode(expression);
       ConstructorElement constructor = expression.staticElement;
@@ -900,10 +898,16 @@
 }
 
 /**
- * [AstCloner] that copies the necessary information from the AST to allow const constructor
- * initializers to be evaluated.
+ * A `ConstantValueComputer_InitializerCloner` is an [AstCloner] that copies the
+ * necessary information from the AST to allow const constructor initializers to
+ * be evaluated.
  */
 class ConstantValueComputer_InitializerCloner extends AstCloner {
+  // TODO(brianwilkerson) Investigate replacing uses of this class with uses of
+  // AstCloner and ResolutionCopier.
+
+  ConstantValueComputer_InitializerCloner() : super(true);
+
   @override
   InstanceCreationExpression visitInstanceCreationExpression(InstanceCreationExpression node) {
     InstanceCreationExpression expression = super.visitInstanceCreationExpression(node);
@@ -1195,7 +1199,7 @@
       }
     }
     InterfaceType listType = _typeProvider.listType.substitute4([elementType]);
-    return new DartObjectImpl(listType, new ListState(new List.from(elements)));
+    return new DartObjectImpl(listType, new ListState(elements));
   }
 
   @override
@@ -1359,15 +1363,15 @@
 
   @override
   DartObjectImpl visitSymbolLiteral(SymbolLiteral node) {
-    JavaStringBuilder builder = new JavaStringBuilder();
+    StringBuffer buffer = new StringBuffer();
     List<Token> components = node.components;
     for (int i = 0; i < components.length; i++) {
       if (i > 0) {
-        builder.appendChar(0x2E);
+        buffer.writeCharCode(0x2E);
       }
-      builder.append(components[i].lexeme);
+      buffer.write(components[i].lexeme);
     }
-    return new DartObjectImpl(_typeProvider.symbolType, new SymbolState(builder.toString()));
+    return new DartObjectImpl(_typeProvider.symbolType, new SymbolState(buffer.toString()));
   }
 
   /**
@@ -1926,7 +1930,7 @@
       return new DartObjectImpl(typeProvider.stringType, result);
     }
     // We should never get here.
-    throw new IllegalStateException("add returned a ${result.runtimeType.toString()}");
+    throw new IllegalStateException("add returned a ${result.runtimeType}");
   }
 
   /**
@@ -2011,7 +2015,7 @@
       return new DartObjectImpl(typeProvider.numType, result);
     }
     // We should never get here.
-    throw new IllegalStateException("divide returned a ${result.runtimeType.toString()}");
+    throw new IllegalStateException("divide returned a ${result.runtimeType}");
   }
 
   /**
@@ -2217,7 +2221,7 @@
       return new DartObjectImpl(typeProvider.numType, result);
     }
     // We should never get here.
-    throw new IllegalStateException("minus returned a ${result.runtimeType.toString()}");
+    throw new IllegalStateException("minus returned a ${result.runtimeType}");
   }
 
   /**
@@ -2237,7 +2241,7 @@
       return new DartObjectImpl(typeProvider.numType, result);
     }
     // We should never get here.
-    throw new IllegalStateException("negated returned a ${result.runtimeType.toString()}");
+    throw new IllegalStateException("negated returned a ${result.runtimeType}");
   }
 
   /**
@@ -2291,7 +2295,7 @@
       return new DartObjectImpl(typeProvider.numType, result);
     }
     // We should never get here.
-    throw new IllegalStateException("remainder returned a ${result.runtimeType.toString()}");
+    throw new IllegalStateException("remainder returned a ${result.runtimeType}");
   }
 
   /**
@@ -2341,11 +2345,11 @@
       return new DartObjectImpl(typeProvider.numType, result);
     }
     // We should never get here.
-    throw new IllegalStateException("times returned a ${result.runtimeType.toString()}");
+    throw new IllegalStateException("times returned a ${result.runtimeType}");
   }
 
   @override
-  String toString() => "${type.displayName} (${_state.toString()})";
+  String toString() => "${type.displayName} ($_state)";
 }
 
 /**
@@ -2425,7 +2429,8 @@
   DartObject getString(TypeProvider typeProvider, String variableName) {
     String value = _declaredVariables[variableName];
     if (value == null) {
-      return new DartObjectImpl(typeProvider.intType, IntState.UNKNOWN_VALUE);
+      return new DartObjectImpl(typeProvider.stringType,
+          StringState.UNKNOWN_VALUE);
     }
     return new DartObjectImpl(typeProvider.stringType, new StringState(value));
   }
@@ -4181,9 +4186,8 @@
     } else if (count == 0) {
       return true;
     }
-    for (MapEntry<DartObjectImpl, DartObjectImpl> entry in getMapEntrySet(_entries)) {
-      DartObjectImpl key = entry.getKey();
-      DartObjectImpl value = entry.getValue();
+    for (DartObjectImpl key in _entries.keys) {
+      DartObjectImpl value = _entries[key];
       DartObjectImpl otherValue = otherElements[key];
       if (value != otherValue) {
         return false;
@@ -4198,9 +4202,8 @@
   @override
   Map<Object, Object> get value {
     HashMap<Object, Object> result = new HashMap<Object, Object>();
-    for (MapEntry<DartObjectImpl, DartObjectImpl> entry in getMapEntrySet(_entries)) {
-      DartObjectImpl key = entry.getKey();
-      DartObjectImpl value = entry.getValue();
+    for (DartObjectImpl key in _entries.keys) {
+      DartObjectImpl value = _entries[key];
       if (!key.hasExactValue || !value.hasExactValue) {
         return null;
       }
@@ -4211,8 +4214,8 @@
 
   @override
   bool get hasExactValue {
-    for (MapEntry<DartObjectImpl, DartObjectImpl> entry in getMapEntrySet(_entries)) {
-      if (!entry.getKey().hasExactValue || !entry.getValue().hasExactValue) {
+    for (DartObjectImpl key in _entries.keys) {
+      if (!key.hasExactValue || !_entries[key].hasExactValue) {
         return false;
       }
     }
@@ -4523,7 +4526,7 @@
       if (rightValue == null) {
         return UNKNOWN_VALUE;
       }
-      return new StringState("${value}${rightValue}");
+      return new StringState("$value$rightValue");
     } else if (rightOperand is DynamicState) {
       return UNKNOWN_VALUE;
     }
@@ -4578,7 +4581,7 @@
   }
 
   @override
-  String toString() => value == null ? "-unknown-" : "'${value}'";
+  String toString() => value == null ? "-unknown-" : "'$value'";
 }
 
 /**
@@ -4637,7 +4640,7 @@
   int get hashCode => value == null ? 0 : value.hashCode;
 
   @override
-  String toString() => value == null ? "-unknown-" : "#${value}";
+  String toString() => value == null ? "-unknown-" : "#$value";
 }
 
 /**
diff --git a/pkg/analyzer/lib/src/generated/element.dart b/pkg/analyzer/lib/src/generated/element.dart
index 51fb4d1..91d8575 100644
--- a/pkg/analyzer/lib/src/generated/element.dart
+++ b/pkg/analyzer/lib/src/generated/element.dart
@@ -167,7 +167,7 @@
   }
 
   @override
-  String get identifier => "AngularComponent@${_annotationOffset}";
+  String get identifier => "AngularComponent@$_annotationOffset";
 }
 
 /**
@@ -271,7 +271,7 @@
   }
 
   @override
-  String get identifier => "Decorator@${_offset}";
+  String get identifier => "Decorator@$_offset";
 }
 
 /**
@@ -384,9 +384,9 @@
   }
 
   @override
-  void appendTo(JavaStringBuilder builder) {
-    builder.append(".");
-    builder.append(name);
+  void appendTo(StringBuffer buffer) {
+    buffer.write(".");
+    buffer.write(name);
   }
 }
 
@@ -731,7 +731,7 @@
   ElementKind get kind => ElementKind.ANGULAR_VIEW;
 
   @override
-  String get identifier => "AngularView@${templateUriOffset}";
+  String get identifier => "AngularView@$templateUriOffset";
 }
 
 /**
@@ -1286,13 +1286,16 @@
   accept(ElementVisitor visitor) => visitor.visitClassElement(this);
 
   /**
-   * Set the toolkit specific information objects attached to this class.
-   *
-   * @param toolkitObjects the toolkit objects attached to this class
+   * Add the given [toolkitObject] to the list of toolkit specific information
+   * objects attached to this class.
    */
   void addToolkitObjects(ToolkitObjectElement toolkitObject) {
     (toolkitObject as ToolkitObjectElementImpl).enclosingElement = this;
-    _toolkitObjects = ArrayUtils.add(_toolkitObjects, toolkitObject);
+    if (_toolkitObjects.isEmpty) {
+      // Convert from a non-growable list to a growable list.
+      _toolkitObjects = <ToolkitObjectElement>[];
+    }
+    _toolkitObjects.add(toolkitObject);
   }
 
   @override
@@ -1302,7 +1305,7 @@
   List<InterfaceType> get allSupertypes {
     List<InterfaceType> list = new List<InterfaceType>();
     _collectAllSupertypes(list);
-    return new List.from(list);
+    return list;
   }
 
   @override
@@ -1644,23 +1647,23 @@
   }
 
   @override
-  void appendTo(JavaStringBuilder builder) {
+  void appendTo(StringBuffer buffer) {
     String name = displayName;
     if (name == null) {
-      builder.append("{unnamed class}");
+      buffer.write("{unnamed class}");
     } else {
-      builder.append(name);
+      buffer.write(name);
     }
     int variableCount = _typeParameters.length;
     if (variableCount > 0) {
-      builder.append("<");
+      buffer.write("<");
       for (int i = 0; i < variableCount; i++) {
         if (i > 0) {
-          builder.append(", ");
+          buffer.write(", ");
         }
-        (_typeParameters[i] as TypeParameterElementImpl).appendTo(builder);
+        (_typeParameters[i] as TypeParameterElementImpl).appendTo(buffer);
       }
-      builder.append(">");
+      buffer.write(">");
     }
   }
 
@@ -2083,6 +2086,11 @@
         return type as ClassElementImpl;
       }
     }
+    for (ClassElement type in _enums) {
+      if ((type as ClassElementImpl).identifier == identifier) {
+        return type as ClassElementImpl;
+      }
+    }
     return null;
   }
 
@@ -2240,11 +2248,11 @@
   }
 
   @override
-  void appendTo(JavaStringBuilder builder) {
+  void appendTo(StringBuffer buffer) {
     if (source == null) {
-      builder.append("{compilation unit}");
+      buffer.write("{compilation unit}");
     } else {
-      builder.append(source.fullName);
+      buffer.write(source.fullName);
     }
   }
 
@@ -2505,14 +2513,14 @@
   }
 
   @override
-  void appendTo(JavaStringBuilder builder) {
-    builder.append(enclosingElement.displayName);
+  void appendTo(StringBuffer buffer) {
+    buffer.write(enclosingElement.displayName);
     String name = displayName;
     if (name != null && !name.isEmpty) {
-      builder.append(".");
-      builder.append(name);
+      buffer.write(".");
+      buffer.write(name);
     }
-    super.appendTo(builder);
+    super.appendTo(buffer);
   }
 }
 
@@ -2589,27 +2597,27 @@
     ConstructorElement baseElement = this.baseElement;
     List<ParameterElement> parameters = this.parameters;
     FunctionType type = this.type;
-    JavaStringBuilder builder = new JavaStringBuilder();
-    builder.append(baseElement.enclosingElement.displayName);
+    StringBuffer buffer = new StringBuffer();
+    buffer.write(baseElement.enclosingElement.displayName);
     String name = displayName;
     if (name != null && !name.isEmpty) {
-      builder.append(".");
-      builder.append(name);
+      buffer.write(".");
+      buffer.write(name);
     }
-    builder.append("(");
+    buffer.write("(");
     int parameterCount = parameters.length;
     for (int i = 0; i < parameterCount; i++) {
       if (i > 0) {
-        builder.append(", ");
+        buffer.write(", ");
       }
-      builder.append(parameters[i]).toString();
+      buffer.write(parameters[i]);
     }
-    builder.append(")");
+    buffer.write(")");
     if (type != null) {
-      builder.append(Element.RIGHT_ARROW);
-      builder.append(type.returnType);
+      buffer.write(Element.RIGHT_ARROW);
+      buffer.write(type.returnType);
     }
-    return builder.toString();
+    return buffer.toString();
   }
 
   @override
@@ -3258,7 +3266,7 @@
   }
 
   @override
-  String toString() => "@${element.toString()}";
+  String toString() => '@$element';
 }
 
 /**
@@ -3375,7 +3383,7 @@
     }
     Source source = this.source;
     if (source != null) {
-      return "${shortName} (${source.fullName})";
+      return "$shortName (${source.fullName})";
     }
     return shortName;
   }
@@ -3482,9 +3490,9 @@
 
   @override
   String toString() {
-    JavaStringBuilder builder = new JavaStringBuilder();
-    appendTo(builder);
-    return builder.toString();
+    StringBuffer buffer = new StringBuffer();
+    appendTo(buffer);
+    return buffer.toString();
   }
 
   @override
@@ -3493,17 +3501,15 @@
   }
 
   /**
-   * Append a textual representation of this type to the given builder.
-   *
-   * @param builder the builder to which the text is to be appended
+   * Append a textual representation of this element to the given [buffer].
    */
-  void appendTo(JavaStringBuilder builder) {
+  void appendTo(StringBuffer buffer) {
     if (_name == null) {
-      builder.append("<unnamed ");
-      builder.append(runtimeType.toString());
-      builder.append(">");
+      buffer.write("<unnamed ");
+      buffer.write(runtimeType.toString());
+      buffer.write(">");
     } else {
-      builder.append(_name);
+      buffer.write(_name);
     }
   }
 
@@ -3775,7 +3781,7 @@
       components.insert(0, (ancestor as ElementImpl).identifier);
       ancestor = ancestor.enclosingElement;
     }
-    this._components = new List.from(components);
+    this._components = components;
   }
 
   /**
@@ -3823,15 +3829,15 @@
 
   @override
   String get encoding {
-    JavaStringBuilder builder = new JavaStringBuilder();
+    StringBuffer buffer = new StringBuffer();
     int length = _components.length;
     for (int i = 0; i < length; i++) {
       if (i > 0) {
-        builder.appendChar(_SEPARATOR_CHAR);
+        buffer.writeCharCode(_SEPARATOR_CHAR);
       }
-      _encode(builder, _components[i]);
+      _encode(buffer, _components[i]);
     }
-    return builder.toString();
+    return buffer.toString();
   }
 
   @override
@@ -3855,27 +3861,27 @@
    */
   List<String> _decode(String encoding) {
     List<String> components = new List<String>();
-    JavaStringBuilder builder = new JavaStringBuilder();
+    StringBuffer buffer = new StringBuffer();
     int index = 0;
     int length = encoding.length;
     while (index < length) {
       int currentChar = encoding.codeUnitAt(index);
       if (currentChar == _SEPARATOR_CHAR) {
         if (index + 1 < length && encoding.codeUnitAt(index + 1) == _SEPARATOR_CHAR) {
-          builder.appendChar(_SEPARATOR_CHAR);
+          buffer.writeCharCode(_SEPARATOR_CHAR);
           index += 2;
         } else {
-          components.add(builder.toString());
-          builder.length = 0;
+          components.add(buffer.toString());
+          buffer = new StringBuffer();
           index++;
         }
       } else {
-        builder.appendChar(currentChar);
+        buffer.writeCharCode(currentChar);
         index++;
       }
     }
-    components.add(builder.toString());
-    return new List.from(components);
+    components.add(buffer.toString());
+    return components;
   }
 
   /**
@@ -3884,14 +3890,14 @@
    * @param builder the builder to which the encoded component is to be appended
    * @param component the component to be appended to the builder
    */
-  void _encode(JavaStringBuilder builder, String component) {
+  void _encode(StringBuffer buffer, String component) {
     int length = component.length;
     for (int i = 0; i < length; i++) {
       int currentChar = component.codeUnitAt(i);
       if (currentChar == _SEPARATOR_CHAR) {
-        builder.appendChar(_SEPARATOR_CHAR);
+        buffer.writeCharCode(_SEPARATOR_CHAR);
       }
-      builder.appendChar(currentChar);
+      buffer.writeCharCode(currentChar);
     }
   }
 }
@@ -4343,43 +4349,43 @@
   }
 
   @override
-  void appendTo(JavaStringBuilder builder) {
+  void appendTo(StringBuffer buffer) {
     if (this.kind != ElementKind.GETTER) {
-      builder.append("(");
+      buffer.write("(");
       String closing = null;
       ParameterKind kind = ParameterKind.REQUIRED;
       int parameterCount = _parameters.length;
       for (int i = 0; i < parameterCount; i++) {
         if (i > 0) {
-          builder.append(", ");
+          buffer.write(", ");
         }
         ParameterElementImpl parameter = _parameters[i] as ParameterElementImpl;
         ParameterKind parameterKind = parameter.parameterKind;
         if (parameterKind != kind) {
           if (closing != null) {
-            builder.append(closing);
+            buffer.write(closing);
           }
           if (parameterKind == ParameterKind.POSITIONAL) {
-            builder.append("[");
+            buffer.write("[");
             closing = "]";
           } else if (parameterKind == ParameterKind.NAMED) {
-            builder.append("{");
+            buffer.write("{");
             closing = "}";
           } else {
             closing = null;
           }
         }
         kind = parameterKind;
-        parameter.appendToWithoutDelimiters(builder);
+        parameter.appendToWithoutDelimiters(buffer);
       }
       if (closing != null) {
-        builder.append(closing);
+        buffer.write(closing);
       }
-      builder.append(")");
+      buffer.write(")");
     }
     if (type != null) {
-      builder.append(Element.RIGHT_ARROW);
-      builder.append(type.returnType);
+      buffer.write(Element.RIGHT_ARROW);
+      buffer.write(type.returnType);
     }
   }
 }
@@ -4523,9 +4529,9 @@
   ElementKind get kind => ElementKind.EXPORT;
 
   @override
-  void appendTo(JavaStringBuilder builder) {
-    builder.append("export ");
-    (exportedLibrary as LibraryElementImpl).appendTo(builder);
+  void appendTo(StringBuffer buffer) {
+    buffer.write("export ");
+    (exportedLibrary as LibraryElementImpl).appendTo(buffer);
   }
 
   @override
@@ -4778,13 +4784,7 @@
   bool get isStatic => baseElement.isStatic;
 
   @override
-  String toString() {
-    JavaStringBuilder builder = new JavaStringBuilder();
-    builder.append(type);
-    builder.append(" ");
-    builder.append(displayName);
-    return builder.toString();
-  }
+  String toString() => '$type $displayName';
 
   @override
   InterfaceType get definingType => super.definingType as InterfaceType;
@@ -4903,19 +4903,19 @@
   }
 
   @override
-  void appendTo(JavaStringBuilder builder) {
+  void appendTo(StringBuffer buffer) {
     String name = displayName;
     if (name != null) {
-      builder.append(name);
+      buffer.write(name);
     }
-    super.appendTo(builder);
+    super.appendTo(buffer);
   }
 
   @override
   String get identifier {
     String identifier = super.identifier;
     if (!isStatic) {
-      identifier += "@${nameOffset}";
+      identifier += "@$nameOffset";
     }
     return identifier;
   }
@@ -5236,32 +5236,32 @@
   }
 
   @override
-  void appendTo(JavaStringBuilder builder) {
-    builder.append("typedef ");
-    builder.append(displayName);
+  void appendTo(StringBuffer buffer) {
+    buffer.write("typedef ");
+    buffer.write(displayName);
     int typeParameterCount = _typeParameters.length;
     if (typeParameterCount > 0) {
-      builder.append("<");
+      buffer.write("<");
       for (int i = 0; i < typeParameterCount; i++) {
         if (i > 0) {
-          builder.append(", ");
+          buffer.write(", ");
         }
-        (_typeParameters[i] as TypeParameterElementImpl).appendTo(builder);
+        (_typeParameters[i] as TypeParameterElementImpl).appendTo(buffer);
       }
-      builder.append(">");
+      buffer.write(">");
     }
-    builder.append("(");
+    buffer.write("(");
     int parameterCount = _parameters.length;
     for (int i = 0; i < parameterCount; i++) {
       if (i > 0) {
-        builder.append(", ");
+        buffer.write(", ");
       }
-      (_parameters[i] as ParameterElementImpl).appendTo(builder);
+      (_parameters[i] as ParameterElementImpl).appendTo(buffer);
     }
-    builder.append(")");
+    buffer.write(")");
     if (type != null) {
-      builder.append(Element.RIGHT_ARROW);
-      builder.append(type.returnType);
+      buffer.write(Element.RIGHT_ARROW);
+      buffer.write(type.returnType);
     }
   }
 }
@@ -5286,12 +5286,15 @@
     if (secondTypes.length != firstTypes.length) {
       return false;
     }
-    JavaIterator<MapEntry<String, DartType>> firstIterator = new JavaIterator(getMapEntrySet(firstTypes));
-    JavaIterator<MapEntry<String, DartType>> secondIterator = new JavaIterator(getMapEntrySet(secondTypes));
-    while (firstIterator.hasNext) {
-      MapEntry<String, DartType> firstEntry = firstIterator.next();
-      MapEntry<String, DartType> secondEntry = secondIterator.next();
-      if (firstEntry.getKey() != secondEntry.getKey() || !(firstEntry.getValue() as TypeImpl).internalEquals(secondEntry.getValue(), visitedElementPairs)) {
+    Iterator<String> firstKeys = firstTypes.keys.iterator;
+    Iterator<String> secondKeys = secondTypes.keys.iterator;
+    while (firstKeys.moveNext() && secondKeys.moveNext()) {
+      String firstKey = firstKeys.current;
+      String secondKey = secondKeys.current;
+      TypeImpl firstType = firstTypes[firstKey];
+      TypeImpl secondType = secondTypes[secondKey];
+      if (firstKey != secondKey
+          || !firstType.internalEquals(secondType, visitedElementPairs)) {
         return false;
       }
     }
@@ -5332,63 +5335,63 @@
       List<DartType> optionalParameterTypes = this.optionalParameterTypes;
       Map<String, DartType> namedParameterTypes = this.namedParameterTypes;
       DartType returnType = this.returnType;
-      JavaStringBuilder builder = new JavaStringBuilder();
-      builder.append("(");
+      StringBuffer buffer = new StringBuffer();
+      buffer.write("(");
       bool needsComma = false;
       if (normalParameterTypes.length > 0) {
         for (DartType type in normalParameterTypes) {
           if (needsComma) {
-            builder.append(", ");
+            buffer.write(", ");
           } else {
             needsComma = true;
           }
-          builder.append(type.displayName);
+          buffer.write(type.displayName);
         }
       }
       if (optionalParameterTypes.length > 0) {
         if (needsComma) {
-          builder.append(", ");
+          buffer.write(", ");
           needsComma = false;
         }
-        builder.append("[");
+        buffer.write("[");
         for (DartType type in optionalParameterTypes) {
           if (needsComma) {
-            builder.append(", ");
+            buffer.write(", ");
           } else {
             needsComma = true;
           }
-          builder.append(type.displayName);
+          buffer.write(type.displayName);
         }
-        builder.append("]");
+        buffer.write("]");
         needsComma = true;
       }
       if (namedParameterTypes.length > 0) {
         if (needsComma) {
-          builder.append(", ");
+          buffer.write(", ");
           needsComma = false;
         }
-        builder.append("{");
-        for (MapEntry<String, DartType> entry in getMapEntrySet(namedParameterTypes)) {
+        buffer.write("{");
+        namedParameterTypes.forEach((String name, DartType type) {
           if (needsComma) {
-            builder.append(", ");
+            buffer.write(", ");
           } else {
             needsComma = true;
           }
-          builder.append(entry.getKey());
-          builder.append(": ");
-          builder.append(entry.getValue().displayName);
-        }
-        builder.append("}");
+          buffer.write(name);
+          buffer.write(": ");
+          buffer.write(type.displayName);
+        });
+        buffer.write("}");
         needsComma = true;
       }
-      builder.append(")");
-      builder.append(Element.RIGHT_ARROW);
+      buffer.write(")");
+      buffer.write(Element.RIGHT_ARROW);
       if (returnType == null) {
-        builder.append("null");
+        buffer.write("null");
       } else {
-        builder.append(returnType.displayName);
+        buffer.write(returnType.displayName);
       }
-      name = builder.toString();
+      name = buffer.toString();
     }
     return name;
   }
@@ -5430,7 +5433,7 @@
         types.add(type);
       }
     }
-    return new List.from(types);
+    return types;
   }
 
   @override
@@ -5450,7 +5453,7 @@
         types.add(type);
       }
     }
-    return new List.from(types);
+    return types;
   }
 
   @override
@@ -5564,16 +5567,15 @@
       if (namedTypesT.length < namedTypesS.length) {
         return false;
       }
-      // Loop through each element in S verifying that T has a matching parameter name and that the
-      // corresponding type is more specific then the type in S.
-      JavaIterator<MapEntry<String, DartType>> iteratorS = new JavaIterator(getMapEntrySet(namedTypesS));
-      while (iteratorS.hasNext) {
-        MapEntry<String, DartType> entryS = iteratorS.next();
-        DartType typeT = namedTypesT[entryS.getKey()];
+      // Loop through each element in S verifying that T has a matching
+      // parameter name and that the corresponding type is more specific then
+      // the type in S.
+      for (String keyS in namedTypesS.keys) {
+        DartType typeT = namedTypesT[keyS];
         if (typeT == null) {
           return false;
         }
-        if (!(typeT as TypeImpl).isMoreSpecificThan2(entryS.getValue(), withDynamic, visitedTypePairs)) {
+        if (!(typeT as TypeImpl).isMoreSpecificThan2(namedTypesS[keyS], withDynamic, visitedTypePairs)) {
           return false;
         }
       }
@@ -5656,65 +5658,65 @@
   }
 
   @override
-  void appendTo(JavaStringBuilder builder) {
+  void appendTo(StringBuffer buffer) {
     List<DartType> normalParameterTypes = this.normalParameterTypes;
     List<DartType> optionalParameterTypes = this.optionalParameterTypes;
     Map<String, DartType> namedParameterTypes = this.namedParameterTypes;
     DartType returnType = this.returnType;
-    builder.append("(");
+    buffer.write("(");
     bool needsComma = false;
     if (normalParameterTypes.length > 0) {
       for (DartType type in normalParameterTypes) {
         if (needsComma) {
-          builder.append(", ");
+          buffer.write(", ");
         } else {
           needsComma = true;
         }
-        (type as TypeImpl).appendTo(builder);
+        (type as TypeImpl).appendTo(buffer);
       }
     }
     if (optionalParameterTypes.length > 0) {
       if (needsComma) {
-        builder.append(", ");
+        buffer.write(", ");
         needsComma = false;
       }
-      builder.append("[");
+      buffer.write("[");
       for (DartType type in optionalParameterTypes) {
         if (needsComma) {
-          builder.append(", ");
+          buffer.write(", ");
         } else {
           needsComma = true;
         }
-        (type as TypeImpl).appendTo(builder);
+        (type as TypeImpl).appendTo(buffer);
       }
-      builder.append("]");
+      buffer.write("]");
       needsComma = true;
     }
     if (namedParameterTypes.length > 0) {
       if (needsComma) {
-        builder.append(", ");
+        buffer.write(", ");
         needsComma = false;
       }
-      builder.append("{");
-      for (MapEntry<String, DartType> entry in getMapEntrySet(namedParameterTypes)) {
+      buffer.write("{");
+      namedParameterTypes.forEach((String name, DartType type) {
         if (needsComma) {
-          builder.append(", ");
+          buffer.write(", ");
         } else {
           needsComma = true;
         }
-        builder.append(entry.getKey());
-        builder.append(": ");
-        (entry.getValue() as TypeImpl).appendTo(builder);
-      }
-      builder.append("}");
+        buffer.write(name);
+        buffer.write(": ");
+        (type as TypeImpl).appendTo(buffer);
+      });
+      buffer.write("}");
       needsComma = true;
     }
-    builder.append(")");
-    builder.append(Element.RIGHT_ARROW);
+    buffer.write(")");
+    buffer.write(Element.RIGHT_ARROW);
     if (returnType == null) {
-      builder.append("null");
+      buffer.write("null");
     } else {
-      (returnType as TypeImpl).appendTo(builder);
+      (returnType as TypeImpl).appendTo(buffer);
     }
   }
 
@@ -5792,16 +5794,15 @@
       if (namedTypesT.length < namedTypesS.length) {
         return false;
       }
-      // Loop through each element in S verifying that T has a matching parameter name and that the
-      // corresponding type is assignable to the type in S.
-      JavaIterator<MapEntry<String, DartType>> iteratorS = new JavaIterator(getMapEntrySet(namedTypesS));
-      while (iteratorS.hasNext) {
-        MapEntry<String, DartType> entryS = iteratorS.next();
-        DartType typeT = namedTypesT[entryS.getKey()];
+      // Loop through each element in S verifying that T has a matching
+      // parameter name and that the corresponding type is assignable to the
+      // type in S.
+      for (String keyS in namedTypesS.keys) {
+        DartType typeT = namedTypesT[keyS];
         if (typeT == null) {
           return false;
         }
-        if (!(typeT as TypeImpl).isAssignableTo2(entryS.getValue(), visitedTypePairs)) {
+        if (!(typeT as TypeImpl).isAssignableTo2(namedTypesS[keyS], visitedTypePairs)) {
           return false;
         }
       }
@@ -6069,10 +6070,10 @@
   }
 
   @override
-  void appendTo(JavaStringBuilder builder) {
-    builder.append("[");
-    builder.append(name);
-    builder.append("]");
+  void appendTo(StringBuffer buffer) {
+    buffer.write("[");
+    buffer.write(name);
+    buffer.write("]");
   }
 }
 
@@ -6103,16 +6104,16 @@
 
   @override
   String toString() {
-    JavaStringBuilder builder = new JavaStringBuilder();
-    builder.append("show ");
+    StringBuffer buffer = new StringBuffer();
+    buffer.write("show ");
     int count = hiddenNames.length;
     for (int i = 0; i < count; i++) {
       if (i > 0) {
-        builder.append(", ");
+        buffer.write(", ");
       }
-      builder.append(hiddenNames[i]);
+      buffer.write(hiddenNames[i]);
     }
-    return builder.toString();
+    return buffer.toString();
   }
 }
 
@@ -6251,11 +6252,11 @@
   }
 
   @override
-  void appendTo(JavaStringBuilder builder) {
+  void appendTo(StringBuffer buffer) {
     if (source == null) {
-      builder.append("{HTML file}");
+      buffer.write("{HTML file}");
     } else {
-      builder.append(source.fullName);
+      buffer.write(source.fullName);
     }
   }
 
@@ -6399,13 +6400,13 @@
   }
 
   @override
-  void appendTo(JavaStringBuilder builder) {
-    builder.append("import ");
-    (importedLibrary as LibraryElementImpl).appendTo(builder);
+  void appendTo(StringBuffer buffer) {
+    buffer.write("import ");
+    (importedLibrary as LibraryElementImpl).appendTo(buffer);
   }
 
   @override
-  String get identifier => "${(importedLibrary as LibraryElementImpl).identifier}@${nameOffset}";
+  String get identifier => "${(importedLibrary as LibraryElementImpl).identifier}@$nameOffset";
 }
 
 /**
@@ -6903,18 +6904,18 @@
     }
     // If there is at least one non-dynamic type, then list them out
     if (!allDynamic) {
-      JavaStringBuilder builder = new JavaStringBuilder();
-      builder.append(name);
-      builder.append("<");
+      StringBuffer buffer = new StringBuffer();
+      buffer.write(name);
+      buffer.write("<");
       for (int i = 0; i < typeArguments.length; i++) {
         if (i != 0) {
-          builder.append(", ");
+          buffer.write(", ");
         }
         DartType typeArg = typeArguments[i];
-        builder.append(typeArg.displayName);
+        buffer.write(typeArg.displayName);
       }
-      builder.append(">");
-      name = builder.toString();
+      buffer.write(">");
+      name = buffer.toString();
     }
     return name;
   }
@@ -7268,18 +7269,18 @@
   }
 
   @override
-  void appendTo(JavaStringBuilder builder) {
-    builder.append(name);
+  void appendTo(StringBuffer buffer) {
+    buffer.write(name);
     int argumentCount = typeArguments.length;
     if (argumentCount > 0) {
-      builder.append("<");
+      buffer.write("<");
       for (int i = 0; i < argumentCount; i++) {
         if (i > 0) {
-          builder.append(", ");
+          buffer.write(", ");
         }
-        (typeArguments[i] as TypeImpl).appendTo(builder);
+        (typeArguments[i] as TypeImpl).appendTo(buffer);
       }
-      builder.append(">");
+      buffer.write(">");
     }
   }
 
@@ -7506,7 +7507,7 @@
 
   String _attributeName;
 
-  IsTagHasAttributeSelectorElementImpl(String tagName, String attributeName) : super("${tagName}[${attributeName}]", -1) {
+  IsTagHasAttributeSelectorElementImpl(String tagName, String attributeName) : super("$tagName[$attributeName]", -1) {
     this._tagName = tagName;
     this._attributeName = attributeName;
   }
@@ -7922,7 +7923,7 @@
         importList.add(_imports[i]);
       }
     }
-    return new List.from(importList);
+    return importList;
   }
 
   @override
@@ -8342,14 +8343,14 @@
   }
 
   @override
-  void appendTo(JavaStringBuilder builder) {
-    builder.append(type);
-    builder.append(" ");
-    builder.append(displayName);
+  void appendTo(StringBuffer buffer) {
+    buffer.write(type);
+    buffer.write(" ");
+    buffer.write(displayName);
   }
 
   @override
-  String get identifier => "${super.identifier}@${nameOffset}";
+  String get identifier => "${super.identifier}@$nameOffset";
 }
 
 /**
@@ -8630,11 +8631,11 @@
   }
 
   @override
-  void appendTo(JavaStringBuilder builder) {
-    builder.append(enclosingElement.displayName);
-    builder.append(".");
-    builder.append(displayName);
-    super.appendTo(builder);
+  void appendTo(StringBuffer buffer) {
+    buffer.write(enclosingElement.displayName);
+    buffer.write(".");
+    buffer.write(displayName);
+    super.appendTo(buffer);
   }
 }
 
@@ -8698,24 +8699,24 @@
     MethodElement baseElement = this.baseElement;
     List<ParameterElement> parameters = this.parameters;
     FunctionType type = this.type;
-    JavaStringBuilder builder = new JavaStringBuilder();
-    builder.append(baseElement.enclosingElement.displayName);
-    builder.append(".");
-    builder.append(baseElement.displayName);
-    builder.append("(");
+    StringBuffer buffer = new StringBuffer();
+    buffer.write(baseElement.enclosingElement.displayName);
+    buffer.write(".");
+    buffer.write(baseElement.displayName);
+    buffer.write("(");
     int parameterCount = parameters.length;
     for (int i = 0; i < parameterCount; i++) {
       if (i > 0) {
-        builder.append(", ");
+        buffer.write(", ");
       }
-      builder.append(parameters[i]).toString();
+      buffer.write(parameters[i]);
     }
-    builder.append(")");
+    buffer.write(")");
     if (type != null) {
-      builder.append(Element.RIGHT_ARROW);
-      builder.append(type.returnType);
+      buffer.write(Element.RIGHT_ARROW);
+      buffer.write(type.returnType);
     }
-    return builder.toString();
+    return buffer.toString();
   }
 }
 
@@ -9032,17 +9033,17 @@
 
   @override
   String toString() {
-    JavaStringBuilder builder = new JavaStringBuilder();
-    builder.append("[");
+    StringBuffer buffer = new StringBuffer();
+    buffer.write("[");
     int count = conflictingElements.length;
     for (int i = 0; i < count; i++) {
       if (i > 0) {
-        builder.append(", ");
+        buffer.write(", ");
       }
-      (conflictingElements[i] as ElementImpl).appendTo(builder);
+      (conflictingElements[i] as ElementImpl).appendTo(buffer);
     }
-    builder.append("]");
-    return builder.toString();
+    buffer.write("]");
+    return buffer.toString();
   }
 
   @override
@@ -9302,7 +9303,7 @@
   }
 
   @override
-  void appendTo(JavaStringBuilder builder) {
+  void appendTo(StringBuffer buffer) {
     String left = "";
     String right = "";
     while (true) {
@@ -9316,9 +9317,9 @@
       }
       break;
     }
-    builder.append(left);
-    appendToWithoutDelimiters(builder);
-    builder.append(right);
+    buffer.write(left);
+    appendToWithoutDelimiters(buffer);
+    buffer.write(right);
   }
 
   /**
@@ -9326,18 +9327,18 @@
    *
    * @param builder the builder to which the type and name are to be appended
    */
-  void appendToWithoutDelimiters(JavaStringBuilder builder) {
-    builder.append(type);
-    builder.append(" ");
-    builder.append(displayName);
+  void appendToWithoutDelimiters(StringBuffer buffer) {
+    buffer.write(type);
+    buffer.write(" ");
+    buffer.write(displayName);
     if (_defaultValueCode != null) {
       if (parameterKind == ParameterKind.NAMED) {
-        builder.append(": ");
+        buffer.write(": ");
       }
       if (parameterKind == ParameterKind.POSITIONAL) {
-        builder.append(" = ");
+        buffer.write(" = ");
       }
-      builder.append(_defaultValueCode);
+      buffer.write(_defaultValueCode);
     }
   }
 }
@@ -9458,13 +9459,7 @@
       }
       break;
     }
-    JavaStringBuilder builder = new JavaStringBuilder();
-    builder.append(left);
-    builder.append(type);
-    builder.append(" ");
-    builder.append(baseElement.displayName);
-    builder.append(right);
-    return builder.toString();
+    return '$left$type ${baseElement.displayName}$right';
   }
 
   @override
@@ -9777,9 +9772,9 @@
   }
 
   @override
-  void appendTo(JavaStringBuilder builder) {
-    builder.append("as ");
-    super.appendTo(builder);
+  void appendTo(StringBuffer buffer) {
+    buffer.write("as ");
+    super.appendTo(buffer);
   }
 
   @override
@@ -9987,17 +9982,17 @@
   }
 
   @override
-  void appendTo(JavaStringBuilder builder) {
-    builder.append(isGetter ? "get " : "set ");
-    builder.append(variable.displayName);
-    super.appendTo(builder);
+  void appendTo(StringBuffer buffer) {
+    buffer.write(isGetter ? "get " : "set ");
+    buffer.write(variable.displayName);
+    super.appendTo(buffer);
   }
 
   @override
   String get identifier {
     String name = displayName;
     String suffix = isGetter ? "?" : "=";
-    return "${name}${suffix}";
+    return "$name$suffix";
   }
 }
 
@@ -10107,27 +10102,27 @@
     PropertyAccessorElement baseElement = this.baseElement;
     List<ParameterElement> parameters = this.parameters;
     FunctionType type = this.type;
-    JavaStringBuilder builder = new JavaStringBuilder();
+    StringBuffer builder = new StringBuffer();
     if (isGetter) {
-      builder.append("get ");
+      builder.write("get ");
     } else {
-      builder.append("set ");
+      builder.write("set ");
     }
-    builder.append(baseElement.enclosingElement.displayName);
-    builder.append(".");
-    builder.append(baseElement.displayName);
-    builder.append("(");
+    builder.write(baseElement.enclosingElement.displayName);
+    builder.write(".");
+    builder.write(baseElement.displayName);
+    builder.write("(");
     int parameterCount = parameters.length;
     for (int i = 0; i < parameterCount; i++) {
       if (i > 0) {
-        builder.append(", ");
+        builder.write(", ");
       }
-      builder.append(parameters[i]).toString();
+      builder.write(parameters[i]);
     }
-    builder.append(")");
+    builder.write(")");
     if (type != null) {
-      builder.append(Element.RIGHT_ARROW);
-      builder.append(type.returnType);
+      builder.write(Element.RIGHT_ARROW);
+      builder.write(type.returnType);
     }
     return builder.toString();
   }
@@ -10492,16 +10487,16 @@
 
   @override
   String toString() {
-    JavaStringBuilder builder = new JavaStringBuilder();
-    builder.append("show ");
+    StringBuffer buffer = new StringBuffer();
+    buffer.write("show ");
     int count = shownNames.length;
     for (int i = 0; i < count; i++) {
       if (i > 0) {
-        builder.append(", ");
+        buffer.write(", ");
       }
-      builder.append(shownNames[i]);
+      buffer.write(shownNames[i]);
     }
-    return builder.toString();
+    return buffer.toString();
   }
 }
 
@@ -10880,21 +10875,19 @@
 
   @override
   String toString() {
-    JavaStringBuilder builder = new JavaStringBuilder();
-    appendTo(builder);
-    return builder.toString();
+    StringBuffer buffer = new StringBuffer();
+    appendTo(buffer);
+    return buffer.toString();
   }
 
   /**
-   * Append a textual representation of this type to the given builder.
-   *
-   * @param builder the builder to which the text is to be appended
+   * Append a textual representation of this type to the given [buffer].
    */
-  void appendTo(JavaStringBuilder builder) {
+  void appendTo(StringBuffer buffer) {
     if (name == null) {
-      builder.append("<unnamed type>");
+      buffer.write("<unnamed type>");
     } else {
-      builder.append(name);
+      buffer.write(name);
     }
   }
 
@@ -11009,11 +11002,11 @@
   ElementKind get kind => ElementKind.TYPE_PARAMETER;
 
   @override
-  void appendTo(JavaStringBuilder builder) {
-    builder.append(displayName);
+  void appendTo(StringBuffer buffer) {
+    buffer.write(displayName);
     if (bound != null) {
-      builder.append(" extends ");
-      builder.append(bound);
+      buffer.write(" extends ");
+      buffer.write(bound);
     }
   }
 }
@@ -11267,7 +11260,7 @@
       // instead of raising an exception.
       throw new IllegalArgumentException("No known use case for empty unions.");
     } else if (set.length == 1) {
-      return new JavaIterator(set).next();
+      return set.first;
     } else {
       return new UnionTypeImpl(set);
     }
@@ -11299,15 +11292,15 @@
 
   @override
   String get displayName {
-    JavaStringBuilder builder = new JavaStringBuilder();
+    StringBuffer buffer = new StringBuffer();
     String prefix = "{";
     for (DartType t in _types) {
-      builder.append(prefix);
-      builder.append(t.displayName);
+      buffer.write(prefix);
+      buffer.write(t.displayName);
       prefix = ",";
     }
-    builder.append("}");
-    return builder.toString();
+    buffer.write("}");
+    return buffer.toString();
   }
 
   @override
@@ -11322,18 +11315,18 @@
     for (DartType t in _types) {
       out.add(t.substitute2(argumentTypes, parameterTypes));
     }
-    return union(new List.from(out));
+    return union(out);
   }
 
   @override
-  void appendTo(JavaStringBuilder builder) {
+  void appendTo(StringBuffer buffer) {
     String prefix = "{";
-    for (DartType t in _types) {
-      builder.append(prefix);
-      (t as TypeImpl).appendTo(builder);
+    for (DartType type in _types) {
+      buffer.write(prefix);
+      (type as TypeImpl).appendTo(buffer);
       prefix = ",";
     }
-    builder.append("}");
+    buffer.write("}");
   }
 
   @override
@@ -11663,10 +11656,10 @@
   }
 
   @override
-  void appendTo(JavaStringBuilder builder) {
-    builder.append(type);
-    builder.append(" ");
-    builder.append(displayName);
+  void appendTo(StringBuffer buffer) {
+    buffer.write(type);
+    buffer.write(" ");
+    buffer.write(displayName);
   }
 }
 
diff --git a/pkg/analyzer/lib/src/generated/engine.dart b/pkg/analyzer/lib/src/generated/engine.dart
index ea758e7..4de74d4 100644
--- a/pkg/analyzer/lib/src/generated/engine.dart
+++ b/pkg/analyzer/lib/src/generated/engine.dart
@@ -8,6 +8,7 @@
 library engine;
 
 import 'dart:collection';
+import "dart:math" as math;
 
 import 'package:analyzer/src/task/task_dart.dart';
 
@@ -1003,14 +1004,13 @@
   @override
   void applyAnalysisDelta(AnalysisDelta delta) {
     ChangeSet changeSet = new ChangeSet();
-    for (MapEntry<Source, AnalysisLevel> entry in getMapEntrySet(delta.analysisLevels)) {
-      Source source = entry.getKey();
-      if (entry.getValue() == AnalysisLevel.NONE) {
+    delta.analysisLevels.forEach((Source source, AnalysisLevel level) {
+      if (level == AnalysisLevel.NONE) {
         changeSet.removedSource(source);
       } else {
         changeSet.addedSource(source);
       }
-    }
+    });
     applyChanges(changeSet);
   }
 
@@ -1043,13 +1043,17 @@
       }
       _sourceChanged(source);
     }
-    for (MapEntry<Source, String> entry in getMapEntrySet(changeSet.changedContents)) {
-      setContents(entry.getKey(), entry.getValue());
-    }
-    for (MapEntry<Source, ChangeSet_ContentChange> entry in getMapEntrySet(changeSet.changedRanges)) {
-      ChangeSet_ContentChange change = entry.getValue();
-      setChangedContents(entry.getKey(), change.contents, change.offset, change.oldLength, change.newLength);
-    }
+    changeSet.changedContents.forEach((Source key, String value) {
+      setContents(key, value);
+    });
+    changeSet.changedRanges.forEach((Source source, ChangeSet_ContentChange change) {
+      setChangedContents(
+          source,
+          change.contents,
+          change.offset,
+          change.oldLength,
+          change.newLength);
+    });
     for (Source source in changeSet.deletedSources) {
       _sourceDeleted(source);
     }
@@ -1107,15 +1111,15 @@
         if (comment == null) {
           return null;
         }
-        JavaStringBuilder builder = new JavaStringBuilder();
+        StringBuffer buffer = new StringBuffer();
         List<Token> tokens = comment.tokens;
         for (int i = 0; i < tokens.length; i++) {
           if (i > 0) {
-            builder.append("\n");
+            buffer.write("\n");
           }
-          builder.append(tokens[i].lexeme);
+          buffer.write(tokens[i].lexeme);
         }
-        return builder.toString();
+        return buffer.toString();
       }
       nameNode = nameNode.parent;
     }
@@ -1160,7 +1164,7 @@
       if (errors.isEmpty) {
         return AnalysisError.NO_ERRORS;
       }
-      return new List.from(errors);
+      return errors;
     } else if (sourceEntry is HtmlEntry) {
       HtmlEntry htmlEntry = sourceEntry;
       try {
@@ -1209,7 +1213,7 @@
         return _getDartScanData2(source, SourceEntry.LINE_INFO, null);
       }
     } on ObsoleteSourceAnalysisException catch (exception) {
-      AnalysisEngine.instance.logger.logInformation2("Could not compute ${SourceEntry.LINE_INFO.toString()}", exception);
+      AnalysisEngine.instance.logger.logInformation2("Could not compute ${SourceEntry.LINE_INFO}", exception);
     }
     return null;
   }
@@ -1382,7 +1386,7 @@
     if (htmlSources.isEmpty) {
       return Source.EMPTY_ARRAY;
     }
-    return new List.from(htmlSources);
+    return htmlSources;
   }
 
   @override
@@ -1413,7 +1417,7 @@
         //          }
       }
     }
-    return new List.from(sources);
+    return sources;
   }
 
   @override
@@ -1432,7 +1436,7 @@
         //          }
       }
     }
-    return new List.from(sources);
+    return sources;
   }
 
   @override
@@ -1462,7 +1466,7 @@
     if (dependentLibraries.isEmpty) {
       return Source.EMPTY_ARRAY;
     }
-    return new List.from(dependentLibraries);
+    return dependentLibraries;
   }
 
   @override
@@ -1727,10 +1731,10 @@
     try {
       task.perform(_resultRecorder);
     } on ObsoleteSourceAnalysisException catch (exception) {
-      AnalysisEngine.instance.logger.logInformation2("Could not perform analysis task: ${taskDescription}", exception);
+      AnalysisEngine.instance.logger.logInformation2("Could not perform analysis task: $taskDescription", exception);
     } on AnalysisException catch (exception) {
       if (exception.cause is! JavaIOException) {
-        AnalysisEngine.instance.logger.logError2("Internal error while performing the task: ${task}", exception);
+        AnalysisEngine.instance.logger.logError2("Internal error while performing the task: $task", exception);
       }
     }
     int performEnd = JavaSystem.currentTimeMillis();
@@ -1755,9 +1759,7 @@
   @override
   void recordLibraryElements(Map<Source, LibraryElement> elementMap) {
     Source htmlSource = _sourceFactory.forUri(DartSdk.DART_HTML);
-    for (MapEntry<Source, LibraryElement> entry in getMapEntrySet(elementMap)) {
-      Source librarySource = entry.getKey();
-      LibraryElement library = entry.getValue();
+    elementMap.forEach((Source librarySource, LibraryElement library) {
       //
       // Cache the element in the library's info.
       //
@@ -1784,7 +1786,7 @@
         dartEntry.setValueInLibrary(DartEntry.VERIFICATION_ERRORS, librarySource, AnalysisError.NO_ERRORS);
         dartEntry.setValueInLibrary(DartEntry.HINTS, librarySource, AnalysisError.NO_ERRORS);
       }
-    }
+    });
   }
 
   @override
@@ -1861,7 +1863,7 @@
       // result in an infinite loop in performAnalysisTask() because re-caching one AST structure
       // can cause another priority source's AST structure to be flushed.
       //
-      int count = Math.min(sources.length, _options.cacheSize - _PRIORITY_ORDER_SIZE_DELTA);
+      int count = math.min(sources.length, _options.cacheSize - _PRIORITY_ORDER_SIZE_DELTA);
       _priorityOrder = new List<Source>(count);
       for (int i = 0; i < count; i++) {
         _priorityOrder[i] = sources[i];
@@ -2836,7 +2838,7 @@
     try {
       return _getDartParseData(source, dartEntry, descriptor);
     } on ObsoleteSourceAnalysisException catch (exception) {
-      AnalysisEngine.instance.logger.logInformation2("Could not compute ${descriptor.toString()}", exception);
+      AnalysisEngine.instance.logger.logInformation2("Could not compute $descriptor", exception);
       return defaultValue;
     }
   }
@@ -2890,7 +2892,7 @@
     try {
       return _getDartResolutionData(unitSource, librarySource, dartEntry, descriptor);
     } on ObsoleteSourceAnalysisException catch (exception) {
-      AnalysisEngine.instance.logger.logInformation2("Could not compute ${descriptor.toString()}", exception);
+      AnalysisEngine.instance.logger.logInformation2("Could not compute $descriptor", exception);
       return defaultValue;
     }
   }
@@ -2935,7 +2937,7 @@
     try {
       return _getDartScanData(source, dartEntry, descriptor);
     } on ObsoleteSourceAnalysisException catch (exception) {
-      AnalysisEngine.instance.logger.logInformation2("Could not compute ${descriptor.toString()}", exception);
+      AnalysisEngine.instance.logger.logInformation2("Could not compute $descriptor", exception);
       return defaultValue;
     }
   }
@@ -3009,7 +3011,7 @@
     try {
       return _getHtmlResolutionData2(source, htmlEntry, descriptor);
     } on ObsoleteSourceAnalysisException catch (exception) {
-      AnalysisEngine.instance.logger.logInformation2("Could not compute ${descriptor.toString()}", exception);
+      AnalysisEngine.instance.logger.logInformation2("Could not compute $descriptor", exception);
       return defaultValue;
     }
   }
@@ -3378,7 +3380,7 @@
         sources.add(iterator.key);
       }
     }
-    return new List.from(sources);
+    return sources;
   }
 
   /**
@@ -3603,7 +3605,7 @@
       }
     }
     // invalidate Angular applications
-    List<AngularApplication> angularApplicationsCopy = [];
+    List<AngularApplication> angularApplicationsCopy = <AngularApplication>[];
     for (AngularApplication application in angularApplicationsCopy) {
       if (application.dependsOn(librarySource)) {
         Source entryPointSource = application.entryPoint;
@@ -4230,9 +4232,7 @@
    * @param oldPartMap the table containing the parts associated with each library
    */
   void _removeFromPartsUsingMap(HashMap<Source, List<Source>> oldPartMap) {
-    for (MapEntry<Source, List<Source>> entry in getMapEntrySet(oldPartMap)) {
-      Source librarySource = entry.getKey();
-      List<Source> oldParts = entry.getValue();
+    oldPartMap.forEach((Source librarySource, List<Source> oldParts) {
       for (int i = 0; i < oldParts.length; i++) {
         Source partSource = oldParts[i];
         if (partSource != librarySource) {
@@ -4245,7 +4245,7 @@
           }
         }
       }
-    }
+    });
   }
 
   /**
@@ -4416,21 +4416,21 @@
     }
     int consistencyCheckEnd = JavaSystem.nanoTime();
     if (changedSources.length > 0 || missingSources.length > 0) {
-      PrintStringWriter writer = new PrintStringWriter();
-      writer.print("Consistency check took ");
-      writer.print((consistencyCheckEnd - consistencyCheckStart) / 1000000.0);
-      writer.println(" ms and found");
-      writer.print("  ");
-      writer.print(changedSources.length);
-      writer.println(" inconsistent entries");
-      writer.print("  ");
-      writer.print(missingSources.length);
-      writer.println(" missing sources");
+      StringBuffer buffer = new StringBuffer();
+      buffer.write("Consistency check took ");
+      buffer.write((consistencyCheckEnd - consistencyCheckStart) / 1000000.0);
+      buffer.writeln(" ms and found");
+      buffer.write("  ");
+      buffer.write(changedSources.length);
+      buffer.writeln(" inconsistent entries");
+      buffer.write("  ");
+      buffer.write(missingSources.length);
+      buffer.writeln(" missing sources");
       for (Source source in missingSources) {
-        writer.print("    ");
-        writer.println(source.fullName);
+        buffer.write("    ");
+        buffer.writeln(source.fullName);
       }
-      _logInformation(writer.toString());
+      _logInformation(buffer.toString());
     }
     return changedSources.length > 0;
   }
@@ -4707,7 +4707,7 @@
           _dependencyGraph.addEdge(library, importedLibrary);
         }
       }
-      library.importedLibraries = new List.from(importedLibraries);
+      library.importedLibraries = importedLibraries;
     } else {
       library.explicitlyImportsCore = false;
       ResolvableLibrary importedLibrary = _libraryMap[AnalysisContextImpl_this._coreLibrarySource];
@@ -4745,7 +4745,7 @@
           _dependencyGraph.addEdge(library, exportedLibrary);
         }
       }
-      library.exportedLibraries = new List.from(exportedLibraries);
+      library.exportedLibraries = exportedLibraries;
     }
   }
 
@@ -5052,7 +5052,7 @@
   @override
   String toString() {
     if (task == null) {
-      return "blocked: ${_blocked}";
+      return "blocked: $_blocked";
     }
     return task.toString();
   }
@@ -5101,10 +5101,8 @@
   }
 
   @override
-  List<AnalysisContextStatistics_CacheRow> get cacheRows {
-    Iterable<AnalysisContextStatistics_CacheRow> items = _dataMap.values;
-    return new List.from(items);
-  }
+  List<AnalysisContextStatistics_CacheRow> get cacheRows
+      => _dataMap.values.toList();
 
   @override
   List<CaughtException> get exceptions => new List.from(_exceptions);
@@ -5113,7 +5111,7 @@
   List<AnalysisContextStatistics_PartitionData> get partitionData => _partitionData;
 
   @override
-  List<Source> get sources => new List.from(_sources);
+  List<Source> get sources => _sources;
 
   void putCacheItem(SourceEntry dartEntry, DataDescriptor descriptor) {
     _internalPutCacheItem(dartEntry, descriptor, dartEntry.getState(descriptor));
@@ -5307,38 +5305,34 @@
 
   @override
   String toString() {
-    JavaStringBuilder builder = new JavaStringBuilder();
-    bool needsSeparator = _appendSources(builder, false, AnalysisLevel.ALL);
-    needsSeparator = _appendSources(builder, needsSeparator, AnalysisLevel.RESOLVED);
-    _appendSources(builder, needsSeparator, AnalysisLevel.NONE);
-    return builder.toString();
+    StringBuffer buffer = new StringBuffer();
+    bool needsSeparator = _appendSources(buffer, false, AnalysisLevel.ALL);
+    needsSeparator = _appendSources(buffer, needsSeparator, AnalysisLevel.RESOLVED);
+    _appendSources(buffer, needsSeparator, AnalysisLevel.NONE);
+    return buffer.toString();
   }
 
   /**
-   * Append sources with the given analysis level, prefixed with a label and possibly a separator.
-   *
-   * @param builder the builder to which the sources are to be appended
-   * @param needsSeparator `true` if a separator is needed before the label
-   * @param level the analysis level of the sources to be appended
-   * @return `true` if future lists of sources will need a separator
+   * Appendto the given [builder] all sources with the given analysis [level],
+   * prefixed with a label and a separator if [needsSeparator] is `true`.
    */
-  bool _appendSources(JavaStringBuilder builder, bool needsSeparator, AnalysisLevel level) {
+  bool _appendSources(StringBuffer buffer, bool needsSeparator, AnalysisLevel level) {
     bool first = true;
-    for (MapEntry<Source, AnalysisLevel> entry in getMapEntrySet(_analysisMap)) {
-      if (entry.getValue() == level) {
+    _analysisMap.forEach((Source source, AnalysisLevel sourceLevel) {
+      if (sourceLevel == level) {
         if (first) {
           first = false;
           if (needsSeparator) {
-            builder.append("; ");
+            buffer.write("; ");
           }
-          builder.append(level);
-          builder.append(" ");
+          buffer.write(level);
+          buffer.write(" ");
         } else {
-          builder.append(", ");
+          buffer.write(", ");
         }
-        builder.append(entry.getKey().fullName);
+        buffer.write(source.fullName);
       }
-    }
+    });
     return needsSeparator || !first;
   }
 }
@@ -5942,7 +5936,7 @@
       _safelyPerform();
     } on AnalysisException catch (exception, stackTrace) {
       _thrownException = new CaughtException(exception, stackTrace);
-      AnalysisEngine.instance.logger.logInformation2("Task failed: ${taskDescription}", new CaughtException(exception, stackTrace));
+      AnalysisEngine.instance.logger.logInformation2("Task failed: $taskDescription", new CaughtException(exception, stackTrace));
     }
     return accept(visitor);
   }
@@ -6122,7 +6116,7 @@
    * Return Dart [Expression]s this Angular expression consists of.
    */
   List<Expression> get expressions {
-    List<Expression> expressions = [];
+    List<Expression> expressions = <Expression>[];
     expressions.add(expression);
     for (AngularFormatterNode formatter in formatters) {
       expressions.add(formatter.name);
@@ -6321,7 +6315,7 @@
 
   List<AngularElement> _angularElements;
 
-  List<NgProcessor> _processors = [];
+  List<NgProcessor> _processors = <NgProcessor>[];
 
   LibraryElementImpl _libraryElement;
 
@@ -6333,7 +6327,7 @@
 
   bool _isAngular = false;
 
-  List<LocalVariableElementImpl> _definedVariables = [];
+  List<LocalVariableElementImpl> _definedVariables = <LocalVariableElementImpl>[];
 
   Set<LibraryElement> _injectedLibraries = new Set();
 
@@ -6378,7 +6372,7 @@
         try {
           Source templateSource = _context.sourceFactory.forUri2(_source.resolveRelativeUri(parseUriWithException(templateUri)));
           if (!_context.exists(templateSource)) {
-            templateSource = _context.sourceFactory.resolveUri(_source, "package:${templateUri}");
+            templateSource = _context.sourceFactory.resolveUri(_source, "package:$templateUri");
             if (!_context.exists(templateSource)) {
               _errorListener.onError(new AnalysisError.con2(angularElement.source, hasTemplate.templateUriOffset, templateUri.length, AngularCode.URI_DOES_NOT_EXIST, [templateUri]));
               continue;
@@ -6541,7 +6535,7 @@
     List<Token> tokens = _splitAtBar(token);
     Expression mainExpression = _parseDartExpressionInToken(tokens[0]);
     // parse formatters
-    List<AngularFormatterNode> formatters = [];
+    List<AngularFormatterNode> formatters = <AngularFormatterNode>[];
     for (int i = 1; i < tokens.length; i++) {
       Token formatterToken = tokens[i];
       Token barToken = formatterToken;
@@ -6555,7 +6549,7 @@
       SimpleIdentifier name = nameExpression as SimpleIdentifier;
       formatterToken = name.endToken.next;
       // parse arguments
-      List<AngularFormatterArgument> arguments = [];
+      List<AngularFormatterArgument> arguments = <AngularFormatterArgument>[];
       while (formatterToken.type != TokenType.EOF) {
         // skip ":"
         Token colonToken = formatterToken;
@@ -6740,15 +6734,15 @@
   }
 
   void _parseEmbeddedExpressionsInAttribute(ht.XmlAttributeNode node) {
-    List<AngularMoustacheXmlExpression> expressions = [];
+    List<AngularMoustacheXmlExpression> expressions = <AngularMoustacheXmlExpression>[];
     _parseEmbeddedExpressions(expressions, node.valueToken);
     if (!expressions.isEmpty) {
-      node.expressions = new List.from(expressions);
+      node.expressions = expressions;
     }
   }
 
   void _parseEmbeddedExpressionsInTag(ht.XmlTagNode node) {
-    List<AngularMoustacheXmlExpression> expressions = [];
+    List<AngularMoustacheXmlExpression> expressions = <AngularMoustacheXmlExpression>[];
     ht.Token token = node.attributeEnd;
     ht.Token endToken = node.endToken;
     bool inChild = false;
@@ -6768,7 +6762,7 @@
       }
       token = token.next;
     }
-    node.expressions = new List.from(expressions);
+    node.expressions = expressions;
   }
 
   void _recordDefinedVariable(LocalVariableElementImpl variable) {
@@ -6839,13 +6833,13 @@
     _unit.accept(this);
     // simulate imports for injects
     {
-      List<ImportElement> imports = [];
+      List<ImportElement> imports = <ImportElement>[];
       for (LibraryElement injectedLibrary in _injectedLibraries) {
         ImportElementImpl importElement = new ImportElementImpl(-1);
         importElement.importedLibrary = injectedLibrary;
         imports.add(importElement);
       }
-      _libraryElement.imports = new List.from(imports);
+      _libraryElement.imports = imports;
     }
   }
 
@@ -6855,7 +6849,7 @@
   }
 
   List<Token> _splitAtBar(Token token) {
-    List<Token> tokens = [];
+    List<Token> tokens = <Token>[];
     tokens.add(token);
     while (token.type != TokenType.EOF) {
       if (token.type == TokenType.BAR) {
@@ -7431,7 +7425,7 @@
     this._errors = errors;
     this._lineInfo = lineInfo;
     if (lineInfo == null) {
-      AnalysisEngine.instance.logger.logInformation2("No line info: ${source}", new JavaException());
+      AnalysisEngine.instance.logger.logInformation2("No line info: $source", new JavaException());
     }
   }
 
@@ -7581,29 +7575,29 @@
 
   @override
   String toString() {
-    JavaStringBuilder builder = new JavaStringBuilder();
-    bool needsSeparator = _appendSources(builder, addedSources, false, "addedSources");
-    needsSeparator = _appendSources(builder, changedSources, needsSeparator, "changedSources");
-    needsSeparator = _appendSources2(builder, _changedContent, needsSeparator, "changedContent");
-    needsSeparator = _appendSources2(builder, changedRanges, needsSeparator, "changedRanges");
-    needsSeparator = _appendSources(builder, deletedSources, needsSeparator, "deletedSources");
-    needsSeparator = _appendSources(builder, removedSources, needsSeparator, "removedSources");
+    StringBuffer buffer = new StringBuffer();
+    bool needsSeparator = _appendSources(buffer, addedSources, false, "addedSources");
+    needsSeparator = _appendSources(buffer, changedSources, needsSeparator, "changedSources");
+    needsSeparator = _appendSources2(buffer, _changedContent, needsSeparator, "changedContent");
+    needsSeparator = _appendSources2(buffer, changedRanges, needsSeparator, "changedRanges");
+    needsSeparator = _appendSources(buffer, deletedSources, needsSeparator, "deletedSources");
+    needsSeparator = _appendSources(buffer, removedSources, needsSeparator, "removedSources");
     int count = removedContainers.length;
     if (count > 0) {
       if (removedSources.isEmpty) {
         if (needsSeparator) {
-          builder.append("; ");
+          buffer.write("; ");
         }
-        builder.append("removed: from ");
-        builder.append(count);
-        builder.append(" containers");
+        buffer.write("removed: from ");
+        buffer.write(count);
+        buffer.write(" containers");
       } else {
-        builder.append(", and more from ");
-        builder.append(count);
-        builder.append(" containers");
+        buffer.write(", and more from ");
+        buffer.write(count);
+        buffer.write(" containers");
       }
     }
-    return builder.toString();
+    return buffer.toString();
   }
 
   /**
@@ -7616,18 +7610,18 @@
    * @param label the label used to prefix the sources
    * @return `true` if future lists of sources will need a separator
    */
-  bool _appendSources(JavaStringBuilder builder, List<Source> sources, bool needsSeparator, String label) {
+  bool _appendSources(StringBuffer buffer, List<Source> sources, bool needsSeparator, String label) {
     if (sources.isEmpty) {
       return needsSeparator;
     }
     if (needsSeparator) {
-      builder.append("; ");
+      buffer.write("; ");
     }
-    builder.append(label);
+    buffer.write(label);
     String prefix = " ";
     for (Source source in sources) {
-      builder.append(prefix);
-      builder.append(source.fullName);
+      buffer.write(prefix);
+      buffer.write(source.fullName);
       prefix = ", ";
     }
     return true;
@@ -7643,18 +7637,18 @@
    * @param label the label used to prefix the sources
    * @return `true` if future lists of sources will need a separator
    */
-  bool _appendSources2(JavaStringBuilder builder, HashMap<Source, dynamic> sources, bool needsSeparator, String label) {
+  bool _appendSources2(StringBuffer buffer, HashMap<Source, dynamic> sources, bool needsSeparator, String label) {
     if (sources.isEmpty) {
       return needsSeparator;
     }
     if (needsSeparator) {
-      builder.append("; ");
+      buffer.write("; ");
     }
-    builder.append(label);
+    buffer.write(label);
     String prefix = " ";
     for (Source source in sources.keys.toSet()) {
-      builder.append(prefix);
-      builder.append(source.fullName);
+      buffer.write(prefix);
+      buffer.write(source.fullName);
       prefix = ", ";
     }
     return true;
@@ -7952,7 +7946,7 @@
     if (errors.length == 0) {
       return AnalysisError.NO_ERRORS;
     }
-    return new List.from(errors);
+    return errors;
   }
 
   /**
@@ -8010,7 +8004,7 @@
       }
       state = state._nextState;
     }
-    return new List.from(result);
+    return result;
   }
 
   /**
@@ -8930,7 +8924,7 @@
       _content = data.data;
       _modificationTime = data.modificationTime;
     } catch (exception, stackTrace) {
-      throw new AnalysisException("Could not get contents of ${source}", new CaughtException(exception, stackTrace));
+      throw new AnalysisException("Could not get contents of $source", new CaughtException(exception, stackTrace));
     }
   }
 }
@@ -9411,7 +9405,7 @@
   Source get source => cache != null ? cache.source : null;
 
   @override
-  String get taskDescription => "incremental analysis ${(cache != null ? cache.source : "null")}";
+  String get taskDescription => "incremental analysis ${cache != null ? cache.source : "null"}";
 
   @override
   void internalPerform() {
@@ -10688,7 +10682,7 @@
       errorListener.onError(new AnalysisError.con2(librarySource, uriLiteral.offset, uriLiteral.length, CompileTimeErrorCode.INVALID_URI, [uriContent]));
       return null;
     }
-    throw new RuntimeException(message: "Failed to handle validation code: ${code}");
+    throw new RuntimeException(message: "Failed to handle validation code: $code");
   }
 
   /**
@@ -10852,7 +10846,7 @@
                   _includedSources.add(referencedSource);
                 }
               } else {
-                throw new AnalysisException("${runtimeType.toString()} failed to handle a ${directive.runtimeType.toString()}");
+                throw new AnalysisException("$runtimeType failed to handle a ${directive.runtimeType}");
               }
             }
           }
@@ -11258,7 +11252,7 @@
 
   final ht.HtmlUnit _unit;
 
-  List<PolymerTagHtmlElement> _tagHtmlElements = [];
+  List<PolymerTagHtmlElement> _tagHtmlElements = <PolymerTagHtmlElement>[];
 
   ht.XmlTagNode _elementNode;
 
@@ -11309,18 +11303,18 @@
       return;
     }
     // prepare attribute name tokens
-    List<PolymerHtmlUnitBuilder_NameToken> nameTokens = [];
+    List<PolymerHtmlUnitBuilder_NameToken> nameTokens = <PolymerHtmlUnitBuilder_NameToken>[];
     {
       int index = 0;
       int textOffset = attributesAttribute.textOffset;
       int nameOffset = -1;
-      JavaStringBuilder nameBuilder = new JavaStringBuilder();
+      StringBuffer nameBuffer = new StringBuffer();
       while (index < attributesText.length) {
         int c = attributesText.codeUnitAt(index++);
         if (Character.isWhitespace(c)) {
           if (nameOffset != -1) {
-            nameTokens.add(new PolymerHtmlUnitBuilder_NameToken(nameOffset, nameBuilder.toString()));
-            nameBuilder = new JavaStringBuilder();
+            nameTokens.add(new PolymerHtmlUnitBuilder_NameToken(nameOffset, nameBuffer.toString()));
+            nameBuffer = new StringBuffer();
             nameOffset = -1;
           }
           continue;
@@ -11328,15 +11322,15 @@
         if (nameOffset == -1) {
           nameOffset = textOffset + index - 1;
         }
-        nameBuilder.appendChar(c);
+        nameBuffer.writeCharCode(c);
       }
       if (nameOffset != -1) {
-        nameTokens.add(new PolymerHtmlUnitBuilder_NameToken(nameOffset, nameBuilder.toString()));
-        nameBuilder = new JavaStringBuilder();
+        nameTokens.add(new PolymerHtmlUnitBuilder_NameToken(nameOffset, nameBuffer.toString()));
+        nameBuffer = new StringBuffer();
       }
     }
     // create attributes for name tokens
-    List<PolymerAttributeElement> attributes = [];
+    List<PolymerAttributeElement> attributes = <PolymerAttributeElement>[];
     Set<String> definedNames = new Set();
     ClassElement classElement = _dartElement.classElement;
     for (PolymerHtmlUnitBuilder_NameToken nameToken in nameTokens) {
@@ -11365,7 +11359,7 @@
       }
       attribute.field = field;
     }
-    _htmlElement.attributes = new List.from(attributes);
+    _htmlElement.attributes = attributes;
   }
 
   void _createTagHtmlElement(ht.XmlTagNode node) {
@@ -11634,16 +11628,15 @@
    * @return an array of errors (not `null`, contains no `null`s)
    */
   List<AnalysisError> get errors {
-    Iterable<MapEntry<Source, HashSet<AnalysisError>>> entrySet = getMapEntrySet(_errors);
-    int numEntries = entrySet.length;
+    int numEntries = _errors.length;
     if (numEntries == 0) {
       return AnalysisError.NO_ERRORS;
     }
     List<AnalysisError> resultList = new List<AnalysisError>();
-    for (MapEntry<Source, HashSet<AnalysisError>> entry in entrySet) {
-      resultList.addAll(entry.getValue());
+    for (HashSet<AnalysisError> errors in _errors.values) {
+      resultList.addAll(errors);
     }
-    return new List.from(resultList);
+    return resultList;
   }
 
   /**
@@ -12223,7 +12216,7 @@
   ht.HtmlUnit get resolvedUnit => _resolvedUnit;
 
   @override
-  String get taskDescription => "resolve as Angular template ${source}";
+  String get taskDescription => "resolve as Angular template $source";
 
   @override
   void internalPerform() {
@@ -13178,7 +13171,7 @@
     }
     CachedResult result = resultMap[CONTENT];
     if (result != null && result.state == CacheState.ERROR) {
-      String message = "contentState changing from ${result.state} to ${newState}";
+      String message = "contentState changing from ${result.state} to $newState";
       InstrumentationBuilder builder = Instrumentation.builder2("SourceEntry-validateStateChange");
       builder.data3("message", message);
       //builder.data("source", source.getFullName());
@@ -13399,7 +13392,7 @@
 
   @override
   String toString() {
-    JavaStringBuilder builder = new JavaStringBuilder();
+    StringBuffer buffer = new StringBuffer();
     List<SourcePriority> priorities = SourcePriority.values;
     bool needsSeparator = false;
     int queueCount = _workQueues.length;
@@ -13407,21 +13400,21 @@
       List<Source> queue = _workQueues[i];
       if (!queue.isEmpty) {
         if (needsSeparator) {
-          builder.append("; ");
+          buffer.write("; ");
         }
-        builder.append(priorities[i]);
-        builder.append(": ");
+        buffer.write(priorities[i]);
+        buffer.write(": ");
         int queueSize = queue.length;
         for (int j = 0; j < queueSize; j++) {
           if (j > 0) {
-            builder.append(", ");
+            buffer.write(", ");
           }
-          builder.append(queue[j].fullName);
+          buffer.write(queue[j].fullName);
         }
         needsSeparator = true;
       }
     }
-    return builder.toString();
+    return buffer.toString();
   }
 }
 
diff --git a/pkg/analyzer/lib/src/generated/error.dart b/pkg/analyzer/lib/src/generated/error.dart
index ba84adf..a197646 100644
--- a/pkg/analyzer/lib/src/generated/error.dart
+++ b/pkg/analyzer/lib/src/generated/error.dart
@@ -201,16 +201,16 @@
 
   @override
   String toString() {
-    JavaStringBuilder builder = new JavaStringBuilder();
-    builder.append((source != null) ? source.fullName : "<unknown source>");
-    builder.append("(");
-    builder.append(_offset);
-    builder.append("..");
-    builder.append(_offset + _length - 1);
-    builder.append("): ");
-    //builder.append("(" + lineNumber + ":" + columnNumber + "): ");
-    builder.append(_message);
-    return builder.toString();
+    StringBuffer buffer = new StringBuffer();
+    buffer.write((source != null) ? source.fullName : "<unknown source>");
+    buffer.write("(");
+    buffer.write(_offset);
+    buffer.write("..");
+    buffer.write(_offset + _length - 1);
+    buffer.write("): ");
+    //buffer.write("(" + lineNumber + ":" + columnNumber + "): ");
+    buffer.write(_message);
+    return buffer.toString();
   }
 }
 
@@ -357,7 +357,7 @@
   ErrorType get type => ErrorType.ANGULAR;
 
   @override
-  String get uniqueName => "${runtimeType.toString()}.${name}";
+  String get uniqueName => "$runtimeType.$name";
 }
 
 /**
@@ -525,7 +525,7 @@
   ErrorType get type => ErrorType.CHECKED_MODE_COMPILE_TIME_ERROR;
 
   @override
-  String get uniqueName => "${runtimeType.toString()}.${name}";
+  String get uniqueName => "$runtimeType.$name";
 }
 
 /**
@@ -2089,7 +2089,7 @@
   ErrorType get type => ErrorType.COMPILE_TIME_ERROR;
 
   @override
-  String get uniqueName => "${runtimeType.toString()}.${name}";
+  String get uniqueName => "$runtimeType.$name";
 }
 
 /**
@@ -2769,7 +2769,7 @@
   ErrorType get type => ErrorType.HINT;
 
   @override
-  String get uniqueName => "${runtimeType.toString()}.${name}";
+  String get uniqueName => "$runtimeType.$name";
 }
 
 /**
@@ -2830,7 +2830,7 @@
   ErrorType get type => ErrorType.STATIC_WARNING;
 
   @override
-  String get uniqueName => "${runtimeType.toString()}.${name}";
+  String get uniqueName => "$runtimeType.$name";
 }
 
 /**
@@ -2882,7 +2882,7 @@
   ErrorType get type => ErrorType.POLYMER;
 
   @override
-  String get uniqueName => "${runtimeType.toString()}.${name}";
+  String get uniqueName => "$runtimeType.$name";
 }
 
 /**
@@ -3243,7 +3243,7 @@
   ErrorType get type => ErrorType.STATIC_TYPE_WARNING;
 
   @override
-  String get uniqueName => "${runtimeType.toString()}.${name}";
+  String get uniqueName => "$runtimeType.$name";
 }
 
 /**
@@ -4173,7 +4173,7 @@
   ErrorType get type => ErrorType.STATIC_WARNING;
 
   @override
-  String get uniqueName => "${runtimeType.toString()}.${name}";
+  String get uniqueName => "$runtimeType.$name";
 }
 
 /**
@@ -4217,5 +4217,5 @@
   ErrorType get type => ErrorType.TODO;
 
   @override
-  String get uniqueName => "${runtimeType.toString()}.${name}";
+  String get uniqueName => "$runtimeType.$name";
 }
\ No newline at end of file
diff --git a/pkg/analyzer/lib/src/generated/html.dart b/pkg/analyzer/lib/src/generated/html.dart
index 1c2a2d8..41ae5ea 100644
--- a/pkg/analyzer/lib/src/generated/html.dart
+++ b/pkg/analyzer/lib/src/generated/html.dart
@@ -248,7 +248,7 @@
             String tag = _tail.lexeme;
             for (String str in _passThroughElements) {
               if (str == tag) {
-                endPassThrough = "</${str}>";
+                endPassThrough = "</$str>";
                 break;
               }
             }
@@ -341,17 +341,17 @@
 }
 
 class ExpressionVisitor_HtmlUnitUtils_getExpression extends ExpressionVisitor {
-  int offset = 0;
+  final int offset;
 
-  List<Expression> result;
+  Expression result;
 
-  ExpressionVisitor_HtmlUnitUtils_getExpression(this.offset, this.result) : super();
+  ExpressionVisitor_HtmlUnitUtils_getExpression(this.offset);
 
   @override
   void visitExpression(Expression expression) {
     Expression at = HtmlUnitUtils._getExpressionAt(expression, offset);
     if (at != null) {
-      result[0] = at;
+      result = at;
       throw new HtmlUnitUtils_FoundExpressionError();
     }
   }
@@ -383,7 +383,7 @@
   /**
    * A set containing the names of tags that do not have a closing tag.
    */
-  static Set<String> SELF_CLOSING = new HashSet<String>.from(JavaArrays.asList(<String> [
+  static Set<String> SELF_CLOSING = new HashSet<String>.from(<String>[
       "area",
       "base",
       "basefont",
@@ -396,7 +396,7 @@
       "link",
       "meta",
       "param",
-      "!"]));
+      "!"]);
 
   /**
    * Given the contents of an embedded expression that occurs at the given offset, parse it as a
@@ -628,11 +628,12 @@
     if (htmlUnit == null) {
       return null;
     }
-    List<XmlAttributeNode> result = [null];
+    RecursiveXmlVisitor_HtmlUnitUtils_getAttributeNode visitor
+        = new RecursiveXmlVisitor_HtmlUnitUtils_getAttributeNode(offset);
     try {
-      htmlUnit.accept(new RecursiveXmlVisitor_HtmlUnitUtils_getAttributeNode(offset, result));
+      htmlUnit.accept(visitor);
     } on HtmlUnitUtils_FoundAttributeNodeError catch (e) {
-      return result[0];
+      return visitor.result;
     }
     return null;
   }
@@ -678,11 +679,12 @@
     if (htmlUnit == null) {
       return null;
     }
-    List<XmlTagNode> result = [null];
+    RecursiveXmlVisitor_HtmlUnitUtils_getEnclosingTagNode visitor
+        = new RecursiveXmlVisitor_HtmlUnitUtils_getEnclosingTagNode(offset);
     try {
-      htmlUnit.accept(new RecursiveXmlVisitor_HtmlUnitUtils_getEnclosingTagNode(offset, result));
+      htmlUnit.accept(visitor);
     } on HtmlUnitUtils_FoundTagNodeError catch (e) {
-      return result[0];
+      return visitor.result;
     }
     return null;
   }
@@ -695,12 +697,13 @@
     if (htmlUnit == null) {
       return null;
     }
-    List<Expression> result = [null];
+    ExpressionVisitor_HtmlUnitUtils_getExpression visitor
+        = new ExpressionVisitor_HtmlUnitUtils_getExpression(offset);
     try {
       // TODO(scheglov) this code is very Angular specific
-      htmlUnit.accept(new ExpressionVisitor_HtmlUnitUtils_getExpression(offset, result));
+      htmlUnit.accept(visitor);
     } on HtmlUnitUtils_FoundExpressionError catch (e) {
-      return result[0];
+      return visitor.result;
     }
     return null;
   }
@@ -819,17 +822,17 @@
 }
 
 class RecursiveXmlVisitor_HtmlUnitUtils_getAttributeNode extends RecursiveXmlVisitor<Object> {
-  int offset = 0;
+  final int offset;
 
-  List<XmlAttributeNode> result;
+  XmlAttributeNode result;
 
-  RecursiveXmlVisitor_HtmlUnitUtils_getAttributeNode(this.offset, this.result) : super();
+  RecursiveXmlVisitor_HtmlUnitUtils_getAttributeNode(this.offset);
 
   @override
   Object visitXmlAttributeNode(XmlAttributeNode node) {
     Token nameToken = node.nameToken;
     if (nameToken.offset <= offset && offset <= nameToken.end) {
-      result[0] = node;
+      result = node;
       throw new HtmlUnitUtils_FoundAttributeNodeError();
     }
     return super.visitXmlAttributeNode(node);
@@ -837,16 +840,16 @@
 }
 
 class RecursiveXmlVisitor_HtmlUnitUtils_getEnclosingTagNode extends RecursiveXmlVisitor<Object> {
-  int offset = 0;
+  final int offset;
 
-  List<XmlTagNode> result;
+  XmlTagNode result;
 
-  RecursiveXmlVisitor_HtmlUnitUtils_getEnclosingTagNode(this.offset, this.result) : super();
+  RecursiveXmlVisitor_HtmlUnitUtils_getEnclosingTagNode(this.offset);
 
   @override
   Object visitXmlTagNode(XmlTagNode node) {
     if (node.offset <= offset && offset < node.end) {
-      result[0] = node;
+      result = node;
       super.visitXmlTagNode(node);
       throw new HtmlUnitUtils_FoundTagNodeError();
     }
@@ -1488,12 +1491,9 @@
       }
     }
     if (children != null) {
-      for (JavaIterator iter = new JavaIterator(children); iter.hasNext;) {
-        XmlNode node = iter.next();
+      children.forEach((XmlNode node) {
         node.parent = this;
-      }
-      // This will create ArrayList for exactly given number of elements.
-      return new List.from(children);
+      });
     }
     return children;
   }
@@ -1501,13 +1501,13 @@
   /**
    * This method exists for debugging purposes only.
    */
-  void _appendIdentifier(JavaStringBuilder builder, XmlNode node) {
+  void _appendIdentifier(StringBuffer buffer, XmlNode node) {
     if (node is XmlTagNode) {
-      builder.append(node.tag);
+      buffer.write(node.tag);
     } else if (node is XmlAttributeNode) {
-      builder.append(node.name);
+      buffer.write(node.name);
     } else {
-      builder.append("htmlUnit");
+      buffer.write("htmlUnit");
     }
   }
 
@@ -1515,23 +1515,23 @@
    * This method exists for debugging purposes only.
    */
   String _buildRecursiveStructureMessage(XmlNode newParent) {
-    JavaStringBuilder builder = new JavaStringBuilder();
-    builder.append("Attempt to create recursive structure: ");
+    StringBuffer buffer = new StringBuffer();
+    buffer.write("Attempt to create recursive structure: ");
     XmlNode current = newParent;
     while (current != null) {
       if (!identical(current, newParent)) {
-        builder.append(" -> ");
+        buffer.write(" -> ");
       }
       if (identical(current, this)) {
-        builder.appendChar(0x2A);
-        _appendIdentifier(builder, current);
-        builder.appendChar(0x2A);
+        buffer.writeCharCode(0x2A);
+        _appendIdentifier(buffer, current);
+        buffer.writeCharCode(0x2A);
       } else {
-        _appendIdentifier(builder, current);
+        _appendIdentifier(buffer, current);
       }
       current = current.parent;
     }
-    return builder.toString();
+    return buffer.toString();
   }
 
   /**
@@ -1952,27 +1952,27 @@
   Token get beginToken => nodeStart;
 
   /**
-   * Answer a string representing the content contained in the receiver. This includes the textual
-   * representation of any child tag nodes ([getTagNodes]). Whitespace between '&lt;',
-   * '&lt;/', and '>', '/>' is discarded, but all other whitespace is preserved.
-   *
-   * @return the content (not `null`)
+   * Return a string representing the content contained in the receiver. This
+   * includes the textual representation of any child tag nodes ([getTagNodes]).
+   * Whitespace between '&lt;', '&lt;/', and '>', '/>' is discarded, but all
+   * other whitespace is preserved.
    */
   String get content {
     Token token = attributeEnd.next;
     if (identical(token, contentEnd)) {
       return "";
     }
-    //TODO (danrubel): handle CDATA and replace HTML character encodings with the actual characters
+    // TODO(danrubel) Handle CDATA and replace HTML character encodings with
+    // the actual characters.
     String content = token.lexeme;
     token = token.next;
     if (identical(token, contentEnd)) {
       return content;
     }
-    JavaStringBuilder buffer = new JavaStringBuilder();
-    buffer.append(content);
+    StringBuffer buffer = new StringBuffer();
+    buffer.write(content);
     while (!identical(token, contentEnd)) {
-      buffer.append(token.lexeme);
+      buffer.write(token.lexeme);
       token = token.next;
     }
     return buffer.toString();
diff --git a/pkg/analyzer/lib/src/generated/java_core.dart b/pkg/analyzer/lib/src/generated/java_core.dart
index 16cfe12..a816069 100644
--- a/pkg/analyzer/lib/src/generated/java_core.dart
+++ b/pkg/analyzer/lib/src/generated/java_core.dart
@@ -1,7 +1,5 @@
 library java.core;
 
-import "dart:math" as math;
-
 final Stopwatch nanoTimeStopwatch = new Stopwatch();
 
 const int LONG_MAX_VALUE = 0x7fffffffffffffff;
@@ -51,7 +49,6 @@
     }
     return result;
   }
-  static List asList(List list) => list;
 }
 
 class Character {
@@ -119,20 +116,6 @@
   }
 }
 
-class CharSequence {
-  final String _content;
-  CharSequence(this._content);
-  static CharSequence wrap(String content) => new CharBuffer(content);
-  int charAt(int index) => _content.codeUnitAt(index);
-  int length() => _content.length;
-  String subSequence(int start, int end) => _content.substring(start, end);
-}
-
-class CharBuffer extends CharSequence {
-  CharBuffer(String content) : super(content);
-  static CharBuffer wrap(String content) => new CharBuffer(content);
-}
-
 class JavaString {
   static int indexOf(String target, String str, int fromIndex) {
     if (fromIndex > target.length) return -1;
@@ -248,6 +231,10 @@
     return iter.join(separator);
   }
 
+  static void printf(StringBuffer buffer, String fmt, List args) {
+    buffer.write(_printf(fmt, args));
+  }
+
   static String remove(String str, String remove) {
     if (isEmpty(str) || isEmpty(remove)) {
       return str;
@@ -283,11 +270,6 @@
   }
 }
 
-class Math {
-  static num max(num a, num b) => math.max(a, b);
-  static num min(num a, num b) => math.min(a, b);
-}
-
 class RuntimeException extends JavaException {
   RuntimeException({String message: "", Exception cause: null}) :
     super(message, cause);
@@ -298,7 +280,7 @@
   final Exception cause;
   JavaException([this.message = "", this.cause = null]);
   JavaException.withCause(this.cause) : message = null;
-  String toString() => "${runtimeType}: $message $cause";
+  String toString() => "$runtimeType: $message $cause";
 }
 
 class JavaIOException extends JavaException {
@@ -361,65 +343,6 @@
   MissingFormatArgumentException(this.s);
 }
 
-class JavaIterator<E> {
-  Iterable<E> _iterable;
-  List<E> _elements = new List<E>();
-  int _coPos = 0;
-  int _elPos = 0;
-  E _current = null;
-  JavaIterator(this._iterable) {
-    Iterator iterator = _iterable.iterator;
-    while (iterator.moveNext()) {
-      _elements.add(iterator.current);
-    }
-  }
-
-  bool get hasNext {
-    return _elPos < _elements.length;
-  }
-
-  E next() {
-    _current = _elements[_elPos];
-    _coPos++;
-    _elPos++;
-    return _current;
-  }
-
-  void remove() {
-    if (_iterable is List) {
-      _coPos--;
-      (_iterable as List).remove(_coPos);
-    } else if (_iterable is Set) {
-      (_iterable as Set).remove(_current);
-    } else {
-      throw new StateError("Unsupported iterable ${_iterable.runtimeType}");
-    }
-  }
-}
-
-class MapEntry<K, V> {
-  final Map<K, V> _map;
-  final K _key;
-  V _value;
-  MapEntry(this._map, this._key, this._value);
-  K getKey() => _key;
-  V getValue() => _value;
-  V setValue(V v) {
-    V prevValue = _value;
-    _value = v;
-    _map[_key] = v;
-    return prevValue;
-  }
-}
-
-Iterable<MapEntry> getMapEntrySet(Map m) {
-  List<MapEntry> result = [];
-  m.forEach((k, v) {
-    result.add(new MapEntry(m, k, v));
-  });
-  return result;
-}
-
 javaListSet(List list, int index, newValue) {
   var oldValue = list[index];
   list[index] = newValue;
@@ -434,12 +357,6 @@
   return a.containsAll(b) && b.containsAll(a);
 }
 
-javaMapPut(Map target, key, value) {
-  var oldValue = target[key];
-  target[key] = value;
-  return oldValue;
-}
-
 bool javaStringEqualsIgnoreCase(String a, String b) {
   return a.toLowerCase() == b.toLowerCase();
 }
@@ -454,48 +371,6 @@
   return t.substring(toffset, tend) == o.substring(ooffset, oend);
 }
 
-bool javaBooleanOr(bool a, bool b) {
-  return a || b;
-}
-
-bool javaBooleanAnd(bool a, bool b) {
-  return a && b;
-}
-
-int javaByte(Object o) {
-  return (o as int) & 0xFF;
-}
-
-class JavaStringBuilder {
-  StringBuffer sb = new StringBuffer();
-  String toString() => sb.toString();
-  JavaStringBuilder append(x) {
-    sb.write(x);
-    return this;
-  }
-  JavaStringBuilder appendChar(int c) {
-    sb.writeCharCode(c);
-    return this;
-  }
-  int get length => sb.length;
-  void set length(int newLength) {
-    if (newLength < 0) {
-      throw new StringIndexOutOfBoundsException(newLength);
-    }
-    if (sb.length < newLength) {
-      while (sb.length < newLength) {
-        sb.writeCharCode(0);
-      }
-    } else if (sb.length > newLength) {
-      var s = sb.toString().substring(0, newLength);
-      sb = new StringBuffer(s);
-    }
-  }
-  void clear() {
-    sb = new StringBuffer();
-  }
-}
-
 abstract class Enum<E extends Enum> implements Comparable<E> {
   /// The name of this enum constant, as declared in the enum declaration.
   final String name;
diff --git a/pkg/analyzer/lib/src/generated/java_engine.dart b/pkg/analyzer/lib/src/generated/java_engine.dart
index 374586f..0f787cb 100644
--- a/pkg/analyzer/lib/src/generated/java_engine.dart
+++ b/pkg/analyzer/lib/src/generated/java_engine.dart
@@ -40,6 +40,9 @@
     if (str == null || str.isEmpty) {
       return str;
     }
+    if (separator == null) {
+      return str;
+    }
     int pos = str.indexOf(separator);
     if (pos < 0) {
       return str;
@@ -207,24 +210,6 @@
   }
 }
 
-class ArrayUtils {
-  static List add(List target, Object value) {
-    target = new List.from(target);
-    target.add(value);
-    return target;
-  }
-  static List addAt(List target, int index, Object value) {
-    target = new List.from(target);
-    target.insert(index, value);
-    return target;
-  }
-  static List addAll(List target, List source) {
-    List result = new List.from(target);
-    result.addAll(source);
-    return result;
-  }
-}
-
 class ObjectUtilities {
   static int combineHashCodes(int first, int second) => first * 31 + second;
 }
diff --git a/pkg/analyzer/lib/src/generated/java_io.dart b/pkg/analyzer/lib/src/generated/java_io.dart
index b2c95e1..66e38d7 100644
--- a/pkg/analyzer/lib/src/generated/java_io.dart
+++ b/pkg/analyzer/lib/src/generated/java_io.dart
@@ -1,7 +1,7 @@
 library java.io;
 
 import "dart:io";
-import 'java_core.dart' show JavaIOException, CharSequence;
+import 'java_core.dart' show JavaIOException;
 import 'package:path/path.dart' as pathos;
 
 class JavaSystemIO {
diff --git a/pkg/analyzer/lib/src/generated/java_junit.dart b/pkg/analyzer/lib/src/generated/java_junit.dart
deleted file mode 100644
index 6f2c7da..0000000
--- a/pkg/analyzer/lib/src/generated/java_junit.dart
+++ /dev/null
@@ -1,144 +0,0 @@
-library java.junit;
-
-import 'package:unittest/unittest.dart' hide fail;
-import 'package:unittest/unittest.dart' as _ut show fail;
-
-
-class JUnitTestCase {
-  void setUp() {}
-  void tearDown() {}
-  static void fail(String msg) {
-    _ut.fail(msg);
-  }
-  static void assertTrue(bool x) {
-    expect(x, isTrue);
-  }
-  static void assertTrueMsg(String msg, bool x) {
-    expect(x, isTrueMsg(msg));
-  }
-  static void assertFalse(bool x) {
-    expect(x, isFalse);
-  }
-  static void assertFalseMsg(String msg, bool x) {
-    expect(x, isFalseMsg(msg));
-  }
-  static void assertNull(x) {
-    expect(x, isNull);
-  }
-  static void assertNullMsg(String msg, x) {
-    expect(x, isNullMsg(msg));
-  }
-  static void assertNotNull(x) {
-    expect(x, isNotNull);
-  }
-  static void assertNotNullMsg(String msg, x) {
-    expect(x, isNotNullMsg(msg));
-  }
-  static void assertEquals(expected, actual) {
-    expect(actual, equals(expected));
-  }
-  static void assertEqualsMsg(String msg, expected, actual) {
-    expect(actual, equalsMsg(msg, expected));
-  }
-  static void assertSame(expected, actual) {
-    expect(actual, same(expected));
-  }
-  static void assertSameMsg(String msg, expected, actual) {
-    expect(actual, sameMsg(msg, expected));
-  }
-  static void assertNotSame(expected, actual) {
-    expect(actual, notSame(expected));
-  }
-}
-
-runJUnitTest(testInstance, Function testFunction) {
-  testInstance.setUp();
-  try {
-    testFunction();
-  } finally {
-    testInstance.tearDown();
-  }
-}
-
-/**
- * Returns a matches that matches if the value is not the same instance as "object" (`!==`).
- */
-Matcher notSame(expected) => new _IsNotSameAs(expected);
-
-class _IsNotSameAs extends Matcher {
-  final _expected;
-  const _IsNotSameAs(this._expected);
-  bool matches(item, Map matchState) => !identical(item, _expected);
-  Description describe(Description description) =>
-      description.add('not same instance as ').addDescriptionOf(_expected);
-}
-
-Matcher equalsMsg(String msg, expected) => new _EqualsWithMessage(msg, expected);
-class _EqualsWithMessage extends Matcher {
-  final String msg;
-  final expectedValue;
-  const _EqualsWithMessage(this.msg, this.expectedValue);
-  bool matches(item, Map matchState) {
-    return item == expectedValue;
-  }
-  Description describe(Description mismatchDescription) {
-    return mismatchDescription.replace(msg);
-  }
-}
-
-Matcher sameMsg(String msg, expected) => new _IsSameAsWithMessage(msg, expected);
-class _IsSameAsWithMessage extends Matcher {
-  final String msg;
-  final _expected;
-  const _IsSameAsWithMessage(this.msg, this._expected);
-  bool matches(item, Map matchState) => identical(item, _expected);
-  Description describe(Description description) => description.add(msg).addDescriptionOf(_expected);
-}
-
-Matcher isTrueMsg(String msg) => new _IsTrueWithMessage(msg);
-class _IsTrueWithMessage extends Matcher {
-  final String msg;
-  const _IsTrueWithMessage(this.msg);
-  bool matches(item, Map matchState) {
-    return item == true;
-  }
-  Description describe(Description mismatchDescription) {
-    return mismatchDescription.replace(msg);
-  }
-}
-
-Matcher isFalseMsg(String msg) => new _IsFalseWithMessage(msg);
-class _IsFalseWithMessage extends Matcher {
-  final String msg;
-  const _IsFalseWithMessage(this.msg);
-  bool matches(item, Map matchState) {
-    return item == false;
-  }
-  Description describe(Description mismatchDescription) {
-    return mismatchDescription.replace(msg);
-  }
-}
-
-Matcher isNullMsg(String msg) => new _IsNullWithMessage(msg);
-class _IsNullWithMessage extends Matcher {
-  final String msg;
-  const _IsNullWithMessage(this.msg);
-  bool matches(item, Map matchState) {
-    return item == null;
-  }
-  Description describe(Description mismatchDescription) {
-    return mismatchDescription.replace(msg);
-  }
-}
-
-Matcher isNotNullMsg(String msg) => new _IsNotNullWithMessage(msg);
-class _IsNotNullWithMessage extends Matcher {
-  final String msg;
-  const _IsNotNullWithMessage(this.msg);
-  bool matches(item, Map matchState) {
-    return item != null;
-  }
-  Description describe(Description mismatchDescription) {
-    return mismatchDescription.replace(msg);
-  }
-}
diff --git a/pkg/analyzer/lib/src/generated/parser.dart b/pkg/analyzer/lib/src/generated/parser.dart
index c776fb3..a609a4a 100644
--- a/pkg/analyzer/lib/src/generated/parser.dart
+++ b/pkg/analyzer/lib/src/generated/parser.dart
@@ -8,6 +8,8 @@
 library engine.parser;
 
 import 'dart:collection';
+import "dart:math" as math;
+
 import 'java_core.dart';
 import 'java_engine.dart';
 import 'instrumentation.dart';
@@ -1171,7 +1173,7 @@
    * @param visitedNode the visited node that should have been the parent of the node to be replaced
    */
   AstNode _notAChild(AstNode visitedNode) {
-    throw new IncrementalParseException.con1("Internal error: the visited node (a ${visitedNode.runtimeType.toString()}) was not the parent of the node to be replaced (a ${_oldNode.runtimeType.toString()})");
+    throw new IncrementalParseException.con1("Internal error: the visited node (a ${visitedNode.runtimeType}) was not the parent of the node to be replaced (a ${_oldNode.runtimeType})");
   }
 }
 
@@ -1429,15 +1431,15 @@
 
   @override
   String toString() {
-    JavaStringBuilder builder = new JavaStringBuilder();
-    bool needsSpace = _appendKeyword(builder, false, abstractKeyword);
-    needsSpace = _appendKeyword(builder, needsSpace, constKeyword);
-    needsSpace = _appendKeyword(builder, needsSpace, externalKeyword);
-    needsSpace = _appendKeyword(builder, needsSpace, factoryKeyword);
-    needsSpace = _appendKeyword(builder, needsSpace, finalKeyword);
-    needsSpace = _appendKeyword(builder, needsSpace, staticKeyword);
-    _appendKeyword(builder, needsSpace, varKeyword);
-    return builder.toString();
+    StringBuffer buffer = new StringBuffer();
+    bool needsSpace = _appendKeyword(buffer, false, abstractKeyword);
+    needsSpace = _appendKeyword(buffer, needsSpace, constKeyword);
+    needsSpace = _appendKeyword(buffer, needsSpace, externalKeyword);
+    needsSpace = _appendKeyword(buffer, needsSpace, factoryKeyword);
+    needsSpace = _appendKeyword(buffer, needsSpace, finalKeyword);
+    needsSpace = _appendKeyword(buffer, needsSpace, staticKeyword);
+    _appendKeyword(buffer, needsSpace, varKeyword);
+    return buffer.toString();
   }
 
   /**
@@ -1449,12 +1451,12 @@
    * @param keyword the keyword to be appended
    * @return `true` if subsequent keywords need to be prefixed with a space
    */
-  bool _appendKeyword(JavaStringBuilder builder, bool needsSpace, Token keyword) {
+  bool _appendKeyword(StringBuffer buffer, bool needsSpace, Token keyword) {
     if (keyword != null) {
       if (needsSpace) {
-        builder.appendChar(0x20);
+        buffer.writeCharCode(0x20);
       }
-      builder.append(keyword.lexeme);
+      buffer.write(keyword.lexeme);
       return true;
     }
     return needsSpace;
@@ -2827,15 +2829,15 @@
    * @param startIndex the index of the first character representing the scalar value
    * @param endIndex the index of the last character representing the scalar value
    */
-  void _appendScalarValue(JavaStringBuilder builder, String escapeSequence, int scalarValue, int startIndex, int endIndex) {
+  void _appendScalarValue(StringBuffer buffer, String escapeSequence, int scalarValue, int startIndex, int endIndex) {
     if (scalarValue < 0 || scalarValue > Character.MAX_CODE_POINT || (scalarValue >= 0xD800 && scalarValue <= 0xDFFF)) {
       _reportErrorForCurrentToken(ParserErrorCode.INVALID_CODE_POINT, [escapeSequence]);
       return;
     }
     if (scalarValue < Character.MAX_VALUE) {
-      builder.appendChar(scalarValue);
+      buffer.writeCharCode(scalarValue);
     } else {
-      builder.append(Character.toChars(scalarValue));
+      buffer.write(Character.toChars(scalarValue));
     }
   }
 
@@ -2872,18 +2874,18 @@
       }
     }
     if (end - start + 1 < 0) {
-      AnalysisEngine.instance.logger.logError("Internal error: computeStringValue(${lexeme}, ${first}, ${last})");
+      AnalysisEngine.instance.logger.logError("Internal error: computeStringValue($lexeme, $first, $last)");
       return "";
     }
     if (isRaw) {
       return lexeme.substring(start, end);
     }
-    JavaStringBuilder builder = new JavaStringBuilder();
+    StringBuffer buffer = new StringBuffer();
     int index = start;
     while (index < end) {
-      index = _translateCharacter(builder, lexeme, index);
+      index = _translateCharacter(buffer, lexeme, index);
     }
-    return builder.toString();
+    return buffer.toString();
   }
 
   /**
@@ -4526,7 +4528,7 @@
     } else {
       // Internal error: this method should not have been invoked if the current token was something
       // other than one of the above.
-      throw new IllegalStateException("parseDirective invoked in an invalid state; currentToken = ${_currentToken}");
+      throw new IllegalStateException("parseDirective invoked in an invalid state; currentToken = $_currentToken");
     }
   }
 
@@ -4598,9 +4600,8 @@
     if (commentTokens.isEmpty) {
       return null;
     }
-    List<Token> tokens = new List.from(commentTokens);
-    List<CommentReference> references = _parseCommentReferences(tokens);
-    return Comment.createDocumentationCommentWithReferences(tokens, references);
+    List<CommentReference> references = _parseCommentReferences(commentTokens);
+    return Comment.createDocumentationCommentWithReferences(commentTokens, references);
   }
 
   /**
@@ -6442,7 +6443,7 @@
       _reportErrorForCurrentToken(ParserErrorCode.MISSING_IDENTIFIER, []);
       components.add(_createSyntheticToken(TokenType.IDENTIFIER));
     }
-    return new SymbolLiteral(poundSign, new List.from(components));
+    return new SymbolLiteral(poundSign, components);
   }
 
   /**
@@ -6885,7 +6886,7 @@
     if (token.type == TokenType.EOF) {
       token = token.previous;
     }
-    _reportError(new AnalysisError.con2(_source, token.offset, Math.max(token.length, 1), errorCode, arguments));
+    _reportError(new AnalysisError.con2(_source, token.offset, math.max(token.length, 1), errorCode, arguments));
   }
 
   /**
@@ -7366,52 +7367,48 @@
   bool _tokenMatchesString(Token token, String identifier) => token.type == TokenType.IDENTIFIER && token.lexeme == identifier;
 
   /**
-   * Translate the characters at the given index in the given string, appending the translated
-   * character to the given builder. The index is assumed to be valid.
-   *
-   * @param builder the builder to which the translated character is to be appended
-   * @param lexeme the string containing the character(s) to be translated
-   * @param index the index of the character to be translated
-   * @return the index of the next character to be translated
+   * Translate the characters at the given [index] in the given [lexeme],
+   * appending the translated character to the given [buffer]. The index is
+   * assumed to be valid.
    */
-  int _translateCharacter(JavaStringBuilder builder, String lexeme, int index) {
+  int _translateCharacter(StringBuffer buffer, String lexeme, int index) {
     int currentChar = lexeme.codeUnitAt(index);
     if (currentChar != 0x5C) {
-      builder.appendChar(currentChar);
+      buffer.writeCharCode(currentChar);
       return index + 1;
     }
     //
-    // We have found an escape sequence, so we parse the string to determine what kind of escape
-    // sequence and what character to add to the builder.
+    // We have found an escape sequence, so we parse the string to determine
+    // what kind of escape sequence and what character to add to the builder.
     //
     int length = lexeme.length;
     int currentIndex = index + 1;
     if (currentIndex >= length) {
-      // Illegal escape sequence: no char after escape
-      // This cannot actually happen because it would require the escape character to be the last
-      // character in the string, but if it were it would escape the closing quote, leaving the
-      // string unclosed.
+      // Illegal escape sequence: no char after escape.
+      // This cannot actually happen because it would require the escape
+      // character to be the last character in the string, but if it were it
+      // would escape the closing quote, leaving the string unclosed.
       // reportError(ParserErrorCode.MISSING_CHAR_IN_ESCAPE_SEQUENCE);
       return length;
     }
     currentChar = lexeme.codeUnitAt(currentIndex);
     if (currentChar == 0x6E) {
-      builder.appendChar(0xA);
+      buffer.writeCharCode(0xA);
       // newline
     } else if (currentChar == 0x72) {
-      builder.appendChar(0xD);
+      buffer.writeCharCode(0xD);
       // carriage return
     } else if (currentChar == 0x66) {
-      builder.appendChar(0xC);
+      buffer.writeCharCode(0xC);
       // form feed
     } else if (currentChar == 0x62) {
-      builder.appendChar(0x8);
+      buffer.writeCharCode(0x8);
       // backspace
     } else if (currentChar == 0x74) {
-      builder.appendChar(0x9);
+      buffer.writeCharCode(0x9);
       // tab
     } else if (currentChar == 0x76) {
-      builder.appendChar(0xB);
+      buffer.writeCharCode(0xB);
       // vertical tab
     } else if (currentChar == 0x78) {
       if (currentIndex + 2 >= length) {
@@ -7425,7 +7422,9 @@
         // Illegal escape sequence: invalid hex digit
         _reportErrorForCurrentToken(ParserErrorCode.INVALID_HEX_ESCAPE, []);
       } else {
-        builder.appendChar(((Character.digit(firstDigit, 16) << 4) + Character.digit(secondDigit, 16)));
+        int charCode = (Character.digit(firstDigit, 16) << 4)
+            + Character.digit(secondDigit, 16);
+        buffer.writeCharCode(charCode);
       }
       return currentIndex + 3;
     } else if (currentChar == 0x75) {
@@ -7440,7 +7439,9 @@
         currentIndex++;
         if (currentIndex >= length) {
           // Illegal escape sequence: incomplete escape
-          _reportErrorForCurrentToken(ParserErrorCode.INVALID_UNICODE_ESCAPE, []);
+          _reportErrorForCurrentToken(
+              ParserErrorCode.INVALID_UNICODE_ESCAPE,
+              []);
           return length;
         }
         currentChar = lexeme.codeUnitAt(currentIndex);
@@ -7449,9 +7450,12 @@
         while (currentChar != 0x7D) {
           if (!_isHexDigit(currentChar)) {
             // Illegal escape sequence: invalid hex digit
-            _reportErrorForCurrentToken(ParserErrorCode.INVALID_UNICODE_ESCAPE, []);
+            _reportErrorForCurrentToken(
+                ParserErrorCode.INVALID_UNICODE_ESCAPE,
+                []);
             currentIndex++;
-            while (currentIndex < length && lexeme.codeUnitAt(currentIndex) != 0x7D) {
+            while (currentIndex < length
+                && lexeme.codeUnitAt(currentIndex) != 0x7D) {
               currentIndex++;
             }
             return currentIndex + 1;
@@ -7461,37 +7465,59 @@
           currentIndex++;
           if (currentIndex >= length) {
             // Illegal escape sequence: incomplete escape
-            _reportErrorForCurrentToken(ParserErrorCode.INVALID_UNICODE_ESCAPE, []);
+            _reportErrorForCurrentToken(
+                ParserErrorCode.INVALID_UNICODE_ESCAPE,
+                []);
             return length;
           }
           currentChar = lexeme.codeUnitAt(currentIndex);
         }
         if (digitCount < 1 || digitCount > 6) {
           // Illegal escape sequence: not enough or too many hex digits
-          _reportErrorForCurrentToken(ParserErrorCode.INVALID_UNICODE_ESCAPE, []);
+          _reportErrorForCurrentToken(
+              ParserErrorCode.INVALID_UNICODE_ESCAPE,
+              []);
         }
-        _appendScalarValue(builder, lexeme.substring(index, currentIndex + 1), value, index, currentIndex);
+        _appendScalarValue(
+            buffer,
+            lexeme.substring(index, currentIndex + 1),
+            value,
+            index,
+            currentIndex);
         return currentIndex + 1;
       } else {
         if (currentIndex + 3 >= length) {
           // Illegal escape sequence: not enough hex digits
-          _reportErrorForCurrentToken(ParserErrorCode.INVALID_UNICODE_ESCAPE, []);
+          _reportErrorForCurrentToken(
+              ParserErrorCode.INVALID_UNICODE_ESCAPE,
+              []);
           return length;
         }
         int firstDigit = currentChar;
         int secondDigit = lexeme.codeUnitAt(currentIndex + 1);
         int thirdDigit = lexeme.codeUnitAt(currentIndex + 2);
         int fourthDigit = lexeme.codeUnitAt(currentIndex + 3);
-        if (!_isHexDigit(firstDigit) || !_isHexDigit(secondDigit) || !_isHexDigit(thirdDigit) || !_isHexDigit(fourthDigit)) {
+        if (!_isHexDigit(firstDigit)
+            || !_isHexDigit(secondDigit)
+            || !_isHexDigit(thirdDigit)
+            || !_isHexDigit(fourthDigit)) {
           // Illegal escape sequence: invalid hex digits
           _reportErrorForCurrentToken(ParserErrorCode.INVALID_UNICODE_ESCAPE, []);
         } else {
-          _appendScalarValue(builder, lexeme.substring(index, currentIndex + 1), (((((Character.digit(firstDigit, 16) << 4) + Character.digit(secondDigit, 16)) << 4) + Character.digit(thirdDigit, 16)) << 4) + Character.digit(fourthDigit, 16), index, currentIndex + 3);
+          _appendScalarValue(
+              buffer,
+              lexeme.substring(index, currentIndex + 1),
+              (((((Character.digit(firstDigit, 16) << 4)
+                  + Character.digit(secondDigit, 16)) << 4)
+                  + Character.digit(thirdDigit, 16)) << 4)
+                  + Character.digit(fourthDigit, 16),
+              index,
+              currentIndex + 3);
         }
         return currentIndex + 4;
       }
     } else {
-      builder.appendChar(currentChar);
+      buffer.writeCharCode(currentChar);
     }
     return currentIndex + 1;
   }
@@ -8299,7 +8325,7 @@
   ErrorType get type => ErrorType.SYNTACTIC_ERROR;
 
   @override
-  String get uniqueName => "${runtimeType.toString()}.${name}";
+  String get uniqueName => "$runtimeType.$name";
 }
 
 /**
@@ -8353,7 +8379,12 @@
   @override
   bool visitAnnotation(Annotation node) {
     Annotation toNode = this._toNode as Annotation;
-    if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualTokens(node.atSign, toNode.atSign), _isEqualNodes(node.name, toNode.name)), _isEqualTokens(node.period, toNode.period)), _isEqualNodes(node.constructorName, toNode.constructorName)), _isEqualNodes(node.arguments, toNode.arguments))) {
+    if (_and(
+        _isEqualTokens(node.atSign, toNode.atSign),
+        _isEqualNodes(node.name, toNode.name),
+        _isEqualTokens(node.period, toNode.period),
+        _isEqualNodes(node.constructorName, toNode.constructorName),
+        _isEqualNodes(node.arguments, toNode.arguments))) {
       toNode.element = node.element;
       return true;
     }
@@ -8363,13 +8394,19 @@
   @override
   bool visitArgumentList(ArgumentList node) {
     ArgumentList toNode = this._toNode as ArgumentList;
-    return javaBooleanAnd(javaBooleanAnd(_isEqualTokens(node.leftParenthesis, toNode.leftParenthesis), _isEqualNodeLists(node.arguments, toNode.arguments)), _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis));
+    return _and(
+        _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis),
+        _isEqualNodeLists(node.arguments, toNode.arguments),
+        _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis));
   }
 
   @override
   bool visitAsExpression(AsExpression node) {
     AsExpression toNode = this._toNode as AsExpression;
-    if (javaBooleanAnd(javaBooleanAnd(_isEqualNodes(node.expression, toNode.expression), _isEqualTokens(node.asOperator, toNode.asOperator)), _isEqualNodes(node.type, toNode.type))) {
+    if (_and(
+        _isEqualNodes(node.expression, toNode.expression),
+        _isEqualTokens(node.asOperator, toNode.asOperator),
+        _isEqualNodes(node.type, toNode.type))) {
       toNode.propagatedType = node.propagatedType;
       toNode.staticType = node.staticType;
       return true;
@@ -8380,13 +8417,21 @@
   @override
   bool visitAssertStatement(AssertStatement node) {
     AssertStatement toNode = this._toNode as AssertStatement;
-    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualTokens(node.keyword, toNode.keyword), _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis)), _isEqualNodes(node.condition, toNode.condition)), _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis)), _isEqualTokens(node.semicolon, toNode.semicolon));
+    return _and(
+        _isEqualTokens(node.keyword, toNode.keyword),
+        _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis),
+        _isEqualNodes(node.condition, toNode.condition),
+        _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis),
+        _isEqualTokens(node.semicolon, toNode.semicolon));
   }
 
   @override
   bool visitAssignmentExpression(AssignmentExpression node) {
     AssignmentExpression toNode = this._toNode as AssignmentExpression;
-    if (javaBooleanAnd(javaBooleanAnd(_isEqualNodes(node.leftHandSide, toNode.leftHandSide), _isEqualTokens(node.operator, toNode.operator)), _isEqualNodes(node.rightHandSide, toNode.rightHandSide))) {
+    if (_and(
+        _isEqualNodes(node.leftHandSide, toNode.leftHandSide),
+        _isEqualTokens(node.operator, toNode.operator),
+        _isEqualNodes(node.rightHandSide, toNode.rightHandSide))) {
       toNode.propagatedElement = node.propagatedElement;
       toNode.propagatedType = node.propagatedType;
       toNode.staticElement = node.staticElement;
@@ -8399,13 +8444,18 @@
   @override
   bool visitAwaitExpression(AwaitExpression node) {
     AwaitExpression toNode = this._toNode as AwaitExpression;
-    return javaBooleanAnd(_isEqualTokens(node.awaitKeyword, toNode.awaitKeyword), _isEqualNodes(node.expression, toNode.expression));
+    return _and(
+        _isEqualTokens(node.awaitKeyword, toNode.awaitKeyword),
+        _isEqualNodes(node.expression, toNode.expression));
   }
 
   @override
   bool visitBinaryExpression(BinaryExpression node) {
     BinaryExpression toNode = this._toNode as BinaryExpression;
-    if (javaBooleanAnd(javaBooleanAnd(_isEqualNodes(node.leftOperand, toNode.leftOperand), _isEqualTokens(node.operator, toNode.operator)), _isEqualNodes(node.rightOperand, toNode.rightOperand))) {
+    if (_and(
+        _isEqualNodes(node.leftOperand, toNode.leftOperand),
+        _isEqualTokens(node.operator, toNode.operator),
+        _isEqualNodes(node.rightOperand, toNode.rightOperand))) {
       toNode.propagatedElement = node.propagatedElement;
       toNode.propagatedType = node.propagatedType;
       toNode.staticElement = node.staticElement;
@@ -8418,7 +8468,10 @@
   @override
   bool visitBlock(Block node) {
     Block toNode = this._toNode as Block;
-    return javaBooleanAnd(javaBooleanAnd(_isEqualTokens(node.leftBracket, toNode.leftBracket), _isEqualNodeLists(node.statements, toNode.statements)), _isEqualTokens(node.rightBracket, toNode.rightBracket));
+    return _and(
+        _isEqualTokens(node.leftBracket, toNode.leftBracket),
+        _isEqualNodeLists(node.statements, toNode.statements),
+        _isEqualTokens(node.rightBracket, toNode.rightBracket));
   }
 
   @override
@@ -8430,7 +8483,9 @@
   @override
   bool visitBooleanLiteral(BooleanLiteral node) {
     BooleanLiteral toNode = this._toNode as BooleanLiteral;
-    if (javaBooleanAnd(_isEqualTokens(node.literal, toNode.literal), node.value == toNode.value)) {
+    if (_and(
+        _isEqualTokens(node.literal, toNode.literal),
+        node.value == toNode.value)) {
       toNode.propagatedType = node.propagatedType;
       toNode.staticType = node.staticType;
       return true;
@@ -8441,13 +8496,18 @@
   @override
   bool visitBreakStatement(BreakStatement node) {
     BreakStatement toNode = this._toNode as BreakStatement;
-    return javaBooleanAnd(javaBooleanAnd(_isEqualTokens(node.keyword, toNode.keyword), _isEqualNodes(node.label, toNode.label)), _isEqualTokens(node.semicolon, toNode.semicolon));
+    return _and(
+        _isEqualTokens(node.keyword, toNode.keyword),
+        _isEqualNodes(node.label, toNode.label),
+        _isEqualTokens(node.semicolon, toNode.semicolon));
   }
 
   @override
   bool visitCascadeExpression(CascadeExpression node) {
     CascadeExpression toNode = this._toNode as CascadeExpression;
-    if (javaBooleanAnd(_isEqualNodes(node.target, toNode.target), _isEqualNodeLists(node.cascadeSections, toNode.cascadeSections))) {
+    if (_and(
+        _isEqualNodes(node.target, toNode.target),
+        _isEqualNodeLists(node.cascadeSections, toNode.cascadeSections))) {
       toNode.propagatedType = node.propagatedType;
       toNode.staticType = node.staticType;
       return true;
@@ -8458,19 +8518,51 @@
   @override
   bool visitCatchClause(CatchClause node) {
     CatchClause toNode = this._toNode as CatchClause;
-    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualTokens(node.onKeyword, toNode.onKeyword), _isEqualNodes(node.exceptionType, toNode.exceptionType)), _isEqualTokens(node.catchKeyword, toNode.catchKeyword)), _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis)), _isEqualNodes(node.exceptionParameter, toNode.exceptionParameter)), _isEqualTokens(node.comma, toNode.comma)), _isEqualNodes(node.stackTraceParameter, toNode.stackTraceParameter)), _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis)), _isEqualNodes(node.body, toNode.body));
+    return _and(
+        _isEqualTokens(node.onKeyword, toNode.onKeyword),
+        _isEqualNodes(node.exceptionType, toNode.exceptionType),
+        _isEqualTokens(node.catchKeyword, toNode.catchKeyword),
+        _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis),
+        _isEqualNodes(node.exceptionParameter, toNode.exceptionParameter),
+        _isEqualTokens(node.comma, toNode.comma),
+        _isEqualNodes(node.stackTraceParameter, toNode.stackTraceParameter),
+        _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis),
+        _isEqualNodes(node.body, toNode.body));
   }
 
   @override
   bool visitClassDeclaration(ClassDeclaration node) {
     ClassDeclaration toNode = this._toNode as ClassDeclaration;
-    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualNodes(node.documentationComment, toNode.documentationComment), _isEqualNodeLists(node.metadata, toNode.metadata)), _isEqualTokens(node.abstractKeyword, toNode.abstractKeyword)), _isEqualTokens(node.classKeyword, toNode.classKeyword)), _isEqualNodes(node.name, toNode.name)), _isEqualNodes(node.typeParameters, toNode.typeParameters)), _isEqualNodes(node.extendsClause, toNode.extendsClause)), _isEqualNodes(node.withClause, toNode.withClause)), _isEqualNodes(node.implementsClause, toNode.implementsClause)), _isEqualTokens(node.leftBracket, toNode.leftBracket)), _isEqualNodeLists(node.members, toNode.members)), _isEqualTokens(node.rightBracket, toNode.rightBracket));
+    return _and(
+        _isEqualNodes(node.documentationComment, toNode.documentationComment),
+        _isEqualNodeLists(node.metadata, toNode.metadata),
+        _isEqualTokens(node.abstractKeyword, toNode.abstractKeyword),
+        _isEqualTokens(node.classKeyword, toNode.classKeyword),
+        _isEqualNodes(node.name, toNode.name),
+        _isEqualNodes(node.typeParameters, toNode.typeParameters),
+        _isEqualNodes(node.extendsClause, toNode.extendsClause),
+        _isEqualNodes(node.withClause, toNode.withClause),
+        _isEqualNodes(node.implementsClause, toNode.implementsClause),
+        _isEqualTokens(node.leftBracket, toNode.leftBracket),
+        _isEqualNodeLists(node.members, toNode.members),
+        _isEqualTokens(node.rightBracket, toNode.rightBracket));
   }
 
   @override
   bool visitClassTypeAlias(ClassTypeAlias node) {
     ClassTypeAlias toNode = this._toNode as ClassTypeAlias;
-    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualNodes(node.documentationComment, toNode.documentationComment), _isEqualNodeLists(node.metadata, toNode.metadata)), _isEqualTokens(node.keyword, toNode.keyword)), _isEqualNodes(node.name, toNode.name)), _isEqualNodes(node.typeParameters, toNode.typeParameters)), _isEqualTokens(node.equals, toNode.equals)), _isEqualTokens(node.abstractKeyword, toNode.abstractKeyword)), _isEqualNodes(node.superclass, toNode.superclass)), _isEqualNodes(node.withClause, toNode.withClause)), _isEqualNodes(node.implementsClause, toNode.implementsClause)), _isEqualTokens(node.semicolon, toNode.semicolon));
+    return _and(
+        _isEqualNodes(node.documentationComment, toNode.documentationComment),
+        _isEqualNodeLists(node.metadata, toNode.metadata),
+        _isEqualTokens(node.keyword, toNode.keyword),
+        _isEqualNodes(node.name, toNode.name),
+        _isEqualNodes(node.typeParameters, toNode.typeParameters),
+        _isEqualTokens(node.equals, toNode.equals),
+        _isEqualTokens(node.abstractKeyword, toNode.abstractKeyword),
+        _isEqualNodes(node.superclass, toNode.superclass),
+        _isEqualNodes(node.withClause, toNode.withClause),
+        _isEqualNodes(node.implementsClause, toNode.implementsClause),
+        _isEqualTokens(node.semicolon, toNode.semicolon));
   }
 
   @override
@@ -8482,13 +8574,20 @@
   @override
   bool visitCommentReference(CommentReference node) {
     CommentReference toNode = this._toNode as CommentReference;
-    return javaBooleanAnd(_isEqualTokens(node.newKeyword, toNode.newKeyword), _isEqualNodes(node.identifier, toNode.identifier));
+    return _and(
+        _isEqualTokens(node.newKeyword, toNode.newKeyword),
+        _isEqualNodes(node.identifier, toNode.identifier));
   }
 
   @override
   bool visitCompilationUnit(CompilationUnit node) {
     CompilationUnit toNode = this._toNode as CompilationUnit;
-    if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualTokens(node.beginToken, toNode.beginToken), _isEqualNodes(node.scriptTag, toNode.scriptTag)), _isEqualNodeLists(node.directives, toNode.directives)), _isEqualNodeLists(node.declarations, toNode.declarations)), _isEqualTokens(node.endToken, toNode.endToken))) {
+    if (_and(
+        _isEqualTokens(node.beginToken, toNode.beginToken),
+        _isEqualNodes(node.scriptTag, toNode.scriptTag),
+        _isEqualNodeLists(node.directives, toNode.directives),
+        _isEqualNodeLists(node.declarations, toNode.declarations),
+        _isEqualTokens(node.endToken, toNode.endToken))) {
       toNode.element = node.element;
       return true;
     }
@@ -8498,7 +8597,12 @@
   @override
   bool visitConditionalExpression(ConditionalExpression node) {
     ConditionalExpression toNode = this._toNode as ConditionalExpression;
-    if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualNodes(node.condition, toNode.condition), _isEqualTokens(node.question, toNode.question)), _isEqualNodes(node.thenExpression, toNode.thenExpression)), _isEqualTokens(node.colon, toNode.colon)), _isEqualNodes(node.elseExpression, toNode.elseExpression))) {
+    if (_and(
+        _isEqualNodes(node.condition, toNode.condition),
+        _isEqualTokens(node.question, toNode.question),
+        _isEqualNodes(node.thenExpression, toNode.thenExpression),
+        _isEqualTokens(node.colon, toNode.colon),
+        _isEqualNodes(node.elseExpression, toNode.elseExpression))) {
       toNode.propagatedType = node.propagatedType;
       toNode.staticType = node.staticType;
       return true;
@@ -8509,7 +8613,20 @@
   @override
   bool visitConstructorDeclaration(ConstructorDeclaration node) {
     ConstructorDeclaration toNode = this._toNode as ConstructorDeclaration;
-    if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualNodes(node.documentationComment, toNode.documentationComment), _isEqualNodeLists(node.metadata, toNode.metadata)), _isEqualTokens(node.externalKeyword, toNode.externalKeyword)), _isEqualTokens(node.constKeyword, toNode.constKeyword)), _isEqualTokens(node.factoryKeyword, toNode.factoryKeyword)), _isEqualNodes(node.returnType, toNode.returnType)), _isEqualTokens(node.period, toNode.period)), _isEqualNodes(node.name, toNode.name)), _isEqualNodes(node.parameters, toNode.parameters)), _isEqualTokens(node.separator, toNode.separator)), _isEqualNodeLists(node.initializers, toNode.initializers)), _isEqualNodes(node.redirectedConstructor, toNode.redirectedConstructor)), _isEqualNodes(node.body, toNode.body))) {
+    if (_and(
+        _isEqualNodes(node.documentationComment, toNode.documentationComment),
+        _isEqualNodeLists(node.metadata, toNode.metadata),
+        _isEqualTokens(node.externalKeyword, toNode.externalKeyword),
+        _isEqualTokens(node.constKeyword, toNode.constKeyword),
+        _isEqualTokens(node.factoryKeyword, toNode.factoryKeyword),
+        _isEqualNodes(node.returnType, toNode.returnType),
+        _isEqualTokens(node.period, toNode.period),
+        _isEqualNodes(node.name, toNode.name),
+        _isEqualNodes(node.parameters, toNode.parameters),
+        _isEqualTokens(node.separator, toNode.separator),
+        _isEqualNodeLists(node.initializers, toNode.initializers),
+        _isEqualNodes(node.redirectedConstructor, toNode.redirectedConstructor),
+        _isEqualNodes(node.body, toNode.body))) {
       toNode.element = node.element;
       return true;
     }
@@ -8519,13 +8636,21 @@
   @override
   bool visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
     ConstructorFieldInitializer toNode = this._toNode as ConstructorFieldInitializer;
-    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualTokens(node.keyword, toNode.keyword), _isEqualTokens(node.period, toNode.period)), _isEqualNodes(node.fieldName, toNode.fieldName)), _isEqualTokens(node.equals, toNode.equals)), _isEqualNodes(node.expression, toNode.expression));
+    return _and(
+        _isEqualTokens(node.keyword, toNode.keyword),
+        _isEqualTokens(node.period, toNode.period),
+        _isEqualNodes(node.fieldName, toNode.fieldName),
+        _isEqualTokens(node.equals, toNode.equals),
+        _isEqualNodes(node.expression, toNode.expression));
   }
 
   @override
   bool visitConstructorName(ConstructorName node) {
     ConstructorName toNode = this._toNode as ConstructorName;
-    if (javaBooleanAnd(javaBooleanAnd(_isEqualNodes(node.type, toNode.type), _isEqualTokens(node.period, toNode.period)), _isEqualNodes(node.name, toNode.name))) {
+    if (_and(
+        _isEqualNodes(node.type, toNode.type),
+        _isEqualTokens(node.period, toNode.period),
+        _isEqualNodes(node.name, toNode.name))) {
       toNode.staticElement = node.staticElement;
       return true;
     }
@@ -8535,31 +8660,52 @@
   @override
   bool visitContinueStatement(ContinueStatement node) {
     ContinueStatement toNode = this._toNode as ContinueStatement;
-    return javaBooleanAnd(javaBooleanAnd(_isEqualTokens(node.keyword, toNode.keyword), _isEqualNodes(node.label, toNode.label)), _isEqualTokens(node.semicolon, toNode.semicolon));
+    return _and(
+        _isEqualTokens(node.keyword, toNode.keyword),
+        _isEqualNodes(node.label, toNode.label),
+        _isEqualTokens(node.semicolon, toNode.semicolon));
   }
 
   @override
   bool visitDeclaredIdentifier(DeclaredIdentifier node) {
     DeclaredIdentifier toNode = this._toNode as DeclaredIdentifier;
-    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualNodes(node.documentationComment, toNode.documentationComment), _isEqualNodeLists(node.metadata, toNode.metadata)), _isEqualTokens(node.keyword, toNode.keyword)), _isEqualNodes(node.type, toNode.type)), _isEqualNodes(node.identifier, toNode.identifier));
+    return _and(
+        _isEqualNodes(node.documentationComment, toNode.documentationComment),
+        _isEqualNodeLists(node.metadata, toNode.metadata),
+        _isEqualTokens(node.keyword, toNode.keyword),
+        _isEqualNodes(node.type, toNode.type),
+        _isEqualNodes(node.identifier, toNode.identifier));
   }
 
   @override
   bool visitDefaultFormalParameter(DefaultFormalParameter node) {
     DefaultFormalParameter toNode = this._toNode as DefaultFormalParameter;
-    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualNodes(node.parameter, toNode.parameter), node.kind == toNode.kind), _isEqualTokens(node.separator, toNode.separator)), _isEqualNodes(node.defaultValue, toNode.defaultValue));
+    return _and(
+        _isEqualNodes(node.parameter, toNode.parameter),
+        node.kind == toNode.kind,
+        _isEqualTokens(node.separator, toNode.separator),
+        _isEqualNodes(node.defaultValue, toNode.defaultValue));
   }
 
   @override
   bool visitDoStatement(DoStatement node) {
     DoStatement toNode = this._toNode as DoStatement;
-    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualTokens(node.doKeyword, toNode.doKeyword), _isEqualNodes(node.body, toNode.body)), _isEqualTokens(node.whileKeyword, toNode.whileKeyword)), _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis)), _isEqualNodes(node.condition, toNode.condition)), _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis)), _isEqualTokens(node.semicolon, toNode.semicolon));
+    return _and(
+        _isEqualTokens(node.doKeyword, toNode.doKeyword),
+        _isEqualNodes(node.body, toNode.body),
+        _isEqualTokens(node.whileKeyword, toNode.whileKeyword),
+        _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis),
+        _isEqualNodes(node.condition, toNode.condition),
+        _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis),
+        _isEqualTokens(node.semicolon, toNode.semicolon));
   }
 
   @override
   bool visitDoubleLiteral(DoubleLiteral node) {
     DoubleLiteral toNode = this._toNode as DoubleLiteral;
-    if (javaBooleanAnd(_isEqualTokens(node.literal, toNode.literal), node.value == toNode.value)) {
+    if (_and(
+        _isEqualTokens(node.literal, toNode.literal),
+            node.value == toNode.value)) {
       toNode.propagatedType = node.propagatedType;
       toNode.staticType = node.staticType;
       return true;
@@ -8582,19 +8728,35 @@
   @override
   bool visitEnumConstantDeclaration(EnumConstantDeclaration node) {
     EnumConstantDeclaration toNode = this._toNode as EnumConstantDeclaration;
-    return javaBooleanAnd(javaBooleanAnd(_isEqualNodes(node.documentationComment, toNode.documentationComment), _isEqualNodeLists(node.metadata, toNode.metadata)), _isEqualNodes(node.name, toNode.name));
+    return _and(
+        _isEqualNodes(node.documentationComment, toNode.documentationComment),
+        _isEqualNodeLists(node.metadata, toNode.metadata),
+        _isEqualNodes(node.name, toNode.name));
   }
 
   @override
   bool visitEnumDeclaration(EnumDeclaration node) {
     EnumDeclaration toNode = this._toNode as EnumDeclaration;
-    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualNodes(node.documentationComment, toNode.documentationComment), _isEqualNodeLists(node.metadata, toNode.metadata)), _isEqualTokens(node.keyword, toNode.keyword)), _isEqualNodes(node.name, toNode.name)), _isEqualTokens(node.leftBracket, toNode.leftBracket)), _isEqualNodeLists(node.constants, toNode.constants)), _isEqualTokens(node.rightBracket, toNode.rightBracket));
+    return _and(
+        _isEqualNodes(node.documentationComment, toNode.documentationComment),
+        _isEqualNodeLists(node.metadata, toNode.metadata),
+        _isEqualTokens(node.keyword, toNode.keyword),
+        _isEqualNodes(node.name, toNode.name),
+        _isEqualTokens(node.leftBracket, toNode.leftBracket),
+        _isEqualNodeLists(node.constants, toNode.constants),
+        _isEqualTokens(node.rightBracket, toNode.rightBracket));
   }
 
   @override
   bool visitExportDirective(ExportDirective node) {
     ExportDirective toNode = this._toNode as ExportDirective;
-    if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualNodes(node.documentationComment, toNode.documentationComment), _isEqualNodeLists(node.metadata, toNode.metadata)), _isEqualTokens(node.keyword, toNode.keyword)), _isEqualNodes(node.uri, toNode.uri)), _isEqualNodeLists(node.combinators, toNode.combinators)), _isEqualTokens(node.semicolon, toNode.semicolon))) {
+    if (_and(
+        _isEqualNodes(node.documentationComment, toNode.documentationComment),
+        _isEqualNodeLists(node.metadata, toNode.metadata),
+        _isEqualTokens(node.keyword, toNode.keyword),
+        _isEqualNodes(node.uri, toNode.uri),
+        _isEqualNodeLists(node.combinators, toNode.combinators),
+        _isEqualTokens(node.semicolon, toNode.semicolon))) {
       toNode.element = node.element;
       return true;
     }
@@ -8604,55 +8766,102 @@
   @override
   bool visitExpressionFunctionBody(ExpressionFunctionBody node) {
     ExpressionFunctionBody toNode = this._toNode as ExpressionFunctionBody;
-    return javaBooleanAnd(javaBooleanAnd(_isEqualTokens(node.functionDefinition, toNode.functionDefinition), _isEqualNodes(node.expression, toNode.expression)), _isEqualTokens(node.semicolon, toNode.semicolon));
+    return _and(
+        _isEqualTokens(node.functionDefinition, toNode.functionDefinition),
+        _isEqualNodes(node.expression, toNode.expression),
+        _isEqualTokens(node.semicolon, toNode.semicolon));
   }
 
   @override
   bool visitExpressionStatement(ExpressionStatement node) {
     ExpressionStatement toNode = this._toNode as ExpressionStatement;
-    return javaBooleanAnd(_isEqualNodes(node.expression, toNode.expression), _isEqualTokens(node.semicolon, toNode.semicolon));
+    return _and(
+        _isEqualNodes(node.expression, toNode.expression),
+        _isEqualTokens(node.semicolon, toNode.semicolon));
   }
 
   @override
   bool visitExtendsClause(ExtendsClause node) {
     ExtendsClause toNode = this._toNode as ExtendsClause;
-    return javaBooleanAnd(_isEqualTokens(node.keyword, toNode.keyword), _isEqualNodes(node.superclass, toNode.superclass));
+    return _and(
+        _isEqualTokens(node.keyword, toNode.keyword),
+        _isEqualNodes(node.superclass, toNode.superclass));
   }
 
   @override
   bool visitFieldDeclaration(FieldDeclaration node) {
     FieldDeclaration toNode = this._toNode as FieldDeclaration;
-    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualNodes(node.documentationComment, toNode.documentationComment), _isEqualNodeLists(node.metadata, toNode.metadata)), _isEqualTokens(node.staticKeyword, toNode.staticKeyword)), _isEqualNodes(node.fields, toNode.fields)), _isEqualTokens(node.semicolon, toNode.semicolon));
+    return _and(
+        _isEqualNodes(node.documentationComment, toNode.documentationComment),
+        _isEqualNodeLists(node.metadata, toNode.metadata),
+        _isEqualTokens(node.staticKeyword, toNode.staticKeyword),
+        _isEqualNodes(node.fields, toNode.fields),
+        _isEqualTokens(node.semicolon, toNode.semicolon));
   }
 
   @override
   bool visitFieldFormalParameter(FieldFormalParameter node) {
     FieldFormalParameter toNode = this._toNode as FieldFormalParameter;
-    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualNodes(node.documentationComment, toNode.documentationComment), _isEqualNodeLists(node.metadata, toNode.metadata)), _isEqualTokens(node.keyword, toNode.keyword)), _isEqualNodes(node.type, toNode.type)), _isEqualTokens(node.thisToken, toNode.thisToken)), _isEqualTokens(node.period, toNode.period)), _isEqualNodes(node.identifier, toNode.identifier));
+    return _and(
+        _isEqualNodes(node.documentationComment, toNode.documentationComment),
+        _isEqualNodeLists(node.metadata, toNode.metadata),
+        _isEqualTokens(node.keyword, toNode.keyword),
+        _isEqualNodes(node.type, toNode.type),
+        _isEqualTokens(node.thisToken, toNode.thisToken),
+        _isEqualTokens(node.period, toNode.period),
+        _isEqualNodes(node.identifier, toNode.identifier));
   }
 
   @override
   bool visitForEachStatement(ForEachStatement node) {
     ForEachStatement toNode = this._toNode as ForEachStatement;
-    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualTokens(node.forKeyword, toNode.forKeyword), _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis)), _isEqualNodes(node.loopVariable, toNode.loopVariable)), _isEqualTokens(node.inKeyword, toNode.inKeyword)), _isEqualNodes(node.iterator, toNode.iterator)), _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis)), _isEqualNodes(node.body, toNode.body));
+    return _and(
+        _isEqualTokens(node.forKeyword, toNode.forKeyword),
+        _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis),
+        _isEqualNodes(node.loopVariable, toNode.loopVariable),
+        _isEqualTokens(node.inKeyword, toNode.inKeyword),
+        _isEqualNodes(node.iterator, toNode.iterator),
+        _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis),
+        _isEqualNodes(node.body, toNode.body));
   }
 
   @override
   bool visitFormalParameterList(FormalParameterList node) {
     FormalParameterList toNode = this._toNode as FormalParameterList;
-    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualTokens(node.leftParenthesis, toNode.leftParenthesis), _isEqualNodeLists(node.parameters, toNode.parameters)), _isEqualTokens(node.leftDelimiter, toNode.leftDelimiter)), _isEqualTokens(node.rightDelimiter, toNode.rightDelimiter)), _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis));
+    return _and(
+        _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis),
+        _isEqualNodeLists(node.parameters, toNode.parameters),
+        _isEqualTokens(node.leftDelimiter, toNode.leftDelimiter),
+        _isEqualTokens(node.rightDelimiter, toNode.rightDelimiter),
+        _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis));
   }
 
   @override
   bool visitForStatement(ForStatement node) {
     ForStatement toNode = this._toNode as ForStatement;
-    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualTokens(node.forKeyword, toNode.forKeyword), _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis)), _isEqualNodes(node.variables, toNode.variables)), _isEqualNodes(node.initialization, toNode.initialization)), _isEqualTokens(node.leftSeparator, toNode.leftSeparator)), _isEqualNodes(node.condition, toNode.condition)), _isEqualTokens(node.rightSeparator, toNode.rightSeparator)), _isEqualNodeLists(node.updaters, toNode.updaters)), _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis)), _isEqualNodes(node.body, toNode.body));
+    return _and(_isEqualTokens(node.forKeyword, toNode.forKeyword),
+        _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis),
+        _isEqualNodes(node.variables, toNode.variables),
+        _isEqualNodes(node.initialization, toNode.initialization),
+        _isEqualTokens(node.leftSeparator, toNode.leftSeparator),
+        _isEqualNodes(node.condition, toNode.condition),
+        _isEqualTokens(node.rightSeparator, toNode.rightSeparator),
+        _isEqualNodeLists(node.updaters, toNode.updaters),
+        _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis),
+        _isEqualNodes(node.body, toNode.body));
   }
 
   @override
   bool visitFunctionDeclaration(FunctionDeclaration node) {
     FunctionDeclaration toNode = this._toNode as FunctionDeclaration;
-    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualNodes(node.documentationComment, toNode.documentationComment), _isEqualNodeLists(node.metadata, toNode.metadata)), _isEqualTokens(node.externalKeyword, toNode.externalKeyword)), _isEqualNodes(node.returnType, toNode.returnType)), _isEqualTokens(node.propertyKeyword, toNode.propertyKeyword)), _isEqualNodes(node.name, toNode.name)), _isEqualNodes(node.functionExpression, toNode.functionExpression));
+    return _and(
+        _isEqualNodes(node.documentationComment, toNode.documentationComment),
+        _isEqualNodeLists(node.metadata, toNode.metadata),
+        _isEqualTokens(node.externalKeyword, toNode.externalKeyword),
+        _isEqualNodes(node.returnType, toNode.returnType),
+        _isEqualTokens(node.propertyKeyword, toNode.propertyKeyword),
+        _isEqualNodes(node.name, toNode.name),
+        _isEqualNodes(node.functionExpression, toNode.functionExpression));
   }
 
   @override
@@ -8664,7 +8873,9 @@
   @override
   bool visitFunctionExpression(FunctionExpression node) {
     FunctionExpression toNode = this._toNode as FunctionExpression;
-    if (javaBooleanAnd(_isEqualNodes(node.parameters, toNode.parameters), _isEqualNodes(node.body, toNode.body))) {
+    if (_and(
+        _isEqualNodes(node.parameters, toNode.parameters),
+        _isEqualNodes(node.body, toNode.body))) {
       toNode.element = node.element;
       toNode.propagatedType = node.propagatedType;
       toNode.staticType = node.staticType;
@@ -8676,7 +8887,9 @@
   @override
   bool visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
     FunctionExpressionInvocation toNode = this._toNode as FunctionExpressionInvocation;
-    if (javaBooleanAnd(_isEqualNodes(node.function, toNode.function), _isEqualNodes(node.argumentList, toNode.argumentList))) {
+    if (_and(
+        _isEqualNodes(node.function, toNode.function),
+        _isEqualNodes(node.argumentList, toNode.argumentList))) {
       toNode.propagatedElement = node.propagatedElement;
       toNode.propagatedType = node.propagatedType;
       toNode.staticElement = node.staticElement;
@@ -8689,37 +8902,69 @@
   @override
   bool visitFunctionTypeAlias(FunctionTypeAlias node) {
     FunctionTypeAlias toNode = this._toNode as FunctionTypeAlias;
-    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualNodes(node.documentationComment, toNode.documentationComment), _isEqualNodeLists(node.metadata, toNode.metadata)), _isEqualTokens(node.keyword, toNode.keyword)), _isEqualNodes(node.returnType, toNode.returnType)), _isEqualNodes(node.name, toNode.name)), _isEqualNodes(node.typeParameters, toNode.typeParameters)), _isEqualNodes(node.parameters, toNode.parameters)), _isEqualTokens(node.semicolon, toNode.semicolon));
+    return _and(
+        _isEqualNodes(node.documentationComment, toNode.documentationComment),
+        _isEqualNodeLists(node.metadata, toNode.metadata),
+        _isEqualTokens(node.keyword, toNode.keyword),
+        _isEqualNodes(node.returnType, toNode.returnType),
+        _isEqualNodes(node.name, toNode.name),
+        _isEqualNodes(node.typeParameters, toNode.typeParameters),
+        _isEqualNodes(node.parameters, toNode.parameters),
+        _isEqualTokens(node.semicolon, toNode.semicolon));
   }
 
   @override
   bool visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
     FunctionTypedFormalParameter toNode = this._toNode as FunctionTypedFormalParameter;
-    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualNodes(node.documentationComment, toNode.documentationComment), _isEqualNodeLists(node.metadata, toNode.metadata)), _isEqualNodes(node.returnType, toNode.returnType)), _isEqualNodes(node.identifier, toNode.identifier)), _isEqualNodes(node.parameters, toNode.parameters));
+    return _and(
+        _isEqualNodes(node.documentationComment, toNode.documentationComment),
+        _isEqualNodeLists(node.metadata, toNode.metadata),
+        _isEqualNodes(node.returnType, toNode.returnType),
+        _isEqualNodes(node.identifier, toNode.identifier),
+        _isEqualNodes(node.parameters, toNode.parameters));
   }
 
   @override
   bool visitHideCombinator(HideCombinator node) {
     HideCombinator toNode = this._toNode as HideCombinator;
-    return javaBooleanAnd(_isEqualTokens(node.keyword, toNode.keyword), _isEqualNodeLists(node.hiddenNames, toNode.hiddenNames));
+    return _and(
+        _isEqualTokens(node.keyword, toNode.keyword),
+        _isEqualNodeLists(node.hiddenNames, toNode.hiddenNames));
   }
 
   @override
   bool visitIfStatement(IfStatement node) {
     IfStatement toNode = this._toNode as IfStatement;
-    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualTokens(node.ifKeyword, toNode.ifKeyword), _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis)), _isEqualNodes(node.condition, toNode.condition)), _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis)), _isEqualNodes(node.thenStatement, toNode.thenStatement)), _isEqualTokens(node.elseKeyword, toNode.elseKeyword)), _isEqualNodes(node.elseStatement, toNode.elseStatement));
+    return _and(
+        _isEqualTokens(node.ifKeyword, toNode.ifKeyword),
+        _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis),
+        _isEqualNodes(node.condition, toNode.condition),
+        _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis),
+        _isEqualNodes(node.thenStatement, toNode.thenStatement),
+        _isEqualTokens(node.elseKeyword, toNode.elseKeyword),
+        _isEqualNodes(node.elseStatement, toNode.elseStatement));
   }
 
   @override
   bool visitImplementsClause(ImplementsClause node) {
     ImplementsClause toNode = this._toNode as ImplementsClause;
-    return javaBooleanAnd(_isEqualTokens(node.keyword, toNode.keyword), _isEqualNodeLists(node.interfaces, toNode.interfaces));
+    return _and(
+        _isEqualTokens(node.keyword, toNode.keyword),
+        _isEqualNodeLists(node.interfaces, toNode.interfaces));
   }
 
   @override
   bool visitImportDirective(ImportDirective node) {
     ImportDirective toNode = this._toNode as ImportDirective;
-    if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualNodes(node.documentationComment, toNode.documentationComment), _isEqualNodeLists(node.metadata, toNode.metadata)), _isEqualTokens(node.keyword, toNode.keyword)), _isEqualNodes(node.uri, toNode.uri)), _isEqualTokens(node.asToken, toNode.asToken)), _isEqualNodes(node.prefix, toNode.prefix)), _isEqualNodeLists(node.combinators, toNode.combinators)), _isEqualTokens(node.semicolon, toNode.semicolon))) {
+    if (_and(
+        _isEqualNodes(node.documentationComment, toNode.documentationComment),
+        _isEqualNodeLists(node.metadata, toNode.metadata),
+        _isEqualTokens(node.keyword, toNode.keyword),
+        _isEqualNodes(node.uri, toNode.uri),
+        _isEqualTokens(node.asToken, toNode.asToken),
+        _isEqualNodes(node.prefix, toNode.prefix),
+        _isEqualNodeLists(node.combinators, toNode.combinators),
+        _isEqualTokens(node.semicolon, toNode.semicolon))) {
       toNode.element = node.element;
       return true;
     }
@@ -8729,7 +8974,11 @@
   @override
   bool visitIndexExpression(IndexExpression node) {
     IndexExpression toNode = this._toNode as IndexExpression;
-    if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualNodes(node.target, toNode.target), _isEqualTokens(node.leftBracket, toNode.leftBracket)), _isEqualNodes(node.index, toNode.index)), _isEqualTokens(node.rightBracket, toNode.rightBracket))) {
+    if (_and(
+        _isEqualNodes(node.target, toNode.target),
+        _isEqualTokens(node.leftBracket, toNode.leftBracket),
+        _isEqualNodes(node.index, toNode.index),
+        _isEqualTokens(node.rightBracket, toNode.rightBracket))) {
       toNode.auxiliaryElements = node.auxiliaryElements;
       toNode.propagatedElement = node.propagatedElement;
       toNode.propagatedType = node.propagatedType;
@@ -8743,7 +8992,10 @@
   @override
   bool visitInstanceCreationExpression(InstanceCreationExpression node) {
     InstanceCreationExpression toNode = this._toNode as InstanceCreationExpression;
-    if (javaBooleanAnd(javaBooleanAnd(_isEqualTokens(node.keyword, toNode.keyword), _isEqualNodes(node.constructorName, toNode.constructorName)), _isEqualNodes(node.argumentList, toNode.argumentList))) {
+    if (_and(
+        _isEqualTokens(node.keyword, toNode.keyword),
+        _isEqualNodes(node.constructorName, toNode.constructorName),
+        _isEqualNodes(node.argumentList, toNode.argumentList))) {
       toNode.propagatedType = node.propagatedType;
       toNode.staticElement = node.staticElement;
       toNode.staticType = node.staticType;
@@ -8755,7 +9007,9 @@
   @override
   bool visitIntegerLiteral(IntegerLiteral node) {
     IntegerLiteral toNode = this._toNode as IntegerLiteral;
-    if (javaBooleanAnd(_isEqualTokens(node.literal, toNode.literal), identical(node.value, toNode.value))) {
+    if (_and(
+        _isEqualTokens(node.literal, toNode.literal),
+        node.value == toNode.value)) {
       toNode.propagatedType = node.propagatedType;
       toNode.staticType = node.staticType;
       return true;
@@ -8766,19 +9020,28 @@
   @override
   bool visitInterpolationExpression(InterpolationExpression node) {
     InterpolationExpression toNode = this._toNode as InterpolationExpression;
-    return javaBooleanAnd(javaBooleanAnd(_isEqualTokens(node.leftBracket, toNode.leftBracket), _isEqualNodes(node.expression, toNode.expression)), _isEqualTokens(node.rightBracket, toNode.rightBracket));
+    return _and(
+        _isEqualTokens(node.leftBracket, toNode.leftBracket),
+        _isEqualNodes(node.expression, toNode.expression),
+        _isEqualTokens(node.rightBracket, toNode.rightBracket));
   }
 
   @override
   bool visitInterpolationString(InterpolationString node) {
     InterpolationString toNode = this._toNode as InterpolationString;
-    return javaBooleanAnd(_isEqualTokens(node.contents, toNode.contents), node.value == toNode.value);
+    return _and(
+        _isEqualTokens(node.contents, toNode.contents),
+            node.value == toNode.value);
   }
 
   @override
   bool visitIsExpression(IsExpression node) {
     IsExpression toNode = this._toNode as IsExpression;
-    if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualNodes(node.expression, toNode.expression), _isEqualTokens(node.isOperator, toNode.isOperator)), _isEqualTokens(node.notOperator, toNode.notOperator)), _isEqualNodes(node.type, toNode.type))) {
+    if (_and(
+        _isEqualNodes(node.expression, toNode.expression),
+        _isEqualTokens(node.isOperator, toNode.isOperator),
+        _isEqualTokens(node.notOperator, toNode.notOperator),
+        _isEqualNodes(node.type, toNode.type))) {
       toNode.propagatedType = node.propagatedType;
       toNode.staticType = node.staticType;
       return true;
@@ -8789,19 +9052,28 @@
   @override
   bool visitLabel(Label node) {
     Label toNode = this._toNode as Label;
-    return javaBooleanAnd(_isEqualNodes(node.label, toNode.label), _isEqualTokens(node.colon, toNode.colon));
+    return _and(
+        _isEqualNodes(node.label, toNode.label),
+        _isEqualTokens(node.colon, toNode.colon));
   }
 
   @override
   bool visitLabeledStatement(LabeledStatement node) {
     LabeledStatement toNode = this._toNode as LabeledStatement;
-    return javaBooleanAnd(_isEqualNodeLists(node.labels, toNode.labels), _isEqualNodes(node.statement, toNode.statement));
+    return _and(
+        _isEqualNodeLists(node.labels, toNode.labels),
+        _isEqualNodes(node.statement, toNode.statement));
   }
 
   @override
   bool visitLibraryDirective(LibraryDirective node) {
     LibraryDirective toNode = this._toNode as LibraryDirective;
-    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualNodes(node.documentationComment, toNode.documentationComment), _isEqualNodeLists(node.metadata, toNode.metadata)), _isEqualTokens(node.libraryToken, toNode.libraryToken)), _isEqualNodes(node.name, toNode.name)), _isEqualTokens(node.semicolon, toNode.semicolon));
+    return _and(
+        _isEqualNodes(node.documentationComment, toNode.documentationComment),
+        _isEqualNodeLists(node.metadata, toNode.metadata),
+        _isEqualTokens(node.libraryToken, toNode.libraryToken),
+        _isEqualNodes(node.name, toNode.name),
+        _isEqualTokens(node.semicolon, toNode.semicolon));
   }
 
   @override
@@ -8818,7 +9090,12 @@
   @override
   bool visitListLiteral(ListLiteral node) {
     ListLiteral toNode = this._toNode as ListLiteral;
-    if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualTokens(node.constKeyword, toNode.constKeyword), _isEqualNodes(node.typeArguments, toNode.typeArguments)), _isEqualTokens(node.leftBracket, toNode.leftBracket)), _isEqualNodeLists(node.elements, toNode.elements)), _isEqualTokens(node.rightBracket, toNode.rightBracket))) {
+    if (_and(
+        _isEqualTokens(node.constKeyword, toNode.constKeyword),
+        _isEqualNodes(node.typeArguments, toNode.typeArguments),
+        _isEqualTokens(node.leftBracket, toNode.leftBracket),
+        _isEqualNodeLists(node.elements, toNode.elements),
+        _isEqualTokens(node.rightBracket, toNode.rightBracket))) {
       toNode.propagatedType = node.propagatedType;
       toNode.staticType = node.staticType;
       return true;
@@ -8829,7 +9106,12 @@
   @override
   bool visitMapLiteral(MapLiteral node) {
     MapLiteral toNode = this._toNode as MapLiteral;
-    if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualTokens(node.constKeyword, toNode.constKeyword), _isEqualNodes(node.typeArguments, toNode.typeArguments)), _isEqualTokens(node.leftBracket, toNode.leftBracket)), _isEqualNodeLists(node.entries, toNode.entries)), _isEqualTokens(node.rightBracket, toNode.rightBracket))) {
+    if (_and(
+        _isEqualTokens(node.constKeyword, toNode.constKeyword),
+        _isEqualNodes(node.typeArguments, toNode.typeArguments),
+        _isEqualTokens(node.leftBracket, toNode.leftBracket),
+        _isEqualNodeLists(node.entries, toNode.entries),
+        _isEqualTokens(node.rightBracket, toNode.rightBracket))) {
       toNode.propagatedType = node.propagatedType;
       toNode.staticType = node.staticType;
       return true;
@@ -8840,19 +9122,36 @@
   @override
   bool visitMapLiteralEntry(MapLiteralEntry node) {
     MapLiteralEntry toNode = this._toNode as MapLiteralEntry;
-    return javaBooleanAnd(javaBooleanAnd(_isEqualNodes(node.key, toNode.key), _isEqualTokens(node.separator, toNode.separator)), _isEqualNodes(node.value, toNode.value));
+    return _and(
+        _isEqualNodes(node.key, toNode.key),
+        _isEqualTokens(node.separator, toNode.separator),
+        _isEqualNodes(node.value, toNode.value));
   }
 
   @override
   bool visitMethodDeclaration(MethodDeclaration node) {
     MethodDeclaration toNode = this._toNode as MethodDeclaration;
-    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualNodes(node.documentationComment, toNode.documentationComment), _isEqualNodeLists(node.metadata, toNode.metadata)), _isEqualTokens(node.externalKeyword, toNode.externalKeyword)), _isEqualTokens(node.modifierKeyword, toNode.modifierKeyword)), _isEqualNodes(node.returnType, toNode.returnType)), _isEqualTokens(node.propertyKeyword, toNode.propertyKeyword)), _isEqualTokens(node.propertyKeyword, toNode.propertyKeyword)), _isEqualNodes(node.name, toNode.name)), _isEqualNodes(node.parameters, toNode.parameters)), _isEqualNodes(node.body, toNode.body));
+    return _and(
+        _isEqualNodes(node.documentationComment, toNode.documentationComment),
+        _isEqualNodeLists(node.metadata, toNode.metadata),
+        _isEqualTokens(node.externalKeyword, toNode.externalKeyword),
+        _isEqualTokens(node.modifierKeyword, toNode.modifierKeyword),
+        _isEqualNodes(node.returnType, toNode.returnType),
+        _isEqualTokens(node.propertyKeyword, toNode.propertyKeyword),
+        _isEqualTokens(node.propertyKeyword, toNode.propertyKeyword),
+        _isEqualNodes(node.name, toNode.name),
+        _isEqualNodes(node.parameters, toNode.parameters),
+        _isEqualNodes(node.body, toNode.body));
   }
 
   @override
   bool visitMethodInvocation(MethodInvocation node) {
     MethodInvocation toNode = this._toNode as MethodInvocation;
-    if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualNodes(node.target, toNode.target), _isEqualTokens(node.period, toNode.period)), _isEqualNodes(node.methodName, toNode.methodName)), _isEqualNodes(node.argumentList, toNode.argumentList))) {
+    if (_and(
+        _isEqualNodes(node.target, toNode.target),
+        _isEqualTokens(node.period, toNode.period),
+        _isEqualNodes(node.methodName, toNode.methodName),
+        _isEqualNodes(node.argumentList, toNode.argumentList))) {
       toNode.propagatedType = node.propagatedType;
       toNode.staticType = node.staticType;
       return true;
@@ -8863,7 +9162,9 @@
   @override
   bool visitNamedExpression(NamedExpression node) {
     NamedExpression toNode = this._toNode as NamedExpression;
-    if (javaBooleanAnd(_isEqualNodes(node.name, toNode.name), _isEqualNodes(node.expression, toNode.expression))) {
+    if (_and(
+        _isEqualNodes(node.name, toNode.name),
+        _isEqualNodes(node.expression, toNode.expression))) {
       toNode.propagatedType = node.propagatedType;
       toNode.staticType = node.staticType;
       return true;
@@ -8874,13 +9175,18 @@
   @override
   bool visitNativeClause(NativeClause node) {
     NativeClause toNode = this._toNode as NativeClause;
-    return javaBooleanAnd(_isEqualTokens(node.keyword, toNode.keyword), _isEqualNodes(node.name, toNode.name));
+    return _and(
+        _isEqualTokens(node.keyword, toNode.keyword),
+        _isEqualNodes(node.name, toNode.name));
   }
 
   @override
   bool visitNativeFunctionBody(NativeFunctionBody node) {
     NativeFunctionBody toNode = this._toNode as NativeFunctionBody;
-    return javaBooleanAnd(javaBooleanAnd(_isEqualTokens(node.nativeToken, toNode.nativeToken), _isEqualNodes(node.stringLiteral, toNode.stringLiteral)), _isEqualTokens(node.semicolon, toNode.semicolon));
+    return _and(
+        _isEqualTokens(node.nativeToken, toNode.nativeToken),
+        _isEqualNodes(node.stringLiteral, toNode.stringLiteral),
+        _isEqualTokens(node.semicolon, toNode.semicolon));
   }
 
   @override
@@ -8897,7 +9203,10 @@
   @override
   bool visitParenthesizedExpression(ParenthesizedExpression node) {
     ParenthesizedExpression toNode = this._toNode as ParenthesizedExpression;
-    if (javaBooleanAnd(javaBooleanAnd(_isEqualTokens(node.leftParenthesis, toNode.leftParenthesis), _isEqualNodes(node.expression, toNode.expression)), _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis))) {
+    if (_and(
+        _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis),
+        _isEqualNodes(node.expression, toNode.expression),
+        _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis))) {
       toNode.propagatedType = node.propagatedType;
       toNode.staticType = node.staticType;
       return true;
@@ -8908,7 +9217,12 @@
   @override
   bool visitPartDirective(PartDirective node) {
     PartDirective toNode = this._toNode as PartDirective;
-    if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualNodes(node.documentationComment, toNode.documentationComment), _isEqualNodeLists(node.metadata, toNode.metadata)), _isEqualTokens(node.partToken, toNode.partToken)), _isEqualNodes(node.uri, toNode.uri)), _isEqualTokens(node.semicolon, toNode.semicolon))) {
+    if (_and(
+        _isEqualNodes(node.documentationComment, toNode.documentationComment),
+        _isEqualNodeLists(node.metadata, toNode.metadata),
+        _isEqualTokens(node.partToken, toNode.partToken),
+        _isEqualNodes(node.uri, toNode.uri),
+        _isEqualTokens(node.semicolon, toNode.semicolon))) {
       toNode.element = node.element;
       return true;
     }
@@ -8918,7 +9232,13 @@
   @override
   bool visitPartOfDirective(PartOfDirective node) {
     PartOfDirective toNode = this._toNode as PartOfDirective;
-    if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualNodes(node.documentationComment, toNode.documentationComment), _isEqualNodeLists(node.metadata, toNode.metadata)), _isEqualTokens(node.partToken, toNode.partToken)), _isEqualTokens(node.ofToken, toNode.ofToken)), _isEqualNodes(node.libraryName, toNode.libraryName)), _isEqualTokens(node.semicolon, toNode.semicolon))) {
+    if (_and(
+        _isEqualNodes(node.documentationComment, toNode.documentationComment),
+        _isEqualNodeLists(node.metadata, toNode.metadata),
+        _isEqualTokens(node.partToken, toNode.partToken),
+        _isEqualTokens(node.ofToken, toNode.ofToken),
+        _isEqualNodes(node.libraryName, toNode.libraryName),
+        _isEqualTokens(node.semicolon, toNode.semicolon))) {
       toNode.element = node.element;
       return true;
     }
@@ -8928,7 +9248,9 @@
   @override
   bool visitPostfixExpression(PostfixExpression node) {
     PostfixExpression toNode = this._toNode as PostfixExpression;
-    if (javaBooleanAnd(_isEqualNodes(node.operand, toNode.operand), _isEqualTokens(node.operator, toNode.operator))) {
+    if (_and(
+        _isEqualNodes(node.operand, toNode.operand),
+        _isEqualTokens(node.operator, toNode.operator))) {
       toNode.propagatedElement = node.propagatedElement;
       toNode.propagatedType = node.propagatedType;
       toNode.staticElement = node.staticElement;
@@ -8941,7 +9263,10 @@
   @override
   bool visitPrefixedIdentifier(PrefixedIdentifier node) {
     PrefixedIdentifier toNode = this._toNode as PrefixedIdentifier;
-    if (javaBooleanAnd(javaBooleanAnd(_isEqualNodes(node.prefix, toNode.prefix), _isEqualTokens(node.period, toNode.period)), _isEqualNodes(node.identifier, toNode.identifier))) {
+    if (_and(
+        _isEqualNodes(node.prefix, toNode.prefix),
+        _isEqualTokens(node.period, toNode.period),
+        _isEqualNodes(node.identifier, toNode.identifier))) {
       toNode.propagatedType = node.propagatedType;
       toNode.staticType = node.staticType;
       return true;
@@ -8952,7 +9277,9 @@
   @override
   bool visitPrefixExpression(PrefixExpression node) {
     PrefixExpression toNode = this._toNode as PrefixExpression;
-    if (javaBooleanAnd(_isEqualTokens(node.operator, toNode.operator), _isEqualNodes(node.operand, toNode.operand))) {
+    if (_and(
+        _isEqualTokens(node.operator, toNode.operator),
+        _isEqualNodes(node.operand, toNode.operand))) {
       toNode.propagatedElement = node.propagatedElement;
       toNode.propagatedType = node.propagatedType;
       toNode.staticElement = node.staticElement;
@@ -8965,7 +9292,10 @@
   @override
   bool visitPropertyAccess(PropertyAccess node) {
     PropertyAccess toNode = this._toNode as PropertyAccess;
-    if (javaBooleanAnd(javaBooleanAnd(_isEqualNodes(node.target, toNode.target), _isEqualTokens(node.operator, toNode.operator)), _isEqualNodes(node.propertyName, toNode.propertyName))) {
+    if (_and(
+        _isEqualNodes(node.target, toNode.target),
+        _isEqualTokens(node.operator, toNode.operator),
+        _isEqualNodes(node.propertyName, toNode.propertyName))) {
       toNode.propagatedType = node.propagatedType;
       toNode.staticType = node.staticType;
       return true;
@@ -8976,7 +9306,11 @@
   @override
   bool visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) {
     RedirectingConstructorInvocation toNode = this._toNode as RedirectingConstructorInvocation;
-    if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualTokens(node.keyword, toNode.keyword), _isEqualTokens(node.period, toNode.period)), _isEqualNodes(node.constructorName, toNode.constructorName)), _isEqualNodes(node.argumentList, toNode.argumentList))) {
+    if (_and(
+        _isEqualTokens(node.keyword, toNode.keyword),
+        _isEqualTokens(node.period, toNode.period),
+        _isEqualNodes(node.constructorName, toNode.constructorName),
+        _isEqualNodes(node.argumentList, toNode.argumentList))) {
       toNode.staticElement = node.staticElement;
       return true;
     }
@@ -8997,7 +9331,10 @@
   @override
   bool visitReturnStatement(ReturnStatement node) {
     ReturnStatement toNode = this._toNode as ReturnStatement;
-    return javaBooleanAnd(javaBooleanAnd(_isEqualTokens(node.keyword, toNode.keyword), _isEqualNodes(node.expression, toNode.expression)), _isEqualTokens(node.semicolon, toNode.semicolon));
+    return _and(
+        _isEqualTokens(node.keyword, toNode.keyword),
+        _isEqualNodes(node.expression, toNode.expression),
+        _isEqualTokens(node.semicolon, toNode.semicolon));
   }
 
   @override
@@ -9009,13 +9346,20 @@
   @override
   bool visitShowCombinator(ShowCombinator node) {
     ShowCombinator toNode = this._toNode as ShowCombinator;
-    return javaBooleanAnd(_isEqualTokens(node.keyword, toNode.keyword), _isEqualNodeLists(node.shownNames, toNode.shownNames));
+    return _and(
+        _isEqualTokens(node.keyword, toNode.keyword),
+        _isEqualNodeLists(node.shownNames, toNode.shownNames));
   }
 
   @override
   bool visitSimpleFormalParameter(SimpleFormalParameter node) {
     SimpleFormalParameter toNode = this._toNode as SimpleFormalParameter;
-    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualNodes(node.documentationComment, toNode.documentationComment), _isEqualNodeLists(node.metadata, toNode.metadata)), _isEqualTokens(node.keyword, toNode.keyword)), _isEqualNodes(node.type, toNode.type)), _isEqualNodes(node.identifier, toNode.identifier));
+    return _and(
+        _isEqualNodes(node.documentationComment, toNode.documentationComment),
+        _isEqualNodeLists(node.metadata, toNode.metadata),
+        _isEqualTokens(node.keyword, toNode.keyword),
+        _isEqualNodes(node.type, toNode.type),
+        _isEqualNodes(node.identifier, toNode.identifier));
   }
 
   @override
@@ -9035,7 +9379,9 @@
   @override
   bool visitSimpleStringLiteral(SimpleStringLiteral node) {
     SimpleStringLiteral toNode = this._toNode as SimpleStringLiteral;
-    if (javaBooleanAnd(_isEqualTokens(node.literal, toNode.literal), identical(node.value, toNode.value))) {
+    if (_and(
+        _isEqualTokens(node.literal, toNode.literal),
+        node.value == toNode.value)) {
       toNode.propagatedType = node.propagatedType;
       toNode.staticType = node.staticType;
       return true;
@@ -9057,7 +9403,11 @@
   @override
   bool visitSuperConstructorInvocation(SuperConstructorInvocation node) {
     SuperConstructorInvocation toNode = this._toNode as SuperConstructorInvocation;
-    if (javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualTokens(node.keyword, toNode.keyword), _isEqualTokens(node.period, toNode.period)), _isEqualNodes(node.constructorName, toNode.constructorName)), _isEqualNodes(node.argumentList, toNode.argumentList))) {
+    if (_and(
+        _isEqualTokens(node.keyword, toNode.keyword),
+        _isEqualTokens(node.period, toNode.period),
+        _isEqualNodes(node.constructorName, toNode.constructorName),
+        _isEqualNodes(node.argumentList, toNode.argumentList))) {
       toNode.staticElement = node.staticElement;
       return true;
     }
@@ -9078,25 +9428,43 @@
   @override
   bool visitSwitchCase(SwitchCase node) {
     SwitchCase toNode = this._toNode as SwitchCase;
-    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualNodeLists(node.labels, toNode.labels), _isEqualTokens(node.keyword, toNode.keyword)), _isEqualNodes(node.expression, toNode.expression)), _isEqualTokens(node.colon, toNode.colon)), _isEqualNodeLists(node.statements, toNode.statements));
+    return _and(
+        _isEqualNodeLists(node.labels, toNode.labels),
+        _isEqualTokens(node.keyword, toNode.keyword),
+        _isEqualNodes(node.expression, toNode.expression),
+        _isEqualTokens(node.colon, toNode.colon),
+        _isEqualNodeLists(node.statements, toNode.statements));
   }
 
   @override
   bool visitSwitchDefault(SwitchDefault node) {
     SwitchDefault toNode = this._toNode as SwitchDefault;
-    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualNodeLists(node.labels, toNode.labels), _isEqualTokens(node.keyword, toNode.keyword)), _isEqualTokens(node.colon, toNode.colon)), _isEqualNodeLists(node.statements, toNode.statements));
+    return _and(
+        _isEqualNodeLists(node.labels, toNode.labels),
+        _isEqualTokens(node.keyword, toNode.keyword),
+        _isEqualTokens(node.colon, toNode.colon),
+        _isEqualNodeLists(node.statements, toNode.statements));
   }
 
   @override
   bool visitSwitchStatement(SwitchStatement node) {
     SwitchStatement toNode = this._toNode as SwitchStatement;
-    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualTokens(node.keyword, toNode.keyword), _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis)), _isEqualNodes(node.expression, toNode.expression)), _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis)), _isEqualTokens(node.leftBracket, toNode.leftBracket)), _isEqualNodeLists(node.members, toNode.members)), _isEqualTokens(node.rightBracket, toNode.rightBracket));
+    return _and(
+        _isEqualTokens(node.keyword, toNode.keyword),
+        _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis),
+        _isEqualNodes(node.expression, toNode.expression),
+        _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis),
+        _isEqualTokens(node.leftBracket, toNode.leftBracket),
+        _isEqualNodeLists(node.members, toNode.members),
+        _isEqualTokens(node.rightBracket, toNode.rightBracket));
   }
 
   @override
   bool visitSymbolLiteral(SymbolLiteral node) {
     SymbolLiteral toNode = this._toNode as SymbolLiteral;
-    if (javaBooleanAnd(_isEqualTokens(node.poundSign, toNode.poundSign), _isEqualTokenLists(node.components, toNode.components))) {
+    if (_and(
+        _isEqualTokens(node.poundSign, toNode.poundSign),
+        _isEqualTokenLists(node.components, toNode.components))) {
       toNode.propagatedType = node.propagatedType;
       toNode.staticType = node.staticType;
       return true;
@@ -9118,7 +9486,9 @@
   @override
   bool visitThrowExpression(ThrowExpression node) {
     ThrowExpression toNode = this._toNode as ThrowExpression;
-    if (javaBooleanAnd(_isEqualTokens(node.keyword, toNode.keyword), _isEqualNodes(node.expression, toNode.expression))) {
+    if (_and(
+        _isEqualTokens(node.keyword, toNode.keyword),
+        _isEqualNodes(node.expression, toNode.expression))) {
       toNode.propagatedType = node.propagatedType;
       toNode.staticType = node.staticType;
       return true;
@@ -9129,25 +9499,39 @@
   @override
   bool visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
     TopLevelVariableDeclaration toNode = this._toNode as TopLevelVariableDeclaration;
-    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualNodes(node.documentationComment, toNode.documentationComment), _isEqualNodeLists(node.metadata, toNode.metadata)), _isEqualNodes(node.variables, toNode.variables)), _isEqualTokens(node.semicolon, toNode.semicolon));
+    return _and(
+        _isEqualNodes(node.documentationComment, toNode.documentationComment),
+        _isEqualNodeLists(node.metadata, toNode.metadata),
+        _isEqualNodes(node.variables, toNode.variables),
+        _isEqualTokens(node.semicolon, toNode.semicolon));
   }
 
   @override
   bool visitTryStatement(TryStatement node) {
     TryStatement toNode = this._toNode as TryStatement;
-    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualTokens(node.tryKeyword, toNode.tryKeyword), _isEqualNodes(node.body, toNode.body)), _isEqualNodeLists(node.catchClauses, toNode.catchClauses)), _isEqualTokens(node.finallyKeyword, toNode.finallyKeyword)), _isEqualNodes(node.finallyBlock, toNode.finallyBlock));
+    return _and(
+        _isEqualTokens(node.tryKeyword, toNode.tryKeyword),
+        _isEqualNodes(node.body, toNode.body),
+        _isEqualNodeLists(node.catchClauses, toNode.catchClauses),
+        _isEqualTokens(node.finallyKeyword, toNode.finallyKeyword),
+        _isEqualNodes(node.finallyBlock, toNode.finallyBlock));
   }
 
   @override
   bool visitTypeArgumentList(TypeArgumentList node) {
     TypeArgumentList toNode = this._toNode as TypeArgumentList;
-    return javaBooleanAnd(javaBooleanAnd(_isEqualTokens(node.leftBracket, toNode.leftBracket), _isEqualNodeLists(node.arguments, toNode.arguments)), _isEqualTokens(node.rightBracket, toNode.rightBracket));
+    return _and(
+        _isEqualTokens(node.leftBracket, toNode.leftBracket),
+        _isEqualNodeLists(node.arguments, toNode.arguments),
+        _isEqualTokens(node.rightBracket, toNode.rightBracket));
   }
 
   @override
   bool visitTypeName(TypeName node) {
     TypeName toNode = this._toNode as TypeName;
-    if (javaBooleanAnd(_isEqualNodes(node.name, toNode.name), _isEqualNodes(node.typeArguments, toNode.typeArguments))) {
+    if (_and(
+        _isEqualNodes(node.name, toNode.name),
+        _isEqualNodes(node.typeArguments, toNode.typeArguments))) {
       toNode.type = node.type;
       return true;
     }
@@ -9157,49 +9541,89 @@
   @override
   bool visitTypeParameter(TypeParameter node) {
     TypeParameter toNode = this._toNode as TypeParameter;
-    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualNodes(node.documentationComment, toNode.documentationComment), _isEqualNodeLists(node.metadata, toNode.metadata)), _isEqualNodes(node.name, toNode.name)), _isEqualTokens(node.keyword, toNode.keyword)), _isEqualNodes(node.bound, toNode.bound));
+    return _and(
+        _isEqualNodes(node.documentationComment, toNode.documentationComment),
+        _isEqualNodeLists(node.metadata, toNode.metadata),
+        _isEqualNodes(node.name, toNode.name),
+        _isEqualTokens(node.keyword, toNode.keyword),
+        _isEqualNodes(node.bound, toNode.bound));
   }
 
   @override
   bool visitTypeParameterList(TypeParameterList node) {
     TypeParameterList toNode = this._toNode as TypeParameterList;
-    return javaBooleanAnd(javaBooleanAnd(_isEqualTokens(node.leftBracket, toNode.leftBracket), _isEqualNodeLists(node.typeParameters, toNode.typeParameters)), _isEqualTokens(node.rightBracket, toNode.rightBracket));
+    return _and(
+        _isEqualTokens(node.leftBracket, toNode.leftBracket),
+        _isEqualNodeLists(node.typeParameters, toNode.typeParameters),
+        _isEqualTokens(node.rightBracket, toNode.rightBracket));
   }
 
   @override
   bool visitVariableDeclaration(VariableDeclaration node) {
     VariableDeclaration toNode = this._toNode as VariableDeclaration;
-    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualNodes(node.documentationComment, toNode.documentationComment), _isEqualNodeLists(node.metadata, toNode.metadata)), _isEqualNodes(node.name, toNode.name)), _isEqualTokens(node.equals, toNode.equals)), _isEqualNodes(node.initializer, toNode.initializer));
+    return _and(
+        _isEqualNodes(node.documentationComment, toNode.documentationComment),
+        _isEqualNodeLists(node.metadata, toNode.metadata),
+        _isEqualNodes(node.name, toNode.name),
+        _isEqualTokens(node.equals, toNode.equals),
+        _isEqualNodes(node.initializer, toNode.initializer));
   }
 
   @override
   bool visitVariableDeclarationList(VariableDeclarationList node) {
     VariableDeclarationList toNode = this._toNode as VariableDeclarationList;
-    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualNodes(node.documentationComment, toNode.documentationComment), _isEqualNodeLists(node.metadata, toNode.metadata)), _isEqualTokens(node.keyword, toNode.keyword)), _isEqualNodes(node.type, toNode.type)), _isEqualNodeLists(node.variables, toNode.variables));
+    return _and(
+        _isEqualNodes(node.documentationComment, toNode.documentationComment),
+        _isEqualNodeLists(node.metadata, toNode.metadata),
+        _isEqualTokens(node.keyword, toNode.keyword),
+        _isEqualNodes(node.type, toNode.type),
+        _isEqualNodeLists(node.variables, toNode.variables));
   }
 
   @override
   bool visitVariableDeclarationStatement(VariableDeclarationStatement node) {
     VariableDeclarationStatement toNode = this._toNode as VariableDeclarationStatement;
-    return javaBooleanAnd(_isEqualNodes(node.variables, toNode.variables), _isEqualTokens(node.semicolon, toNode.semicolon));
+    return _and(
+        _isEqualNodes(node.variables, toNode.variables),
+        _isEqualTokens(node.semicolon, toNode.semicolon));
   }
 
   @override
   bool visitWhileStatement(WhileStatement node) {
     WhileStatement toNode = this._toNode as WhileStatement;
-    return javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(javaBooleanAnd(_isEqualTokens(node.keyword, toNode.keyword), _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis)), _isEqualNodes(node.condition, toNode.condition)), _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis)), _isEqualNodes(node.body, toNode.body));
+    return _and(
+        _isEqualTokens(node.keyword, toNode.keyword),
+        _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis),
+        _isEqualNodes(node.condition, toNode.condition),
+        _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis),
+        _isEqualNodes(node.body, toNode.body));
   }
 
   @override
   bool visitWithClause(WithClause node) {
     WithClause toNode = this._toNode as WithClause;
-    return javaBooleanAnd(_isEqualTokens(node.withKeyword, toNode.withKeyword), _isEqualNodeLists(node.mixinTypes, toNode.mixinTypes));
+    return _and(
+        _isEqualTokens(node.withKeyword, toNode.withKeyword),
+        _isEqualNodeLists(node.mixinTypes, toNode.mixinTypes));
   }
 
   @override
   bool visitYieldStatement(YieldStatement node) {
     YieldStatement toNode = this._toNode as YieldStatement;
-    return javaBooleanAnd(javaBooleanAnd(_isEqualTokens(node.yieldKeyword, toNode.yieldKeyword), _isEqualNodes(node.expression, toNode.expression)), _isEqualTokens(node.semicolon, toNode.semicolon));
+    return _and(
+        _isEqualTokens(node.yieldKeyword, toNode.yieldKeyword),
+        _isEqualNodes(node.expression, toNode.expression),
+        _isEqualTokens(node.semicolon, toNode.semicolon));
+  }
+
+  /**
+   * Return `true` if all of the parameters are `true`.
+   */
+  bool _and(bool b1, bool b2, [bool b3 = true, bool b4 = true, bool b5 = true,
+      bool b6 = true, bool b7 = true, bool b8 = true, bool b9 = true,
+      bool b10 = true, bool b11 = true, bool b12 = true, bool b13 = true]) {
+    return b1 && b2 && b3 && b4 && b5 && b6 && b7 && b8 && b9 && b10 && b11
+        && b12 && b13;
   }
 
   /**
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index 1717d76..c1c4bed 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -8,6 +8,8 @@
 library engine.resolver;
 
 import 'dart:collection';
+import "dart:math" as math;
+
 import 'java_core.dart';
 import 'java_engine.dart';
 import 'instrumentation.dart';
@@ -422,10 +424,10 @@
    * Parses [AngularPropertyElement]s from [annotation] and [classDeclaration].
    */
   List<AngularPropertyElement> _parseComponentProperties() {
-    List<AngularPropertyElement> properties = [];
+    List<AngularPropertyElement> properties = <AngularPropertyElement>[];
     _parseComponentProperties_fromMap(properties);
     _parseComponentProperties_fromFields(properties);
-    return new List.from(properties);
+    return properties;
   }
 
   /**
@@ -611,9 +613,9 @@
   }
 
   List<AngularScopePropertyElement> _parseScopeProperties() {
-    List<AngularScopePropertyElement> properties = [];
+    List<AngularScopePropertyElement> properties = <AngularScopePropertyElement>[];
     _classDeclaration.accept(new RecursiveAstVisitor_AngularCompilationUnitBuilder_parseScopeProperties(properties));
-    return new List.from(properties);
+    return properties;
   }
 
   /**
@@ -621,10 +623,10 @@
    * where <code>view</code> is <code>ViewFactory</code>.
    */
   void _parseViews() {
-    List<AngularViewElement> views = [];
+    List<AngularViewElement> views = <AngularViewElement>[];
     _unit.accept(new RecursiveAstVisitor_AngularCompilationUnitBuilder_parseViews(views));
     if (!views.isEmpty) {
-      List<AngularViewElement> viewArray = new List.from(views);
+      List<AngularViewElement> viewArray = views;
       (_unit.element as CompilationUnitElementImpl).angularViews = viewArray;
     }
   }
@@ -976,7 +978,9 @@
     }
     bool problemReported = false;
     for (Expression argument in argumentList.arguments) {
-      problemReported = javaBooleanOr(problemReported, _checkForArgumentTypeNotAssignableForArgument(argument));
+      if (_checkForArgumentTypeNotAssignableForArgument(argument)) {
+        problemReported = true;
+      }
     }
     return problemReported;
   }
@@ -999,7 +1003,7 @@
         ConstructorElement constructorElement = element;
         displayName = constructorElement.enclosingElement.displayName;
         if (!constructorElement.displayName.isEmpty) {
-          displayName = "${displayName}.${constructorElement.displayName}";
+          displayName = "$displayName.${constructorElement.displayName}";
         }
       }
       _errorReporter.reportErrorForNode(HintCode.DEPRECATED_MEMBER_USE, node, [displayName]);
@@ -3371,17 +3375,17 @@
     }
     ParameterElement element = parameters == null ? null : _findIdentifier(parameters, parameterName);
     if (element == null) {
-      PrintStringWriter writer = new PrintStringWriter();
-      writer.println("Invalid state found in the Analysis Engine:");
-      writer.println("DeclarationResolver.getElementForParameter() is visiting a parameter that does not appear to be in a method or function.");
-      writer.println("Ancestors:");
+      StringBuffer buffer = new StringBuffer();
+      buffer.writeln("Invalid state found in the Analysis Engine:");
+      buffer.writeln("DeclarationResolver.getElementForParameter() is visiting a parameter that does not appear to be in a method or function.");
+      buffer.writeln("Ancestors:");
       AstNode parent = node.parent;
       while (parent != null) {
-        writer.println(parent.runtimeType.toString());
-        writer.println("---------");
+        buffer.writeln(parent.runtimeType.toString());
+        buffer.writeln("---------");
         parent = parent.parent;
       }
-      AnalysisEngine.instance.logger.logError2(writer.toString(), new CaughtException(new AnalysisException(), null));
+      AnalysisEngine.instance.logger.logError2(buffer.toString(), new CaughtException(new AnalysisException(), null));
     }
     return element;
   }
@@ -3985,13 +3989,13 @@
     } catch (ex) {
       if (node.name.staticElement == null) {
         ClassDeclaration classNode = node.getAncestor((node) => node is ClassDeclaration);
-        JavaStringBuilder builder = new JavaStringBuilder();
-        builder.append("The element for the method ");
-        builder.append(node.name);
-        builder.append(" in ");
-        builder.append(classNode.name);
-        builder.append(" was not set while trying to build the element model.");
-        AnalysisEngine.instance.logger.logError2(builder.toString(), new AnalysisException(builder.toString(), new CaughtException(ex, null)));
+        StringBuffer buffer = new StringBuffer();
+        buffer.write("The element for the method ");
+        buffer.write(node.name);
+        buffer.write(" in ");
+        buffer.write(classNode.name);
+        buffer.write(" was not set while trying to build the element model.");
+        AnalysisEngine.instance.logger.logError2(buffer.toString(), new AnalysisException(buffer.toString(), new CaughtException(ex, null)));
       } else {
         String message = "Exception caught in ElementBuilder.visitMethodDeclaration()";
         AnalysisEngine.instance.logger.logError2(message, new AnalysisException(message, new CaughtException(ex, null)));
@@ -3999,13 +4003,13 @@
     } finally {
       if (node.name.staticElement == null) {
         ClassDeclaration classNode = node.getAncestor((node) => node is ClassDeclaration);
-        JavaStringBuilder builder = new JavaStringBuilder();
-        builder.append("The element for the method ");
-        builder.append(node.name);
-        builder.append(" in ");
-        builder.append(classNode.name);
-        builder.append(" was not set while trying to resolve types.");
-        AnalysisEngine.instance.logger.logError2(builder.toString(), new CaughtException(new AnalysisException(builder.toString()), null));
+        StringBuffer buffer = new StringBuffer();
+        buffer.write("The element for the method ");
+        buffer.write(node.name);
+        buffer.write(" in ");
+        buffer.write(classNode.name);
+        buffer.write(" was not set while trying to resolve types.");
+        AnalysisEngine.instance.logger.logError2(buffer.toString(), new CaughtException(new AnalysisException(buffer.toString()), null));
       }
     }
     return null;
@@ -4298,7 +4302,7 @@
 
   List<LabelElement> _labels;
 
-  List<VariableElement> _localVariables;
+  List<LocalVariableElement> _localVariables;
 
   List<MethodElement> _methods;
 
@@ -4356,7 +4360,7 @@
 
   void addLocalVariable(LocalVariableElement element) {
     if (_localVariables == null) {
-      _localVariables = new List<VariableElement>();
+      _localVariables = new List<LocalVariableElement>();
     }
     _localVariables.add(element);
   }
@@ -4407,7 +4411,7 @@
     if (_accessors == null) {
       return PropertyAccessorElementImpl.EMPTY_ARRAY;
     }
-    List<PropertyAccessorElement> result = new List.from(_accessors);
+    List<PropertyAccessorElement> result = _accessors;
     _accessors = null;
     return result;
   }
@@ -4416,7 +4420,7 @@
     if (_constructors == null) {
       return ConstructorElementImpl.EMPTY_ARRAY;
     }
-    List<ConstructorElement> result = new List.from(_constructors);
+    List<ConstructorElement> result = _constructors;
     _constructors = null;
     return result;
   }
@@ -4425,7 +4429,7 @@
     if (_enums == null) {
       return ClassElementImpl.EMPTY_ARRAY;
     }
-    List<ClassElement> result = new List.from(_enums);
+    List<ClassElement> result = _enums;
     _enums = null;
     return result;
   }
@@ -4446,7 +4450,7 @@
     if (_fields == null) {
       return FieldElementImpl.EMPTY_ARRAY;
     }
-    List<FieldElement> result = new List.from(_fields);
+    List<FieldElement> result = _fields;
     _fields = null;
     return result;
   }
@@ -4455,7 +4459,7 @@
     if (_fields == null) {
       return FieldElementImpl.EMPTY_ARRAY;
     }
-    List<FieldElement> result = new List.from(_fields);
+    List<FieldElement> result = _fields;
     return result;
   }
 
@@ -4463,7 +4467,7 @@
     if (_functions == null) {
       return FunctionElementImpl.EMPTY_ARRAY;
     }
-    List<FunctionElement> result = new List.from(_functions);
+    List<FunctionElement> result = _functions;
     _functions = null;
     return result;
   }
@@ -4472,7 +4476,7 @@
     if (_labels == null) {
       return LabelElementImpl.EMPTY_ARRAY;
     }
-    List<LabelElement> result = new List.from(_labels);
+    List<LabelElement> result = _labels;
     _labels = null;
     return result;
   }
@@ -4481,7 +4485,7 @@
     if (_localVariables == null) {
       return LocalVariableElementImpl.EMPTY_ARRAY;
     }
-    List<LocalVariableElement> result = new List.from(_localVariables);
+    List<LocalVariableElement> result = _localVariables;
     _localVariables = null;
     return result;
   }
@@ -4490,7 +4494,7 @@
     if (_methods == null) {
       return MethodElementImpl.EMPTY_ARRAY;
     }
-    List<MethodElement> result = new List.from(_methods);
+    List<MethodElement> result = _methods;
     _methods = null;
     return result;
   }
@@ -4499,7 +4503,7 @@
     if (_parameters == null) {
       return ParameterElementImpl.EMPTY_ARRAY;
     }
-    List<ParameterElement> result = new List.from(_parameters);
+    List<ParameterElement> result = _parameters;
     _parameters = null;
     return result;
   }
@@ -4520,7 +4524,7 @@
     if (_topLevelVariables == null) {
       return TopLevelVariableElementImpl.EMPTY_ARRAY;
     }
-    List<TopLevelVariableElement> result = new List.from(_topLevelVariables);
+    List<TopLevelVariableElement> result = _topLevelVariables;
     _topLevelVariables = null;
     return result;
   }
@@ -4529,7 +4533,7 @@
     if (_typeAliases == null) {
       return FunctionTypeAliasElementImpl.EMPTY_ARRAY;
     }
-    List<FunctionTypeAliasElement> result = new List.from(_typeAliases);
+    List<FunctionTypeAliasElement> result = _typeAliases;
     _typeAliases = null;
     return result;
   }
@@ -4538,7 +4542,7 @@
     if (_typeParameters == null) {
       return TypeParameterElementImpl.EMPTY_ARRAY;
     }
-    List<TypeParameterElement> result = new List.from(_typeParameters);
+    List<TypeParameterElement> result = _typeParameters;
     _typeParameters = null;
     return result;
   }
@@ -4547,96 +4551,96 @@
     if (_types == null) {
       return ClassElementImpl.EMPTY_ARRAY;
     }
-    List<ClassElement> result = new List.from(_types);
+    List<ClassElement> result = _types;
     _types = null;
     return result;
   }
 
   void validate() {
-    JavaStringBuilder builder = new JavaStringBuilder();
+    StringBuffer buffer = new StringBuffer();
     if (_accessors != null) {
-      builder.append(_accessors.length);
-      builder.append(" accessors");
+      buffer.write(_accessors.length);
+      buffer.write(" accessors");
     }
     if (_constructors != null) {
-      if (builder.length > 0) {
-        builder.append("; ");
+      if (buffer.length > 0) {
+        buffer.write("; ");
       }
-      builder.append(_constructors.length);
-      builder.append(" constructors");
+      buffer.write(_constructors.length);
+      buffer.write(" constructors");
     }
     if (_fields != null) {
-      if (builder.length > 0) {
-        builder.append("; ");
+      if (buffer.length > 0) {
+        buffer.write("; ");
       }
-      builder.append(_fields.length);
-      builder.append(" fields");
+      buffer.write(_fields.length);
+      buffer.write(" fields");
     }
     if (_functions != null) {
-      if (builder.length > 0) {
-        builder.append("; ");
+      if (buffer.length > 0) {
+        buffer.write("; ");
       }
-      builder.append(_functions.length);
-      builder.append(" functions");
+      buffer.write(_functions.length);
+      buffer.write(" functions");
     }
     if (_labels != null) {
-      if (builder.length > 0) {
-        builder.append("; ");
+      if (buffer.length > 0) {
+        buffer.write("; ");
       }
-      builder.append(_labels.length);
-      builder.append(" labels");
+      buffer.write(_labels.length);
+      buffer.write(" labels");
     }
     if (_localVariables != null) {
-      if (builder.length > 0) {
-        builder.append("; ");
+      if (buffer.length > 0) {
+        buffer.write("; ");
       }
-      builder.append(_localVariables.length);
-      builder.append(" local variables");
+      buffer.write(_localVariables.length);
+      buffer.write(" local variables");
     }
     if (_methods != null) {
-      if (builder.length > 0) {
-        builder.append("; ");
+      if (buffer.length > 0) {
+        buffer.write("; ");
       }
-      builder.append(_methods.length);
-      builder.append(" methods");
+      buffer.write(_methods.length);
+      buffer.write(" methods");
     }
     if (_parameters != null) {
-      if (builder.length > 0) {
-        builder.append("; ");
+      if (buffer.length > 0) {
+        buffer.write("; ");
       }
-      builder.append(_parameters.length);
-      builder.append(" parameters");
+      buffer.write(_parameters.length);
+      buffer.write(" parameters");
     }
     if (_topLevelVariables != null) {
-      if (builder.length > 0) {
-        builder.append("; ");
+      if (buffer.length > 0) {
+        buffer.write("; ");
       }
-      builder.append(_topLevelVariables.length);
-      builder.append(" top-level variables");
+      buffer.write(_topLevelVariables.length);
+      buffer.write(" top-level variables");
     }
     if (_types != null) {
-      if (builder.length > 0) {
-        builder.append("; ");
+      if (buffer.length > 0) {
+        buffer.write("; ");
       }
-      builder.append(_types.length);
-      builder.append(" types");
+      buffer.write(_types.length);
+      buffer.write(" types");
     }
     if (_typeAliases != null) {
-      if (builder.length > 0) {
-        builder.append("; ");
+      if (buffer.length > 0) {
+        buffer.write("; ");
       }
-      builder.append(_typeAliases.length);
-      builder.append(" type aliases");
+      buffer.write(_typeAliases.length);
+      buffer.write(" type aliases");
     }
     if (_typeParameters != null) {
-      if (builder.length > 0) {
-        builder.append("; ");
+      if (buffer.length > 0) {
+        buffer.write("; ");
       }
-      builder.append(_typeParameters.length);
-      builder.append(" type parameters");
+      buffer.write(_typeParameters.length);
+      buffer.write(" type parameters");
     }
-    if (builder.length > 0) {
-      AnalysisEngine.instance.logger.logError("Failed to capture elements: ${builder.toString()}");
+    if (buffer.length > 0) {
+      AnalysisEngine.instance.logger.logError("Failed to capture elements: $buffer");
     }
   }
 }
@@ -6881,7 +6885,7 @@
         String nameStr = name.name;
         Element element = namespace.get(nameStr);
         if (element == null) {
-          element = namespace.get("${nameStr}=");
+          element = namespace.get("$nameStr=");
         }
         if (element != null) {
           // Ensure that the name always resolves to a top-level variable
@@ -6981,7 +6985,7 @@
         // Look to see whether the name of the method is really part of a prefixed identifier for an
         // imported top-level function or top-level getter that returns a function.
         //
-        String name = "${target.name}.${methodName}";
+        String name = "${target.name}.$methodName";
         Identifier functionName = new ElementResolver_SyntheticIdentifier(name);
         Element element = _resolver.nameScope.lookup(functionName, _definingLibrary);
         if (element != null) {
@@ -7178,7 +7182,7 @@
       }
     }
     if (!annotationList.isEmpty) {
-      (element as ElementImpl).metadata = new List.from(annotationList);
+      (element as ElementImpl).metadata = annotationList;
     }
   }
 
@@ -7197,7 +7201,7 @@
     List<ElementAnnotationImpl> annotationList = new List<ElementAnnotationImpl>();
     _addAnnotations(annotationList, node.metadata);
     if (!annotationList.isEmpty) {
-      (element as ElementImpl).metadata = new List.from(annotationList);
+      (element as ElementImpl).metadata = annotationList;
     }
   }
 
@@ -7401,8 +7405,8 @@
     //
     // Finish building the enum.
     //
-    enumElement.fields = new List.from(fields);
-    enumElement.accessors = new List.from(getters);
+    enumElement.fields = fields;
+    enumElement.accessors = getters;
     // Client code isn't allowed to invoke the constructor, so we do not model it.
     return super.visitEnumDeclaration(node);
   }
@@ -7417,6 +7421,7 @@
     PropertyAccessorElementImpl getter = new PropertyAccessorElementImpl.forVariable(field);
     getter.getter = true;
     getter.returnType = field.type;
+    getter.type = new FunctionTypeImpl.con1(getter);
     field.getter = getter;
     return getter;
   }
@@ -8558,19 +8563,25 @@
         }
       }
     }
-    // Visit all of the states in the map to ensure that none were never initialized.
-    for (MapEntry<FieldElement, INIT_STATE> entry in getMapEntrySet(fieldElementsMap)) {
-      if (entry.getValue() == INIT_STATE.NOT_INIT) {
-        FieldElement fieldElement = entry.getKey();
+    // Visit all of the states in the map to ensure that none were never
+    // initialized.
+    fieldElementsMap.forEach((FieldElement fieldElement, INIT_STATE state) {
+      if (state == INIT_STATE.NOT_INIT) {
         if (fieldElement.isConst) {
-          _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_NOT_INITIALIZED, node.returnType, [fieldElement.name]);
+          _errorReporter.reportErrorForNode(
+              CompileTimeErrorCode.CONST_NOT_INITIALIZED,
+                  node.returnType,
+                  [fieldElement.name]);
           foundError = true;
         } else if (fieldElement.isFinal) {
-          _errorReporter.reportErrorForNode(StaticWarningCode.FINAL_NOT_INITIALIZED, node.returnType, [fieldElement.name]);
+          _errorReporter.reportErrorForNode(
+              StaticWarningCode.FINAL_NOT_INITIALIZED,
+                  node.returnType,
+                  [fieldElement.name]);
           foundError = true;
         }
       }
-    }
+    });
     return foundError;
   }
 
@@ -8631,17 +8642,16 @@
           overriddenExecutable.enclosingElement.displayName]);
       return true;
     }
-    // For each named parameter in the overridden method, verify that there is the same name in
-    // the overriding method, and in the same order.
-    Set<String> overridingParameterNameSet = overridingNamedPT.keys.toSet();
-    JavaIterator<String> overriddenParameterNameIterator = new JavaIterator(overriddenNamedPT.keys.toSet());
-    while (overriddenParameterNameIterator.hasNext) {
-      String overriddenParamName = overriddenParameterNameIterator.next();
-      if (!overridingParameterNameSet.contains(overriddenParamName)) {
-        // The overridden method expected the overriding method to have overridingParamName,
-        // but it does not.
-        _errorReporter.reportErrorForNode(StaticWarningCode.INVALID_OVERRIDE_NAMED, errorNameTarget, [
-            overriddenParamName,
+    // For each named parameter in the overridden method, verify that there is
+    // the same name in the overriding method.
+    for (String overriddenParamName in overriddenNamedPT.keys) {
+      if (!overridingNamedPT.containsKey(overriddenParamName)) {
+        // The overridden method expected the overriding method to have
+        // overridingParamName, but it does not.
+        _errorReporter.reportErrorForNode(
+            StaticWarningCode.INVALID_OVERRIDE_NAMED,
+            errorNameTarget,
+            [overriddenParamName,
             overriddenExecutable.enclosingElement.displayName]);
         return true;
       }
@@ -8681,31 +8691,33 @@
       parameterIndex++;
     }
     // SWC.INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE & SWC.INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES
-    JavaIterator<MapEntry<String, DartType>> overriddenNamedPTIterator = new JavaIterator(getMapEntrySet(overriddenNamedPT));
-    while (overriddenNamedPTIterator.hasNext) {
-      MapEntry<String, DartType> overriddenNamedPTEntry = overriddenNamedPTIterator.next();
-      DartType overridingType = overridingNamedPT[overriddenNamedPTEntry.getKey()];
+    for (String overriddenName in overriddenNamedPT.keys) {
+      DartType overridingType = overridingNamedPT[overriddenName];
       if (overridingType == null) {
-        // Error, this is never reached- INVALID_OVERRIDE_NAMED would have been created above if
-        // this could be reached.
+        // Error, this is never reached- INVALID_OVERRIDE_NAMED would have been
+        // created above if this could be reached.
         continue;
       }
-      if (!overriddenNamedPTEntry.getValue().isAssignableTo(overridingType)) {
+      DartType overriddenType = overriddenNamedPT[overriddenName];
+      if (!overriddenType.isAssignableTo(overridingType)) {
         // lookup the parameter for the error to select
         ParameterElement parameterToSelect = null;
         AstNode parameterLocationToSelect = null;
         for (int i = 0; i < parameters.length; i++) {
           ParameterElement parameter = parameters[i];
-          if (parameter.parameterKind == ParameterKind.NAMED && overriddenNamedPTEntry.getKey() == parameter.name) {
+          if (parameter.parameterKind == ParameterKind.NAMED
+              && overriddenName == parameter.name) {
             parameterToSelect = parameter;
             parameterLocationToSelect = parameterLocations[i];
             break;
           }
         }
         if (parameterToSelect != null) {
-          _errorReporter.reportTypeErrorForNode(StaticWarningCode.INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE, parameterLocationToSelect, [
-              overridingType,
-              overriddenNamedPTEntry.getValue(),
+          _errorReporter.reportTypeErrorForNode(
+              StaticWarningCode.INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE,
+              parameterLocationToSelect,
+              [overridingType,
+              overriddenType,
               overriddenExecutable.enclosingElement.displayName]);
           return true;
         }
@@ -8849,10 +8861,22 @@
       PropertyAccessorElement setter = element.setter;
       SimpleIdentifier fieldName = field.name;
       if (getter != null) {
-        hasProblems = javaBooleanOr(hasProblems, _checkForAllInvalidOverrideErrorCodesForExecutable(getter, ParameterElementImpl.EMPTY_ARRAY, AstNode.EMPTY_ARRAY, fieldName));
+        if (_checkForAllInvalidOverrideErrorCodesForExecutable(
+            getter,
+            ParameterElementImpl.EMPTY_ARRAY,
+            AstNode.EMPTY_ARRAY,
+            fieldName)) {
+          hasProblems = true;
+        }
       }
       if (setter != null) {
-        hasProblems = javaBooleanOr(hasProblems, _checkForAllInvalidOverrideErrorCodesForExecutable(setter, setter.parameters, <AstNode> [fieldName], fieldName));
+        if (_checkForAllInvalidOverrideErrorCodesForExecutable(
+            setter,
+            setter.parameters,
+            <AstNode> [fieldName],
+            fieldName)) {
+          hasProblems = true;
+        }
       }
     }
     return hasProblems;
@@ -8902,14 +8926,26 @@
       if (mixinType is! InterfaceType) {
         continue;
       }
-      if (_checkForExtendsOrImplementsDisallowedClass(mixinName, CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS)) {
+      if (_checkForExtendsOrImplementsDisallowedClass(
+          mixinName,
+          CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS)) {
         problemReported = true;
       } else {
         ClassElement mixinElement = (mixinType as InterfaceType).element;
-        problemReported = javaBooleanOr(problemReported, _checkForExtendsOrImplementsDeferredClass(mixinName, CompileTimeErrorCode.MIXIN_DEFERRED_CLASS));
-        problemReported = javaBooleanOr(problemReported, _checkForMixinDeclaresConstructor(mixinName, mixinElement));
-        problemReported = javaBooleanOr(problemReported, _checkForMixinInheritsNotFromObject(mixinName, mixinElement));
-        problemReported = javaBooleanOr(problemReported, _checkForMixinReferencesSuper(mixinName, mixinElement));
+        if (_checkForExtendsOrImplementsDeferredClass(
+            mixinName,
+            CompileTimeErrorCode.MIXIN_DEFERRED_CLASS)) {
+          problemReported = true;
+        }
+        if (_checkForMixinDeclaresConstructor(mixinName, mixinElement)) {
+          problemReported = true;
+        }
+        if (_checkForMixinInheritsNotFromObject(mixinName, mixinElement)) {
+          problemReported = true;
+        }
+        if (_checkForMixinReferencesSuper(mixinName, mixinElement)) {
+          problemReported = true;
+        }
       }
     }
     return problemReported;
@@ -9041,9 +9077,8 @@
     // check exported names
     Namespace namespace = new NamespaceBuilder().createExportNamespaceForDirective(exportElement);
     Map<String, Element> definedNames = namespace.definedNames;
-    for (MapEntry<String, Element> definedEntry in getMapEntrySet(definedNames)) {
-      String name = definedEntry.getKey();
-      Element element = definedEntry.getValue();
+    for (String name in definedNames.keys) {
+      Element element = definedNames[name];
       Element prevElement = _exportedElements[name];
       if (element != null && prevElement != null && prevElement != element) {
         _errorReporter.reportErrorForNode(CompileTimeErrorCode.AMBIGUOUS_EXPORT, node, [
@@ -9144,7 +9179,9 @@
     }
     bool problemReported = false;
     for (Expression argument in argumentList.arguments) {
-      problemReported = javaBooleanOr(problemReported, _checkForArgumentTypeNotAssignableForArgument(argument));
+      if (_checkForArgumentTypeNotAssignableForArgument(argument)) {
+        problemReported = true;
+      }
     }
     return problemReported;
   }
@@ -9308,8 +9345,8 @@
     int lastMember = members.length - 1;
     for (int i = 0; i < lastMember; i++) {
       SwitchMember member = members[i];
-      if (member is SwitchCase) {
-        foundError = javaBooleanOr(foundError, _checkForCaseBlockNotTerminated(member));
+      if (member is SwitchCase && _checkForCaseBlockNotTerminated(member)) {
+        foundError = true;
       }
     }
     return foundError;
@@ -9559,7 +9596,7 @@
                 _enclosingClass.displayName,
                 name.name,
                 enclosingElementOfSetter.displayName]);
-            foundError = javaBooleanOr(foundError, true);
+            foundError = true;
             addThisMemberToTheMap = false;
           }
         } else if (isSetter) {
@@ -9568,7 +9605,7 @@
           if (conflictingMethod != null && conflictingMethod is MethodDeclaration && !conflictingMethod.isGetter) {
             // report problem
             _errorReporter.reportErrorForNode(StaticWarningCode.CONFLICTING_INSTANCE_METHOD_SETTER2, name, [_enclosingClass.displayName, name.name]);
-            foundError = javaBooleanOr(foundError, true);
+            foundError = true;
             addThisMemberToTheMap = false;
           }
         }
@@ -9912,7 +9949,9 @@
     if (typeArguments != null) {
       bool hasError = false;
       for (TypeName argument in typeArguments.arguments) {
-        hasError = javaBooleanOr(hasError, _checkForConstWithTypeParameters(argument));
+        if (_checkForConstWithTypeParameters(argument)) {
+          hasError = true;
+        }
       }
       return hasError;
     }
@@ -10056,16 +10095,14 @@
     }
     bool hasProblem = false;
     for (ExecutableElement member in _enclosingClass.methods) {
-      if (!member.isStatic) {
-        continue;
+      if (member.isStatic && _checkForDuplicateDefinitionOfMember(member)) {
+        hasProblem = true;
       }
-      hasProblem = javaBooleanOr(hasProblem, _checkForDuplicateDefinitionOfMember(member));
     }
     for (ExecutableElement member in _enclosingClass.accessors) {
-      if (!member.isStatic) {
-        continue;
+      if (member.isStatic && _checkForDuplicateDefinitionOfMember(member)) {
+        hasProblem = true;
       }
-      hasProblem = javaBooleanOr(hasProblem, _checkForDuplicateDefinitionOfMember(member));
     }
     return hasProblem;
   }
@@ -10457,9 +10494,9 @@
     }
     bool foundError = false;
     for (ClassMember classMember in classMembers) {
-      if (classMember is FieldDeclaration) {
-        FieldDeclaration field = classMember;
-        foundError = javaBooleanOr(foundError, _checkForFinalNotInitialized(field.fields));
+      if (classMember is FieldDeclaration
+          && _checkForFinalNotInitialized(classMember.fields)) {
+        foundError = true;
       }
     }
     return foundError;
@@ -10478,7 +10515,11 @@
     }
     bool foundError = false;
     for (TypeName type in node.interfaces) {
-      foundError = javaBooleanOr(foundError, _checkForExtendsOrImplementsDeferredClass(type, CompileTimeErrorCode.IMPLEMENTS_DEFERRED_CLASS));
+      if (_checkForExtendsOrImplementsDeferredClass(
+          type,
+          CompileTimeErrorCode.IMPLEMENTS_DEFERRED_CLASS)) {
+        foundError = true;
+      }
     }
     return foundError;
   }
@@ -10497,7 +10538,11 @@
     }
     bool foundError = false;
     for (TypeName type in node.interfaces) {
-      foundError = javaBooleanOr(foundError, _checkForExtendsOrImplementsDisallowedClass(type, CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS));
+      if (_checkForExtendsOrImplementsDisallowedClass(
+          type,
+          CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS)) {
+        foundError = true;
+      }
     }
     return foundError;
   }
@@ -10936,11 +10981,21 @@
     bool hasProblems = false;
     for (Expression element in node.elements) {
       if (node.constKeyword != null) {
-        // TODO(paulberry): this error should be based on the actual type of the list element, not
-        // the static type.  See dartbug.com/21119.
-        hasProblems = javaBooleanOr(hasProblems, _checkForArgumentTypeNotAssignableWithExpectedTypes(element, listElementType, CheckedModeCompileTimeErrorCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE));
+        // TODO(paulberry): this error should be based on the actual type of the
+        // list element, not the static type.  See dartbug.com/21119.
+        if (_checkForArgumentTypeNotAssignableWithExpectedTypes(
+            element,
+            listElementType,
+            CheckedModeCompileTimeErrorCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE)) {
+          hasProblems = true;
+        }
       }
-      hasProblems = javaBooleanOr(hasProblems, _checkForArgumentTypeNotAssignableWithExpectedTypes(element, listElementType, StaticWarningCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE));
+      if (_checkForArgumentTypeNotAssignableWithExpectedTypes(
+          element,
+          listElementType,
+          StaticWarningCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE)) {
+        hasProblems = true;
+      }
     }
     return hasProblems;
   }
@@ -10972,13 +11027,33 @@
       Expression key = entry.key;
       Expression value = entry.value;
       if (node.constKeyword != null) {
-        // TODO(paulberry): this error should be based on the actual type of the list element, not
-        // the static type.  See dartbug.com/21119.
-        hasProblems = javaBooleanOr(hasProblems, _checkForArgumentTypeNotAssignableWithExpectedTypes(key, keyType, CheckedModeCompileTimeErrorCode.MAP_KEY_TYPE_NOT_ASSIGNABLE));
-        hasProblems = javaBooleanOr(hasProblems, _checkForArgumentTypeNotAssignableWithExpectedTypes(value, valueType, CheckedModeCompileTimeErrorCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE));
+        // TODO(paulberry): this error should be based on the actual type of the
+        // list element, not the static type.  See dartbug.com/21119.
+        if (_checkForArgumentTypeNotAssignableWithExpectedTypes(
+            key,
+            keyType,
+            CheckedModeCompileTimeErrorCode.MAP_KEY_TYPE_NOT_ASSIGNABLE)) {
+          hasProblems = true;
+        }
+        if (_checkForArgumentTypeNotAssignableWithExpectedTypes(
+            value,
+            valueType,
+            CheckedModeCompileTimeErrorCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE)) {
+          hasProblems = true;
+        }
       }
-      hasProblems = javaBooleanOr(hasProblems, _checkForArgumentTypeNotAssignableWithExpectedTypes(key, keyType, StaticWarningCode.MAP_KEY_TYPE_NOT_ASSIGNABLE));
-      hasProblems = javaBooleanOr(hasProblems, _checkForArgumentTypeNotAssignableWithExpectedTypes(value, valueType, StaticWarningCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE));
+      if (_checkForArgumentTypeNotAssignableWithExpectedTypes(
+          key,
+          keyType,
+          StaticWarningCode.MAP_KEY_TYPE_NOT_ASSIGNABLE)) {
+        hasProblems = true;
+      }
+      if (_checkForArgumentTypeNotAssignableWithExpectedTypes(
+          value,
+          valueType,
+          StaticWarningCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE)) {
+        hasProblems = true;
+      }
     }
     return hasProblems;
   }
@@ -11434,9 +11509,9 @@
         }
       }
       if (enclosingElement != null) {
-        newStrMember = "${prefix}'${enclosingElement.displayName}.${missingOverridesArray[i].displayName}'";
+        newStrMember = "$prefix'${enclosingElement.displayName}.${missingOverridesArray[i].displayName}'";
       } else {
-        newStrMember = "${prefix}'${missingOverridesArray[i].displayName}'";
+        newStrMember = "$prefix'${missingOverridesArray[i].displayName}'";
       }
       stringMembersArrayListSet.add(newStrMember);
     }
@@ -12058,7 +12133,7 @@
     // iterate over each bounded type parameter and corresponding argument
     NodeList<TypeName> typeNameArgList = node.typeArguments.arguments;
     List<DartType> typeArguments = (type as InterfaceType).typeArguments;
-    int loopThroughIndex = Math.min(typeNameArgList.length, boundingElts.length);
+    int loopThroughIndex = math.min(typeNameArgList.length, boundingElts.length);
     bool foundError = false;
     for (int i = 0; i < loopThroughIndex; i++) {
       TypeName argTypeName = typeNameArgList[i];
@@ -12709,13 +12784,13 @@
       if (size > 1) {
         // Construct a string showing the cyclic implements path: "A, B, C, D, A"
         String separator = ", ";
-        JavaStringBuilder builder = new JavaStringBuilder();
+        StringBuffer buffer = new StringBuffer();
         for (int i = 0; i < size; i++) {
-          builder.append(path[i].displayName);
-          builder.append(separator);
+          buffer.write(path[i].displayName);
+          buffer.write(separator);
         }
-        builder.append(classElt.displayName);
-        _errorReporter.reportErrorForOffset(CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE, _enclosingClass.nameOffset, enclosingClassName.length, [enclosingClassName, builder.toString()]);
+        buffer.write(classElt.displayName);
+        _errorReporter.reportErrorForOffset(CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE, _enclosingClass.nameOffset, enclosingClassName.length, [enclosingClassName, buffer.toString()]);
         return true;
       } else {
         // RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS or
@@ -13035,8 +13110,7 @@
     _enclosingBlockContainsBreak = false;
     try {
       bool hasDefault = false;
-      NodeList<SwitchMember> memberList = node.members;
-      List<SwitchMember> members = new List.from(memberList);
+      List<SwitchMember> members = node.members;
       for (int i = 0; i < members.length; i++) {
         SwitchMember switchMember = members[i];
         if (switchMember is SwitchDefault) {
@@ -13259,9 +13333,9 @@
 }
 
 class GeneralizingAstVisitor_StaticTypeAnalyzer_computePropagatedReturnTypeOfFunction extends GeneralizingAstVisitor<Object> {
-  List<DartType> result;
+  DartType result = null;
 
-  GeneralizingAstVisitor_StaticTypeAnalyzer_computePropagatedReturnTypeOfFunction(this.result) : super();
+  GeneralizingAstVisitor_StaticTypeAnalyzer_computePropagatedReturnTypeOfFunction();
 
   @override
   Object visitExpression(Expression node) => null;
@@ -13277,10 +13351,10 @@
       type = BottomTypeImpl.instance;
     }
     // merge types
-    if (result[0] == null) {
-      result[0] = type;
+    if (result == null) {
+      result = type;
     } else {
-      result[0] = result[0].getLeastUpperBound(type);
+      result = result.getLeastUpperBound(type);
     }
     return null;
   }
@@ -13634,25 +13708,25 @@
     // least once. This code will guard against infinite recursion and might help us identify the
     // cause of the issue.
     //
-    JavaStringBuilder builder = new JavaStringBuilder();
-    builder.append("Found circularity in XML nodes: ");
+    StringBuffer buffer = new StringBuffer();
+    buffer.write("Found circularity in XML nodes: ");
     bool first = true;
     for (ht.XmlTagNode pathNode in _parentNodes) {
       if (first) {
         first = false;
       } else {
-        builder.append(", ");
+        buffer.write(", ");
       }
       String tagName = pathNode.tag;
       if (identical(pathNode, node)) {
-        builder.append("*");
-        builder.append(tagName);
-        builder.append("*");
+        buffer.write("*");
+        buffer.write(tagName);
+        buffer.write("*");
       } else {
-        builder.append(tagName);
+        buffer.write(tagName);
       }
     }
-    AnalysisEngine.instance.logger.logError(builder.toString());
+    AnalysisEngine.instance.logger.logError(buffer.toString());
     return null;
   }
 
@@ -13765,7 +13839,7 @@
               implicitConstructors.add(_createImplicitContructor(classType, explicitConstructor, parameterTypes, argumentTypes));
             }
           }
-          classElement.constructors = new List.from(implicitConstructors);
+          classElement.constructors = implicitConstructors;
         }
       }
     }
@@ -13837,7 +13911,7 @@
       }
     } else {
       NodeList<TypeName> arguments = typeArguments.arguments;
-      int argumentCount = Math.min(arguments.length, parameterCount);
+      int argumentCount = math.min(arguments.length, parameterCount);
       for (int i = 0; i < argumentCount; i++) {
         types[i] = arguments[i].type;
       }
@@ -14289,7 +14363,7 @@
   bool _elementModelChanged(AstNode node) {
     Element element = _getElement(node);
     if (element == null) {
-      throw new AnalysisException("Cannot resolve node: a ${node.runtimeType.toString()} does not define an element");
+      throw new AnalysisException("Cannot resolve node: a ${node.runtimeType} does not define an element");
     }
     DeclarationMatcher matcher = new DeclarationMatcher();
     return !matcher.matches(node, element);
@@ -15082,9 +15156,7 @@
    */
   MemberMap _resolveInheritanceLookup(ClassElement classElt, HashMap<String, List<ExecutableElement>> unionMap) {
     MemberMap resultMap = new MemberMap();
-    for (MapEntry<String, List<ExecutableElement>> entry in getMapEntrySet(unionMap)) {
-      String key = entry.getKey();
-      List<ExecutableElement> list = entry.getValue();
+    unionMap.forEach((String key, List<ExecutableElement> list) {
       int numOfEltsWithMatchingNames = list.length;
       if (numOfEltsWithMatchingNames == 1) {
         //
@@ -15181,7 +15253,7 @@
               // of the other, we create a warning, and have this class inherit nothing.
               //
               if (!classHasMember) {
-                String firstTwoFuntionTypesStr = "${executableElementTypes[0].toString()}, ${executableElementTypes[1].toString()}";
+                String firstTwoFuntionTypesStr = "${executableElementTypes[0]}, ${executableElementTypes[1]}";
                 _reportError(classElt, classElt.nameOffset, classElt.displayName.length, StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE, [key, firstTwoFuntionTypesStr]);
               }
             } else {
@@ -15204,7 +15276,7 @@
           _reportError(classElt, classElt.nameOffset, classElt.displayName.length, StaticWarningCode.INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD, [key]);
         }
       }
-    }
+    });
     return resultMap;
   }
 
@@ -15465,7 +15537,7 @@
         unitArrayList.add(getAST(source));
       }
     }
-    return new List.from(unitArrayList);
+    return unitArrayList;
   }
 
   /**
@@ -15740,7 +15812,7 @@
       libraryElement.entryPoint = entryPoint;
     }
     int sourcedUnitCount = sourcedCompilationUnits.length;
-    libraryElement.parts = new List.from(sourcedCompilationUnits);
+    libraryElement.parts = sourcedCompilationUnits;
     for (Directive directive in directivesToResolve) {
       directive.element = libraryElement;
     }
@@ -15828,7 +15900,7 @@
       libraryElement.entryPoint = entryPoint;
     }
     int sourcedUnitCount = sourcedCompilationUnits.length;
-    libraryElement.parts = new List.from(sourcedCompilationUnits);
+    libraryElement.parts = sourcedCompilationUnits;
     for (Directive directive in directivesToResolve) {
       directive.element = libraryElement;
     }
@@ -16054,20 +16126,19 @@
       }
     }
     int indirectCount = indirectSources.length;
-    JavaStringBuilder builder = new JavaStringBuilder();
-    builder.append(library.definingCompilationUnit.displayName);
+    StringBuffer buffer = new StringBuffer();
+    buffer.write(library.definingCompilationUnit.displayName);
     if (indirectCount > 0) {
-      builder.append(" (via ");
+      buffer.write(" (via ");
       if (indirectCount > 1) {
-        List<String> indirectNames = new List.from(indirectSources);
-        indirectNames.sort();
-        builder.append(StringUtilities.printListOfQuotedNames(indirectNames));
+        indirectSources.sort();
+        buffer.write(StringUtilities.printListOfQuotedNames(indirectSources));
       } else {
-        builder.append(indirectSources[0]);
+        buffer.write(indirectSources[0]);
       }
-      builder.append(")");
+      buffer.write(")");
     }
-    return builder.toString();
+    return buffer.toString();
   }
 
   /**
@@ -16105,7 +16176,7 @@
       return conflictingMembers[0];
     } else if (to == 0) {
       // All members were removed
-      AnalysisEngine.instance.logger.logInformation("Multiply defined SDK element: ${foundElement}");
+      AnalysisEngine.instance.logger.logInformation("Multiply defined SDK element: $foundElement");
       return foundElement;
     }
     List<Element> remaining = new List<Element>(to);
@@ -16449,7 +16520,7 @@
         combinators.add(show);
       }
     }
-    return new List.from(combinators);
+    return combinators;
   }
 
   /**
@@ -16541,8 +16612,8 @@
         imports.add(importElement);
       }
       LibraryElementImpl libraryElement = library.libraryElement;
-      libraryElement.imports = new List.from(imports);
-      libraryElement.exports = new List.from(exports);
+      libraryElement.imports = imports;
+      libraryElement.exports = exports;
       if (libraryElement.entryPoint == null) {
         Namespace namespace = new NamespaceBuilder().createExportNamespaceForLibrary(libraryElement);
         Element element = namespace.get(LibraryElementBuilder.ENTRY_POINT_NAME);
@@ -16756,7 +16827,7 @@
         importedLibraries.add(importedLibrary);
       }
     }
-    library.importedLibraries = new List.from(importedLibraries);
+    library.importedLibraries = importedLibraries;
     List<Library> exportedLibraries = new List<Library>();
     for (Source exportedSource in exportedSources) {
       Library exportedLibrary = _libraryMap[exportedSource];
@@ -16770,7 +16841,7 @@
         exportedLibraries.add(exportedLibrary);
       }
     }
-    library.exportedLibraries = new List.from(exportedLibraries);
+    library.exportedLibraries = exportedLibraries;
     library.explicitlyImportsCore = explicitlyImportsCore;
     if (!explicitlyImportsCore && _coreLibrarySource != library.librarySource) {
       Library importedLibrary = _libraryMap[_coreLibrarySource];
@@ -17111,7 +17182,7 @@
         combinators.add(show);
       }
     }
-    return new List.from(combinators);
+    return combinators;
   }
 
   /**
@@ -17207,8 +17278,8 @@
         imports.add(importElement);
       }
       LibraryElementImpl libraryElement = library.libraryElement;
-      libraryElement.imports = new List.from(imports);
-      libraryElement.exports = new List.from(exports);
+      libraryElement.imports = imports;
+      libraryElement.exports = exports;
       if (libraryElement.entryPoint == null) {
         Namespace namespace = new NamespaceBuilder().createExportNamespaceForLibrary(libraryElement);
         Element element = namespace.get(LibraryElementBuilder.ENTRY_POINT_NAME);
@@ -17828,9 +17899,9 @@
    * @param namespace the namespace containing the names to be added to this namespace
    */
   void _addAllFromMap(Map<String, Element> definedNames, Map<String, Element> newNames) {
-    for (MapEntry<String, Element> entry in getMapEntrySet(newNames)) {
-      definedNames[entry.getKey()] = entry.getValue();
-    }
+    newNames.forEach((String name, Element element) {
+      definedNames[name] = element;
+    });
   }
 
   /**
@@ -17895,7 +17966,7 @@
         definedNames = _show(definedNames, combinator.shownNames);
       } else {
         // Internal error.
-        AnalysisEngine.instance.logger.logError("Unknown type of combinator: ${combinator.runtimeType.toString()}");
+        AnalysisEngine.instance.logger.logError("Unknown type of combinator: ${combinator.runtimeType}");
       }
     }
     return definedNames;
@@ -17911,9 +17982,9 @@
     if (prefixElement != null) {
       String prefix = prefixElement.name;
       HashMap<String, Element> newNames = new HashMap<String, Element>();
-      for (MapEntry<String, Element> entry in getMapEntrySet(definedNames)) {
-        newNames["${prefix}.${entry.getKey()}"] = entry.getValue();
-      }
+      definedNames.forEach((String name, Element element) {
+        newNames["$prefix.$name"] = element;
+      });
       return newNames;
     } else {
       return definedNames;
@@ -17960,7 +18031,7 @@
   void _hide(HashMap<String, Element> definedNames, List<String> hiddenNames) {
     for (String name in hiddenNames) {
       definedNames.remove(name);
-      definedNames.remove("${name}=");
+      definedNames.remove("$name=");
     }
   }
 
@@ -17978,7 +18049,7 @@
       if (element != null) {
         newNames[name] = element;
       }
-      String setterName = "${name}=";
+      String setterName = "$name=";
       element = definedNames[setterName];
       if (element != null) {
         newNames[setterName] = element;
@@ -18449,11 +18520,11 @@
 }
 
 class RecursiveAstVisitor_ResolverVisitor_isVariableAccessedInClosure extends RecursiveAstVisitor<Object> {
-  List<bool> result;
+  final Element variable;
 
-  Element variable;
+  bool result = false;
 
-  RecursiveAstVisitor_ResolverVisitor_isVariableAccessedInClosure(this.result, this.variable) : super();
+  RecursiveAstVisitor_ResolverVisitor_isVariableAccessedInClosure(this.variable);
 
   bool _inClosure = false;
 
@@ -18470,31 +18541,31 @@
 
   @override
   Object visitSimpleIdentifier(SimpleIdentifier node) {
-    if (result[0]) {
+    if (result) {
       return null;
     }
     if (_inClosure && identical(node.staticElement, variable)) {
-      result[0] = javaBooleanOr(result[0], true);
+      result = true;
     }
     return null;
   }
 }
 
 class RecursiveAstVisitor_ResolverVisitor_isVariablePotentiallyMutatedIn extends RecursiveAstVisitor<Object> {
-  List<bool> result;
+  final Element variable;
 
-  Element variable;
+  bool result = false;
 
-  RecursiveAstVisitor_ResolverVisitor_isVariablePotentiallyMutatedIn(this.result, this.variable) : super();
+  RecursiveAstVisitor_ResolverVisitor_isVariablePotentiallyMutatedIn(this.variable);
 
   @override
   Object visitSimpleIdentifier(SimpleIdentifier node) {
-    if (result[0]) {
+    if (result) {
       return null;
     }
     if (identical(node.staticElement, variable)) {
       if (node.inSetterContext()) {
-        result[0] = javaBooleanOr(result[0], true);
+        result = true;
       }
     }
     return null;
@@ -18815,7 +18886,7 @@
   ErrorSeverity get errorSeverity => type.severity;
 
   @override
-  String get uniqueName => "${runtimeType.toString()}.${name}";
+  String get uniqueName => "$runtimeType.$name";
 }
 
 /**
@@ -19977,9 +20048,10 @@
    * @return `true` if this variable is potentially mutated somewhere in the given ASTNode
    */
   bool _isVariableAccessedInClosure(Element variable, AstNode target) {
-    List<bool> result = [false];
-    target.accept(new RecursiveAstVisitor_ResolverVisitor_isVariableAccessedInClosure(result, variable));
-    return result[0];
+    RecursiveAstVisitor_ResolverVisitor_isVariableAccessedInClosure visitor
+        = new RecursiveAstVisitor_ResolverVisitor_isVariableAccessedInClosure(variable);
+    target.accept(visitor);
+    return visitor.result;
   }
 
   /**
@@ -19991,9 +20063,10 @@
    * @return `true` if this variable is potentially mutated somewhere in the given ASTNode
    */
   bool _isVariablePotentiallyMutatedIn(Element variable, AstNode target) {
-    List<bool> result = [false];
-    target.accept(new RecursiveAstVisitor_ResolverVisitor_isVariablePotentiallyMutatedIn(result, variable));
-    return result[0];
+    RecursiveAstVisitor_ResolverVisitor_isVariablePotentiallyMutatedIn visitor
+        = new RecursiveAstVisitor_ResolverVisitor_isVariablePotentiallyMutatedIn(variable);
+    target.accept(visitor);
+    return visitor.result;
   }
 
   /**
@@ -20667,16 +20740,16 @@
     Scope outerScope = _nameScope;
     try {
       if (constructorElement == null) {
-        JavaStringBuilder builder = new JavaStringBuilder();
-        builder.append("Missing element for constructor ");
-        builder.append(node.returnType.name);
+        StringBuffer buffer = new StringBuffer();
+        buffer.write("Missing element for constructor ");
+        buffer.write(node.returnType.name);
         if (node.name != null) {
-          builder.append(".");
-          builder.append(node.name.name);
+          buffer.write(".");
+          buffer.write(node.name.name);
         }
-        builder.append(" in ");
-        builder.append(definingLibrary.source.fullName);
-        AnalysisEngine.instance.logger.logInformation2(builder.toString(), new JavaException());
+        buffer.write(" in ");
+        buffer.write(definingLibrary.source.fullName);
+        AnalysisEngine.instance.logger.logInformation2(buffer.toString(), new JavaException());
       } else {
         _nameScope = new FunctionScope(_nameScope, constructorElement);
       }
@@ -20783,19 +20856,19 @@
       try {
         ExecutableElement functionElement = node.element;
         if (functionElement == null) {
-          JavaStringBuilder builder = new JavaStringBuilder();
-          builder.append("Missing element for function ");
+          StringBuffer buffer = new StringBuffer();
+          buffer.write("Missing element for function ");
           AstNode parent = node.parent;
           while (parent != null) {
             if (parent is Declaration) {
               Element parentElement = (parent as Declaration).element;
-              builder.append(parentElement == null ? "<unknown> " : ("${parentElement.name} "));
+              buffer.write(parentElement == null ? "<unknown> " : "${parentElement.name} ");
             }
             parent = parent.parent;
           }
-          builder.append("in ");
-          builder.append(definingLibrary.source.fullName);
-          AnalysisEngine.instance.logger.logInformation2(builder.toString(), new JavaException());
+          buffer.write("in ");
+          buffer.write(definingLibrary.source.fullName);
+          AnalysisEngine.instance.logger.logInformation2(buffer.toString(), new JavaException());
         } else {
           _nameScope = new FunctionScope(_nameScope, functionElement);
         }
@@ -22366,9 +22439,10 @@
       return expressionBody.expression.bestType;
     }
     if (body is BlockFunctionBody) {
-      List<DartType> result = [null];
-      body.accept(new GeneralizingAstVisitor_StaticTypeAnalyzer_computePropagatedReturnTypeOfFunction(result));
-      return result[0];
+      GeneralizingAstVisitor_StaticTypeAnalyzer_computePropagatedReturnTypeOfFunction visitor
+          = new GeneralizingAstVisitor_StaticTypeAnalyzer_computePropagatedReturnTypeOfFunction();
+      body.accept(visitor);
+      return visitor.result;
     }
     return null;
   }
@@ -23193,9 +23267,9 @@
    * @param overrides the overrides to be applied
    */
   void applyOverrides(Map<VariableElement, DartType> overrides) {
-    for (MapEntry<VariableElement, DartType> entry in getMapEntrySet(overrides)) {
-      _overridenTypes[entry.getKey()] = entry.getValue();
-    }
+    overrides.forEach((VariableElement element, DartType type) {
+      _overridenTypes[element] = type;
+    });
   }
 
   /**
@@ -23705,7 +23779,7 @@
   InterfaceType _getType(Namespace namespace, String typeName) {
     Element element = namespace.get(typeName);
     if (element == null) {
-      AnalysisEngine.instance.logger.logInformation("No definition of type ${typeName}");
+      AnalysisEngine.instance.logger.logInformation("No definition of type $typeName");
       return null;
     }
     return (element as ClassElement).type;
@@ -23947,19 +24021,19 @@
     ExecutableElementImpl element = node.element as ExecutableElementImpl;
     if (element == null) {
       ClassDeclaration classNode = node.getAncestor((node) => node is ClassDeclaration);
-      JavaStringBuilder builder = new JavaStringBuilder();
-      builder.append("The element for the constructor ");
-      builder.append(node.name == null ? "<unnamed>" : node.name.name);
-      builder.append(" in ");
+      StringBuffer buffer = new StringBuffer();
+      buffer.write("The element for the constructor ");
+      buffer.write(node.name == null ? "<unnamed>" : node.name.name);
+      buffer.write(" in ");
       if (classNode == null) {
-        builder.append("<unknown class>");
+        buffer.write("<unknown class>");
       } else {
-        builder.append(classNode.name.name);
+        buffer.write(classNode.name.name);
       }
-      builder.append(" in ");
-      builder.append(source.fullName);
-      builder.append(" was not set while trying to resolve types.");
-      AnalysisEngine.instance.logger.logError2(builder.toString(), new CaughtException(new AnalysisException(), null));
+      buffer.write(" in ");
+      buffer.write(source.fullName);
+      buffer.write(" was not set while trying to resolve types.");
+      AnalysisEngine.instance.logger.logError2(buffer.toString(), new CaughtException(new AnalysisException(), null));
     } else {
       ClassElement definingClass = element.enclosingElement as ClassElement;
       element.returnType = definingClass.type;
@@ -24021,13 +24095,13 @@
     super.visitFunctionDeclaration(node);
     ExecutableElementImpl element = node.element as ExecutableElementImpl;
     if (element == null) {
-      JavaStringBuilder builder = new JavaStringBuilder();
-      builder.append("The element for the top-level function ");
-      builder.append(node.name);
-      builder.append(" in ");
-      builder.append(source.fullName);
-      builder.append(" was not set while trying to resolve types.");
-      AnalysisEngine.instance.logger.logError2(builder.toString(), new CaughtException(new AnalysisException(), null));
+      StringBuffer buffer = new StringBuffer();
+      buffer.write("The element for the top-level function ");
+      buffer.write(node.name);
+      buffer.write(" in ");
+      buffer.write(source.fullName);
+      buffer.write(" was not set while trying to resolve types.");
+      AnalysisEngine.instance.logger.logError2(buffer.toString(), new CaughtException(new AnalysisException(), null));
     }
     element.returnType = _computeReturnType(node.returnType);
     FunctionTypeImpl type = new FunctionTypeImpl.con1(element);
@@ -24068,19 +24142,19 @@
     ExecutableElementImpl element = node.element as ExecutableElementImpl;
     if (element == null) {
       ClassDeclaration classNode = node.getAncestor((node) => node is ClassDeclaration);
-      JavaStringBuilder builder = new JavaStringBuilder();
-      builder.append("The element for the method ");
-      builder.append(node.name.name);
-      builder.append(" in ");
+      StringBuffer buffer = new StringBuffer();
+      buffer.write("The element for the method ");
+      buffer.write(node.name.name);
+      buffer.write(" in ");
       if (classNode == null) {
-        builder.append("<unknown class>");
+        buffer.write("<unknown class>");
       } else {
-        builder.append(classNode.name.name);
+        buffer.write(classNode.name.name);
       }
-      builder.append(" in ");
-      builder.append(source.fullName);
-      builder.append(" was not set while trying to resolve types.");
-      AnalysisEngine.instance.logger.logError2(builder.toString(), new CaughtException(new AnalysisException(), null));
+      buffer.write(" in ");
+      buffer.write(source.fullName);
+      buffer.write(" was not set while trying to resolve types.");
+      AnalysisEngine.instance.logger.logError2(buffer.toString(), new CaughtException(new AnalysisException(), null));
     }
     element.returnType = _computeReturnType(node.returnType);
     FunctionTypeImpl type = new FunctionTypeImpl.con1(element);
@@ -24478,7 +24552,7 @@
         elements.add(element);
       }
     }
-    return new List.from(elements);
+    return elements;
   }
 
   /**
@@ -24700,17 +24774,17 @@
         classElement.interfaces = interfaceTypes;
       }
       // TODO(brianwilkerson) Move the following checks to ErrorVerifier.
-      List<TypeName> typeNames = new List.from(interfaces);
-      List<bool> detectedRepeatOnIndex = new List<bool>.filled(typeNames.length, false);
+      int count = interfaces.length;
+      List<bool> detectedRepeatOnIndex = new List<bool>.filled(count, false);
       for (int i = 0; i < detectedRepeatOnIndex.length; i++) {
         detectedRepeatOnIndex[i] = false;
       }
-      for (int i = 0; i < typeNames.length; i++) {
-        TypeName typeName = typeNames[i];
+      for (int i = 0; i < count; i++) {
+        TypeName typeName = interfaces[i];
         if (!detectedRepeatOnIndex[i]) {
           Element element = typeName.name.staticElement;
-          for (int j = i + 1; j < typeNames.length; j++) {
-            TypeName typeName2 = typeNames[j];
+          for (int j = i + 1; j < count; j++) {
+            TypeName typeName2 = interfaces[j];
             Identifier identifier2 = typeName2.name;
             String name2 = identifier2.name;
             Element element2 = identifier2.staticElement;
@@ -24772,7 +24846,7 @@
         types.add(type);
       }
     }
-    return new List.from(types);
+    return types;
   }
 
   void _setElement(Identifier typeName, Element element) {
diff --git a/pkg/analyzer/lib/src/generated/scanner.dart b/pkg/analyzer/lib/src/generated/scanner.dart
index f4a9712..26457d7 100644
--- a/pkg/analyzer/lib/src/generated/scanner.dart
+++ b/pkg/analyzer/lib/src/generated/scanner.dart
@@ -8,6 +8,8 @@
 library engine.scanner;
 
 import 'dart:collection';
+import "dart:math" as math;
+
 import 'java_core.dart';
 import 'java_engine.dart';
 import 'source.dart';
@@ -313,10 +315,10 @@
     // Compute the range of characters that are known to need to be rescanned. If the index is
     // within an existing token, then we need to start at the beginning of the token.
     //
-    int scanStart = Math.min(oldFirst.offset, index);
+    int scanStart = math.min(oldFirst.offset, index);
     int oldEnd = oldLast.end + delta - 1;
     int newEnd = index + insertedLength - 1;
-    int scanEnd = Math.max(newEnd, oldEnd);
+    int scanEnd = math.max(newEnd, oldEnd);
     //
     // Starting at the start of the scan region, scan tokens from the modifiedSource until the end
     // of the just scanned token is greater than or equal to end of the scan region in the modified
@@ -1925,7 +1927,7 @@
   ErrorType get type => ErrorType.SYNTACTIC_ERROR;
 
   @override
-  String get uniqueName => "${runtimeType.toString()}.${name}";
+  String get uniqueName => "$runtimeType.$name";
 }
 
 /**
diff --git a/pkg/analyzer/lib/src/generated/sdk.dart b/pkg/analyzer/lib/src/generated/sdk.dart
index 046ac5e..494021c 100644
--- a/pkg/analyzer/lib/src/generated/sdk.dart
+++ b/pkg/analyzer/lib/src/generated/sdk.dart
@@ -216,7 +216,7 @@
     String libraryName = null;
     Expression key = node.key;
     if (key is SimpleStringLiteral) {
-      libraryName = "${_LIBRARY_PREFIX}${key.value}";
+      libraryName = "$_LIBRARY_PREFIX${key.value}";
     }
     Expression value = node.value;
     if (value is InstanceCreationExpression) {
diff --git a/pkg/analyzer/lib/src/generated/sdk_io.dart b/pkg/analyzer/lib/src/generated/sdk_io.dart
index 974c393..920dccc 100644
--- a/pkg/analyzer/lib/src/generated/sdk_io.dart
+++ b/pkg/analyzer/lib/src/generated/sdk_io.dart
@@ -243,7 +243,7 @@
     JavaFile file = new JavaFile.fromUri(uri);
     String filePath = file.getAbsolutePath();
     String libPath = libraryDirectory.getAbsolutePath();
-    if (!filePath.startsWith("${libPath}${JavaFile.separator}")) {
+    if (!filePath.startsWith("$libPath${JavaFile.separator}")) {
       return null;
     }
     filePath = filePath.substring(libPath.length + 1);
@@ -254,17 +254,17 @@
         try {
           return new FileBasedSource.con2(parseUriWithException(path), file);
         } on URISyntaxException catch (exception) {
-          AnalysisEngine.instance.logger.logInformation2("Failed to create URI: ${path}", exception);
+          AnalysisEngine.instance.logger.logInformation2("Failed to create URI: $path", exception);
           return null;
         }
       }
       libraryPath = new JavaFile(libraryPath).getParent();
-      if (filePath.startsWith("${libraryPath}${JavaFile.separator}")) {
+      if (filePath.startsWith("$libraryPath${JavaFile.separator}")) {
         String path = "${library.shortName}/${filePath.substring(libraryPath.length + 1)}";
         try {
           return new FileBasedSource.con2(parseUriWithException(path), file);
         } on URISyntaxException catch (exception) {
-          AnalysisEngine.instance.logger.logInformation2("Failed to create URI: ${path}", exception);
+          AnalysisEngine.instance.logger.logInformation2("Failed to create URI: $path", exception);
           return null;
         }
       }
@@ -369,7 +369,7 @@
       return null;
     }
     JavaFile libDir = new JavaFile.relative(dir, libraryName);
-    JavaFile docFile = new JavaFile.relative(libDir, "${libraryName}${_DOC_FILE_SUFFIX}");
+    JavaFile docFile = new JavaFile.relative(libDir, "$libraryName$_DOC_FILE_SUFFIX");
     if (docFile.exists()) {
       return docFile;
     }
diff --git a/pkg/analyzer/lib/src/generated/source.dart b/pkg/analyzer/lib/src/generated/source.dart
index b4974ae..3b3d79b 100644
--- a/pkg/analyzer/lib/src/generated/source.dart
+++ b/pkg/analyzer/lib/src/generated/source.dart
@@ -8,6 +8,8 @@
 library engine.source;
 
 import 'dart:collection';
+import "dart:math" as math;
+
 import 'java_core.dart';
 import 'sdk.dart' show DartSdk;
 import 'engine.dart';
@@ -69,13 +71,17 @@
       return _contentMap.remove(source);
     } else {
       int newStamp = JavaSystem.currentTimeMillis();
-      int oldStamp = javaMapPut(_stampMap, source, newStamp);
-      // Occasionally, if this method is called in rapid succession, the timestamps are equal.
-      // Guard against this by artificially incrementing the new timestamp
+      int oldStamp = _stampMap[source];
+      _stampMap[source] = newStamp;
+      // Occasionally, if this method is called in rapid succession, the
+      // timestamps are equal. Guard against this by artificially incrementing
+      // the new timestamp.
       if (newStamp == oldStamp) {
         _stampMap[source] = newStamp + 1;
       }
-      return javaMapPut(_contentMap, source, contents);
+      String oldContent =_contentMap[source];
+      _contentMap[source] = contents;
+      return oldContent;
     }
   }
 }
@@ -516,7 +522,7 @@
         return _internalResolveUri(null, uri);
       }
     } catch (exception) {
-      AnalysisEngine.instance.logger.logError2("Could not resolve URI: ${absoluteUri}", exception);
+      AnalysisEngine.instance.logger.logError2("Could not resolve URI: $absoluteUri", exception);
     }
     return null;
   }
@@ -533,7 +539,7 @@
       try {
         return _internalResolveUri(null, absoluteUri);
       } on AnalysisException catch (exception, stackTrace) {
-        AnalysisEngine.instance.logger.logError2("Could not resolve URI: ${absoluteUri}", new CaughtException(exception, stackTrace));
+        AnalysisEngine.instance.logger.logError2("Could not resolve URI: $absoluteUri", new CaughtException(exception, stackTrace));
       }
     }
     return null;
@@ -550,7 +556,7 @@
   Source fromEncoding(String encoding) {
     Source source = forUri(encoding);
     if (source == null) {
-      throw new IllegalArgumentException("Invalid source encoding: ${encoding}");
+      throw new IllegalArgumentException("Invalid source encoding: $encoding");
     }
     return source;
   }
@@ -598,7 +604,7 @@
       // Force the creation of an escaped URI to deal with spaces, etc.
       return _internalResolveUri(containingSource, parseUriWithException(containedUri));
     } catch (exception) {
-      AnalysisEngine.instance.logger.logError2("Could not resolve URI (${containedUri}) relative to source (${containingSource.fullName})", exception);
+      AnalysisEngine.instance.logger.logError2("Could not resolve URI ($containedUri) relative to source (${containingSource.fullName})", exception);
       return null;
     }
   }
@@ -643,7 +649,7 @@
   Source _internalResolveUri(Source containingSource, Uri containedUri) {
     if (!containedUri.isAbsolute) {
       if (containingSource == null) {
-        throw new AnalysisException("Cannot resolve a relative URI without a containing source: ${containedUri}");
+        throw new AnalysisException("Cannot resolve a relative URI without a containing source: $containedUri");
       }
       containedUri = containingSource.resolveRelativeUri(containedUri);
     }
@@ -781,8 +787,8 @@
    * @return the minimal [SourceRange] that cover this and the given [SourceRange]s.
    */
   SourceRange getUnion(SourceRange other) {
-    int newOffset = Math.min(offset, other.offset);
-    int newEnd = Math.max(offset + length, other.offset + other.length);
+    int newOffset = math.min(offset, other.offset);
+    int newEnd = math.max(offset + length, other.offset + other.length);
     return new SourceRange(newOffset, newEnd - newOffset);
   }
 
@@ -806,20 +812,12 @@
   }
 
   /**
-   * @return `true` if this [SourceRange] starts in <code>otherRange</code>.
+   * Return `true` if this [SourceRange] starts in the [otherRange].
    */
   bool startsIn(SourceRange otherRange) => otherRange.contains(offset);
 
   @override
-  String toString() {
-    JavaStringBuilder builder = new JavaStringBuilder();
-    builder.append("[offset=");
-    builder.append(offset);
-    builder.append(", length=");
-    builder.append(length);
-    builder.append("]");
-    return builder.toString();
-  }
+  String toString() => '[offset=$offset, length=$length]';
 }
 
 /**
diff --git a/pkg/analyzer/lib/src/generated/source_io.dart b/pkg/analyzer/lib/src/generated/source_io.dart
index a5b4347..60740c1 100644
--- a/pkg/analyzer/lib/src/generated/source_io.dart
+++ b/pkg/analyzer/lib/src/generated/source_io.dart
@@ -32,7 +32,7 @@
     if (path == null || path.length <= 0 || path.codeUnitAt(path.length - 1) == JavaFile.separatorChar) {
       return path;
     }
-    return "${path}${JavaFile.separator}";
+    return "$path${JavaFile.separator}";
   }
 
   /**
@@ -77,7 +77,7 @@
   int get hashCode => _path.hashCode;
 
   @override
-  String toString() => "SourceContainer[${_path}]";
+  String toString() => "SourceContainer[$_path]";
 }
 
 /**
@@ -175,9 +175,9 @@
         String scheme = uri.scheme;
         String part = uri.path;
         if (scheme == DartUriResolver.DART_SCHEME && part.indexOf('/') < 0) {
-          part = "${part}/${part}.dart";
+          part = "$part/$part.dart";
         }
-        baseUri = parseUriWithException("${scheme}:/${part}");
+        baseUri = parseUriWithException("$scheme:/$part");
       }
       Uri result = baseUri.resolveUri(containedUri);
       if (isOpaque) {
@@ -185,7 +185,7 @@
       }
       return result;
     } catch (exception, stackTrace) {
-      throw new AnalysisException("Could not resolve URI (${containedUri}) relative to source (${uri})", new CaughtException(exception, stackTrace));
+      throw new AnalysisException("Could not resolve URI ($containedUri) relative to source ($uri)", new CaughtException(exception, stackTrace));
     }
   }
 
@@ -345,6 +345,18 @@
     }
   }
 
+  /**
+   * If the list of package directories contains one element, return it.
+   * Otherwise raise an exception.  Intended for testing.
+   */
+  String get packagesDirectory_forTesting {
+    int length = _packagesDirectories.length;
+    if (length != 1) {
+      throw new Exception('Expected 1 package directory, found $length');
+    }
+    return _packagesDirectories[0].getPath();
+  }
+
   @override
   Source resolveAbsolute(Uri uri) {
     if (!isPackageUri(uri)) {
@@ -397,7 +409,7 @@
               String pkgCanonicalPath = pkgFolder.getCanonicalPath();
               if (sourcePath.startsWith(pkgCanonicalPath)) {
                 String relPath = sourcePath.substring(pkgCanonicalPath.length);
-                return parseUriWithException("${PACKAGE_SCHEME}:${pkgFolder.getName()}${relPath}");
+                return parseUriWithException("$PACKAGE_SCHEME:${pkgFolder.getName()}$relPath");
               }
             } catch (e) {
             }
@@ -423,10 +435,10 @@
       pkgDir = pkgDir.getCanonicalFile();
     } on JavaIOException catch (e) {
       if (!e.toString().contains("Required key not available")) {
-        AnalysisEngine.instance.logger.logError2("Canonical failed: ${pkgDir}", e);
+        AnalysisEngine.instance.logger.logError2("Canonical failed: $pkgDir", e);
       } else if (_CanLogRequiredKeyIoException) {
         _CanLogRequiredKeyIoException = false;
-        AnalysisEngine.instance.logger.logError2("Canonical failed: ${pkgDir}", e);
+        AnalysisEngine.instance.logger.logError2("Canonical failed: $pkgDir", e);
       }
     }
     return new JavaFile.relative(pkgDir, relPath.replaceAll('/', new String.fromCharCode(JavaFile.separatorChar)));
@@ -443,7 +455,7 @@
     }
     String rootPath = rootDir.getAbsolutePath();
     String filePath = file.getAbsolutePath();
-    return filePath.startsWith("${rootPath}/lib");
+    return filePath.startsWith("$rootPath/lib");
   }
 }
 
diff --git a/pkg/analyzer/lib/src/generated/testing/ast_factory.dart b/pkg/analyzer/lib/src/generated/testing/ast_factory.dart
index 18490e3..d4328ca 100644
--- a/pkg/analyzer/lib/src/generated/testing/ast_factory.dart
+++ b/pkg/analyzer/lib/src/generated/testing/ast_factory.dart
@@ -340,7 +340,7 @@
 
   static StringInterpolation string(List<InterpolationElement> elements) => new StringInterpolation(list(elements));
 
-  static SimpleStringLiteral string2(String content) => new SimpleStringLiteral(TokenFactory.tokenFromString("'${content}'"), content);
+  static SimpleStringLiteral string2(String content) => new SimpleStringLiteral(TokenFactory.tokenFromString("'$content'"), content);
 
   static SuperConstructorInvocation superConstructorInvocation(List<Expression> arguments) => superConstructorInvocation2(null, arguments);
 
@@ -363,7 +363,7 @@
     for (String component in components) {
       identifierList.add(TokenFactory.tokenFromTypeAndString(TokenType.IDENTIFIER, component));
     }
-    return new SymbolLiteral(TokenFactory.tokenFromType(TokenType.HASH), new List.from(identifierList));
+    return new SymbolLiteral(TokenFactory.tokenFromType(TokenType.HASH), identifierList);
   }
 
   static BlockFunctionBody syncBlockFunctionBody(List<Statement> statements) => new BlockFunctionBody(TokenFactory.tokenFromTypeAndString(TokenType.IDENTIFIER, "sync"), null, block(statements));
diff --git a/pkg/analyzer/lib/src/generated/testing/element_factory.dart b/pkg/analyzer/lib/src/generated/testing/element_factory.dart
index 60f0fff..44e90c2 100644
--- a/pkg/analyzer/lib/src/generated/testing/element_factory.dart
+++ b/pkg/analyzer/lib/src/generated/testing/element_factory.dart
@@ -65,7 +65,7 @@
     int count = argumentTypes.length;
     List<ParameterElement> parameters = new List<ParameterElement>(count);
     for (int i = 0; i < count; i++) {
-      ParameterElementImpl parameter = new ParameterElementImpl("a${i}", i);
+      ParameterElementImpl parameter = new ParameterElementImpl("a$i", i);
       parameter.type = argumentTypes[i];
       parameter.parameterKind = ParameterKind.REQUIRED;
       parameters[i] = parameter;
@@ -128,7 +128,7 @@
     //
     // Finish building the enum.
     //
-    enumElement.fields = new List.from(fields);
+    enumElement.fields = fields;
     // Client code isn't allowed to invoke the constructor, so we do not model it.
     return enumElement;
   }
@@ -159,7 +159,7 @@
       setter.setter = true;
       setter.synthetic = true;
       setter.variable = field;
-      setter.parameters = <ParameterElement> [requiredParameter2("_${name}", type)];
+      setter.parameters = <ParameterElement> [requiredParameter2("_$name", type)];
       setter.returnType = VoidTypeImpl.instance;
       setter.type = new FunctionTypeImpl.con1(setter);
       field.setter = setter;
@@ -190,7 +190,7 @@
     int totalCount = normalCount + optionalCount;
     List<ParameterElement> parameters = new List<ParameterElement>(totalCount);
     for (int i = 0; i < totalCount; i++) {
-      ParameterElementImpl parameter = new ParameterElementImpl("a${i}", i);
+      ParameterElementImpl parameter = new ParameterElementImpl("a$i", i);
       if (i < normalCount) {
         parameter.type = normalParameters[i].type;
         parameter.parameterKind = ParameterKind.REQUIRED;
@@ -220,7 +220,7 @@
     List<ParameterElement> parameters = new List<ParameterElement>(totalCount);
     for (int i = 0; i < totalCount; i++) {
       if (i < normalCount) {
-        ParameterElementImpl parameter = new ParameterElementImpl("a${i}", i);
+        ParameterElementImpl parameter = new ParameterElementImpl("a$i", i);
         parameter.type = normalParameters[i].type;
         parameter.parameterKind = ParameterKind.REQUIRED;
         parameters[i] = parameter;
@@ -296,7 +296,7 @@
   }
 
   static LibraryElementImpl library(AnalysisContext context, String libraryName) {
-    String fileName = "/${libraryName}.dart";
+    String fileName = "/$libraryName.dart";
     CompilationUnitElementImpl unit = compilationUnit(fileName);
     LibraryElementImpl library = new LibraryElementImpl(context, libraryName, 0);
     library.definingCompilationUnit = unit;
@@ -312,7 +312,7 @@
     int count = argumentTypes.length;
     List<ParameterElement> parameters = new List<ParameterElement>(count);
     for (int i = 0; i < count; i++) {
-      ParameterElementImpl parameter = new ParameterElementImpl("a${i}", i);
+      ParameterElementImpl parameter = new ParameterElementImpl("a$i", i);
       parameter.type = argumentTypes[i];
       parameter.parameterKind = ParameterKind.REQUIRED;
       parameters[i] = parameter;
@@ -422,7 +422,7 @@
       setter.static = true;
       setter.synthetic = true;
       setter.variable = variable;
-      setter.parameters = <ParameterElement> [requiredParameter2("_${name}", type)];
+      setter.parameters = <ParameterElement> [requiredParameter2("_$name", type)];
       setter.returnType = VoidTypeImpl.instance;
       setter.type = new FunctionTypeImpl.con1(setter);
       variable.setter = setter;
diff --git a/pkg/analyzer/lib/src/generated/utilities_collection.dart b/pkg/analyzer/lib/src/generated/utilities_collection.dart
index f89d69f..04d6177 100644
--- a/pkg/analyzer/lib/src/generated/utilities_collection.dart
+++ b/pkg/analyzer/lib/src/generated/utilities_collection.dart
@@ -8,6 +8,8 @@
 library engine.utilities.collection;
 
 import 'dart:collection';
+import "dart:math" as math;
+
 import 'java_core.dart';
 import 'scanner.dart' show Token;
 
@@ -76,7 +78,7 @@
    */
   static void _checkIndex(int index) {
     if (index < 0 || index > 30) {
-      throw new RangeError("Index not between 0 and 30: ${index}");
+      throw new RangeError("Index not between 0 and 30: $index");
     }
   }
 }
@@ -440,10 +442,10 @@
         if (wInfo == null) {
           // Successor w has not yet been visited; recurse on it
           wInfo = _strongConnect(w);
-          vInfo.lowlink = Math.min(vInfo.lowlink, wInfo.lowlink);
+          vInfo.lowlink = math.min(vInfo.lowlink, wInfo.lowlink);
         } else if (wInfo.onStack) {
           // Successor w is in stack S and hence in the current SCC
-          vInfo.lowlink = Math.min(vInfo.lowlink, wInfo.index);
+          vInfo.lowlink = math.min(vInfo.lowlink, wInfo.index);
         }
       }
     }
diff --git a/pkg/analyzer/lib/src/services/formatter_impl.dart b/pkg/analyzer/lib/src/services/formatter_impl.dart
index 0c272f1..d35bd2b 100644
--- a/pkg/analyzer/lib/src/services/formatter_impl.dart
+++ b/pkg/analyzer/lib/src/services/formatter_impl.dart
@@ -51,7 +51,7 @@
     //TODO(pquitslund): consider a verbosity flag to add/suppress details
     var errorCode = errors[0].errorCode;
     var phase = errorCode is ParserErrorCode ? 'parsing' : 'scanning';
-    return 'An error occured while ${phase} (${errorCode.name}).';
+    return 'An error occured while $phase (${errorCode.name}).';
   }
 
   String toString() => '$message';
@@ -206,7 +206,7 @@
     if (!isEOF(token2) &&
         !(isCLOSE_CURLY_BRACKET(token2) && isEOF(token2.next))) {
       throw new FormatterException(
-          'Expected "EOF" but got "${token2}".');
+          'Expected "EOF" but got "$token2".');
     }
   }
 
@@ -216,7 +216,7 @@
     while (comment1 != null) {
       if (comment2 == null) {
         throw new FormatterException(
-            'Expected comment, "${comment1}", at ${describeLocation(token1)}, '
+            'Expected comment, "$comment1", at ${describeLocation(token1)}, '
             'but got none.');
       }
       if (!equivalentComments(comment1, comment2)) {
@@ -227,7 +227,7 @@
     }
     if (comment2 != null) {
       throw new FormatterException(
-          'Unexpected comment, "${comment2}", at ${describeLocation(token2)}.');
+          'Unexpected comment, "$comment2", at ${describeLocation(token2)}.');
     }
   }
 
@@ -236,7 +236,7 @@
 
   throwNotEqualException(t1, t2) {
     throw new FormatterException(
-        'Expected "${t1}" but got "${t2}", at ${describeLocation(t1)}.');
+        'Expected "$t1" but got "$t2", at ${describeLocation(t1)}.');
   }
 
   String describeLocation(Token token) => lineInfo == null ? '<unknown>' :
diff --git a/pkg/analyzer/lib/src/services/runtime/coverage/models.dart b/pkg/analyzer/lib/src/services/runtime/coverage/models.dart
index 74fc7aa..bf247f3 100644
--- a/pkg/analyzer/lib/src/services/runtime/coverage/models.dart
+++ b/pkg/analyzer/lib/src/services/runtime/coverage/models.dart
@@ -89,7 +89,7 @@
     }
     // Print source and line ranges.
     if (children.isEmpty) {
-      sink.write('${prefix}  "ranges": [');
+      sink.write('$prefix  "ranges": [');
       var rangePrinter = new RangePrinter(unit, sink, executedIds);
       idToRange.forEach(rangePrinter.handle);
       rangePrinter.printRange();
diff --git a/pkg/analyzer/lib/src/services/runtime/log.dart b/pkg/analyzer/lib/src/services/runtime/log.dart
index 48d66d7..6d3c9a6 100644
--- a/pkg/analyzer/lib/src/services/runtime/log.dart
+++ b/pkg/analyzer/lib/src/services/runtime/log.dart
@@ -41,7 +41,7 @@
   _logger.onRecord.listen((LogRecord record) {
     String levelString = record.level.toString();
     while (levelString.length < 6) levelString += ' ';
-    print('${record.time}: ${levelString} ${record.message}');
+    print('${record.time}: $levelString ${record.message}');
   });
 }
 
diff --git a/pkg/analyzer/lib/src/util/utilities_timing.dart b/pkg/analyzer/lib/src/util/utilities_timing.dart
new file mode 100644
index 0000000..4d07fcd
--- /dev/null
+++ b/pkg/analyzer/lib/src/util/utilities_timing.dart
@@ -0,0 +1,39 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library engine.utilities.timing;
+
+/**
+ * A `CountedStopwatch` is a [Stopwatch] that counts the number of times the
+ * stop method has been invoked.
+ */
+class CountedStopwatch extends Stopwatch {
+  /**
+   * The number of times the [stop] method has been invoked.
+   */
+  int stopCount = 0;
+
+  /**
+   * Initialize a newly created stopwatch.
+   */
+  CountedStopwatch();
+
+  /**
+   * The average number of millisecond that were recorded each time the [start]
+   * and [stop] methods were invoked.
+   */
+  int get averageMilliseconds => elapsedMilliseconds ~/ stopCount;
+
+  @override
+  void stop() {
+    super.stop();
+    stopCount++;
+  }
+
+  @override
+  void reset() {
+    super.reset();
+    stopCount = 0;
+  }
+}
\ No newline at end of file
diff --git a/pkg/analyzer/test/generated/all_the_rest.dart b/pkg/analyzer/test/generated/all_the_rest.dart
index c194f19..7aa42b0 100644
--- a/pkg/analyzer/test/generated/all_the_rest.dart
+++ b/pkg/analyzer/test/generated/all_the_rest.dart
@@ -19,7 +19,6 @@
 import 'package:analyzer/src/generated/java_engine.dart';
 import 'package:analyzer/src/generated/java_engine_io.dart';
 import 'package:analyzer/src/generated/java_io.dart';
-import 'package:analyzer/src/generated/java_junit.dart';
 import 'package:analyzer/src/generated/resolver.dart';
 import 'package:analyzer/src/generated/scanner.dart';
 import 'package:analyzer/src/generated/sdk.dart';
@@ -31,7 +30,7 @@
 import 'package:analyzer/src/generated/testing/html_factory.dart';
 import 'package:analyzer/src/generated/utilities_collection.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
-import 'package:unittest/unittest.dart' as _ut;
+import 'package:unittest/unittest.dart';
 
 import '../reflective_tests.dart';
 import 'parser_test.dart';
@@ -40,7 +39,7 @@
 
 
 main() {
-  _ut.groupSep = ' | ';
+  groupSep = ' | ';
   runReflectiveTests(AngularCompilationUnitBuilderTest);
   runReflectiveTests(AngularHtmlUnitResolverTest);
   runReflectiveTests(AngularHtmlUnitUtilsTest);
@@ -74,7 +73,7 @@
   runReflectiveTests(StringScannerTest);
 }
 
-abstract class AbstractScannerTest extends JUnitTestCase {
+abstract class AbstractScannerTest {
   ht.AbstractScanner newScanner(String input);
 
   void test_tokenize_attribute() {
@@ -250,11 +249,11 @@
             " "],
         <int>[0, 9, 21, 25, 28, 38, 49]);
     token = token.next;
-    JUnitTestCase.assertEquals(1, token.offset);
+    expect(token.offset, 1);
     token = token.next;
-    JUnitTestCase.assertEquals(3, token.offset);
+    expect(token.offset, 3);
     token = token.next;
-    JUnitTestCase.assertEquals(10, token.offset);
+    expect(token.offset, 10);
   }
 
   void test_tokenize_string() {
@@ -309,7 +308,7 @@
     ht.Token token =
         _tokenize("<html>", <Object>[ht.TokenType.LT, "html", ht.TokenType.GT]);
     token = token.next;
-    JUnitTestCase.assertEquals(1, token.offset);
+    expect(token.offset, 1);
   }
 
   void test_tokenize_tag_incomplete_with_special_characters() {
@@ -369,8 +368,7 @@
       }
       return ht.TokenType.TEXT;
     }
-    JUnitTestCase.fail(
-        "Unknown expected token ${count}: ${(expected != null ? expected.runtimeType : "null")}");
+    fail("Unknown expected token $count: ${expected != null ? expected.runtimeType : "null"}");
     return null;
   }
 
@@ -397,38 +395,32 @@
     ht.Token firstToken = scanner.tokenize();
     ht.Token token = firstToken;
     ht.Token previousToken = token.previous;
-    JUnitTestCase.assertTrue(previousToken.type == ht.TokenType.EOF);
-    JUnitTestCase.assertSame(previousToken, previousToken.previous);
-    JUnitTestCase.assertEquals(-1, previousToken.offset);
-    JUnitTestCase.assertSame(token, previousToken.next);
-    JUnitTestCase.assertEquals(0, token.offset);
+    expect(previousToken.type == ht.TokenType.EOF, isTrue);
+    expect(previousToken.previous, same(previousToken));
+    expect(previousToken.offset, -1);
+    expect(previousToken.next, same(token));
+    expect(token.offset, 0);
     while (token.type != ht.TokenType.EOF) {
       if (count == expectedTokens.length) {
-        JUnitTestCase.fail("too many parsed tokens");
+        fail("too many parsed tokens");
       }
       Object expected = expectedTokens[count];
       ht.TokenType expectedTokenType = _getExpectedTokenType(count, expected);
-      JUnitTestCase.assertSameMsg(
-          "token ${count}",
-          expectedTokenType,
-          token.type);
+      expect(token.type, same(expectedTokenType), reason: "token $count");
       if (expectedTokenType.lexeme != null) {
-        JUnitTestCase.assertEqualsMsg(
-            "token ${count}",
-            expectedTokenType.lexeme,
-            token.lexeme);
+        expect(token.lexeme, expectedTokenType.lexeme, reason: "token $count");
       } else {
-        JUnitTestCase.assertEqualsMsg("token ${count}", expected, token.lexeme);
+        expect(token.lexeme, expected, reason: "token $count");
       }
       count++;
       previousToken = token;
       token = token.next;
-      JUnitTestCase.assertSame(previousToken, token.previous);
+      expect(token.previous, same(previousToken));
     }
-    JUnitTestCase.assertSame(token, token.next);
-    JUnitTestCase.assertEquals(input.length, token.offset);
+    expect(token.next, same(token));
+    expect(token.offset, input.length);
     if (count != expectedTokens.length) {
-      JUnitTestCase.assertTrueMsg("not enough parsed tokens", false);
+      expect(false, isTrue, reason: "not enough parsed tokens");
     }
     List<int> lineStarts = scanner.lineStarts;
     bool success = expectedLineStarts.length == lineStarts.length;
@@ -441,18 +433,18 @@
       }
     }
     if (!success) {
-      JavaStringBuilder msg = new JavaStringBuilder();
-      msg.append("Expected line starts ");
+      StringBuffer buffer = new StringBuffer();
+      buffer.write("Expected line starts ");
       for (int start in expectedLineStarts) {
-        msg.append(start);
-        msg.append(", ");
+        buffer.write(start);
+        buffer.write(", ");
       }
-      msg.append(" but found ");
+      buffer.write(" but found ");
       for (int start in lineStarts) {
-        msg.append(start);
-        msg.append(", ");
+        buffer.write(start);
+        buffer.write(", ");
       }
-      JUnitTestCase.fail(msg.toString());
+      fail(buffer.toString());
     }
     return firstToken;
   }
@@ -461,32 +453,31 @@
 
 class AngularCompilationUnitBuilderTest extends AngularTest {
   void test_Decorator() {
-    String mainContent = _createAngularSource(
-        [
-            "@Decorator(selector: '[my-dir]',",
-            "             map: const {",
-            "               'my-dir' : '=>myPropA',",
-            "               '.' : '&myPropB',",
-            "             })",
-            "class MyDirective {",
-            "  set myPropA(value) {}",
-            "  set myPropB(value) {}",
-            "  @NgTwoWay('my-prop-c')",
-            "  String myPropC;",
-            "}"]);
+    String mainContent = _createAngularSource(r'''
+@Decorator(selector: '[my-dir]',
+             map: const {
+               'my-dir' : '=>myPropA',
+               '.' : '&myPropB',
+             })
+class MyDirective {
+  set myPropA(value) {}
+  set myPropB(value) {}
+  @NgTwoWay('my-prop-c')
+  String myPropC;
+}''');
     resolveMainSourceNoErrors(mainContent);
     // prepare AngularDirectiveElement
     ClassElement classElement = mainUnitElement.getType("MyDirective");
     AngularDecoratorElement directive =
         getAngularElement(classElement, (e) => e is AngularDecoratorElement);
-    JUnitTestCase.assertNotNull(directive);
+    expect(directive, isNotNull);
     // verify
-    JUnitTestCase.assertEquals(null, directive.name);
-    JUnitTestCase.assertEquals(-1, directive.nameOffset);
+    expect(directive.name, null);
+    expect(directive.nameOffset, -1);
     _assertHasAttributeSelector(directive.selector, "my-dir");
     // verify properties
     List<AngularPropertyElement> properties = directive.properties;
-    EngineTestCase.assertLength(3, properties);
+    expect(properties, hasLength(3));
     _assertProperty(
         properties[0],
         "my-dir",
@@ -511,58 +502,60 @@
   }
 
   void test_Decorator_bad_cannotParseSelector() {
-    String mainContent = _createAngularSource(
-        [
-            "@Decorator(selector: '~bad-selector',",
-            "             map: const {",
-            "               'my-dir' : '=>myPropA',",
-            "               '.' : '&myPropB',",
-            "             })",
-            "class MyDirective {",
-            "  set myPropA(value) {}",
-            "  set myPropB(value) {}",
-            "}"]);
+    String mainContent = _createAngularSource(r'''
+@Decorator(selector: '~bad-selector',
+             map: const {
+               'my-dir' : '=>myPropA',
+               '.' : '&myPropB',
+             })
+class MyDirective {
+  set myPropA(value) {}
+  set myPropB(value) {}
+}''');
     resolveMainSource(mainContent);
     // has error
     assertMainErrors([AngularCode.CANNOT_PARSE_SELECTOR]);
   }
 
   void test_Decorator_bad_missingSelector() {
-    String mainContent = _createAngularSource(
-        [
-            "@Decorator(/*selector: '[my-dir]',*/",
-            "             map: const {",
-            "               'my-dir' : '=>myPropA',",
-            "               '.' : '&myPropB',",
-            "             })",
-            "class MyDirective {",
-            "  set myPropA(value) {}",
-            "  set myPropB(value) {}",
-            "}"]);
+    String mainContent = _createAngularSource(r'''
+@Decorator(/*selector: '[my-dir]',*/
+             map: const {
+               'my-dir' : '=>myPropA',
+               '.' : '&myPropB',
+             })
+class MyDirective {
+  set myPropA(value) {}
+  set myPropB(value) {}
+}''');
     resolveMainSource(mainContent);
     // has error
     assertMainErrors([AngularCode.MISSING_SELECTOR]);
   }
 
   void test_Formatter() {
-    String mainContent = _createAngularSource(
-        ["@Formatter(name: 'myFilter')", "class MyFilter {", "  call(p1, p2) {}", "}"]);
+    String mainContent = _createAngularSource(r'''
+@Formatter(name: 'myFilter')
+class MyFilter {
+  call(p1, p2) {}
+}''');
     resolveMainSourceNoErrors(mainContent);
     // prepare AngularFilterElement
     ClassElement classElement = mainUnitElement.getType("MyFilter");
     AngularFormatterElement filter =
         getAngularElement(classElement, (e) => e is AngularFormatterElement);
-    JUnitTestCase.assertNotNull(filter);
+    expect(filter, isNotNull);
     // verify
-    JUnitTestCase.assertEquals("myFilter", filter.name);
-    JUnitTestCase.assertEquals(
-        AngularTest.findOffset(mainContent, "myFilter'"),
-        filter.nameOffset);
+    expect(filter.name, "myFilter");
+    expect(filter.nameOffset, AngularTest.findOffset(mainContent, "myFilter'"));
   }
 
   void test_Formatter_missingName() {
-    String mainContent = _createAngularSource(
-        ["@Formatter()", "class MyFilter {", "  call(p1, p2) {}", "}"]);
+    String mainContent = _createAngularSource(r'''
+@Formatter()
+class MyFilter {
+  call(p1, p2) {}
+}''');
     resolveMainSource(mainContent);
     // has error
     assertMainErrors([AngularCode.MISSING_NAME]);
@@ -570,18 +563,17 @@
     ClassElement classElement = mainUnitElement.getType("MyFilter");
     AngularFormatterElement filter =
         getAngularElement(classElement, (e) => e is AngularFormatterElement);
-    JUnitTestCase.assertNull(filter);
+    expect(filter, isNull);
   }
 
   void test_NgComponent_bad_cannotParseSelector() {
     contextHelper.addSource("/my_template.html", "");
     contextHelper.addSource("/my_styles.css", "");
-    String mainContent = _createAngularSource(
-        [
-            "@Component(publishAs: 'ctrl', selector: '~myComp',",
-            "             templateUrl: 'my_template.html', cssUrl: 'my_styles.css')",
-            "class MyComponent {",
-            "}"]);
+    String mainContent = _createAngularSource(r'''
+@Component(publishAs: 'ctrl', selector: '~myComp',
+             templateUrl: 'my_template.html', cssUrl: 'my_styles.css')
+class MyComponent {
+}''');
     resolveMainSource(mainContent);
     // has error
     assertMainErrors([AngularCode.CANNOT_PARSE_SELECTOR]);
@@ -590,12 +582,11 @@
   void test_NgComponent_bad_missingSelector() {
     contextHelper.addSource("/my_template.html", "");
     contextHelper.addSource("/my_styles.css", "");
-    String mainContent = _createAngularSource(
-        [
-            "@Component(publishAs: 'ctrl', /*selector: 'myComp',*/",
-            "             templateUrl: 'my_template.html', cssUrl: 'my_styles.css')",
-            "class MyComponent {",
-            "}"]);
+    String mainContent = _createAngularSource(r'''
+@Component(publishAs: 'ctrl', /*selector: 'myComp',*/
+             templateUrl: 'my_template.html', cssUrl: 'my_styles.css')
+class MyComponent {
+}''');
     resolveMainSource(mainContent);
     // has error
     assertMainErrors([AngularCode.MISSING_SELECTOR]);
@@ -609,25 +600,23 @@
     contextHelper.addSource("/my_template", "");
     contextHelper.addSource("/my_styles.css", "");
     addMainSource(
-        _createAngularSource(
-            [
-                "@NgComponent(publishAs: 'ctrl', selector: 'myComp',",
-                "             templateUrl: 'my_template', cssUrl: 'my_styles.css')",
-                "class MyComponent {",
-                "}"]));
+        _createAngularSource(r'''
+@NgComponent(publishAs: 'ctrl', selector: 'myComp',
+             templateUrl: 'my_template', cssUrl: 'my_styles.css')
+class MyComponent {
+}'''));
     contextHelper.runTasks();
   }
 
   void test_NgComponent_bad_properties_invalidBinding() {
     contextHelper.addSource("/my_template.html", "");
     contextHelper.addSource("/my_styles.css", "");
-    String mainContent = _createAngularSource(
-        [
-            "@Component(publishAs: 'ctrl', selector: 'myComp',",
-            "             templateUrl: 'my_template.html', cssUrl: 'my_styles.css',",
-            "             map: const {'name' : '?field'})",
-            "class MyComponent {",
-            "}"]);
+    String mainContent = _createAngularSource(r'''
+@Component(publishAs: 'ctrl', selector: 'myComp',
+             templateUrl: 'my_template.html', cssUrl: 'my_styles.css',
+             map: const {'name' : '?field'})
+class MyComponent {
+}''');
     resolveMainSource(mainContent);
     // has error
     assertMainErrors([AngularCode.INVALID_PROPERTY_KIND]);
@@ -636,13 +625,12 @@
   void test_NgComponent_bad_properties_nameNotStringLiteral() {
     contextHelper.addSource("/my_template.html", "");
     contextHelper.addSource("/my_styles.css", "");
-    String mainContent = _createAngularSource(
-        [
-            "@Component(publishAs: 'ctrl', selector: 'myComp',",
-            "             templateUrl: 'my_template.html', cssUrl: 'my_styles.css',",
-            "             map: const {null : 'field'})",
-            "class MyComponent {",
-            "}"]);
+    String mainContent = _createAngularSource(r'''
+@Component(publishAs: 'ctrl', selector: 'myComp',
+             templateUrl: 'my_template.html', cssUrl: 'my_styles.css',
+             map: const {null : 'field'})
+class MyComponent {
+}''');
     resolveMainSource(mainContent);
     // has error
     assertMainErrors([AngularCode.INVALID_PROPERTY_NAME]);
@@ -651,13 +639,12 @@
   void test_NgComponent_bad_properties_noSuchField() {
     contextHelper.addSource("/my_template.html", "");
     contextHelper.addSource("/my_styles.css", "");
-    String mainContent = _createAngularSource(
-        [
-            "@Component(publishAs: 'ctrl', selector: 'myComp',",
-            "             templateUrl: 'my_template.html', cssUrl: 'my_styles.css',",
-            "             map: const {'name' : '=>field'})",
-            "class MyComponent {",
-            "}"]);
+    String mainContent = _createAngularSource(r'''
+@Component(publishAs: 'ctrl', selector: 'myComp',
+             templateUrl: 'my_template.html', cssUrl: 'my_styles.css',
+             map: const {'name' : '=>field'})
+class MyComponent {
+}''');
     resolveMainSource(mainContent);
     // has error
     assertMainErrors([AngularCode.INVALID_PROPERTY_FIELD]);
@@ -666,13 +653,12 @@
   void test_NgComponent_bad_properties_notMapLiteral() {
     contextHelper.addSource("/my_template.html", "");
     contextHelper.addSource("/my_styles.css", "");
-    String mainContent = _createAngularSource(
-        [
-            "@Component(publishAs: 'ctrl', selector: 'myComp',",
-            "             templateUrl: 'my_template.html', cssUrl: 'my_styles.css',",
-            "             map: null)",
-            "class MyComponent {",
-            "}"]);
+    String mainContent = _createAngularSource(r'''
+@Component(publishAs: 'ctrl', selector: 'myComp',
+             templateUrl: 'my_template.html', cssUrl: 'my_styles.css',
+             map: null)
+class MyComponent {
+}''');
     resolveMainSource(mainContent);
     // has error
     assertMainErrors([AngularCode.INVALID_PROPERTY_MAP]);
@@ -681,13 +667,12 @@
   void test_NgComponent_bad_properties_specNotStringLiteral() {
     contextHelper.addSource("/my_template.html", "");
     contextHelper.addSource("/my_styles.css", "");
-    String mainContent = _createAngularSource(
-        [
-            "@Component(publishAs: 'ctrl', selector: 'myComp',",
-            "             templateUrl: 'my_template.html', cssUrl: 'my_styles.css',",
-            "             map: const {'name' : null})",
-            "class MyComponent {",
-            "}"]);
+    String mainContent = _createAngularSource(r'''
+@Component(publishAs: 'ctrl', selector: 'myComp',
+             templateUrl: 'my_template.html', cssUrl: 'my_styles.css',
+             map: const {'name' : null})
+class MyComponent {
+}''');
     resolveMainSource(mainContent);
     // has error
     assertMainErrors([AngularCode.INVALID_PROPERTY_SPEC]);
@@ -696,62 +681,59 @@
   void test_NgComponent_no_cssUrl() {
     contextHelper.addSource("/my_template.html", "");
     contextHelper.addSource("/my_styles.css", "");
-    String mainContent = _createAngularSource(
-        [
-            "@Component(publishAs: 'ctrl', selector: 'myComp',",
-            "             templateUrl: 'my_template.html'/*, cssUrl: 'my_styles.css'*/)",
-            "class MyComponent {",
-            "}"]);
+    String mainContent = _createAngularSource(r'''
+@Component(publishAs: 'ctrl', selector: 'myComp',
+             templateUrl: 'my_template.html'/*, cssUrl: 'my_styles.css'*/)
+class MyComponent {
+}''');
     resolveMainSource(mainContent);
     // prepare AngularComponentElement
     ClassElement classElement = mainUnitElement.getType("MyComponent");
     AngularComponentElement component =
         getAngularElement(classElement, (e) => e is AngularComponentElement);
-    JUnitTestCase.assertNotNull(component);
+    expect(component, isNotNull);
     // no CSS
-    JUnitTestCase.assertEquals(null, component.styleUri);
-    JUnitTestCase.assertEquals(-1, component.styleUriOffset);
+    expect(component.styleUri, null);
+    expect(component.styleUriOffset, -1);
   }
 
   void test_NgComponent_no_publishAs() {
     contextHelper.addSource("/my_template.html", "");
     contextHelper.addSource("/my_styles.css", "");
-    String mainContent = _createAngularSource(
-        [
-            "@Component(/*publishAs: 'ctrl',*/ selector: 'myComp',",
-            "             templateUrl: 'my_template.html', cssUrl: 'my_styles.css')",
-            "class MyComponent {",
-            "}"]);
+    String mainContent = _createAngularSource(r'''
+@Component(/*publishAs: 'ctrl',*/ selector: 'myComp',
+             templateUrl: 'my_template.html', cssUrl: 'my_styles.css')
+class MyComponent {
+}''');
     resolveMainSource(mainContent);
     // prepare AngularComponentElement
     ClassElement classElement = mainUnitElement.getType("MyComponent");
     AngularComponentElement component =
         getAngularElement(classElement, (e) => e is AngularComponentElement);
-    JUnitTestCase.assertNotNull(component);
+    expect(component, isNotNull);
     // no name
-    JUnitTestCase.assertEquals(null, component.name);
-    JUnitTestCase.assertEquals(-1, component.nameOffset);
+    expect(component.name, null);
+    expect(component.nameOffset, -1);
   }
 
   void test_NgComponent_no_templateUrl() {
     contextHelper.addSource("/my_template.html", "");
     contextHelper.addSource("/my_styles.css", "");
-    String mainContent = _createAngularSource(
-        [
-            "@Component(publishAs: 'ctrl', selector: 'myComp',",
-            "             /*templateUrl: 'my_template.html',*/ cssUrl: 'my_styles.css')",
-            "class MyComponent {",
-            "}"]);
+    String mainContent = _createAngularSource(r'''
+@Component(publishAs: 'ctrl', selector: 'myComp',
+             /*templateUrl: 'my_template.html',*/ cssUrl: 'my_styles.css')
+class MyComponent {
+}''');
     resolveMainSource(mainContent);
     // prepare AngularComponentElement
     ClassElement classElement = mainUnitElement.getType("MyComponent");
     AngularComponentElement component =
         getAngularElement(classElement, (e) => e is AngularComponentElement);
-    JUnitTestCase.assertNotNull(component);
+    expect(component, isNotNull);
     // no template
-    JUnitTestCase.assertEquals(null, component.templateUri);
-    JUnitTestCase.assertEquals(null, component.templateSource);
-    JUnitTestCase.assertEquals(-1, component.templateUriOffset);
+    expect(component.templateUri, null);
+    expect(component.templateSource, null);
+    expect(component.templateUriOffset, -1);
   }
 
   /**
@@ -760,15 +742,14 @@
   void test_NgComponent_notAngular() {
     contextHelper.addSource("/my_template.html", "");
     contextHelper.addSource("/my_styles.css", "");
-    String mainContent = EngineTestCase.createSource(
-        [
-            "class Component {",
-            "  const Component(a, b);",
-            "}",
-            "",
-            "@Component('foo', 42)",
-            "class MyComponent {",
-            "}"]);
+    String mainContent = r'''
+class Component {
+  const Component(a, b);
+}
+
+@Component('foo', 42)
+class MyComponent {
+}''';
     resolveMainSource(mainContent);
     assertNoMainErrors();
   }
@@ -777,29 +758,28 @@
     contextHelper.addSource("/my_template.html", "");
     contextHelper.addSource("/my_styles.css", "");
     resolveMainSourceNoErrors(
-        _createAngularSource(
-            [
-                "class MySuper {",
-                "  var myPropA;",
-                "}",
-                "",
-                "",
-                "",
-                "@Component(publishAs: 'ctrl', selector: 'myComp',",
-                "             templateUrl: 'my_template.html', cssUrl: 'my_styles.css',",
-                "             map: const {",
-                "               'prop-a' : '@myPropA'",
-                "             })",
-                "class MyComponent extends MySuper {",
-                "}"]));
+        _createAngularSource(r'''
+class MySuper {
+  var myPropA;
+}
+
+
+
+@Component(publishAs: 'ctrl', selector: 'myComp',
+             templateUrl: 'my_template.html', cssUrl: 'my_styles.css',
+             map: const {
+               'prop-a' : '@myPropA'
+             })
+class MyComponent extends MySuper {
+}'''));
     // prepare AngularComponentElement
     ClassElement classElement = mainUnitElement.getType("MyComponent");
     AngularComponentElement component =
         getAngularElement(classElement, (e) => e is AngularComponentElement);
-    JUnitTestCase.assertNotNull(component);
+    expect(component, isNotNull);
     // verify
     List<AngularPropertyElement> properties = component.properties;
-    EngineTestCase.assertLength(1, properties);
+    expect(properties, hasLength(1));
     _assertProperty(
         properties[0],
         "prop-a",
@@ -813,30 +793,29 @@
     contextHelper.addSource("/my_template.html", "");
     contextHelper.addSource("/my_styles.css", "");
     resolveMainSourceNoErrors(
-        _createAngularSource(
-            [
-                "@Component(publishAs: 'ctrl', selector: 'myComp',",
-                "             templateUrl: 'my_template.html', cssUrl: 'my_styles.css')",
-                "class MyComponent {",
-                "  @NgAttr('prop-a')",
-                "  var myPropA;",
-                "  @NgCallback('prop-b')",
-                "  var myPropB;",
-                "  @NgOneWay('prop-c')",
-                "  var myPropC;",
-                "  @NgOneWayOneTime('prop-d')",
-                "  var myPropD;",
-                "  @NgTwoWay('prop-e')",
-                "  var myPropE;",
-                "}"]));
+        _createAngularSource(r'''
+@Component(publishAs: 'ctrl', selector: 'myComp',
+             templateUrl: 'my_template.html', cssUrl: 'my_styles.css')
+class MyComponent {
+  @NgAttr('prop-a')
+  var myPropA;
+  @NgCallback('prop-b')
+  var myPropB;
+  @NgOneWay('prop-c')
+  var myPropC;
+  @NgOneWayOneTime('prop-d')
+  var myPropD;
+  @NgTwoWay('prop-e')
+  var myPropE;
+}'''));
     // prepare AngularComponentElement
     ClassElement classElement = mainUnitElement.getType("MyComponent");
     AngularComponentElement component =
         getAngularElement(classElement, (e) => e is AngularComponentElement);
-    JUnitTestCase.assertNotNull(component);
+    expect(component, isNotNull);
     // verify
     List<AngularPropertyElement> properties = component.properties;
-    EngineTestCase.assertLength(5, properties);
+    expect(properties, hasLength(5));
     _assertProperty(
         properties[0],
         "prop-a",
@@ -878,32 +857,31 @@
     contextHelper.addSource("/my_template.html", "");
     contextHelper.addSource("/my_styles.css", "");
     resolveMainSourceNoErrors(
-        _createAngularSource(
-            [
-                "@Component(publishAs: 'ctrl', selector: 'myComp',",
-                "             templateUrl: 'my_template.html', cssUrl: 'my_styles.css',",
-                "             map: const {",
-                "               'prop-a' : '@myPropA',",
-                "               'prop-b' : '&myPropB',",
-                "               'prop-c' : '=>myPropC',",
-                "               'prop-d' : '=>!myPropD',",
-                "               'prop-e' : '<=>myPropE'",
-                "             })",
-                "class MyComponent {",
-                "  var myPropA;",
-                "  var myPropB;",
-                "  var myPropC;",
-                "  var myPropD;",
-                "  var myPropE;",
-                "}"]));
+        _createAngularSource(r'''
+@Component(publishAs: 'ctrl', selector: 'myComp',
+             templateUrl: 'my_template.html', cssUrl: 'my_styles.css',
+             map: const {
+               'prop-a' : '@myPropA',
+               'prop-b' : '&myPropB',
+               'prop-c' : '=>myPropC',
+               'prop-d' : '=>!myPropD',
+               'prop-e' : '<=>myPropE'
+             })
+class MyComponent {
+  var myPropA;
+  var myPropB;
+  var myPropC;
+  var myPropD;
+  var myPropE;
+}'''));
     // prepare AngularComponentElement
     ClassElement classElement = mainUnitElement.getType("MyComponent");
     AngularComponentElement component =
         getAngularElement(classElement, (e) => e is AngularComponentElement);
-    JUnitTestCase.assertNotNull(component);
+    expect(component, isNotNull);
     // verify
     List<AngularPropertyElement> properties = component.properties;
-    EngineTestCase.assertLength(5, properties);
+    expect(properties, hasLength(5));
     _assertProperty(
         properties[0],
         "prop-a",
@@ -944,138 +922,124 @@
   void test_NgComponent_properties_no() {
     contextHelper.addSource("/my_template.html", "");
     contextHelper.addSource("/my_styles.css", "");
-    String mainContent = _createAngularSource(
-        [
-            "@Component(publishAs: 'ctrl', selector: 'myComp',",
-            "             templateUrl: 'my_template.html', cssUrl: 'my_styles.css')",
-            "class MyComponent {",
-            "}"]);
+    String mainContent = _createAngularSource(r'''
+@Component(publishAs: 'ctrl', selector: 'myComp',
+             templateUrl: 'my_template.html', cssUrl: 'my_styles.css')
+class MyComponent {
+}''');
     resolveMainSourceNoErrors(mainContent);
     // prepare AngularComponentElement
     ClassElement classElement = mainUnitElement.getType("MyComponent");
     AngularComponentElement component =
         getAngularElement(classElement, (e) => e is AngularComponentElement);
-    JUnitTestCase.assertNotNull(component);
+    expect(component, isNotNull);
     // verify
-    JUnitTestCase.assertEquals("ctrl", component.name);
-    JUnitTestCase.assertEquals(
-        AngularTest.findOffset(mainContent, "ctrl'"),
-        component.nameOffset);
+    expect(component.name, "ctrl");
+    expect(component.nameOffset, AngularTest.findOffset(mainContent, "ctrl'"));
     _assertIsTagSelector(component.selector, "myComp");
-    JUnitTestCase.assertEquals("my_template.html", component.templateUri);
-    JUnitTestCase.assertEquals(
-        AngularTest.findOffset(mainContent, "my_template.html'"),
-        component.templateUriOffset);
-    JUnitTestCase.assertEquals("my_styles.css", component.styleUri);
-    JUnitTestCase.assertEquals(
-        AngularTest.findOffset(mainContent, "my_styles.css'"),
-        component.styleUriOffset);
-    EngineTestCase.assertLength(0, component.properties);
+    expect(component.templateUri, "my_template.html");
+    expect(component.templateUriOffset, AngularTest.findOffset(mainContent, "my_template.html'"));
+    expect(component.styleUri, "my_styles.css");
+    expect(component.styleUriOffset, AngularTest.findOffset(mainContent, "my_styles.css'"));
+    expect(component.properties, hasLength(0));
   }
 
   void test_NgComponent_scopeProperties() {
     contextHelper.addSource("/my_template.html", "");
     contextHelper.addSource("/my_styles.css", "");
-    String mainContent = _createAngularSource(
-        [
-            "@Component(publishAs: 'ctrl', selector: 'myComp',",
-            "             templateUrl: 'my_template.html', cssUrl: 'my_styles.css')",
-            "class MyComponent {",
-            "  MyComponent(Scope scope) {",
-            "    scope.context['boolProp'] = true;",
-            "    scope.context['intProp'] = 42;",
-            "    scope.context['stringProp'] = 'foo';",
-            "    // duplicate is ignored",
-            "    scope.context['boolProp'] = true;",
-            "    // LHS is not an IndexExpression",
-            "    var v1;",
-            "    v1 = 1;",
-            "    // LHS is not a Scope access",
-            "    var v2;",
-            "    v2['name'] = 2;",
-            "  }",
-            "}"]);
+    String mainContent = _createAngularSource(r'''
+@Component(publishAs: 'ctrl', selector: 'myComp',
+             templateUrl: 'my_template.html', cssUrl: 'my_styles.css')
+class MyComponent {
+  MyComponent(Scope scope) {
+    scope.context['boolProp'] = true;
+    scope.context['intProp'] = 42;
+    scope.context['stringProp'] = 'foo';
+    // duplicate is ignored
+    scope.context['boolProp'] = true;
+    // LHS is not an IndexExpression
+    var v1;
+    v1 = 1;
+    // LHS is not a Scope access
+    var v2;
+    v2['name'] = 2;
+  }
+}''');
     resolveMainSourceNoErrors(mainContent);
     // prepare AngularComponentElement
     ClassElement classElement = mainUnitElement.getType("MyComponent");
     AngularComponentElement component =
         getAngularElement(classElement, (e) => e is AngularComponentElement);
-    JUnitTestCase.assertNotNull(component);
+    expect(component, isNotNull);
     // verify
     List<AngularScopePropertyElement> scopeProperties =
         component.scopeProperties;
-    EngineTestCase.assertLength(3, scopeProperties);
+    expect(scopeProperties, hasLength(3));
     {
       AngularScopePropertyElement property = scopeProperties[0];
-      JUnitTestCase.assertSame(property, findMainElement2("boolProp"));
-      JUnitTestCase.assertEquals("boolProp", property.name);
-      JUnitTestCase.assertEquals(
-          AngularTest.findOffset(mainContent, "boolProp'"),
-          property.nameOffset);
-      JUnitTestCase.assertEquals("bool", property.type.name);
+      expect(findMainElement2("boolProp"), same(property));
+      expect(property.name, "boolProp");
+      expect(property.nameOffset, AngularTest.findOffset(mainContent, "boolProp'"));
+      expect(property.type.name, "bool");
     }
     {
       AngularScopePropertyElement property = scopeProperties[1];
-      JUnitTestCase.assertSame(property, findMainElement2("intProp"));
-      JUnitTestCase.assertEquals("intProp", property.name);
-      JUnitTestCase.assertEquals(
-          AngularTest.findOffset(mainContent, "intProp'"),
-          property.nameOffset);
-      JUnitTestCase.assertEquals("int", property.type.name);
+      expect(findMainElement2("intProp"), same(property));
+      expect(property.name, "intProp");
+      expect(property.nameOffset, AngularTest.findOffset(mainContent, "intProp'"));
+      expect(property.type.name, "int");
     }
     {
       AngularScopePropertyElement property = scopeProperties[2];
-      JUnitTestCase.assertSame(property, findMainElement2("stringProp"));
-      JUnitTestCase.assertEquals("stringProp", property.name);
-      JUnitTestCase.assertEquals(
-          AngularTest.findOffset(mainContent, "stringProp'"),
-          property.nameOffset);
-      JUnitTestCase.assertEquals("String", property.type.name);
+      expect(findMainElement2("stringProp"), same(property));
+      expect(property.name, "stringProp");
+      expect(property.nameOffset, AngularTest.findOffset(mainContent, "stringProp'"));
+      expect(property.type.name, "String");
     }
   }
 
   void test_NgController() {
-    String mainContent = _createAngularSource(
-        [
-            "@Controller(publishAs: 'ctrl', selector: '[myApp]')",
-            "class MyController {",
-            "}"]);
+    String mainContent = _createAngularSource(r'''
+@Controller(publishAs: 'ctrl', selector: '[myApp]')
+class MyController {
+}''');
     resolveMainSourceNoErrors(mainContent);
     // prepare AngularControllerElement
     ClassElement classElement = mainUnitElement.getType("MyController");
     AngularControllerElement controller =
         getAngularElement(classElement, (e) => e is AngularControllerElement);
-    JUnitTestCase.assertNotNull(controller);
+    expect(controller, isNotNull);
     // verify
-    JUnitTestCase.assertEquals("ctrl", controller.name);
-    JUnitTestCase.assertEquals(
-        AngularTest.findOffset(mainContent, "ctrl'"),
-        controller.nameOffset);
+    expect(controller.name, "ctrl");
+    expect(controller.nameOffset, AngularTest.findOffset(mainContent, "ctrl'"));
     _assertHasAttributeSelector(controller.selector, "myApp");
   }
 
   void test_NgController_cannotParseSelector() {
-    String mainContent = _createAngularSource(
-        [
-            "@Controller(publishAs: 'ctrl', selector: '~unknown')",
-            "class MyController {",
-            "}"]);
+    String mainContent = _createAngularSource(r'''
+@Controller(publishAs: 'ctrl', selector: '~unknown')
+class MyController {
+}''');
     resolveMainSource(mainContent);
     // has error
     assertMainErrors([AngularCode.CANNOT_PARSE_SELECTOR]);
   }
 
   void test_NgController_missingPublishAs() {
-    String mainContent = _createAngularSource(
-        ["@Controller(selector: '[myApp]')", "class MyController {", "}"]);
+    String mainContent = _createAngularSource(r'''
+@Controller(selector: '[myApp]')
+class MyController {
+}''');
     resolveMainSource(mainContent);
     // has error
     assertMainErrors([AngularCode.MISSING_PUBLISH_AS]);
   }
 
   void test_NgController_missingSelector() {
-    String mainContent = _createAngularSource(
-        ["@Controller(publishAs: 'ctrl')", "class MyController {", "}"]);
+    String mainContent = _createAngularSource(r'''
+@Controller(publishAs: 'ctrl')
+class MyController {
+}''');
     resolveMainSource(mainContent);
     // has error
     assertMainErrors([AngularCode.MISSING_SELECTOR]);
@@ -1083,37 +1047,40 @@
 
   void test_NgController_noAnnotationArguments() {
     String mainContent =
-        _createAngularSource(["@NgController", "class MyController {", "}"]);
+        _createAngularSource(r'''
+@NgController
+class MyController {
+}''');
     resolveMainSource(mainContent);
   }
 
   void test_bad_notConstructorAnnotation() {
-    String mainContent = EngineTestCase.createSource(
-        ["const MY_ANNOTATION = null;", "@MY_ANNOTATION()", "class MyFilter {", "}"]);
+    String mainContent = r'''
+const MY_ANNOTATION = null;
+@MY_ANNOTATION()
+class MyFilter {
+}''';
     resolveMainSource(mainContent);
     // prepare AngularFilterElement
     ClassElement classElement = mainUnitElement.getType("MyFilter");
     AngularFormatterElement filter =
         getAngularElement(classElement, (e) => e is AngularFormatterElement);
-    JUnitTestCase.assertNull(filter);
+    expect(filter, isNull);
   }
 
   void test_getElement_SimpleStringLiteral_withToolkitElement() {
     SimpleStringLiteral literal = AstFactory.string2("foo");
     Element element = new AngularScopePropertyElementImpl("foo", 0, null);
     literal.toolkitElement = element;
-    JUnitTestCase.assertSame(
-        element,
-        AngularCompilationUnitBuilder.getElement(literal, -1));
+    expect(AngularCompilationUnitBuilder.getElement(literal, -1), same(element));
   }
 
   void test_getElement_component_name() {
     resolveMainSource(
-        _createAngularSource(
-            [
-                "@Component(publishAs: 'ctrl', selector: 'myComp',",
-                "             templateUrl: 'my_template.html', cssUrl: 'my_styles.css')",
-                "class MyComponent {}"]));
+        _createAngularSource(r'''
+@Component(publishAs: 'ctrl', selector: 'myComp',
+             templateUrl: 'my_template.html', cssUrl: 'my_styles.css')
+class MyComponent {}'''));
     SimpleStringLiteral node =
         _findMainNode("ctrl'", (n) => n is SimpleStringLiteral);
     int offset = node.offset;
@@ -1127,38 +1094,36 @@
 
   void test_getElement_component_property_fromFieldAnnotation() {
     resolveMainSource(
-        _createAngularSource(
-            [
-                "@Component(publishAs: 'ctrl', selector: 'myComp',",
-                "             templateUrl: 'my_template.html', cssUrl: 'my_styles.css')",
-                "class MyComponent {",
-                "  @NgOneWay('prop')",
-                "  var field;",
-                "}"]));
+        _createAngularSource(r'''
+@Component(publishAs: 'ctrl', selector: 'myComp',
+             templateUrl: 'my_template.html', cssUrl: 'my_styles.css')
+class MyComponent {
+  @NgOneWay('prop')
+  var field;
+}'''));
     // prepare node
     SimpleStringLiteral node =
         _findMainNode("prop'", (n) => n is SimpleStringLiteral);
     int offset = node.offset;
     // prepare Element
     Element element = AngularCompilationUnitBuilder.getElement(node, offset);
-    JUnitTestCase.assertNotNull(element);
+    expect(element, isNotNull);
     // check AngularPropertyElement
     AngularPropertyElement property = element as AngularPropertyElement;
-    JUnitTestCase.assertEquals("prop", property.name);
+    expect(property.name, "prop");
   }
 
   void test_getElement_component_property_fromMap() {
     resolveMainSource(
-        _createAngularSource(
-            [
-                "@Component(publishAs: 'ctrl', selector: 'myComp',",
-                "             templateUrl: 'my_template.html', cssUrl: 'my_styles.css',",
-                "             map: const {",
-                "               'prop' : '@field',",
-                "             })",
-                "class MyComponent {",
-                "  var field;",
-                "}"]));
+        _createAngularSource(r'''
+@Component(publishAs: 'ctrl', selector: 'myComp',
+             templateUrl: 'my_template.html', cssUrl: 'my_styles.css',
+             map: const {
+               'prop' : '@field',
+             })
+class MyComponent {
+  var field;
+}'''));
     // AngularPropertyElement
     {
       SimpleStringLiteral node =
@@ -1166,10 +1131,10 @@
       int offset = node.offset;
       // prepare Element
       Element element = AngularCompilationUnitBuilder.getElement(node, offset);
-      JUnitTestCase.assertNotNull(element);
+      expect(element, isNotNull);
       // check AngularPropertyElement
       AngularPropertyElement property = element as AngularPropertyElement;
-      JUnitTestCase.assertEquals("prop", property.name);
+      expect(property.name, "prop");
     }
     // FieldElement
     {
@@ -1178,20 +1143,19 @@
       int offset = node.offset;
       // prepare Element
       Element element = AngularCompilationUnitBuilder.getElement(node, offset);
-      JUnitTestCase.assertNotNull(element);
+      expect(element, isNotNull);
       // check FieldElement
       FieldElement field = element as FieldElement;
-      JUnitTestCase.assertEquals("field", field.name);
+      expect(field.name, "field");
     }
   }
 
   void test_getElement_component_selector() {
     resolveMainSource(
-        _createAngularSource(
-            [
-                "@Component(publishAs: 'ctrl', selector: 'myComp',",
-                "             templateUrl: 'my_template.html', cssUrl: 'my_styles.css')",
-                "class MyComponent {}"]));
+        _createAngularSource(r'''
+@Component(publishAs: 'ctrl', selector: 'myComp',
+             templateUrl: 'my_template.html', cssUrl: 'my_styles.css')
+class MyComponent {}'''));
     SimpleStringLiteral node =
         _findMainNode("myComp'", (n) => n is SimpleStringLiteral);
     int offset = node.offset;
@@ -1205,11 +1169,10 @@
 
   void test_getElement_controller_name() {
     resolveMainSource(
-        _createAngularSource(
-            [
-                "@Controller(publishAs: 'ctrl', selector: '[myApp]')",
-                "class MyController {",
-                "}"]));
+        _createAngularSource(r'''
+@Controller(publishAs: 'ctrl', selector: '[myApp]')
+class MyController {
+}'''));
     SimpleStringLiteral node =
         _findMainNode("ctrl'", (n) => n is SimpleStringLiteral);
     int offset = node.offset;
@@ -1223,31 +1186,31 @@
 
   void test_getElement_directive_property() {
     resolveMainSource(
-        _createAngularSource(
-            [
-                "@Decorator(selector: '[my-dir]',",
-                "             map: const {",
-                "               'my-dir' : '=>field'",
-                "             })",
-                "class MyDirective {",
-                "  set field(value) {}",
-                "}"]));
+        _createAngularSource(r'''
+@Decorator(selector: '[my-dir]',
+             map: const {
+               'my-dir' : '=>field'
+             })
+class MyDirective {
+  set field(value) {}
+}'''));
     // prepare node
     SimpleStringLiteral node =
         _findMainNode("my-dir'", (n) => n is SimpleStringLiteral);
     int offset = node.offset;
     // prepare Element
     Element element = AngularCompilationUnitBuilder.getElement(node, offset);
-    JUnitTestCase.assertNotNull(element);
+    expect(element, isNotNull);
     // check AngularPropertyElement
     AngularPropertyElement property = element as AngularPropertyElement;
-    JUnitTestCase.assertEquals("my-dir", property.name);
+    expect(property.name, "my-dir");
   }
 
   void test_getElement_directive_selector() {
     resolveMainSource(
-        _createAngularSource(
-            ["@Decorator(selector: '[my-dir]')", "class MyDirective {}"]));
+        _createAngularSource(r'''
+@Decorator(selector: '[my-dir]')
+class MyDirective {}'''));
     SimpleStringLiteral node =
         _findMainNode("my-dir]'", (n) => n is SimpleStringLiteral);
     int offset = node.offset;
@@ -1261,12 +1224,11 @@
 
   void test_getElement_filter_name() {
     resolveMainSource(
-        _createAngularSource(
-            [
-                "@Formatter(name: 'myFilter')",
-                "class MyFilter {",
-                "  call(p1, p2) {}",
-                "}"]));
+        _createAngularSource(r'''
+@Formatter(name: 'myFilter')
+class MyFilter {
+  call(p1, p2) {}
+}'''));
     SimpleStringLiteral node =
         _findMainNode("myFilter'", (n) => n is SimpleStringLiteral);
     int offset = node.offset;
@@ -1283,13 +1245,17 @@
     SimpleStringLiteral node =
         _findMainNode("bar'", (n) => n is SimpleStringLiteral);
     Element element = AngularCompilationUnitBuilder.getElement(node, 0);
-    JUnitTestCase.assertNull(element);
+    expect(element, isNull);
   }
 
   void test_getElement_noClassElement() {
-    resolveMainSource(
-        EngineTestCase.createSource(
-            ["class A {", "  const A(p);", "}", "", "@A('bar')", "class B {}"]));
+    resolveMainSource(r'''
+class A {
+  const A(p);
+}
+
+@A('bar')
+class B {}''');
     SimpleStringLiteral node =
         _findMainNode("bar'", (n) => n is SimpleStringLiteral);
     // reset B element
@@ -1298,32 +1264,33 @@
     classDeclaration.name.staticElement = null;
     // class is not resolved - no element
     Element element = AngularCompilationUnitBuilder.getElement(node, 0);
-    JUnitTestCase.assertNull(element);
+    expect(element, isNull);
   }
 
   void test_getElement_noNode() {
     Element element = AngularCompilationUnitBuilder.getElement(null, 0);
-    JUnitTestCase.assertNull(element);
+    expect(element, isNull);
   }
 
   void test_getElement_notFound() {
-    resolveMainSource(
-        EngineTestCase.createSource(
-            ["class MyComponent {", "  var str = 'some string';", "}"]));
+    resolveMainSource(r'''
+class MyComponent {
+  var str = 'some string';
+}''');
     // prepare node
     SimpleStringLiteral node =
         _findMainNode("some string'", (n) => n is SimpleStringLiteral);
     int offset = node.offset;
     // no Element
     Element element = AngularCompilationUnitBuilder.getElement(node, offset);
-    JUnitTestCase.assertNull(element);
+    expect(element, isNull);
   }
 
   void test_parseSelector_hasAttribute() {
     AngularSelectorElement selector =
         AngularCompilationUnitBuilder.parseSelector(42, "[name]");
     _assertHasAttributeSelector(selector, "name");
-    JUnitTestCase.assertEquals(42 + 1, selector.nameOffset);
+    expect(selector.nameOffset, 42 + 1);
   }
 
   void test_parseSelector_hasClass() {
@@ -1331,20 +1298,20 @@
         AngularCompilationUnitBuilder.parseSelector(42, ".my-class");
     AngularHasClassSelectorElementImpl classSelector =
         selector as AngularHasClassSelectorElementImpl;
-    JUnitTestCase.assertEquals("my-class", classSelector.name);
-    JUnitTestCase.assertEquals(".my-class", classSelector.toString());
-    JUnitTestCase.assertEquals(42 + 1, selector.nameOffset);
+    expect(classSelector.name, "my-class");
+    expect(classSelector.toString(), ".my-class");
+    expect(selector.nameOffset, 42 + 1);
     // test apply()
     {
       ht.XmlTagNode node =
           HtmlFactory.tagNode("div", [HtmlFactory.attribute("class", "one two")]);
-      JUnitTestCase.assertFalse(classSelector.apply(node));
+      expect(classSelector.apply(node), isFalse);
     }
     {
       ht.XmlTagNode node = HtmlFactory.tagNode(
           "div",
           [HtmlFactory.attribute("class", "one my-class two")]);
-      JUnitTestCase.assertTrue(classSelector.apply(node));
+      expect(classSelector.apply(node), isTrue);
     }
   }
 
@@ -1352,7 +1319,7 @@
     AngularSelectorElement selector =
         AngularCompilationUnitBuilder.parseSelector(42, "name");
     _assertIsTagSelector(selector, "name");
-    JUnitTestCase.assertEquals(42, selector.nameOffset);
+    expect(selector.nameOffset, 42);
   }
 
   void test_parseSelector_isTag_hasAttribute() {
@@ -1362,71 +1329,62 @@
         (obj) => obj is IsTagHasAttributeSelectorElementImpl,
         IsTagHasAttributeSelectorElementImpl,
         selector);
-    JUnitTestCase.assertEquals("tag[attr]", selector.name);
-    JUnitTestCase.assertEquals(-1, selector.nameOffset);
-    JUnitTestCase.assertEquals(
-        "tag",
-        (selector as IsTagHasAttributeSelectorElementImpl).tagName);
-    JUnitTestCase.assertEquals(
-        "attr",
-        (selector as IsTagHasAttributeSelectorElementImpl).attributeName);
+    expect(selector.name, "tag[attr]");
+    expect(selector.nameOffset, -1);
+    expect((selector as IsTagHasAttributeSelectorElementImpl).tagName, "tag");
+    expect((selector as IsTagHasAttributeSelectorElementImpl).attributeName, "attr");
   }
 
   void test_parseSelector_unknown() {
     AngularSelectorElement selector =
         AngularCompilationUnitBuilder.parseSelector(0, "~unknown");
-    JUnitTestCase.assertNull(selector);
+    expect(selector, isNull);
   }
 
   void test_view() {
     contextHelper.addSource("/wrong.html", "");
     contextHelper.addSource("/my_templateA.html", "");
     contextHelper.addSource("/my_templateB.html", "");
-    String mainContent = _createAngularSource(
-        [
-            "class MyRouteInitializer {",
-            "  init(ViewFactory view, foo) {",
-            "    foo.view('wrong.html');   // has target",
-            "    foo();                    // less than one argument",
-            "    foo('wrong.html', 'bar'); // more than one argument",
-            "    foo('wrong' + '.html');   // not literal",
-            "    foo('wrong.html');        // not ViewFactory",
-            "    view('my_templateA.html');",
-            "    view('my_templateB.html');",
-            "  }",
-            "}"]);
+    String mainContent = _createAngularSource(r'''
+class MyRouteInitializer {
+  init(ViewFactory view, foo) {
+    foo.view('wrong.html');   // has target
+    foo();                    // less than one argument
+    foo('wrong.html', 'bar'); // more than one argument
+    foo('wrong' + '.html');   // not literal
+    foo('wrong.html');        // not ViewFactory
+    view('my_templateA.html');
+    view('my_templateB.html');
+  }
+}''');
     resolveMainSourceNoErrors(mainContent);
     // prepare AngularViewElement(s)
     List<AngularViewElement> views = mainUnitElement.angularViews;
-    EngineTestCase.assertLength(2, views);
+    expect(views, hasLength(2));
     {
       AngularViewElement view = views[0];
-      JUnitTestCase.assertEquals("my_templateA.html", view.templateUri);
-      JUnitTestCase.assertEquals(null, view.name);
-      JUnitTestCase.assertEquals(-1, view.nameOffset);
-      JUnitTestCase.assertEquals(
-          AngularTest.findOffset(mainContent, "my_templateA.html'"),
-          view.templateUriOffset);
+      expect(view.templateUri, "my_templateA.html");
+      expect(view.name, null);
+      expect(view.nameOffset, -1);
+      expect(view.templateUriOffset, AngularTest.findOffset(mainContent, "my_templateA.html'"));
     }
     {
       AngularViewElement view = views[1];
-      JUnitTestCase.assertEquals("my_templateB.html", view.templateUri);
-      JUnitTestCase.assertEquals(null, view.name);
-      JUnitTestCase.assertEquals(-1, view.nameOffset);
-      JUnitTestCase.assertEquals(
-          AngularTest.findOffset(mainContent, "my_templateB.html'"),
-          view.templateUriOffset);
+      expect(view.templateUri, "my_templateB.html");
+      expect(view.name, null);
+      expect(view.nameOffset, -1);
+      expect(view.templateUriOffset, AngularTest.findOffset(mainContent, "my_templateB.html'"));
     }
   }
 
   void _assertProperty(AngularPropertyElement property, String expectedName,
       int expectedNameOffset, AngularPropertyKind expectedKind,
       String expectedFieldName, int expectedFieldOffset) {
-    JUnitTestCase.assertEquals(expectedName, property.name);
-    JUnitTestCase.assertEquals(expectedNameOffset, property.nameOffset);
-    JUnitTestCase.assertSame(expectedKind, property.propertyKind);
-    JUnitTestCase.assertEquals(expectedFieldName, property.field.name);
-    JUnitTestCase.assertEquals(expectedFieldOffset, property.fieldNameOffset);
+    expect(property.name, expectedName);
+    expect(property.nameOffset, expectedNameOffset);
+    expect(property.propertyKind, same(expectedKind));
+    expect(property.field.name, expectedFieldName);
+    expect(property.fieldNameOffset, expectedFieldOffset);
   }
 
   /**
@@ -1463,9 +1421,7 @@
         (obj) => obj is HasAttributeSelectorElementImpl,
         HasAttributeSelectorElementImpl,
         selector);
-    JUnitTestCase.assertEquals(
-        name,
-        (selector as HasAttributeSelectorElementImpl).name);
+    expect((selector as HasAttributeSelectorElementImpl).name, name);
   }
 
   static void _assertIsTagSelector(AngularSelectorElement selector,
@@ -1474,41 +1430,36 @@
         (obj) => obj is AngularTagSelectorElementImpl,
         AngularTagSelectorElementImpl,
         selector);
-    JUnitTestCase.assertEquals(
-        name,
-        (selector as AngularTagSelectorElementImpl).name);
+    expect((selector as AngularTagSelectorElementImpl).name, name);
   }
 
-  static String _createAngularSource(List<String> lines) {
-    String source = "import 'angular.dart';\n";
-    source += EngineTestCase.createSource(lines);
-    return source;
+  static String _createAngularSource(String code) {
+    return "import 'angular.dart';\n" + code;
   }
 }
 
 
 class AngularHtmlUnitResolverTest extends AngularTest {
   void test_NgComponent_resolveTemplateFile() {
-    addMainSource(
-        EngineTestCase.createSource(
-            [
-                "",
-                "import 'angular.dart';",
-                "",
-                "@Component(",
-                "    templateUrl: 'my_template.html', cssUrl: 'my_styles.css',",
-                "    publishAs: 'ctrl',",
-                "    selector: 'myComponent')",
-                "class MyComponent {",
-                "  String field;",
-                "}"]));
+    addMainSource(r'''
+import 'angular.dart';
+
+@Component(
+    templateUrl: 'my_template.html', cssUrl: 'my_styles.css',
+    publishAs: 'ctrl',
+    selector: 'myComponent')
+class MyComponent {
+  String field;
+}''');
     contextHelper.addSource(
         "/entry-point.html",
-        AngularTest.createHtmlWithAngular([]));
+        AngularTest.createHtmlWithAngular(''));
     addIndexSource2(
         "/my_template.html",
-        EngineTestCase.createSource(
-            ["    <div>", "      {{ctrl.field}}", "    </div>"]));
+        r'''
+<div>
+  {{ctrl.field}}
+</div>''');
     contextHelper.addSource("/my_styles.css", "");
     contextHelper.runTasks();
     resolveIndex();
@@ -1520,29 +1471,30 @@
   void test_NgComponent_updateDartFile() {
     Source componentSource = contextHelper.addSource(
         "/my_component.dart",
-        EngineTestCase.createSource(
-            [
-                "library my.component;",
-                "import 'angular.dart';",
-                "@Component(selector: 'myComponent')",
-                "class MyComponent {",
-                "}"]));
+        r'''
+library my.component;
+import 'angular.dart';
+@Component(selector: 'myComponent')
+class MyComponent {
+}''');
     contextHelper.addSource(
         "/my_module.dart",
-        EngineTestCase.createSource(
-            ["library my.module;", "import 'my_component.dart';"]));
-    addMainSource(
-        EngineTestCase.createSource(["library main;", "import 'my_module.dart';"]));
+        r'''
+library my.module;
+import 'my_component.dart';''');
+    addMainSource(r'''
+library main;
+import 'my_module.dart';''');
     _resolveIndexNoErrors(
-        AngularTest.createHtmlWithMyController(["<myComponent/>"]));
+        AngularTest.createHtmlWithMyController("<myComponent/>"));
     // "myComponent" tag was resolved
     {
       ht.XmlTagNode tagNode =
           ht.HtmlUnitUtils.getTagNode(indexUnit, findOffset2("myComponent"));
       AngularSelectorElement tagElement =
           tagNode.element as AngularSelectorElement;
-      JUnitTestCase.assertNotNull(tagElement);
-      JUnitTestCase.assertEquals("myComponent", tagElement.name);
+      expect(tagElement, isNotNull);
+      expect(tagElement.name, "myComponent");
     }
     // replace "myComponent" with "myComponent2"
     // in my_component.dart and index.html
@@ -1562,116 +1514,110 @@
           ht.HtmlUnitUtils.getTagNode(indexUnit, findOffset2("myComponent2"));
       AngularSelectorElement tagElement =
           tagNode.element as AngularSelectorElement;
-      JUnitTestCase.assertNotNull(tagElement);
-      JUnitTestCase.assertEquals("myComponent2", tagElement.name);
+      expect(tagElement, isNotNull);
+      expect(tagElement.name, "myComponent2");
     }
   }
 
   void test_NgComponent_use_resolveAttributes() {
     contextHelper.addSource(
         "/my_template.html",
-        EngineTestCase.createSource(
-            ["    <div>", "      {{ctrl.field}}", "    </div>"]));
-    addMainSource(
-        EngineTestCase.createSource(
-            [
-                "",
-                "import 'angular.dart';",
-                "",
-                "@Component(",
-                "    templateUrl: 'my_template.html', cssUrl: 'my_styles.css',",
-                "    publishAs: 'ctrl',",
-                "    selector: 'myComponent', // selector",
-                "    map: const {'attrA' : '=>setA', 'attrB' : '@setB'})",
-                "class MyComponent {",
-                "  set setA(value) {}",
-                "  set setB(value) {}",
-                "}"]));
+        r'''
+    <div>
+      {{ctrl.field}}
+    </div>''');
+    addMainSource(r'''
+
+import 'angular.dart';
+
+@Component(
+    templateUrl: 'my_template.html', cssUrl: 'my_styles.css',
+    publishAs: 'ctrl',
+    selector: 'myComponent', // selector
+    map: const {'attrA' : '=>setA', 'attrB' : '@setB'})
+class MyComponent {
+  set setA(value) {}
+  set setB(value) {}
+}''');
     _resolveIndexNoErrors(
-        AngularTest.createHtmlWithMyController(
-            [
-                "<input type='text' ng-model='someModel'/>",
-                "<myComponent attrA='someModel' attrB='bbb'/>"]));
+        AngularTest.createHtmlWithMyController(r'''
+<input type='text' ng-model='someModel'/>
+<myComponent attrA='someModel' attrB='bbb'/>'''));
     // "attrA" attribute expression was resolved
-    JUnitTestCase.assertNotNull(findIdentifier("someModel"));
+    expect(findIdentifier("someModel"), isNotNull);
     // "myComponent" tag was resolved
     ht.XmlTagNode tagNode =
         ht.HtmlUnitUtils.getTagNode(indexUnit, findOffset2("myComponent"));
     AngularSelectorElement tagElement =
         tagNode.element as AngularSelectorElement;
-    JUnitTestCase.assertNotNull(tagElement);
-    JUnitTestCase.assertEquals("myComponent", tagElement.name);
-    JUnitTestCase.assertEquals(
-        findMainOffset("myComponent', // selector"),
-        tagElement.nameOffset);
+    expect(tagElement, isNotNull);
+    expect(tagElement.name, "myComponent");
+    expect(tagElement.nameOffset, findMainOffset("myComponent', // selector"));
     // "attrA" attribute was resolved
     {
       ht.XmlAttributeNode node =
           ht.HtmlUnitUtils.getAttributeNode(indexUnit, findOffset2("attrA='"));
       AngularPropertyElement element = node.element as AngularPropertyElement;
-      JUnitTestCase.assertNotNull(element);
-      JUnitTestCase.assertEquals("attrA", element.name);
-      JUnitTestCase.assertEquals("setA", element.field.name);
+      expect(element, isNotNull);
+      expect(element.name, "attrA");
+      expect(element.field.name, "setA");
     }
     // "attrB" attribute was resolved, even if it @binding
     {
       ht.XmlAttributeNode node =
           ht.HtmlUnitUtils.getAttributeNode(indexUnit, findOffset2("attrB='"));
       AngularPropertyElement element = node.element as AngularPropertyElement;
-      JUnitTestCase.assertNotNull(element);
-      JUnitTestCase.assertEquals("attrB", element.name);
-      JUnitTestCase.assertEquals("setB", element.field.name);
+      expect(element, isNotNull);
+      expect(element.name, "attrB");
+      expect(element.field.name, "setB");
     }
   }
 
   void test_NgDirective_noAttribute() {
-    addMainSource(
-        EngineTestCase.createSource(
-            [
-                "",
-                "import 'angular.dart';",
-                "",
-                "@NgDirective(selector: '[my-directive]', map: const {'foo': '=>input'})",
-                "class MyDirective {",
-                "  set input(value) {}",
-                "}"]));
+    addMainSource(r'''
+
+import 'angular.dart';
+
+@NgDirective(selector: '[my-directive]', map: const {'foo': '=>input'})
+class MyDirective {
+  set input(value) {}
+}''');
     _resolveIndexNoErrors(
-        AngularTest.createHtmlWithMyController(["<div my-directive>", "</div>"]));
+        AngularTest.createHtmlWithMyController(r'''
+<div my-directive>
+</div>'''));
   }
 
   void test_NgDirective_noExpression() {
-    addMainSource(
-        EngineTestCase.createSource(
-            [
-                "",
-                "import 'angular.dart';",
-                "",
-                "@NgDirective(selector: '[my-directive]', map: const {'.': '=>input'})",
-                "class MyDirective {",
-                "  set input(value) {}",
-                "}"]));
+    addMainSource(r'''
+
+import 'angular.dart';
+
+@NgDirective(selector: '[my-directive]', map: const {'.': '=>input'})
+class MyDirective {
+  set input(value) {}
+}''');
     _resolveIndexNoErrors(
-        AngularTest.createHtmlWithMyController(["<div my-directive>", "</div>"]));
+        AngularTest.createHtmlWithMyController(r'''
+<div my-directive>
+</div>'''));
   }
 
   void test_NgDirective_resolvedExpression() {
-    addMainSource(
-        EngineTestCase.createSource(
-            [
-                "",
-                "import 'angular.dart';",
-                "",
-                "@Decorator(selector: '[my-directive]')",
-                "class MyDirective {",
-                "  @NgOneWay('my-property')",
-                "  String condition;",
-                "}"]));
+    addMainSource(r'''
+
+import 'angular.dart';
+
+@Decorator(selector: '[my-directive]')
+class MyDirective {
+  @NgOneWay('my-property')
+  String condition;
+}''');
     _resolveIndexNoErrors(
-        AngularTest.createHtmlWithMyController(
-            [
-                "<input type='text' ng-model='name'>",
-                "<div my-directive my-property='name != null'>",
-                "</div>"]));
+        AngularTest.createHtmlWithMyController(r'''
+<input type='text' ng-model='name'>
+<div my-directive my-property='name != null'>
+</div>'''));
     resolveMainNoErrors();
     // "my-directive" attribute was resolved
     {
@@ -1679,8 +1625,8 @@
           findMainElement(ElementKind.ANGULAR_SELECTOR, "my-directive");
       ht.XmlAttributeNode attrNodeSelector =
           ht.HtmlUnitUtils.getAttributeNode(indexUnit, findOffset2("my-directive"));
-      JUnitTestCase.assertNotNull(attrNodeSelector);
-      JUnitTestCase.assertSame(selector, attrNodeSelector.element);
+      expect(attrNodeSelector, isNotNull);
+      expect(attrNodeSelector.element, same(selector));
     }
     // "my-property" attribute was resolved
     {
@@ -1688,189 +1634,177 @@
           ht.HtmlUnitUtils.getAttributeNode(indexUnit, findOffset2("my-property='"));
       AngularPropertyElement propertyElement =
           attrNodeProperty.element as AngularPropertyElement;
-      JUnitTestCase.assertNotNull(propertyElement);
-      JUnitTestCase.assertSame(
-          AngularPropertyKind.ONE_WAY,
-          propertyElement.propertyKind);
-      JUnitTestCase.assertEquals("condition", propertyElement.field.name);
+      expect(propertyElement, isNotNull);
+      expect(propertyElement.propertyKind, same(AngularPropertyKind.ONE_WAY));
+      expect(propertyElement.field.name, "condition");
     }
     // "name" expression was resolved
-    JUnitTestCase.assertNotNull(findIdentifier("name != null"));
+    expect(findIdentifier("name != null"), isNotNull);
   }
 
   void test_NgDirective_resolvedExpression_attrString() {
-    addMainSource(
-        EngineTestCase.createSource(
-            [
-                "",
-                "import 'angular.dart';",
-                "",
-                "@NgDirective(selector: '[my-directive])",
-                "class MyDirective {",
-                "  @NgAttr('my-property')",
-                "  String property;",
-                "}"]));
+    addMainSource(r'''
+
+import 'angular.dart';
+
+@NgDirective(selector: '[my-directive])
+class MyDirective {
+  @NgAttr('my-property')
+  String property;
+}''');
     _resolveIndexNoErrors(
-        AngularTest.createHtmlWithMyController(
-            [
-                "<input type='text' ng-model='name'>",
-                "<div my-directive my-property='name != null'>",
-                "</div>"]));
+        AngularTest.createHtmlWithMyController(r'''
+<input type='text' ng-model='name'>
+<div my-directive my-property='name != null'>
+</div>'''));
     resolveMain();
     // @NgAttr means "string attribute", which we don't parse
-    JUnitTestCase.assertNull(findIdentifierMaybe("name != null"));
+    expect(findIdentifierMaybe("name != null"), isNull);
   }
 
   void test_NgDirective_resolvedExpression_dotAsName() {
-    addMainSource(
-        EngineTestCase.createSource(
-            [
-                "",
-                "import 'angular.dart';",
-                "",
-                "@Decorator(",
-                "    selector: '[my-directive]',",
-                "    map: const {'.' : '=>condition'})",
-                "class MyDirective {",
-                "  set condition(value) {}",
-                "}"]));
+    addMainSource(r'''
+
+import 'angular.dart';
+
+@Decorator(
+    selector: '[my-directive]',
+    map: const {'.' : '=>condition'})
+class MyDirective {
+  set condition(value) {}
+}''');
     _resolveIndexNoErrors(
-        AngularTest.createHtmlWithMyController(
-            [
-                "<input type='text' ng-model='name'>",
-                "<div my-directive='name != null'>",
-                "</div>"]));
+        AngularTest.createHtmlWithMyController(r'''
+<input type='text' ng-model='name'>
+<div my-directive='name != null'>
+</div>'''));
     // "name" attribute was resolved
-    JUnitTestCase.assertNotNull(findIdentifier("name != null"));
+    expect(findIdentifier("name != null"), isNotNull);
   }
 
   void fail_analysisContext_changeDart_invalidateApplication() {
-    addMainSource(
-        EngineTestCase.createSource(
-            [
-                "",
-                "import 'angular.dart';",
-                "",
-                "@Component(",
-                "    templateUrl: 'my_template.html', cssUrl: 'my_styles.css',",
-                "    publishAs: 'ctrl',",
-                "    selector: 'myComponent')",
-                "class MyComponent {",
-                "}"]));
+    addMainSource(r'''
+
+import 'angular.dart';
+
+@Component(
+    templateUrl: 'my_template.html', cssUrl: 'my_styles.css',
+    publishAs: 'ctrl',
+    selector: 'myComponent')
+class MyComponent {
+}''');
     contextHelper.addSource(
         "/entry-point.html",
-        AngularTest.createHtmlWithAngular([]));
+        AngularTest.createHtmlWithAngular(''));
     addIndexSource2(
         "/my_template.html",
-        EngineTestCase.createSource(
-            ["    <div>", "      {{ctrl.noMethod()}}", "    </div>"]));
+        r'''
+<div>
+  {{ctrl.noMethod()}}
+</div>''');
     contextHelper.addSource("/my_styles.css", "");
     contextHelper.runTasks();
     // there are some errors in my_template.html
     {
       List<AnalysisError> errors = context.getErrors(indexSource).errors;
-      JUnitTestCase.assertTrue(errors.length != 0);
+      expect(errors.length != 0, isTrue);
     }
     // change main.dart, there are no MyComponent anymore
     context.setContents(mainSource, "");
     // ...errors in my_template.html should be removed
     {
       List<AnalysisError> errors = context.getErrors(indexSource).errors;
-      _ut.expect(errors, _ut.isEmpty);
-      JUnitTestCase.assertTrue(errors.length == 0);
+      expect(errors, isEmpty);
+      expect(errors.length == 0, isTrue);
     }
   }
 
   void test_analysisContext_changeEntryPoint_clearAngularErrors_inDart() {
-    addMainSource(
-        EngineTestCase.createSource(
-            [
-                "",
-                "import 'angular.dart';",
-                "",
-                "@Component(",
-                "    templateUrl: 'no-such-template.html', cssUrl: 'my_styles.css',",
-                "    publishAs: 'ctrl',",
-                "    selector: 'myComponent')",
-                "class MyComponent {",
-                "}"]));
+    addMainSource(r'''
+
+import 'angular.dart';
+
+@Component(
+    templateUrl: 'no-such-template.html', cssUrl: 'my_styles.css',
+    publishAs: 'ctrl',
+    selector: 'myComponent')
+class MyComponent {
+}''');
     Source entrySource = contextHelper.addSource(
         "/entry-point.html",
-        AngularTest.createHtmlWithAngular([]));
+        AngularTest.createHtmlWithAngular(''));
     contextHelper.addSource("/my_styles.css", "");
     contextHelper.runTasks();
     // there are some errors in MyComponent
     {
       List<AnalysisError> errors = context.getErrors(mainSource).errors;
-      JUnitTestCase.assertTrue(errors.length != 0);
+      expect(errors.length != 0, isTrue);
     }
     // make entry-point.html non-Angular
     context.setContents(entrySource, "<html/>");
     // ...errors in MyComponent should be removed
     {
       List<AnalysisError> errors = context.getErrors(mainSource).errors;
-      JUnitTestCase.assertTrue(errors.length == 0);
+      expect(errors.length == 0, isTrue);
     }
   }
 
   void test_analysisContext_changeEntryPoint_clearAngularErrors_inTemplate() {
-    addMainSource(
-        EngineTestCase.createSource(
-            [
-                "",
-                "import 'angular.dart';",
-                "",
-                "@Component(",
-                "    templateUrl: 'my_template.html', cssUrl: 'my_styles.css',",
-                "    publishAs: 'ctrl',",
-                "    selector: 'myComponent')",
-                "class MyComponent {",
-                "}"]));
+    addMainSource(r'''
+
+import 'angular.dart';
+
+@Component(
+    templateUrl: 'my_template.html', cssUrl: 'my_styles.css',
+    publishAs: 'ctrl',
+    selector: 'myComponent')
+class MyComponent {
+}''');
     Source entrySource = contextHelper.addSource(
         "/entry-point.html",
-        AngularTest.createHtmlWithAngular([]));
+        AngularTest.createHtmlWithAngular(''));
     addIndexSource2(
         "/my_template.html",
-        EngineTestCase.createSource(
-            ["    <div>", "      {{ctrl.noMethod()}}", "    </div>"]));
+        r'''
+<div>
+  {{ctrl.noMethod()}}
+</div>''');
     contextHelper.addSource("/my_styles.css", "");
     contextHelper.runTasks();
     // there are some errors in my_template.html
     {
       List<AnalysisError> errors = context.getErrors(indexSource).errors;
-      JUnitTestCase.assertTrue(errors.length != 0);
+      expect(errors.length != 0, isTrue);
     }
     // make entry-point.html non-Angular
     context.setContents(entrySource, "<html/>");
     // ...errors in my_template.html should be removed
     {
       List<AnalysisError> errors = context.getErrors(indexSource).errors;
-      JUnitTestCase.assertTrue(errors.length == 0);
+      expect(errors.length == 0, isTrue);
     }
   }
 
   void test_analysisContext_removeEntryPoint_clearAngularErrors_inDart() {
-    addMainSource(
-        EngineTestCase.createSource(
-            [
-                "",
-                "import 'angular.dart';",
-                "",
-                "@Component(",
-                "    templateUrl: 'no-such-template.html', cssUrl: 'my_styles.css',",
-                "    publishAs: 'ctrl',",
-                "    selector: 'myComponent')",
-                "class MyComponent {",
-                "}"]));
+    addMainSource(r'''
+
+import 'angular.dart';
+
+@Component(
+    templateUrl: 'no-such-template.html', cssUrl: 'my_styles.css',
+    publishAs: 'ctrl',
+    selector: 'myComponent')
+class MyComponent {
+}''');
     Source entrySource = contextHelper.addSource(
         "/entry-point.html",
-        AngularTest.createHtmlWithAngular([]));
+        AngularTest.createHtmlWithAngular(''));
     contextHelper.addSource("/my_styles.css", "");
     contextHelper.runTasks();
     // there are some errors in MyComponent
     {
       List<AnalysisError> errors = context.getErrors(mainSource).errors;
-      JUnitTestCase.assertTrue(errors.length != 0);
+      expect(errors.length != 0, isTrue);
     }
     // remove entry-point.html
     {
@@ -1881,15 +1815,19 @@
     // ...errors in MyComponent should be removed
     {
       List<AnalysisError> errors = context.getErrors(mainSource).errors;
-      JUnitTestCase.assertTrue(errors.length == 0);
+      expect(errors.length == 0, isTrue);
     }
   }
 
   void test_contextProperties() {
     addMyController();
     _resolveIndexNoErrors(
-        AngularTest.createHtmlWithAngular(
-            ["<div>", "  {{\$id}}", "  {{\$parent}}", "  {{\$root}}", "</div>"]));
+        AngularTest.createHtmlWithAngular(r'''
+<div>
+  {{$id}}
+  {{$parent}}
+  {{$root}}
+</div>'''));
     assertResolvedIdentifier("\$id");
     assertResolvedIdentifier("\$parent");
     assertResolvedIdentifier("\$root");
@@ -1907,21 +1845,17 @@
     // set AngularElement
     AngularElement angularElement = new AngularControllerElementImpl("ctrl", 0);
     local.toolkitObjects = <AngularElement>[angularElement];
-    JUnitTestCase.assertSame(
-        angularElement,
-        AngularHtmlUnitResolver.getAngularElement(local));
+    expect(AngularHtmlUnitResolver.getAngularElement(local), same(angularElement));
   }
 
   void test_getAngularElement_notAngular() {
     Element element = ElementFactory.localVariableElement2("name");
-    JUnitTestCase.assertNull(
-        AngularHtmlUnitResolver.getAngularElement(element));
+    expect(AngularHtmlUnitResolver.getAngularElement(element), isNull);
   }
 
   void test_getAngularElement_notLocal() {
     Element element = ElementFactory.classElement2("Test", []);
-    JUnitTestCase.assertNull(
-        AngularHtmlUnitResolver.getAngularElement(element));
+    expect(AngularHtmlUnitResolver.getAngularElement(element), isNull);
   }
 
   /**
@@ -1930,8 +1864,7 @@
   void test_ngClick() {
     addMyController();
     _resolveIndexNoErrors(
-        AngularTest.createHtmlWithMyController(
-            ["<button ng-click='ctrl.doSomething(\$event)'/>"]));
+        AngularTest.createHtmlWithMyController(r"<button ng-click='ctrl.doSomething($event)'/>"));
     assertResolvedIdentifier("doSomething");
   }
 
@@ -1941,15 +1874,16 @@
   void test_ngIf() {
     addMyController();
     _resolveIndexNoErrors(
-        AngularTest.createHtmlWithMyController(["<div ng-if='ctrl.field != null'/>"]));
+        AngularTest.createHtmlWithMyController("<div ng-if='ctrl.field != null'/>"));
     assertResolvedIdentifier("field");
   }
 
   void test_ngModel_modelAfterUsage() {
     addMyController();
     _resolveIndexNoErrors(
-        AngularTest.createHtmlWithMyController(
-            ["<h3>Hello {{name}}!</h3>", "<input type='text' ng-model='name'>"]));
+        AngularTest.createHtmlWithMyController(r'''
+<h3>Hello {{name}}!</h3>
+<input type='text' ng-model='name'>'''));
     assertResolvedIdentifier2("name}}!", "String");
     assertResolvedIdentifier2("name'>", "String");
   }
@@ -1957,19 +1891,19 @@
   void test_ngModel_modelBeforeUsage() {
     addMyController();
     _resolveIndexNoErrors(
-        AngularTest.createHtmlWithMyController(
-            ["<input type='text' ng-model='name'>", "<h3>Hello {{name}}!</h3>"]));
+        AngularTest.createHtmlWithMyController(r'''
+<input type='text' ng-model='name'>
+<h3>Hello {{name}}!</h3>'''));
     assertResolvedIdentifier2("name}}!", "String");
     Element element = assertResolvedIdentifier2("name'>", "String");
-    JUnitTestCase.assertEquals("name", element.name);
-    JUnitTestCase.assertEquals(findOffset2("name'>"), element.nameOffset);
+    expect(element.name, "name");
+    expect(element.nameOffset, findOffset2("name'>"));
   }
 
   void test_ngModel_notIdentifier() {
     addMyController();
     _resolveIndexNoErrors(
-        AngularTest.createHtmlWithMyController(
-            ["<input type='text' ng-model='ctrl.field'>"]));
+        AngularTest.createHtmlWithMyController("<input type='text' ng-model='ctrl.field'>"));
     assertResolvedIdentifier2("field'>", "String");
   }
 
@@ -1979,19 +1913,17 @@
   void test_ngMouseOut() {
     addMyController();
     _resolveIndexNoErrors(
-        AngularTest.createHtmlWithMyController(
-            ["<button ng-mouseout='ctrl.doSomething(\$event)'/>"]));
+        AngularTest.createHtmlWithMyController(r"<button ng-mouseout='ctrl.doSomething($event)'/>"));
     assertResolvedIdentifier("doSomething");
   }
 
   void fail_ngRepeat_additionalVariables() {
     addMyController();
     _resolveIndexNoErrors(
-        AngularTest.createHtmlWithMyController(
-            [
-                "<li ng-repeat='name in ctrl.names'>",
-                "  {{\$index}} {{\$first}} {{\$middle}} {{\$last}} {{\$even}} {{\$odd}}",
-                "</li>"]));
+        AngularTest.createHtmlWithMyController(r'''
+<li ng-repeat='name in ctrl.names'>
+  {{$index}} {{$first}} {{$middle}} {{$last}} {{$even}} {{$odd}}
+</li>'''));
     assertResolvedIdentifier2("\$index", "int");
     assertResolvedIdentifier2("\$first", "bool");
     assertResolvedIdentifier2("\$middle", "bool");
@@ -2003,24 +1935,27 @@
   void fail_ngRepeat_bad_expectedIdentifier() {
     addMyController();
     resolveIndex2(
-        AngularTest.createHtmlWithMyController(
-            ["<li ng-repeat='name + 42 in ctrl.names'>", "</li>"]));
+        AngularTest.createHtmlWithMyController(r'''
+<li ng-repeat='name + 42 in ctrl.names'>
+</li>'''));
     assertErrors(indexSource, [AngularCode.INVALID_REPEAT_ITEM_SYNTAX]);
   }
 
   void fail_ngRepeat_bad_expectedIn() {
     addMyController();
     resolveIndex2(
-        AngularTest.createHtmlWithMyController(
-            ["<li ng-repeat='name : ctrl.names'>", "</li>"]));
+        AngularTest.createHtmlWithMyController(r'''
+<li ng-repeat='name : ctrl.names'>
+</li>'''));
     assertErrors(indexSource, [AngularCode.INVALID_REPEAT_SYNTAX]);
   }
 
   void fail_ngRepeat_filters_filter_literal() {
     addMyController();
     _resolveIndexNoErrors(
-        AngularTest.createHtmlWithMyController(
-            ["<li ng-repeat='item in ctrl.items | filter:42:null'/>", "</li>"]));
+        AngularTest.createHtmlWithMyController(r'''
+<li ng-repeat='item in ctrl.items | filter:42:null'/>
+</li>'''));
     // filter "filter" is resolved
     Element filterElement = assertResolvedIdentifier("filter");
     EngineTestCase.assertInstanceOf(
@@ -2032,10 +1967,9 @@
   void fail_ngRepeat_filters_filter_propertyMap() {
     addMyController();
     _resolveIndexNoErrors(
-        AngularTest.createHtmlWithMyController(
-            [
-                "<li ng-repeat='item in ctrl.items | filter:{name:null, done:false}'/>",
-                "</li>"]));
+        AngularTest.createHtmlWithMyController(r'''
+<li ng-repeat='item in ctrl.items | filter:{name:null, done:false}'/>
+</li>'''));
     assertResolvedIdentifier2("name:", "String");
     assertResolvedIdentifier2("done:", "bool");
   }
@@ -2043,16 +1977,18 @@
   void fail_ngRepeat_filters_missingColon() {
     addMyController();
     resolveIndex2(
-        AngularTest.createHtmlWithMyController(
-            ["<li ng-repeat=\"item in ctrl.items | orderBy:'' true\"/>", "</li>"]));
+        AngularTest.createHtmlWithMyController(r'''
+<li ng-repeat="item in ctrl.items | orderBy:'' true"/>
+</li>'''));
     assertErrors(indexSource, [AngularCode.MISSING_FORMATTER_COLON]);
   }
 
   void fail_ngRepeat_filters_noArgs() {
     addMyController();
     _resolveIndexNoErrors(
-        AngularTest.createHtmlWithMyController(
-            ["<li ng-repeat=\"item in ctrl.items | orderBy\"/>", "</li>"]));
+        AngularTest.createHtmlWithMyController(r'''
+<li ng-repeat="item in ctrl.items | orderBy"/>
+</li>'''));
     // filter "orderBy" is resolved
     Element filterElement = assertResolvedIdentifier("orderBy");
     EngineTestCase.assertInstanceOf(
@@ -2064,8 +2000,9 @@
   void fail_ngRepeat_filters_orderBy_emptyString() {
     addMyController();
     _resolveIndexNoErrors(
-        AngularTest.createHtmlWithMyController(
-            ["<li ng-repeat=\"item in ctrl.items | orderBy:'':true\"/>", "</li>"]));
+        AngularTest.createHtmlWithMyController(r'''
+<li ng-repeat="item in ctrl.items | orderBy:'':true"/>
+</li>'''));
     // filter "orderBy" is resolved
     Element filterElement = assertResolvedIdentifier("orderBy");
     EngineTestCase.assertInstanceOf(
@@ -2077,10 +2014,9 @@
   void fail_ngRepeat_filters_orderBy_propertyList() {
     addMyController();
     _resolveIndexNoErrors(
-        AngularTest.createHtmlWithMyController(
-            [
-                "<li ng-repeat=\"item in ctrl.items | orderBy:['name', 'done']\"/>",
-                "</li>"]));
+        AngularTest.createHtmlWithMyController(r'''
+<li ng-repeat="item in ctrl.items | orderBy:['name', 'done']"/>
+</li>'''));
     assertResolvedIdentifier2("name'", "String");
     assertResolvedIdentifier2("done'", "bool");
   }
@@ -2088,42 +2024,45 @@
   void fail_ngRepeat_filters_orderBy_propertyName() {
     addMyController();
     _resolveIndexNoErrors(
-        AngularTest.createHtmlWithMyController(
-            ["<li ng-repeat=\"item in ctrl.items | orderBy:'name'\"/>", "</li>"]));
+        AngularTest.createHtmlWithMyController(r'''
+<li ng-repeat="item in ctrl.items | orderBy:'name'"/>
+</li>'''));
     assertResolvedIdentifier2("name'", "String");
   }
 
   void fail_ngRepeat_filters_orderBy_propertyName_minus() {
     addMyController();
     _resolveIndexNoErrors(
-        AngularTest.createHtmlWithMyController(
-            ["<li ng-repeat=\"item in ctrl.items | orderBy:'-name'\"/>", "</li>"]));
+        AngularTest.createHtmlWithMyController(r'''
+<li ng-repeat="item in ctrl.items | orderBy:'-name'"/>
+</li>'''));
     assertResolvedIdentifier2("name'", "String");
   }
 
   void fail_ngRepeat_filters_orderBy_propertyName_plus() {
     addMyController();
     _resolveIndexNoErrors(
-        AngularTest.createHtmlWithMyController(
-            ["<li ng-repeat=\"item in ctrl.items | orderBy:'+name'\"/>", "</li>"]));
+        AngularTest.createHtmlWithMyController(r'''
+<li ng-repeat="item in ctrl.items | orderBy:'+name'"/>
+</li>'''));
     assertResolvedIdentifier2("name'", "String");
   }
 
   void fail_ngRepeat_filters_orderBy_propertyName_untypedItems() {
     addMyController();
     _resolveIndexNoErrors(
-        AngularTest.createHtmlWithMyController(
-            ["<li ng-repeat=\"item in ctrl.untypedItems | orderBy:'name'\"/>", "</li>"]));
+        AngularTest.createHtmlWithMyController(r'''
+<li ng-repeat="item in ctrl.untypedItems | orderBy:'name'"/>
+</li>'''));
     assertResolvedIdentifier2("name'", "dynamic");
   }
 
   void fail_ngRepeat_filters_two() {
     addMyController();
     _resolveIndexNoErrors(
-        AngularTest.createHtmlWithMyController(
-            [
-                "<li ng-repeat=\"item in ctrl.items | orderBy:'+' | orderBy:'-'\"/>",
-                "</li>"]));
+        AngularTest.createHtmlWithMyController(r'''
+<li ng-repeat="item in ctrl.items | orderBy:'+' | orderBy:'-'"/>
+</li>'''));
     EngineTestCase.assertInstanceOf(
         (obj) => obj is AngularFormatterElement,
         AngularFormatterElement,
@@ -2137,8 +2076,10 @@
   void fail_ngRepeat_resolvedExpressions() {
     addMyController();
     _resolveIndexNoErrors(
-        AngularTest.createHtmlWithMyController(
-            ["<li ng-repeat='name in ctrl.names'>", "  {{name}}", "</li>"]));
+        AngularTest.createHtmlWithMyController(r'''
+<li ng-repeat='name in ctrl.names'>
+  {{name}}
+</li>'''));
     assertResolvedIdentifier2("name in", "String");
     assertResolvedIdentifier2("ctrl.", "MyController");
     assertResolvedIdentifier2("names'", "List<String>");
@@ -2148,8 +2089,9 @@
   void fail_ngRepeat_trackBy() {
     addMyController();
     _resolveIndexNoErrors(
-        AngularTest.createHtmlWithMyController(
-            ["<li ng-repeat='name in ctrl.names track by name.length'/>", "</li>"]));
+        AngularTest.createHtmlWithMyController(r'''
+<li ng-repeat='name in ctrl.names track by name.length'/>
+</li>'''));
     assertResolvedIdentifier2("length'", "int");
   }
 
@@ -2159,123 +2101,108 @@
   void test_ngShow() {
     addMyController();
     _resolveIndexNoErrors(
-        AngularTest.createHtmlWithMyController(
-            ["<div ng-show='ctrl.field != null'/>"]));
+        AngularTest.createHtmlWithMyController("<div ng-show='ctrl.field != null'/>"));
     assertResolvedIdentifier("field");
   }
 
   void test_notResolved_noDartScript() {
-    resolveIndex2(
-        EngineTestCase.createSource(
-            [
-                "<html ng-app>",
-                "  <body>",
-                "    <div my-marker>",
-                "      {{ctrl.field}}",
-                "    </div>",
-                "  </body>",
-                "</html>"]));
+    resolveIndex2(r'''
+<html ng-app>
+  <body>
+    <div my-marker>
+      {{ctrl.field}}
+    </div>
+  </body>
+</html>''');
     assertNoErrors();
     // Angular is not initialized, so "ctrl" is not parsed
     Expression expression =
         ht.HtmlUnitUtils.getExpression(indexUnit, findOffset2("ctrl"));
-    JUnitTestCase.assertNull(expression);
+    expect(expression, isNull);
   }
 
   void test_notResolved_notAngular() {
-    resolveIndex2(
-        EngineTestCase.createSource(
-            [
-                "<html no-ng-app>",
-                "  <body>",
-                "    <div my-marker>",
-                "      {{ctrl.field}}",
-                "    </div>",
-                "  </body>",
-                "</html>"]));
+    resolveIndex2(r'''
+<html no-ng-app>
+  <body>
+    <div my-marker>
+      {{ctrl.field}}
+    </div>
+  </body>
+</html>''');
     assertNoErrors();
     // Angular is not initialized, so "ctrl" is not parsed
     Expression expression =
         ht.HtmlUnitUtils.getExpression(indexUnit, findOffset2("ctrl"));
-    JUnitTestCase.assertNull(expression);
+    expect(expression, isNull);
   }
 
   void test_notResolved_wrongControllerMarker() {
     addMyController();
-    addIndexSource(
-        EngineTestCase.createSource(
-            [
-                "<html ng-app>",
-                "  <body>",
-                "    <div not-my-marker>",
-                "      {{ctrl.field}}",
-                "    </div>",
-                "    <script type='application/dart' src='main.dart'></script>",
-                "  </body>",
-                "</html>"]));
+    addIndexSource(r'''
+<html ng-app>
+  <body>
+    <div not-my-marker>
+      {{ctrl.field}}
+    </div>
+    <script type='application/dart' src='main.dart'></script>
+  </body>
+</html>''');
     contextHelper.runTasks();
     resolveIndex();
     // no errors, because we decided to ignore them at the moment
     assertNoErrors();
     // "ctrl" is not resolved
     SimpleIdentifier identifier = findIdentifier("ctrl");
-    JUnitTestCase.assertNull(identifier.bestElement);
+    expect(identifier.bestElement, isNull);
   }
 
   void test_resolveExpression_evenWithout_ngBootstrap() {
-    resolveMainSource(
-        EngineTestCase.createSource(
-            [
-                "",
-                "import 'angular.dart';",
-                "",
-                "@Controller(",
-                "    selector: '[my-controller]',",
-                "    publishAs: 'ctrl')",
-                "class MyController {",
-                "  String field;",
-                "}"]));
-    _resolveIndexNoErrors(
-        EngineTestCase.createSource(
-            [
-                "<html ng-app>",
-                "  <body>",
-                "    <div my-controller>",
-                "      {{ctrl.field}}",
-                "    </div>",
-                "    <script type='application/dart' src='main.dart'></script>",
-                "  </body>",
-                "</html>"]));
+    resolveMainSource(r'''
+
+import 'angular.dart';
+
+@Controller(
+    selector: '[my-controller]',
+    publishAs: 'ctrl')
+class MyController {
+  String field;
+}''');
+    _resolveIndexNoErrors(r'''
+<html ng-app>
+  <body>
+    <div my-controller>
+      {{ctrl.field}}
+    </div>
+    <script type='application/dart' src='main.dart'></script>
+  </body>
+</html>''');
     assertResolvedIdentifier2("ctrl.", "MyController");
   }
 
   void test_resolveExpression_ignoreUnresolved() {
-    resolveMainSource(
-        EngineTestCase.createSource(
-            [
-                "",
-                "import 'angular.dart';",
-                "",
-                "@Controller(",
-                "    selector: '[my-controller]',",
-                "    publishAs: 'ctrl')",
-                "class MyController {",
-                "  Map map;",
-                "  Object obj;",
-                "}"]));
-    resolveIndex2(
-        EngineTestCase.createSource(
-            [
-                "<html ng-app>",
-                "  <body>",
-                "    <div my-controller>",
-                "      {{ctrl.map.property}}",
-                "      {{ctrl.obj.property}}",
-                "      {{invisibleScopeProperty}}",
-                "    </div>",
-                "    <script type='application/dart' src='main.dart'></script>",
-                "  </body>",
-                "</html>"]));
+    resolveMainSource(r'''
+
+import 'angular.dart';
+
+@Controller(
+    selector: '[my-controller]',
+    publishAs: 'ctrl')
+class MyController {
+  Map map;
+  Object obj;
+}''');
+    resolveIndex2(r'''
+<html ng-app>
+  <body>
+    <div my-controller>
+      {{ctrl.map.property}}
+      {{ctrl.obj.property}}
+      {{invisibleScopeProperty}}
+    </div>
+    <script type='application/dart' src='main.dart'></script>
+  </body>
+</html>''');
     assertNoErrors();
     // "ctrl.map" and "ctrl.obj" are resolved
     assertResolvedIdentifier2("map", "Map<dynamic, dynamic>");
@@ -2283,38 +2210,35 @@
     // ...but not "invisibleScopeProperty"
     {
       SimpleIdentifier identifier = findIdentifier("invisibleScopeProperty");
-      JUnitTestCase.assertNull(identifier.bestElement);
+      expect(identifier.bestElement, isNull);
     }
   }
 
   void test_resolveExpression_inAttribute() {
     addMyController();
     _resolveIndexNoErrors(
-        AngularTest.createHtmlWithMyController(
-            ["<button title='{{ctrl.field}}'></button>"]));
+        AngularTest.createHtmlWithMyController("<button title='{{ctrl.field}}'></button>"));
     assertResolvedIdentifier2("ctrl", "MyController");
   }
 
   void test_resolveExpression_ngApp_onBody() {
     addMyController();
-    _resolveIndexNoErrors(
-        EngineTestCase.createSource(
-            [
-                "<html>",
-                "  <body ng-app>",
-                "    <div my-controller>",
-                "      {{ctrl.field}}",
-                "    </div>",
-                "    <script type='application/dart' src='main.dart'></script>",
-                "  </body>",
-                "</html>"]));
+    _resolveIndexNoErrors(r'''
+<html>
+  <body ng-app>
+    <div my-controller>
+      {{ctrl.field}}
+    </div>
+    <script type='application/dart' src='main.dart'></script>
+  </body>
+</html>''');
     assertResolvedIdentifier2("ctrl", "MyController");
   }
 
   void test_resolveExpression_withFilter() {
     addMyController();
     _resolveIndexNoErrors(
-        AngularTest.createHtmlWithMyController(["{{ctrl.field | uppercase}}"]));
+        AngularTest.createHtmlWithMyController("{{ctrl.field | uppercase}}"));
     assertResolvedIdentifier2("ctrl", "MyController");
     assertResolvedIdentifier("uppercase");
   }
@@ -2322,35 +2246,35 @@
   void test_resolveExpression_withFilter_notSimpleIdentifier() {
     addMyController();
     resolveIndex2(
-        AngularTest.createHtmlWithMyController(["{{ctrl.field | not.supported}}"]));
+        AngularTest.createHtmlWithMyController("{{ctrl.field | not.supported}}"));
     assertErrors(indexSource, [AngularCode.INVALID_FORMATTER_NAME]);
   }
 
   void test_scopeProperties() {
-    addMainSource(
-        EngineTestCase.createSource(
-            [
-                "",
-                "import 'angular.dart';",
-                "",
-                "@Component(",
-                "    templateUrl: 'my_template.html', cssUrl: 'my_styles.css',",
-                "    publishAs: 'ctrl',",
-                "    selector: 'myComponent')",
-                "class MyComponent {",
-                "  String field;",
-                "  MyComponent(Scope scope) {",
-                "    scope.context['scopeProperty'] = 'abc';",
-                "  }",
-                "}",
-                ""]));
+    addMainSource(r'''
+
+import 'angular.dart';
+
+@Component(
+    templateUrl: 'my_template.html', cssUrl: 'my_styles.css',
+    publishAs: 'ctrl',
+    selector: 'myComponent')
+class MyComponent {
+  String field;
+  MyComponent(Scope scope) {
+    scope.context['scopeProperty'] = 'abc';
+  }
+}
+''');
     contextHelper.addSource(
         "/entry-point.html",
-        AngularTest.createHtmlWithAngular([]));
+        AngularTest.createHtmlWithAngular(''));
     addIndexSource2(
         "/my_template.html",
-        EngineTestCase.createSource(
-            ["    <div>", "      {{scopeProperty}}", "    </div>"]));
+        r'''
+<div>
+  {{scopeProperty}}
+</div>''');
     contextHelper.addSource("/my_styles.css", "");
     contextHelper.runTasks();
     resolveIndex();
@@ -2364,29 +2288,30 @@
   }
 
   void test_scopeProperties_hideWithComponent() {
-    addMainSource(
-        EngineTestCase.createSource(
-            [
-                "",
-                "import 'angular.dart';",
-                "",
-                "@Component(",
-                "    templateUrl: 'my_template.html', cssUrl: 'my_styles.css',",
-                "    publishAs: 'ctrl',",
-                "    selector: 'myComponent')",
-                "class MyComponent {",
-                "}",
-                "",
-                "void setScopeProperties(Scope scope) {",
-                "  scope.context['ctrl'] = 1;",
-                "}",
-                ""]));
+    addMainSource(r'''
+
+import 'angular.dart';
+
+@Component(
+    templateUrl: 'my_template.html', cssUrl: 'my_styles.css',
+    publishAs: 'ctrl',
+    selector: 'myComponent')
+class MyComponent {
+}
+
+void setScopeProperties(Scope scope) {
+  scope.context['ctrl'] = 1;
+}
+''');
     contextHelper.addSource(
         "/entry-point.html",
-        AngularTest.createHtmlWithAngular([]));
+        AngularTest.createHtmlWithAngular(''));
     addIndexSource2(
         "/my_template.html",
-        EngineTestCase.createSource(["    <div>", "      {{ctrl}}", "    </div>"]));
+        r'''
+<div>
+  {{ctrl}}
+</div>''');
     contextHelper.addSource("/my_styles.css", "");
     contextHelper.runTasks();
     resolveIndex();
@@ -2402,31 +2327,31 @@
   }
 
   void test_view_resolveTemplateFile() {
-    addMainSource(
-        EngineTestCase.createSource(
-            [
-                "",
-                "import 'angular.dart';",
-                "",
-                "@Controller(",
-                "    selector: '[my-controller]',",
-                "    publishAs: 'ctrl')",
-                "class MyController {",
-                "  String field;",
-                "}",
-                "",
-                "class MyRouteInitializer {",
-                "  init(ViewFactory view) {",
-                "    view('my_template.html');",
-                "  }",
-                "}"]));
+    addMainSource(r'''
+
+import 'angular.dart';
+
+@Controller(
+    selector: '[my-controller]',
+    publishAs: 'ctrl')
+class MyController {
+  String field;
+}
+
+class MyRouteInitializer {
+  init(ViewFactory view) {
+    view('my_template.html');
+  }
+}''');
     contextHelper.addSource(
         "/entry-point.html",
-        AngularTest.createHtmlWithAngular([]));
+        AngularTest.createHtmlWithAngular(''));
     addIndexSource2(
         "/my_template.html",
-        EngineTestCase.createSource(
-            ["    <div my-controller>", "      {{ctrl.field}}", "    </div>"]));
+        r'''
+<div my-controller>
+  {{ctrl.field}}
+</div>''');
     contextHelper.addSource("/my_styles.css", "");
     contextHelper.runTasks();
     resolveIndex();
@@ -2463,7 +2388,7 @@
         (obj) => obj is AngularControllerElement,
         AngularControllerElement,
         element);
-    JUnitTestCase.assertEquals("ctrl", element.name);
+    expect(element.name, "ctrl");
   }
 
   void test_getElementToOpen_field() {
@@ -2478,7 +2403,7 @@
         (obj) => obj is PropertyAccessorElement,
         PropertyAccessorElement,
         element);
-    JUnitTestCase.assertEquals("field", element.name);
+    expect(element.name, "field");
   }
 
   void test_getElement_forExpression() {
@@ -2493,12 +2418,12 @@
         (obj) => obj is VariableElement,
         VariableElement,
         element);
-    JUnitTestCase.assertEquals("ctrl", element.name);
+    expect(element.name, "ctrl");
   }
 
   void test_getElement_forExpression_null() {
     Element element = ht.HtmlUnitUtils.getElement(null);
-    JUnitTestCase.assertNull(element);
+    expect(element, isNull);
   }
 
   void test_getElement_forOffset() {
@@ -2507,7 +2432,7 @@
     // no expression
     {
       Element element = ht.HtmlUnitUtils.getElementAtOffset(indexUnit, 0);
-      JUnitTestCase.assertNull(element);
+      expect(element, isNull);
     }
     // has expression at offset
     {
@@ -2517,79 +2442,70 @@
           (obj) => obj is PropertyAccessorElement,
           PropertyAccessorElement,
           element);
-      JUnitTestCase.assertEquals("field", element.name);
+      expect(element.name, "field");
     }
   }
 
   void test_getEnclosingTagNode() {
-    resolveIndex2(
-        EngineTestCase.createSource(
-            [
-                "<html>",
-                "  <body ng-app>",
-                "    <badge name='abc'> 123 </badge>",
-                "  </body>",
-                "</html>"]));
+    resolveIndex2(r'''
+<html>
+  <body ng-app>
+    <badge name='abc'> 123 </badge>
+  </body>
+</html>''');
     // no unit
-    JUnitTestCase.assertNull(ht.HtmlUnitUtils.getEnclosingTagNode(null, 0));
+    expect(ht.HtmlUnitUtils.getEnclosingTagNode(null, 0), isNull);
     // wrong offset
-    JUnitTestCase.assertNull(
-        ht.HtmlUnitUtils.getEnclosingTagNode(indexUnit, -1));
+    expect(ht.HtmlUnitUtils.getEnclosingTagNode(indexUnit, -1), isNull);
     // valid offset
     ht.XmlTagNode expected = _getEnclosingTagNode("<badge");
-    JUnitTestCase.assertNotNull(expected);
-    JUnitTestCase.assertEquals("badge", expected.tag);
-    JUnitTestCase.assertSame(expected, _getEnclosingTagNode("badge"));
-    JUnitTestCase.assertSame(expected, _getEnclosingTagNode("name="));
-    JUnitTestCase.assertSame(expected, _getEnclosingTagNode("123"));
-    JUnitTestCase.assertSame(expected, _getEnclosingTagNode("/badge"));
+    expect(expected, isNotNull);
+    expect(expected.tag, "badge");
+    expect(_getEnclosingTagNode("badge"), same(expected));
+    expect(_getEnclosingTagNode("name="), same(expected));
+    expect(_getEnclosingTagNode("123"), same(expected));
+    expect(_getEnclosingTagNode("/badge"), same(expected));
   }
 
   void test_getExpression() {
     addMyController();
     _resolveSimpleCtrlFieldHtml();
     // try offset without expression
-    JUnitTestCase.assertNull(ht.HtmlUnitUtils.getExpression(indexUnit, 0));
+    expect(ht.HtmlUnitUtils.getExpression(indexUnit, 0), isNull);
     // try offset with expression
     int offset = indexContent.indexOf("ctrl");
-    JUnitTestCase.assertNotNull(
-        ht.HtmlUnitUtils.getExpression(indexUnit, offset));
-    JUnitTestCase.assertNotNull(
-        ht.HtmlUnitUtils.getExpression(indexUnit, offset + 1));
-    JUnitTestCase.assertNotNull(
-        ht.HtmlUnitUtils.getExpression(indexUnit, offset + 2));
-    JUnitTestCase.assertNotNull(
-        ht.HtmlUnitUtils.getExpression(indexUnit, offset + "ctrl.field".length));
+    expect(ht.HtmlUnitUtils.getExpression(indexUnit, offset), isNotNull);
+    expect(ht.HtmlUnitUtils.getExpression(indexUnit, offset + 1), isNotNull);
+    expect(ht.HtmlUnitUtils.getExpression(indexUnit, offset + 2), isNotNull);
+    expect(ht.HtmlUnitUtils.getExpression(indexUnit, offset + "ctrl.field".length), isNotNull);
     // try without unit
-    JUnitTestCase.assertNull(ht.HtmlUnitUtils.getExpression(null, offset));
+    expect(ht.HtmlUnitUtils.getExpression(null, offset), isNull);
   }
 
   void test_getTagNode() {
-    resolveIndex2(
-        EngineTestCase.createSource(
-            [
-                "<html>",
-                "  <body ng-app>",
-                "    <badge name='abc'> 123 </badge> done",
-                "  </body>",
-                "</html>"]));
+    resolveIndex2(r'''
+<html>
+  <body ng-app>
+    <badge name='abc'> 123 </badge> done
+  </body>
+</html>''');
     // no unit
-    JUnitTestCase.assertNull(ht.HtmlUnitUtils.getTagNode(null, 0));
+    expect(ht.HtmlUnitUtils.getTagNode(null, 0), isNull);
     // wrong offset
-    JUnitTestCase.assertNull(ht.HtmlUnitUtils.getTagNode(indexUnit, -1));
+    expect(ht.HtmlUnitUtils.getTagNode(indexUnit, -1), isNull);
     // on tag name
     ht.XmlTagNode expected = _getTagNode("badge name=");
-    JUnitTestCase.assertNotNull(expected);
-    JUnitTestCase.assertEquals("badge", expected.tag);
-    JUnitTestCase.assertSame(expected, _getTagNode("badge"));
-    JUnitTestCase.assertSame(expected, _getTagNode(" name="));
-    JUnitTestCase.assertSame(expected, _getTagNode("adge name="));
-    JUnitTestCase.assertSame(expected, _getTagNode("badge>"));
-    JUnitTestCase.assertSame(expected, _getTagNode("adge>"));
-    JUnitTestCase.assertSame(expected, _getTagNode("> done"));
+    expect(expected, isNotNull);
+    expect(expected.tag, "badge");
+    expect(_getTagNode("badge"), same(expected));
+    expect(_getTagNode(" name="), same(expected));
+    expect(_getTagNode("adge name="), same(expected));
+    expect(_getTagNode("badge>"), same(expected));
+    expect(_getTagNode("adge>"), same(expected));
+    expect(_getTagNode("> done"), same(expected));
     // in tag node, but not on the name token
-    JUnitTestCase.assertNull(_getTagNode("name="));
-    JUnitTestCase.assertNull(_getTagNode("123"));
+    expect(_getTagNode("name="), isNull);
+    expect(_getTagNode("123"), isNull);
   }
 
   ht.XmlTagNode _getEnclosingTagNode(String search) {
@@ -2603,17 +2519,15 @@
   }
 
   void _resolveSimpleCtrlFieldHtml() {
-    resolveIndex2(
-        EngineTestCase.createSource(
-            [
-                "<html>",
-                "  <body ng-app>",
-                "    <div my-controller>",
-                "      {{ctrl.field}}",
-                "    </div>",
-                "    <script type='application/dart' src='main.dart'></script>",
-                "  </body>",
-                "</html>"]));
+    resolveIndex2(r'''
+<html>
+  <body ng-app>
+    <div my-controller>
+      {{ctrl.field}}
+    </div>
+    <script type='application/dart' src='main.dart'></script>
+  </body>
+</html>''');
   }
 }
 
@@ -2656,27 +2570,25 @@
     mainSource = contextHelper.addSource("/main.dart", content);
   }
   void addMyController() {
-    resolveMainSource(
-        EngineTestCase.createSource(
-            [
-                "",
-                "import 'angular.dart';",
-                "",
-                "class Item {",
-                "  String name;",
-                "  bool done;",
-                "}",
-                "",
-                "@Controller(",
-                "    selector: '[my-controller]',",
-                "    publishAs: 'ctrl')",
-                "class MyController {",
-                "  String field;",
-                "  List<String> names;",
-                "  List<Item> items;",
-                "  var untypedItems;",
-                "  doSomething(event) {}",
-                "}"]));
+    resolveMainSource(r'''
+
+import 'angular.dart';
+
+class Item {
+  String name;
+  bool done;
+}
+
+@Controller(
+    selector: '[my-controller]',
+    publishAs: 'ctrl')
+class MyController {
+  String field;
+  List<String> names;
+  List<Item> items;
+  var untypedItems;
+  doSomething(event) {}
+}''');
   }
   /**
    * Assert that the number of errors reported against the given source matches the number of errors
@@ -2728,7 +2640,7 @@
     SimpleIdentifier identifier = findIdentifier(name);
     // check Element
     Element element = identifier.bestElement;
-    JUnitTestCase.assertNotNull(element);
+    expect(element, isNotNull);
     // return Element for further analysis
     return element;
   }
@@ -2737,11 +2649,11 @@
     SimpleIdentifier identifier = findIdentifier(name);
     // check Element
     Element element = identifier.bestElement;
-    JUnitTestCase.assertNotNull(element);
+    expect(element, isNotNull);
     // check Type
     DartType type = identifier.bestType;
-    JUnitTestCase.assertNotNull(type);
-    JUnitTestCase.assertEquals(expectedTypeName, type.toString());
+    expect(type, isNotNull);
+    expect(type.toString(), expectedTypeName);
     // return Element for further analysis
     return element;
   }
@@ -2759,13 +2671,13 @@
    */
   SimpleIdentifier findIdentifier(String search) {
     SimpleIdentifier identifier = findIdentifierMaybe(search);
-    JUnitTestCase.assertNotNullMsg("${search} in ${indexContent}", identifier);
+    expect(identifier, isNotNull, reason: "$search in $indexContent");
     // check that offset/length of the identifier is valid
     {
       int offset = identifier.offset;
       int end = identifier.end;
       String contentStr = indexContent.substring(offset, end);
-      JUnitTestCase.assertEquals(identifier.name, contentStr);
+      expect(contentStr, identifier.name);
     }
     // done
     return identifier;
@@ -2897,152 +2809,152 @@
   void _configureForAngular(AnalysisContextHelper contextHelper) {
     contextHelper.addSource(
         "/angular.dart",
-        EngineTestCase.createSource(
-            [
-                "library angular;",
-                "",
-                "class Scope {",
-                "  Map context;",
-                "}",
-                "",
-                "class Formatter {",
-                "  final String name;",
-                "  const Formatter({this.name});",
-                "}",
-                "",
-                "class Directive {",
-                "  const Directive({",
-                "    selector,",
-                "    children,",
-                "    visibility,",
-                "    module,",
-                "    map,",
-                "    exportedExpressions,",
-                "    exportedExpressionAttrs",
-                "  });",
-                "}",
-                "",
-                "class Decorator {",
-                "  const Decorator({",
-                "    children/*: Directive.COMPILE_CHILDREN*/,",
-                "    map,",
-                "    selector,",
-                "    module,",
-                "    visibility,",
-                "    exportedExpressions,",
-                "    exportedExpressionAttrs",
-                "  });",
-                "}",
-                "",
-                "class Controller {",
-                "  const Controller({",
-                "    children,",
-                "    publishAs,",
-                "    map,",
-                "    selector,",
-                "    visibility,",
-                "    publishTypes,",
-                "    exportedExpressions,",
-                "    exportedExpressionAttrs",
-                "  });",
-                "}",
-                "",
-                "class NgAttr {",
-                "  const NgAttr(String name);",
-                "}",
-                "class NgCallback {",
-                "  const NgCallback(String name);",
-                "}",
-                "class NgOneWay {",
-                "  const NgOneWay(String name);",
-                "}",
-                "class NgOneWayOneTime {",
-                "  const NgOneWayOneTime(String name);",
-                "}",
-                "class NgTwoWay {",
-                "  const NgTwoWay(String name);",
-                "}",
-                "",
-                "class Component extends Directive {",
-                "  const Component({",
-                "    this.template,",
-                "    this.templateUrl,",
-                "    this.cssUrl,",
-                "    this.applyAuthorStyles,",
-                "    this.resetStyleInheritance,",
-                "    publishAs,",
-                "    module,",
-                "    map,",
-                "    selector,",
-                "    visibility,",
-                "    exportExpressions,",
-                "    exportExpressionAttrs",
-                "  }) : super(selector: selector,",
-                "             children: null/*NgAnnotation.COMPILE_CHILDREN*/,",
-                "             visibility: visibility,",
-                "             map: map,",
-                "             module: module,",
-                "             exportExpressions: exportExpressions,",
-                "             exportExpressionAttrs: exportExpressionAttrs);",
-                "}",
-                "",
-                "@Decorator(selector: '[ng-click]', map: const {'ng-click': '&onEvent'})",
-                "@Decorator(selector: '[ng-mouseout]', map: const {'ng-mouseout': '&onEvent'})",
-                "class NgEventDirective {",
-                "  set onEvent(value) {}",
-                "}",
-                "",
-                "@Decorator(selector: '[ng-if]', map: const {'ng-if': '=>condition'})",
-                "class NgIfDirective {",
-                "  set condition(value) {}",
-                "}",
-                "",
-                "@Decorator(selector: '[ng-show]', map: const {'ng-show': '=>show'})",
-                "class NgShowDirective {",
-                "  set show(value) {}",
-                "}",
-                "",
-                "@Formatter(name: 'filter')",
-                "class FilterFormatter {}",
-                "",
-                "@Formatter(name: 'orderBy')",
-                "class OrderByFilter {}",
-                "",
-                "@Formatter(name: 'uppercase')",
-                "class UppercaseFilter {}",
-                "",
-                "class ViewFactory {",
-                "  call(String templateUrl) => null;",
-                "}",
-                "",
-                "class Module {",
-                "  install(Module m) {}",
-                "  type(Type t) {}",
-                "  value(Type t, value) {}",
-                "}",
-                "",
-                "class Injector {}",
-                "",
-                "Injector ngBootstrap({",
-                "        Module module: null,",
-                "        List<Module> modules: null,",
-                "        /*dom.Element*/ element: null,",
-                "        String selector: '[ng-app]',",
-                "        /*Injector*/ injectorFactory/*(List<Module> modules): _defaultInjectorFactory*/}) {}",
-                ""]));
+        r'''
+library angular;
+
+class Scope {
+  Map context;
+}
+
+class Formatter {
+  final String name;
+  const Formatter({this.name});
+}
+
+class Directive {
+  const Directive({
+    selector,
+    children,
+    visibility,
+    module,
+    map,
+    exportedExpressions,
+    exportedExpressionAttrs
+  });
+}
+
+class Decorator {
+  const Decorator({
+    children/*: Directive.COMPILE_CHILDREN*/,
+    map,
+    selector,
+    module,
+    visibility,
+    exportedExpressions,
+    exportedExpressionAttrs
+  });
+}
+
+class Controller {
+  const Controller({
+    children,
+    publishAs,
+    map,
+    selector,
+    visibility,
+    publishTypes,
+    exportedExpressions,
+    exportedExpressionAttrs
+  });
+}
+
+class NgAttr {
+  const NgAttr(String name);
+}
+class NgCallback {
+  const NgCallback(String name);
+}
+class NgOneWay {
+  const NgOneWay(String name);
+}
+class NgOneWayOneTime {
+  const NgOneWayOneTime(String name);
+}
+class NgTwoWay {
+  const NgTwoWay(String name);
+}
+
+class Component extends Directive {
+  const Component({
+    this.template,
+    this.templateUrl,
+    this.cssUrl,
+    this.applyAuthorStyles,
+    this.resetStyleInheritance,
+    publishAs,
+    module,
+    map,
+    selector,
+    visibility,
+    exportExpressions,
+    exportExpressionAttrs
+  }) : super(selector: selector,
+             children: null/*NgAnnotation.COMPILE_CHILDREN*/,
+             visibility: visibility,
+             map: map,
+             module: module,
+             exportExpressions: exportExpressions,
+             exportExpressionAttrs: exportExpressionAttrs);
+}
+
+@Decorator(selector: '[ng-click]', map: const {'ng-click': '&onEvent'})
+@Decorator(selector: '[ng-mouseout]', map: const {'ng-mouseout': '&onEvent'})
+class NgEventDirective {
+  set onEvent(value) {}
+}
+
+@Decorator(selector: '[ng-if]', map: const {'ng-if': '=>condition'})
+class NgIfDirective {
+  set condition(value) {}
+}
+
+@Decorator(selector: '[ng-show]', map: const {'ng-show': '=>show'})
+class NgShowDirective {
+  set show(value) {}
+}
+
+@Formatter(name: 'filter')
+class FilterFormatter {}
+
+@Formatter(name: 'orderBy')
+class OrderByFilter {}
+
+@Formatter(name: 'uppercase')
+class UppercaseFilter {}
+
+class ViewFactory {
+  call(String templateUrl) => null;
+}
+
+class Module {
+  install(Module m) {}
+  type(Type t) {}
+  value(Type t, value) {}
+}
+
+class Injector {}
+
+Injector ngBootstrap({
+        Module module: null,
+        List<Module> modules: null,
+        /*dom.Element*/ element: null,
+        String selector: '[ng-app]',
+        /*Injector*/ injectorFactory/*(List<Module> modules): _defaultInjectorFactory*/}) {}
+''');
   }
 
   /**
-   * Creates an HTML content that has Angular marker and script with "main.dart" reference.
+   * Creates an HTML content that has Angular marker and script with
+   * the "main.dart" reference.
    */
-  static String createHtmlWithAngular(List<String> lines) {
-    String source = EngineTestCase.createSource(["<html ng-app>", "  <body>"]);
-    source += EngineTestCase.createSource(lines);
-    source += EngineTestCase.createSource(
-        [
-            "    <script type='application/dart' src='main.dart'></script>",
-            "  </body>",
-            "</html>"]);
+  static String createHtmlWithAngular(String innerCode) {
+    String source = '''
+<html ng-app>
+  <body>
+$innerCode
+    <script type='application/dart' src='main.dart'></script>
+  </body>
+</html>''';
     return source;
   }
 
@@ -3050,16 +2962,16 @@
    * Creates an HTML content that has Angular marker, script with "main.dart" reference and
    * "MyController" injected.
    */
-  static String createHtmlWithMyController(List<String> lines) {
-    String source = EngineTestCase.createSource(
-        ["<html ng-app>", "  <body>", "    <div my-controller>"]);
-    source += EngineTestCase.createSource(lines);
-    source += EngineTestCase.createSource(
-        [
-            "    </div>",
-            "    <script type='application/dart' src='main.dart'></script>",
-            "  </body>",
-            "</html>"]);
+  static String createHtmlWithMyController(String innerHtml) {
+    String source = '''
+<html ng-app>
+  <body>
+    <div my-controller>
+$innerHtml
+    </div>
+    <script type='application/dart' src='main.dart'></script>
+  </body>
+</html>''';
     return source;
   }
 
@@ -3074,9 +2986,9 @@
    * @return the found [Element] or `null` if not found
    */
   static Element findElement(Element root, ElementKind kind, String name) {
-    List<Element> result = [null];
-    root.accept(new _AngularTest_findElement(kind, name, result));
-    return result[0];
+    _AngularTest_findElement visitor = new _AngularTest_findElement(kind, name);
+    root.accept(visitor);
+    return visitor.result;
   }
 
   /**
@@ -3096,7 +3008,7 @@
    */
   static int findOffset(String content, String search) {
     int offset = content.indexOf(search);
-    _ut.expect(offset, _ut.isNot(-1));
+    expect(offset, isNot(-1));
     return offset;
   }
 }
@@ -3105,51 +3017,51 @@
 class ConstantEvaluatorTest extends ResolverTestCase {
   void fail_constructor() {
     EvaluationResult result = _getExpressionValue("?");
-    JUnitTestCase.assertTrue(result.isValid);
+    expect(result.isValid, isTrue);
     DartObject value = result.value;
-    JUnitTestCase.assertEquals(null, value);
+    expect(value, null);
   }
 
   void fail_identifier_class() {
     EvaluationResult result = _getExpressionValue("?");
-    JUnitTestCase.assertTrue(result.isValid);
+    expect(result.isValid, isTrue);
     DartObject value = result.value;
-    JUnitTestCase.assertEquals(null, value);
+    expect(value, null);
   }
 
   void fail_identifier_function() {
     EvaluationResult result = _getExpressionValue("?");
-    JUnitTestCase.assertTrue(result.isValid);
+    expect(result.isValid, isTrue);
     DartObject value = result.value;
-    JUnitTestCase.assertEquals(null, value);
+    expect(value, null);
   }
 
   void fail_identifier_static() {
     EvaluationResult result = _getExpressionValue("?");
-    JUnitTestCase.assertTrue(result.isValid);
+    expect(result.isValid, isTrue);
     DartObject value = result.value;
-    JUnitTestCase.assertEquals(null, value);
+    expect(value, null);
   }
 
   void fail_identifier_staticMethod() {
     EvaluationResult result = _getExpressionValue("?");
-    JUnitTestCase.assertTrue(result.isValid);
+    expect(result.isValid, isTrue);
     DartObject value = result.value;
-    JUnitTestCase.assertEquals(null, value);
+    expect(value, null);
   }
 
   void fail_identifier_topLevel() {
     EvaluationResult result = _getExpressionValue("?");
-    JUnitTestCase.assertTrue(result.isValid);
+    expect(result.isValid, isTrue);
     DartObject value = result.value;
-    JUnitTestCase.assertEquals(null, value);
+    expect(value, null);
   }
 
   void fail_identifier_typeParameter() {
     EvaluationResult result = _getExpressionValue("?");
-    JUnitTestCase.assertTrue(result.isValid);
+    expect(result.isValid, isTrue);
     DartObject value = result.value;
-    JUnitTestCase.assertEquals(null, value);
+    expect(value, null);
   }
 
   void fail_plus_string_string() {
@@ -3158,44 +3070,44 @@
 
   void fail_prefixedIdentifier_invalid() {
     EvaluationResult result = _getExpressionValue("?");
-    JUnitTestCase.assertTrue(result.isValid);
+    expect(result.isValid, isTrue);
     DartObject value = result.value;
-    JUnitTestCase.assertEquals(null, value);
+    expect(value, null);
   }
 
   void fail_prefixedIdentifier_valid() {
     EvaluationResult result = _getExpressionValue("?");
-    JUnitTestCase.assertTrue(result.isValid);
+    expect(result.isValid, isTrue);
     DartObject value = result.value;
-    JUnitTestCase.assertEquals(null, value);
+    expect(value, null);
   }
 
   void fail_propertyAccess_invalid() {
     EvaluationResult result = _getExpressionValue("?");
-    JUnitTestCase.assertTrue(result.isValid);
+    expect(result.isValid, isTrue);
     DartObject value = result.value;
-    JUnitTestCase.assertEquals(null, value);
+    expect(value, null);
   }
 
   void fail_propertyAccess_valid() {
     EvaluationResult result = _getExpressionValue("?");
-    JUnitTestCase.assertTrue(result.isValid);
+    expect(result.isValid, isTrue);
     DartObject value = result.value;
-    JUnitTestCase.assertEquals(null, value);
+    expect(value, null);
   }
 
   void fail_simpleIdentifier_invalid() {
     EvaluationResult result = _getExpressionValue("?");
-    JUnitTestCase.assertTrue(result.isValid);
+    expect(result.isValid, isTrue);
     DartObject value = result.value;
-    JUnitTestCase.assertEquals(null, value);
+    expect(value, null);
   }
 
   void fail_simpleIdentifier_valid() {
     EvaluationResult result = _getExpressionValue("?");
-    JUnitTestCase.assertTrue(result.isValid);
+    expect(result.isValid, isTrue);
     DartObject value = result.value;
-    JUnitTestCase.assertEquals(null, value);
+    expect(value, null);
   }
 
   void fail_stringLength_complex() {
@@ -3227,10 +3139,10 @@
 
   void test_divide_double_double_byZero() {
     EvaluationResult result = _getExpressionValue("3.2 / 0.0");
-    JUnitTestCase.assertTrue(result.isValid);
+    expect(result.isValid, isTrue);
     DartObject value = result.value;
-    JUnitTestCase.assertEquals("double", value.type.name);
-    JUnitTestCase.assertTrue(value.doubleValue.isInfinite);
+    expect(value.type.name, "double");
+    expect(value.doubleValue.isInfinite, isTrue);
   }
 
   void test_divide_int_int() {
@@ -3239,7 +3151,7 @@
 
   void test_divide_int_int_byZero() {
     EvaluationResult result = _getExpressionValue("3 / 0");
-    JUnitTestCase.assertTrue(result.isValid);
+    expect(result.isValid, isTrue);
   }
 
   void test_equal_boolean_boolean() {
@@ -3252,12 +3164,12 @@
 
   void test_equal_invalidLeft() {
     EvaluationResult result = _getExpressionValue("a == 3");
-    JUnitTestCase.assertFalse(result.isValid);
+    expect(result.isValid, isFalse);
   }
 
   void test_equal_invalidRight() {
     EvaluationResult result = _getExpressionValue("2 == a");
-    JUnitTestCase.assertFalse(result.isValid);
+    expect(result.isValid, isFalse);
   }
 
   void test_equal_string_string() {
@@ -3293,20 +3205,20 @@
 
   void test_literal_list() {
     EvaluationResult result = _getExpressionValue("const ['a', 'b', 'c']");
-    JUnitTestCase.assertTrue(result.isValid);
+    expect(result.isValid, isTrue);
   }
 
   void test_literal_map() {
     EvaluationResult result =
         _getExpressionValue("const {'a' : 'm', 'b' : 'n', 'c' : 'o'}");
-    JUnitTestCase.assertTrue(result.isValid);
+    expect(result.isValid, isTrue);
   }
 
   void test_literal_null() {
     EvaluationResult result = _getExpressionValue("null");
-    JUnitTestCase.assertTrue(result.isValid);
+    expect(result.isValid, isTrue);
     DartObject value = result.value;
-    JUnitTestCase.assertTrue(value.isNull);
+    expect(value.isNull, isTrue);
   }
 
   void test_literal_number_double() {
@@ -3323,7 +3235,7 @@
 
   void test_literal_string_interpolation_invalid() {
     EvaluationResult result = _getExpressionValue("'a\${f()}c'");
-    JUnitTestCase.assertFalse(result.isValid);
+    expect(result.isValid, isFalse);
   }
 
   void test_literal_string_interpolation_valid() {
@@ -3356,7 +3268,7 @@
 
   void test_negated_boolean() {
     EvaluationResult result = _getExpressionValue("-true");
-    JUnitTestCase.assertFalse(result.isValid);
+    expect(result.isValid, isFalse);
   }
 
   void test_negated_double() {
@@ -3377,12 +3289,12 @@
 
   void test_notEqual_invalidLeft() {
     EvaluationResult result = _getExpressionValue("a != 3");
-    JUnitTestCase.assertFalse(result.isValid);
+    expect(result.isValid, isFalse);
   }
 
   void test_notEqual_invalidRight() {
     EvaluationResult result = _getExpressionValue("2 != a");
-    JUnitTestCase.assertFalse(result.isValid);
+    expect(result.isValid, isFalse);
   }
 
   void test_notEqual_string_string() {
@@ -3432,44 +3344,44 @@
   void _assertValue(bool expectedValue, String contents) {
     EvaluationResult result = _getExpressionValue(contents);
     DartObject value = result.value;
-    JUnitTestCase.assertEquals("bool", value.type.name);
-    JUnitTestCase.assertEquals(expectedValue, value.boolValue);
+    expect(value.type.name, "bool");
+    expect(value.boolValue, expectedValue);
   }
 
   void _assertValue2(double expectedValue, String contents) {
     EvaluationResult result = _getExpressionValue(contents);
-    JUnitTestCase.assertTrue(result.isValid);
+    expect(result.isValid, isTrue);
     DartObject value = result.value;
-    JUnitTestCase.assertEquals("double", value.type.name);
-    JUnitTestCase.assertEquals(expectedValue, value.doubleValue);
+    expect(value.type.name, "double");
+    expect(value.doubleValue, expectedValue);
   }
 
   void _assertValue3(int expectedValue, String contents) {
     EvaluationResult result = _getExpressionValue(contents);
-    JUnitTestCase.assertTrue(result.isValid);
+    expect(result.isValid, isTrue);
     DartObject value = result.value;
-    JUnitTestCase.assertEquals("int", value.type.name);
-    JUnitTestCase.assertEquals(expectedValue, value.intValue);
+    expect(value.type.name, "int");
+    expect(value.intValue, expectedValue);
   }
 
   void _assertValue4(String expectedValue, String contents) {
     EvaluationResult result = _getExpressionValue(contents);
     DartObject value = result.value;
-    JUnitTestCase.assertNotNull(value);
+    expect(value, isNotNull);
     ParameterizedType type = value.type;
-    JUnitTestCase.assertNotNull(type);
-    JUnitTestCase.assertEquals("String", type.name);
-    JUnitTestCase.assertEquals(expectedValue, value.stringValue);
+    expect(type, isNotNull);
+    expect(type.name, "String");
+    expect(value.stringValue, expectedValue);
   }
 
   EvaluationResult _getExpressionValue(String contents) {
-    Source source = addSource("var x = ${contents};");
+    Source source = addSource("var x = $contents;");
     LibraryElement library = resolve(source);
     CompilationUnit unit =
         analysisContext.resolveCompilationUnit(source, library);
-    JUnitTestCase.assertNotNull(unit);
+    expect(unit, isNotNull);
     NodeList<CompilationUnitMember> declarations = unit.declarations;
-    EngineTestCase.assertSizeOfList(1, declarations);
+    expect(declarations, hasLength(1));
     CompilationUnitMember declaration = declarations[0];
     EngineTestCase.assertInstanceOf(
         (obj) => obj is TopLevelVariableDeclaration,
@@ -3477,7 +3389,7 @@
         declaration);
     NodeList<VariableDeclaration> variables =
         (declaration as TopLevelVariableDeclaration).variables.variables;
-    EngineTestCase.assertSizeOfList(1, variables);
+    expect(variables, hasLength(1));
     ConstantEvaluator evaluator = new ConstantEvaluator(
         source,
         (analysisContext as AnalysisContextImpl).typeProvider);
@@ -3491,37 +3403,37 @@
 
   void test_visitConstructorDeclaration_const() {
     ConstructorElement element = _setupConstructorDeclaration("A", true);
-    JUnitTestCase.assertSame(_node, _findConstantDeclarations()[element]);
+    expect(_findConstantDeclarations()[element], same(_node));
   }
 
   void test_visitConstructorDeclaration_nonConst() {
     _setupConstructorDeclaration("A", false);
-    JUnitTestCase.assertTrue(_findConstantDeclarations().isEmpty);
+    expect(_findConstantDeclarations().isEmpty, isTrue);
   }
 
   void test_visitInstanceCreationExpression_const() {
     _setupInstanceCreationExpression("A", true);
-    JUnitTestCase.assertTrue(_findConstructorInvocations().contains(_node));
+    expect(_findConstructorInvocations().contains(_node), isTrue);
   }
 
   void test_visitInstanceCreationExpression_nonConst() {
     _setupInstanceCreationExpression("A", false);
-    JUnitTestCase.assertTrue(_findConstructorInvocations().isEmpty);
+    expect(_findConstructorInvocations().isEmpty, isTrue);
   }
 
   void test_visitVariableDeclaration_const() {
     VariableElement element = _setupVariableDeclaration("v", true, true);
-    JUnitTestCase.assertSame(_node, _findVariableDeclarations()[element]);
+    expect(_findVariableDeclarations()[element], same(_node));
   }
 
   void test_visitVariableDeclaration_noInitializer() {
     _setupVariableDeclaration("v", true, false);
-    JUnitTestCase.assertTrue(_findVariableDeclarations().isEmpty);
+    expect(_findVariableDeclarations().isEmpty, isTrue);
   }
 
   void test_visitVariableDeclaration_nonConst() {
     _setupVariableDeclaration("v", false, true);
-    JUnitTestCase.assertTrue(_findVariableDeclarations().isEmpty);
+    expect(_findVariableDeclarations().isEmpty, isTrue);
   }
 
   Map<ConstructorElement, ConstructorDeclaration> _findConstantDeclarations() {
@@ -3529,7 +3441,7 @@
     _node.accept(finder);
     Map<ConstructorElement, ConstructorDeclaration> constructorMap =
         finder.constructorMap;
-    JUnitTestCase.assertNotNull(constructorMap);
+    expect(constructorMap, isNotNull);
     return constructorMap;
   }
 
@@ -3538,7 +3450,7 @@
     _node.accept(finder);
     List<InstanceCreationExpression> constructorInvocations =
         finder.constructorInvocations;
-    JUnitTestCase.assertNotNull(constructorInvocations);
+    expect(constructorInvocations, isNotNull);
     return constructorInvocations;
   }
 
@@ -3546,7 +3458,7 @@
     ConstantFinder finder = new ConstantFinder();
     _node.accept(finder);
     Map<VariableElement, VariableDeclaration> variableMap = finder.variableMap;
-    JUnitTestCase.assertNotNull(variableMap);
+    expect(variableMap, isNotNull);
     return variableMap;
   }
 
@@ -3597,36 +3509,38 @@
   void test_computeValues_cycle() {
     TestLogger logger = new TestLogger();
     AnalysisEngine.instance.logger = logger;
-    Source librarySource = addSource(
-        EngineTestCase.createSource(
-            ["const int a = c;", "const int b = a;", "const int c = b;"]));
+    Source librarySource = addSource(r'''
+const int a = c;
+const int b = a;
+const int c = b;''');
     LibraryElement libraryElement = resolve(librarySource);
     CompilationUnit unit =
         analysisContext.resolveCompilationUnit(librarySource, libraryElement);
     analysisContext.computeErrors(librarySource);
-    JUnitTestCase.assertNotNull(unit);
+    expect(unit, isNotNull);
     ConstantValueComputer computer = _makeConstantValueComputer();
     computer.add(unit);
     computer.computeValues();
     NodeList<CompilationUnitMember> members = unit.declarations;
-    EngineTestCase.assertSizeOfList(3, members);
+    expect(members, hasLength(3));
     _validate(false, (members[0] as TopLevelVariableDeclaration).variables);
     _validate(false, (members[1] as TopLevelVariableDeclaration).variables);
     _validate(false, (members[2] as TopLevelVariableDeclaration).variables);
   }
 
   void test_computeValues_dependentVariables() {
-    Source librarySource = addSource(
-        EngineTestCase.createSource(["const int b = a;", "const int a = 0;"]));
+    Source librarySource = addSource(r'''
+const int b = a;
+const int a = 0;''');
     LibraryElement libraryElement = resolve(librarySource);
     CompilationUnit unit =
         analysisContext.resolveCompilationUnit(librarySource, libraryElement);
-    JUnitTestCase.assertNotNull(unit);
+    expect(unit, isNotNull);
     ConstantValueComputer computer = _makeConstantValueComputer();
     computer.add(unit);
     computer.computeValues();
     NodeList<CompilationUnitMember> members = unit.declarations;
-    EngineTestCase.assertSizeOfList(2, members);
+    expect(members, hasLength(2));
     _validate(true, (members[0] as TopLevelVariableDeclaration).variables);
     _validate(true, (members[1] as TopLevelVariableDeclaration).variables);
   }
@@ -3639,25 +3553,30 @@
   void test_computeValues_multipleSources() {
     Source librarySource = addNamedSource(
         "/lib.dart",
-        EngineTestCase.createSource(
-            ["library lib;", "part 'part.dart';", "const int c = b;", "const int a = 0;"]));
+        r'''
+library lib;
+part 'part.dart';
+const int c = b;
+const int a = 0;''');
     Source partSource = addNamedSource(
         "/part.dart",
-        EngineTestCase.createSource(
-            ["part of lib;", "const int b = a;", "const int d = c;"]));
+        r'''
+part of lib;
+const int b = a;
+const int d = c;''');
     LibraryElement libraryElement = resolve(librarySource);
     CompilationUnit libraryUnit =
         analysisContext.resolveCompilationUnit(librarySource, libraryElement);
-    JUnitTestCase.assertNotNull(libraryUnit);
+    expect(libraryUnit, isNotNull);
     CompilationUnit partUnit =
         analysisContext.resolveCompilationUnit(partSource, libraryElement);
-    JUnitTestCase.assertNotNull(partUnit);
+    expect(partUnit, isNotNull);
     ConstantValueComputer computer = _makeConstantValueComputer();
     computer.add(libraryUnit);
     computer.add(partUnit);
     computer.computeValues();
     NodeList<CompilationUnitMember> libraryMembers = libraryUnit.declarations;
-    EngineTestCase.assertSizeOfList(2, libraryMembers);
+    expect(libraryMembers, hasLength(2));
     _validate(
         true,
         (libraryMembers[0] as TopLevelVariableDeclaration).variables);
@@ -3665,7 +3584,7 @@
         true,
         (libraryMembers[1] as TopLevelVariableDeclaration).variables);
     NodeList<CompilationUnitMember> partMembers = libraryUnit.declarations;
-    EngineTestCase.assertSizeOfList(2, partMembers);
+    expect(partMembers, hasLength(2));
     _validate(true, (partMembers[0] as TopLevelVariableDeclaration).variables);
     _validate(true, (partMembers[1] as TopLevelVariableDeclaration).variables);
   }
@@ -3675,283 +3594,246 @@
     LibraryElement libraryElement = resolve(librarySource);
     CompilationUnit unit =
         analysisContext.resolveCompilationUnit(librarySource, libraryElement);
-    JUnitTestCase.assertNotNull(unit);
+    expect(unit, isNotNull);
     ConstantValueComputer computer = _makeConstantValueComputer();
     computer.add(unit);
     computer.computeValues();
     NodeList<CompilationUnitMember> members = unit.declarations;
-    EngineTestCase.assertSizeOfList(1, members);
+    expect(members, hasLength(1));
     _validate(true, (members[0] as TopLevelVariableDeclaration).variables);
   }
 
   void test_dependencyOnConstructor() {
     // x depends on "const A()"
-    _assertProperDependencies(
-        EngineTestCase.createSource(
-            ["class A {", "  const A();", "}", "const x = const A();"]),
+    _assertProperDependencies(r'''
+class A {
+  const A();
+}
+const x = const A();''',
         []);
   }
 
   void test_dependencyOnConstructorArgument() {
     // "const A(x)" depends on x
-    _assertProperDependencies(
-        EngineTestCase.createSource(
-            [
-                "class A {",
-                "  const A(this.next);",
-                "  final A next;",
-                "}",
-                "const A x = const A(null);",
-                "const A y = const A(x);"]),
+    _assertProperDependencies(r'''
+class A {
+  const A(this.next);
+  final A next;
+}
+const A x = const A(null);
+const A y = const A(x);''',
         []);
   }
 
   void test_dependencyOnConstructorArgument_unresolvedConstructor() {
     // "const A.a(x)" depends on x even if the constructor A.a can't be found.
-    _assertProperDependencies(
-        EngineTestCase.createSource(
-            ["class A {", "}", "const int x = 1;", "const A y = const A.a(x);"]),
+    _assertProperDependencies(r'''
+class A {
+}
+const int x = 1;
+const A y = const A.a(x);''',
         [CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR]);
   }
 
   void test_dependencyOnConstructorInitializer() {
     // "const A()" depends on x
-    _assertProperDependencies(
-        EngineTestCase.createSource(
-            [
-                "const int x = 1;",
-                "class A {",
-                "  const A() : v = x;",
-                "  final int v;",
-                "}"]),
+    _assertProperDependencies(r'''
+const int x = 1;
+class A {
+  const A() : v = x;
+  final int v;
+}''',
         []);
   }
 
   void test_dependencyOnExplicitSuperConstructor() {
     // b depends on B() depends on A()
-    _assertProperDependencies(
-        EngineTestCase.createSource(
-            [
-                "class A {",
-                "  const A(this.x);",
-                "  final int x;",
-                "}",
-                "class B extends A {",
-                "  const B() : super(5);",
-                "}",
-                "const B b = const B();"]),
+    _assertProperDependencies(r'''
+class A {
+  const A(this.x);
+  final int x;
+}
+class B extends A {
+  const B() : super(5);
+}
+const B b = const B();''',
         []);
   }
 
   void test_dependencyOnExplicitSuperConstructorParameters() {
     // b depends on B() depends on i
-    _assertProperDependencies(
-        EngineTestCase.createSource(
-            [
-                "class A {",
-                "  const A(this.x);",
-                "  final int x;",
-                "}",
-                "class B extends A {",
-                "  const B() : super(i);",
-                "}",
-                "const B b = const B();",
-                "const int i = 5;"]),
+    _assertProperDependencies(r'''
+class A {
+  const A(this.x);
+  final int x;
+}
+class B extends A {
+  const B() : super(i);
+}
+const B b = const B();
+const int i = 5;''',
         []);
   }
 
   void test_dependencyOnFactoryRedirect() {
     // a depends on A.foo() depends on A.bar()
-    _assertProperDependencies(
-        EngineTestCase.createSource(
-            [
-                "const A a = const A.foo();",
-                "class A {",
-                "  factory const A.foo() = A.bar;",
-                "  const A.bar();",
-                "}"]),
+    _assertProperDependencies(r'''
+const A a = const A.foo();
+class A {
+  factory const A.foo() = A.bar;
+  const A.bar();
+}''',
         []);
   }
 
   void test_dependencyOnFactoryRedirectWithTypeParams() {
-    _assertProperDependencies(
-        EngineTestCase.createSource(
-            [
-                "class A {",
-                "  const factory A(var a) = B<int>;",
-                "}",
-                "",
-                "class B<T> implements A {",
-                "  final T x;",
-                "  const B(this.x);",
-                "}",
-                "",
-                "const A a = const A(10);"]),
+    _assertProperDependencies(r'''
+class A {
+  const factory A(var a) = B<int>;
+}
+
+class B<T> implements A {
+  final T x;
+  const B(this.x);
+}
+
+const A a = const A(10);''',
         []);
   }
 
   void test_dependencyOnImplicitSuperConstructor() {
     // b depends on B() depends on A()
-    _assertProperDependencies(
-        EngineTestCase.createSource(
-            [
-                "class A {",
-                "  const A() : x = 5;",
-                "  final int x;",
-                "}",
-                "class B extends A {",
-                "  const B();",
-                "}",
-                "const B b = const B();"]),
+    _assertProperDependencies(r'''
+class A {
+  const A() : x = 5;
+  final int x;
+}
+class B extends A {
+  const B();
+}
+const B b = const B();''',
         []);
   }
 
   void test_dependencyOnNonFactoryRedirect() {
     // a depends on A.foo() depends on A.bar()
-    _assertProperDependencies(
-        EngineTestCase.createSource(
-            [
-                "const A a = const A.foo();",
-                "class A {",
-                "  const A.foo() : this.bar();",
-                "  const A.bar();",
-                "}"]),
+    _assertProperDependencies(r'''
+const A a = const A.foo();
+class A {
+  const A.foo() : this.bar();
+  const A.bar();
+}''',
         []);
   }
 
   void test_dependencyOnNonFactoryRedirect_arg() {
     // a depends on A.foo() depends on b
-    _assertProperDependencies(
-        EngineTestCase.createSource(
-            [
-                "const A a = const A.foo();",
-                "const int b = 1;",
-                "class A {",
-                "  const A.foo() : this.bar(b);",
-                "  const A.bar(x) : y = x;",
-                "  final int y;"
-                "}"]),
+    _assertProperDependencies(r'''
+const A a = const A.foo();
+const int b = 1;
+class A {
+  const A.foo() : this.bar(b);
+  const A.bar(x) : y = x;
+  final int y;
+}''',
         []);
   }
 
   void test_dependencyOnNonFactoryRedirect_defaultValue() {
     // a depends on A.foo() depends on A.bar() depends on b
-    _assertProperDependencies(
-        EngineTestCase.createSource(
-            [
-                "const A a = const A.foo();",
-                "const int b = 1;",
-                "class A {",
-                "  const A.foo() : this.bar();",
-                "  const A.bar([x = b]) : y = x;",
-                "  final int y;",
-                "}"]),
+    _assertProperDependencies(r'''
+const A a = const A.foo();
+const int b = 1;
+class A {
+  const A.foo() : this.bar();
+  const A.bar([x = b]) : y = x;
+  final int y;
+}''',
         []);
   }
 
   void test_dependencyOnNonFactoryRedirect_toMissing() {
     // a depends on A.foo() which depends on nothing, since A.bar() is
     // missing.
-    _assertProperDependencies(
-        EngineTestCase.createSource(
-            [
-                "const A a = const A.foo();",
-                "class A {",
-                "  const A.foo() : this.bar();",
-                "}"]),
+    _assertProperDependencies(r'''
+const A a = const A.foo();
+class A {
+  const A.foo() : this.bar();
+}''',
         [CompileTimeErrorCode.REDIRECT_GENERATIVE_TO_MISSING_CONSTRUCTOR]);
   }
 
   void test_dependencyOnNonFactoryRedirect_toNonConst() {
     // a depends on A.foo() which depends on nothing, since A.bar() is
     // non-const.
-    _assertProperDependencies(
-        EngineTestCase.createSource(
-            [
-                "const A a = const A.foo();",
-                "class A {",
-                "  const A.foo() : this.bar();",
-                "  A.bar();",
-                "}"]),
+    _assertProperDependencies(r'''
+const A a = const A.foo();
+class A {
+  const A.foo() : this.bar();
+  A.bar();
+}''',
         []);
   }
 
   void test_dependencyOnNonFactoryRedirect_unnamed() {
     // a depends on A.foo() depends on A()
-    _assertProperDependencies(
-        EngineTestCase.createSource(
-            [
-                "const A a = const A.foo();",
-                "class A {",
-                "  const A.foo() : this();",
-                "  const A();",
-                "}"]),
+    _assertProperDependencies(r'''
+const A a = const A.foo();
+class A {
+  const A.foo() : this();
+  const A();
+}''',
         []);
   }
 
   void test_dependencyOnOptionalParameterDefault() {
     // a depends on A() depends on B()
-    _assertProperDependencies(
-        EngineTestCase.createSource(
-            [
-                "class A {",
-                "  const A([x = const B()]) : b = x;",
-                "  final B b;",
-                "}",
-                "class B {",
-                "  const B();",
-                "}",
-                "const A a = const A();"]),
+    _assertProperDependencies(r'''
+class A {
+  const A([x = const B()]) : b = x;
+  final B b;
+}
+class B {
+  const B();
+}
+const A a = const A();''',
         []);
   }
 
   void test_dependencyOnVariable() {
     // x depends on y
-    _assertProperDependencies(
-        EngineTestCase.createSource(["const x = y + 1;", "const y = 2;"]),
+    _assertProperDependencies(r'''
+const x = y + 1;
+const y = 2;''',
         []);
   }
 
   void test_fromEnvironment_bool_default_false() {
-    JUnitTestCase.assertEquals(
-        false,
-        _assertValidBool(_check_fromEnvironment_bool(null, "false")));
+    expect(_assertValidBool(_check_fromEnvironment_bool(null, "false")), false);
   }
 
   void test_fromEnvironment_bool_default_overridden() {
-    JUnitTestCase.assertEquals(
-        false,
-        _assertValidBool(_check_fromEnvironment_bool("false", "true")));
+    expect(_assertValidBool(_check_fromEnvironment_bool("false", "true")), false);
   }
 
   void test_fromEnvironment_bool_default_parseError() {
-    JUnitTestCase.assertEquals(
-        true,
-        _assertValidBool(_check_fromEnvironment_bool("parseError", "true")));
+    expect(_assertValidBool(_check_fromEnvironment_bool("parseError", "true")), true);
   }
 
   void test_fromEnvironment_bool_default_true() {
-    JUnitTestCase.assertEquals(
-        true,
-        _assertValidBool(_check_fromEnvironment_bool(null, "true")));
+    expect(_assertValidBool(_check_fromEnvironment_bool(null, "true")), true);
   }
 
   void test_fromEnvironment_bool_false() {
-    JUnitTestCase.assertEquals(
-        false,
-        _assertValidBool(_check_fromEnvironment_bool("false", null)));
+    expect(_assertValidBool(_check_fromEnvironment_bool("false", null)), false);
   }
 
   void test_fromEnvironment_bool_parseError() {
-    JUnitTestCase.assertEquals(
-        false,
-        _assertValidBool(_check_fromEnvironment_bool("parseError", null)));
+    expect(_assertValidBool(_check_fromEnvironment_bool("parseError", null)), false);
   }
 
   void test_fromEnvironment_bool_true() {
-    JUnitTestCase.assertEquals(
-        true,
-        _assertValidBool(_check_fromEnvironment_bool("true", null)));
+    expect(_assertValidBool(_check_fromEnvironment_bool("true", null)), true);
   }
 
   void test_fromEnvironment_bool_undeclared() {
@@ -3959,27 +3841,19 @@
   }
 
   void test_fromEnvironment_int_default_overridden() {
-    JUnitTestCase.assertEquals(
-        234,
-        _assertValidInt(_check_fromEnvironment_int("234", "123")));
+    expect(_assertValidInt(_check_fromEnvironment_int("234", "123")), 234);
   }
 
   void test_fromEnvironment_int_default_parseError() {
-    JUnitTestCase.assertEquals(
-        123,
-        _assertValidInt(_check_fromEnvironment_int("parseError", "123")));
+    expect(_assertValidInt(_check_fromEnvironment_int("parseError", "123")), 123);
   }
 
   void test_fromEnvironment_int_default_undeclared() {
-    JUnitTestCase.assertEquals(
-        123,
-        _assertValidInt(_check_fromEnvironment_int(null, "123")));
+    expect(_assertValidInt(_check_fromEnvironment_int(null, "123")), 123);
   }
 
   void test_fromEnvironment_int_ok() {
-    JUnitTestCase.assertEquals(
-        234,
-        _assertValidInt(_check_fromEnvironment_int("234", null)));
+    expect(_assertValidInt(_check_fromEnvironment_int("234", null)), 234);
   }
 
   void test_fromEnvironment_int_parseError() {
@@ -3999,27 +3873,19 @@
   }
 
   void test_fromEnvironment_string_default_overridden() {
-    JUnitTestCase.assertEquals(
-        "abc",
-        _assertValidString(_check_fromEnvironment_string("abc", "'def'")));
+    expect(_assertValidString(_check_fromEnvironment_string("abc", "'def'")), "abc");
   }
 
   void test_fromEnvironment_string_default_undeclared() {
-    JUnitTestCase.assertEquals(
-        "def",
-        _assertValidString(_check_fromEnvironment_string(null, "'def'")));
+    expect(_assertValidString(_check_fromEnvironment_string(null, "'def'")), "def");
   }
 
   void test_fromEnvironment_string_empty() {
-    JUnitTestCase.assertEquals(
-        "",
-        _assertValidString(_check_fromEnvironment_string("", null)));
+    expect(_assertValidString(_check_fromEnvironment_string("", null)), "");
   }
 
   void test_fromEnvironment_string_ok() {
-    JUnitTestCase.assertEquals(
-        "abc",
-        _assertValidString(_check_fromEnvironment_string("abc", null)));
+    expect(_assertValidString(_check_fromEnvironment_string("abc", null)), "abc");
   }
 
   void test_fromEnvironment_string_undeclared() {
@@ -4031,18 +3897,16 @@
   }
 
   void test_instanceCreationExpression_computedField() {
-    CompilationUnit compilationUnit = resolveSource(
-        EngineTestCase.createSource(
-            [
-                "const foo = const A(4, 5);",
-                "class A {",
-                "  const A(int i, int j) : k = 2 * i + j;",
-                "  final int k;",
-                "}"]));
+    CompilationUnit compilationUnit = resolveSource(r'''
+const foo = const A(4, 5);
+class A {
+  const A(int i, int j) : k = 2 * i + j;
+  final int k;
+}''');
     EvaluationResultImpl result =
         _evaluateInstanceCreationExpression(compilationUnit, "foo");
     Map<String, DartObjectImpl> fields = _assertType(result, "A");
-    EngineTestCase.assertSizeOfMap(1, fields);
+    expect(fields, hasLength(1));
     _assertIntField(fields, "k", 13);
   }
 
@@ -4067,101 +3931,91 @@
   }
 
   void test_instanceCreationExpression_computedField_usesConstConstructor() {
-    CompilationUnit compilationUnit = resolveSource(
-        EngineTestCase.createSource(
-            [
-                "const foo = const A(3);",
-                "class A {",
-                "  const A(int i) : b = const B(4);",
-                "  final int b;",
-                "}",
-                "class B {",
-                "  const B(this.k);",
-                "  final int k;",
-                "}"]));
+    CompilationUnit compilationUnit = resolveSource(r'''
+const foo = const A(3);
+class A {
+  const A(int i) : b = const B(4);
+  final int b;
+}
+class B {
+  const B(this.k);
+  final int k;
+}''');
     EvaluationResultImpl result =
         _evaluateInstanceCreationExpression(compilationUnit, "foo");
     Map<String, DartObjectImpl> fieldsOfA = _assertType(result, "A");
-    EngineTestCase.assertSizeOfMap(1, fieldsOfA);
+    expect(fieldsOfA, hasLength(1));
     Map<String, DartObjectImpl> fieldsOfB =
         _assertFieldType(fieldsOfA, "b", "B");
-    EngineTestCase.assertSizeOfMap(1, fieldsOfB);
+    expect(fieldsOfB, hasLength(1));
     _assertIntField(fieldsOfB, "k", 4);
   }
 
   void test_instanceCreationExpression_computedField_usesStaticConst() {
-    CompilationUnit compilationUnit = resolveSource(
-        EngineTestCase.createSource(
-            [
-                "const foo = const A(3);",
-                "class A {",
-                "  const A(int i) : k = i + B.bar;",
-                "  final int k;",
-                "}",
-                "class B {",
-                "  static const bar = 4;",
-                "}"]));
+    CompilationUnit compilationUnit = resolveSource(r'''
+const foo = const A(3);
+class A {
+  const A(int i) : k = i + B.bar;
+  final int k;
+}
+class B {
+  static const bar = 4;
+}''');
     EvaluationResultImpl result =
         _evaluateInstanceCreationExpression(compilationUnit, "foo");
     Map<String, DartObjectImpl> fields = _assertType(result, "A");
-    EngineTestCase.assertSizeOfMap(1, fields);
+    expect(fields, hasLength(1));
     _assertIntField(fields, "k", 7);
   }
 
   void test_instanceCreationExpression_computedField_usesToplevelConst() {
-    CompilationUnit compilationUnit = resolveSource(
-        EngineTestCase.createSource(
-            [
-                "const foo = const A(3);",
-                "const bar = 4;",
-                "class A {",
-                "  const A(int i) : k = i + bar;",
-                "  final int k;",
-                "}"]));
+    CompilationUnit compilationUnit = resolveSource(r'''
+const foo = const A(3);
+const bar = 4;
+class A {
+  const A(int i) : k = i + bar;
+  final int k;
+}''');
     EvaluationResultImpl result =
         _evaluateInstanceCreationExpression(compilationUnit, "foo");
     Map<String, DartObjectImpl> fields = _assertType(result, "A");
-    EngineTestCase.assertSizeOfMap(1, fields);
+    expect(fields, hasLength(1));
     _assertIntField(fields, "k", 7);
   }
 
   void test_instanceCreationExpression_explicitSuper() {
-    CompilationUnit compilationUnit = resolveSource(
-        EngineTestCase.createSource(
-            [
-                "const foo = const B(4, 5);",
-                "class A {",
-                "  const A(this.x);",
-                "  final int x;",
-                "}",
-                "class B extends A {",
-                "  const B(int x, this.y) : super(x * 2);",
-                "  final int y;",
-                "}"]));
+    CompilationUnit compilationUnit = resolveSource(r'''
+const foo = const B(4, 5);
+class A {
+  const A(this.x);
+  final int x;
+}
+class B extends A {
+  const B(int x, this.y) : super(x * 2);
+  final int y;
+}''');
     EvaluationResultImpl result =
         _evaluateInstanceCreationExpression(compilationUnit, "foo");
     Map<String, DartObjectImpl> fields = _assertType(result, "B");
-    EngineTestCase.assertSizeOfMap(2, fields);
+    expect(fields, hasLength(2));
     _assertIntField(fields, "y", 5);
     Map<String, DartObjectImpl> superclassFields =
         _assertFieldType(fields, GenericState.SUPERCLASS_FIELD, "A");
-    EngineTestCase.assertSizeOfMap(1, superclassFields);
+    expect(superclassFields, hasLength(1));
     _assertIntField(superclassFields, "x", 8);
   }
 
   void test_instanceCreationExpression_fieldFormalParameter() {
-    CompilationUnit compilationUnit = resolveSource(
-        EngineTestCase.createSource(
-            [
-                "const foo = const A(42);",
-                "class A {",
-                "  int x;",
-                "  const A(this.x)",
-                "}"]));
+    CompilationUnit compilationUnit = resolveSource(r'''
+const foo = const A(42);
+class A {
+  int x;
+  const A(this.x)
+}''');
     EvaluationResultImpl result =
         _evaluateInstanceCreationExpression(compilationUnit, "foo");
     Map<String, DartObjectImpl> fields = _assertType(result, "A");
-    EngineTestCase.assertSizeOfMap(1, fields);
+    expect(fields, hasLength(1));
     _assertIntField(fields, "x", 42);
   }
 
@@ -4186,39 +4040,35 @@
   }
 
   void test_instanceCreationExpression_implicitSuper() {
-    CompilationUnit compilationUnit = resolveSource(
-        EngineTestCase.createSource(
-            [
-                "const foo = const B(4);",
-                "class A {",
-                "  const A() : x(3);",
-                "  final int x;",
-                "}",
-                "class B extends A {",
-                "  const B(this.y);",
-                "  final int y;",
-                "}"]));
+    CompilationUnit compilationUnit = resolveSource(r'''
+const foo = const B(4);
+class A {
+  const A() : x(3);
+  final int x;
+}
+class B extends A {
+  const B(this.y);
+  final int y;
+}''');
     EvaluationResultImpl result =
         _evaluateInstanceCreationExpression(compilationUnit, "foo");
     Map<String, DartObjectImpl> fields = _assertType(result, "B");
-    EngineTestCase.assertSizeOfMap(2, fields);
+    expect(fields, hasLength(2));
     _assertIntField(fields, "y", 4);
     Map<String, DartObjectImpl> superclassFields =
         _assertFieldType(fields, GenericState.SUPERCLASS_FIELD, "A");
-    EngineTestCase.assertSizeOfMap(1, superclassFields);
+    expect(superclassFields, hasLength(1));
     _assertIntField(superclassFields, "x", 3);
   }
 
   void test_instanceCreationExpression_nonFactoryRedirect() {
-    CompilationUnit compilationUnit = resolveSource(
-        EngineTestCase.createSource(
-            [
-                "const foo = const A.a1();",
-                "class A {",
-                "  const A.a1() : this.a2();",
-                "  const A.a2() : x = 5;",
-                "  final int x;",
-                "}"]));
+    CompilationUnit compilationUnit = resolveSource(r'''
+const foo = const A.a1();
+class A {
+  const A.a1() : this.a2();
+  const A.a2() : x = 5;
+  final int x;
+}''');
     Map<String, DartObjectImpl> aFields = _assertType(
         _evaluateInstanceCreationExpression(compilationUnit, "foo"),
         "A");
@@ -4226,15 +4076,13 @@
   }
 
   void test_instanceCreationExpression_nonFactoryRedirect_arg() {
-    CompilationUnit compilationUnit = resolveSource(
-        EngineTestCase.createSource(
-            [
-                "const foo = const A.a1(1);",
-                "class A {",
-                "  const A.a1(x) : this.a2(x + 100);",
-                "  const A.a2(x) : y = x + 10;",
-                "  final int y;",
-                "}"]));
+    CompilationUnit compilationUnit = resolveSource(r'''
+const foo = const A.a1(1);
+class A {
+  const A.a1(x) : this.a2(x + 100);
+  const A.a2(x) : y = x + 10;
+  final int y;
+}''');
     Map<String, DartObjectImpl> aFields = _assertType(
         _evaluateInstanceCreationExpression(compilationUnit, "foo"),
         "A");
@@ -4245,28 +4093,24 @@
     // It is an error to have a cycle in non-factory redirects; however, we
     // need to make sure that even if the error occurs, attempting to evaluate
     // the constant will terminate.
-    CompilationUnit compilationUnit = resolveSource(
-        EngineTestCase.createSource(
-            [
-                "const foo = const A();",
-                "class A {",
-                "  const A() : this.b();",
-                "  const A.b() : this();",
-                "}"]));
+    CompilationUnit compilationUnit = resolveSource(r'''
+const foo = const A();
+class A {
+  const A() : this.b();
+  const A.b() : this();
+}''');
     _assertValidUnknown(
         _evaluateInstanceCreationExpression(compilationUnit, "foo"));
   }
 
   void test_instanceCreationExpression_nonFactoryRedirect_defaultArg() {
-    CompilationUnit compilationUnit = resolveSource(
-        EngineTestCase.createSource(
-            [
-                "const foo = const A.a1();",
-                "class A {",
-                "  const A.a1() : this.a2();",
-                "  const A.a2([x = 100]) : y = x + 10;",
-                "  final int y;",
-                "}"]));
+    CompilationUnit compilationUnit = resolveSource(r'''
+const foo = const A.a1();
+class A {
+  const A.a1() : this.a2();
+  const A.a2([x = 100]) : y = x + 10;
+  final int y;
+}''');
     Map<String, DartObjectImpl> aFields = _assertType(
         _evaluateInstanceCreationExpression(compilationUnit, "foo"),
         "A");
@@ -4274,13 +4118,11 @@
   }
 
   void test_instanceCreationExpression_nonFactoryRedirect_toMissing() {
-    CompilationUnit compilationUnit = resolveSource(
-        EngineTestCase.createSource(
-            [
-                "const foo = const A.a1();",
-                "class A {",
-                "  const A.a1() : this.a2();",
-                "}"]));
+    CompilationUnit compilationUnit = resolveSource(r'''
+const foo = const A.a1();
+class A {
+  const A.a1() : this.a2();
+}''');
     // We don't care what value foo evaluates to (since there is a compile
     // error), but we shouldn't crash, and we should figure
     // out that it evaluates to an instance of class A.
@@ -4290,14 +4132,12 @@
   }
 
   void test_instanceCreationExpression_nonFactoryRedirect_toNonConst() {
-    CompilationUnit compilationUnit = resolveSource(
-        EngineTestCase.createSource(
-            [
-                "const foo = const A.a1();",
-                "class A {",
-                "  const A.a1() : this.a2();",
-                "  A.a2();",
-                "}"]));
+    CompilationUnit compilationUnit = resolveSource(r'''
+const foo = const A.a1();
+class A {
+  const A.a1() : this.a2();
+  A.a2();
+}''');
     // We don't care what value foo evaluates to (since there is a compile
     // error), but we shouldn't crash, and we should figure
     // out that it evaluates to an instance of class A.
@@ -4307,15 +4147,13 @@
   }
 
   void test_instanceCreationExpression_nonFactoryRedirect_unnamed() {
-    CompilationUnit compilationUnit = resolveSource(
-        EngineTestCase.createSource(
-            [
-                "const foo = const A.a1();",
-                "class A {",
-                "  const A.a1() : this();",
-                "  const A() : x = 5;",
-                "  final int x;",
-                "}"]));
+    CompilationUnit compilationUnit = resolveSource(r'''
+const foo = const A.a1();
+class A {
+  const A.a1() : this();
+  const A() : x = 5;
+  final int x;
+}''');
     Map<String, DartObjectImpl> aFields = _assertType(
         _evaluateInstanceCreationExpression(compilationUnit, "foo"),
         "A");
@@ -4323,39 +4161,35 @@
   }
 
   void test_instanceCreationExpression_redirect() {
-    CompilationUnit compilationUnit = resolveSource(
-        EngineTestCase.createSource(
-            [
-                "const foo = const A();",
-                "class A {",
-                "  const factory A() = B;",
-                "}",
-                "class B implements A {",
-                "  const B();",
-                "}"]));
+    CompilationUnit compilationUnit = resolveSource(r'''
+const foo = const A();
+class A {
+  const factory A() = B;
+}
+class B implements A {
+  const B();
+}''');
     _assertType(
         _evaluateInstanceCreationExpression(compilationUnit, "foo"),
         "B");
   }
 
   void test_instanceCreationExpression_redirectWithTypeParams() {
-    CompilationUnit compilationUnit = resolveSource(
-        EngineTestCase.createSource(
-            [
-                "class A {",
-                "  const factory A(var a) = B<int>;",
-                "}",
-                "",
-                "class B<T> implements A {",
-                "  final T x;",
-                "  const B(this.x);",
-                "}",
-                "",
-                "const A a = const A(10);"]));
+    CompilationUnit compilationUnit = resolveSource(r'''
+class A {
+  const factory A(var a) = B<int>;
+}
+
+class B<T> implements A {
+  final T x;
+  const B(this.x);
+}
+
+const A a = const A(10);''');
     EvaluationResultImpl result =
         _evaluateInstanceCreationExpression(compilationUnit, "a");
     Map<String, DartObjectImpl> fields = _assertType(result, "B<int>");
-    EngineTestCase.assertSizeOfMap(1, fields);
+    expect(fields, hasLength(1));
     _assertIntField(fields, "x", 10);
   }
 
@@ -4363,23 +4197,21 @@
     // To evaluate the redirection of A<int>,
     // A's template argument (T=int) must be substituted
     // into B's template argument (B<U> where U=T) to get B<int>.
-    CompilationUnit compilationUnit = resolveSource(
-        EngineTestCase.createSource(
-            [
-                "class A<T> {",
-                "  const factory A(var a) = B<T>;",
-                "}",
-                "",
-                "class B<U> implements A {",
-                "  final U x;",
-                "  const B(this.x);",
-                "}",
-                "",
-                "const A<int> a = const A<int>(10);"]));
+    CompilationUnit compilationUnit = resolveSource(r'''
+class A<T> {
+  const factory A(var a) = B<T>;
+}
+
+class B<U> implements A {
+  final U x;
+  const B(this.x);
+}
+
+const A<int> a = const A<int>(10);''');
     EvaluationResultImpl result =
         _evaluateInstanceCreationExpression(compilationUnit, "a");
     Map<String, DartObjectImpl> fields = _assertType(result, "B<int>");
-    EngineTestCase.assertSizeOfMap(1, fields);
+    expect(fields, hasLength(1));
     _assertIntField(fields, "x", 10);
   }
 
@@ -4387,22 +4219,22 @@
     // It is an error to have a cycle in factory redirects; however, we need
     // to make sure that even if the error occurs, attempting to evaluate the
     // constant will terminate.
-    CompilationUnit compilationUnit = resolveSource(
-        EngineTestCase.createSource(
-            [
-                "const foo = const A();",
-                "class A {",
-                "  const factory A() = A.b;",
-                "  const factory A.b() = A;",
-                "}"]));
+    CompilationUnit compilationUnit = resolveSource(r'''
+const foo = const A();
+class A {
+  const factory A() = A.b;
+  const factory A.b() = A;
+}''');
     _assertValidUnknown(
         _evaluateInstanceCreationExpression(compilationUnit, "foo"));
   }
 
   void test_instanceCreationExpression_redirect_extern() {
-    CompilationUnit compilationUnit = resolveSource(
-        EngineTestCase.createSource(
-            ["const foo = const A();", "class A {", "  external const factory A();", "}"]));
+    CompilationUnit compilationUnit = resolveSource(r'''
+const foo = const A();
+class A {
+  external const factory A();
+}''');
     _assertValidUnknown(
         _evaluateInstanceCreationExpression(compilationUnit, "foo"));
   }
@@ -4411,27 +4243,25 @@
     // It is an error for a const factory constructor redirect to a non-const
     // constructor; however, we need to make sure that even if the error
     // attempting to evaluate the constant won't cause a crash.
-    CompilationUnit compilationUnit = resolveSource(
-        EngineTestCase.createSource(
-            [
-                "const foo = const A();",
-                "class A {",
-                "  const factory A() = A.b;",
-                "  A.b();",
-                "}"]));
+    CompilationUnit compilationUnit = resolveSource(r'''
+const foo = const A();
+class A {
+  const factory A() = A.b;
+  A.b();
+}''');
     _assertValidUnknown(
         _evaluateInstanceCreationExpression(compilationUnit, "foo"));
   }
 
   void test_instanceCreationExpression_symbol() {
     CompilationUnit compilationUnit =
-        resolveSource(EngineTestCase.createSource(["const foo = const Symbol('a');"]));
+        resolveSource("const foo = const Symbol('a');");
     EvaluationResultImpl evaluationResult =
         _evaluateInstanceCreationExpression(compilationUnit, "foo");
-    JUnitTestCase.assertNotNull(evaluationResult.value);
+    expect(evaluationResult.value, isNotNull);
     DartObjectImpl value = evaluationResult.value;
-    JUnitTestCase.assertEquals(typeProvider.symbolType, value.type);
-    JUnitTestCase.assertEquals("a", value.value);
+    expect(value.type, typeProvider.symbolType);
+    expect(value.value, "a");
   }
 
   void test_instanceCreationExpression_withSupertypeParams_explicit() {
@@ -4443,14 +4273,12 @@
   }
 
   void test_instanceCreationExpression_withTypeParams() {
-    CompilationUnit compilationUnit = resolveSource(
-        EngineTestCase.createSource(
-            [
-                "class C<E> {",
-                "  const C();",
-                "}",
-                "const c_int = const C<int>();",
-                "const c_num = const C<num>();"]));
+    CompilationUnit compilationUnit = resolveSource(r'''
+class C<E> {
+  const C();
+}
+const c_int = const C<int>();
+const c_num = const C<num>();''');
     EvaluationResultImpl c_int =
         _evaluateInstanceCreationExpression(compilationUnit, "c_int");
     _assertType(c_int, "C<int>");
@@ -4459,80 +4287,65 @@
         _evaluateInstanceCreationExpression(compilationUnit, "c_num");
     _assertType(c_num, "C<num>");
     DartObjectImpl c_num_value = c_num.value;
-    JUnitTestCase.assertFalse(c_int_value == c_num_value);
+    expect(c_int_value == c_num_value, isFalse);
   }
 
   void test_isValidSymbol() {
-    JUnitTestCase.assertTrue(ConstantValueComputer.isValidPublicSymbol(""));
-    JUnitTestCase.assertTrue(ConstantValueComputer.isValidPublicSymbol("foo"));
-    JUnitTestCase.assertTrue(
-        ConstantValueComputer.isValidPublicSymbol("foo.bar"));
-    JUnitTestCase.assertTrue(
-        ConstantValueComputer.isValidPublicSymbol("foo\$"));
-    JUnitTestCase.assertTrue(
-        ConstantValueComputer.isValidPublicSymbol("foo\$bar"));
-    JUnitTestCase.assertTrue(ConstantValueComputer.isValidPublicSymbol("iff"));
-    JUnitTestCase.assertTrue(ConstantValueComputer.isValidPublicSymbol("gif"));
-    JUnitTestCase.assertTrue(ConstantValueComputer.isValidPublicSymbol("if\$"));
-    JUnitTestCase.assertTrue(ConstantValueComputer.isValidPublicSymbol("\$if"));
-    JUnitTestCase.assertTrue(ConstantValueComputer.isValidPublicSymbol("foo="));
-    JUnitTestCase.assertTrue(
-        ConstantValueComputer.isValidPublicSymbol("foo.bar="));
-    JUnitTestCase.assertTrue(
-        ConstantValueComputer.isValidPublicSymbol("foo.+"));
-    JUnitTestCase.assertTrue(ConstantValueComputer.isValidPublicSymbol("void"));
-    JUnitTestCase.assertFalse(
-        ConstantValueComputer.isValidPublicSymbol("_foo"));
-    JUnitTestCase.assertFalse(
-        ConstantValueComputer.isValidPublicSymbol("_foo.bar"));
-    JUnitTestCase.assertFalse(
-        ConstantValueComputer.isValidPublicSymbol("foo._bar"));
-    JUnitTestCase.assertFalse(ConstantValueComputer.isValidPublicSymbol("if"));
-    JUnitTestCase.assertFalse(
-        ConstantValueComputer.isValidPublicSymbol("if.foo"));
-    JUnitTestCase.assertFalse(
-        ConstantValueComputer.isValidPublicSymbol("foo.if"));
-    JUnitTestCase.assertFalse(
-        ConstantValueComputer.isValidPublicSymbol("foo=.bar"));
-    JUnitTestCase.assertFalse(
-        ConstantValueComputer.isValidPublicSymbol("foo."));
-    JUnitTestCase.assertFalse(
-        ConstantValueComputer.isValidPublicSymbol("+.foo"));
-    JUnitTestCase.assertFalse(
-        ConstantValueComputer.isValidPublicSymbol("void.foo"));
-    JUnitTestCase.assertFalse(
-        ConstantValueComputer.isValidPublicSymbol("foo.void"));
+    expect(ConstantValueComputer.isValidPublicSymbol(""), isTrue);
+    expect(ConstantValueComputer.isValidPublicSymbol("foo"), isTrue);
+    expect(ConstantValueComputer.isValidPublicSymbol("foo.bar"), isTrue);
+    expect(ConstantValueComputer.isValidPublicSymbol("foo\$"), isTrue);
+    expect(ConstantValueComputer.isValidPublicSymbol("foo\$bar"), isTrue);
+    expect(ConstantValueComputer.isValidPublicSymbol("iff"), isTrue);
+    expect(ConstantValueComputer.isValidPublicSymbol("gif"), isTrue);
+    expect(ConstantValueComputer.isValidPublicSymbol("if\$"), isTrue);
+    expect(ConstantValueComputer.isValidPublicSymbol("\$if"), isTrue);
+    expect(ConstantValueComputer.isValidPublicSymbol("foo="), isTrue);
+    expect(ConstantValueComputer.isValidPublicSymbol("foo.bar="), isTrue);
+    expect(ConstantValueComputer.isValidPublicSymbol("foo.+"), isTrue);
+    expect(ConstantValueComputer.isValidPublicSymbol("void"), isTrue);
+    expect(ConstantValueComputer.isValidPublicSymbol("_foo"), isFalse);
+    expect(ConstantValueComputer.isValidPublicSymbol("_foo.bar"), isFalse);
+    expect(ConstantValueComputer.isValidPublicSymbol("foo._bar"), isFalse);
+    expect(ConstantValueComputer.isValidPublicSymbol("if"), isFalse);
+    expect(ConstantValueComputer.isValidPublicSymbol("if.foo"), isFalse);
+    expect(ConstantValueComputer.isValidPublicSymbol("foo.if"), isFalse);
+    expect(ConstantValueComputer.isValidPublicSymbol("foo=.bar"), isFalse);
+    expect(ConstantValueComputer.isValidPublicSymbol("foo."), isFalse);
+    expect(ConstantValueComputer.isValidPublicSymbol("+.foo"), isFalse);
+    expect(ConstantValueComputer.isValidPublicSymbol("void.foo"), isFalse);
+    expect(ConstantValueComputer.isValidPublicSymbol("foo.void"), isFalse);
   }
 
   void test_symbolLiteral_void() {
     CompilationUnit compilationUnit =
-        resolveSource(EngineTestCase.createSource(["const voidSymbol = #void;"]));
+        resolveSource("const voidSymbol = #void;");
     VariableDeclaration voidSymbol =
         findTopLevelDeclaration(compilationUnit, "voidSymbol");
     EvaluationResultImpl voidSymbolResult =
         (voidSymbol.element as VariableElementImpl).evaluationResult;
     DartObjectImpl value = voidSymbolResult.value;
-    JUnitTestCase.assertEquals(typeProvider.symbolType, value.type);
-    JUnitTestCase.assertEquals("void", value.value);
+    expect(value.type, typeProvider.symbolType);
+    expect(value.value, "void");
   }
 
   Map<String, DartObjectImpl> _assertFieldType(Map<String,
       DartObjectImpl> fields, String fieldName, String expectedType) {
     DartObjectImpl field = fields[fieldName];
-    JUnitTestCase.assertEquals(expectedType, field.type.displayName);
+    expect(field.type.displayName, expectedType);
     return field.fields;
   }
 
   void _assertIntField(Map<String, DartObjectImpl> fields, String fieldName,
       int expectedValue) {
     DartObjectImpl field = fields[fieldName];
-    JUnitTestCase.assertEquals("int", field.type.name);
-    JUnitTestCase.assertEquals(expectedValue, field.intValue);
+    expect(field.type.name, "int");
+    expect(field.intValue, expectedValue);
   }
 
   void _assertNullField(Map<String, DartObjectImpl> fields, String fieldName) {
     DartObjectImpl field = fields[fieldName];
-    JUnitTestCase.assertTrue(field.isNull);
+    expect(field.isNull, isTrue);
   }
 
   void _assertProperDependencies(String sourceText,
@@ -4541,7 +4354,7 @@
     LibraryElement element = resolve(source);
     CompilationUnit unit =
         analysisContext.resolveCompilationUnit(source, element);
-    JUnitTestCase.assertNotNull(unit);
+    expect(unit, isNotNull);
     ConstantValueComputer computer = _makeConstantValueComputer();
     computer.add(unit);
     computer.computeValues();
@@ -4550,45 +4363,45 @@
 
   Map<String, DartObjectImpl> _assertType(EvaluationResultImpl result,
       String typeName) {
-    JUnitTestCase.assertNotNull(result.value);
+    expect(result.value, isNotNull);
     DartObjectImpl value = result.value;
-    JUnitTestCase.assertEquals(typeName, value.type.displayName);
+    expect(value.type.displayName, typeName);
     return value.fields;
   }
 
   bool _assertValidBool(EvaluationResultImpl result) {
-    JUnitTestCase.assertNotNull(result.value);
+    expect(result.value, isNotNull);
     DartObjectImpl value = result.value;
-    JUnitTestCase.assertEquals(typeProvider.boolType, value.type);
+    expect(value.type, typeProvider.boolType);
     bool boolValue = value.boolValue;
-    JUnitTestCase.assertNotNull(boolValue);
+    expect(boolValue, isNotNull);
     return boolValue;
   }
 
   int _assertValidInt(EvaluationResultImpl result) {
-    JUnitTestCase.assertNotNull(result.value);
+    expect(result.value, isNotNull);
     DartObjectImpl value = result.value;
-    JUnitTestCase.assertEquals(typeProvider.intType, value.type);
+    expect(value.type, typeProvider.intType);
     return value.intValue;
   }
 
   void _assertValidNull(EvaluationResultImpl result) {
-    JUnitTestCase.assertNotNull(result.value);
+    expect(result.value, isNotNull);
     DartObjectImpl value = result.value;
-    JUnitTestCase.assertEquals(typeProvider.nullType, value.type);
+    expect(value.type, typeProvider.nullType);
   }
 
   String _assertValidString(EvaluationResultImpl result) {
-    JUnitTestCase.assertNotNull(result.value);
+    expect(result.value, isNotNull);
     DartObjectImpl value = result.value;
-    JUnitTestCase.assertEquals(typeProvider.stringType, value.type);
+    expect(value.type, typeProvider.stringType);
     return value.stringValue;
   }
 
   void _assertValidUnknown(EvaluationResultImpl result) {
-    JUnitTestCase.assertNotNull(result.value);
+    expect(result.value, isNotNull);
     DartObjectImpl value = result.value;
-    JUnitTestCase.assertTrue(value.isUnknown);
+    expect(value.isUnknown, isTrue);
   }
 
   void _checkInstanceCreationOptionalParams(bool isFieldFormal, bool isNamed,
@@ -4596,20 +4409,18 @@
     String fieldName = "j";
     String paramName = isFieldFormal ? fieldName : "i";
     String formalParam =
-        "${(isFieldFormal ? "this." : "int ")}${paramName}${(hasDefault ? " = 3" : "")}";
-    CompilationUnit compilationUnit = resolveSource(
-        EngineTestCase.createSource(
-            [
-                "const x = const A();",
-                "const y = const A(${(isNamed ? "${paramName}: " : "")}10);",
-                "class A {",
-                "  const A(${(isNamed ? "{${formalParam}}" : "[${formalParam}]")})${(isFieldFormal ? "" : " : ${fieldName} = ${paramName}")};",
-                "  final int ${fieldName};",
-                "}"]));
+        "${isFieldFormal ? "this." : "int "}$paramName${hasDefault ? " = 3" : ""}";
+    CompilationUnit compilationUnit = resolveSource("""
+const x = const A();
+const y = const A(${isNamed ? '$paramName: ' : ''}10);
+class A {
+  const A(${isNamed ? "{$formalParam}" : "[$formalParam]"})${isFieldFormal ? "" : " : $fieldName = $paramName"};
+  final int $fieldName;
+}""");
     EvaluationResultImpl x =
         _evaluateInstanceCreationExpression(compilationUnit, "x");
     Map<String, DartObjectImpl> fieldsOfX = _assertType(x, "A");
-    EngineTestCase.assertSizeOfMap(1, fieldsOfX);
+    expect(fieldsOfX, hasLength(1));
     if (hasDefault) {
       _assertIntField(fieldsOfX, fieldName, 3);
     } else {
@@ -4618,26 +4429,24 @@
     EvaluationResultImpl y =
         _evaluateInstanceCreationExpression(compilationUnit, "y");
     Map<String, DartObjectImpl> fieldsOfY = _assertType(y, "A");
-    EngineTestCase.assertSizeOfMap(1, fieldsOfY);
+    expect(fieldsOfY, hasLength(1));
     _assertIntField(fieldsOfY, fieldName, 10);
   }
 
   void _checkInstanceCreation_withSupertypeParams(bool isExplicit) {
     String superCall = isExplicit ? " : super()" : "";
-    CompilationUnit compilationUnit = resolveSource(
-        EngineTestCase.createSource(
-            [
-                "class A<T> {",
-                "  const A();",
-                "}",
-                "class B<T, U> extends A<T> {",
-                "  const B()${superCall};",
-                "}",
-                "class C<T, U> extends A<U> {",
-                "  const C()${superCall};",
-                "}",
-                "const b_int_num = const B<int, num>();",
-                "const c_int_num = const C<int, num>();"]));
+    CompilationUnit compilationUnit = resolveSource("""
+class A<T> {
+  const A();
+}
+class B<T, U> extends A<T> {
+  const B()$superCall;
+}
+class C<T, U> extends A<U> {
+  const C()$superCall;
+}
+const b_int_num = const B<int, num>();
+const c_int_num = const C<int, num>();""");
     EvaluationResultImpl b_int_num =
         _evaluateInstanceCreationExpression(compilationUnit, "b_int_num");
     Map<String, DartObjectImpl> b_int_num_fields =
@@ -4658,11 +4467,9 @@
       analysisContext2.declaredVariables.define(envVarName, valueInEnvironment);
     }
     String defaultArg =
-        defaultExpr == null ? "" : ", defaultValue: ${defaultExpr}";
+        defaultExpr == null ? "" : ", defaultValue: $defaultExpr";
     CompilationUnit compilationUnit = resolveSource(
-        EngineTestCase.createSource(
-            [
-                "const ${varName} = const bool.fromEnvironment('${envVarName}'${defaultArg});"]));
+                "const $varName = const bool.fromEnvironment('$envVarName'$defaultArg);");
     return _evaluateInstanceCreationExpression(compilationUnit, varName);
   }
 
@@ -4674,11 +4481,9 @@
       analysisContext2.declaredVariables.define(envVarName, valueInEnvironment);
     }
     String defaultArg =
-        defaultExpr == null ? "" : ", defaultValue: ${defaultExpr}";
+        defaultExpr == null ? "" : ", defaultValue: $defaultExpr";
     CompilationUnit compilationUnit = resolveSource(
-        EngineTestCase.createSource(
-            [
-                "const ${varName} = const int.fromEnvironment('${envVarName}'${defaultArg});"]));
+                "const $varName = const int.fromEnvironment('$envVarName'$defaultArg);");
     return _evaluateInstanceCreationExpression(compilationUnit, varName);
   }
 
@@ -4690,11 +4495,9 @@
       analysisContext2.declaredVariables.define(envVarName, valueInEnvironment);
     }
     String defaultArg =
-        defaultExpr == null ? "" : ", defaultValue: ${defaultExpr}";
+        defaultExpr == null ? "" : ", defaultValue: $defaultExpr";
     CompilationUnit compilationUnit = resolveSource(
-        EngineTestCase.createSource(
-            [
-                "const ${varName} = const String.fromEnvironment('${envVarName}'${defaultArg});"]));
+                "const $varName = const String.fromEnvironment('$envVarName'$defaultArg);");
     return _evaluateInstanceCreationExpression(compilationUnit, varName);
   }
 
@@ -4715,12 +4518,12 @@
   void _validate(bool shouldBeValid, VariableDeclarationList declarationList) {
     for (VariableDeclaration declaration in declarationList.variables) {
       VariableElementImpl element = declaration.element as VariableElementImpl;
-      JUnitTestCase.assertNotNull(element);
+      expect(element, isNotNull);
       EvaluationResultImpl result = element.evaluationResult;
       if (shouldBeValid) {
-        JUnitTestCase.assertNotNull(result.value);
+        expect(result.value, isNotNull);
       } else {
-        JUnitTestCase.assertNull(result.value);
+        expect(result.value, isNull);
       }
     }
   }
@@ -4742,8 +4545,7 @@
     // If we are getting the evaluation result for a node in the graph,
     // make sure we properly recorded the dependency.
     if (_referenceGraph.nodes.contains(node)) {
-      JUnitTestCase.assertTrue(
-          _referenceGraph.containsPath(_nodeBeingEvaluated, node));
+      expect(_referenceGraph.containsPath(_nodeBeingEvaluated, node), isTrue);
     }
   }
 }
@@ -4810,7 +4612,7 @@
         new ErrorReporter(errorListener, _dummySource());
     DartObjectImpl result = expression.accept(
         new ConstantVisitor.con1(new TestTypeProvider(), errorReporter));
-    JUnitTestCase.assertNull(result);
+    expect(result, isNull);
     errorListener.assertErrorsWithCodes(
         [CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL]);
   }
@@ -4827,7 +4629,7 @@
         new ErrorReporter(errorListener, _dummySource());
     DartObjectImpl result = expression.accept(
         new ConstantVisitor.con1(new TestTypeProvider(), errorReporter));
-    JUnitTestCase.assertNull(result);
+    expect(result, isNull);
     errorListener.assertErrorsWithCodes(
         [CompileTimeErrorCode.INVALID_CONSTANT]);
   }
@@ -4844,7 +4646,7 @@
         new ErrorReporter(errorListener, _dummySource());
     DartObjectImpl result = expression.accept(
         new ConstantVisitor.con1(new TestTypeProvider(), errorReporter));
-    JUnitTestCase.assertNull(result);
+    expect(result, isNull);
     errorListener.assertErrorsWithCodes(
         [CompileTimeErrorCode.INVALID_CONSTANT]);
   }
@@ -4868,7 +4670,9 @@
 
   void test_visitSimpleIdentifier_inEnvironment() {
     CompilationUnit compilationUnit =
-        resolveSource(EngineTestCase.createSource(["const a = b;", "const b = 3;"]));
+        resolveSource(r'''
+const a = b;
+const b = 3;''');
     Map<String, DartObjectImpl> environment = new Map<String, DartObjectImpl>();
     DartObjectImpl six =
         new DartObjectImpl(typeProvider.intType, new IntState(6));
@@ -4878,7 +4682,9 @@
 
   void test_visitSimpleIdentifier_notInEnvironment() {
     CompilationUnit compilationUnit =
-        resolveSource(EngineTestCase.createSource(["const a = b;", "const b = 3;"]));
+        resolveSource(r'''
+const a = b;
+const b = 3;''');
     Map<String, DartObjectImpl> environment = new Map<String, DartObjectImpl>();
     DartObjectImpl six =
         new DartObjectImpl(typeProvider.intType, new IntState(6));
@@ -4888,14 +4694,16 @@
 
   void test_visitSimpleIdentifier_withoutEnvironment() {
     CompilationUnit compilationUnit =
-        resolveSource(EngineTestCase.createSource(["const a = b;", "const b = 3;"]));
+        resolveSource(r'''
+const a = b;
+const b = 3;''');
     _assertValue(3, _evaluateConstant(compilationUnit, "a", null));
   }
 
   void _assertValue(int expectedValue, DartObjectImpl result) {
-    JUnitTestCase.assertNotNull(result);
-    JUnitTestCase.assertEquals("int", result.type.name);
-    JUnitTestCase.assertEquals(expectedValue, result.intValue);
+    expect(result, isNotNull);
+    expect(result.type.name, "int");
+    expect(result.intValue, expectedValue);
   }
 
   NonExistingSource _dummySource() {
@@ -4917,21 +4725,21 @@
 }
 
 
-class ContentCacheTest extends JUnitTestCase {
+class ContentCacheTest {
   void test_setContents() {
     Source source = new TestSource();
     ContentCache cache = new ContentCache();
-    JUnitTestCase.assertNull(cache.getContents(source));
-    JUnitTestCase.assertNull(cache.getModificationStamp(source));
+    expect(cache.getContents(source), isNull);
+    expect(cache.getModificationStamp(source), isNull);
     String contents = "library lib;";
-    JUnitTestCase.assertNull(cache.setContents(source, contents));
-    JUnitTestCase.assertEquals(contents, cache.getContents(source));
-    JUnitTestCase.assertNotNull(cache.getModificationStamp(source));
-    JUnitTestCase.assertEquals(contents, cache.setContents(source, contents));
-    JUnitTestCase.assertEquals(contents, cache.setContents(source, null));
-    JUnitTestCase.assertNull(cache.getContents(source));
-    JUnitTestCase.assertNull(cache.getModificationStamp(source));
-    JUnitTestCase.assertNull(cache.setContents(source, null));
+    expect(cache.setContents(source, contents), isNull);
+    expect(cache.getContents(source), contents);
+    expect(cache.getModificationStamp(source), isNotNull);
+    expect(cache.setContents(source, contents), contents);
+    expect(cache.setContents(source, null), contents);
+    expect(cache.getContents(source), isNull);
+    expect(cache.getModificationStamp(source), isNull);
+    expect(cache.setContents(source, null), isNull);
   }
 }
 
@@ -4940,21 +4748,21 @@
   TypeProvider _typeProvider = new TestTypeProvider();
 
   void fail_add_knownString_knownString() {
-    JUnitTestCase.fail("New constant semantics are not yet enabled");
+    fail("New constant semantics are not yet enabled");
     _assertAdd(_stringValue("ab"), _stringValue("a"), _stringValue("b"));
   }
 
   void fail_add_knownString_unknownString() {
-    JUnitTestCase.fail("New constant semantics are not yet enabled");
+    fail("New constant semantics are not yet enabled");
     _assertAdd(_stringValue(null), _stringValue("a"), _stringValue(null));
   }
 
   void fail_add_unknownString_knownString() {
-    JUnitTestCase.fail("New constant semantics are not yet enabled");
+    fail("New constant semantics are not yet enabled");
     _assertAdd(_stringValue(null), _stringValue(null), _stringValue("b"));
   }
   void fail_add_unknownString_unknownString() {
-    JUnitTestCase.fail("New constant semantics are not yet enabled");
+    fail("New constant semantics are not yet enabled");
     _assertAdd(_stringValue(null), _stringValue(null), _stringValue(null));
   }
 
@@ -5252,87 +5060,83 @@
   }
 
   void test_equals_list_false_differentSizes() {
-    JUnitTestCase.assertFalse(
-        _listValue([_boolValue(true)]) ==
-            _listValue([_boolValue(true), _boolValue(false)]));
+    expect(_listValue([_boolValue(true)]) ==
+            _listValue([_boolValue(true), _boolValue(false)]), isFalse);
   }
 
   void test_equals_list_false_sameSize() {
-    JUnitTestCase.assertFalse(
-        _listValue([_boolValue(true)]) == _listValue([_boolValue(false)]));
+    expect(_listValue([_boolValue(true)]) == _listValue([_boolValue(false)]), isFalse);
   }
 
   void test_equals_list_true_empty() {
-    JUnitTestCase.assertEquals(_listValue([]), _listValue([]));
+    expect(_listValue([]), _listValue([]));
   }
 
   void test_equals_list_true_nonEmpty() {
-    JUnitTestCase.assertEquals(
-        _listValue([_boolValue(true)]),
-        _listValue([_boolValue(true)]));
+    expect(_listValue([_boolValue(true)]), _listValue([_boolValue(true)]));
   }
 
   void test_equals_map_true_empty() {
-    JUnitTestCase.assertEquals(_mapValue([]), _mapValue([]));
+    expect(_mapValue([]), _mapValue([]));
   }
 
   void test_equals_symbol_false() {
-    JUnitTestCase.assertFalse(_symbolValue("a") == _symbolValue("b"));
+    expect(_symbolValue("a") == _symbolValue("b"), isFalse);
   }
 
   void test_equals_symbol_true() {
-    JUnitTestCase.assertEquals(_symbolValue("a"), _symbolValue("a"));
+    expect(_symbolValue("a"), _symbolValue("a"));
   }
 
   void test_getValue_bool_false() {
-    JUnitTestCase.assertEquals(false, _boolValue(false).value);
+    expect(_boolValue(false).value, false);
   }
 
   void test_getValue_bool_true() {
-    JUnitTestCase.assertEquals(true, _boolValue(true).value);
+    expect(_boolValue(true).value, true);
   }
 
   void test_getValue_bool_unknown() {
-    JUnitTestCase.assertNull(_boolValue(null).value);
+    expect(_boolValue(null).value, isNull);
   }
 
   void test_getValue_double_known() {
     double value = 2.3;
-    JUnitTestCase.assertEquals(value, _doubleValue(value).value);
+    expect(_doubleValue(value).value, value);
   }
 
   void test_getValue_double_unknown() {
-    JUnitTestCase.assertNull(_doubleValue(null).value);
+    expect(_doubleValue(null).value, isNull);
   }
 
   void test_getValue_int_known() {
     int value = 23;
-    JUnitTestCase.assertEquals(value, _intValue(value).value);
+    expect(_intValue(value).value, value);
   }
 
   void test_getValue_int_unknown() {
-    JUnitTestCase.assertNull(_intValue(null).value);
+    expect(_intValue(null).value, isNull);
   }
 
   void test_getValue_list_empty() {
     Object result = _listValue([]).value;
     _assertInstanceOfObjectArray(result);
     List<Object> array = result as List<Object>;
-    EngineTestCase.assertLength(0, array);
+    expect(array, hasLength(0));
   }
 
   void test_getValue_list_valid() {
     Object result = _listValue([_intValue(23)]).value;
     _assertInstanceOfObjectArray(result);
     List<Object> array = result as List<Object>;
-    EngineTestCase.assertLength(1, array);
+    expect(array, hasLength(1));
   }
 
   void test_getValue_map_empty() {
     Object result = _mapValue([]).value;
     EngineTestCase.assertInstanceOf((obj) => obj is Map, Map, result);
     Map map = result as Map;
-    EngineTestCase.assertSizeOfMap(0, map);
+    expect(map, hasLength(0));
   }
 
   void test_getValue_map_valid() {
@@ -5340,20 +5144,20 @@
         _mapValue([_stringValue("key"), _stringValue("value")]).value;
     EngineTestCase.assertInstanceOf((obj) => obj is Map, Map, result);
     Map map = result as Map;
-    EngineTestCase.assertSizeOfMap(1, map);
+    expect(map, hasLength(1));
   }
 
   void test_getValue_null() {
-    JUnitTestCase.assertNull(_nullValue().value);
+    expect(_nullValue().value, isNull);
   }
 
   void test_getValue_string_known() {
     String value = "twenty-three";
-    JUnitTestCase.assertEquals(value, _stringValue(value).value);
+    expect(_stringValue(value).value, value);
   }
 
   void test_getValue_string_unknown() {
-    JUnitTestCase.assertNull(_stringValue(null).value);
+    expect(_stringValue(null).value, isNull);
   }
 
   void test_greaterThanOrEqual_knownDouble_knownDouble_false() {
@@ -5515,82 +5319,79 @@
   }
 
   void test_hasExactValue_bool_false() {
-    JUnitTestCase.assertTrue(_boolValue(false).hasExactValue);
+    expect(_boolValue(false).hasExactValue, isTrue);
   }
 
   void test_hasExactValue_bool_true() {
-    JUnitTestCase.assertTrue(_boolValue(true).hasExactValue);
+    expect(_boolValue(true).hasExactValue, isTrue);
   }
 
   void test_hasExactValue_bool_unknown() {
-    JUnitTestCase.assertTrue(_boolValue(null).hasExactValue);
+    expect(_boolValue(null).hasExactValue, isTrue);
   }
 
   void test_hasExactValue_double_known() {
-    JUnitTestCase.assertTrue(_doubleValue(2.3).hasExactValue);
+    expect(_doubleValue(2.3).hasExactValue, isTrue);
   }
 
   void test_hasExactValue_double_unknown() {
-    JUnitTestCase.assertTrue(_doubleValue(null).hasExactValue);
+    expect(_doubleValue(null).hasExactValue, isTrue);
   }
 
   void test_hasExactValue_dynamic() {
-    JUnitTestCase.assertFalse(_dynamicValue().hasExactValue);
+    expect(_dynamicValue().hasExactValue, isFalse);
   }
 
   void test_hasExactValue_int_known() {
-    JUnitTestCase.assertTrue(_intValue(23).hasExactValue);
+    expect(_intValue(23).hasExactValue, isTrue);
   }
 
   void test_hasExactValue_int_unknown() {
-    JUnitTestCase.assertTrue(_intValue(null).hasExactValue);
+    expect(_intValue(null).hasExactValue, isTrue);
   }
 
   void test_hasExactValue_list_empty() {
-    JUnitTestCase.assertTrue(_listValue([]).hasExactValue);
+    expect(_listValue([]).hasExactValue, isTrue);
   }
 
   void test_hasExactValue_list_invalid() {
-    JUnitTestCase.assertFalse(_dynamicValue().hasExactValue);
+    expect(_dynamicValue().hasExactValue, isFalse);
   }
 
   void test_hasExactValue_list_valid() {
-    JUnitTestCase.assertTrue(_listValue([_intValue(23)]).hasExactValue);
+    expect(_listValue([_intValue(23)]).hasExactValue, isTrue);
   }
 
   void test_hasExactValue_map_empty() {
-    JUnitTestCase.assertTrue(_mapValue([]).hasExactValue);
+    expect(_mapValue([]).hasExactValue, isTrue);
   }
 
   void test_hasExactValue_map_invalidKey() {
-    JUnitTestCase.assertFalse(
-        _mapValue([_dynamicValue(), _stringValue("value")]).hasExactValue);
+    expect(_mapValue([_dynamicValue(), _stringValue("value")]).hasExactValue, isFalse);
   }
 
   void test_hasExactValue_map_invalidValue() {
-    JUnitTestCase.assertFalse(
-        _mapValue([_stringValue("key"), _dynamicValue()]).hasExactValue);
+    expect(_mapValue([_stringValue("key"), _dynamicValue()]).hasExactValue, isFalse);
   }
 
   void test_hasExactValue_map_valid() {
-    JUnitTestCase.assertTrue(
-        _mapValue([_stringValue("key"), _stringValue("value")]).hasExactValue);
+    expect(_mapValue([_stringValue("key"), _stringValue("value")]).hasExactValue, isTrue);
   }
 
   void test_hasExactValue_null() {
-    JUnitTestCase.assertTrue(_nullValue().hasExactValue);
+    expect(_nullValue().hasExactValue, isTrue);
   }
 
   void test_hasExactValue_num() {
-    JUnitTestCase.assertFalse(_numValue().hasExactValue);
+    expect(_numValue().hasExactValue, isFalse);
   }
 
   void test_hasExactValue_string_known() {
-    JUnitTestCase.assertTrue(_stringValue("twenty-three").hasExactValue);
+    expect(_stringValue("twenty-three").hasExactValue, isTrue);
   }
 
   void test_hasExactValue_string_unknown() {
-    JUnitTestCase.assertTrue(_stringValue(null).hasExactValue);
+    expect(_stringValue(null).hasExactValue, isTrue);
   }
 
   void test_integerDivide_knownDouble_knownDouble() {
@@ -5652,56 +5453,55 @@
   }
 
   void test_isBoolNumStringOrNull_bool_false() {
-    JUnitTestCase.assertTrue(_boolValue(false).isBoolNumStringOrNull);
+    expect(_boolValue(false).isBoolNumStringOrNull, isTrue);
   }
 
   void test_isBoolNumStringOrNull_bool_true() {
-    JUnitTestCase.assertTrue(_boolValue(true).isBoolNumStringOrNull);
+    expect(_boolValue(true).isBoolNumStringOrNull, isTrue);
   }
 
   void test_isBoolNumStringOrNull_bool_unknown() {
-    JUnitTestCase.assertTrue(_boolValue(null).isBoolNumStringOrNull);
+    expect(_boolValue(null).isBoolNumStringOrNull, isTrue);
   }
 
   void test_isBoolNumStringOrNull_double_known() {
-    JUnitTestCase.assertTrue(_doubleValue(2.3).isBoolNumStringOrNull);
+    expect(_doubleValue(2.3).isBoolNumStringOrNull, isTrue);
   }
 
   void test_isBoolNumStringOrNull_double_unknown() {
-    JUnitTestCase.assertTrue(_doubleValue(null).isBoolNumStringOrNull);
+    expect(_doubleValue(null).isBoolNumStringOrNull, isTrue);
   }
 
   void test_isBoolNumStringOrNull_dynamic() {
-    JUnitTestCase.assertTrue(_dynamicValue().isBoolNumStringOrNull);
+    expect(_dynamicValue().isBoolNumStringOrNull, isTrue);
   }
 
   void test_isBoolNumStringOrNull_int_known() {
-    JUnitTestCase.assertTrue(_intValue(23).isBoolNumStringOrNull);
+    expect(_intValue(23).isBoolNumStringOrNull, isTrue);
   }
 
   void test_isBoolNumStringOrNull_int_unknown() {
-    JUnitTestCase.assertTrue(_intValue(null).isBoolNumStringOrNull);
+    expect(_intValue(null).isBoolNumStringOrNull, isTrue);
   }
 
   void test_isBoolNumStringOrNull_list() {
-    JUnitTestCase.assertFalse(_listValue([]).isBoolNumStringOrNull);
+    expect(_listValue([]).isBoolNumStringOrNull, isFalse);
   }
 
   void test_isBoolNumStringOrNull_null() {
-    JUnitTestCase.assertTrue(_nullValue().isBoolNumStringOrNull);
+    expect(_nullValue().isBoolNumStringOrNull, isTrue);
   }
 
   void test_isBoolNumStringOrNull_num() {
-    JUnitTestCase.assertTrue(_numValue().isBoolNumStringOrNull);
+    expect(_numValue().isBoolNumStringOrNull, isTrue);
   }
 
   void test_isBoolNumStringOrNull_string_known() {
-    JUnitTestCase.assertTrue(
-        _stringValue("twenty-three").isBoolNumStringOrNull);
+    expect(_stringValue("twenty-three").isBoolNumStringOrNull, isTrue);
   }
 
   void test_isBoolNumStringOrNull_string_unknown() {
-    JUnitTestCase.assertTrue(_stringValue(null).isBoolNumStringOrNull);
+    expect(_stringValue(null).isBoolNumStringOrNull, isTrue);
   }
 
   void test_lessThanOrEqual_knownDouble_knownDouble_false() {
@@ -5857,7 +5657,7 @@
   void test_logicalAnd_false_null() {
     try {
       _assertLogicalAnd(_boolValue(false), _boolValue(false), _nullValue());
-      JUnitTestCase.fail("Expected EvaluationException");
+      fail("Expected EvaluationException");
     } on EvaluationException catch (exception) {
     }
   }
@@ -5868,7 +5668,7 @@
           _boolValue(false),
           _boolValue(false),
           _stringValue("false"));
-      JUnitTestCase.fail("Expected EvaluationException");
+      fail("Expected EvaluationException");
     } on EvaluationException catch (exception) {
     }
   }
@@ -5880,7 +5680,7 @@
   void test_logicalAnd_null_false() {
     try {
       _assertLogicalAnd(_boolValue(false), _nullValue(), _boolValue(false));
-      JUnitTestCase.fail("Expected EvaluationException");
+      fail("Expected EvaluationException");
     } on EvaluationException catch (exception) {
     }
   }
@@ -5888,7 +5688,7 @@
   void test_logicalAnd_null_true() {
     try {
       _assertLogicalAnd(_boolValue(false), _nullValue(), _boolValue(true));
-      JUnitTestCase.fail("Expected EvaluationException");
+      fail("Expected EvaluationException");
     } on EvaluationException catch (exception) {
     }
   }
@@ -5899,7 +5699,7 @@
           _boolValue(false),
           _stringValue("true"),
           _boolValue(false));
-      JUnitTestCase.fail("Expected EvaluationException");
+      fail("Expected EvaluationException");
     } on EvaluationException catch (exception) {
     }
   }
@@ -5910,7 +5710,7 @@
           _boolValue(false),
           _stringValue("false"),
           _boolValue(true));
-      JUnitTestCase.fail("Expected EvaluationException");
+      fail("Expected EvaluationException");
     } on EvaluationException catch (exception) {
     }
   }
@@ -5929,7 +5729,7 @@
           _boolValue(false),
           _boolValue(true),
           _stringValue("true"));
-      JUnitTestCase.fail("Expected EvaluationException");
+      fail("Expected EvaluationException");
     } on EvaluationException catch (exception) {
     }
   }
@@ -5949,7 +5749,7 @@
   void test_logicalNot_string() {
     try {
       _assertLogicalNot(_boolValue(true), _stringValue(null));
-      JUnitTestCase.fail("Expected EvaluationException");
+      fail("Expected EvaluationException");
     } on EvaluationException catch (exception) {
     }
   }
@@ -5976,7 +5776,7 @@
           _boolValue(false),
           _boolValue(false),
           _stringValue("false"));
-      JUnitTestCase.fail("Expected EvaluationException");
+      fail("Expected EvaluationException");
     } on EvaluationException catch (exception) {
     }
   }
@@ -5988,7 +5788,7 @@
   void test_logicalOr_null_false() {
     try {
       _assertLogicalOr(_boolValue(false), _nullValue(), _boolValue(false));
-      JUnitTestCase.fail("Expected EvaluationException");
+      fail("Expected EvaluationException");
     } on EvaluationException catch (exception) {
     }
   }
@@ -5996,7 +5796,7 @@
   void test_logicalOr_null_true() {
     try {
       _assertLogicalOr(_boolValue(true), _nullValue(), _boolValue(true));
-      JUnitTestCase.fail("Expected EvaluationException");
+      fail("Expected EvaluationException");
     } on EvaluationException catch (exception) {
     }
   }
@@ -6007,7 +5807,7 @@
           _boolValue(false),
           _stringValue("true"),
           _boolValue(false));
-      JUnitTestCase.fail("Expected EvaluationException");
+      fail("Expected EvaluationException");
     } on EvaluationException catch (exception) {
     }
   }
@@ -6018,7 +5818,7 @@
           _boolValue(true),
           _stringValue("false"),
           _boolValue(true));
-      JUnitTestCase.fail("Expected EvaluationException");
+      fail("Expected EvaluationException");
     } on EvaluationException catch (exception) {
     }
   }
@@ -6030,7 +5830,7 @@
   void test_logicalOr_true_null() {
     try {
       _assertLogicalOr(_boolValue(true), _boolValue(true), _nullValue());
-      JUnitTestCase.fail("Expected EvaluationException");
+      fail("Expected EvaluationException");
     } on EvaluationException catch (exception) {
     }
   }
@@ -6041,7 +5841,7 @@
           _boolValue(true),
           _boolValue(true),
           _stringValue("true"));
-      JUnitTestCase.fail("Expected EvaluationException");
+      fail("Expected EvaluationException");
     } on EvaluationException catch (exception) {
     }
   }
@@ -6334,7 +6134,7 @@
   void test_stringLength_int() {
     try {
       _assertStringLength(_intValue(null), _intValue(0));
-      JUnitTestCase.fail("Expected EvaluationException");
+      fail("Expected EvaluationException");
     } on EvaluationException catch (exception) {
     }
   }
@@ -6413,13 +6213,13 @@
     if (expected == null) {
       try {
         leftOperand.add(_typeProvider, rightOperand);
-        JUnitTestCase.fail("Expected an EvaluationException");
+        fail("Expected an EvaluationException");
       } on EvaluationException catch (exception) {
       }
     } else {
       DartObjectImpl result = leftOperand.add(_typeProvider, rightOperand);
-      JUnitTestCase.assertNotNull(result);
-      JUnitTestCase.assertEquals(expected, result);
+      expect(result, isNotNull);
+      expect(result, expected);
     }
   }
 
@@ -6437,13 +6237,13 @@
     if (expected == null) {
       try {
         leftOperand.bitAnd(_typeProvider, rightOperand);
-        JUnitTestCase.fail("Expected an EvaluationException");
+        fail("Expected an EvaluationException");
       } on EvaluationException catch (exception) {
       }
     } else {
       DartObjectImpl result = leftOperand.bitAnd(_typeProvider, rightOperand);
-      JUnitTestCase.assertNotNull(result);
-      JUnitTestCase.assertEquals(expected, result);
+      expect(result, isNotNull);
+      expect(result, expected);
     }
   }
 
@@ -6459,13 +6259,13 @@
     if (expected == null) {
       try {
         operand.bitNot(_typeProvider);
-        JUnitTestCase.fail("Expected an EvaluationException");
+        fail("Expected an EvaluationException");
       } on EvaluationException catch (exception) {
       }
     } else {
       DartObjectImpl result = operand.bitNot(_typeProvider);
-      JUnitTestCase.assertNotNull(result);
-      JUnitTestCase.assertEquals(expected, result);
+      expect(result, isNotNull);
+      expect(result, expected);
     }
   }
 
@@ -6483,13 +6283,13 @@
     if (expected == null) {
       try {
         leftOperand.bitOr(_typeProvider, rightOperand);
-        JUnitTestCase.fail("Expected an EvaluationException");
+        fail("Expected an EvaluationException");
       } on EvaluationException catch (exception) {
       }
     } else {
       DartObjectImpl result = leftOperand.bitOr(_typeProvider, rightOperand);
-      JUnitTestCase.assertNotNull(result);
-      JUnitTestCase.assertEquals(expected, result);
+      expect(result, isNotNull);
+      expect(result, expected);
     }
   }
 
@@ -6507,13 +6307,13 @@
     if (expected == null) {
       try {
         leftOperand.bitXor(_typeProvider, rightOperand);
-        JUnitTestCase.fail("Expected an EvaluationException");
+        fail("Expected an EvaluationException");
       } on EvaluationException catch (exception) {
       }
     } else {
       DartObjectImpl result = leftOperand.bitXor(_typeProvider, rightOperand);
-      JUnitTestCase.assertNotNull(result);
-      JUnitTestCase.assertEquals(expected, result);
+      expect(result, isNotNull);
+      expect(result, expected);
     }
   }
 
@@ -6531,14 +6331,14 @@
     if (expected == null) {
       try {
         leftOperand.concatenate(_typeProvider, rightOperand);
-        JUnitTestCase.fail("Expected an EvaluationException");
+        fail("Expected an EvaluationException");
       } on EvaluationException catch (exception) {
       }
     } else {
       DartObjectImpl result =
           leftOperand.concatenate(_typeProvider, rightOperand);
-      JUnitTestCase.assertNotNull(result);
-      JUnitTestCase.assertEquals(expected, result);
+      expect(result, isNotNull);
+      expect(result, expected);
     }
   }
 
@@ -6556,13 +6356,13 @@
     if (expected == null) {
       try {
         leftOperand.divide(_typeProvider, rightOperand);
-        JUnitTestCase.fail("Expected an EvaluationException");
+        fail("Expected an EvaluationException");
       } on EvaluationException catch (exception) {
       }
     } else {
       DartObjectImpl result = leftOperand.divide(_typeProvider, rightOperand);
-      JUnitTestCase.assertNotNull(result);
-      JUnitTestCase.assertEquals(expected, result);
+      expect(result, isNotNull);
+      expect(result, expected);
     }
   }
 
@@ -6580,14 +6380,14 @@
     if (expected == null) {
       try {
         leftOperand.equalEqual(_typeProvider, rightOperand);
-        JUnitTestCase.fail("Expected an EvaluationException");
+        fail("Expected an EvaluationException");
       } on EvaluationException catch (exception) {
       }
     } else {
       DartObjectImpl result =
           leftOperand.equalEqual(_typeProvider, rightOperand);
-      JUnitTestCase.assertNotNull(result);
-      JUnitTestCase.assertEquals(expected, result);
+      expect(result, isNotNull);
+      expect(result, expected);
     }
   }
 
@@ -6605,14 +6405,14 @@
     if (expected == null) {
       try {
         leftOperand.greaterThan(_typeProvider, rightOperand);
-        JUnitTestCase.fail("Expected an EvaluationException");
+        fail("Expected an EvaluationException");
       } on EvaluationException catch (exception) {
       }
     } else {
       DartObjectImpl result =
           leftOperand.greaterThan(_typeProvider, rightOperand);
-      JUnitTestCase.assertNotNull(result);
-      JUnitTestCase.assertEquals(expected, result);
+      expect(result, isNotNull);
+      expect(result, expected);
     }
   }
 
@@ -6630,14 +6430,14 @@
     if (expected == null) {
       try {
         leftOperand.greaterThanOrEqual(_typeProvider, rightOperand);
-        JUnitTestCase.fail("Expected an EvaluationException");
+        fail("Expected an EvaluationException");
       } on EvaluationException catch (exception) {
       }
     } else {
       DartObjectImpl result =
           leftOperand.greaterThanOrEqual(_typeProvider, rightOperand);
-      JUnitTestCase.assertNotNull(result);
-      JUnitTestCase.assertEquals(expected, result);
+      expect(result, isNotNull);
+      expect(result, expected);
     }
   }
 
@@ -6659,14 +6459,14 @@
     if (expected == null) {
       try {
         leftOperand.integerDivide(_typeProvider, rightOperand);
-        JUnitTestCase.fail("Expected an EvaluationException");
+        fail("Expected an EvaluationException");
       } on EvaluationException catch (exception) {
       }
     } else {
       DartObjectImpl result =
           leftOperand.integerDivide(_typeProvider, rightOperand);
-      JUnitTestCase.assertNotNull(result);
-      JUnitTestCase.assertEquals(expected, result);
+      expect(result, isNotNull);
+      expect(result, expected);
     }
   }
 
@@ -6684,13 +6484,13 @@
     if (expected == null) {
       try {
         leftOperand.lessThan(_typeProvider, rightOperand);
-        JUnitTestCase.fail("Expected an EvaluationException");
+        fail("Expected an EvaluationException");
       } on EvaluationException catch (exception) {
       }
     } else {
       DartObjectImpl result = leftOperand.lessThan(_typeProvider, rightOperand);
-      JUnitTestCase.assertNotNull(result);
-      JUnitTestCase.assertEquals(expected, result);
+      expect(result, isNotNull);
+      expect(result, expected);
     }
   }
 
@@ -6708,14 +6508,14 @@
     if (expected == null) {
       try {
         leftOperand.lessThanOrEqual(_typeProvider, rightOperand);
-        JUnitTestCase.fail("Expected an EvaluationException");
+        fail("Expected an EvaluationException");
       } on EvaluationException catch (exception) {
       }
     } else {
       DartObjectImpl result =
           leftOperand.lessThanOrEqual(_typeProvider, rightOperand);
-      JUnitTestCase.assertNotNull(result);
-      JUnitTestCase.assertEquals(expected, result);
+      expect(result, isNotNull);
+      expect(result, expected);
     }
   }
 
@@ -6733,14 +6533,14 @@
     if (expected == null) {
       try {
         leftOperand.logicalAnd(_typeProvider, rightOperand);
-        JUnitTestCase.fail("Expected an EvaluationException");
+        fail("Expected an EvaluationException");
       } on EvaluationException catch (exception) {
       }
     } else {
       DartObjectImpl result =
           leftOperand.logicalAnd(_typeProvider, rightOperand);
-      JUnitTestCase.assertNotNull(result);
-      JUnitTestCase.assertEquals(expected, result);
+      expect(result, isNotNull);
+      expect(result, expected);
     }
   }
 
@@ -6756,13 +6556,13 @@
     if (expected == null) {
       try {
         operand.logicalNot(_typeProvider);
-        JUnitTestCase.fail("Expected an EvaluationException");
+        fail("Expected an EvaluationException");
       } on EvaluationException catch (exception) {
       }
     } else {
       DartObjectImpl result = operand.logicalNot(_typeProvider);
-      JUnitTestCase.assertNotNull(result);
-      JUnitTestCase.assertEquals(expected, result);
+      expect(result, isNotNull);
+      expect(result, expected);
     }
   }
 
@@ -6780,14 +6580,14 @@
     if (expected == null) {
       try {
         leftOperand.logicalOr(_typeProvider, rightOperand);
-        JUnitTestCase.fail("Expected an EvaluationException");
+        fail("Expected an EvaluationException");
       } on EvaluationException catch (exception) {
       }
     } else {
       DartObjectImpl result =
           leftOperand.logicalOr(_typeProvider, rightOperand);
-      JUnitTestCase.assertNotNull(result);
-      JUnitTestCase.assertEquals(expected, result);
+      expect(result, isNotNull);
+      expect(result, expected);
     }
   }
 
@@ -6805,13 +6605,13 @@
     if (expected == null) {
       try {
         leftOperand.minus(_typeProvider, rightOperand);
-        JUnitTestCase.fail("Expected an EvaluationException");
+        fail("Expected an EvaluationException");
       } on EvaluationException catch (exception) {
       }
     } else {
       DartObjectImpl result = leftOperand.minus(_typeProvider, rightOperand);
-      JUnitTestCase.assertNotNull(result);
-      JUnitTestCase.assertEquals(expected, result);
+      expect(result, isNotNull);
+      expect(result, expected);
     }
   }
 
@@ -6827,13 +6627,13 @@
     if (expected == null) {
       try {
         operand.negated(_typeProvider);
-        JUnitTestCase.fail("Expected an EvaluationException");
+        fail("Expected an EvaluationException");
       } on EvaluationException catch (exception) {
       }
     } else {
       DartObjectImpl result = operand.negated(_typeProvider);
-      JUnitTestCase.assertNotNull(result);
-      JUnitTestCase.assertEquals(expected, result);
+      expect(result, isNotNull);
+      expect(result, expected);
     }
   }
 
@@ -6851,13 +6651,13 @@
     if (expected == null) {
       try {
         leftOperand.notEqual(_typeProvider, rightOperand);
-        JUnitTestCase.fail("Expected an EvaluationException");
+        fail("Expected an EvaluationException");
       } on EvaluationException catch (exception) {
       }
     } else {
       DartObjectImpl result = leftOperand.notEqual(_typeProvider, rightOperand);
-      JUnitTestCase.assertNotNull(result);
-      JUnitTestCase.assertEquals(expected, result);
+      expect(result, isNotNull);
+      expect(result, expected);
     }
   }
 
@@ -6873,13 +6673,13 @@
     if (expected == null) {
       try {
         operand.performToString(_typeProvider);
-        JUnitTestCase.fail("Expected an EvaluationException");
+        fail("Expected an EvaluationException");
       } on EvaluationException catch (exception) {
       }
     } else {
       DartObjectImpl result = operand.performToString(_typeProvider);
-      JUnitTestCase.assertNotNull(result);
-      JUnitTestCase.assertEquals(expected, result);
+      expect(result, isNotNull);
+      expect(result, expected);
     }
   }
 
@@ -6897,14 +6697,14 @@
     if (expected == null) {
       try {
         leftOperand.remainder(_typeProvider, rightOperand);
-        JUnitTestCase.fail("Expected an EvaluationException");
+        fail("Expected an EvaluationException");
       } on EvaluationException catch (exception) {
       }
     } else {
       DartObjectImpl result =
           leftOperand.remainder(_typeProvider, rightOperand);
-      JUnitTestCase.assertNotNull(result);
-      JUnitTestCase.assertEquals(expected, result);
+      expect(result, isNotNull);
+      expect(result, expected);
     }
   }
 
@@ -6922,14 +6722,14 @@
     if (expected == null) {
       try {
         leftOperand.shiftLeft(_typeProvider, rightOperand);
-        JUnitTestCase.fail("Expected an EvaluationException");
+        fail("Expected an EvaluationException");
       } on EvaluationException catch (exception) {
       }
     } else {
       DartObjectImpl result =
           leftOperand.shiftLeft(_typeProvider, rightOperand);
-      JUnitTestCase.assertNotNull(result);
-      JUnitTestCase.assertEquals(expected, result);
+      expect(result, isNotNull);
+      expect(result, expected);
     }
   }
 
@@ -6947,14 +6747,14 @@
     if (expected == null) {
       try {
         leftOperand.shiftRight(_typeProvider, rightOperand);
-        JUnitTestCase.fail("Expected an EvaluationException");
+        fail("Expected an EvaluationException");
       } on EvaluationException catch (exception) {
       }
     } else {
       DartObjectImpl result =
           leftOperand.shiftRight(_typeProvider, rightOperand);
-      JUnitTestCase.assertNotNull(result);
-      JUnitTestCase.assertEquals(expected, result);
+      expect(result, isNotNull);
+      expect(result, expected);
     }
   }
 
@@ -6970,13 +6770,13 @@
     if (expected == null) {
       try {
         operand.stringLength(_typeProvider);
-        JUnitTestCase.fail("Expected an EvaluationException");
+        fail("Expected an EvaluationException");
       } on EvaluationException catch (exception) {
       }
     } else {
       DartObjectImpl result = operand.stringLength(_typeProvider);
-      JUnitTestCase.assertNotNull(result);
-      JUnitTestCase.assertEquals(expected, result);
+      expect(result, isNotNull);
+      expect(result, expected);
     }
   }
 
@@ -6994,13 +6794,13 @@
     if (expected == null) {
       try {
         leftOperand.times(_typeProvider, rightOperand);
-        JUnitTestCase.fail("Expected an EvaluationException");
+        fail("Expected an EvaluationException");
       } on EvaluationException catch (exception) {
       }
     } else {
       DartObjectImpl result = leftOperand.times(_typeProvider, rightOperand);
-      JUnitTestCase.assertNotNull(result);
-      JUnitTestCase.assertEquals(expected, result);
+      expect(result, isNotNull);
+      expect(result, expected);
     }
   }
 
@@ -7014,7 +6814,7 @@
     } else if (identical(value, true)) {
       return new DartObjectImpl(_typeProvider.boolType, BoolState.TRUE_STATE);
     }
-    JUnitTestCase.fail("Invalid boolean value used in test");
+    fail("Invalid boolean value used in test");
     return null;
   }
 
@@ -7084,47 +6884,47 @@
 }
 
 
-class DartUriResolverTest extends JUnitTestCase {
+class DartUriResolverTest {
   void test_creation() {
     JavaFile sdkDirectory = DirectoryBasedDartSdk.defaultSdkDirectory;
-    JUnitTestCase.assertNotNull(sdkDirectory);
+    expect(sdkDirectory, isNotNull);
     DartSdk sdk = new DirectoryBasedDartSdk(sdkDirectory);
-    JUnitTestCase.assertNotNull(new DartUriResolver(sdk));
+    expect(new DartUriResolver(sdk), isNotNull);
   }
 
   void test_isDartUri_null_scheme() {
     Uri uri = parseUriWithException("foo.dart");
-    JUnitTestCase.assertEquals(uri.scheme, '');
-    JUnitTestCase.assertFalse(DartUriResolver.isDartUri(uri));
+    expect('', uri.scheme);
+    expect(DartUriResolver.isDartUri(uri), isFalse);
   }
 
   void test_resolve_dart() {
     JavaFile sdkDirectory = DirectoryBasedDartSdk.defaultSdkDirectory;
-    JUnitTestCase.assertNotNull(sdkDirectory);
+    expect(sdkDirectory, isNotNull);
     DartSdk sdk = new DirectoryBasedDartSdk(sdkDirectory);
     UriResolver resolver = new DartUriResolver(sdk);
     Source result =
         resolver.resolveAbsolute(parseUriWithException("dart:core"));
-    JUnitTestCase.assertNotNull(result);
+    expect(result, isNotNull);
   }
 
   void test_resolve_dart_nonExistingLibrary() {
     JavaFile sdkDirectory = DirectoryBasedDartSdk.defaultSdkDirectory;
-    JUnitTestCase.assertNotNull(sdkDirectory);
+    expect(sdkDirectory, isNotNull);
     DartSdk sdk = new DirectoryBasedDartSdk(sdkDirectory);
     UriResolver resolver = new DartUriResolver(sdk);
     Source result = resolver.resolveAbsolute(parseUriWithException("dart:cor"));
-    JUnitTestCase.assertNull(result);
+    expect(result, isNull);
   }
 
   void test_resolve_nonDart() {
     JavaFile sdkDirectory = DirectoryBasedDartSdk.defaultSdkDirectory;
-    JUnitTestCase.assertNotNull(sdkDirectory);
+    expect(sdkDirectory, isNotNull);
     DartSdk sdk = new DirectoryBasedDartSdk(sdkDirectory);
     UriResolver resolver = new DartUriResolver(sdk);
     Source result =
         resolver.resolveAbsolute(parseUriWithException("package:some/file.dart"));
-    JUnitTestCase.assertNull(result);
+    expect(result, isNull);
   }
 }
 
@@ -7136,8 +6936,8 @@
     DeclaredVariables variables = new DeclaredVariables();
     variables.define(variableName, "false");
     DartObject object = variables.getBool(typeProvider, variableName);
-    JUnitTestCase.assertNotNull(object);
-    JUnitTestCase.assertEquals(false, object.boolValue);
+    expect(object, isNotNull);
+    expect(object.boolValue, false);
   }
 
   void test_getBool_invalid() {
@@ -7156,15 +6956,16 @@
     DeclaredVariables variables = new DeclaredVariables();
     variables.define(variableName, "true");
     DartObject object = variables.getBool(typeProvider, variableName);
-    JUnitTestCase.assertNotNull(object);
-    JUnitTestCase.assertEquals(true, object.boolValue);
+    expect(object, isNotNull);
+    expect(object.boolValue, true);
   }
 
   void test_getBool_undefined() {
     TestTypeProvider typeProvider = new TestTypeProvider();
     String variableName = "var";
     DeclaredVariables variables = new DeclaredVariables();
-    _assertUnknownDartObject(variables.getBool(typeProvider, variableName));
+    _assertUnknownDartObject(typeProvider.boolType,
+        variables.getBool(typeProvider, variableName));
   }
 
   void test_getInt_invalid() {
@@ -7181,7 +6982,8 @@
     TestTypeProvider typeProvider = new TestTypeProvider();
     String variableName = "var";
     DeclaredVariables variables = new DeclaredVariables();
-    _assertUnknownDartObject(variables.getInt(typeProvider, variableName));
+    _assertUnknownDartObject(typeProvider.intType,
+        variables.getInt(typeProvider, variableName));
   }
 
   void test_getInt_valid() {
@@ -7190,8 +6992,8 @@
     DeclaredVariables variables = new DeclaredVariables();
     variables.define(variableName, "23");
     DartObject object = variables.getInt(typeProvider, variableName);
-    JUnitTestCase.assertNotNull(object);
-    JUnitTestCase.assertEquals(23, object.intValue);
+    expect(object, isNotNull);
+    expect(object.intValue, 23);
   }
 
   void test_getString_defined() {
@@ -7201,43 +7003,45 @@
     DeclaredVariables variables = new DeclaredVariables();
     variables.define(variableName, value);
     DartObject object = variables.getString(typeProvider, variableName);
-    JUnitTestCase.assertNotNull(object);
-    JUnitTestCase.assertEquals(value, object.stringValue);
+    expect(object, isNotNull);
+    expect(object.stringValue, value);
   }
 
   void test_getString_undefined() {
     TestTypeProvider typeProvider = new TestTypeProvider();
     String variableName = "var";
     DeclaredVariables variables = new DeclaredVariables();
-    _assertUnknownDartObject(variables.getString(typeProvider, variableName));
+    _assertUnknownDartObject(typeProvider.stringType,
+        variables.getString(typeProvider, variableName));
   }
 
   void _assertNullDartObject(TestTypeProvider typeProvider, DartObject result) {
-    JUnitTestCase.assertEquals(typeProvider.nullType, result.type);
+    expect(result.type, typeProvider.nullType);
   }
 
-  void _assertUnknownDartObject(DartObject result) {
-    JUnitTestCase.assertTrue((result as DartObjectImpl).isUnknown);
+  void _assertUnknownDartObject(ParameterizedType expectedType,
+                                DartObject result) {
+    expect((result as DartObjectImpl).isUnknown, isTrue);
+    expect(result.type, expectedType);
   }
 }
 
 
-class DirectoryBasedDartSdkTest extends JUnitTestCase {
+class DirectoryBasedDartSdkTest {
   void fail_getDocFileFor() {
     DirectoryBasedDartSdk sdk = _createDartSdk();
     JavaFile docFile = sdk.getDocFileFor("html");
-    JUnitTestCase.assertNotNull(docFile);
+    expect(docFile, isNotNull);
   }
 
   void test_creation() {
     DirectoryBasedDartSdk sdk = _createDartSdk();
-    JUnitTestCase.assertNotNull(sdk);
+    expect(sdk, isNotNull);
   }
 
   void test_fromFile_invalid() {
     DirectoryBasedDartSdk sdk = _createDartSdk();
-    JUnitTestCase.assertNull(
-        sdk.fromFileUri(new JavaFile("/not/in/the/sdk.dart").toURI()));
+    expect(sdk.fromFileUri(new JavaFile("/not/in/the/sdk.dart").toURI()), isNull);
   }
 
   void test_fromFile_library() {
@@ -7246,9 +7050,9 @@
         new JavaFile.relative(
             new JavaFile.relative(sdk.libraryDirectory, "core"),
             "core.dart").toURI());
-    JUnitTestCase.assertNotNull(source);
-    JUnitTestCase.assertTrue(source.isInSystemLibrary);
-    JUnitTestCase.assertEquals("dart:core", source.uri.toString());
+    expect(source, isNotNull);
+    expect(source.isInSystemLibrary, isTrue);
+    expect(source.uri.toString(), "dart:core");
   }
 
   void test_fromFile_part() {
@@ -7257,81 +7061,79 @@
         new JavaFile.relative(
             new JavaFile.relative(sdk.libraryDirectory, "core"),
             "num.dart").toURI());
-    JUnitTestCase.assertNotNull(source);
-    JUnitTestCase.assertTrue(source.isInSystemLibrary);
-    JUnitTestCase.assertEquals("dart:core/num.dart", source.uri.toString());
+    expect(source, isNotNull);
+    expect(source.isInSystemLibrary, isTrue);
+    expect(source.uri.toString(), "dart:core/num.dart");
   }
 
   void test_getDart2JsExecutable() {
     DirectoryBasedDartSdk sdk = _createDartSdk();
     JavaFile executable = sdk.dart2JsExecutable;
-    JUnitTestCase.assertNotNull(executable);
-    JUnitTestCase.assertTrue(executable.exists());
-    JUnitTestCase.assertTrue(executable.isExecutable());
+    expect(executable, isNotNull);
+    expect(executable.exists(), isTrue);
+    expect(executable.isExecutable(), isTrue);
   }
 
   void test_getDartFmtExecutable() {
     DirectoryBasedDartSdk sdk = _createDartSdk();
     JavaFile executable = sdk.dartFmtExecutable;
-    JUnitTestCase.assertNotNull(executable);
-    JUnitTestCase.assertTrue(executable.exists());
-    JUnitTestCase.assertTrue(executable.isExecutable());
+    expect(executable, isNotNull);
+    expect(executable.exists(), isTrue);
+    expect(executable.isExecutable(), isTrue);
   }
 
   void test_getDirectory() {
     DirectoryBasedDartSdk sdk = _createDartSdk();
     JavaFile directory = sdk.directory;
-    JUnitTestCase.assertNotNull(directory);
-    JUnitTestCase.assertTrue(directory.exists());
+    expect(directory, isNotNull);
+    expect(directory.exists(), isTrue);
   }
 
   void test_getDocDirectory() {
     DirectoryBasedDartSdk sdk = _createDartSdk();
     JavaFile directory = sdk.docDirectory;
-    JUnitTestCase.assertNotNull(directory);
+    expect(directory, isNotNull);
   }
 
   void test_getLibraryDirectory() {
     DirectoryBasedDartSdk sdk = _createDartSdk();
     JavaFile directory = sdk.libraryDirectory;
-    JUnitTestCase.assertNotNull(directory);
-    JUnitTestCase.assertTrue(directory.exists());
+    expect(directory, isNotNull);
+    expect(directory.exists(), isTrue);
   }
 
   void test_getPubExecutable() {
     DirectoryBasedDartSdk sdk = _createDartSdk();
     JavaFile executable = sdk.pubExecutable;
-    JUnitTestCase.assertNotNull(executable);
-    JUnitTestCase.assertTrue(executable.exists());
-    JUnitTestCase.assertTrue(executable.isExecutable());
+    expect(executable, isNotNull);
+    expect(executable.exists(), isTrue);
+    expect(executable.isExecutable(), isTrue);
   }
 
   void test_getSdkVersion() {
     DirectoryBasedDartSdk sdk = _createDartSdk();
     String version = sdk.sdkVersion;
-    JUnitTestCase.assertNotNull(version);
-    JUnitTestCase.assertTrue(version.length > 0);
+    expect(version, isNotNull);
+    expect(version.length > 0, isTrue);
   }
 
   void test_getVmExecutable() {
     DirectoryBasedDartSdk sdk = _createDartSdk();
     JavaFile executable = sdk.vmExecutable;
-    JUnitTestCase.assertNotNull(executable);
-    JUnitTestCase.assertTrue(executable.exists());
-    JUnitTestCase.assertTrue(executable.isExecutable());
+    expect(executable, isNotNull);
+    expect(executable.exists(), isTrue);
+    expect(executable.isExecutable(), isTrue);
   }
 
   DirectoryBasedDartSdk _createDartSdk() {
     JavaFile sdkDirectory = DirectoryBasedDartSdk.defaultSdkDirectory;
-    JUnitTestCase.assertNotNullMsg(
-        "No SDK configured; set the property 'com.google.dart.sdk' on the command line",
-        sdkDirectory);
+    expect(sdkDirectory, isNotNull, reason: "No SDK configured; set the property 'com.google.dart.sdk' on the command line");
     return new DirectoryBasedDartSdk(sdkDirectory);
   }
 }
 
 
-class DirectoryBasedSourceContainerTest extends JUnitTestCase {
+class DirectoryBasedSourceContainerTest {
   void test_contains() {
     JavaFile dir = FileUtilities2.createFile("/does/not/exist");
     JavaFile file1 = FileUtilities2.createFile("/does/not/exist/some.dart");
@@ -7343,9 +7145,9 @@
     FileBasedSource source3 = new FileBasedSource.con1(file3);
     DirectoryBasedSourceContainer container =
         new DirectoryBasedSourceContainer.con1(dir);
-    JUnitTestCase.assertTrue(container.contains(source1));
-    JUnitTestCase.assertTrue(container.contains(source2));
-    JUnitTestCase.assertFalse(container.contains(source3));
+    expect(container.contains(source1), isTrue);
+    expect(container.contains(source2), isTrue);
+    expect(container.contains(source3), isFalse);
   }
 }
 
@@ -7360,21 +7162,21 @@
         AstFactory.catchClause2(exceptionParameterName, stackParameterName, []);
     clause.accept(builder);
     List<LocalVariableElement> variables = holder.localVariables;
-    EngineTestCase.assertLength(2, variables);
+    expect(variables, hasLength(2));
     VariableElement exceptionVariable = variables[0];
-    JUnitTestCase.assertNotNull(exceptionVariable);
-    JUnitTestCase.assertEquals(exceptionParameterName, exceptionVariable.name);
-    JUnitTestCase.assertFalse(exceptionVariable.isSynthetic);
-    JUnitTestCase.assertFalse(exceptionVariable.isConst);
-    JUnitTestCase.assertFalse(exceptionVariable.isFinal);
-    JUnitTestCase.assertNull(exceptionVariable.initializer);
+    expect(exceptionVariable, isNotNull);
+    expect(exceptionVariable.name, exceptionParameterName);
+    expect(exceptionVariable.isSynthetic, isFalse);
+    expect(exceptionVariable.isConst, isFalse);
+    expect(exceptionVariable.isFinal, isFalse);
+    expect(exceptionVariable.initializer, isNull);
     VariableElement stackVariable = variables[1];
-    JUnitTestCase.assertNotNull(stackVariable);
-    JUnitTestCase.assertEquals(stackParameterName, stackVariable.name);
-    JUnitTestCase.assertFalse(stackVariable.isSynthetic);
-    JUnitTestCase.assertFalse(stackVariable.isConst);
-    JUnitTestCase.assertFalse(stackVariable.isFinal);
-    JUnitTestCase.assertNull(stackVariable.initializer);
+    expect(stackVariable, isNotNull);
+    expect(stackVariable.name, stackParameterName);
+    expect(stackVariable.isSynthetic, isFalse);
+    expect(stackVariable.isConst, isFalse);
+    expect(stackVariable.isFinal, isFalse);
+    expect(stackVariable.initializer, isNull);
   }
 
   void test_visitClassDeclaration_abstract() {
@@ -7391,14 +7193,14 @@
         []);
     classDeclaration.accept(builder);
     List<ClassElement> types = holder.types;
-    EngineTestCase.assertLength(1, types);
+    expect(types, hasLength(1));
     ClassElement type = types[0];
-    JUnitTestCase.assertNotNull(type);
-    JUnitTestCase.assertEquals(className, type.name);
+    expect(type, isNotNull);
+    expect(type.name, className);
     List<TypeParameterElement> typeParameters = type.typeParameters;
-    EngineTestCase.assertLength(0, typeParameters);
-    JUnitTestCase.assertTrue(type.isAbstract);
-    JUnitTestCase.assertFalse(type.isSynthetic);
+    expect(typeParameters, hasLength(0));
+    expect(type.isAbstract, isTrue);
+    expect(type.isSynthetic, isFalse);
   }
 
   void test_visitClassDeclaration_minimal() {
@@ -7409,14 +7211,14 @@
         AstFactory.classDeclaration(null, className, null, null, null, null, []);
     classDeclaration.accept(builder);
     List<ClassElement> types = holder.types;
-    EngineTestCase.assertLength(1, types);
+    expect(types, hasLength(1));
     ClassElement type = types[0];
-    JUnitTestCase.assertNotNull(type);
-    JUnitTestCase.assertEquals(className, type.name);
+    expect(type, isNotNull);
+    expect(type.name, className);
     List<TypeParameterElement> typeParameters = type.typeParameters;
-    EngineTestCase.assertLength(0, typeParameters);
-    JUnitTestCase.assertFalse(type.isAbstract);
-    JUnitTestCase.assertFalse(type.isSynthetic);
+    expect(typeParameters, hasLength(0));
+    expect(type.isAbstract, isFalse);
+    expect(type.isSynthetic, isFalse);
   }
 
   void test_visitClassDeclaration_parameterized() {
@@ -7435,16 +7237,16 @@
         []);
     classDeclaration.accept(builder);
     List<ClassElement> types = holder.types;
-    EngineTestCase.assertLength(1, types);
+    expect(types, hasLength(1));
     ClassElement type = types[0];
-    JUnitTestCase.assertNotNull(type);
-    JUnitTestCase.assertEquals(className, type.name);
+    expect(type, isNotNull);
+    expect(type.name, className);
     List<TypeParameterElement> typeParameters = type.typeParameters;
-    EngineTestCase.assertLength(2, typeParameters);
-    JUnitTestCase.assertEquals(firstVariableName, typeParameters[0].name);
-    JUnitTestCase.assertEquals(secondVariableName, typeParameters[1].name);
-    JUnitTestCase.assertFalse(type.isAbstract);
-    JUnitTestCase.assertFalse(type.isSynthetic);
+    expect(typeParameters, hasLength(2));
+    expect(typeParameters[0].name, firstVariableName);
+    expect(typeParameters[1].name, secondVariableName);
+    expect(type.isAbstract, isFalse);
+    expect(type.isSynthetic, isFalse);
   }
 
   void test_visitClassDeclaration_withMembers() {
@@ -7476,27 +7278,27 @@
                 AstFactory.blockFunctionBody2([]))]);
     classDeclaration.accept(builder);
     List<ClassElement> types = holder.types;
-    EngineTestCase.assertLength(1, types);
+    expect(types, hasLength(1));
     ClassElement type = types[0];
-    JUnitTestCase.assertNotNull(type);
-    JUnitTestCase.assertEquals(className, type.name);
-    JUnitTestCase.assertFalse(type.isAbstract);
-    JUnitTestCase.assertFalse(type.isSynthetic);
+    expect(type, isNotNull);
+    expect(type.name, className);
+    expect(type.isAbstract, isFalse);
+    expect(type.isSynthetic, isFalse);
     List<TypeParameterElement> typeParameters = type.typeParameters;
-    EngineTestCase.assertLength(1, typeParameters);
+    expect(typeParameters, hasLength(1));
     TypeParameterElement typeParameter = typeParameters[0];
-    JUnitTestCase.assertNotNull(typeParameter);
-    JUnitTestCase.assertEquals(typeParameterName, typeParameter.name);
+    expect(typeParameter, isNotNull);
+    expect(typeParameter.name, typeParameterName);
     List<FieldElement> fields = type.fields;
-    EngineTestCase.assertLength(1, fields);
+    expect(fields, hasLength(1));
     FieldElement field = fields[0];
-    JUnitTestCase.assertNotNull(field);
-    JUnitTestCase.assertEquals(fieldName, field.name);
+    expect(field, isNotNull);
+    expect(field.name, fieldName);
     List<MethodElement> methods = type.methods;
-    EngineTestCase.assertLength(1, methods);
+    expect(methods, hasLength(1));
     MethodElement method = methods[0];
-    JUnitTestCase.assertNotNull(method);
-    JUnitTestCase.assertEquals(methodName, method.name);
+    expect(method, isNotNull);
+    expect(method.name, methodName);
   }
 
   void test_visitConstructorDeclaration_factory() {
@@ -7514,15 +7316,15 @@
             AstFactory.blockFunctionBody2([]));
     constructorDeclaration.accept(builder);
     List<ConstructorElement> constructors = holder.constructors;
-    EngineTestCase.assertLength(1, constructors);
+    expect(constructors, hasLength(1));
     ConstructorElement constructor = constructors[0];
-    JUnitTestCase.assertNotNull(constructor);
-    JUnitTestCase.assertTrue(constructor.isFactory);
-    JUnitTestCase.assertEquals("", constructor.name);
-    EngineTestCase.assertLength(0, constructor.functions);
-    EngineTestCase.assertLength(0, constructor.labels);
-    EngineTestCase.assertLength(0, constructor.localVariables);
-    EngineTestCase.assertLength(0, constructor.parameters);
+    expect(constructor, isNotNull);
+    expect(constructor.isFactory, isTrue);
+    expect(constructor.name, "");
+    expect(constructor.functions, hasLength(0));
+    expect(constructor.labels, hasLength(0));
+    expect(constructor.localVariables, hasLength(0));
+    expect(constructor.parameters, hasLength(0));
   }
 
   void test_visitConstructorDeclaration_minimal() {
@@ -7540,15 +7342,15 @@
             AstFactory.blockFunctionBody2([]));
     constructorDeclaration.accept(builder);
     List<ConstructorElement> constructors = holder.constructors;
-    EngineTestCase.assertLength(1, constructors);
+    expect(constructors, hasLength(1));
     ConstructorElement constructor = constructors[0];
-    JUnitTestCase.assertNotNull(constructor);
-    JUnitTestCase.assertFalse(constructor.isFactory);
-    JUnitTestCase.assertEquals("", constructor.name);
-    EngineTestCase.assertLength(0, constructor.functions);
-    EngineTestCase.assertLength(0, constructor.labels);
-    EngineTestCase.assertLength(0, constructor.localVariables);
-    EngineTestCase.assertLength(0, constructor.parameters);
+    expect(constructor, isNotNull);
+    expect(constructor.isFactory, isFalse);
+    expect(constructor.name, "");
+    expect(constructor.functions, hasLength(0));
+    expect(constructor.labels, hasLength(0));
+    expect(constructor.localVariables, hasLength(0));
+    expect(constructor.parameters, hasLength(0));
   }
 
   void test_visitConstructorDeclaration_named() {
@@ -7567,19 +7369,17 @@
             AstFactory.blockFunctionBody2([]));
     constructorDeclaration.accept(builder);
     List<ConstructorElement> constructors = holder.constructors;
-    EngineTestCase.assertLength(1, constructors);
+    expect(constructors, hasLength(1));
     ConstructorElement constructor = constructors[0];
-    JUnitTestCase.assertNotNull(constructor);
-    JUnitTestCase.assertFalse(constructor.isFactory);
-    JUnitTestCase.assertEquals(constructorName, constructor.name);
-    EngineTestCase.assertLength(0, constructor.functions);
-    EngineTestCase.assertLength(0, constructor.labels);
-    EngineTestCase.assertLength(0, constructor.localVariables);
-    EngineTestCase.assertLength(0, constructor.parameters);
-    JUnitTestCase.assertSame(
-        constructor,
-        constructorDeclaration.name.staticElement);
-    JUnitTestCase.assertSame(constructor, constructorDeclaration.element);
+    expect(constructor, isNotNull);
+    expect(constructor.isFactory, isFalse);
+    expect(constructor.name, constructorName);
+    expect(constructor.functions, hasLength(0));
+    expect(constructor.labels, hasLength(0));
+    expect(constructor.localVariables, hasLength(0));
+    expect(constructor.parameters, hasLength(0));
+    expect(constructorDeclaration.name.staticElement, same(constructor));
+    expect(constructorDeclaration.element, same(constructor));
   }
 
   void test_visitConstructorDeclaration_unnamed() {
@@ -7597,16 +7397,16 @@
             AstFactory.blockFunctionBody2([]));
     constructorDeclaration.accept(builder);
     List<ConstructorElement> constructors = holder.constructors;
-    EngineTestCase.assertLength(1, constructors);
+    expect(constructors, hasLength(1));
     ConstructorElement constructor = constructors[0];
-    JUnitTestCase.assertNotNull(constructor);
-    JUnitTestCase.assertFalse(constructor.isFactory);
-    JUnitTestCase.assertEquals("", constructor.name);
-    EngineTestCase.assertLength(0, constructor.functions);
-    EngineTestCase.assertLength(0, constructor.labels);
-    EngineTestCase.assertLength(0, constructor.localVariables);
-    EngineTestCase.assertLength(0, constructor.parameters);
-    JUnitTestCase.assertSame(constructor, constructorDeclaration.element);
+    expect(constructor, isNotNull);
+    expect(constructor.isFactory, isFalse);
+    expect(constructor.name, "");
+    expect(constructor.functions, hasLength(0));
+    expect(constructor.labels, hasLength(0));
+    expect(constructor.localVariables, hasLength(0));
+    expect(constructor.parameters, hasLength(0));
+    expect(constructorDeclaration.element, same(constructor));
   }
 
   void test_visitEnumDeclaration() {
@@ -7617,10 +7417,10 @@
         AstFactory.enumDeclaration2(enumName, ["ONE"]);
     enumDeclaration.accept(builder);
     List<ClassElement> enums = holder.enums;
-    EngineTestCase.assertLength(1, enums);
+    expect(enums, hasLength(1));
     ClassElement enumElement = enums[0];
-    JUnitTestCase.assertNotNull(enumElement);
-    JUnitTestCase.assertEquals(enumName, enumElement.name);
+    expect(enumElement, isNotNull);
+    expect(enumElement.name, enumName);
   }
 
   void test_visitFieldDeclaration() {
@@ -7636,21 +7436,21 @@
             AstFactory.variableDeclaration(secondFieldName)]);
     fieldDeclaration.accept(builder);
     List<FieldElement> fields = holder.fields;
-    EngineTestCase.assertLength(2, fields);
+    expect(fields, hasLength(2));
     FieldElement firstField = fields[0];
-    JUnitTestCase.assertNotNull(firstField);
-    JUnitTestCase.assertEquals(firstFieldName, firstField.name);
-    JUnitTestCase.assertNull(firstField.initializer);
-    JUnitTestCase.assertFalse(firstField.isConst);
-    JUnitTestCase.assertFalse(firstField.isFinal);
-    JUnitTestCase.assertFalse(firstField.isSynthetic);
+    expect(firstField, isNotNull);
+    expect(firstField.name, firstFieldName);
+    expect(firstField.initializer, isNull);
+    expect(firstField.isConst, isFalse);
+    expect(firstField.isFinal, isFalse);
+    expect(firstField.isSynthetic, isFalse);
     FieldElement secondField = fields[1];
-    JUnitTestCase.assertNotNull(secondField);
-    JUnitTestCase.assertEquals(secondFieldName, secondField.name);
-    JUnitTestCase.assertNull(secondField.initializer);
-    JUnitTestCase.assertFalse(secondField.isConst);
-    JUnitTestCase.assertFalse(secondField.isFinal);
-    JUnitTestCase.assertFalse(secondField.isSynthetic);
+    expect(secondField, isNotNull);
+    expect(secondField.name, secondFieldName);
+    expect(secondField.initializer, isNull);
+    expect(secondField.isConst, isFalse);
+    expect(secondField.isFinal, isFalse);
+    expect(secondField.isSynthetic, isFalse);
   }
 
   void test_visitFieldFormalParameter() {
@@ -7661,16 +7461,16 @@
         AstFactory.fieldFormalParameter(null, null, parameterName);
     formalParameter.accept(builder);
     List<ParameterElement> parameters = holder.parameters;
-    EngineTestCase.assertLength(1, parameters);
+    expect(parameters, hasLength(1));
     ParameterElement parameter = parameters[0];
-    JUnitTestCase.assertNotNull(parameter);
-    JUnitTestCase.assertEquals(parameterName, parameter.name);
-    JUnitTestCase.assertNull(parameter.initializer);
-    JUnitTestCase.assertFalse(parameter.isConst);
-    JUnitTestCase.assertFalse(parameter.isFinal);
-    JUnitTestCase.assertFalse(parameter.isSynthetic);
-    JUnitTestCase.assertEquals(ParameterKind.REQUIRED, parameter.parameterKind);
-    EngineTestCase.assertLength(0, parameter.parameters);
+    expect(parameter, isNotNull);
+    expect(parameter.name, parameterName);
+    expect(parameter.initializer, isNull);
+    expect(parameter.isConst, isFalse);
+    expect(parameter.isFinal, isFalse);
+    expect(parameter.isSynthetic, isFalse);
+    expect(parameter.parameterKind, ParameterKind.REQUIRED);
+    expect(parameter.parameters, hasLength(0));
   }
 
   void test_visitFieldFormalParameter_funtionTyped() {
@@ -7684,16 +7484,16 @@
         AstFactory.formalParameterList([AstFactory.simpleFormalParameter3("a")]));
     formalParameter.accept(builder);
     List<ParameterElement> parameters = holder.parameters;
-    EngineTestCase.assertLength(1, parameters);
+    expect(parameters, hasLength(1));
     ParameterElement parameter = parameters[0];
-    JUnitTestCase.assertNotNull(parameter);
-    JUnitTestCase.assertEquals(parameterName, parameter.name);
-    JUnitTestCase.assertNull(parameter.initializer);
-    JUnitTestCase.assertFalse(parameter.isConst);
-    JUnitTestCase.assertFalse(parameter.isFinal);
-    JUnitTestCase.assertFalse(parameter.isSynthetic);
-    JUnitTestCase.assertEquals(ParameterKind.REQUIRED, parameter.parameterKind);
-    EngineTestCase.assertLength(1, parameter.parameters);
+    expect(parameter, isNotNull);
+    expect(parameter.name, parameterName);
+    expect(parameter.initializer, isNull);
+    expect(parameter.isConst, isFalse);
+    expect(parameter.isFinal, isFalse);
+    expect(parameter.isSynthetic, isFalse);
+    expect(parameter.parameterKind, ParameterKind.REQUIRED);
+    expect(parameter.parameters, hasLength(1));
   }
 
   void test_visitFormalParameterList() {
@@ -7707,9 +7507,9 @@
             AstFactory.simpleFormalParameter3(secondParameterName)]);
     parameterList.accept(builder);
     List<ParameterElement> parameters = holder.parameters;
-    EngineTestCase.assertLength(2, parameters);
-    JUnitTestCase.assertEquals(firstParameterName, parameters[0].name);
-    JUnitTestCase.assertEquals(secondParameterName, parameters[1].name);
+    expect(parameters, hasLength(2));
+    expect(parameters[0].name, firstParameterName);
+    expect(parameters[1].name, secondParameterName);
   }
 
   void test_visitFunctionDeclaration_getter() {
@@ -7725,21 +7525,21 @@
             AstFactory.blockFunctionBody2([])));
     declaration.accept(builder);
     List<PropertyAccessorElement> accessors = holder.accessors;
-    EngineTestCase.assertLength(1, accessors);
+    expect(accessors, hasLength(1));
     PropertyAccessorElement accessor = accessors[0];
-    JUnitTestCase.assertNotNull(accessor);
-    JUnitTestCase.assertEquals(functionName, accessor.name);
-    JUnitTestCase.assertSame(accessor, declaration.element);
-    JUnitTestCase.assertSame(accessor, declaration.functionExpression.element);
-    JUnitTestCase.assertTrue(accessor.isGetter);
-    JUnitTestCase.assertFalse(accessor.isSetter);
-    JUnitTestCase.assertFalse(accessor.isSynthetic);
+    expect(accessor, isNotNull);
+    expect(accessor.name, functionName);
+    expect(declaration.element, same(accessor));
+    expect(declaration.functionExpression.element, same(accessor));
+    expect(accessor.isGetter, isTrue);
+    expect(accessor.isSetter, isFalse);
+    expect(accessor.isSynthetic, isFalse);
     PropertyInducingElement variable = accessor.variable;
     EngineTestCase.assertInstanceOf(
         (obj) => obj is TopLevelVariableElement,
         TopLevelVariableElement,
         variable);
-    JUnitTestCase.assertTrue(variable.isSynthetic);
+    expect(variable.isSynthetic, isTrue);
   }
 
   void test_visitFunctionDeclaration_plain() {
@@ -7755,13 +7555,13 @@
             AstFactory.blockFunctionBody2([])));
     declaration.accept(builder);
     List<FunctionElement> functions = holder.functions;
-    EngineTestCase.assertLength(1, functions);
+    expect(functions, hasLength(1));
     FunctionElement function = functions[0];
-    JUnitTestCase.assertNotNull(function);
-    JUnitTestCase.assertEquals(functionName, function.name);
-    JUnitTestCase.assertSame(function, declaration.element);
-    JUnitTestCase.assertSame(function, declaration.functionExpression.element);
-    JUnitTestCase.assertFalse(function.isSynthetic);
+    expect(function, isNotNull);
+    expect(function.name, functionName);
+    expect(declaration.element, same(function));
+    expect(declaration.functionExpression.element, same(function));
+    expect(function.isSynthetic, isFalse);
   }
 
   void test_visitFunctionDeclaration_setter() {
@@ -7777,21 +7577,21 @@
             AstFactory.blockFunctionBody2([])));
     declaration.accept(builder);
     List<PropertyAccessorElement> accessors = holder.accessors;
-    EngineTestCase.assertLength(1, accessors);
+    expect(accessors, hasLength(1));
     PropertyAccessorElement accessor = accessors[0];
-    JUnitTestCase.assertNotNull(accessor);
-    JUnitTestCase.assertEquals("${functionName}=", accessor.name);
-    JUnitTestCase.assertSame(accessor, declaration.element);
-    JUnitTestCase.assertSame(accessor, declaration.functionExpression.element);
-    JUnitTestCase.assertFalse(accessor.isGetter);
-    JUnitTestCase.assertTrue(accessor.isSetter);
-    JUnitTestCase.assertFalse(accessor.isSynthetic);
+    expect(accessor, isNotNull);
+    expect(accessor.name, "$functionName=");
+    expect(declaration.element, same(accessor));
+    expect(declaration.functionExpression.element, same(accessor));
+    expect(accessor.isGetter, isFalse);
+    expect(accessor.isSetter, isTrue);
+    expect(accessor.isSynthetic, isFalse);
     PropertyInducingElement variable = accessor.variable;
     EngineTestCase.assertInstanceOf(
         (obj) => obj is TopLevelVariableElement,
         TopLevelVariableElement,
         variable);
-    JUnitTestCase.assertTrue(variable.isSynthetic);
+    expect(variable.isSynthetic, isTrue);
   }
 
   void test_visitFunctionExpression() {
@@ -7802,11 +7602,11 @@
         AstFactory.blockFunctionBody2([]));
     expression.accept(builder);
     List<FunctionElement> functions = holder.functions;
-    EngineTestCase.assertLength(1, functions);
+    expect(functions, hasLength(1));
     FunctionElement function = functions[0];
-    JUnitTestCase.assertNotNull(function);
-    JUnitTestCase.assertSame(function, expression.element);
-    JUnitTestCase.assertFalse(function.isSynthetic);
+    expect(function, isNotNull);
+    expect(expression.element, same(function));
+    expect(function.isSynthetic, isFalse);
   }
 
   void test_visitFunctionTypeAlias() {
@@ -7821,16 +7621,16 @@
         null);
     aliasNode.accept(builder);
     List<FunctionTypeAliasElement> aliases = holder.typeAliases;
-    EngineTestCase.assertLength(1, aliases);
+    expect(aliases, hasLength(1));
     FunctionTypeAliasElement alias = aliases[0];
-    JUnitTestCase.assertNotNull(alias);
-    JUnitTestCase.assertEquals(aliasName, alias.name);
-    EngineTestCase.assertLength(0, alias.parameters);
+    expect(alias, isNotNull);
+    expect(alias.name, aliasName);
+    expect(alias.parameters, hasLength(0));
     List<TypeParameterElement> typeParameters = alias.typeParameters;
-    EngineTestCase.assertLength(1, typeParameters);
+    expect(typeParameters, hasLength(1));
     TypeParameterElement typeParameter = typeParameters[0];
-    JUnitTestCase.assertNotNull(typeParameter);
-    JUnitTestCase.assertEquals(parameterName, typeParameter.name);
+    expect(typeParameter, isNotNull);
+    expect(typeParameter.name, parameterName);
   }
 
   void test_visitFunctionTypedFormalParameter() {
@@ -7842,19 +7642,19 @@
     _useParameterInMethod(formalParameter, 100, 110);
     formalParameter.accept(builder);
     List<ParameterElement> parameters = holder.parameters;
-    EngineTestCase.assertLength(1, parameters);
+    expect(parameters, hasLength(1));
     ParameterElement parameter = parameters[0];
-    JUnitTestCase.assertNotNull(parameter);
-    JUnitTestCase.assertEquals(parameterName, parameter.name);
-    JUnitTestCase.assertNull(parameter.initializer);
-    JUnitTestCase.assertFalse(parameter.isConst);
-    JUnitTestCase.assertFalse(parameter.isFinal);
-    JUnitTestCase.assertFalse(parameter.isSynthetic);
-    JUnitTestCase.assertEquals(ParameterKind.REQUIRED, parameter.parameterKind);
+    expect(parameter, isNotNull);
+    expect(parameter.name, parameterName);
+    expect(parameter.initializer, isNull);
+    expect(parameter.isConst, isFalse);
+    expect(parameter.isFinal, isFalse);
+    expect(parameter.isSynthetic, isFalse);
+    expect(parameter.parameterKind, ParameterKind.REQUIRED);
     {
       SourceRange visibleRange = parameter.visibleRange;
-      JUnitTestCase.assertEquals(visibleRange.offset, 100);
-      JUnitTestCase.assertEquals(visibleRange.end, 110);
+      expect(100, visibleRange.offset);
+      expect(110, visibleRange.end);
     }
   }
 
@@ -7867,11 +7667,11 @@
         AstFactory.breakStatement());
     statement.accept(builder);
     List<LabelElement> labels = holder.labels;
-    EngineTestCase.assertLength(1, labels);
+    expect(labels, hasLength(1));
     LabelElement label = labels[0];
-    JUnitTestCase.assertNotNull(label);
-    JUnitTestCase.assertEquals(labelName, label.name);
-    JUnitTestCase.assertFalse(label.isSynthetic);
+    expect(label, isNotNull);
+    expect(label.name, labelName);
+    expect(label.isSynthetic, isFalse);
   }
 
   void test_visitMethodDeclaration_abstract() {
@@ -7888,17 +7688,17 @@
         AstFactory.emptyFunctionBody());
     methodDeclaration.accept(builder);
     List<MethodElement> methods = holder.methods;
-    EngineTestCase.assertLength(1, methods);
+    expect(methods, hasLength(1));
     MethodElement method = methods[0];
-    JUnitTestCase.assertNotNull(method);
-    JUnitTestCase.assertEquals(methodName, method.name);
-    EngineTestCase.assertLength(0, method.functions);
-    EngineTestCase.assertLength(0, method.labels);
-    EngineTestCase.assertLength(0, method.localVariables);
-    EngineTestCase.assertLength(0, method.parameters);
-    JUnitTestCase.assertTrue(method.isAbstract);
-    JUnitTestCase.assertFalse(method.isStatic);
-    JUnitTestCase.assertFalse(method.isSynthetic);
+    expect(method, isNotNull);
+    expect(method.name, methodName);
+    expect(method.functions, hasLength(0));
+    expect(method.labels, hasLength(0));
+    expect(method.localVariables, hasLength(0));
+    expect(method.parameters, hasLength(0));
+    expect(method.isAbstract, isTrue);
+    expect(method.isStatic, isFalse);
+    expect(method.isSynthetic, isFalse);
   }
 
   void test_visitMethodDeclaration_getter() {
@@ -7915,23 +7715,23 @@
         AstFactory.blockFunctionBody2([]));
     methodDeclaration.accept(builder);
     List<FieldElement> fields = holder.fields;
-    EngineTestCase.assertLength(1, fields);
+    expect(fields, hasLength(1));
     FieldElement field = fields[0];
-    JUnitTestCase.assertNotNull(field);
-    JUnitTestCase.assertEquals(methodName, field.name);
-    JUnitTestCase.assertTrue(field.isSynthetic);
-    JUnitTestCase.assertNull(field.setter);
+    expect(field, isNotNull);
+    expect(field.name, methodName);
+    expect(field.isSynthetic, isTrue);
+    expect(field.setter, isNull);
     PropertyAccessorElement getter = field.getter;
-    JUnitTestCase.assertNotNull(getter);
-    JUnitTestCase.assertFalse(getter.isAbstract);
-    JUnitTestCase.assertTrue(getter.isGetter);
-    JUnitTestCase.assertFalse(getter.isSynthetic);
-    JUnitTestCase.assertEquals(methodName, getter.name);
-    JUnitTestCase.assertEquals(field, getter.variable);
-    EngineTestCase.assertLength(0, getter.functions);
-    EngineTestCase.assertLength(0, getter.labels);
-    EngineTestCase.assertLength(0, getter.localVariables);
-    EngineTestCase.assertLength(0, getter.parameters);
+    expect(getter, isNotNull);
+    expect(getter.isAbstract, isFalse);
+    expect(getter.isGetter, isTrue);
+    expect(getter.isSynthetic, isFalse);
+    expect(getter.name, methodName);
+    expect(getter.variable, field);
+    expect(getter.functions, hasLength(0));
+    expect(getter.labels, hasLength(0));
+    expect(getter.localVariables, hasLength(0));
+    expect(getter.parameters, hasLength(0));
   }
 
   void test_visitMethodDeclaration_getter_abstract() {
@@ -7948,23 +7748,23 @@
         AstFactory.emptyFunctionBody());
     methodDeclaration.accept(builder);
     List<FieldElement> fields = holder.fields;
-    EngineTestCase.assertLength(1, fields);
+    expect(fields, hasLength(1));
     FieldElement field = fields[0];
-    JUnitTestCase.assertNotNull(field);
-    JUnitTestCase.assertEquals(methodName, field.name);
-    JUnitTestCase.assertTrue(field.isSynthetic);
-    JUnitTestCase.assertNull(field.setter);
+    expect(field, isNotNull);
+    expect(field.name, methodName);
+    expect(field.isSynthetic, isTrue);
+    expect(field.setter, isNull);
     PropertyAccessorElement getter = field.getter;
-    JUnitTestCase.assertNotNull(getter);
-    JUnitTestCase.assertTrue(getter.isAbstract);
-    JUnitTestCase.assertTrue(getter.isGetter);
-    JUnitTestCase.assertFalse(getter.isSynthetic);
-    JUnitTestCase.assertEquals(methodName, getter.name);
-    JUnitTestCase.assertEquals(field, getter.variable);
-    EngineTestCase.assertLength(0, getter.functions);
-    EngineTestCase.assertLength(0, getter.labels);
-    EngineTestCase.assertLength(0, getter.localVariables);
-    EngineTestCase.assertLength(0, getter.parameters);
+    expect(getter, isNotNull);
+    expect(getter.isAbstract, isTrue);
+    expect(getter.isGetter, isTrue);
+    expect(getter.isSynthetic, isFalse);
+    expect(getter.name, methodName);
+    expect(getter.variable, field);
+    expect(getter.functions, hasLength(0));
+    expect(getter.labels, hasLength(0));
+    expect(getter.localVariables, hasLength(0));
+    expect(getter.parameters, hasLength(0));
   }
 
   void test_visitMethodDeclaration_getter_external() {
@@ -7980,23 +7780,23 @@
         AstFactory.formalParameterList([]));
     methodDeclaration.accept(builder);
     List<FieldElement> fields = holder.fields;
-    EngineTestCase.assertLength(1, fields);
+    expect(fields, hasLength(1));
     FieldElement field = fields[0];
-    JUnitTestCase.assertNotNull(field);
-    JUnitTestCase.assertEquals(methodName, field.name);
-    JUnitTestCase.assertTrue(field.isSynthetic);
-    JUnitTestCase.assertNull(field.setter);
+    expect(field, isNotNull);
+    expect(field.name, methodName);
+    expect(field.isSynthetic, isTrue);
+    expect(field.setter, isNull);
     PropertyAccessorElement getter = field.getter;
-    JUnitTestCase.assertNotNull(getter);
-    JUnitTestCase.assertFalse(getter.isAbstract);
-    JUnitTestCase.assertTrue(getter.isGetter);
-    JUnitTestCase.assertFalse(getter.isSynthetic);
-    JUnitTestCase.assertEquals(methodName, getter.name);
-    JUnitTestCase.assertEquals(field, getter.variable);
-    EngineTestCase.assertLength(0, getter.functions);
-    EngineTestCase.assertLength(0, getter.labels);
-    EngineTestCase.assertLength(0, getter.localVariables);
-    EngineTestCase.assertLength(0, getter.parameters);
+    expect(getter, isNotNull);
+    expect(getter.isAbstract, isFalse);
+    expect(getter.isGetter, isTrue);
+    expect(getter.isSynthetic, isFalse);
+    expect(getter.name, methodName);
+    expect(getter.variable, field);
+    expect(getter.functions, hasLength(0));
+    expect(getter.labels, hasLength(0));
+    expect(getter.localVariables, hasLength(0));
+    expect(getter.parameters, hasLength(0));
   }
 
   void test_visitMethodDeclaration_minimal() {
@@ -8013,17 +7813,17 @@
         AstFactory.blockFunctionBody2([]));
     methodDeclaration.accept(builder);
     List<MethodElement> methods = holder.methods;
-    EngineTestCase.assertLength(1, methods);
+    expect(methods, hasLength(1));
     MethodElement method = methods[0];
-    JUnitTestCase.assertNotNull(method);
-    JUnitTestCase.assertEquals(methodName, method.name);
-    EngineTestCase.assertLength(0, method.functions);
-    EngineTestCase.assertLength(0, method.labels);
-    EngineTestCase.assertLength(0, method.localVariables);
-    EngineTestCase.assertLength(0, method.parameters);
-    JUnitTestCase.assertFalse(method.isAbstract);
-    JUnitTestCase.assertFalse(method.isStatic);
-    JUnitTestCase.assertFalse(method.isSynthetic);
+    expect(method, isNotNull);
+    expect(method.name, methodName);
+    expect(method.functions, hasLength(0));
+    expect(method.labels, hasLength(0));
+    expect(method.localVariables, hasLength(0));
+    expect(method.parameters, hasLength(0));
+    expect(method.isAbstract, isFalse);
+    expect(method.isStatic, isFalse);
+    expect(method.isSynthetic, isFalse);
   }
 
   void test_visitMethodDeclaration_operator() {
@@ -8040,17 +7840,17 @@
         AstFactory.blockFunctionBody2([]));
     methodDeclaration.accept(builder);
     List<MethodElement> methods = holder.methods;
-    EngineTestCase.assertLength(1, methods);
+    expect(methods, hasLength(1));
     MethodElement method = methods[0];
-    JUnitTestCase.assertNotNull(method);
-    JUnitTestCase.assertEquals(methodName, method.name);
-    EngineTestCase.assertLength(0, method.functions);
-    EngineTestCase.assertLength(0, method.labels);
-    EngineTestCase.assertLength(0, method.localVariables);
-    EngineTestCase.assertLength(1, method.parameters);
-    JUnitTestCase.assertFalse(method.isAbstract);
-    JUnitTestCase.assertFalse(method.isStatic);
-    JUnitTestCase.assertFalse(method.isSynthetic);
+    expect(method, isNotNull);
+    expect(method.name, methodName);
+    expect(method.functions, hasLength(0));
+    expect(method.labels, hasLength(0));
+    expect(method.localVariables, hasLength(0));
+    expect(method.parameters, hasLength(1));
+    expect(method.isAbstract, isFalse);
+    expect(method.isStatic, isFalse);
+    expect(method.isSynthetic, isFalse);
   }
 
   void test_visitMethodDeclaration_setter() {
@@ -8067,24 +7867,24 @@
         AstFactory.blockFunctionBody2([]));
     methodDeclaration.accept(builder);
     List<FieldElement> fields = holder.fields;
-    EngineTestCase.assertLength(1, fields);
+    expect(fields, hasLength(1));
     FieldElement field = fields[0];
-    JUnitTestCase.assertNotNull(field);
-    JUnitTestCase.assertEquals(methodName, field.name);
-    JUnitTestCase.assertTrue(field.isSynthetic);
-    JUnitTestCase.assertNull(field.getter);
+    expect(field, isNotNull);
+    expect(field.name, methodName);
+    expect(field.isSynthetic, isTrue);
+    expect(field.getter, isNull);
     PropertyAccessorElement setter = field.setter;
-    JUnitTestCase.assertNotNull(setter);
-    JUnitTestCase.assertFalse(setter.isAbstract);
-    JUnitTestCase.assertTrue(setter.isSetter);
-    JUnitTestCase.assertFalse(setter.isSynthetic);
-    JUnitTestCase.assertEquals("${methodName}=", setter.name);
-    JUnitTestCase.assertEquals(methodName, setter.displayName);
-    JUnitTestCase.assertEquals(field, setter.variable);
-    EngineTestCase.assertLength(0, setter.functions);
-    EngineTestCase.assertLength(0, setter.labels);
-    EngineTestCase.assertLength(0, setter.localVariables);
-    EngineTestCase.assertLength(0, setter.parameters);
+    expect(setter, isNotNull);
+    expect(setter.isAbstract, isFalse);
+    expect(setter.isSetter, isTrue);
+    expect(setter.isSynthetic, isFalse);
+    expect(setter.name, "$methodName=");
+    expect(setter.displayName, methodName);
+    expect(setter.variable, field);
+    expect(setter.functions, hasLength(0));
+    expect(setter.labels, hasLength(0));
+    expect(setter.localVariables, hasLength(0));
+    expect(setter.parameters, hasLength(0));
   }
 
   void test_visitMethodDeclaration_setter_abstract() {
@@ -8101,24 +7901,24 @@
         AstFactory.emptyFunctionBody());
     methodDeclaration.accept(builder);
     List<FieldElement> fields = holder.fields;
-    EngineTestCase.assertLength(1, fields);
+    expect(fields, hasLength(1));
     FieldElement field = fields[0];
-    JUnitTestCase.assertNotNull(field);
-    JUnitTestCase.assertEquals(methodName, field.name);
-    JUnitTestCase.assertTrue(field.isSynthetic);
-    JUnitTestCase.assertNull(field.getter);
+    expect(field, isNotNull);
+    expect(field.name, methodName);
+    expect(field.isSynthetic, isTrue);
+    expect(field.getter, isNull);
     PropertyAccessorElement setter = field.setter;
-    JUnitTestCase.assertNotNull(setter);
-    JUnitTestCase.assertTrue(setter.isAbstract);
-    JUnitTestCase.assertTrue(setter.isSetter);
-    JUnitTestCase.assertFalse(setter.isSynthetic);
-    JUnitTestCase.assertEquals("${methodName}=", setter.name);
-    JUnitTestCase.assertEquals(methodName, setter.displayName);
-    JUnitTestCase.assertEquals(field, setter.variable);
-    EngineTestCase.assertLength(0, setter.functions);
-    EngineTestCase.assertLength(0, setter.labels);
-    EngineTestCase.assertLength(0, setter.localVariables);
-    EngineTestCase.assertLength(0, setter.parameters);
+    expect(setter, isNotNull);
+    expect(setter.isAbstract, isTrue);
+    expect(setter.isSetter, isTrue);
+    expect(setter.isSynthetic, isFalse);
+    expect(setter.name, "$methodName=");
+    expect(setter.displayName, methodName);
+    expect(setter.variable, field);
+    expect(setter.functions, hasLength(0));
+    expect(setter.labels, hasLength(0));
+    expect(setter.localVariables, hasLength(0));
+    expect(setter.parameters, hasLength(0));
   }
 
   void test_visitMethodDeclaration_setter_external() {
@@ -8134,24 +7934,24 @@
         AstFactory.formalParameterList([]));
     methodDeclaration.accept(builder);
     List<FieldElement> fields = holder.fields;
-    EngineTestCase.assertLength(1, fields);
+    expect(fields, hasLength(1));
     FieldElement field = fields[0];
-    JUnitTestCase.assertNotNull(field);
-    JUnitTestCase.assertEquals(methodName, field.name);
-    JUnitTestCase.assertTrue(field.isSynthetic);
-    JUnitTestCase.assertNull(field.getter);
+    expect(field, isNotNull);
+    expect(field.name, methodName);
+    expect(field.isSynthetic, isTrue);
+    expect(field.getter, isNull);
     PropertyAccessorElement setter = field.setter;
-    JUnitTestCase.assertNotNull(setter);
-    JUnitTestCase.assertFalse(setter.isAbstract);
-    JUnitTestCase.assertTrue(setter.isSetter);
-    JUnitTestCase.assertFalse(setter.isSynthetic);
-    JUnitTestCase.assertEquals("${methodName}=", setter.name);
-    JUnitTestCase.assertEquals(methodName, setter.displayName);
-    JUnitTestCase.assertEquals(field, setter.variable);
-    EngineTestCase.assertLength(0, setter.functions);
-    EngineTestCase.assertLength(0, setter.labels);
-    EngineTestCase.assertLength(0, setter.localVariables);
-    EngineTestCase.assertLength(0, setter.parameters);
+    expect(setter, isNotNull);
+    expect(setter.isAbstract, isFalse);
+    expect(setter.isSetter, isTrue);
+    expect(setter.isSynthetic, isFalse);
+    expect(setter.name, "$methodName=");
+    expect(setter.displayName, methodName);
+    expect(setter.variable, field);
+    expect(setter.functions, hasLength(0));
+    expect(setter.labels, hasLength(0));
+    expect(setter.localVariables, hasLength(0));
+    expect(setter.parameters, hasLength(0));
   }
 
   void test_visitMethodDeclaration_static() {
@@ -8168,17 +7968,17 @@
         AstFactory.blockFunctionBody2([]));
     methodDeclaration.accept(builder);
     List<MethodElement> methods = holder.methods;
-    EngineTestCase.assertLength(1, methods);
+    expect(methods, hasLength(1));
     MethodElement method = methods[0];
-    JUnitTestCase.assertNotNull(method);
-    JUnitTestCase.assertEquals(methodName, method.name);
-    EngineTestCase.assertLength(0, method.functions);
-    EngineTestCase.assertLength(0, method.labels);
-    EngineTestCase.assertLength(0, method.localVariables);
-    EngineTestCase.assertLength(0, method.parameters);
-    JUnitTestCase.assertFalse(method.isAbstract);
-    JUnitTestCase.assertTrue(method.isStatic);
-    JUnitTestCase.assertFalse(method.isSynthetic);
+    expect(method, isNotNull);
+    expect(method.name, methodName);
+    expect(method.functions, hasLength(0));
+    expect(method.labels, hasLength(0));
+    expect(method.localVariables, hasLength(0));
+    expect(method.parameters, hasLength(0));
+    expect(method.isAbstract, isFalse);
+    expect(method.isStatic, isTrue);
+    expect(method.isSynthetic, isFalse);
   }
 
   void test_visitMethodDeclaration_withMembers() {
@@ -8211,34 +8011,33 @@
                     [AstFactory.catchClause(exceptionParameterName, [])])]));
     methodDeclaration.accept(builder);
     List<MethodElement> methods = holder.methods;
-    EngineTestCase.assertLength(1, methods);
+    expect(methods, hasLength(1));
     MethodElement method = methods[0];
-    JUnitTestCase.assertNotNull(method);
-    JUnitTestCase.assertEquals(methodName, method.name);
-    JUnitTestCase.assertFalse(method.isAbstract);
-    JUnitTestCase.assertFalse(method.isStatic);
-    JUnitTestCase.assertFalse(method.isSynthetic);
+    expect(method, isNotNull);
+    expect(method.name, methodName);
+    expect(method.isAbstract, isFalse);
+    expect(method.isStatic, isFalse);
+    expect(method.isSynthetic, isFalse);
     List<VariableElement> parameters = method.parameters;
-    EngineTestCase.assertLength(1, parameters);
+    expect(parameters, hasLength(1));
     VariableElement parameter = parameters[0];
-    JUnitTestCase.assertNotNull(parameter);
-    JUnitTestCase.assertEquals(parameterName, parameter.name);
+    expect(parameter, isNotNull);
+    expect(parameter.name, parameterName);
     List<VariableElement> localVariables = method.localVariables;
-    EngineTestCase.assertLength(2, localVariables);
+    expect(localVariables, hasLength(2));
     VariableElement firstVariable = localVariables[0];
     VariableElement secondVariable = localVariables[1];
-    JUnitTestCase.assertNotNull(firstVariable);
-    JUnitTestCase.assertNotNull(secondVariable);
-    JUnitTestCase.assertTrue(
-        (firstVariable.name == localVariableName &&
+    expect(firstVariable, isNotNull);
+    expect(secondVariable, isNotNull);
+    expect((firstVariable.name == localVariableName &&
             secondVariable.name == exceptionParameterName) ||
             (firstVariable.name == exceptionParameterName &&
-                secondVariable.name == localVariableName));
+                secondVariable.name == localVariableName), isTrue);
     List<LabelElement> labels = method.labels;
-    EngineTestCase.assertLength(1, labels);
+    expect(labels, hasLength(1));
     LabelElement label = labels[0];
-    JUnitTestCase.assertNotNull(label);
-    JUnitTestCase.assertEquals(labelName, label.name);
+    expect(label, isNotNull);
+    expect(label.name, labelName);
   }
 
   void test_visitNamedFormalParameter() {
@@ -8251,23 +8050,23 @@
     _useParameterInMethod(formalParameter, 100, 110);
     formalParameter.accept(builder);
     List<ParameterElement> parameters = holder.parameters;
-    EngineTestCase.assertLength(1, parameters);
+    expect(parameters, hasLength(1));
     ParameterElement parameter = parameters[0];
-    JUnitTestCase.assertNotNull(parameter);
-    JUnitTestCase.assertEquals(parameterName, parameter.name);
-    JUnitTestCase.assertFalse(parameter.isConst);
-    JUnitTestCase.assertFalse(parameter.isFinal);
-    JUnitTestCase.assertFalse(parameter.isSynthetic);
-    JUnitTestCase.assertEquals(ParameterKind.NAMED, parameter.parameterKind);
+    expect(parameter, isNotNull);
+    expect(parameter.name, parameterName);
+    expect(parameter.isConst, isFalse);
+    expect(parameter.isFinal, isFalse);
+    expect(parameter.isSynthetic, isFalse);
+    expect(parameter.parameterKind, ParameterKind.NAMED);
     {
       SourceRange visibleRange = parameter.visibleRange;
-      JUnitTestCase.assertEquals(visibleRange.offset, 100);
-      JUnitTestCase.assertEquals(visibleRange.end, 110);
+      expect(100, visibleRange.offset);
+      expect(110, visibleRange.end);
     }
-    JUnitTestCase.assertEquals("42", parameter.defaultValueCode);
+    expect(parameter.defaultValueCode, "42");
     FunctionElement initializer = parameter.initializer;
-    JUnitTestCase.assertNotNull(initializer);
-    JUnitTestCase.assertTrue(initializer.isSynthetic);
+    expect(initializer, isNotNull);
+    expect(initializer.isSynthetic, isTrue);
   }
 
   void test_visitSimpleFormalParameter() {
@@ -8279,19 +8078,19 @@
     _useParameterInMethod(formalParameter, 100, 110);
     formalParameter.accept(builder);
     List<ParameterElement> parameters = holder.parameters;
-    EngineTestCase.assertLength(1, parameters);
+    expect(parameters, hasLength(1));
     ParameterElement parameter = parameters[0];
-    JUnitTestCase.assertNotNull(parameter);
-    JUnitTestCase.assertEquals(parameterName, parameter.name);
-    JUnitTestCase.assertNull(parameter.initializer);
-    JUnitTestCase.assertFalse(parameter.isConst);
-    JUnitTestCase.assertFalse(parameter.isFinal);
-    JUnitTestCase.assertFalse(parameter.isSynthetic);
-    JUnitTestCase.assertEquals(ParameterKind.REQUIRED, parameter.parameterKind);
+    expect(parameter, isNotNull);
+    expect(parameter.name, parameterName);
+    expect(parameter.initializer, isNull);
+    expect(parameter.isConst, isFalse);
+    expect(parameter.isFinal, isFalse);
+    expect(parameter.isSynthetic, isFalse);
+    expect(parameter.parameterKind, ParameterKind.REQUIRED);
     {
       SourceRange visibleRange = parameter.visibleRange;
-      JUnitTestCase.assertEquals(visibleRange.offset, 100);
-      JUnitTestCase.assertEquals(visibleRange.end, 110);
+      expect(100, visibleRange.offset);
+      expect(110, visibleRange.end);
     }
   }
 
@@ -8302,12 +8101,12 @@
     TypeAlias typeAlias = AstFactory.typeAlias(null, aliasName, null, null);
     typeAlias.accept(builder);
     List<FunctionTypeAliasElement> aliases = holder.typeAliases;
-    EngineTestCase.assertLength(1, aliases);
+    expect(aliases, hasLength(1));
     FunctionTypeAliasElement alias = aliases[0];
-    JUnitTestCase.assertNotNull(alias);
-    JUnitTestCase.assertEquals(aliasName, alias.name);
-    JUnitTestCase.assertNotNull(alias.type);
-    JUnitTestCase.assertFalse(alias.isSynthetic);
+    expect(alias, isNotNull);
+    expect(alias.name, aliasName);
+    expect(alias.type, isNotNull);
+    expect(alias.isSynthetic, isFalse);
   }
 
   void test_visitTypeAlias_withFormalParameters() {
@@ -8326,19 +8125,19 @@
                 AstFactory.simpleFormalParameter3(secondParameterName)]));
     typeAlias.accept(builder);
     List<FunctionTypeAliasElement> aliases = holder.typeAliases;
-    EngineTestCase.assertLength(1, aliases);
+    expect(aliases, hasLength(1));
     FunctionTypeAliasElement alias = aliases[0];
-    JUnitTestCase.assertNotNull(alias);
-    JUnitTestCase.assertEquals(aliasName, alias.name);
-    JUnitTestCase.assertNotNull(alias.type);
-    JUnitTestCase.assertFalse(alias.isSynthetic);
+    expect(alias, isNotNull);
+    expect(alias.name, aliasName);
+    expect(alias.type, isNotNull);
+    expect(alias.isSynthetic, isFalse);
     List<VariableElement> parameters = alias.parameters;
-    EngineTestCase.assertLength(2, parameters);
-    JUnitTestCase.assertEquals(firstParameterName, parameters[0].name);
-    JUnitTestCase.assertEquals(secondParameterName, parameters[1].name);
+    expect(parameters, hasLength(2));
+    expect(parameters[0].name, firstParameterName);
+    expect(parameters[1].name, secondParameterName);
     List<TypeParameterElement> typeParameters = alias.typeParameters;
-    JUnitTestCase.assertNotNull(typeParameters);
-    EngineTestCase.assertLength(0, typeParameters);
+    expect(typeParameters, isNotNull);
+    expect(typeParameters, hasLength(0));
   }
 
   void test_visitTypeAlias_withTypeParameters() {
@@ -8354,19 +8153,19 @@
         AstFactory.formalParameterList([]));
     typeAlias.accept(builder);
     List<FunctionTypeAliasElement> aliases = holder.typeAliases;
-    EngineTestCase.assertLength(1, aliases);
+    expect(aliases, hasLength(1));
     FunctionTypeAliasElement alias = aliases[0];
-    JUnitTestCase.assertNotNull(alias);
-    JUnitTestCase.assertEquals(aliasName, alias.name);
-    JUnitTestCase.assertNotNull(alias.type);
-    JUnitTestCase.assertFalse(alias.isSynthetic);
+    expect(alias, isNotNull);
+    expect(alias.name, aliasName);
+    expect(alias.type, isNotNull);
+    expect(alias.isSynthetic, isFalse);
     List<VariableElement> parameters = alias.parameters;
-    JUnitTestCase.assertNotNull(parameters);
-    EngineTestCase.assertLength(0, parameters);
+    expect(parameters, isNotNull);
+    expect(parameters, hasLength(0));
     List<TypeParameterElement> typeParameters = alias.typeParameters;
-    EngineTestCase.assertLength(2, typeParameters);
-    JUnitTestCase.assertEquals(firstTypeParameterName, typeParameters[0].name);
-    JUnitTestCase.assertEquals(secondTypeParameterName, typeParameters[1].name);
+    expect(typeParameters, hasLength(2));
+    expect(typeParameters[0].name, firstTypeParameterName);
+    expect(typeParameters[1].name, secondTypeParameterName);
   }
 
   void test_visitTypeParameter() {
@@ -8376,12 +8175,12 @@
     TypeParameter typeParameter = AstFactory.typeParameter(parameterName);
     typeParameter.accept(builder);
     List<TypeParameterElement> typeParameters = holder.typeParameters;
-    EngineTestCase.assertLength(1, typeParameters);
+    expect(typeParameters, hasLength(1));
     TypeParameterElement typeParameterElement = typeParameters[0];
-    JUnitTestCase.assertNotNull(typeParameterElement);
-    JUnitTestCase.assertEquals(parameterName, typeParameterElement.name);
-    JUnitTestCase.assertNull(typeParameterElement.bound);
-    JUnitTestCase.assertFalse(typeParameterElement.isSynthetic);
+    expect(typeParameterElement, isNotNull);
+    expect(typeParameterElement.name, parameterName);
+    expect(typeParameterElement.bound, isNull);
+    expect(typeParameterElement.isSynthetic, isFalse);
   }
 
   void test_visitVariableDeclaration_inConstructor() {
@@ -8405,12 +8204,12 @@
         AstFactory.blockFunctionBody2([statement]));
     constructor.accept(builder);
     List<ConstructorElement> constructors = holder.constructors;
-    EngineTestCase.assertLength(1, constructors);
+    expect(constructors, hasLength(1));
     List<LocalVariableElement> variableElements =
         constructors[0].localVariables;
-    EngineTestCase.assertLength(1, variableElements);
+    expect(variableElements, hasLength(1));
     LocalVariableElement variableElement = variableElements[0];
-    JUnitTestCase.assertEquals(variableName, variableElement.name);
+    expect(variableElement.name, variableName);
   }
 
   void test_visitVariableDeclaration_inMethod() {
@@ -8434,11 +8233,11 @@
         AstFactory.blockFunctionBody2([statement]));
     constructor.accept(builder);
     List<MethodElement> methods = holder.methods;
-    EngineTestCase.assertLength(1, methods);
+    expect(methods, hasLength(1));
     List<LocalVariableElement> variableElements = methods[0].localVariables;
-    EngineTestCase.assertLength(1, variableElements);
+    expect(variableElements, hasLength(1));
     LocalVariableElement variableElement = variableElements[0];
-    JUnitTestCase.assertEquals(variableName, variableElement.name);
+    expect(variableElement.name, variableName);
   }
 
   void test_visitVariableDeclaration_localNestedInField() {
@@ -8462,21 +8261,21 @@
         AstFactory.fieldDeclaration2(false, null, [field]);
     fieldDeclaration.accept(builder);
     List<FieldElement> variables = holder.fields;
-    EngineTestCase.assertLength(1, variables);
+    expect(variables, hasLength(1));
     FieldElement fieldElement = variables[0];
-    JUnitTestCase.assertNotNull(fieldElement);
+    expect(fieldElement, isNotNull);
     FunctionElement initializerElement = fieldElement.initializer;
-    JUnitTestCase.assertNotNull(initializerElement);
+    expect(initializerElement, isNotNull);
     List<FunctionElement> functionElements = initializerElement.functions;
-    EngineTestCase.assertLength(1, functionElements);
+    expect(functionElements, hasLength(1));
     List<LocalVariableElement> variableElements =
         functionElements[0].localVariables;
-    EngineTestCase.assertLength(1, variableElements);
+    expect(variableElements, hasLength(1));
     LocalVariableElement variableElement = variableElements[0];
-    JUnitTestCase.assertEquals(variableName, variableElement.name);
-    JUnitTestCase.assertFalse(variableElement.isConst);
-    JUnitTestCase.assertFalse(variableElement.isFinal);
-    JUnitTestCase.assertFalse(variableElement.isSynthetic);
+    expect(variableElement.name, variableName);
+    expect(variableElement.isConst, isFalse);
+    expect(variableElement.isFinal, isFalse);
+    expect(variableElement.isSynthetic, isFalse);
   }
 
   void test_visitVariableDeclaration_noInitializer() {
@@ -8488,16 +8287,16 @@
     AstFactory.variableDeclarationList2(null, [variableDeclaration]);
     variableDeclaration.accept(builder);
     List<TopLevelVariableElement> variables = holder.topLevelVariables;
-    EngineTestCase.assertLength(1, variables);
+    expect(variables, hasLength(1));
     TopLevelVariableElement variable = variables[0];
-    JUnitTestCase.assertNotNull(variable);
-    JUnitTestCase.assertNull(variable.initializer);
-    JUnitTestCase.assertEquals(variableName, variable.name);
-    JUnitTestCase.assertFalse(variable.isConst);
-    JUnitTestCase.assertFalse(variable.isFinal);
-    JUnitTestCase.assertFalse(variable.isSynthetic);
-    JUnitTestCase.assertNotNull(variable.getter);
-    JUnitTestCase.assertNotNull(variable.setter);
+    expect(variable, isNotNull);
+    expect(variable.initializer, isNull);
+    expect(variable.name, variableName);
+    expect(variable.isConst, isFalse);
+    expect(variable.isFinal, isFalse);
+    expect(variable.isSynthetic, isFalse);
+    expect(variable.getter, isNotNull);
+    expect(variable.setter, isNotNull);
   }
 
   void _useParameterInMethod(FormalParameter formalParameter, int blockOffset,
@@ -8520,7 +8319,7 @@
 
 class ElementLocatorTest extends ResolverTestCase {
   void fail_locate_ExportDirective() {
-    AstNode id = _findNodeIn("export", ["export 'dart:core';"]);
+    AstNode id = _findNodeIn("export", "export 'dart:core';");
     Element element = ElementLocator.locate(id);
     EngineTestCase.assertInstanceOf(
         (obj) => obj is ImportElement,
@@ -8529,7 +8328,7 @@
   }
 
   void fail_locate_Identifier_libraryDirective() {
-    AstNode id = _findNodeIn("foo", ["library foo.bar;"]);
+    AstNode id = _findNodeIn("foo", "library foo.bar;");
     Element element = ElementLocator.locate(id);
     EngineTestCase.assertInstanceOf(
         (obj) => obj is LibraryElement,
@@ -8542,7 +8341,7 @@
     //    AstNode id = findNodeIn("foo", "part of foo.bar;");
     //    Element element = ElementLocator.locate(id);
     //    assertInstanceOf(LibraryElement.class, element);
-    JUnitTestCase.fail("Test this case");
+    fail("Test this case");
   }
 
   @override
@@ -8553,7 +8352,7 @@
   }
 
   void test_locateWithOffset_BinaryExpression() {
-    AstNode id = _findNodeIn("+", ["var x = 3 + 4;"]);
+    AstNode id = _findNodeIn("+", "var x = 3 + 4;");
     Element element = ElementLocator.locateWithOffset(id, 0);
     EngineTestCase.assertInstanceOf(
         (obj) => obj is MethodElement,
@@ -8562,14 +8361,18 @@
   }
 
   void test_locateWithOffset_StringLiteral() {
-    AstNode id = _findNodeIn("abc", ["var x = 'abc';"]);
+    AstNode id = _findNodeIn("abc", "var x = 'abc';");
     Element element = ElementLocator.locateWithOffset(id, 1);
-    JUnitTestCase.assertNull(element);
+    expect(element, isNull);
   }
 
   void test_locate_AssignmentExpression() {
     AstNode id =
-        _findNodeIn("+=", ["int x = 0;", "void main() {", "  x += 1;", "}"]);
+        _findNodeIn("+=", r'''
+int x = 0;
+void main() {
+  x += 1;
+}''');
     Element element = ElementLocator.locate(id);
     EngineTestCase.assertInstanceOf(
         (obj) => obj is MethodElement,
@@ -8578,7 +8381,7 @@
   }
 
   void test_locate_BinaryExpression() {
-    AstNode id = _findNodeIn("+", ["var x = 3 + 4;"]);
+    AstNode id = _findNodeIn("+", "var x = 3 + 4;");
     Element element = ElementLocator.locate(id);
     EngineTestCase.assertInstanceOf(
         (obj) => obj is MethodElement,
@@ -8587,7 +8390,7 @@
   }
 
   void test_locate_ClassDeclaration() {
-    AstNode id = _findNodeIn("class", ["class A { }"]);
+    AstNode id = _findNodeIn("class", "class A { }");
     Element element = ElementLocator.locate(id);
     EngineTestCase.assertInstanceOf(
         (obj) => obj is ClassElement,
@@ -8596,15 +8399,18 @@
   }
 
   void test_locate_CompilationUnit() {
-    CompilationUnit cu = _resolveContents(["// only comment"]);
-    JUnitTestCase.assertNotNull(cu.element);
+    CompilationUnit cu = _resolveContents("// only comment");
+    expect(cu.element, isNotNull);
     Element element = ElementLocator.locate(cu);
-    JUnitTestCase.assertSame(cu.element, element);
+    expect(element, same(cu.element));
   }
 
   void test_locate_ConstructorDeclaration() {
     AstNode id =
-        _findNodeIndexedIn("bar", 0, ["class A {", "  A.bar() {}", "}"]);
+        _findNodeIndexedIn("bar", 0, r'''
+class A {
+  A.bar() {}
+}''');
     ConstructorDeclaration declaration =
         id.getAncestor((node) => node is ConstructorDeclaration);
     Element element = ElementLocator.locate(declaration);
@@ -8615,7 +8421,7 @@
   }
 
   void test_locate_FunctionDeclaration() {
-    AstNode id = _findNodeIn("f", ["int f() => 3;"]);
+    AstNode id = _findNodeIn("f", "int f() => 3;");
     FunctionDeclaration declaration =
         id.getAncestor((node) => node is FunctionDeclaration);
     Element element = ElementLocator.locate(declaration);
@@ -8630,12 +8436,12 @@
     AstNode id = _findNodeIndexedIn(
         "Class",
         2,
-        [
-            "class Class {",
-            "  const Class.name();",
-            "}",
-            "void main(@Class.name() parameter) {",
-            "}"]);
+        r'''
+class Class {
+  const Class.name();
+}
+void main(@Class.name() parameter) {
+}''');
     Element element = ElementLocator.locate(id);
     EngineTestCase.assertInstanceOf(
         (obj) => obj is ClassElement,
@@ -8648,12 +8454,12 @@
     AstNode id = _findNodeIndexedIn(
         "Class",
         2,
-        [
-            "class Class {",
-            "  const Class();",
-            "}",
-            "void main(@Class() parameter) {",
-            "}"]);
+        r'''
+class Class {
+  const Class();
+}
+void main(@Class() parameter) {
+}''');
     Element element = ElementLocator.locate(id);
     EngineTestCase.assertInstanceOf(
         (obj) => obj is ConstructorElement,
@@ -8662,7 +8468,7 @@
   }
 
   void test_locate_Identifier_className() {
-    AstNode id = _findNodeIn("A", ["class A { }"]);
+    AstNode id = _findNodeIn("A", "class A { }");
     Element element = ElementLocator.locate(id);
     EngineTestCase.assertInstanceOf(
         (obj) => obj is ClassElement,
@@ -8672,7 +8478,10 @@
 
   void test_locate_Identifier_constructor_named() {
     AstNode id =
-        _findNodeIndexedIn("bar", 0, ["class A {", "  A.bar() {}", "}"]);
+        _findNodeIndexedIn("bar", 0, r'''
+class A {
+  A.bar() {}
+}''');
     Element element = ElementLocator.locate(id);
     EngineTestCase.assertInstanceOf(
         (obj) => obj is ConstructorElement,
@@ -8681,7 +8490,10 @@
   }
 
   void test_locate_Identifier_constructor_unnamed() {
-    AstNode id = _findNodeIndexedIn("A", 1, ["class A {", "  A() {}", "}"]);
+    AstNode id = _findNodeIndexedIn("A", 1, r'''
+class A {
+  A() {}
+}''');
     Element element = ElementLocator.locate(id);
     EngineTestCase.assertInstanceOf(
         (obj) => obj is ConstructorElement,
@@ -8690,7 +8502,7 @@
   }
 
   void test_locate_Identifier_fieldName() {
-    AstNode id = _findNodeIn("x", ["class A { var x; }"]);
+    AstNode id = _findNodeIn("x", "class A { var x; }");
     Element element = ElementLocator.locate(id);
     EngineTestCase.assertInstanceOf(
         (obj) => obj is FieldElement,
@@ -8700,7 +8512,10 @@
 
   void test_locate_Identifier_propertAccess() {
     AstNode id =
-        _findNodeIn("length", ["void main() {", " int x = 'foo'.length;", "}"]);
+        _findNodeIn("length", r'''
+void main() {
+ int x = 'foo'.length;
+}''');
     Element element = ElementLocator.locate(id);
     EngineTestCase.assertInstanceOf(
         (obj) => obj is PropertyAccessorElement,
@@ -8709,7 +8524,7 @@
   }
 
   void test_locate_ImportDirective() {
-    AstNode id = _findNodeIn("import", ["import 'dart:core';"]);
+    AstNode id = _findNodeIn("import", "import 'dart:core';");
     Element element = ElementLocator.locate(id);
     EngineTestCase.assertInstanceOf(
         (obj) => obj is ImportElement,
@@ -8721,7 +8536,11 @@
     AstNode id = _findNodeIndexedIn(
         "\\[",
         1,
-        ["void main() {", "  List x = [1, 2];", "  var y = x[0];", "}"]);
+        r'''
+void main() {
+  List x = [1, 2];
+  var y = x[0];
+}''');
     Element element = ElementLocator.locate(id);
     EngineTestCase.assertInstanceOf(
         (obj) => obj is MethodElement,
@@ -8731,7 +8550,11 @@
 
   void test_locate_InstanceCreationExpression() {
     AstNode node =
-        _findNodeIndexedIn("A(", 0, ["class A {}", "void main() {", " new A();", "}"]);
+        _findNodeIndexedIn("A(", 0, r'''
+class A {}
+void main() {
+ new A();
+}''');
     Element element = ElementLocator.locate(node);
     EngineTestCase.assertInstanceOf(
         (obj) => obj is ConstructorElement,
@@ -8758,7 +8581,7 @@
     creation.constructorName.staticElement = constructorElement;
     // verify that "A" is resolved to ConstructorElement
     Element element = ElementLocator.locate(identifier);
-    JUnitTestCase.assertSame(classElement, element);
+    expect(element, same(classElement));
   }
 
   void test_locate_InstanceCreationExpression_type_simpleIdentifier() {
@@ -8778,11 +8601,11 @@
     creation.constructorName.staticElement = constructorElement;
     // verify that "A" is resolved to ConstructorElement
     Element element = ElementLocator.locate(identifier);
-    JUnitTestCase.assertSame(classElement, element);
+    expect(element, same(classElement));
   }
 
   void test_locate_LibraryDirective() {
-    AstNode id = _findNodeIn("library", ["library foo;"]);
+    AstNode id = _findNodeIn("library", "library foo;");
     Element element = ElementLocator.locate(id);
     EngineTestCase.assertInstanceOf(
         (obj) => obj is LibraryElement,
@@ -8791,7 +8614,10 @@
   }
 
   void test_locate_MethodDeclaration() {
-    AstNode id = _findNodeIn("m", ["class A {", "  void m() {}", "}"]);
+    AstNode id = _findNodeIn("m", r'''
+class A {
+  void m() {}
+}''');
     MethodDeclaration declaration =
         id.getAncestor((node) => node is MethodDeclaration);
     Element element = ElementLocator.locate(declaration);
@@ -8805,13 +8631,13 @@
     AstNode id = _findNodeIndexedIn(
         "bar",
         1,
-        [
-            "class A {",
-            "  int bar() => 42;",
-            "}",
-            "void main() {",
-            " var f = new A().bar();",
-            "}"]);
+        r'''
+class A {
+  int bar() => 42;
+}
+void main() {
+ var f = new A().bar();
+}''');
     Element element = ElementLocator.locate(id);
     EngineTestCase.assertInstanceOf(
         (obj) => obj is MethodElement,
@@ -8820,10 +8646,14 @@
   }
 
   void test_locate_MethodInvocation_topLevel() {
-    String contents =
-        EngineTestCase.createSource(["foo(x) {}", "void main() {", " foo(0);", "}"]);
-    CompilationUnit cu = _resolveContents([contents]);
-    int offset = contents.indexOf('foo(0)');
+    String code =
+        r'''
+foo(x) {}
+void main() {
+ foo(0);
+}''';
+    CompilationUnit cu = _resolveContents(code);
+    int offset = code.indexOf('foo(0)');
     AstNode node = new NodeLocator.con1(offset).searchWithin(cu);
     MethodInvocation invocation =
         node.getAncestor((n) => n is MethodInvocation);
@@ -8835,7 +8665,7 @@
   }
 
   void test_locate_PostfixExpression() {
-    AstNode id = _findNodeIn("++", ["int addOne(int x) => x++;"]);
+    AstNode id = _findNodeIn("++", "int addOne(int x) => x++;");
     Element element = ElementLocator.locate(id);
     EngineTestCase.assertInstanceOf(
         (obj) => obj is MethodElement,
@@ -8844,7 +8674,7 @@
   }
 
   void test_locate_PrefixExpression() {
-    AstNode id = _findNodeIn("++", ["int addOne(int x) => ++x;"]);
+    AstNode id = _findNodeIn("++", "int addOne(int x) => ++x;");
     Element element = ElementLocator.locate(id);
     EngineTestCase.assertInstanceOf(
         (obj) => obj is MethodElement,
@@ -8854,7 +8684,9 @@
 
   void test_locate_PrefixedIdentifier() {
     AstNode id =
-        _findNodeIn("int", ["import 'dart:core' as core;", "core.int value;"]);
+        _findNodeIn("int", r'''
+import 'dart:core' as core;
+core.int value;''');
     PrefixedIdentifier identifier =
         id.getAncestor((node) => node is PrefixedIdentifier);
     Element element = ElementLocator.locate(identifier);
@@ -8866,7 +8698,7 @@
 
   void test_locate_StringLiteral_exportUri() {
     addNamedSource("/foo.dart", "library foo;");
-    AstNode id = _findNodeIn("'foo.dart'", ["export 'foo.dart';"]);
+    AstNode id = _findNodeIn("'foo.dart'", "export 'foo.dart';");
     Element element = ElementLocator.locate(id);
     EngineTestCase.assertInstanceOf(
         (obj) => obj is LibraryElement,
@@ -8875,15 +8707,15 @@
   }
 
   void test_locate_StringLiteral_expression() {
-    AstNode id = _findNodeIn("abc", ["var x = 'abc';"]);
+    AstNode id = _findNodeIn("abc", "var x = 'abc';");
     Element element = ElementLocator.locate(id);
-    JUnitTestCase.assertNull(element);
+    expect(element, isNull);
   }
 
   void test_locate_StringLiteral_importUri() {
     addNamedSource("/foo.dart", "library foo; class A {}");
     AstNode id =
-        _findNodeIn("'foo.dart'", ["import 'foo.dart'; class B extends A {}"]);
+        _findNodeIn("'foo.dart'", "import 'foo.dart'; class B extends A {}");
     Element element = ElementLocator.locate(id);
     EngineTestCase.assertInstanceOf(
         (obj) => obj is LibraryElement,
@@ -8893,7 +8725,7 @@
 
   void test_locate_StringLiteral_partUri() {
     addNamedSource("/foo.dart", "part of app;");
-    AstNode id = _findNodeIn("'foo.dart'", ["library app; part 'foo.dart';"]);
+    AstNode id = _findNodeIn("'foo.dart'", "library app; part 'foo.dart';");
     Element element = ElementLocator.locate(id);
     EngineTestCase.assertInstanceOf(
         (obj) => obj is CompilationUnitElement,
@@ -8902,7 +8734,7 @@
   }
 
   void test_locate_VariableDeclaration() {
-    AstNode id = _findNodeIn("x", ["var x = 'abc';"]);
+    AstNode id = _findNodeIn("x", "var x = 'abc';");
     VariableDeclaration declaration =
         id.getAncestor((node) => node is VariableDeclaration);
     Element element = ElementLocator.locate(declaration);
@@ -8915,30 +8747,27 @@
   /**
    * Find the first AST node matching a pattern in the resolved AST for the given source.
    *
-   * @param nodePattern the (unique) pattern used to identify the node of interest
-   * @param lines the lines to be merged into a single source string
-   * @return the matched node in the resolved AST for the given source lines
-   * @throws Exception if source cannot be verified
+   * [nodePattern] the (unique) pattern used to identify the node of interest.
+   * [code] the code to resolve.
+   * Returns the matched node in the resolved AST for the given source lines.
    */
-  AstNode _findNodeIn(String nodePattern, List<String> lines) {
-    return _findNodeIndexedIn(nodePattern, 0, lines);
+  AstNode _findNodeIn(String nodePattern, String code) {
+    return _findNodeIndexedIn(nodePattern, 0, code);
   }
 
   /**
    * Find the AST node matching the given indexed occurrence of a pattern in the resolved AST for
    * the given source.
    *
-   * @param nodePattern the pattern used to identify the node of interest
-   * @param index the index of the pattern match of interest
-   * @param lines the lines to be merged into a single source string
-   * @return the matched node in the resolved AST for the given source lines
-   * @throws Exception if source cannot be verified
+   * [nodePattern] the pattern used to identify the node of interest.
+   * [index] the index of the pattern match of interest.
+   * [code] the code to resolve.
+   * Returns the matched node in the resolved AST for the given source lines
    */
   AstNode _findNodeIndexedIn(String nodePattern, int index,
-      List<String> lines) {
-    String contents = EngineTestCase.createSource(lines);
-    CompilationUnit cu = _resolveContents([contents]);
-    int start = _getOffsetOfMatch(contents, nodePattern, index);
+                             String code) {
+    CompilationUnit cu = _resolveContents(code);
+    int start = _getOffsetOfMatch(code, nodePattern, index);
     int end = start + nodePattern.length;
     return new NodeLocator.con2(start, end).searchWithin(cu);
   }
@@ -8960,14 +8789,18 @@
   }
 
   /**
-   * Parse, resolve and verify the given source lines to produce a fully resolved AST.
+   * Parse, resolve and verify the given source lines to produce a fully
+   * resolved AST.
    *
-   * @param lines the lines to be merged into a single source string
-   * @return the result of resolving the AST structure representing the content of the source
-   * @throws Exception if source cannot be verified
+   * [code] the code to resolve.
+   *
+   * Returns the result of resolving the AST structure representing the content
+   * of the source.
+   *
+   * Throws if source cannot be verified.
    */
-  CompilationUnit _resolveContents(List<String> lines) {
-    Source source = addSource(EngineTestCase.createSource(lines));
+  CompilationUnit _resolveContents(String code) {
+    Source source = addSource(code);
     LibraryElement library = resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -8983,44 +8816,65 @@
     String thirdName = "THREE";
     EnumDeclaration enumDeclaration =
         AstFactory.enumDeclaration2("E", [firstName, secondName, thirdName]);
+
     ClassElement enumElement = _buildElement(enumDeclaration);
     List<FieldElement> fields = enumElement.fields;
-    EngineTestCase.assertLength(5, fields);
+    expect(fields, hasLength(5));
+
     FieldElement constant = fields[2];
-    JUnitTestCase.assertNotNull(constant);
-    JUnitTestCase.assertEquals(firstName, constant.name);
-    JUnitTestCase.assertTrue(constant.isStatic);
+    expect(constant, isNotNull);
+    expect(constant.name, firstName);
+    expect(constant.isStatic, isTrue);
+    _assertGetter(constant);
+
     constant = fields[3];
-    JUnitTestCase.assertNotNull(constant);
-    JUnitTestCase.assertEquals(secondName, constant.name);
-    JUnitTestCase.assertTrue(constant.isStatic);
+    expect(constant, isNotNull);
+    expect(constant.name, secondName);
+    expect(constant.isStatic, isTrue);
+    _assertGetter(constant);
+
     constant = fields[4];
-    JUnitTestCase.assertNotNull(constant);
-    JUnitTestCase.assertEquals(thirdName, constant.name);
-    JUnitTestCase.assertTrue(constant.isStatic);
+    expect(constant, isNotNull);
+    expect(constant.name, thirdName);
+    expect(constant.isStatic, isTrue);
+    _assertGetter(constant);
   }
 
   void test_visitEnumDeclaration_single() {
     String firstName = "ONE";
     EnumDeclaration enumDeclaration =
         AstFactory.enumDeclaration2("E", [firstName]);
+
     ClassElement enumElement = _buildElement(enumDeclaration);
     List<FieldElement> fields = enumElement.fields;
-    EngineTestCase.assertLength(3, fields);
+    expect(fields, hasLength(3));
+
     FieldElement field = fields[0];
-    JUnitTestCase.assertNotNull(field);
-    JUnitTestCase.assertEquals("index", field.name);
-    JUnitTestCase.assertFalse(field.isStatic);
-    JUnitTestCase.assertTrue(field.isSynthetic);
+    expect(field, isNotNull);
+    expect(field.name, "index");
+    expect(field.isStatic, isFalse);
+    expect(field.isSynthetic, isTrue);
+    _assertGetter(field);
+
     field = fields[1];
-    JUnitTestCase.assertNotNull(field);
-    JUnitTestCase.assertEquals("values", field.name);
-    JUnitTestCase.assertTrue(field.isStatic);
-    JUnitTestCase.assertTrue(field.isSynthetic);
+    expect(field, isNotNull);
+    expect(field.name, "values");
+    expect(field.isStatic, isTrue);
+    expect(field.isSynthetic, isTrue);
+    _assertGetter(field);
+
     FieldElement constant = fields[2];
-    JUnitTestCase.assertNotNull(constant);
-    JUnitTestCase.assertEquals(firstName, constant.name);
-    JUnitTestCase.assertTrue(constant.isStatic);
+    expect(constant, isNotNull);
+    expect(constant.name, firstName);
+    expect(constant.isStatic, isTrue);
+    _assertGetter(constant);
+  }
+
+  void _assertGetter(FieldElement field) {
+    PropertyAccessorElement getter = field.getter;
+    expect(getter, isNotNull);
+    expect(getter.variable, same(field));
+    expect(getter.type, isNotNull);
   }
 
   ClassElement _buildElement(EnumDeclaration enumDeclaration) {
@@ -9031,7 +8885,7 @@
         new EnumMemberBuilder(new TestTypeProvider());
     enumDeclaration.accept(memberBuilder);
     List<ClassElement> enums = holder.enums;
-    EngineTestCase.assertLength(1, enums);
+    expect(enums, hasLength(1));
     return enums[0];
   }
 }
@@ -9055,7 +8909,7 @@
   void test_creation() {
     GatheringErrorListener listener = new GatheringErrorListener();
     TestSource source = new TestSource();
-    JUnitTestCase.assertNotNull(new ErrorReporter(listener, source));
+    expect(new ErrorReporter(listener, source), isNotNull);
   }
 
   void test_reportTypeErrorForNode_differentNames() {
@@ -9069,7 +8923,7 @@
         AstFactory.identifier3("x"),
         [firstType, secondType]);
     AnalysisError error = listener.errors[0];
-    JUnitTestCase.assertTrue(error.message.indexOf("(") < 0);
+    expect(error.message.indexOf("(") < 0, isTrue);
   }
 
   void test_reportTypeErrorForNode_sameName() {
@@ -9084,64 +8938,46 @@
         AstFactory.identifier3("x"),
         [firstType, secondType]);
     AnalysisError error = listener.errors[0];
-    JUnitTestCase.assertTrue(error.message.indexOf("(") >= 0);
+    expect(error.message.indexOf("(") >= 0, isTrue);
   }
 }
 
 
 class ErrorSeverityTest extends EngineTestCase {
   void test_max_error_error() {
-    JUnitTestCase.assertSame(
-        ErrorSeverity.ERROR,
-        ErrorSeverity.ERROR.max(ErrorSeverity.ERROR));
+    expect(ErrorSeverity.ERROR.max(ErrorSeverity.ERROR), same(ErrorSeverity.ERROR));
   }
 
   void test_max_error_none() {
-    JUnitTestCase.assertSame(
-        ErrorSeverity.ERROR,
-        ErrorSeverity.ERROR.max(ErrorSeverity.NONE));
+    expect(ErrorSeverity.ERROR.max(ErrorSeverity.NONE), same(ErrorSeverity.ERROR));
   }
 
   void test_max_error_warning() {
-    JUnitTestCase.assertSame(
-        ErrorSeverity.ERROR,
-        ErrorSeverity.ERROR.max(ErrorSeverity.WARNING));
+    expect(ErrorSeverity.ERROR.max(ErrorSeverity.WARNING), same(ErrorSeverity.ERROR));
   }
 
   void test_max_none_error() {
-    JUnitTestCase.assertSame(
-        ErrorSeverity.ERROR,
-        ErrorSeverity.NONE.max(ErrorSeverity.ERROR));
+    expect(ErrorSeverity.NONE.max(ErrorSeverity.ERROR), same(ErrorSeverity.ERROR));
   }
 
   void test_max_none_none() {
-    JUnitTestCase.assertSame(
-        ErrorSeverity.NONE,
-        ErrorSeverity.NONE.max(ErrorSeverity.NONE));
+    expect(ErrorSeverity.NONE.max(ErrorSeverity.NONE), same(ErrorSeverity.NONE));
   }
 
   void test_max_none_warning() {
-    JUnitTestCase.assertSame(
-        ErrorSeverity.WARNING,
-        ErrorSeverity.NONE.max(ErrorSeverity.WARNING));
+    expect(ErrorSeverity.NONE.max(ErrorSeverity.WARNING), same(ErrorSeverity.WARNING));
   }
 
   void test_max_warning_error() {
-    JUnitTestCase.assertSame(
-        ErrorSeverity.ERROR,
-        ErrorSeverity.WARNING.max(ErrorSeverity.ERROR));
+    expect(ErrorSeverity.WARNING.max(ErrorSeverity.ERROR), same(ErrorSeverity.ERROR));
   }
 
   void test_max_warning_none() {
-    JUnitTestCase.assertSame(
-        ErrorSeverity.WARNING,
-        ErrorSeverity.WARNING.max(ErrorSeverity.NONE));
+    expect(ErrorSeverity.WARNING.max(ErrorSeverity.NONE), same(ErrorSeverity.WARNING));
   }
 
   void test_max_warning_warning() {
-    JUnitTestCase.assertSame(
-        ErrorSeverity.WARNING,
-        ErrorSeverity.WARNING.max(ErrorSeverity.WARNING));
+    expect(ErrorSeverity.WARNING.max(ErrorSeverity.WARNING), same(ErrorSeverity.WARNING));
   }
 }
 
@@ -9276,7 +9112,7 @@
   }
 
   void test_creation() {
-    JUnitTestCase.assertNotNull(new ExitDetector());
+    expect(new ExitDetector(), isNotNull);
   }
 
   void test_doStatement_throwCondition() {
@@ -9626,7 +9462,7 @@
   void _assertHasReturn(bool expectedResult, String source) {
     ExitDetector detector = new ExitDetector();
     Statement statement = ParserTestCase.parseStatement(source, []);
-    JUnitTestCase.assertSame(expectedResult, statement.accept(detector));
+    expect(statement.accept(detector), same(expectedResult));
   }
 
   void _assertTrue(String source) {
@@ -9647,19 +9483,19 @@
 }
 
 
-class FileBasedSourceTest extends JUnitTestCase {
+class FileBasedSourceTest {
   void test_equals_false_differentFiles() {
     JavaFile file1 = FileUtilities2.createFile("/does/not/exist1.dart");
     JavaFile file2 = FileUtilities2.createFile("/does/not/exist2.dart");
     FileBasedSource source1 = new FileBasedSource.con1(file1);
     FileBasedSource source2 = new FileBasedSource.con1(file2);
-    JUnitTestCase.assertFalse(source1 == source2);
+    expect(source1 == source2, isFalse);
   }
 
   void test_equals_false_null() {
     JavaFile file = FileUtilities2.createFile("/does/not/exist1.dart");
     FileBasedSource source1 = new FileBasedSource.con1(file);
-    JUnitTestCase.assertFalse(source1 == null);
+    expect(source1 == null, isFalse);
   }
 
   void test_equals_true() {
@@ -9667,7 +9503,7 @@
     JavaFile file2 = FileUtilities2.createFile("/does/not/exist.dart");
     FileBasedSource source1 = new FileBasedSource.con1(file1);
     FileBasedSource source2 = new FileBasedSource.con1(file2);
-    JUnitTestCase.assertTrue(source1 == source2);
+    expect(source1 == source2, isTrue);
   }
 
   void test_getEncoding() {
@@ -9675,20 +9511,20 @@
     String fullPath = "/does/not/exist.dart";
     JavaFile file = FileUtilities2.createFile(fullPath);
     FileBasedSource source = new FileBasedSource.con1(file);
-    JUnitTestCase.assertEquals(source, factory.fromEncoding(source.encoding));
+    expect(factory.fromEncoding(source.encoding), source);
   }
 
   void test_getFullName() {
     String fullPath = "/does/not/exist.dart";
     JavaFile file = FileUtilities2.createFile(fullPath);
     FileBasedSource source = new FileBasedSource.con1(file);
-    JUnitTestCase.assertEquals(file.getAbsolutePath(), source.fullName);
+    expect(source.fullName, file.getAbsolutePath());
   }
 
   void test_getShortName() {
     JavaFile file = FileUtilities2.createFile("/does/not/exist.dart");
     FileBasedSource source = new FileBasedSource.con1(file);
-    JUnitTestCase.assertEquals("exist.dart", source.shortName);
+    expect(source.shortName, "exist.dart");
   }
 
   void test_hashCode() {
@@ -9696,72 +9532,72 @@
     JavaFile file2 = FileUtilities2.createFile("/does/not/exist.dart");
     FileBasedSource source1 = new FileBasedSource.con1(file1);
     FileBasedSource source2 = new FileBasedSource.con1(file2);
-    JUnitTestCase.assertEquals(source1.hashCode, source2.hashCode);
+    expect(source2.hashCode, source1.hashCode);
   }
 
   void test_isInSystemLibrary_contagious() {
     JavaFile sdkDirectory = DirectoryBasedDartSdk.defaultSdkDirectory;
-    JUnitTestCase.assertNotNull(sdkDirectory);
+    expect(sdkDirectory, isNotNull);
     DartSdk sdk = new DirectoryBasedDartSdk(sdkDirectory);
     UriResolver resolver = new DartUriResolver(sdk);
     SourceFactory factory = new SourceFactory([resolver]);
     // resolve dart:core
     Source result =
         resolver.resolveAbsolute(parseUriWithException("dart:core"));
-    JUnitTestCase.assertNotNull(result);
-    JUnitTestCase.assertTrue(result.isInSystemLibrary);
+    expect(result, isNotNull);
+    expect(result.isInSystemLibrary, isTrue);
     // system libraries reference only other system libraries
     Source partSource = factory.resolveUri(result, "num.dart");
-    JUnitTestCase.assertNotNull(partSource);
-    JUnitTestCase.assertTrue(partSource.isInSystemLibrary);
+    expect(partSource, isNotNull);
+    expect(partSource.isInSystemLibrary, isTrue);
   }
 
   void test_isInSystemLibrary_false() {
     JavaFile file = FileUtilities2.createFile("/does/not/exist.dart");
     FileBasedSource source = new FileBasedSource.con1(file);
-    JUnitTestCase.assertNotNull(source);
-    JUnitTestCase.assertEquals(file.getAbsolutePath(), source.fullName);
-    JUnitTestCase.assertFalse(source.isInSystemLibrary);
+    expect(source, isNotNull);
+    expect(source.fullName, file.getAbsolutePath());
+    expect(source.isInSystemLibrary, isFalse);
   }
 
   void test_issue14500() {
     // see https://code.google.com/p/dart/issues/detail?id=14500
     FileBasedSource source = new FileBasedSource.con1(
         FileUtilities2.createFile("/some/packages/foo:bar.dart"));
-    JUnitTestCase.assertNotNull(source);
-    JUnitTestCase.assertFalse(source.exists());
+    expect(source, isNotNull);
+    expect(source.exists(), isFalse);
   }
 
   void test_resolveRelative_dart_fileName() {
     JavaFile file = FileUtilities2.createFile("/a/b/test.dart");
     FileBasedSource source =
         new FileBasedSource.con2(parseUriWithException("dart:test"), file);
-    JUnitTestCase.assertNotNull(source);
+    expect(source, isNotNull);
     Uri relative = source.resolveRelativeUri(parseUriWithException("lib.dart"));
-    JUnitTestCase.assertNotNull(relative);
-    JUnitTestCase.assertEquals("dart:test/lib.dart", relative.toString());
+    expect(relative, isNotNull);
+    expect(relative.toString(), "dart:test/lib.dart");
   }
 
   void test_resolveRelative_dart_filePath() {
     JavaFile file = FileUtilities2.createFile("/a/b/test.dart");
     FileBasedSource source =
         new FileBasedSource.con2(parseUriWithException("dart:test"), file);
-    JUnitTestCase.assertNotNull(source);
+    expect(source, isNotNull);
     Uri relative =
         source.resolveRelativeUri(parseUriWithException("c/lib.dart"));
-    JUnitTestCase.assertNotNull(relative);
-    JUnitTestCase.assertEquals("dart:test/c/lib.dart", relative.toString());
+    expect(relative, isNotNull);
+    expect(relative.toString(), "dart:test/c/lib.dart");
   }
 
   void test_resolveRelative_dart_filePathWithParent() {
     JavaFile file = FileUtilities2.createFile("/a/b/test.dart");
     FileBasedSource source =
         new FileBasedSource.con2(parseUriWithException("dart:test/b/test.dart"), file);
-    JUnitTestCase.assertNotNull(source);
+    expect(source, isNotNull);
     Uri relative =
         source.resolveRelativeUri(parseUriWithException("../c/lib.dart"));
-    JUnitTestCase.assertNotNull(relative);
-    JUnitTestCase.assertEquals("dart:test/c/lib.dart", relative.toString());
+    expect(relative, isNotNull);
+    expect(relative.toString(), "dart:test/c/lib.dart");
   }
 
   void test_resolveRelative_file_fileName() {
@@ -9773,10 +9609,10 @@
     }
     JavaFile file = FileUtilities2.createFile("/a/b/test.dart");
     FileBasedSource source = new FileBasedSource.con1(file);
-    JUnitTestCase.assertNotNull(source);
+    expect(source, isNotNull);
     Uri relative = source.resolveRelativeUri(parseUriWithException("lib.dart"));
-    JUnitTestCase.assertNotNull(relative);
-    JUnitTestCase.assertEquals("file:///a/b/lib.dart", relative.toString());
+    expect(relative, isNotNull);
+    expect(relative.toString(), "file:///a/b/lib.dart");
   }
 
   void test_resolveRelative_file_filePath() {
@@ -9788,11 +9624,11 @@
     }
     JavaFile file = FileUtilities2.createFile("/a/b/test.dart");
     FileBasedSource source = new FileBasedSource.con1(file);
-    JUnitTestCase.assertNotNull(source);
+    expect(source, isNotNull);
     Uri relative =
         source.resolveRelativeUri(parseUriWithException("c/lib.dart"));
-    JUnitTestCase.assertNotNull(relative);
-    JUnitTestCase.assertEquals("file:///a/b/c/lib.dart", relative.toString());
+    expect(relative, isNotNull);
+    expect(relative.toString(), "file:///a/b/c/lib.dart");
   }
 
   void test_resolveRelative_file_filePathWithParent() {
@@ -9803,86 +9639,84 @@
     }
     JavaFile file = FileUtilities2.createFile("/a/b/test.dart");
     FileBasedSource source = new FileBasedSource.con1(file);
-    JUnitTestCase.assertNotNull(source);
+    expect(source, isNotNull);
     Uri relative =
         source.resolveRelativeUri(parseUriWithException("../c/lib.dart"));
-    JUnitTestCase.assertNotNull(relative);
-    JUnitTestCase.assertEquals("file:///a/c/lib.dart", relative.toString());
+    expect(relative, isNotNull);
+    expect(relative.toString(), "file:///a/c/lib.dart");
   }
 
   void test_resolveRelative_package_fileName() {
     JavaFile file = FileUtilities2.createFile("/a/b/test.dart");
     FileBasedSource source =
         new FileBasedSource.con2(parseUriWithException("package:b/test.dart"), file);
-    JUnitTestCase.assertNotNull(source);
+    expect(source, isNotNull);
     Uri relative = source.resolveRelativeUri(parseUriWithException("lib.dart"));
-    JUnitTestCase.assertNotNull(relative);
-    JUnitTestCase.assertEquals("package:b/lib.dart", relative.toString());
+    expect(relative, isNotNull);
+    expect(relative.toString(), "package:b/lib.dart");
   }
 
   void test_resolveRelative_package_fileNameWithoutPackageName() {
     JavaFile file = FileUtilities2.createFile("/a/b/test.dart");
     FileBasedSource source =
         new FileBasedSource.con2(parseUriWithException("package:test.dart"), file);
-    JUnitTestCase.assertNotNull(source);
+    expect(source, isNotNull);
     Uri relative = source.resolveRelativeUri(parseUriWithException("lib.dart"));
-    JUnitTestCase.assertNotNull(relative);
-    JUnitTestCase.assertEquals("package:lib.dart", relative.toString());
+    expect(relative, isNotNull);
+    expect(relative.toString(), "package:lib.dart");
   }
 
   void test_resolveRelative_package_filePath() {
     JavaFile file = FileUtilities2.createFile("/a/b/test.dart");
     FileBasedSource source =
         new FileBasedSource.con2(parseUriWithException("package:b/test.dart"), file);
-    JUnitTestCase.assertNotNull(source);
+    expect(source, isNotNull);
     Uri relative =
         source.resolveRelativeUri(parseUriWithException("c/lib.dart"));
-    JUnitTestCase.assertNotNull(relative);
-    JUnitTestCase.assertEquals("package:b/c/lib.dart", relative.toString());
+    expect(relative, isNotNull);
+    expect(relative.toString(), "package:b/c/lib.dart");
   }
 
   void test_resolveRelative_package_filePathWithParent() {
     JavaFile file = FileUtilities2.createFile("/a/b/test.dart");
     FileBasedSource source =
         new FileBasedSource.con2(parseUriWithException("package:a/b/test.dart"), file);
-    JUnitTestCase.assertNotNull(source);
+    expect(source, isNotNull);
     Uri relative =
         source.resolveRelativeUri(parseUriWithException("../c/lib.dart"));
-    JUnitTestCase.assertNotNull(relative);
-    JUnitTestCase.assertEquals("package:a/c/lib.dart", relative.toString());
+    expect(relative, isNotNull);
+    expect(relative.toString(), "package:a/c/lib.dart");
   }
 
   void test_system() {
     JavaFile file = FileUtilities2.createFile("/does/not/exist.dart");
     FileBasedSource source =
         new FileBasedSource.con2(parseUriWithException("dart:core"), file);
-    JUnitTestCase.assertNotNull(source);
-    JUnitTestCase.assertEquals(file.getAbsolutePath(), source.fullName);
-    JUnitTestCase.assertTrue(source.isInSystemLibrary);
+    expect(source, isNotNull);
+    expect(source.fullName, file.getAbsolutePath());
+    expect(source.isInSystemLibrary, isTrue);
   }
 }
 
 
-class FileUriResolverTest extends JUnitTestCase {
+class FileUriResolverTest {
   void test_creation() {
-    JUnitTestCase.assertNotNull(new FileUriResolver());
+    expect(new FileUriResolver(), isNotNull);
   }
 
   void test_resolve_file() {
     UriResolver resolver = new FileUriResolver();
     Source result =
         resolver.resolveAbsolute(parseUriWithException("file:/does/not/exist.dart"));
-    JUnitTestCase.assertNotNull(result);
-    JUnitTestCase.assertEquals(
-        FileUtilities2.createFile("/does/not/exist.dart").getAbsolutePath(),
-        result.fullName);
+    expect(result, isNotNull);
+    expect(result.fullName, FileUtilities2.createFile("/does/not/exist.dart").getAbsolutePath());
   }
 
   void test_resolve_nonFile() {
     UriResolver resolver = new FileUriResolver();
     Source result =
         resolver.resolveAbsolute(parseUriWithException("dart:core"));
-    JUnitTestCase.assertNull(result);
+    expect(result, isNull);
   }
 }
 
@@ -9893,23 +9727,20 @@
    */
   static String _TAG_SCRIPT = "script";
   void fail_parse_scriptWithComment() {
-    String scriptBody = EngineTestCase.createSource(
-        [
-            "      /**",
-            "       *     <editable-label bind-value=\"dartAsignableValue\">",
-            "       *     </editable-label>",
-            "       */",
-            "      class Foo {}"]);
-    ht.HtmlUnit htmlUnit = parse(
-        EngineTestCase.createSource(
-            [
-                "  <html>",
-                "    <body>",
-                "      <script type=\"application/dart\">",
-                scriptBody,
-                "      </script>",
-                "    </body>",
-                "  </html>"]));
+    String scriptBody = r'''
+      /**
+       *     <editable-label bind-value="dartAsignableValue">
+       *     </editable-label>
+       */
+      class Foo {}''';
+    ht.HtmlUnit htmlUnit = parse("""
+<html>
+  <body>
+    <script type='application/dart'>
+$scriptBody
+    </script>
+  </body>
+</html>""");
     _validate(
         htmlUnit,
         [
@@ -9918,7 +9749,7 @@
                 [
                     _t4(
                         "body",
-                        [_t("script", _a(["type", "\"application/dart\""]), scriptBody, [])])])]);
+                        [_t("script", _a(["type", "'application/dart'"]), scriptBody, [])])])]);
   }
   ht.HtmlUnit parse(String contents) {
 //    TestSource source =
@@ -9940,7 +9771,7 @@
         [_t4("html", [_t("body", _a(["foo", "\"sdfsdf\""]), "", [])])]);
     ht.XmlTagNode htmlNode = htmlUnit.tagNodes[0];
     ht.XmlTagNode bodyNode = htmlNode.tagNodes[0];
-    JUnitTestCase.assertEquals("sdfsdf", bodyNode.attributes[0].text);
+    expect(bodyNode.attributes[0].text, "sdfsdf");
   }
   void test_parse_attribute_EOF() {
     ht.HtmlUnit htmlUnit = parse("<html><body foo=\"sdfsdf\"");
@@ -9955,7 +9786,7 @@
         [_t4("html", [_t("body", _a(["foo", "\"sdfsd"]), "", [])])]);
     ht.XmlTagNode htmlNode = htmlUnit.tagNodes[0];
     ht.XmlTagNode bodyNode = htmlNode.tagNodes[0];
-    JUnitTestCase.assertEquals("sdfsd", bodyNode.attributes[0].text);
+    expect(bodyNode.attributes[0].text, "sdfsd");
   }
   void test_parse_attribute_extra_quote() {
     ht.HtmlUnit htmlUnit = parse("<html><body foo=\"sdfsdf\"\"></body></html>");
@@ -9970,7 +9801,7 @@
         [_t4("html", [_t("body", _a(["foo", "'sdfsdf'"]), "", [])])]);
     ht.XmlTagNode htmlNode = htmlUnit.tagNodes[0];
     ht.XmlTagNode bodyNode = htmlNode.tagNodes[0];
-    JUnitTestCase.assertEquals("sdfsdf", bodyNode.attributes[0].text);
+    expect(bodyNode.attributes[0].text, "sdfsdf");
   }
   void test_parse_comment_embedded() {
     ht.HtmlUnit htmlUnit = parse("<html <!-- comment -->></html>");
@@ -10014,29 +9845,28 @@
     ht.HtmlUnit htmlUnit = parse("<html><body foo=\"sdfsdf\"></body></html>");
     ht.XmlTagNode htmlNode = htmlUnit.tagNodes[0];
     ht.XmlTagNode bodyNode = htmlNode.tagNodes[0];
-    JUnitTestCase.assertEquals("sdfsdf", bodyNode.getAttribute("foo").text);
-    JUnitTestCase.assertEquals(null, bodyNode.getAttribute("bar"));
-    JUnitTestCase.assertEquals(null, bodyNode.getAttribute(null));
+    expect(bodyNode.getAttribute("foo").text, "sdfsdf");
+    expect(bodyNode.getAttribute("bar"), null);
+    expect(bodyNode.getAttribute(null), null);
   }
   void test_parse_getAttributeText() {
     ht.HtmlUnit htmlUnit = parse("<html><body foo=\"sdfsdf\"></body></html>");
     ht.XmlTagNode htmlNode = htmlUnit.tagNodes[0];
     ht.XmlTagNode bodyNode = htmlNode.tagNodes[0];
-    JUnitTestCase.assertEquals("sdfsdf", bodyNode.getAttributeText("foo"));
-    JUnitTestCase.assertEquals(null, bodyNode.getAttributeText("bar"));
-    JUnitTestCase.assertEquals(null, bodyNode.getAttributeText(null));
+    expect(bodyNode.getAttributeText("foo"), "sdfsdf");
+    expect(bodyNode.getAttributeText("bar"), null);
+    expect(bodyNode.getAttributeText(null), null);
   }
   void test_parse_headers() {
-    String code = EngineTestCase.createSource(
-        [
-            "<html>",
-            "  <body>",
-            "    <h2>000</h2>",
-            "    <div>",
-            "      111",
-            "    </div>",
-            "  </body>",
-            "</html>"]);
+    String code = r'''
+<html>
+  <body>
+    <h2>000</h2>
+    <div>
+      111
+    </div>
+  </body>
+</html>''';
     ht.HtmlUnit htmlUnit = parse(code);
     _validate(
         htmlUnit,
@@ -10080,24 +9910,22 @@
 class HtmlTagInfoBuilderTest extends HtmlParserTest {
   void test_builder() {
     HtmlTagInfoBuilder builder = new HtmlTagInfoBuilder();
-    ht.HtmlUnit unit = parse(
-        EngineTestCase.createSource(
-            [
-                "<html>",
-                "  <body>",
-                "    <div id=\"x\"></div>",
-                "    <p class='c'></p>",
-                "    <div class='c'></div>",
-                "  </body>",
-                "</html>"]));
+    ht.HtmlUnit unit = parse(r'''
+<html>
+  <body>
+    <div id="x"></div>
+    <p class='c'></p>
+    <div class='c'></div>
+  </body>
+</html>''');
     unit.accept(builder);
     HtmlTagInfo info = builder.getTagInfo();
-    JUnitTestCase.assertNotNull(info);
+    expect(info, isNotNull);
     List<String> allTags = info.allTags;
-    EngineTestCase.assertLength(4, allTags);
-    JUnitTestCase.assertEquals("div", info.getTagWithId("x"));
+    expect(allTags, hasLength(4));
+    expect(info.getTagWithId("x"), "div");
     List<String> tagsWithClass = info.getTagsWithClass("c");
-    EngineTestCase.assertLength(2, tagsWithClass);
+    expect(tagsWithClass, hasLength(2));
   }
 }
 
@@ -10114,55 +9942,53 @@
     super.tearDown();
   }
   void test_embedded_script() {
-    HtmlElementImpl element = _build(
-        EngineTestCase.createSource(
-            ["<html>", "<script type=\"application/dart\">foo=2;</script>", "</html>"]));
+    HtmlElementImpl element = _build(r'''
+<html>
+<script type="application/dart">foo=2;</script>
+</html>''');
     _validate(element, [_s(_l([_v("foo")]))]);
   }
   void test_embedded_script_no_content() {
-    HtmlElementImpl element = _build(
-        EngineTestCase.createSource(
-            ["<html>", "<script type=\"application/dart\"></script>", "</html>"]));
+    HtmlElementImpl element = _build(r'''
+<html>
+<script type="application/dart"></script>
+</html>''');
     _validate(element, [_s(_l([]))]);
   }
   void test_external_script() {
-    HtmlElementImpl element = _build(
-        EngineTestCase.createSource(
-            [
-                "<html>",
-                "<script type=\"application/dart\" src=\"other.dart\"/>",
-                "</html>"]));
+    HtmlElementImpl element = _build(r'''
+<html>
+<script type="application/dart" src="other.dart"/>
+</html>''');
     _validate(element, [_s2("other.dart")]);
   }
   void test_external_script_no_source() {
-    HtmlElementImpl element = _build(
-        EngineTestCase.createSource(
-            ["<html>", "<script type=\"application/dart\"/>", "</html>"]));
+    HtmlElementImpl element = _build(r'''
+<html>
+<script type="application/dart"/>
+</html>''');
     _validate(element, [_s2(null)]);
   }
   void test_external_script_with_content() {
-    HtmlElementImpl element = _build(
-        EngineTestCase.createSource(
-            [
-                "<html>",
-                "<script type=\"application/dart\" src=\"other.dart\">blat=2;</script>",
-                "</html>"]));
+    HtmlElementImpl element = _build(r'''
+<html>
+<script type="application/dart" src="other.dart">blat=2;</script>
+</html>''');
     _validate(element, [_s2("other.dart")]);
   }
   void test_no_scripts() {
-    HtmlElementImpl element = _build(
-        EngineTestCase.createSource(["<!DOCTYPE html>", "<html><p></p></html>"]));
+    HtmlElementImpl element = _build(r'''
+<!DOCTYPE html>
+<html><p></p></html>''');
     _validate(element, []);
   }
   void test_two_dart_scripts() {
-    HtmlElementImpl element = _build(
-        EngineTestCase.createSource(
-            [
-                "<html>",
-                "<script type=\"application/dart\">bar=2;</script>",
-                "<script type=\"application/dart\" src=\"other.dart\"/>",
-                "<script src=\"dart.js\"/>",
-                "</html>"]));
+    HtmlElementImpl element = _build(r'''
+<html>
+<script type="application/dart">bar=2;</script>
+<script type="application/dart" src="other.dart"/>
+<script src="dart.js"/>
+</html>''');
     _validate(element, [_s(_l([_v("bar")])), _s2("other.dart")]);
   }
   HtmlElementImpl _build(String contents) {
@@ -10189,10 +10015,10 @@
       new HtmlUnitBuilderTest_ExpectedVariable(varName);
   void _validate(HtmlElementImpl element,
       List<_ExpectedScript> expectedScripts) {
-    JUnitTestCase.assertSame(_context, element.context);
+    expect(element.context, same(_context));
     List<HtmlScriptElement> scripts = element.scripts;
-    JUnitTestCase.assertNotNull(scripts);
-    EngineTestCase.assertLength(expectedScripts.length, scripts);
+    expect(scripts, isNotNull);
+    expect(scripts, hasLength(expectedScripts.length));
     for (int scriptIndex = 0; scriptIndex < scripts.length; scriptIndex++) {
       expectedScripts[scriptIndex]._validate(scriptIndex, scripts[scriptIndex]);
     }
@@ -10207,22 +10033,16 @@
       this._expectedVariables);
   void _validate(int scriptIndex, EmbeddedHtmlScriptElementImpl script) {
     LibraryElement library = script.scriptLibrary;
-    JUnitTestCase.assertNotNullMsg("script ${scriptIndex}", library);
-    JUnitTestCase.assertSameMsg(
-        "script ${scriptIndex}",
-        HtmlUnitBuilderTest_this._context,
-        script.context);
+    expect(library, isNotNull, reason: "script $scriptIndex");
+    expect(script.context, same(HtmlUnitBuilderTest_this._context), reason: "script $scriptIndex");
     CompilationUnitElement unit = library.definingCompilationUnit;
-    JUnitTestCase.assertNotNullMsg("script ${scriptIndex}", unit);
+    expect(unit, isNotNull, reason: "script $scriptIndex");
     List<TopLevelVariableElement> variables = unit.topLevelVariables;
-    EngineTestCase.assertLength(_expectedVariables.length, variables);
+    expect(variables, hasLength(_expectedVariables.length));
     for (int index = 0; index < variables.length; index++) {
       _expectedVariables[index].validate(scriptIndex, variables[index]);
     }
-    JUnitTestCase.assertSameMsg(
-        "script ${scriptIndex}",
-        script,
-        library.enclosingElement);
+    expect(library.enclosingElement, same(script), reason: "script $scriptIndex");
   }
 }
 
@@ -10231,11 +10051,8 @@
   final String _expectedName;
   HtmlUnitBuilderTest_ExpectedVariable(this._expectedName);
   void validate(int scriptIndex, TopLevelVariableElement variable) {
-    JUnitTestCase.assertNotNullMsg("script ${scriptIndex}", variable);
-    JUnitTestCase.assertEqualsMsg(
-        "script ${scriptIndex}",
-        _expectedName,
-        variable.name);
+    expect(variable, isNotNull, reason: "script $scriptIndex");
+    expect(variable.name, _expectedName, reason: "script $scriptIndex");
   }
 }
 
@@ -10280,31 +10097,27 @@
   }
 
   void test_invalidUri() {
-    _verify(
-        EngineTestCase.createSource(
-            ["<html>", "<script type='application/dart' src='ht:'/>", "</html>"]),
+    _verify(r'''
+<html>
+<script type='application/dart' src='ht:'/>
+</html>''',
         [HtmlWarningCode.INVALID_URI]);
     _assertErrorLocation2(_errors[0], "ht:");
   }
 
   void test_uriDoesNotExist() {
-    _verify(
-        EngineTestCase.createSource(
-            ["<html>", "<script type='application/dart' src='other.dart'/>", "</html>"]),
+    _verify(r'''
+<html>
+<script type='application/dart' src='other.dart'/>
+</html>''',
         [HtmlWarningCode.URI_DOES_NOT_EXIST]);
     _assertErrorLocation2(_errors[0], "other.dart");
   }
 
   void _assertErrorLocation(AnalysisError error, int expectedOffset,
       int expectedLength) {
-    JUnitTestCase.assertEqualsMsg(
-        error.toString(),
-        expectedOffset,
-        error.offset);
-    JUnitTestCase.assertEqualsMsg(
-        error.toString(),
-        expectedLength,
-        error.length);
+    expect(error.offset, expectedOffset, reason: error.toString());
+    expect(error.length, expectedLength, reason: error.toString());
   }
 
   void _assertErrorLocation2(AnalysisError error, String expectedString) {
@@ -10434,12 +10247,12 @@
   }
   void _assertNoArcs() {
     Set<AstNode> tails = _referenceGraph.getTails(_head);
-    EngineTestCase.assertSizeOfSet(0, tails);
+    expect(tails, hasLength(0));
   }
   void _assertOneArc(AstNode tail) {
     Set<AstNode> tails = _referenceGraph.getTails(_head);
-    EngineTestCase.assertSizeOfSet(1, tails);
-    JUnitTestCase.assertSame(tail, new JavaIterator(tails).next());
+    expect(tails, hasLength(1));
+    expect(tails.first, same(tail));
   }
   ReferenceFinder _createReferenceFinder(AstNode source) =>
       new ReferenceFinder(
@@ -10530,87 +10343,85 @@
     LibraryMap libraryMap = new SdkLibrariesReader(
         true).readFromFile(
             FileUtilities2.createFile("/libs.dart"),
-            EngineTestCase.createSource(
-                [
-                    "final Map<String, LibraryInfo> LIBRARIES = const <String, LibraryInfo> {",
-                    "  'first' : const LibraryInfo(",
-                    "    'first/first.dart',",
-                    "    category: 'First',",
-                    "    documented: true,",
-                    "    platforms: VM_PLATFORM,",
-                    "    dart2jsPath: 'first/first_dart2js.dart'),",
-                    "};"]));
-    JUnitTestCase.assertNotNull(libraryMap);
-    JUnitTestCase.assertEquals(1, libraryMap.size());
+            r'''
+final Map<String, LibraryInfo> LIBRARIES = const <String, LibraryInfo> {
+  'first' : const LibraryInfo(
+    'first/first.dart',
+    category: 'First',
+    documented: true,
+    platforms: VM_PLATFORM,
+    dart2jsPath: 'first/first_dart2js.dart'),
+};''');
+    expect(libraryMap, isNotNull);
+    expect(libraryMap.size(), 1);
     SdkLibrary first = libraryMap.getLibrary("dart:first");
-    JUnitTestCase.assertNotNull(first);
-    JUnitTestCase.assertEquals("First", first.category);
-    JUnitTestCase.assertEquals("first/first_dart2js.dart", first.path);
-    JUnitTestCase.assertEquals("dart:first", first.shortName);
-    JUnitTestCase.assertEquals(false, first.isDart2JsLibrary);
-    JUnitTestCase.assertEquals(true, first.isDocumented);
-    JUnitTestCase.assertEquals(false, first.isImplementation);
-    JUnitTestCase.assertEquals(true, first.isVmLibrary);
+    expect(first, isNotNull);
+    expect(first.category, "First");
+    expect(first.path, "first/first_dart2js.dart");
+    expect(first.shortName, "dart:first");
+    expect(first.isDart2JsLibrary, false);
+    expect(first.isDocumented, true);
+    expect(first.isImplementation, false);
+    expect(first.isVmLibrary, true);
   }
   void test_readFrom_empty() {
     LibraryMap libraryMap = new SdkLibrariesReader(
         false).readFromFile(FileUtilities2.createFile("/libs.dart"), "");
-    JUnitTestCase.assertNotNull(libraryMap);
-    JUnitTestCase.assertEquals(0, libraryMap.size());
+    expect(libraryMap, isNotNull);
+    expect(libraryMap.size(), 0);
   }
   void test_readFrom_normal() {
     LibraryMap libraryMap = new SdkLibrariesReader(
         false).readFromFile(
             FileUtilities2.createFile("/libs.dart"),
-            EngineTestCase.createSource(
-                [
-                    "final Map<String, LibraryInfo> LIBRARIES = const <String, LibraryInfo> {",
-                    "  'first' : const LibraryInfo(",
-                    "    'first/first.dart',",
-                    "    category: 'First',",
-                    "    documented: true,",
-                    "    platforms: VM_PLATFORM),",
-                    "",
-                    "  'second' : const LibraryInfo(",
-                    "    'second/second.dart',",
-                    "    category: 'Second',",
-                    "    documented: false,",
-                    "    implementation: true,",
-                    "    platforms: 0),",
-                    "};"]));
-    JUnitTestCase.assertNotNull(libraryMap);
-    JUnitTestCase.assertEquals(2, libraryMap.size());
+            r'''
+final Map<String, LibraryInfo> LIBRARIES = const <String, LibraryInfo> {
+  'first' : const LibraryInfo(
+    'first/first.dart',
+    category: 'First',
+    documented: true,
+    platforms: VM_PLATFORM),
+
+  'second' : const LibraryInfo(
+    'second/second.dart',
+    category: 'Second',
+    documented: false,
+    implementation: true,
+    platforms: 0),
+};''');
+    expect(libraryMap, isNotNull);
+    expect(libraryMap.size(), 2);
     SdkLibrary first = libraryMap.getLibrary("dart:first");
-    JUnitTestCase.assertNotNull(first);
-    JUnitTestCase.assertEquals("First", first.category);
-    JUnitTestCase.assertEquals("first/first.dart", first.path);
-    JUnitTestCase.assertEquals("dart:first", first.shortName);
-    JUnitTestCase.assertEquals(false, first.isDart2JsLibrary);
-    JUnitTestCase.assertEquals(true, first.isDocumented);
-    JUnitTestCase.assertEquals(false, first.isImplementation);
-    JUnitTestCase.assertEquals(true, first.isVmLibrary);
+    expect(first, isNotNull);
+    expect(first.category, "First");
+    expect(first.path, "first/first.dart");
+    expect(first.shortName, "dart:first");
+    expect(first.isDart2JsLibrary, false);
+    expect(first.isDocumented, true);
+    expect(first.isImplementation, false);
+    expect(first.isVmLibrary, true);
     SdkLibrary second = libraryMap.getLibrary("dart:second");
-    JUnitTestCase.assertNotNull(second);
-    JUnitTestCase.assertEquals("Second", second.category);
-    JUnitTestCase.assertEquals("second/second.dart", second.path);
-    JUnitTestCase.assertEquals("dart:second", second.shortName);
-    JUnitTestCase.assertEquals(false, second.isDart2JsLibrary);
-    JUnitTestCase.assertEquals(false, second.isDocumented);
-    JUnitTestCase.assertEquals(true, second.isImplementation);
-    JUnitTestCase.assertEquals(false, second.isVmLibrary);
+    expect(second, isNotNull);
+    expect(second.category, "Second");
+    expect(second.path, "second/second.dart");
+    expect(second.shortName, "dart:second");
+    expect(second.isDart2JsLibrary, false);
+    expect(second.isDocumented, false);
+    expect(second.isImplementation, true);
+    expect(second.isVmLibrary, false);
   }
 }
 
 
-class SourceFactoryTest extends JUnitTestCase {
+class SourceFactoryTest {
   void test_creation() {
-    JUnitTestCase.assertNotNull(new SourceFactory([]));
+    expect(new SourceFactory([]), isNotNull);
   }
   void test_fromEncoding_invalidUri() {
     SourceFactory factory = new SourceFactory([]);
     try {
       factory.fromEncoding("<:&%>");
-      JUnitTestCase.fail("Expected IllegalArgumentException");
+      fail("Expected IllegalArgumentException");
     } on IllegalArgumentException catch (exception) {
     }
   }
@@ -10618,7 +10429,7 @@
     SourceFactory factory = new SourceFactory([]);
     try {
       factory.fromEncoding("foo:/does/not/exist.dart");
-      JUnitTestCase.fail("Expected IllegalArgumentException");
+      fail("Expected IllegalArgumentException");
     } on IllegalArgumentException catch (exception) {
     }
   }
@@ -10626,14 +10437,14 @@
     String encoding = "file:///does/not/exist.dart";
     SourceFactory factory = new SourceFactory(
         [new UriResolver_SourceFactoryTest_test_fromEncoding_valid(encoding)]);
-    JUnitTestCase.assertNotNull(factory.fromEncoding(encoding));
+    expect(factory.fromEncoding(encoding), isNotNull);
   }
   void test_resolveUri_absolute() {
-    List<bool> invoked = [false];
+    UriResolver_absolute resolver = new UriResolver_absolute();
     SourceFactory factory =
-        new SourceFactory([new UriResolver_absolute(invoked)]);
+        new SourceFactory([resolver]);
     factory.resolveUri(null, "dart:core");
-    JUnitTestCase.assertTrue(invoked[0]);
+    expect(resolver.invoked, isTrue);
   }
   void test_resolveUri_nonAbsolute_absolute() {
     SourceFactory factory =
@@ -10642,9 +10453,7 @@
     Source containingSource =
         new FileBasedSource.con1(FileUtilities2.createFile("/does/not/exist.dart"));
     Source result = factory.resolveUri(containingSource, absolutePath);
-    JUnitTestCase.assertEquals(
-        FileUtilities2.createFile(absolutePath).getAbsolutePath(),
-        result.fullName);
+    expect(result.fullName, FileUtilities2.createFile(absolutePath).getAbsolutePath());
   }
   void test_resolveUri_nonAbsolute_relative() {
     SourceFactory factory =
@@ -10652,9 +10461,7 @@
     Source containingSource =
         new FileBasedSource.con1(FileUtilities2.createFile("/does/not/have.dart"));
     Source result = factory.resolveUri(containingSource, "exist.dart");
-    JUnitTestCase.assertEquals(
-        FileUtilities2.createFile("/does/not/exist.dart").getAbsolutePath(),
-        result.fullName);
+    expect(result.fullName, FileUtilities2.createFile("/does/not/exist.dart").getAbsolutePath());
   }
   void test_restoreUri() {
     JavaFile file1 = FileUtilities2.createFile("/some/file1.dart");
@@ -10664,8 +10471,8 @@
     Uri expected1 = parseUriWithException("file:///my_file.dart");
     SourceFactory factory =
         new SourceFactory([new UriResolver_restoreUri(source1, expected1)]);
-    JUnitTestCase.assertSame(expected1, factory.restoreUri(source1));
-    JUnitTestCase.assertSame(null, factory.restoreUri(source2));
+    expect(factory.restoreUri(source1), same(expected1));
+    expect(factory.restoreUri(source2), same(null));
   }
 }
 
@@ -10730,23 +10537,23 @@
   void _assertSource(String expectedSource, ht.XmlNode node) {
     PrintStringWriter writer = new PrintStringWriter();
     node.accept(new ht.ToSourceVisitor(writer));
-    JUnitTestCase.assertEquals(expectedSource, writer.toString());
+    expect(writer.toString(), expectedSource);
   }
 }
 
 
-class UriKindTest extends JUnitTestCase {
+class UriKindTest {
   void test_fromEncoding() {
-    JUnitTestCase.assertSame(UriKind.DART_URI, UriKind.fromEncoding(0x64));
-    JUnitTestCase.assertSame(UriKind.FILE_URI, UriKind.fromEncoding(0x66));
-    JUnitTestCase.assertSame(UriKind.PACKAGE_URI, UriKind.fromEncoding(0x70));
-    JUnitTestCase.assertSame(null, UriKind.fromEncoding(0x58));
+    expect(UriKind.fromEncoding(0x64), same(UriKind.DART_URI));
+    expect(UriKind.fromEncoding(0x66), same(UriKind.FILE_URI));
+    expect(UriKind.fromEncoding(0x70), same(UriKind.PACKAGE_URI));
+    expect(UriKind.fromEncoding(0x58), same(null));
   }
 
   void test_getEncoding() {
-    JUnitTestCase.assertEquals(0x64, UriKind.DART_URI.encoding);
-    JUnitTestCase.assertEquals(0x66, UriKind.FILE_URI.encoding);
-    JUnitTestCase.assertEquals(0x70, UriKind.PACKAGE_URI.encoding);
+    expect(UriKind.DART_URI.encoding, 0x64);
+    expect(UriKind.FILE_URI.encoding, 0x66);
+    expect(UriKind.PACKAGE_URI.encoding, 0x70);
   }
 }
 
@@ -10768,13 +10575,13 @@
 
 
 class UriResolver_absolute extends UriResolver {
-  List<bool> invoked;
+  bool invoked = false;
 
-  UriResolver_absolute(this.invoked);
+  UriResolver_absolute();
 
   @override
   Source resolveAbsolute(Uri uri) {
-    invoked[0] = true;
+    invoked = true;
     return null;
   }
 }
@@ -10835,8 +10642,7 @@
     // make sure we properly recorded the dependency.
     ConstructorDeclaration node = findConstructorDeclaration(constructor);
     if (node != null && referenceGraph.nodes.contains(node)) {
-      JUnitTestCase.assertTrue(
-          referenceGraph.containsPath(_nodeBeingEvaluated, node));
+      expect(referenceGraph.containsPath(_nodeBeingEvaluated, node), isTrue);
     }
   }
 
@@ -10855,7 +10661,7 @@
         break;
       }
     }
-    JUnitTestCase.assertTrue(parameterIndex < numParameters);
+    expect(parameterIndex < numParameters, isTrue);
     // If we are getting the default parameter for a constructor in the graph,
     // make sure we properly recorded the dependency on the parameter.
     ConstructorDeclaration constructorNode =
@@ -10863,9 +10669,8 @@
     if (constructorNode != null) {
       FormalParameter parameterNode =
           constructorNode.parameters.parameters[parameterIndex];
-      JUnitTestCase.assertTrue(referenceGraph.nodes.contains(parameterNode));
-      JUnitTestCase.assertTrue(
-          referenceGraph.containsPath(_nodeBeingEvaluated, parameterNode));
+      expect(referenceGraph.nodes.contains(parameterNode), isTrue);
+      expect(referenceGraph.containsPath(_nodeBeingEvaluated, parameterNode), isTrue);
     }
   }
 
@@ -10914,17 +10719,17 @@
     while (_expectedTagsIndex < _expectedTagsInOrderVisited.length) {
       String expectedTag =
           _expectedTagsInOrderVisited[_expectedTagsIndex++]._tag;
-      _errors.add("Expected to visit node with tag: ${expectedTag}");
+      _errors.add("Expected to visit node with tag: $expectedTag");
     }
     if (!_errors.isEmpty) {
-      PrintStringWriter writer = new PrintStringWriter();
-      writer.print("Invalid XML structure:");
+      StringBuffer buffer = new StringBuffer();
+      buffer.write("Invalid XML structure:");
       for (String message in _errors) {
-        writer.newLine();
-        writer.print("   ");
-        writer.print(message);
+        buffer.writeln();
+        buffer.write("   ");
+        buffer.write(message);
       }
-      JUnitTestCase.fail(writer.toString());
+      fail(buffer.toString());
     }
   }
   /**
@@ -10936,7 +10741,7 @@
     // Flatten the hierarchy into expected order in which the tags are visited
     List<XmlValidator_Tag> expected = new List<XmlValidator_Tag>();
     _expectTags(expected, expectedTags);
-    this._expectedTagsInOrderVisited = new List.from(expected);
+    this._expectedTagsInOrderVisited = expected;
   }
   @override
   Object visitHtmlUnit(ht.HtmlUnit node) {
@@ -10953,7 +10758,7 @@
   Object visitXmlAttributeNode(ht.XmlAttributeNode actual) {
     if (actual.parent is! ht.XmlTagNode) {
       _errors.add(
-          "Expected ${actual.runtimeType.toString()} to have parent of type XmlTagNode");
+          "Expected ${actual.runtimeType} to have parent of type XmlTagNode");
     }
     String actualName = actual.name;
     String actualValue = actual.valueToken.lexeme;
@@ -10962,17 +10767,17 @@
           _expectedAttributeKeyValuePairs[_expectedAttributeIndex];
       if (expectedName != actualName) {
         _errors.add(
-            "Expected ${(_expectedTagsIndex - 1)} tag: ${_expectedTagsInOrderVisited[_expectedTagsIndex - 1]._tag} attribute ${(_expectedAttributeIndex ~/ 2)} to have name: ${expectedName} but found: ${actualName}");
+            "Expected ${_expectedTagsIndex - 1} tag: ${_expectedTagsInOrderVisited[_expectedTagsIndex - 1]._tag} attribute ${_expectedAttributeIndex ~/ 2} to have name: $expectedName but found: $actualName");
       }
       String expectedValue =
           _expectedAttributeKeyValuePairs[_expectedAttributeIndex + 1];
       if (expectedValue != actualValue) {
         _errors.add(
-            "Expected ${(_expectedTagsIndex - 1)} tag: ${_expectedTagsInOrderVisited[_expectedTagsIndex - 1]._tag} attribute ${(_expectedAttributeIndex ~/ 2)} to have value: ${expectedValue} but found: ${actualValue}");
+            "Expected ${_expectedTagsIndex - 1} tag: ${_expectedTagsInOrderVisited[_expectedTagsIndex - 1]._tag} attribute ${_expectedAttributeIndex ~/ 2} to have value: $expectedValue but found: $actualValue");
       }
     } else {
       _errors.add(
-          "Unexpected ${(_expectedTagsIndex - 1)} tag: ${_expectedTagsInOrderVisited[_expectedTagsIndex - 1]._tag} attribute ${(_expectedAttributeIndex ~/ 2)} name: ${actualName} value: ${actualValue}");
+          "Unexpected ${_expectedTagsIndex - 1} tag: ${_expectedTagsInOrderVisited[_expectedTagsIndex - 1]._tag} attribute ${_expectedAttributeIndex ~/ 2} name: $actualName value: $actualValue");
     }
     _expectedAttributeIndex += 2;
     _validateNode(actual);
@@ -10982,7 +10787,7 @@
   Object visitXmlTagNode(ht.XmlTagNode actual) {
     if (!(actual.parent is ht.HtmlUnit || actual.parent is ht.XmlTagNode)) {
       _errors.add(
-          "Expected ${actual.runtimeType.toString()} to have parent of type HtmlUnit or XmlTagNode");
+          "Expected ${actual.runtimeType} to have parent of type HtmlUnit or XmlTagNode");
     }
     if (_expectedTagsInOrderVisited != null) {
       String actualTag = actual.tag;
@@ -10991,7 +10796,7 @@
             _expectedTagsInOrderVisited[_expectedTagsIndex];
         if (expected._tag != actualTag) {
           _errors.add(
-              "Expected ${_expectedTagsIndex} tag: ${expected._tag} but found: ${actualTag}");
+              "Expected $_expectedTagsIndex tag: ${expected._tag} but found: $actualTag");
         }
         _expectedAttributeKeyValuePairs = expected._attributes._keyValuePairs;
         int expectedAttributeCount =
@@ -11000,54 +10805,52 @@
         int actualAttributeCount = actual.attributes.length;
         if (expectedAttributeCount != actualAttributeCount) {
           _errors.add(
-              "Expected ${_expectedTagsIndex} tag: ${expected._tag} to have ${expectedAttributeCount} attributes but found ${actualAttributeCount}");
+              "Expected $_expectedTagsIndex tag: ${expected._tag} to have $expectedAttributeCount attributes but found $actualAttributeCount");
         }
         _expectedAttributeIndex = 0;
         _expectedTagsIndex++;
-        JUnitTestCase.assertNotNull(actual.attributeEnd);
-        JUnitTestCase.assertNotNull(actual.contentEnd);
+        expect(actual.attributeEnd, isNotNull);
+        expect(actual.contentEnd, isNotNull);
         int count = 0;
         ht.Token token = actual.attributeEnd.next;
         ht.Token lastToken = actual.contentEnd;
         while (!identical(token, lastToken)) {
           token = token.next;
           if (++count > 1000) {
-            JUnitTestCase.fail(
-                "Expected ${_expectedTagsIndex} tag: ${expected._tag} to have a sequence of tokens from getAttributeEnd() to getContentEnd()");
+            fail("Expected $_expectedTagsIndex tag: ${expected._tag} to have a sequence of tokens from getAttributeEnd() to getContentEnd()");
             break;
           }
         }
         if (actual.attributeEnd.type == ht.TokenType.GT) {
           if (ht.HtmlParser.SELF_CLOSING.contains(actual.tag)) {
-            JUnitTestCase.assertNull(actual.closingTag);
+            expect(actual.closingTag, isNull);
           } else {
-            JUnitTestCase.assertNotNull(actual.closingTag);
+            expect(actual.closingTag, isNotNull);
           }
         } else if (actual.attributeEnd.type == ht.TokenType.SLASH_GT) {
-          JUnitTestCase.assertNull(actual.closingTag);
+          expect(actual.closingTag, isNull);
         } else {
-          JUnitTestCase.fail(
-              "Unexpected attribute end token: ${actual.attributeEnd.lexeme}");
+          fail("Unexpected attribute end token: ${actual.attributeEnd.lexeme}");
         }
         if (expected._content != null && expected._content != actual.content) {
           _errors.add(
-              "Expected ${_expectedTagsIndex} tag: ${expected._tag} to have content '${expected._content}' but found '${actual.content}'");
+              "Expected $_expectedTagsIndex tag: ${expected._tag} to have content '${expected._content}' but found '${actual.content}'");
         }
         if (expected._children.length != actual.tagNodes.length) {
           _errors.add(
-              "Expected ${_expectedTagsIndex} tag: ${expected._tag} to have ${expected._children.length} children but found ${actual.tagNodes.length}");
+              "Expected $_expectedTagsIndex tag: ${expected._tag} to have ${expected._children.length} children but found ${actual.tagNodes.length}");
         } else {
           for (int index = 0; index < expected._children.length; index++) {
             String expectedChildTag = expected._children[index]._tag;
             String actualChildTag = actual.tagNodes[index].tag;
             if (expectedChildTag != actualChildTag) {
               _errors.add(
-                  "Expected ${_expectedTagsIndex} tag: ${expected._tag} child ${index} to have tag: ${expectedChildTag} but found: ${actualChildTag}");
+                  "Expected $_expectedTagsIndex tag: ${expected._tag} child $index to have tag: $expectedChildTag but found: $actualChildTag");
             }
           }
         }
       } else {
-        _errors.add("Visited unexpected tag: ${actualTag}");
+        _errors.add("Visited unexpected tag: $actualTag");
       }
     }
     _validateNode(actual);
@@ -11068,15 +10871,15 @@
   }
   void _validateNode(ht.XmlNode node) {
     if (node.beginToken == null) {
-      _errors.add("No begin token for ${node.runtimeType.toString()}");
+      _errors.add("No begin token for ${node.runtimeType}");
     }
     if (node.endToken == null) {
-      _errors.add("No end token for ${node.runtimeType.toString()}");
+      _errors.add("No end token for ${node.runtimeType}");
     }
     int nodeStart = node.offset;
     int nodeLength = node.length;
     if (nodeStart < 0 || nodeLength < 0) {
-      _errors.add("No source info for ${node.runtimeType.toString()}");
+      _errors.add("No source info for ${node.runtimeType}");
     }
     ht.XmlNode parent = node.parent;
     if (parent != null) {
@@ -11085,11 +10888,11 @@
       int parentEnd = parentStart + parent.length;
       if (nodeStart < parentStart) {
         _errors.add(
-            "Invalid source start (${nodeStart}) for ${node.runtimeType.toString()} inside ${parent.runtimeType.toString()} (${parentStart})");
+            "Invalid source start ($nodeStart) for ${node.runtimeType} inside ${parent.runtimeType} ($parentStart)");
       }
       if (nodeEnd > parentEnd) {
         _errors.add(
-            "Invalid source end (${nodeEnd}) for ${node.runtimeType.toString()} inside ${parent.runtimeType.toString()} (${parentStart})");
+            "Invalid source end ($nodeEnd) for ${node.runtimeType} inside ${parent.runtimeType} ($parentStart)");
       }
     }
   }
@@ -11112,18 +10915,18 @@
 
 
 class _AngularTest_findElement extends GeneralizingElementVisitor<Object> {
-  ElementKind kind;
+  final ElementKind kind;
 
-  String name;
+  final String name;
 
-  List<Element> result;
+  Element result;
 
-  _AngularTest_findElement(this.kind, this.name, this.result);
+  _AngularTest_findElement(this.kind, this.name);
 
   @override
   Object visitElement(Element element) {
     if ((kind == null || element.kind == kind) && name == element.name) {
-      result[0] = element;
+      result = element;
     }
     return super.visitElement(element);
   }
@@ -11150,8 +10953,7 @@
   }
   void _validateEmbedded(int scriptIndex, HtmlScriptElement script) {
     if (script is! EmbeddedHtmlScriptElementImpl) {
-      JUnitTestCase.fail(
-          "Expected script ${scriptIndex} to be embedded, but found ${(script != null ? script.runtimeType : "null")}");
+      fail("Expected script $scriptIndex to be embedded, but found ${script != null ? script.runtimeType : "null"}");
     }
     EmbeddedHtmlScriptElementImpl embeddedScript =
         script as EmbeddedHtmlScriptElementImpl;
@@ -11159,21 +10961,17 @@
   }
   void _validateExternal(int scriptIndex, HtmlScriptElement script) {
     if (script is! ExternalHtmlScriptElementImpl) {
-      JUnitTestCase.fail(
-          "Expected script ${scriptIndex} to be external with src=${_expectedExternalScriptName} but found ${(script != null ? script.runtimeType : "null")}");
+      fail("Expected script $scriptIndex to be external with src=$_expectedExternalScriptName but found ${script != null ? script.runtimeType : "null"}");
     }
     ExternalHtmlScriptElementImpl externalScript =
         script as ExternalHtmlScriptElementImpl;
     Source scriptSource = externalScript.scriptSource;
     if (_expectedExternalScriptName == null) {
-      JUnitTestCase.assertNullMsg("script ${scriptIndex}", scriptSource);
+      expect(scriptSource, isNull, reason: "script $scriptIndex");
     } else {
-      JUnitTestCase.assertNotNullMsg("script ${scriptIndex}", scriptSource);
+      expect(scriptSource, isNotNull, reason: "script $scriptIndex");
       String actualExternalScriptName = scriptSource.shortName;
-      JUnitTestCase.assertEqualsMsg(
-          "script ${scriptIndex}",
-          _expectedExternalScriptName,
-          actualExternalScriptName);
+      expect(actualExternalScriptName, _expectedExternalScriptName, reason: "script $scriptIndex");
     }
   }
 }
diff --git a/pkg/analyzer/test/generated/ast_test.dart b/pkg/analyzer/test/generated/ast_test.dart
index 7d19f0c..3a13b38 100644
--- a/pkg/analyzer/test/generated/ast_test.dart
+++ b/pkg/analyzer/test/generated/ast_test.dart
@@ -9,11 +9,10 @@
 
 import 'package:analyzer/src/generated/java_core.dart';
 import 'package:analyzer/src/generated/java_engine.dart';
-import 'package:analyzer/src/generated/java_junit.dart';
 import 'package:analyzer/src/generated/java_engine.dart' show Predicate;
 import 'package:analyzer/src/generated/scanner.dart';
 import 'package:analyzer/src/generated/ast.dart';
-import 'package:unittest/unittest.dart' as _ut;
+import 'package:unittest/unittest.dart';
 import 'parser_test.dart' show ParserTestCase;
 import 'test_support.dart';
 import 'package:analyzer/src/generated/testing/ast_factory.dart';
@@ -60,30 +59,30 @@
 
 class BreadthFirstVisitorTest extends ParserTestCase {
   void test_it() {
-    String source = EngineTestCase.createSource([
-        "class A {",
-        "  bool get g => true;",
-        "}",
-        "class B {",
-        "  int f() {",
-        "    num q() {",
-        "      return 3;",
-        "    }",
-        "  return q() + 4;",
-        "  }",
-        "}",
-        "A f(var p) {",
-        "  if ((p as A).g) {",
-        "    return p;",
-        "  } else {",
-        "    return null;",
-        "  }",
-        "}"]);
+    String source = r'''
+class A {
+  bool get g => true;
+}
+class B {
+  int f() {
+    num q() {
+      return 3;
+    }
+  return q() + 4;
+  }
+}
+A f(var p) {
+  if ((p as A).g) {
+    return p;
+  } else {
+    return null;
+  }
+}''';
     CompilationUnit unit = ParserTestCase.parseCompilationUnit(source, []);
     List<AstNode> nodes = new List<AstNode>();
     BreadthFirstVisitor<Object> visitor = new BreadthFirstVisitor_BreadthFirstVisitorTest_testIt(nodes);
     visitor.visitAllNodes(unit);
-    EngineTestCase.assertSizeOfList(59, nodes);
+    expect(nodes, hasLength(59));
     EngineTestCase.assertInstanceOf((obj) => obj is CompilationUnit, CompilationUnit, nodes[0]);
     EngineTestCase.assertInstanceOf((obj) => obj is ClassDeclaration, ClassDeclaration, nodes[2]);
     EngineTestCase.assertInstanceOf((obj) => obj is FunctionDeclaration, FunctionDeclaration, nodes[3]);
@@ -112,10 +111,10 @@
     ConstructorDeclaration aConstructor = AstFactory.constructorDeclaration(AstFactory.identifier3("Test"), "a", AstFactory.formalParameterList([]), initializers);
     ConstructorDeclaration bConstructor = AstFactory.constructorDeclaration(AstFactory.identifier3("Test"), "b", AstFactory.formalParameterList([]), initializers);
     ClassDeclaration clazz = AstFactory.classDeclaration(null, "Test", null, null, null, null, [defaultConstructor, aConstructor, bConstructor]);
-    JUnitTestCase.assertSame(defaultConstructor, clazz.getConstructor(null));
-    JUnitTestCase.assertSame(aConstructor, clazz.getConstructor("a"));
-    JUnitTestCase.assertSame(bConstructor, clazz.getConstructor("b"));
-    JUnitTestCase.assertSame(null, clazz.getConstructor("noSuchConstructor"));
+    expect(clazz.getConstructor(null), same(defaultConstructor));
+    expect(clazz.getConstructor("a"), same(aConstructor));
+    expect(clazz.getConstructor("b"), same(bConstructor));
+    expect(clazz.getConstructor("noSuchConstructor"), same(null));
   }
 
   void test_getField() {
@@ -125,345 +124,345 @@
     ClassDeclaration clazz = AstFactory.classDeclaration(null, "Test", null, null, null, null, [
         AstFactory.fieldDeclaration2(false, null, [aVar]),
         AstFactory.fieldDeclaration2(false, null, [bVar, cVar])]);
-    JUnitTestCase.assertSame(aVar, clazz.getField("a"));
-    JUnitTestCase.assertSame(bVar, clazz.getField("b"));
-    JUnitTestCase.assertSame(cVar, clazz.getField("c"));
-    JUnitTestCase.assertSame(null, clazz.getField("noSuchField"));
+    expect(clazz.getField("a"), same(aVar));
+    expect(clazz.getField("b"), same(bVar));
+    expect(clazz.getField("c"), same(cVar));
+    expect(clazz.getField("noSuchField"), same(null));
   }
 
   void test_getMethod() {
     MethodDeclaration aMethod = AstFactory.methodDeclaration(null, null, null, null, AstFactory.identifier3("a"), AstFactory.formalParameterList([]));
     MethodDeclaration bMethod = AstFactory.methodDeclaration(null, null, null, null, AstFactory.identifier3("b"), AstFactory.formalParameterList([]));
     ClassDeclaration clazz = AstFactory.classDeclaration(null, "Test", null, null, null, null, [aMethod, bMethod]);
-    JUnitTestCase.assertSame(aMethod, clazz.getMethod("a"));
-    JUnitTestCase.assertSame(bMethod, clazz.getMethod("b"));
-    JUnitTestCase.assertSame(null, clazz.getMethod("noSuchMethod"));
+    expect(clazz.getMethod("a"), same(aMethod));
+    expect(clazz.getMethod("b"), same(bMethod));
+    expect(clazz.getMethod("noSuchMethod"), same(null));
   }
 
   void test_isAbstract() {
-    JUnitTestCase.assertFalse(AstFactory.classDeclaration(null, "A", null, null, null, null, []).isAbstract);
-    JUnitTestCase.assertTrue(AstFactory.classDeclaration(Keyword.ABSTRACT, "B", null, null, null, null, []).isAbstract);
+    expect(AstFactory.classDeclaration(null, "A", null, null, null, null, []).isAbstract, isFalse);
+    expect(AstFactory.classDeclaration(Keyword.ABSTRACT, "B", null, null, null, null, []).isAbstract, isTrue);
   }
 }
 
 class ClassTypeAliasTest extends ParserTestCase {
   void test_isAbstract() {
-    JUnitTestCase.assertFalse(AstFactory.classTypeAlias("A", null, null, null, null, null).isAbstract);
-    JUnitTestCase.assertTrue(AstFactory.classTypeAlias("B", null, Keyword.ABSTRACT, null, null, null).isAbstract);
+    expect(AstFactory.classTypeAlias("A", null, null, null, null, null).isAbstract, isFalse);
+    expect(AstFactory.classTypeAlias("B", null, Keyword.ABSTRACT, null, null, null).isAbstract, isTrue);
   }
 }
 
 class ConstantEvaluatorTest extends ParserTestCase {
   void fail_constructor() {
     Object value = _getConstantValue("?");
-    JUnitTestCase.assertEquals(null, value);
+    expect(value, null);
   }
 
   void fail_identifier_class() {
     Object value = _getConstantValue("?");
-    JUnitTestCase.assertEquals(null, value);
+    expect(value, null);
   }
 
   void fail_identifier_function() {
     Object value = _getConstantValue("?");
-    JUnitTestCase.assertEquals(null, value);
+    expect(value, null);
   }
 
   void fail_identifier_static() {
     Object value = _getConstantValue("?");
-    JUnitTestCase.assertEquals(null, value);
+    expect(value, null);
   }
 
   void fail_identifier_staticMethod() {
     Object value = _getConstantValue("?");
-    JUnitTestCase.assertEquals(null, value);
+    expect(value, null);
   }
 
   void fail_identifier_topLevel() {
     Object value = _getConstantValue("?");
-    JUnitTestCase.assertEquals(null, value);
+    expect(value, null);
   }
 
   void fail_identifier_typeParameter() {
     Object value = _getConstantValue("?");
-    JUnitTestCase.assertEquals(null, value);
+    expect(value, null);
   }
 
   void test_binary_bitAnd() {
     Object value = _getConstantValue("74 & 42");
     EngineTestCase.assertInstanceOf((obj) => obj is int, int, value);
-    JUnitTestCase.assertEquals(74 & 42, value as int);
+    expect(value as int, 74 & 42);
   }
 
   void test_binary_bitOr() {
     Object value = _getConstantValue("74 | 42");
     EngineTestCase.assertInstanceOf((obj) => obj is int, int, value);
-    JUnitTestCase.assertEquals(74 | 42, value as int);
+    expect(value as int, 74 | 42);
   }
 
   void test_binary_bitXor() {
     Object value = _getConstantValue("74 ^ 42");
     EngineTestCase.assertInstanceOf((obj) => obj is int, int, value);
-    JUnitTestCase.assertEquals(74 ^ 42, value as int);
+    expect(value as int, 74 ^ 42);
   }
 
   void test_binary_divide_double() {
     Object value = _getConstantValue("3.2 / 2.3");
     EngineTestCase.assertInstanceOf((obj) => obj is double, double, value);
-    JUnitTestCase.assertEquals(3.2 / 2.3, value as double);
+    expect(value as double, 3.2 / 2.3);
   }
 
   void test_binary_divide_integer() {
     Object value = _getConstantValue("3 / 2");
     EngineTestCase.assertInstanceOf((obj) => obj is int, int, value);
-    JUnitTestCase.assertEquals(1, value as int);
+    expect(value as int, 1);
   }
 
   void test_binary_equal_boolean() {
     Object value = _getConstantValue("true == false");
-    JUnitTestCase.assertEquals(false, value);
+    expect(value, false);
   }
 
   void test_binary_equal_integer() {
     Object value = _getConstantValue("2 == 3");
-    JUnitTestCase.assertEquals(false, value);
+    expect(value, false);
   }
 
   void test_binary_equal_invalidLeft() {
     Object value = _getConstantValue("a == 3");
-    JUnitTestCase.assertEquals(ConstantEvaluator.NOT_A_CONSTANT, value);
+    expect(value, ConstantEvaluator.NOT_A_CONSTANT);
   }
 
   void test_binary_equal_invalidRight() {
     Object value = _getConstantValue("2 == a");
-    JUnitTestCase.assertEquals(ConstantEvaluator.NOT_A_CONSTANT, value);
+    expect(value, ConstantEvaluator.NOT_A_CONSTANT);
   }
 
   void test_binary_equal_string() {
     Object value = _getConstantValue("'a' == 'b'");
-    JUnitTestCase.assertEquals(false, value);
+    expect(value, false);
   }
 
   void test_binary_greaterThan() {
     Object value = _getConstantValue("2 > 3");
-    JUnitTestCase.assertEquals(false, value);
+    expect(value, false);
   }
 
   void test_binary_greaterThanOrEqual() {
     Object value = _getConstantValue("2 >= 3");
-    JUnitTestCase.assertEquals(false, value);
+    expect(value, false);
   }
 
   void test_binary_leftShift() {
     Object value = _getConstantValue("16 << 2");
     EngineTestCase.assertInstanceOf((obj) => obj is int, int, value);
-    JUnitTestCase.assertEquals(64, value as int);
+    expect(value as int, 64);
   }
 
   void test_binary_lessThan() {
     Object value = _getConstantValue("2 < 3");
-    JUnitTestCase.assertEquals(true, value);
+    expect(value, true);
   }
 
   void test_binary_lessThanOrEqual() {
     Object value = _getConstantValue("2 <= 3");
-    JUnitTestCase.assertEquals(true, value);
+    expect(value, true);
   }
 
   void test_binary_logicalAnd() {
     Object value = _getConstantValue("true && false");
-    JUnitTestCase.assertEquals(false, value);
+    expect(value, false);
   }
 
   void test_binary_logicalOr() {
     Object value = _getConstantValue("true || false");
-    JUnitTestCase.assertEquals(true, value);
+    expect(value, true);
   }
 
   void test_binary_minus_double() {
     Object value = _getConstantValue("3.2 - 2.3");
     EngineTestCase.assertInstanceOf((obj) => obj is double, double, value);
-    JUnitTestCase.assertEquals(3.2 - 2.3, value as double);
+    expect(value as double, 3.2 - 2.3);
   }
 
   void test_binary_minus_integer() {
     Object value = _getConstantValue("3 - 2");
     EngineTestCase.assertInstanceOf((obj) => obj is int, int, value);
-    JUnitTestCase.assertEquals(1, value as int);
+    expect(value as int, 1);
   }
 
   void test_binary_notEqual_boolean() {
     Object value = _getConstantValue("true != false");
-    JUnitTestCase.assertEquals(true, value);
+    expect(value, true);
   }
 
   void test_binary_notEqual_integer() {
     Object value = _getConstantValue("2 != 3");
-    JUnitTestCase.assertEquals(true, value);
+    expect(value, true);
   }
 
   void test_binary_notEqual_invalidLeft() {
     Object value = _getConstantValue("a != 3");
-    JUnitTestCase.assertEquals(ConstantEvaluator.NOT_A_CONSTANT, value);
+    expect(value, ConstantEvaluator.NOT_A_CONSTANT);
   }
 
   void test_binary_notEqual_invalidRight() {
     Object value = _getConstantValue("2 != a");
-    JUnitTestCase.assertEquals(ConstantEvaluator.NOT_A_CONSTANT, value);
+    expect(value, ConstantEvaluator.NOT_A_CONSTANT);
   }
 
   void test_binary_notEqual_string() {
     Object value = _getConstantValue("'a' != 'b'");
-    JUnitTestCase.assertEquals(true, value);
+    expect(value, true);
   }
 
   void test_binary_plus_double() {
     Object value = _getConstantValue("2.3 + 3.2");
     EngineTestCase.assertInstanceOf((obj) => obj is double, double, value);
-    JUnitTestCase.assertEquals(2.3 + 3.2, value as double);
+    expect(value as double, 2.3 + 3.2);
   }
 
   void test_binary_plus_integer() {
     Object value = _getConstantValue("2 + 3");
     EngineTestCase.assertInstanceOf((obj) => obj is int, int, value);
-    JUnitTestCase.assertEquals(5, value as int);
+    expect(value as int, 5);
   }
 
   void test_binary_remainder_double() {
     Object value = _getConstantValue("3.2 % 2.3");
     EngineTestCase.assertInstanceOf((obj) => obj is double, double, value);
-    JUnitTestCase.assertEquals(3.2 % 2.3, value as double);
+    expect(value as double, 3.2 % 2.3);
   }
 
   void test_binary_remainder_integer() {
     Object value = _getConstantValue("8 % 3");
     EngineTestCase.assertInstanceOf((obj) => obj is int, int, value);
-    JUnitTestCase.assertEquals(2, value as int);
+    expect(value as int, 2);
   }
 
   void test_binary_rightShift() {
     Object value = _getConstantValue("64 >> 2");
     EngineTestCase.assertInstanceOf((obj) => obj is int, int, value);
-    JUnitTestCase.assertEquals(16, value as int);
+    expect(value as int, 16);
   }
 
   void test_binary_times_double() {
     Object value = _getConstantValue("2.3 * 3.2");
     EngineTestCase.assertInstanceOf((obj) => obj is double, double, value);
-    JUnitTestCase.assertEquals(2.3 * 3.2, value as double);
+    expect(value as double, 2.3 * 3.2);
   }
 
   void test_binary_times_integer() {
     Object value = _getConstantValue("2 * 3");
     EngineTestCase.assertInstanceOf((obj) => obj is int, int, value);
-    JUnitTestCase.assertEquals(6, value as int);
+    expect(value as int, 6);
   }
 
   void test_binary_truncatingDivide_double() {
     Object value = _getConstantValue("3.2 ~/ 2.3");
     EngineTestCase.assertInstanceOf((obj) => obj is int, int, value);
-    JUnitTestCase.assertEquals(1, value as int);
+    expect(value as int, 1);
   }
 
   void test_binary_truncatingDivide_integer() {
     Object value = _getConstantValue("10 ~/ 3");
     EngineTestCase.assertInstanceOf((obj) => obj is int, int, value);
-    JUnitTestCase.assertEquals(3, value as int);
+    expect(value as int, 3);
   }
 
   void test_literal_boolean_false() {
     Object value = _getConstantValue("false");
-    JUnitTestCase.assertEquals(false, value);
+    expect(value, false);
   }
 
   void test_literal_boolean_true() {
     Object value = _getConstantValue("true");
-    JUnitTestCase.assertEquals(true, value);
+    expect(value, true);
   }
 
   void test_literal_list() {
     Object value = _getConstantValue("['a', 'b', 'c']");
     EngineTestCase.assertInstanceOf((obj) => obj is List, List, value);
     List list = value as List;
-    JUnitTestCase.assertEquals(3, list.length);
-    JUnitTestCase.assertEquals("a", list[0]);
-    JUnitTestCase.assertEquals("b", list[1]);
-    JUnitTestCase.assertEquals("c", list[2]);
+    expect(list.length, 3);
+    expect(list[0], "a");
+    expect(list[1], "b");
+    expect(list[2], "c");
   }
 
   void test_literal_map() {
     Object value = _getConstantValue("{'a' : 'm', 'b' : 'n', 'c' : 'o'}");
     EngineTestCase.assertInstanceOf((obj) => obj is Map, Map, value);
     Map map = value as Map;
-    JUnitTestCase.assertEquals(3, map.length);
-    JUnitTestCase.assertEquals("m", map["a"]);
-    JUnitTestCase.assertEquals("n", map["b"]);
-    JUnitTestCase.assertEquals("o", map["c"]);
+    expect(map.length, 3);
+    expect(map["a"], "m");
+    expect(map["b"], "n");
+    expect(map["c"], "o");
   }
 
   void test_literal_null() {
     Object value = _getConstantValue("null");
-    JUnitTestCase.assertEquals(null, value);
+    expect(value, null);
   }
 
   void test_literal_number_double() {
     Object value = _getConstantValue("3.45");
     EngineTestCase.assertInstanceOf((obj) => obj is double, double, value);
-    JUnitTestCase.assertEquals(3.45, value as double);
+    expect(value as double, 3.45);
   }
 
   void test_literal_number_integer() {
     Object value = _getConstantValue("42");
     EngineTestCase.assertInstanceOf((obj) => obj is int, int, value);
-    JUnitTestCase.assertEquals(42, value as int);
+    expect(value as int, 42);
   }
 
   void test_literal_string_adjacent() {
     Object value = _getConstantValue("'abc' 'def'");
-    JUnitTestCase.assertEquals("abcdef", value);
+    expect(value, "abcdef");
   }
 
   void test_literal_string_interpolation_invalid() {
     Object value = _getConstantValue("'a\${f()}c'");
-    JUnitTestCase.assertEquals(ConstantEvaluator.NOT_A_CONSTANT, value);
+    expect(value, ConstantEvaluator.NOT_A_CONSTANT);
   }
 
   void test_literal_string_interpolation_valid() {
     Object value = _getConstantValue("'a\${3}c'");
-    JUnitTestCase.assertEquals("a3c", value);
+    expect(value, "a3c");
   }
 
   void test_literal_string_simple() {
     Object value = _getConstantValue("'abc'");
-    JUnitTestCase.assertEquals("abc", value);
+    expect(value, "abc");
   }
 
   void test_parenthesizedExpression() {
     Object value = _getConstantValue("('a')");
-    JUnitTestCase.assertEquals("a", value);
+    expect(value, "a");
   }
 
   void test_unary_bitNot() {
     Object value = _getConstantValue("~42");
     EngineTestCase.assertInstanceOf((obj) => obj is int, int, value);
-    JUnitTestCase.assertEquals(~42, value as int);
+    expect(value as int, ~42);
   }
 
   void test_unary_logicalNot() {
     Object value = _getConstantValue("!true");
-    JUnitTestCase.assertEquals(false, value);
+    expect(value, false);
   }
 
   void test_unary_negated_double() {
     Object value = _getConstantValue("-42.3");
     EngineTestCase.assertInstanceOf((obj) => obj is double, double, value);
-    JUnitTestCase.assertEquals(-42.3, value as double);
+    expect(value as double, -42.3);
   }
 
   void test_unary_negated_integer() {
     Object value = _getConstantValue("-42");
     EngineTestCase.assertInstanceOf((obj) => obj is int, int, value);
-    JUnitTestCase.assertEquals(-42, value as int);
+    expect(value as int, -42);
   }
 
   Object _getConstantValue(String source) => ParserTestCase.parseExpression(source, []).accept(new ConstantEvaluator());
@@ -474,84 +473,84 @@
     IndexExpression expression = AstFactory.indexExpression(AstFactory.identifier3("a"), AstFactory.identifier3("b"));
     // a[b] += c
     AstFactory.assignmentExpression(expression, TokenType.PLUS_EQ, AstFactory.identifier3("c"));
-    JUnitTestCase.assertTrue(expression.inGetterContext());
+    expect(expression.inGetterContext(), isTrue);
   }
 
   void test_inGetterContext_assignment_simple_left() {
     IndexExpression expression = AstFactory.indexExpression(AstFactory.identifier3("a"), AstFactory.identifier3("b"));
     // a[b] = c
     AstFactory.assignmentExpression(expression, TokenType.EQ, AstFactory.identifier3("c"));
-    JUnitTestCase.assertFalse(expression.inGetterContext());
+    expect(expression.inGetterContext(), isFalse);
   }
 
   void test_inGetterContext_nonAssignment() {
     IndexExpression expression = AstFactory.indexExpression(AstFactory.identifier3("a"), AstFactory.identifier3("b"));
     // a[b] + c
     AstFactory.binaryExpression(expression, TokenType.PLUS, AstFactory.identifier3("c"));
-    JUnitTestCase.assertTrue(expression.inGetterContext());
+    expect(expression.inGetterContext(), isTrue);
   }
 
   void test_inSetterContext_assignment_compound_left() {
     IndexExpression expression = AstFactory.indexExpression(AstFactory.identifier3("a"), AstFactory.identifier3("b"));
     // a[b] += c
     AstFactory.assignmentExpression(expression, TokenType.PLUS_EQ, AstFactory.identifier3("c"));
-    JUnitTestCase.assertTrue(expression.inSetterContext());
+    expect(expression.inSetterContext(), isTrue);
   }
 
   void test_inSetterContext_assignment_compound_right() {
     IndexExpression expression = AstFactory.indexExpression(AstFactory.identifier3("a"), AstFactory.identifier3("b"));
     // c += a[b]
     AstFactory.assignmentExpression(AstFactory.identifier3("c"), TokenType.PLUS_EQ, expression);
-    JUnitTestCase.assertFalse(expression.inSetterContext());
+    expect(expression.inSetterContext(), isFalse);
   }
 
   void test_inSetterContext_assignment_simple_left() {
     IndexExpression expression = AstFactory.indexExpression(AstFactory.identifier3("a"), AstFactory.identifier3("b"));
     // a[b] = c
     AstFactory.assignmentExpression(expression, TokenType.EQ, AstFactory.identifier3("c"));
-    JUnitTestCase.assertTrue(expression.inSetterContext());
+    expect(expression.inSetterContext(), isTrue);
   }
 
   void test_inSetterContext_assignment_simple_right() {
     IndexExpression expression = AstFactory.indexExpression(AstFactory.identifier3("a"), AstFactory.identifier3("b"));
     // c = a[b]
     AstFactory.assignmentExpression(AstFactory.identifier3("c"), TokenType.EQ, expression);
-    JUnitTestCase.assertFalse(expression.inSetterContext());
+    expect(expression.inSetterContext(), isFalse);
   }
 
   void test_inSetterContext_nonAssignment() {
     IndexExpression expression = AstFactory.indexExpression(AstFactory.identifier3("a"), AstFactory.identifier3("b"));
     AstFactory.binaryExpression(expression, TokenType.PLUS, AstFactory.identifier3("c"));
     // a[b] + cc
-    JUnitTestCase.assertFalse(expression.inSetterContext());
+    expect(expression.inSetterContext(), isFalse);
   }
 
   void test_inSetterContext_postfix() {
     IndexExpression expression = AstFactory.indexExpression(AstFactory.identifier3("a"), AstFactory.identifier3("b"));
     AstFactory.postfixExpression(expression, TokenType.PLUS_PLUS);
     // a[b]++
-    JUnitTestCase.assertTrue(expression.inSetterContext());
+    expect(expression.inSetterContext(), isTrue);
   }
 
   void test_inSetterContext_prefix_bang() {
     IndexExpression expression = AstFactory.indexExpression(AstFactory.identifier3("a"), AstFactory.identifier3("b"));
     // !a[b]
     AstFactory.prefixExpression(TokenType.BANG, expression);
-    JUnitTestCase.assertFalse(expression.inSetterContext());
+    expect(expression.inSetterContext(), isFalse);
   }
 
   void test_inSetterContext_prefix_minusMinus() {
     IndexExpression expression = AstFactory.indexExpression(AstFactory.identifier3("a"), AstFactory.identifier3("b"));
     // --a[b]
     AstFactory.prefixExpression(TokenType.MINUS_MINUS, expression);
-    JUnitTestCase.assertTrue(expression.inSetterContext());
+    expect(expression.inSetterContext(), isTrue);
   }
 
   void test_inSetterContext_prefix_plusPlus() {
     IndexExpression expression = AstFactory.indexExpression(AstFactory.identifier3("a"), AstFactory.identifier3("b"));
     // ++a[b]
     AstFactory.prefixExpression(TokenType.PLUS_PLUS, expression);
-    JUnitTestCase.assertTrue(expression.inSetterContext());
+    expect(expression.inSetterContext(), isTrue);
   }
 }
 
@@ -563,27 +562,27 @@
     NodeList<AstNode> list = new NodeList<AstNode>(parent);
     list.insert(0, secondNode);
     list.insert(0, firstNode);
-    EngineTestCase.assertSizeOfList(2, list);
-    JUnitTestCase.assertSame(firstNode, list[0]);
-    JUnitTestCase.assertSame(secondNode, list[1]);
-    JUnitTestCase.assertSame(parent, firstNode.parent);
-    JUnitTestCase.assertSame(parent, secondNode.parent);
+    expect(list, hasLength(2));
+    expect(list[0], same(firstNode));
+    expect(list[1], same(secondNode));
+    expect(firstNode.parent, same(parent));
+    expect(secondNode.parent, same(parent));
     AstNode thirdNode = AstFactory.booleanLiteral(false);
     list.insert(1, thirdNode);
-    EngineTestCase.assertSizeOfList(3, list);
-    JUnitTestCase.assertSame(firstNode, list[0]);
-    JUnitTestCase.assertSame(thirdNode, list[1]);
-    JUnitTestCase.assertSame(secondNode, list[2]);
-    JUnitTestCase.assertSame(parent, firstNode.parent);
-    JUnitTestCase.assertSame(parent, secondNode.parent);
-    JUnitTestCase.assertSame(parent, thirdNode.parent);
+    expect(list, hasLength(3));
+    expect(list[0], same(firstNode));
+    expect(list[1], same(thirdNode));
+    expect(list[2], same(secondNode));
+    expect(firstNode.parent, same(parent));
+    expect(secondNode.parent, same(parent));
+    expect(thirdNode.parent, same(parent));
   }
 
   void test_add_negative() {
     NodeList<AstNode> list = new NodeList<AstNode>(AstFactory.argumentList([]));
     try {
       list.insert(-1, AstFactory.booleanLiteral(true));
-      JUnitTestCase.fail("Expected IndexOutOfBoundsException");
+      fail("Expected IndexOutOfBoundsException");
     } on RangeError catch (exception) {
       // Expected
     }
@@ -593,7 +592,7 @@
     NodeList<AstNode> list = new NodeList<AstNode>(AstFactory.argumentList([]));
     try {
       list.insert(1, AstFactory.booleanLiteral(true));
-      JUnitTestCase.fail("Expected IndexOutOfBoundsException");
+      fail("Expected IndexOutOfBoundsException");
     } on RangeError catch (exception) {
       // Expected
     }
@@ -608,49 +607,49 @@
     firstNodes.add(secondNode);
     NodeList<AstNode> list = new NodeList<AstNode>(parent);
     list.addAll(firstNodes);
-    EngineTestCase.assertSizeOfList(2, list);
-    JUnitTestCase.assertSame(firstNode, list[0]);
-    JUnitTestCase.assertSame(secondNode, list[1]);
-    JUnitTestCase.assertSame(parent, firstNode.parent);
-    JUnitTestCase.assertSame(parent, secondNode.parent);
+    expect(list, hasLength(2));
+    expect(list[0], same(firstNode));
+    expect(list[1], same(secondNode));
+    expect(firstNode.parent, same(parent));
+    expect(secondNode.parent, same(parent));
     List<AstNode> secondNodes = new List<AstNode>();
     AstNode thirdNode = AstFactory.booleanLiteral(true);
     AstNode fourthNode = AstFactory.booleanLiteral(false);
     secondNodes.add(thirdNode);
     secondNodes.add(fourthNode);
     list.addAll(secondNodes);
-    EngineTestCase.assertSizeOfList(4, list);
-    JUnitTestCase.assertSame(firstNode, list[0]);
-    JUnitTestCase.assertSame(secondNode, list[1]);
-    JUnitTestCase.assertSame(thirdNode, list[2]);
-    JUnitTestCase.assertSame(fourthNode, list[3]);
-    JUnitTestCase.assertSame(parent, firstNode.parent);
-    JUnitTestCase.assertSame(parent, secondNode.parent);
-    JUnitTestCase.assertSame(parent, thirdNode.parent);
-    JUnitTestCase.assertSame(parent, fourthNode.parent);
+    expect(list, hasLength(4));
+    expect(list[0], same(firstNode));
+    expect(list[1], same(secondNode));
+    expect(list[2], same(thirdNode));
+    expect(list[3], same(fourthNode));
+    expect(firstNode.parent, same(parent));
+    expect(secondNode.parent, same(parent));
+    expect(thirdNode.parent, same(parent));
+    expect(fourthNode.parent, same(parent));
   }
 
   void test_create() {
     AstNode owner = AstFactory.argumentList([]);
     NodeList<AstNode> list = NodeList.create(owner);
-    JUnitTestCase.assertNotNull(list);
-    EngineTestCase.assertSizeOfList(0, list);
-    JUnitTestCase.assertSame(owner, list.owner);
+    expect(list, isNotNull);
+    expect(list, hasLength(0));
+    expect(list.owner, same(owner));
   }
 
   void test_creation() {
     AstNode owner = AstFactory.argumentList([]);
     NodeList<AstNode> list = new NodeList<AstNode>(owner);
-    JUnitTestCase.assertNotNull(list);
-    EngineTestCase.assertSizeOfList(0, list);
-    JUnitTestCase.assertSame(owner, list.owner);
+    expect(list, isNotNull);
+    expect(list, hasLength(0));
+    expect(list.owner, same(owner));
   }
 
   void test_get_negative() {
     NodeList<AstNode> list = new NodeList<AstNode>(AstFactory.argumentList([]));
     try {
       list[-1];
-      JUnitTestCase.fail("Expected IndexOutOfBoundsException");
+      fail("Expected IndexOutOfBoundsException");
     } on RangeError catch (exception) {
       // Expected
     }
@@ -660,7 +659,7 @@
     NodeList<AstNode> list = new NodeList<AstNode>(AstFactory.argumentList([]));
     try {
       list[1];
-      JUnitTestCase.fail("Expected IndexOutOfBoundsException");
+      fail("Expected IndexOutOfBoundsException");
     } on RangeError catch (exception) {
       // Expected
     }
@@ -668,26 +667,26 @@
 
   void test_getBeginToken_empty() {
     NodeList<AstNode> list = new NodeList<AstNode>(AstFactory.argumentList([]));
-    JUnitTestCase.assertNull(list.beginToken);
+    expect(list.beginToken, isNull);
   }
 
   void test_getBeginToken_nonEmpty() {
     NodeList<AstNode> list = new NodeList<AstNode>(AstFactory.argumentList([]));
     AstNode node = AstFactory.parenthesizedExpression(AstFactory.booleanLiteral(true));
     list.add(node);
-    JUnitTestCase.assertSame(node.beginToken, list.beginToken);
+    expect(list.beginToken, same(node.beginToken));
   }
 
   void test_getEndToken_empty() {
     NodeList<AstNode> list = new NodeList<AstNode>(AstFactory.argumentList([]));
-    JUnitTestCase.assertNull(list.endToken);
+    expect(list.endToken, isNull);
   }
 
   void test_getEndToken_nonEmpty() {
     NodeList<AstNode> list = new NodeList<AstNode>(AstFactory.argumentList([]));
     AstNode node = AstFactory.parenthesizedExpression(AstFactory.booleanLiteral(true));
     list.add(node);
-    JUnitTestCase.assertSame(node.endToken, list.endToken);
+    expect(list.endToken, same(node.endToken));
   }
 
   void test_indexOf() {
@@ -701,12 +700,12 @@
     nodes.add(thirdNode);
     NodeList<AstNode> list = new NodeList<AstNode>(AstFactory.argumentList([]));
     list.addAll(nodes);
-    EngineTestCase.assertSizeOfList(3, list);
-    JUnitTestCase.assertEquals(0, list.indexOf(firstNode));
-    JUnitTestCase.assertEquals(1, list.indexOf(secondNode));
-    JUnitTestCase.assertEquals(2, list.indexOf(thirdNode));
-    JUnitTestCase.assertEquals(-1, list.indexOf(fourthNode));
-    JUnitTestCase.assertEquals(-1, list.indexOf(null));
+    expect(list, hasLength(3));
+    expect(list.indexOf(firstNode), 0);
+    expect(list.indexOf(secondNode), 1);
+    expect(list.indexOf(thirdNode), 2);
+    expect(list.indexOf(fourthNode), -1);
+    expect(list.indexOf(null), -1);
   }
 
   void test_remove() {
@@ -719,18 +718,18 @@
     nodes.add(thirdNode);
     NodeList<AstNode> list = new NodeList<AstNode>(AstFactory.argumentList([]));
     list.addAll(nodes);
-    EngineTestCase.assertSizeOfList(3, list);
-    JUnitTestCase.assertSame(secondNode, list.removeAt(1));
-    EngineTestCase.assertSizeOfList(2, list);
-    JUnitTestCase.assertSame(firstNode, list[0]);
-    JUnitTestCase.assertSame(thirdNode, list[1]);
+    expect(list, hasLength(3));
+    expect(list.removeAt(1), same(secondNode));
+    expect(list, hasLength(2));
+    expect(list[0], same(firstNode));
+    expect(list[1], same(thirdNode));
   }
 
   void test_remove_negative() {
     NodeList<AstNode> list = new NodeList<AstNode>(AstFactory.argumentList([]));
     try {
       list.removeAt(-1);
-      JUnitTestCase.fail("Expected IndexOutOfBoundsException");
+      fail("Expected IndexOutOfBoundsException");
     } on RangeError catch (exception) {
       // Expected
     }
@@ -740,7 +739,7 @@
     NodeList<AstNode> list = new NodeList<AstNode>(AstFactory.argumentList([]));
     try {
       list.removeAt(1);
-      JUnitTestCase.fail("Expected IndexOutOfBoundsException");
+      fail("Expected IndexOutOfBoundsException");
     } on RangeError catch (exception) {
       // Expected
     }
@@ -756,13 +755,13 @@
     nodes.add(thirdNode);
     NodeList<AstNode> list = new NodeList<AstNode>(AstFactory.argumentList([]));
     list.addAll(nodes);
-    EngineTestCase.assertSizeOfList(3, list);
+    expect(list, hasLength(3));
     AstNode fourthNode = AstFactory.integer(0);
-    JUnitTestCase.assertSame(secondNode, javaListSet(list, 1, fourthNode));
-    EngineTestCase.assertSizeOfList(3, list);
-    JUnitTestCase.assertSame(firstNode, list[0]);
-    JUnitTestCase.assertSame(fourthNode, list[1]);
-    JUnitTestCase.assertSame(thirdNode, list[2]);
+    expect(javaListSet(list, 1, fourthNode), same(secondNode));
+    expect(list, hasLength(3));
+    expect(list[0], same(firstNode));
+    expect(list[1], same(fourthNode));
+    expect(list[2], same(thirdNode));
   }
 
   void test_set_negative() {
@@ -770,7 +769,7 @@
     NodeList<AstNode> list = new NodeList<AstNode>(AstFactory.argumentList([]));
     try {
       javaListSet(list, -1, node);
-      JUnitTestCase.fail("Expected IndexOutOfBoundsException");
+      fail("Expected IndexOutOfBoundsException");
     } on RangeError catch (exception) {
       // Expected
     }
@@ -781,7 +780,7 @@
     NodeList<AstNode> list = new NodeList<AstNode>(AstFactory.argumentList([]));
     try {
       javaListSet(list, 1, node);
-      JUnitTestCase.fail("Expected IndexOutOfBoundsException");
+      fail("Expected IndexOutOfBoundsException");
     } on RangeError catch (exception) {
       // Expected
     }
@@ -796,7 +795,7 @@
 
   void test_searchWithin_null() {
     NodeLocator locator = new NodeLocator.con2(0, 0);
-    JUnitTestCase.assertNull(locator.searchWithin(null));
+    expect(locator.searchWithin(null), isNull);
   }
 
   void test_searchWithin_offset() {
@@ -805,26 +804,30 @@
   }
 
   void test_searchWithin_offsetAfterNode() {
-    CompilationUnit unit = ParserTestCase.parseCompilationUnit(EngineTestCase.createSource(["class A {}", "class B {}"]), []);
+    CompilationUnit unit = ParserTestCase.parseCompilationUnit(r'''
+class A {}
+class B {}''', []);
     NodeLocator locator = new NodeLocator.con2(1024, 1024);
     AstNode node = locator.searchWithin(unit.declarations[0]);
-    JUnitTestCase.assertNull(node);
+    expect(node, isNull);
   }
 
   void test_searchWithin_offsetBeforeNode() {
-    CompilationUnit unit = ParserTestCase.parseCompilationUnit(EngineTestCase.createSource(["class A {}", "class B {}"]), []);
+    CompilationUnit unit = ParserTestCase.parseCompilationUnit(r'''
+class A {}
+class B {}''', []);
     NodeLocator locator = new NodeLocator.con2(0, 0);
     AstNode node = locator.searchWithin(unit.declarations[1]);
-    JUnitTestCase.assertNull(node);
+    expect(node, isNull);
   }
 
   void _assertLocate(CompilationUnit unit, int start, int end, Predicate<AstNode> predicate, Type expectedClass) {
     NodeLocator locator = new NodeLocator.con2(start, end);
     AstNode node = locator.searchWithin(unit);
-    JUnitTestCase.assertNotNull(node);
-    JUnitTestCase.assertSame(node, locator.foundNode);
-    JUnitTestCase.assertTrueMsg("Node starts after range", node.offset <= start);
-    JUnitTestCase.assertTrueMsg("Node ends before range", node.offset + node.length > end);
+    expect(node, isNotNull);
+    expect(locator.foundNode, same(node));
+    expect(node.offset <= start, isTrue, reason: "Node starts after range");
+    expect(node.offset + node.length > end, isTrue, reason: "Node ends before range");
     EngineTestCase.assertInstanceOf(predicate, expectedClass, node);
   }
 }
@@ -832,93 +835,105 @@
 class SimpleIdentifierTest extends ParserTestCase {
   void test_inDeclarationContext_catch_exception() {
     SimpleIdentifier identifier = AstFactory.catchClause("e", []).exceptionParameter;
-    JUnitTestCase.assertTrue(identifier.inDeclarationContext());
+    expect(identifier.inDeclarationContext(), isTrue);
   }
 
   void test_inDeclarationContext_catch_stack() {
     SimpleIdentifier identifier = AstFactory.catchClause2("e", "s", []).stackTraceParameter;
-    JUnitTestCase.assertTrue(identifier.inDeclarationContext());
+    expect(identifier.inDeclarationContext(), isTrue);
   }
 
   void test_inDeclarationContext_classDeclaration() {
     SimpleIdentifier identifier = AstFactory.classDeclaration(null, "C", null, null, null, null, []).name;
-    JUnitTestCase.assertTrue(identifier.inDeclarationContext());
+    expect(identifier.inDeclarationContext(), isTrue);
   }
 
   void test_inDeclarationContext_classTypeAlias() {
     SimpleIdentifier identifier = AstFactory.classTypeAlias("C", null, null, null, null, null).name;
-    JUnitTestCase.assertTrue(identifier.inDeclarationContext());
+    expect(identifier.inDeclarationContext(), isTrue);
   }
 
   void test_inDeclarationContext_constructorDeclaration() {
     SimpleIdentifier identifier = AstFactory.constructorDeclaration(AstFactory.identifier3("C"), "c", null, null).name;
-    JUnitTestCase.assertTrue(identifier.inDeclarationContext());
+    expect(identifier.inDeclarationContext(), isTrue);
   }
 
   void test_inDeclarationContext_declaredIdentifier() {
     DeclaredIdentifier declaredIdentifier = AstFactory.declaredIdentifier3("v");
     SimpleIdentifier identifier = declaredIdentifier.identifier;
-    JUnitTestCase.assertTrue(identifier.inDeclarationContext());
+    expect(identifier.inDeclarationContext(), isTrue);
+  }
+
+  void test_inDeclarationContext_enumConstantDeclaration() {
+    EnumDeclaration enumDeclaration = AstFactory.enumDeclaration2('MyEnum', ['CONST']);
+    SimpleIdentifier identifier = enumDeclaration.constants[0].name;
+    expect(identifier.inDeclarationContext(), isTrue);
+  }
+
+  void test_inDeclarationContext_enumDeclaration() {
+    EnumDeclaration enumDeclaration = AstFactory.enumDeclaration2('MyEnum', ['A', 'B', 'C']);
+    SimpleIdentifier identifier = enumDeclaration.name;
+    expect(identifier.inDeclarationContext(), isTrue);
   }
 
   void test_inDeclarationContext_fieldFormalParameter() {
     SimpleIdentifier identifier = AstFactory.fieldFormalParameter2("p").identifier;
-    JUnitTestCase.assertFalse(identifier.inDeclarationContext());
+    expect(identifier.inDeclarationContext(), isFalse);
   }
 
   void test_inDeclarationContext_functionDeclaration() {
     SimpleIdentifier identifier = AstFactory.functionDeclaration(null, null, "f", null).name;
-    JUnitTestCase.assertTrue(identifier.inDeclarationContext());
+    expect(identifier.inDeclarationContext(), isTrue);
   }
 
   void test_inDeclarationContext_functionTypeAlias() {
     SimpleIdentifier identifier = AstFactory.typeAlias(null, "F", null, null).name;
-    JUnitTestCase.assertTrue(identifier.inDeclarationContext());
+    expect(identifier.inDeclarationContext(), isTrue);
   }
 
   void test_inDeclarationContext_label_false() {
     SimpleIdentifier identifier = AstFactory.namedExpression2("l", AstFactory.integer(0)).name.label;
-    JUnitTestCase.assertFalse(identifier.inDeclarationContext());
+    expect(identifier.inDeclarationContext(), isFalse);
   }
 
   void test_inDeclarationContext_label_true() {
     Label label = AstFactory.label2("l");
     SimpleIdentifier identifier = label.label;
     AstFactory.labeledStatement(AstFactory.list([label]), AstFactory.emptyStatement());
-    JUnitTestCase.assertTrue(identifier.inDeclarationContext());
+    expect(identifier.inDeclarationContext(), isTrue);
   }
 
   void test_inDeclarationContext_methodDeclaration() {
     SimpleIdentifier identifier = AstFactory.identifier3("m");
     AstFactory.methodDeclaration2(null, null, null, null, identifier, null, null);
-    JUnitTestCase.assertTrue(identifier.inDeclarationContext());
+    expect(identifier.inDeclarationContext(), isTrue);
   }
 
   void test_inDeclarationContext_prefix() {
     SimpleIdentifier identifier = AstFactory.importDirective3("uri", "pref", []).prefix;
-    JUnitTestCase.assertTrue(identifier.inDeclarationContext());
+    expect(identifier.inDeclarationContext(), isTrue);
   }
 
   void test_inDeclarationContext_simpleFormalParameter() {
     SimpleIdentifier identifier = AstFactory.simpleFormalParameter3("p").identifier;
-    JUnitTestCase.assertTrue(identifier.inDeclarationContext());
+    expect(identifier.inDeclarationContext(), isTrue);
   }
 
   void test_inDeclarationContext_typeParameter_bound() {
     TypeName bound = AstFactory.typeName4("A", []);
     SimpleIdentifier identifier = bound.name as SimpleIdentifier;
     AstFactory.typeParameter2("E", bound);
-    JUnitTestCase.assertFalse(identifier.inDeclarationContext());
+    expect(identifier.inDeclarationContext(), isFalse);
   }
 
   void test_inDeclarationContext_typeParameter_name() {
     SimpleIdentifier identifier = AstFactory.typeParameter("E").name;
-    JUnitTestCase.assertTrue(identifier.inDeclarationContext());
+    expect(identifier.inDeclarationContext(), isTrue);
   }
 
   void test_inDeclarationContext_variableDeclaration() {
     SimpleIdentifier identifier = AstFactory.variableDeclaration("v").name;
-    JUnitTestCase.assertTrue(identifier.inDeclarationContext());
+    expect(identifier.inDeclarationContext(), isTrue);
   }
 
   void test_inGetterContext() {
@@ -927,11 +942,11 @@
         SimpleIdentifier identifier = _createIdentifier(wrapper, assignment);
         if (assignment == AssignmentKind.SIMPLE_LEFT && wrapper != WrapperKind.PREFIXED_LEFT && wrapper != WrapperKind.PROPERTY_LEFT) {
           if (identifier.inGetterContext()) {
-            JUnitTestCase.fail("Expected ${_topMostNode(identifier).toSource()} to be false");
+            fail("Expected ${_topMostNode(identifier).toSource()} to be false");
           }
         } else {
           if (!identifier.inGetterContext()) {
-            JUnitTestCase.fail("Expected ${_topMostNode(identifier).toSource()} to be true");
+            fail("Expected ${_topMostNode(identifier).toSource()} to be true");
           }
         }
       }
@@ -941,8 +956,8 @@
   void test_inReferenceContext() {
     SimpleIdentifier identifier = AstFactory.identifier3("id");
     AstFactory.namedExpression(AstFactory.label(identifier), AstFactory.identifier3("_"));
-    JUnitTestCase.assertFalse(identifier.inGetterContext());
-    JUnitTestCase.assertFalse(identifier.inSetterContext());
+    expect(identifier.inGetterContext(), isFalse);
+    expect(identifier.inSetterContext(), isFalse);
   }
 
   void test_inSetterContext() {
@@ -951,11 +966,11 @@
         SimpleIdentifier identifier = _createIdentifier(wrapper, assignment);
         if (wrapper == WrapperKind.PREFIXED_LEFT || wrapper == WrapperKind.PROPERTY_LEFT || assignment == AssignmentKind.BINARY || assignment == AssignmentKind.COMPOUND_RIGHT || assignment == AssignmentKind.PREFIX_NOT || assignment == AssignmentKind.SIMPLE_RIGHT || assignment == AssignmentKind.NONE) {
           if (identifier.inSetterContext()) {
-            JUnitTestCase.fail("Expected ${_topMostNode(identifier).toSource()} to be false");
+            fail("Expected ${_topMostNode(identifier).toSource()} to be false");
           }
         } else {
           if (!identifier.inSetterContext()) {
-            JUnitTestCase.fail("Expected ${_topMostNode(identifier).toSource()} to be true");
+            fail("Expected ${_topMostNode(identifier).toSource()} to be true");
           }
         }
       }
@@ -965,43 +980,43 @@
   void test_isQualified_inMethodInvocation_noTarget() {
     MethodInvocation invocation = AstFactory.methodInvocation2("test", [AstFactory.identifier3("arg0")]);
     SimpleIdentifier identifier = invocation.methodName;
-    JUnitTestCase.assertFalse(identifier.isQualified);
+    expect(identifier.isQualified, isFalse);
   }
 
   void test_isQualified_inMethodInvocation_withTarget() {
     MethodInvocation invocation = AstFactory.methodInvocation(AstFactory.identifier3("target"), "test", [AstFactory.identifier3("arg0")]);
     SimpleIdentifier identifier = invocation.methodName;
-    JUnitTestCase.assertTrue(identifier.isQualified);
+    expect(identifier.isQualified, isTrue);
   }
 
   void test_isQualified_inPrefixedIdentifier_name() {
     SimpleIdentifier identifier = AstFactory.identifier3("test");
     AstFactory.identifier4("prefix", identifier);
-    JUnitTestCase.assertTrue(identifier.isQualified);
+    expect(identifier.isQualified, isTrue);
   }
 
   void test_isQualified_inPrefixedIdentifier_prefix() {
     SimpleIdentifier identifier = AstFactory.identifier3("test");
     AstFactory.identifier(identifier, AstFactory.identifier3("name"));
-    JUnitTestCase.assertFalse(identifier.isQualified);
+    expect(identifier.isQualified, isFalse);
   }
 
   void test_isQualified_inPropertyAccess_name() {
     SimpleIdentifier identifier = AstFactory.identifier3("test");
     AstFactory.propertyAccess(AstFactory.identifier3("target"), identifier);
-    JUnitTestCase.assertTrue(identifier.isQualified);
+    expect(identifier.isQualified, isTrue);
   }
 
   void test_isQualified_inPropertyAccess_target() {
     SimpleIdentifier identifier = AstFactory.identifier3("test");
     AstFactory.propertyAccess(identifier, AstFactory.identifier3("name"));
-    JUnitTestCase.assertFalse(identifier.isQualified);
+    expect(identifier.isQualified, isFalse);
   }
 
   void test_isQualified_inReturnStatement() {
     SimpleIdentifier identifier = AstFactory.identifier3("test");
     AstFactory.returnStatement2(identifier);
-    JUnitTestCase.assertFalse(identifier.isQualified);
+    expect(identifier.isQualified, isFalse);
   }
 
   SimpleIdentifier _createIdentifier(WrapperKind wrapper, AssignmentKind assignment) {
@@ -1065,25 +1080,25 @@
 
 class SimpleStringLiteralTest extends ParserTestCase {
   void test_contentsOffset() {
-    JUnitTestCase.assertEquals(1, new SimpleStringLiteral(TokenFactory.tokenFromString("'X'"), "X").contentsOffset);
-    JUnitTestCase.assertEquals(1, new SimpleStringLiteral(TokenFactory.tokenFromString("\"X\""), "X").contentsOffset);
-    JUnitTestCase.assertEquals(3, new SimpleStringLiteral(TokenFactory.tokenFromString("\"\"\"X\"\"\""), "X").contentsOffset);
-    JUnitTestCase.assertEquals(3, new SimpleStringLiteral(TokenFactory.tokenFromString("'''X'''"), "X").contentsOffset);
-    JUnitTestCase.assertEquals(2, new SimpleStringLiteral(TokenFactory.tokenFromString("r'X'"), "X").contentsOffset);
-    JUnitTestCase.assertEquals(2, new SimpleStringLiteral(TokenFactory.tokenFromString("r\"X\""), "X").contentsOffset);
-    JUnitTestCase.assertEquals(4, new SimpleStringLiteral(TokenFactory.tokenFromString("r\"\"\"X\"\"\""), "X").contentsOffset);
-    JUnitTestCase.assertEquals(4, new SimpleStringLiteral(TokenFactory.tokenFromString("r'''X'''"), "X").contentsOffset);
+    expect(new SimpleStringLiteral(TokenFactory.tokenFromString("'X'"), "X").contentsOffset, 1);
+    expect(new SimpleStringLiteral(TokenFactory.tokenFromString("\"X\""), "X").contentsOffset, 1);
+    expect(new SimpleStringLiteral(TokenFactory.tokenFromString("\"\"\"X\"\"\""), "X").contentsOffset, 3);
+    expect(new SimpleStringLiteral(TokenFactory.tokenFromString("'''X'''"), "X").contentsOffset, 3);
+    expect(new SimpleStringLiteral(TokenFactory.tokenFromString("r'X'"), "X").contentsOffset, 2);
+    expect(new SimpleStringLiteral(TokenFactory.tokenFromString("r\"X\""), "X").contentsOffset, 2);
+    expect(new SimpleStringLiteral(TokenFactory.tokenFromString("r\"\"\"X\"\"\""), "X").contentsOffset, 4);
+    expect(new SimpleStringLiteral(TokenFactory.tokenFromString("r'''X'''"), "X").contentsOffset, 4);
   }
 
   void test_contentsEnd() {
-    JUnitTestCase.assertEquals(2, new SimpleStringLiteral(TokenFactory.tokenFromString("'X'"), "X").contentsEnd);
-    JUnitTestCase.assertEquals(2, new SimpleStringLiteral(TokenFactory.tokenFromString("\"X\""), "X").contentsEnd);
-    JUnitTestCase.assertEquals(4, new SimpleStringLiteral(TokenFactory.tokenFromString("\"\"\"X\"\"\""), "X").contentsEnd);
-    JUnitTestCase.assertEquals(4, new SimpleStringLiteral(TokenFactory.tokenFromString("'''X'''"), "X").contentsEnd);
-    JUnitTestCase.assertEquals(3, new SimpleStringLiteral(TokenFactory.tokenFromString("r'X'"), "X").contentsEnd);
-    JUnitTestCase.assertEquals(3, new SimpleStringLiteral(TokenFactory.tokenFromString("r\"X\""), "X").contentsEnd);
-    JUnitTestCase.assertEquals(5, new SimpleStringLiteral(TokenFactory.tokenFromString("r\"\"\"X\"\"\""), "X").contentsEnd);
-    JUnitTestCase.assertEquals(5, new SimpleStringLiteral(TokenFactory.tokenFromString("r'''X'''"), "X").contentsEnd);
+    expect(new SimpleStringLiteral(TokenFactory.tokenFromString("'X'"), "X").contentsEnd, 2);
+    expect(new SimpleStringLiteral(TokenFactory.tokenFromString("\"X\""), "X").contentsEnd, 2);
+    expect(new SimpleStringLiteral(TokenFactory.tokenFromString("\"\"\"X\"\"\""), "X").contentsEnd, 4);
+    expect(new SimpleStringLiteral(TokenFactory.tokenFromString("'''X'''"), "X").contentsEnd, 4);
+    expect(new SimpleStringLiteral(TokenFactory.tokenFromString("r'X'"), "X").contentsEnd, 3);
+    expect(new SimpleStringLiteral(TokenFactory.tokenFromString("r\"X\""), "X").contentsEnd, 3);
+    expect(new SimpleStringLiteral(TokenFactory.tokenFromString("r\"\"\"X\"\"\""), "X").contentsEnd, 5);
+    expect(new SimpleStringLiteral(TokenFactory.tokenFromString("r'''X'''"), "X").contentsEnd, 5);
   }
 
   void test_isSingleQuoted() {
@@ -1091,25 +1106,25 @@
     {
       var token = TokenFactory.tokenFromString("'X'");
       var node = new SimpleStringLiteral(token, null);
-      JUnitTestCase.assertTrue(node.isSingleQuoted);
+      expect(node.isSingleQuoted, isTrue);
     }
     // '''
     {
       var token = TokenFactory.tokenFromString("'''X'''");
       var node = new SimpleStringLiteral(token, null);
-      JUnitTestCase.assertTrue(node.isSingleQuoted);
+      expect(node.isSingleQuoted, isTrue);
     }
     // "
     {
       var token = TokenFactory.tokenFromString('"X"');
       var node = new SimpleStringLiteral(token, null);
-      JUnitTestCase.assertFalse(node.isSingleQuoted);
+      expect(node.isSingleQuoted, isFalse);
     }
     // """
     {
       var token = TokenFactory.tokenFromString('"""X"""');
       var node = new SimpleStringLiteral(token, null);
-      JUnitTestCase.assertFalse(node.isSingleQuoted);
+      expect(node.isSingleQuoted, isFalse);
     }
   }
 
@@ -1118,57 +1133,57 @@
     {
       var token = TokenFactory.tokenFromString("r'X'");
       var node = new SimpleStringLiteral(token, null);
-      JUnitTestCase.assertTrue(node.isSingleQuoted);
+      expect(node.isSingleQuoted, isTrue);
     }
     // r'''
     {
       var token = TokenFactory.tokenFromString("r'''X'''");
       var node = new SimpleStringLiteral(token, null);
-      JUnitTestCase.assertTrue(node.isSingleQuoted);
+      expect(node.isSingleQuoted, isTrue);
     }
     // r"
     {
       var token = TokenFactory.tokenFromString('r"X"');
       var node = new SimpleStringLiteral(token, null);
-      JUnitTestCase.assertFalse(node.isSingleQuoted);
+      expect(node.isSingleQuoted, isFalse);
     }
     // r"""
     {
       var token = TokenFactory.tokenFromString('r"""X"""');
       var node = new SimpleStringLiteral(token, null);
-      JUnitTestCase.assertFalse(node.isSingleQuoted);
+      expect(node.isSingleQuoted, isFalse);
     }
   }
 
   void test_isMultiline() {
-    JUnitTestCase.assertFalse(new SimpleStringLiteral(TokenFactory.tokenFromString("'X'"), "X").isMultiline);
-    JUnitTestCase.assertFalse(new SimpleStringLiteral(TokenFactory.tokenFromString("r'X'"), "X").isMultiline);
-    JUnitTestCase.assertFalse(new SimpleStringLiteral(TokenFactory.tokenFromString("\"X\""), "X").isMultiline);
-    JUnitTestCase.assertFalse(new SimpleStringLiteral(TokenFactory.tokenFromString("r\"X\""), "X").isMultiline);
-    JUnitTestCase.assertTrue(new SimpleStringLiteral(TokenFactory.tokenFromString("'''X'''"), "X").isMultiline);
-    JUnitTestCase.assertTrue(new SimpleStringLiteral(TokenFactory.tokenFromString("r'''X'''"), "X").isMultiline);
-    JUnitTestCase.assertTrue(new SimpleStringLiteral(TokenFactory.tokenFromString("\"\"\"X\"\"\""), "X").isMultiline);
-    JUnitTestCase.assertTrue(new SimpleStringLiteral(TokenFactory.tokenFromString("r\"\"\"X\"\"\""), "X").isMultiline);
+    expect(new SimpleStringLiteral(TokenFactory.tokenFromString("'X'"), "X").isMultiline, isFalse);
+    expect(new SimpleStringLiteral(TokenFactory.tokenFromString("r'X'"), "X").isMultiline, isFalse);
+    expect(new SimpleStringLiteral(TokenFactory.tokenFromString("\"X\""), "X").isMultiline, isFalse);
+    expect(new SimpleStringLiteral(TokenFactory.tokenFromString("r\"X\""), "X").isMultiline, isFalse);
+    expect(new SimpleStringLiteral(TokenFactory.tokenFromString("'''X'''"), "X").isMultiline, isTrue);
+    expect(new SimpleStringLiteral(TokenFactory.tokenFromString("r'''X'''"), "X").isMultiline, isTrue);
+    expect(new SimpleStringLiteral(TokenFactory.tokenFromString("\"\"\"X\"\"\""), "X").isMultiline, isTrue);
+    expect(new SimpleStringLiteral(TokenFactory.tokenFromString("r\"\"\"X\"\"\""), "X").isMultiline, isTrue);
   }
 
   void test_isRaw() {
-    JUnitTestCase.assertFalse(new SimpleStringLiteral(TokenFactory.tokenFromString("'X'"), "X").isRaw);
-    JUnitTestCase.assertFalse(new SimpleStringLiteral(TokenFactory.tokenFromString("\"X\""), "X").isRaw);
-    JUnitTestCase.assertFalse(new SimpleStringLiteral(TokenFactory.tokenFromString("\"\"\"X\"\"\""), "X").isRaw);
-    JUnitTestCase.assertFalse(new SimpleStringLiteral(TokenFactory.tokenFromString("'''X'''"), "X").isRaw);
-    JUnitTestCase.assertTrue(new SimpleStringLiteral(TokenFactory.tokenFromString("r'X'"), "X").isRaw);
-    JUnitTestCase.assertTrue(new SimpleStringLiteral(TokenFactory.tokenFromString("r\"X\""), "X").isRaw);
-    JUnitTestCase.assertTrue(new SimpleStringLiteral(TokenFactory.tokenFromString("r\"\"\"X\"\"\""), "X").isRaw);
-    JUnitTestCase.assertTrue(new SimpleStringLiteral(TokenFactory.tokenFromString("r'''X'''"), "X").isRaw);
+    expect(new SimpleStringLiteral(TokenFactory.tokenFromString("'X'"), "X").isRaw, isFalse);
+    expect(new SimpleStringLiteral(TokenFactory.tokenFromString("\"X\""), "X").isRaw, isFalse);
+    expect(new SimpleStringLiteral(TokenFactory.tokenFromString("\"\"\"X\"\"\""), "X").isRaw, isFalse);
+    expect(new SimpleStringLiteral(TokenFactory.tokenFromString("'''X'''"), "X").isRaw, isFalse);
+    expect(new SimpleStringLiteral(TokenFactory.tokenFromString("r'X'"), "X").isRaw, isTrue);
+    expect(new SimpleStringLiteral(TokenFactory.tokenFromString("r\"X\""), "X").isRaw, isTrue);
+    expect(new SimpleStringLiteral(TokenFactory.tokenFromString("r\"\"\"X\"\"\""), "X").isRaw, isTrue);
+    expect(new SimpleStringLiteral(TokenFactory.tokenFromString("r'''X'''"), "X").isRaw, isTrue);
   }
 
   void test_simple() {
     Token token = TokenFactory.tokenFromString("'value'");
     SimpleStringLiteral stringLiteral = new SimpleStringLiteral(token, "value");
-    JUnitTestCase.assertSame(token, stringLiteral.literal);
-    JUnitTestCase.assertSame(token, stringLiteral.beginToken);
-    JUnitTestCase.assertSame(token, stringLiteral.endToken);
-    JUnitTestCase.assertEquals("value", stringLiteral.value);
+    expect(stringLiteral.literal, same(token));
+    expect(stringLiteral.beginToken, same(token));
+    expect(stringLiteral.endToken, same(token));
+    expect(stringLiteral.value, "value");
   }
 }
 
@@ -1181,8 +1196,8 @@
       var cToken = new StringToken(TokenType.STRING, "ccc'", 10);
       var cElement = new InterpolationString(cToken, 'ccc');
       StringInterpolation node = AstFactory.string([ae, ae, cElement]);
-      JUnitTestCase.assertEquals(1, node.contentsOffset);
-      JUnitTestCase.assertEquals(10 + 4 - 1, node.contentsEnd);
+      expect(node.contentsOffset, 1);
+      expect(node.contentsEnd, 10 + 4 - 1);
     }
     // '''a${bb}ccc'''
     {
@@ -1190,8 +1205,8 @@
       var cToken = new StringToken(TokenType.STRING, "ccc'''", 10);
       var cElement = new InterpolationString(cToken, 'ccc');
       StringInterpolation node = AstFactory.string([ae, ae, cElement]);
-      JUnitTestCase.assertEquals(3, node.contentsOffset);
-      JUnitTestCase.assertEquals(10 + 4 - 1, node.contentsEnd);
+      expect(node.contentsOffset, 3);
+      expect(node.contentsEnd, 10 + 4 - 1);
     }
     // """a${bb}ccc"""
     {
@@ -1199,8 +1214,8 @@
       var cToken = new StringToken(TokenType.STRING, 'ccc"""', 10);
       var cElement = new InterpolationString(cToken, 'ccc');
       StringInterpolation node = AstFactory.string([ae, ae, cElement]);
-      JUnitTestCase.assertEquals(3, node.contentsOffset);
-      JUnitTestCase.assertEquals(10 + 4 - 1, node.contentsEnd);
+      expect(node.contentsOffset, 3);
+      expect(node.contentsEnd, 10 + 4 - 1);
     }
     // r'a${bb}ccc'
     {
@@ -1208,8 +1223,8 @@
       var cToken = new StringToken(TokenType.STRING, "ccc'", 10);
       var cElement = new InterpolationString(cToken, 'ccc');
       StringInterpolation node = AstFactory.string([ae, ae, cElement]);
-      JUnitTestCase.assertEquals(2, node.contentsOffset);
-      JUnitTestCase.assertEquals(10 + 4 - 1, node.contentsEnd);
+      expect(node.contentsOffset, 2);
+      expect(node.contentsEnd, 10 + 4 - 1);
     }
     // r'''a${bb}ccc'''
     {
@@ -1217,8 +1232,8 @@
       var cToken = new StringToken(TokenType.STRING, "ccc'''", 10);
       var cElement = new InterpolationString(cToken, 'ccc');
       StringInterpolation node = AstFactory.string([ae, ae, cElement]);
-      JUnitTestCase.assertEquals(4, node.contentsOffset);
-      JUnitTestCase.assertEquals(10 + 4 - 1, node.contentsEnd);
+      expect(node.contentsOffset, 4);
+      expect(node.contentsEnd, 10 + 4 - 1);
     }
     // r"""a${bb}ccc"""
     {
@@ -1226,8 +1241,8 @@
       var cToken = new StringToken(TokenType.STRING, 'ccc"""', 10);
       var cElement = new InterpolationString(cToken, 'ccc');
       StringInterpolation node = AstFactory.string([ae, ae, cElement]);
-      JUnitTestCase.assertEquals(4, node.contentsOffset);
-      JUnitTestCase.assertEquals(10 + 4 - 1, node.contentsEnd);
+      expect(node.contentsOffset, 4);
+      expect(node.contentsEnd, 10 + 4 - 1);
     }
   }
 
@@ -1238,28 +1253,28 @@
       var a = AstFactory.interpolationString("'a", "a");
       var c = AstFactory.interpolationString("ccc'", "ccc");
       StringInterpolation node = AstFactory.string([a, b, c]);
-      JUnitTestCase.assertFalse(node.isMultiline);
+      expect(node.isMultiline, isFalse);
     }
     // '''
     {
       var a = AstFactory.interpolationString("'''a", "a");
       var c = AstFactory.interpolationString("ccc'''", "ccc");
       StringInterpolation node = AstFactory.string([a, b, c]);
-      JUnitTestCase.assertTrue(node.isMultiline);
+      expect(node.isMultiline, isTrue);
     }
     // "
     {
       var a = AstFactory.interpolationString('"a', "a");
       var c = AstFactory.interpolationString('ccc"', "ccc");
       StringInterpolation node = AstFactory.string([a, b, c]);
-      JUnitTestCase.assertFalse(node.isMultiline);
+      expect(node.isMultiline, isFalse);
     }
     // """
     {
       var a = AstFactory.interpolationString('"""a', "a");
       var c = AstFactory.interpolationString('ccc"""', "ccc");
       StringInterpolation node = AstFactory.string([a, b, c]);
-      JUnitTestCase.assertTrue(node.isMultiline);
+      expect(node.isMultiline, isTrue);
     }
   }
 
@@ -1270,34 +1285,34 @@
       var a = AstFactory.interpolationString('"a', "a");
       var c = AstFactory.interpolationString('ccc"', "ccc");
       StringInterpolation node = AstFactory.string([a, b, c]);
-      JUnitTestCase.assertFalse(node.isSingleQuoted);
+      expect(node.isSingleQuoted, isFalse);
     }
     // """
     {
       var a = AstFactory.interpolationString('"""a', "a");
       var c = AstFactory.interpolationString('ccc"""', "ccc");
       StringInterpolation node = AstFactory.string([a, b, c]);
-      JUnitTestCase.assertFalse(node.isSingleQuoted);
+      expect(node.isSingleQuoted, isFalse);
     }
     // '
     {
       var a = AstFactory.interpolationString("'a", "a");
       var c = AstFactory.interpolationString("ccc'", "ccc");
       StringInterpolation node = AstFactory.string([a, b, c]);
-      JUnitTestCase.assertTrue(node.isSingleQuoted);
+      expect(node.isSingleQuoted, isTrue);
     }
     // '''
     {
       var a = AstFactory.interpolationString("'''a", "a");
       var c = AstFactory.interpolationString("ccc'''", "ccc");
       StringInterpolation node = AstFactory.string([a, b, c]);
-      JUnitTestCase.assertTrue(node.isSingleQuoted);
+      expect(node.isSingleQuoted, isTrue);
     }
   }
 
   void test_isRaw() {
     StringInterpolation node = AstFactory.string([]);
-    JUnitTestCase.assertFalse(node.isRaw);
+    expect(node.isRaw, isFalse);
   }
 }
 
@@ -2543,7 +2558,7 @@
   void _assertSource(String expectedSource, AstNode node) {
     PrintStringWriter writer = new PrintStringWriter();
     node.accept(new ToSourceVisitor(writer));
-    JUnitTestCase.assertEquals(expectedSource, writer.toString());
+    expect(writer.toString(), expectedSource);
   }
 }
 
@@ -2552,17 +2567,17 @@
     VariableDeclaration varDecl = AstFactory.variableDeclaration("a");
     TopLevelVariableDeclaration decl = AstFactory.topLevelVariableDeclaration2(Keyword.VAR, [varDecl]);
     Comment comment = Comment.createDocumentationComment(new List<Token>(0));
-    JUnitTestCase.assertNull(varDecl.documentationComment);
+    expect(varDecl.documentationComment, isNull);
     decl.documentationComment = comment;
-    JUnitTestCase.assertNotNull(varDecl.documentationComment);
-    JUnitTestCase.assertNotNull(decl.documentationComment);
+    expect(varDecl.documentationComment, isNotNull);
+    expect(decl.documentationComment, isNotNull);
   }
 
   void test_getDocumentationComment_onNode() {
     VariableDeclaration decl = AstFactory.variableDeclaration("a");
     Comment comment = Comment.createDocumentationComment(new List<Token>(0));
     decl.documentationComment = comment;
-    JUnitTestCase.assertNotNull(decl.documentationComment);
+    expect(decl.documentationComment, isNotNull);
   }
 }
 
@@ -2588,7 +2603,7 @@
 }
 
 main() {
-  _ut.groupSep = ' | ';
+  groupSep = ' | ';
   runReflectiveTests(ConstantEvaluatorTest);
   runReflectiveTests(NodeLocatorTest);
   runReflectiveTests(ToSourceVisitorTest);
diff --git a/pkg/analyzer/test/generated/compile_time_error_code_test.dart b/pkg/analyzer/test/generated/compile_time_error_code_test.dart
index 444f03d..c72aea8 100644
--- a/pkg/analyzer/test/generated/compile_time_error_code_test.dart
+++ b/pkg/analyzer/test/generated/compile_time_error_code_test.dart
@@ -10,24 +10,24 @@
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:unittest/unittest.dart' as _ut;
 import 'resolver_test.dart';
-import 'test_support.dart';
 import '../reflective_tests.dart';
 
 
 class CompileTimeErrorCodeTest extends ResolverTestCase {
   void fail_compileTimeConstantRaisesException() {
-    Source source = addSource(EngineTestCase.createSource([]));
+    Source source = addSource(r'''
+''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.COMPILE_TIME_CONSTANT_RAISES_EXCEPTION]);
     verify([source]);
   }
 
   void fail_constEvalThrowsException() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class C {",
-        "  const C();",
-        "}",
-        "f() { return const C(); }"]));
+    Source source = addSource(r'''
+class C {
+  const C();
+}
+f() { return const C(); }''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.CONST_CONSTRUCTOR_THROWS_EXCEPTION]);
     verify([source]);
@@ -36,12 +36,12 @@
   void fail_invalidIdentifierInAsync_async() {
     // TODO(brianwilkerson) Report this error.
     resetWithAsync();
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  m() async {",
-        "    int async;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  m() async {
+    int async;
+  }
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INVALID_IDENTIFIER_IN_ASYNC]);
     verify([source]);
@@ -50,12 +50,12 @@
   void fail_invalidIdentifierInAsync_await() {
     // TODO(brianwilkerson) Report this error.
     resetWithAsync();
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  m() async {",
-        "    int await;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  m() async {
+    int await;
+  }
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INVALID_IDENTIFIER_IN_ASYNC]);
     verify([source]);
@@ -64,23 +64,23 @@
   void fail_invalidIdentifierInAsync_yield() {
     // TODO(brianwilkerson) Report this error.
     resetWithAsync();
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  m() async {",
-        "    int yield;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  m() async {
+    int yield;
+  }
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INVALID_IDENTIFIER_IN_ASYNC]);
     verify([source]);
   }
 
   void fail_mixinDeclaresConstructor() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  A() {}",
-        "}",
-        "class B extends Object mixin A {}"]));
+    Source source = addSource(r'''
+class A {
+  A() {}
+}
+class B extends Object mixin A {}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.MIXIN_DECLARES_CONSTRUCTOR]);
     verify([source]);
@@ -88,39 +88,45 @@
 
   void fail_mixinOfNonClass() {
     // TODO(brianwilkerson) Compare with MIXIN_WITH_NON_CLASS_SUPERCLASS.
-    Source source = addSource(EngineTestCase.createSource(["var A;", "class B extends Object mixin A {}"]));
+    Source source = addSource(r'''
+var A;
+class B extends Object mixin A {}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_NON_CLASS]);
     verify([source]);
   }
 
   void fail_objectCannotExtendAnotherClass() {
-    Source source = addSource(EngineTestCase.createSource([]));
+    Source source = addSource(r'''
+''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.OBJECT_CANNOT_EXTEND_ANOTHER_CLASS]);
     verify([source]);
   }
 
   void fail_recursiveCompileTimeConstant() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  const A();",
-        "  final m = const A();",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  const A();
+  final m = const A();
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.RECURSIVE_COMPILE_TIME_CONSTANT]);
     verify([source]);
   }
 
   void fail_recursiveCompileTimeConstant_cycle() {
-    Source source = addSource(EngineTestCase.createSource(["const x = y + 1;", "const y = x + 1;"]));
+    Source source = addSource(r'''
+const x = y + 1;
+const y = x + 1;''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.RECURSIVE_COMPILE_TIME_CONSTANT]);
     verify([source]);
   }
 
   void fail_superInitializerInObject() {
-    Source source = addSource(EngineTestCase.createSource([]));
+    Source source = addSource(r'''
+''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.SUPER_INITIALIZER_IN_OBJECT]);
     verify([source]);
@@ -129,7 +135,10 @@
   void fail_yieldEachInNonGenerator_async() {
     // TODO(brianwilkerson) We are currently parsing the yield statement as a binary expression.
     resetWithAsync();
-    Source source = addSource(EngineTestCase.createSource(["f() async {", "  yield* 0;", "}"]));
+    Source source = addSource(r'''
+f() async {
+  yield* 0;
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.YIELD_EACH_IN_NON_GENERATOR]);
     verify([source]);
@@ -138,7 +147,10 @@
   void fail_yieldEachInNonGenerator_sync() {
     // TODO(brianwilkerson) We are currently parsing the yield statement as a binary expression.
     resetWithAsync();
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  yield* 0;", "}"]));
+    Source source = addSource(r'''
+f() {
+  yield* 0;
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.YIELD_IN_NON_GENERATOR]);
     verify([source]);
@@ -147,7 +159,10 @@
   void fail_yieldInNonGenerator_async() {
     // TODO(brianwilkerson) We are currently trying to parse the yield statement as a binary expression.
     resetWithAsync();
-    Source source = addSource(EngineTestCase.createSource(["f() async {", "  yield 0;", "}"]));
+    Source source = addSource(r'''
+f() async {
+  yield 0;
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.YIELD_IN_NON_GENERATOR]);
     verify([source]);
@@ -156,7 +171,10 @@
   void fail_yieldInNonGenerator_sync() {
     // TODO(brianwilkerson) We are currently trying to parse the yield statement as a binary expression.
     resetWithAsync();
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  yield 0;", "}"]));
+    Source source = addSource(r'''
+f() {
+  yield 0;
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.YIELD_EACH_IN_NON_GENERATOR]);
     verify([source]);
@@ -166,30 +184,38 @@
     AnalysisOptionsImpl analysisOptions = new AnalysisOptionsImpl();
     analysisOptions.enableEnum = true;
     resetWithOptions(analysisOptions);
-    Source source = addSource(EngineTestCase.createSource([
-        "enum E { ONE }",
-        "String name(E e) {",
-        "  return e._name;",
-        "}"]));
+    Source source = addSource(r'''
+enum E { ONE }
+String name(E e) {
+  return e._name;
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.ACCESS_PRIVATE_ENUM_FIELD]);
     // Cannot verify because "_name" cannot be resolved.
   }
 
   void test_ambiguousExport() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library L;",
-        "export 'lib1.dart';",
-        "export 'lib2.dart';"]));
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class N {}"]));
-    addNamedSource("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class N {}"]));
+    Source source = addSource(r'''
+library L;
+export 'lib1.dart';
+export 'lib2.dart';''');
+    addNamedSource("/lib1.dart", r'''
+library lib1;
+class N {}''');
+    addNamedSource("/lib2.dart", r'''
+library lib2;
+class N {}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.AMBIGUOUS_EXPORT]);
     verify([source]);
   }
 
   void test_asyncForInWrongContext() {
-    Source source = addSource(EngineTestCase.createSource(["f(list) {", "  await for (var e in list) {", "  }", "}"]));
+    Source source = addSource(r'''
+f(list) {
+  await for (var e in list) {
+  }
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.ASYNC_FOR_IN_WRONG_CONTEXT]);
     verify([source]);
@@ -197,7 +223,10 @@
 
   void test_awaitInWrongContext_sync() {
     resetWithAsync();
-    Source source = addSource(EngineTestCase.createSource(["f(x) {", "  return await x;", "}"]));
+    Source source = addSource(r'''
+f(x) {
+  return await x;
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.AWAIT_IN_WRONG_CONTEXT]);
     verify([source]);
@@ -205,186 +234,226 @@
 
   void test_awaitInWrongContext_syncStar() {
     resetWithAsync();
-    Source source = addSource(EngineTestCase.createSource(["f(x) sync* {", "  yield await x;", "}"]));
+    Source source = addSource(r'''
+f(x) sync* {
+  yield await x;
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.AWAIT_IN_WRONG_CONTEXT]);
     verify([source]);
   }
 
   void test_builtInIdentifierAsMixinName_classTypeAlias() {
-    Source source = addSource(EngineTestCase.createSource(["class A {}", "class B {}", "class as = A with B;"]));
+    Source source = addSource(r'''
+class A {}
+class B {}
+class as = A with B;''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME]);
     verify([source]);
   }
 
   void test_builtInIdentifierAsType_formalParameter_field() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  var x;", "  A(static this.x);", "}"]));
+    Source source = addSource(r'''
+class A {
+  var x;
+  A(static this.x);
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE]);
     verify([source]);
   }
 
   void test_builtInIdentifierAsType_formalParameter_simple() {
-    Source source = addSource(EngineTestCase.createSource(["f(static x) {", "}"]));
+    Source source = addSource(r'''
+f(static x) {
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE]);
     verify([source]);
   }
 
   void test_builtInIdentifierAsType_variableDeclaration() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  typedef x;", "}"]));
+    Source source = addSource(r'''
+f() {
+  typedef x;
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE]);
     verify([source]);
   }
 
   void test_builtInIdentifierAsTypedefName_functionTypeAlias() {
-    Source source = addSource(EngineTestCase.createSource(["typedef bool as();"]));
+    Source source = addSource("typedef bool as();");
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME]);
     verify([source]);
   }
 
   void test_builtInIdentifierAsTypeName() {
-    Source source = addSource(EngineTestCase.createSource(["class as {}"]));
+    Source source = addSource("class as {}");
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE_NAME]);
     verify([source]);
   }
 
   void test_builtInIdentifierAsTypeParameterName() {
-    Source source = addSource(EngineTestCase.createSource(["class A<as> {}"]));
+    Source source = addSource("class A<as> {}");
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE_PARAMETER_NAME]);
     verify([source]);
   }
 
   void test_caseExpressionTypeImplementsEquals() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class IntWrapper {",
-        "  final int value;",
-        "  const IntWrapper(this.value);",
-        "  bool operator ==(IntWrapper x) {",
-        "    return value == x.value;",
-        "  }",
-        "  get hashCode => value;",
-        "}",
-        "",
-        "f(var a) {",
-        "  switch(a) {",
-        "    case(const IntWrapper(1)) : return 1;",
-        "    default: return 0;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class IntWrapper {
+  final int value;
+  const IntWrapper(this.value);
+  bool operator ==(IntWrapper x) {
+    return value == x.value;
+  }
+  get hashCode => value;
+}
+
+f(var a) {
+  switch(a) {
+    case(const IntWrapper(1)) : return 1;
+    default: return 0;
+  }
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS]);
     verify([source]);
   }
 
   void test_conflictingConstructorNameAndMember_field() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  int x;", "  A.x() {}", "}"]));
+    Source source = addSource(r'''
+class A {
+  int x;
+  A.x() {}
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD]);
     verify([source]);
   }
 
   void test_conflictingConstructorNameAndMember_method() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  const A.x();", "  void x() {}", "}"]));
+    Source source = addSource(r'''
+class A {
+  const A.x();
+  void x() {}
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD]);
     verify([source]);
   }
 
   void test_conflictingGetterAndMethod_field_method() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  final int m = 0;",
-        "}",
-        "class B extends A {",
-        "  m() {}",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  final int m = 0;
+}
+class B extends A {
+  m() {}
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.CONFLICTING_GETTER_AND_METHOD]);
     verify([source]);
   }
 
   void test_conflictingGetterAndMethod_getter_method() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  get m => 0;",
-        "}",
-        "class B extends A {",
-        "  m() {}",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  get m => 0;
+}
+class B extends A {
+  m() {}
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.CONFLICTING_GETTER_AND_METHOD]);
     verify([source]);
   }
 
   void test_conflictingGetterAndMethod_method_field() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  m() {}",
-        "}",
-        "class B extends A {",
-        "  int m;",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  m() {}
+}
+class B extends A {
+  int m;
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.CONFLICTING_METHOD_AND_GETTER]);
     verify([source]);
   }
 
   void test_conflictingGetterAndMethod_method_getter() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  m() {}",
-        "}",
-        "class B extends A {",
-        "  get m => 0;",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  m() {}
+}
+class B extends A {
+  get m => 0;
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.CONFLICTING_METHOD_AND_GETTER]);
     verify([source]);
   }
 
   void test_conflictingTypeVariableAndClass() {
-    Source source = addSource(EngineTestCase.createSource(["class T<T> {", "}"]));
+    Source source = addSource(r'''
+class T<T> {
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_CLASS]);
     verify([source]);
   }
 
   void test_conflictingTypeVariableAndMember_field() {
-    Source source = addSource(EngineTestCase.createSource(["class A<T> {", "  var T;", "}"]));
+    Source source = addSource(r'''
+class A<T> {
+  var T;
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER]);
     verify([source]);
   }
 
   void test_conflictingTypeVariableAndMember_getter() {
-    Source source = addSource(EngineTestCase.createSource(["class A<T> {", "  get T => null;", "}"]));
+    Source source = addSource(r'''
+class A<T> {
+  get T => null;
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER]);
     verify([source]);
   }
 
   void test_conflictingTypeVariableAndMember_method() {
-    Source source = addSource(EngineTestCase.createSource(["class A<T> {", "  T() {}", "}"]));
+    Source source = addSource(r'''
+class A<T> {
+  T() {}
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER]);
     verify([source]);
   }
 
   void test_conflictingTypeVariableAndMember_method_static() {
-    Source source = addSource(EngineTestCase.createSource(["class A<T> {", "  static T() {}", "}"]));
+    Source source = addSource(r'''
+class A<T> {
+  static T() {}
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER]);
     verify([source]);
   }
 
   void test_conflictingTypeVariableAndMember_setter() {
-    Source source = addSource(EngineTestCase.createSource(["class A<T> {", "  set T(x) {}", "}"]));
+    Source source = addSource(r'''
+class A<T> {
+  set T(x) {}
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER]);
     verify([source]);
@@ -393,102 +462,102 @@
   void test_consistentCaseExpressionTypes_dynamic() {
     // Even though A.S and S have a static type of "dynamic", we should see
     // that they match 'abc', because they are constant strings.
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  static const S = 'A.S';",
-        "}",
-        "",
-        "const S = 'S';",
-        "",
-        "foo(var p) {",
-        "  switch (p) {",
-        "    case S:",
-        "      break;",
-        "    case A.S:",
-        "      break;",
-        "    case 'abc':",
-        "      break;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  static const S = 'A.S';
+}
+
+const S = 'S';
+
+foo(var p) {
+  switch (p) {
+    case S:
+      break;
+    case A.S:
+      break;
+    case 'abc':
+      break;
+  }
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_constConstructorWithFieldInitializedByNonConst() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  final int i = f();",
-        "  const A();",
-        "}",
-        "int f() {",
-        "  return 3;",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  final int i = f();
+  const A();
+}
+int f() {
+  return 3;
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_FIELD_INITIALIZED_BY_NON_CONST]);
     verify([source]);
   }
 
   void test_constConstructorWithFieldInitializedByNonConst_static() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  static final int i = f();",
-        "  const A();",
-        "}",
-        "int f() {",
-        "  return 3;",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  static final int i = f();
+  const A();
+}
+int f() {
+  return 3;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_constConstructorWithMixin() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class M {",
-        "}",
-        "class A extends Object with M {",
-        "  const A();",
-        "}"]));
+    Source source = addSource(r'''
+class M {
+}
+class A extends Object with M {
+  const A();
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_MIXIN]);
     verify([source]);
   }
 
   void test_constConstructorWithNonConstSuper_explicit() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  A();",
-        "}",
-        "class B extends A {",
-        "  const B(): super();",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  A();
+}
+class B extends A {
+  const B(): super();
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER]);
     verify([source]);
   }
 
   void test_constConstructorWithNonConstSuper_implicit() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  A();",
-        "}",
-        "class B extends A {",
-        "  const B();",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  A();
+}
+class B extends A {
+  const B();
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER]);
     verify([source]);
   }
 
   void test_constConstructorWithNonFinalField_mixin() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  var a;",
-        "}",
-        "class B extends Object with A {",
-        "  const B();",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  var a;
+}
+class B extends Object with A {
+  const B();
+}''');
     resolve(source);
     assertErrors(source, [
         CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_MIXIN,
@@ -497,13 +566,13 @@
   }
 
   void test_constConstructorWithNonFinalField_super() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  var a;",
-        "}",
-        "class B extends A {",
-        "  const B();",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  var a;
+}
+class B extends A {
+  const B();
+}''');
     resolve(source);
     assertErrors(source, [
         CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD,
@@ -512,7 +581,11 @@
   }
 
   void test_constConstructorWithNonFinalField_this() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  int x;", "  const A();", "}"]));
+    Source source = addSource(r'''
+class A {
+  int x;
+  const A();
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD]);
     verify([source]);
@@ -520,28 +593,40 @@
 
   void test_constDeferredClass() {
     resolveWithAndWithoutExperimental(<String> [
-        EngineTestCase.createSource(["library lib1;", "class A {", "  const A();", "}"]),
-        EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "main() {",
-        "  const a.A();",
-        "}"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.CONST_DEFERRED_CLASS]);
+        r'''
+library lib1;
+class A {
+  const A();
+}''',
+        r'''
+library root;
+import 'lib1.dart' deferred as a;
+main() {
+  const a.A();
+}'''], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.CONST_DEFERRED_CLASS]);
   }
 
   void test_constDeferredClass_namedConstructor() {
     resolveWithAndWithoutExperimental(<String> [
-        EngineTestCase.createSource(["library lib1;", "class A {", "  const A.b();", "}"]),
-        EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "main() {",
-        "  const a.A.b();",
-        "}"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.CONST_DEFERRED_CLASS]);
+        r'''
+library lib1;
+class A {
+  const A.b();
+}''',
+        r'''
+library root;
+import 'lib1.dart' deferred as a;
+main() {
+  const a.A.b();
+}'''], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.CONST_DEFERRED_CLASS]);
   }
 
   void test_constEval_newInstance_constConstructor() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  const A();", "}", "const a = new A();"]));
+    Source source = addSource(r'''
+class A {
+  const A();
+}
+const a = new A();''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE]);
     verify([source]);
@@ -550,24 +635,24 @@
   void test_constEval_newInstance_externalFactoryConstConstructor() {
     // We can't evaluate "const A()" because its constructor is external.  But
     // the code is correct--we shouldn't report an error.
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  external factory const A();",
-        "}",
-        "const x = const A();"]));
+    Source source = addSource(r'''
+class A {
+  external factory const A();
+}
+const x = const A();''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_constEval_propertyExtraction_targetNotConst() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  const A();",
-        "  m() {}",
-        "}",
-        "final a = const A();",
-        "const C = a.m;"]));
+    Source source = addSource(r'''
+class A {
+  const A();
+  m() {}
+}
+final a = const A();
+const C = a.m;''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE]);
     verify([source]);
@@ -627,28 +712,28 @@
   }
 
   void test_constEvalTypeBoolNumString_equal() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  const A();",
-        "}",
-        "class B {",
-        "  final a;",
-        "  const B(num p) : a = p == const A();",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  const A();
+}
+class B {
+  final a;
+  const B(num p) : a = p == const A();
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_NUM_STRING]);
     verify([source]);
   }
 
   void test_constEvalTypeBoolNumString_notEqual() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  const A();",
-        "}",
-        "class B {",
-        "  final a;",
-        "  const B(String p) : a = p != const A();",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  const A();
+}
+class B {
+  final a;
+  const B(String p) : a = p != const A();
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_NUM_STRING]);
     verify([source]);
@@ -676,21 +761,28 @@
   }
 
   void test_constFormalParameter_fieldFormalParameter() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  var x;", "  A(const this.x) {}", "}"]));
+    Source source = addSource(r'''
+class A {
+  var x;
+  A(const this.x) {}
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.CONST_FORMAL_PARAMETER]);
     verify([source]);
   }
 
   void test_constFormalParameter_simpleFormalParameter() {
-    Source source = addSource(EngineTestCase.createSource(["f(const x) {}"]));
+    Source source = addSource("f(const x) {}");
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.CONST_FORMAL_PARAMETER]);
     verify([source]);
   }
 
   void test_constInitializedWithNonConstValue() {
-    Source source = addSource(EngineTestCase.createSource(["f(p) {", "  const C = p;", "}"]));
+    Source source = addSource(r'''
+f(p) {
+  const C = p;
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE]);
     verify([source]);
@@ -712,38 +804,45 @@
 
   void test_constInitializedWithNonConstValueFromDeferredClass() {
     resolveWithAndWithoutExperimental(<String> [
-        EngineTestCase.createSource(["library lib1;", "const V = 1;"]),
-        EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "const B = a.V;"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE_FROM_DEFERRED_LIBRARY]);
+        r'''
+library lib1;
+const V = 1;''',
+        r'''
+library root;
+import 'lib1.dart' deferred as a;
+const B = a.V;'''], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE_FROM_DEFERRED_LIBRARY]);
   }
 
   void test_constInitializedWithNonConstValueFromDeferredClass_nested() {
     resolveWithAndWithoutExperimental(<String> [
-        EngineTestCase.createSource(["library lib1;", "const V = 1;"]),
-        EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "const B = a.V + 1;"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE_FROM_DEFERRED_LIBRARY]);
+        r'''
+library lib1;
+const V = 1;''',
+        r'''
+library root;
+import 'lib1.dart' deferred as a;
+const B = a.V + 1;'''], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE_FROM_DEFERRED_LIBRARY]);
   }
 
   void test_constInstanceField() {
-    Source source = addSource(EngineTestCase.createSource(["class C {", "  const int f = 0;", "}"]));
+    Source source = addSource(r'''
+class C {
+  const int f = 0;
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.CONST_INSTANCE_FIELD]);
     verify([source]);
   }
 
   void test_constMapKeyTypeImplementsEquals_direct() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  const A();",
-        "  operator ==(other) => false;",
-        "}",
-        "main() {",
-        "  const {const A() : 0};",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  const A();
+  operator ==(other) => false;
+}
+main() {
+  const {const A() : 0};
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS]);
     verify([source]);
@@ -753,134 +852,138 @@
     // Note: static type of B.a is "dynamic", but actual type of the const
     // object is A.  We need to make sure we examine the actual type when
     // deciding whether there is a problem with operator==.
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  const A();",
-        "  operator ==(other) => false;",
-        "}",
-        "class B {",
-        "  static const a = const A();",
-        "}",
-        "main() {",
-        "  const {B.a : 0};",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  const A();
+  operator ==(other) => false;
+}
+class B {
+  static const a = const A();
+}
+main() {
+  const {B.a : 0};
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS]);
     verify([source]);
   }
 
   void test_constMapKeyTypeImplementsEquals_factory() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A { const factory A() = B; }",
-        "",
-        "class B implements A {",
-        "  const B();",
-        "",
-        "  operator ==(o) => true;",
-        "}",
-        "",
-        "main() {",
-        "  var m = const { const A(): 42 };",
-        "}"]));
+    Source source = addSource(r'''
+class A { const factory A() = B; }
+
+class B implements A {
+  const B();
+
+  operator ==(o) => true;
+}
+
+main() {
+  var m = const { const A(): 42 };
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS]);
     verify([source]);
   }
 
   void test_constMapKeyTypeImplementsEquals_super() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  const A();",
-        "  operator ==(other) => false;",
-        "}",
-        "class B extends A {",
-        "  const B();",
-        "}",
-        "main() {",
-        "  const {const B() : 0};",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  const A();
+  operator ==(other) => false;
+}
+class B extends A {
+  const B();
+}
+main() {
+  const {const B() : 0};
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS]);
     verify([source]);
   }
 
   void test_constWithInvalidTypeParameters() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  const A();",
-        "}",
-        "f() { return const A<A>(); }"]));
+    Source source = addSource(r'''
+class A {
+  const A();
+}
+f() { return const A<A>(); }''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.CONST_WITH_INVALID_TYPE_PARAMETERS]);
     verify([source]);
   }
 
   void test_constWithInvalidTypeParameters_tooFew() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class C<K, V> {",
-        "  const C();",
-        "}",
-        "f(p) {",
-        "  return const C<A>();",
-        "}"]));
+    Source source = addSource(r'''
+class A {}
+class C<K, V> {
+  const C();
+}
+f(p) {
+  return const C<A>();
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.CONST_WITH_INVALID_TYPE_PARAMETERS]);
     verify([source]);
   }
 
   void test_constWithInvalidTypeParameters_tooMany() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class C<E> {",
-        "  const C();",
-        "}",
-        "f(p) {",
-        "  return const C<A, A>();",
-        "}"]));
+    Source source = addSource(r'''
+class A {}
+class C<E> {
+  const C();
+}
+f(p) {
+  return const C<A, A>();
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.CONST_WITH_INVALID_TYPE_PARAMETERS]);
     verify([source]);
   }
 
   void test_constWithNonConst() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class T {",
-        "  T(a, b, {c, d}) {}",
-        "}",
-        "f() { return const T(0, 1, c: 2, d: 3); }"]));
+    Source source = addSource(r'''
+class T {
+  T(a, b, {c, d}) {}
+}
+f() { return const T(0, 1, c: 2, d: 3); }''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.CONST_WITH_NON_CONST]);
     verify([source]);
   }
 
   void test_constWithNonConstantArgument_annotation() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  const A(int p);",
-        "}",
-        "var v = 42;",
-        "@A(v)",
-        "main() {",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  const A(int p);
+}
+var v = 42;
+@A(v)
+main() {
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.CONST_WITH_NON_CONSTANT_ARGUMENT]);
     verify([source]);
   }
 
   void test_constWithNonConstantArgument_instanceCreation() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  const A(a);",
-        "}",
-        "f(p) { return const A(p); }"]));
+    Source source = addSource(r'''
+class A {
+  const A(a);
+}
+f(p) { return const A(p); }''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.CONST_WITH_NON_CONSTANT_ARGUMENT]);
     verify([source]);
   }
 
   void test_constWithNonType() {
-    Source source = addSource(EngineTestCase.createSource(["int A;", "f() {", "  return const A();", "}"]));
+    Source source = addSource(r'''
+int A;
+f() {
+  return const A();
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.CONST_WITH_NON_TYPE]);
     verify([source]);
@@ -888,11 +991,11 @@
 
   void test_constWithNonType_fromLibrary() {
     Source source1 = addNamedSource("lib.dart", "");
-    Source source2 = addNamedSource("lib2.dart", EngineTestCase.createSource([
-        "import 'lib.dart' as lib;",
-        "void f() {",
-        "  const lib.A();",
-        "}"]));
+    Source source2 = addNamedSource("lib2.dart", r'''
+import 'lib.dart' as lib;
+void f() {
+  const lib.A();
+}''');
     resolve(source1);
     resolve(source2);
     assertErrors(source2, [CompileTimeErrorCode.CONST_WITH_NON_TYPE]);
@@ -900,11 +1003,11 @@
   }
 
   void test_constWithTypeParameters_direct() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A<T> {",
-        "  static const V = const A<T>();",
-        "  const A();",
-        "}"]));
+    Source source = addSource(r'''
+class A<T> {
+  static const V = const A<T>();
+  const A();
+}''');
     resolve(source);
     assertErrors(source, [
         CompileTimeErrorCode.CONST_WITH_TYPE_PARAMETERS,
@@ -913,11 +1016,11 @@
   }
 
   void test_constWithTypeParameters_indirect() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A<T> {",
-        "  static const V = const A<List<T>>();",
-        "  const A();",
-        "}"]));
+    Source source = addSource(r'''
+class A<T> {
+  static const V = const A<List<T>>();
+  const A();
+}''');
     resolve(source);
     assertErrors(source, [
         CompileTimeErrorCode.CONST_WITH_TYPE_PARAMETERS,
@@ -926,68 +1029,72 @@
   }
 
   void test_constWithUndefinedConstructor() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  const A();",
-        "}",
-        "f() {",
-        "  return const A.noSuchConstructor();",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  const A();
+}
+f() {
+  return const A.noSuchConstructor();
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR]);
     // no verify(), 'noSuchConstructor' is not resolved
   }
 
   void test_constWithUndefinedConstructorDefault() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  const A.name();",
-        "}",
-        "f() {",
-        "  return const A();",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  const A.name();
+}
+f() {
+  return const A();
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT]);
     verify([source]);
   }
 
   void test_defaultValueInFunctionTypeAlias() {
-    Source source = addSource(EngineTestCase.createSource(["typedef F([x = 0]);"]));
+    Source source = addSource("typedef F([x = 0]);");
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS]);
     verify([source]);
   }
 
   void test_defaultValueInFunctionTypedParameter_named() {
-    Source source = addSource(EngineTestCase.createSource(["f(g({p: null})) {}"]));
+    Source source = addSource("f(g({p: null})) {}");
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER]);
     verify([source]);
   }
 
   void test_defaultValueInFunctionTypedParameter_optional() {
-    Source source = addSource(EngineTestCase.createSource(["f(g([p = null])) {}"]));
+    Source source = addSource("f(g([p = null])) {}");
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER]);
     verify([source]);
   }
 
   void test_defaultValueInRedirectingFactoryConstructor() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  factory A([int x = 0]) = B;",
-        "}",
-        "",
-        "class B implements A {",
-        "  B([int x = 1]) {}",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  factory A([int x = 0]) = B;
+}
+
+class B implements A {
+  B([int x = 1]) {}
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.DEFAULT_VALUE_IN_REDIRECTING_FACTORY_CONSTRUCTOR]);
     verify([source]);
   }
 
   void test_duplicateConstructorName_named() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  A.a() {}", "  A.a() {}", "}"]));
+    Source source = addSource(r'''
+class A {
+  A.a() {}
+  A.a() {}
+}''');
     resolve(source);
     assertErrors(source, [
         CompileTimeErrorCode.DUPLICATE_CONSTRUCTOR_NAME,
@@ -996,7 +1103,11 @@
   }
 
   void test_duplicateConstructorName_unnamed() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  A() {}", "  A() {}", "}"]));
+    Source source = addSource(r'''
+class A {
+  A() {}
+  A() {}
+}''');
     resolve(source);
     assertErrors(source, [
         CompileTimeErrorCode.DUPLICATE_CONSTRUCTOR_DEFAULT,
@@ -1005,164 +1116,202 @@
   }
 
   void test_duplicateDefinition() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  int m = 0;", "  m(a) {}", "}"]));
+    Source source = addSource(r'''
+f() {
+  int m = 0;
+  m(a) {}
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.DUPLICATE_DEFINITION]);
     verify([source]);
   }
 
   void test_duplicateDefinition_acrossLibraries() {
-    Source librarySource = addNamedSource("/lib.dart", EngineTestCase.createSource(["library lib;", "", "part 'a.dart';", "part 'b.dart';"]));
-    Source sourceA = addNamedSource("/a.dart", EngineTestCase.createSource(["part of lib;", "", "class A {}"]));
-    Source sourceB = addNamedSource("/b.dart", EngineTestCase.createSource(["part of lib;", "", "class A {}"]));
+    Source librarySource = addNamedSource("/lib.dart", r'''
+library lib;
+
+part 'a.dart';
+part 'b.dart';''');
+    Source sourceA = addNamedSource("/a.dart", r'''
+part of lib;
+
+class A {}''');
+    Source sourceB = addNamedSource("/b.dart", r'''
+part of lib;
+
+class A {}''');
     resolve(librarySource);
     assertErrors(sourceB, [CompileTimeErrorCode.DUPLICATE_DEFINITION]);
     verify([librarySource, sourceA, sourceB]);
   }
 
   void test_duplicateDefinition_classMembers_fields() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  int a;", "  int a;", "}"]));
+    Source source = addSource(r'''
+class A {
+  int a;
+  int a;
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.DUPLICATE_DEFINITION]);
     verify([source]);
   }
 
   void test_duplicateDefinition_classMembers_fields_oneStatic() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  int x;", "  static int x;", "}"]));
+    Source source = addSource(r'''
+class A {
+  int x;
+  static int x;
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.DUPLICATE_DEFINITION]);
     verify([source]);
   }
 
   void test_duplicateDefinition_classMembers_methods() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  m() {}", "  m() {}", "}"]));
+    Source source = addSource(r'''
+class A {
+  m() {}
+  m() {}
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.DUPLICATE_DEFINITION]);
     verify([source]);
   }
 
   void test_duplicateDefinition_localFields() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  m() {",
-        "    int a;",
-        "    int a;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  m() {
+    int a;
+    int a;
+  }
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.DUPLICATE_DEFINITION]);
     verify([source]);
   }
 
   void test_duplicateDefinition_parameterWithFunctionName_local() {
-    Source source = addSource(EngineTestCase.createSource(["main() {", "  f(f) {}", "}"]));
+    Source source = addSource(r'''
+main() {
+  f(f) {}
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.DUPLICATE_DEFINITION]);
     verify([source]);
   }
 
   void test_duplicateDefinition_parameterWithFunctionName_topLevel() {
-    Source source = addSource(EngineTestCase.createSource(["main() {", "  f(f) {}", "}"]));
+    Source source = addSource(r'''
+main() {
+  f(f) {}
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.DUPLICATE_DEFINITION]);
     verify([source]);
   }
 
   void test_duplicateDefinitionInheritance_instanceGetter_staticGetter() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  int get x => 0;",
-        "}",
-        "class B extends A {",
-        "  static int get x => 0;",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  int get x => 0;
+}
+class B extends A {
+  static int get x => 0;
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.DUPLICATE_DEFINITION_INHERITANCE]);
     verify([source]);
   }
 
   void test_duplicateDefinitionInheritance_instanceGetterAbstract_staticGetter() {
-    Source source = addSource(EngineTestCase.createSource([
-        "abstract class A {",
-        "  int get x;",
-        "}",
-        "class B extends A {",
-        "  static int get x => 0;",
-        "}"]));
+    Source source = addSource(r'''
+abstract class A {
+  int get x;
+}
+class B extends A {
+  static int get x => 0;
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.DUPLICATE_DEFINITION_INHERITANCE]);
     verify([source]);
   }
 
   void test_duplicateDefinitionInheritance_instanceMethod_staticMethod() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  x() {}",
-        "}",
-        "class B extends A {",
-        "  static x() {}",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  x() {}
+}
+class B extends A {
+  static x() {}
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.DUPLICATE_DEFINITION_INHERITANCE]);
     verify([source]);
   }
 
   void test_duplicateDefinitionInheritance_instanceMethodAbstract_staticMethod() {
-    Source source = addSource(EngineTestCase.createSource([
-        "abstract class A {",
-        "  x();",
-        "}",
-        "abstract class B extends A {",
-        "  static x() {}",
-        "}"]));
+    Source source = addSource(r'''
+abstract class A {
+  x();
+}
+abstract class B extends A {
+  static x() {}
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.DUPLICATE_DEFINITION_INHERITANCE]);
     verify([source]);
   }
 
   void test_duplicateDefinitionInheritance_instanceSetter_staticSetter() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  set x(value) {}",
-        "}",
-        "class B extends A {",
-        "  static set x(value) {}",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  set x(value) {}
+}
+class B extends A {
+  static set x(value) {}
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.DUPLICATE_DEFINITION_INHERITANCE]);
     verify([source]);
   }
 
   void test_duplicateDefinitionInheritance_instanceSetterAbstract_staticSetter() {
-    Source source = addSource(EngineTestCase.createSource([
-        "abstract class A {",
-        "  set x(value);",
-        "}",
-        "class B extends A {",
-        "  static set x(value) {}",
-        "}"]));
+    Source source = addSource(r'''
+abstract class A {
+  set x(value);
+}
+class B extends A {
+  static set x(value) {}
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.DUPLICATE_DEFINITION_INHERITANCE]);
     verify([source]);
   }
 
   void test_duplicateNamedArgument() {
-    Source source = addSource(EngineTestCase.createSource(["f({a, b}) {}", "main() {", "  f(a: 1, a: 2);", "}"]));
+    Source source = addSource(r'''
+f({a, b}) {}
+main() {
+  f(a: 1, a: 2);
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.DUPLICATE_NAMED_ARGUMENT]);
     verify([source]);
   }
 
   void test_exportInternalLibrary() {
-    Source source = addSource(EngineTestCase.createSource(["export 'dart:_interceptors';"]));
+    Source source = addSource("export 'dart:_interceptors';");
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.EXPORT_INTERNAL_LIBRARY]);
     verify([source]);
   }
 
   void test_exportOfNonLibrary() {
-    Source source = addSource(EngineTestCase.createSource(["library L;", "export 'lib1.dart';"]));
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["part of lib;"]));
+    Source source = addSource(r'''
+library L;
+export 'lib1.dart';''');
+    addNamedSource("/lib1.dart", "part of lib;");
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.EXPORT_OF_NON_LIBRARY]);
     verify([source]);
@@ -1170,25 +1319,29 @@
 
   void test_extendsDeferredClass() {
     resolveWithAndWithoutExperimental(<String> [
-        EngineTestCase.createSource(["library lib1;", "class A {}"]),
-        EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "class B extends a.A {}"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.EXTENDS_DEFERRED_CLASS]);
+        r'''
+library lib1;
+class A {}''',
+        r'''
+library root;
+import 'lib1.dart' deferred as a;
+class B extends a.A {}'''], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.EXTENDS_DEFERRED_CLASS]);
   }
 
   void test_extendsDeferredClass_classTypeAlias() {
     resolveWithAndWithoutExperimental(<String> [
-        EngineTestCase.createSource(["library lib1;", "class A {}"]),
-        EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "class M {}",
-        "class C = a.A with M;"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.EXTENDS_DEFERRED_CLASS]);
+        r'''
+library lib1;
+class A {}''',
+        r'''
+library root;
+import 'lib1.dart' deferred as a;
+class M {}
+class C = a.A with M;'''], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.EXTENDS_DEFERRED_CLASS]);
   }
 
   void test_extendsDisallowedClass_class_bool() {
-    Source source = addSource(EngineTestCase.createSource(["class A extends bool {}"]));
+    Source source = addSource("class A extends bool {}");
     resolve(source);
     assertErrors(source, [
         CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
@@ -1197,7 +1350,7 @@
   }
 
   void test_extendsDisallowedClass_class_double() {
-    Source source = addSource(EngineTestCase.createSource(["class A extends double {}"]));
+    Source source = addSource("class A extends double {}");
     resolve(source);
     assertErrors(source, [
         CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
@@ -1206,7 +1359,7 @@
   }
 
   void test_extendsDisallowedClass_class_int() {
-    Source source = addSource(EngineTestCase.createSource(["class A extends int {}"]));
+    Source source = addSource("class A extends int {}");
     resolve(source);
     assertErrors(source, [
         CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
@@ -1215,7 +1368,7 @@
   }
 
   void test_extendsDisallowedClass_class_Null() {
-    Source source = addSource(EngineTestCase.createSource(["class A extends Null {}"]));
+    Source source = addSource("class A extends Null {}");
     resolve(source);
     assertErrors(source, [
         CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
@@ -1224,7 +1377,7 @@
   }
 
   void test_extendsDisallowedClass_class_num() {
-    Source source = addSource(EngineTestCase.createSource(["class A extends num {}"]));
+    Source source = addSource("class A extends num {}");
     resolve(source);
     assertErrors(source, [
         CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
@@ -1233,7 +1386,7 @@
   }
 
   void test_extendsDisallowedClass_class_String() {
-    Source source = addSource(EngineTestCase.createSource(["class A extends String {}"]));
+    Source source = addSource("class A extends String {}");
     resolve(source);
     assertErrors(source, [
         CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
@@ -1242,42 +1395,54 @@
   }
 
   void test_extendsDisallowedClass_classTypeAlias_bool() {
-    Source source = addSource(EngineTestCase.createSource(["class M {}", "class C = bool with M;"]));
+    Source source = addSource(r'''
+class M {}
+class C = bool with M;''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]);
     verify([source]);
   }
 
   void test_extendsDisallowedClass_classTypeAlias_double() {
-    Source source = addSource(EngineTestCase.createSource(["class M {}", "class C = double with M;"]));
+    Source source = addSource(r'''
+class M {}
+class C = double with M;''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]);
     verify([source]);
   }
 
   void test_extendsDisallowedClass_classTypeAlias_int() {
-    Source source = addSource(EngineTestCase.createSource(["class M {}", "class C = int with M;"]));
+    Source source = addSource(r'''
+class M {}
+class C = int with M;''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]);
     verify([source]);
   }
 
   void test_extendsDisallowedClass_classTypeAlias_Null() {
-    Source source = addSource(EngineTestCase.createSource(["class M {}", "class C = Null with M;"]));
+    Source source = addSource(r'''
+class M {}
+class C = Null with M;''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]);
     verify([source]);
   }
 
   void test_extendsDisallowedClass_classTypeAlias_num() {
-    Source source = addSource(EngineTestCase.createSource(["class M {}", "class C = num with M;"]));
+    Source source = addSource(r'''
+class M {}
+class C = num with M;''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]);
     verify([source]);
   }
 
   void test_extendsDisallowedClass_classTypeAlias_String() {
-    Source source = addSource(EngineTestCase.createSource(["class M {}", "class C = String with M;"]));
+    Source source = addSource(r'''
+class M {}
+class C = String with M;''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]);
     verify([source]);
@@ -1287,65 +1452,73 @@
     AnalysisOptionsImpl analysisOptions = new AnalysisOptionsImpl();
     analysisOptions.enableEnum = true;
     resetWithOptions(analysisOptions);
-    Source source = addSource(EngineTestCase.createSource(["enum E { ONE }", "class A extends E {}"]));
+    Source source = addSource(r'''
+enum E { ONE }
+class A extends E {}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.EXTENDS_ENUM]);
     verify([source]);
   }
 
   void test_extendsNonClass_class() {
-    Source source = addSource(EngineTestCase.createSource(["int A;", "class B extends A {}"]));
+    Source source = addSource(r'''
+int A;
+class B extends A {}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.EXTENDS_NON_CLASS]);
     verify([source]);
   }
 
   void test_extendsNonClass_dynamic() {
-    Source source = addSource(EngineTestCase.createSource(["class B extends dynamic {}"]));
+    Source source = addSource("class B extends dynamic {}");
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.EXTENDS_NON_CLASS]);
     verify([source]);
   }
 
   void test_extraPositionalArguments_const() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  const A();",
-        "}",
-        "main() {",
-        "  const A(0);",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  const A();
+}
+main() {
+  const A(0);
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.EXTRA_POSITIONAL_ARGUMENTS]);
     verify([source]);
   }
 
   void test_extraPositionalArguments_const_super() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  const A();",
-        "}",
-        "class B extends A {",
-        "  const B() : super(0);",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  const A();
+}
+class B extends A {
+  const B() : super(0);
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.EXTRA_POSITIONAL_ARGUMENTS]);
     verify([source]);
   }
 
   void test_fieldInitializedByMultipleInitializers() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  int x;", "  A() : x = 0, x = 1 {}", "}"]));
+    Source source = addSource(r'''
+class A {
+  int x;
+  A() : x = 0, x = 1 {}
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS]);
     verify([source]);
   }
 
   void test_fieldInitializedByMultipleInitializers_multipleInits() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  int x;",
-        "  A() : x = 0, x = 1, x = 2 {}",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  int x;
+  A() : x = 0, x = 1, x = 2 {}
+}''');
     resolve(source);
     assertErrors(source, [
         CompileTimeErrorCode.FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS,
@@ -1354,12 +1527,12 @@
   }
 
   void test_fieldInitializedByMultipleInitializers_multipleNames() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  int x;",
-        "  int y;",
-        "  A() : x = 0, x = 1, y = 0, y = 1 {}",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  int x;
+  int y;
+  A() : x = 0, x = 1, y = 0, y = 1 {}
+}''');
     resolve(source);
     assertErrors(source, [
         CompileTimeErrorCode.FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS,
@@ -1368,14 +1541,22 @@
   }
 
   void test_fieldInitializedInParameterAndInitializer() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  int x;", "  A(this.x) : x = 1 {}", "}"]));
+    Source source = addSource(r'''
+class A {
+  int x;
+  A(this.x) : x = 1 {}
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER]);
     verify([source]);
   }
 
   void test_fieldInitializerFactoryConstructor() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  int x;", "  factory A(this.x) {}", "}"]));
+    Source source = addSource(r'''
+class A {
+  int x;
+  factory A(this.x) {}
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.FIELD_INITIALIZER_FACTORY_CONSTRUCTOR]);
     verify([source]);
@@ -1383,7 +1564,11 @@
 
   void test_fieldInitializerOutsideConstructor() {
     // TODO(brianwilkerson) Fix the duplicate error messages.
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  int x;", "  m(this.x) {}", "}"]));
+    Source source = addSource(r'''
+class A {
+  int x;
+  m(this.x) {}
+}''');
     resolve(source);
     assertErrors(source, [
         ParserErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR,
@@ -1392,50 +1577,58 @@
   }
 
   void test_fieldInitializerOutsideConstructor_defaultParameter() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  int x;", "  m([this.x]) {}", "}"]));
+    Source source = addSource(r'''
+class A {
+  int x;
+  m([this.x]) {}
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR]);
     verify([source]);
   }
 
   void test_fieldInitializerRedirectingConstructor_afterRedirection() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  int x;",
-        "  A.named() {}",
-        "  A() : this.named(), x = 42;",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  int x;
+  A.named() {}
+  A() : this.named(), x = 42;
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR]);
     verify([source]);
   }
 
   void test_fieldInitializerRedirectingConstructor_beforeRedirection() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  int x;",
-        "  A.named() {}",
-        "  A() : x = 42, this.named();",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  int x;
+  A.named() {}
+  A() : x = 42, this.named();
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR]);
     verify([source]);
   }
 
   void test_fieldInitializingFormalRedirectingConstructor() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  int x;",
-        "  A.named() {}",
-        "  A(this.x) : this.named();",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  int x;
+  A.named() {}
+  A(this.x) : this.named();
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR]);
     verify([source]);
   }
 
   void test_finalInitializedMultipleTimes_initializers() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  final x;", "  A() : x = 0, x = 0 {}", "}"]));
+    Source source = addSource(r'''
+class A {
+  final x;
+  A() : x = 0, x = 0 {}
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS]);
     verify([source]);
@@ -1450,44 +1643,58 @@
    * FINAL_INITIALIZED_MULTIPLE_TIMES, since it more specific, we use it instead of the broader code
    */
   void test_finalInitializedMultipleTimes_initializingFormal_initializer() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  final x;", "  A(this.x) : x = 0 {}", "}"]));
+    Source source = addSource(r'''
+class A {
+  final x;
+  A(this.x) : x = 0 {}
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALIZER]);
     verify([source]);
   }
 
   void test_finalInitializedMultipleTimes_initializingFormals() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  final x;", "  A(this.x, this.x) {}", "}"]));
+    Source source = addSource(r'''
+class A {
+  final x;
+  A(this.x, this.x) {}
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.FINAL_INITIALIZED_MULTIPLE_TIMES]);
     verify([source]);
   }
 
   void test_finalNotInitialized_instanceField_const_static() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  static const F;", "}"]));
+    Source source = addSource(r'''
+class A {
+  static const F;
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.CONST_NOT_INITIALIZED]);
     verify([source]);
   }
 
   void test_finalNotInitialized_library_const() {
-    Source source = addSource(EngineTestCase.createSource(["const F;"]));
+    Source source = addSource("const F;");
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.CONST_NOT_INITIALIZED]);
     verify([source]);
   }
 
   void test_finalNotInitialized_local_const() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  const int x;", "}"]));
+    Source source = addSource(r'''
+f() {
+  const int x;
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.CONST_NOT_INITIALIZED]);
     verify([source]);
   }
 
   void test_fromEnvironment_bool_badArgs() {
-    Source source = addSource(EngineTestCase.createSource([
-        "var b1 = const bool.fromEnvironment(1);",
-        "var b2 = const bool.fromEnvironment('x', defaultValue: 1);"]));
+    Source source = addSource(r'''
+var b1 = const bool.fromEnvironment(1);
+var b2 = const bool.fromEnvironment('x', defaultValue: 1);''');
     resolve(source);
     assertErrors(source, [
         CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION,
@@ -1501,7 +1708,7 @@
     // The type of the defaultValue needs to be correct even when the default value
     // isn't used (because the variable is defined in the environment).
     analysisContext2.declaredVariables.define("x", "true");
-    Source source = addSource(EngineTestCase.createSource(["var b = const bool.fromEnvironment('x', defaultValue: 1);"]));
+    Source source = addSource("var b = const bool.fromEnvironment('x', defaultValue: 1);");
     resolve(source);
     assertErrors(source, [
         CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION,
@@ -1510,7 +1717,11 @@
   }
 
   void test_getterAndMethodWithSameName() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  x(y) {}", "  get x => 0;", "}"]));
+    Source source = addSource(r'''
+class A {
+  x(y) {}
+  get x => 0;
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.GETTER_AND_METHOD_WITH_SAME_NAME]);
     verify([source]);
@@ -1518,68 +1729,72 @@
 
   void test_implementsDeferredClass() {
     resolveWithAndWithoutExperimental(<String> [
-        EngineTestCase.createSource(["library lib1;", "class A {}"]),
-        EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "class B implements a.A {}"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.IMPLEMENTS_DEFERRED_CLASS]);
+        r'''
+library lib1;
+class A {}''',
+        r'''
+library root;
+import 'lib1.dart' deferred as a;
+class B implements a.A {}'''], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.IMPLEMENTS_DEFERRED_CLASS]);
   }
 
   void test_implementsDeferredClass_classTypeAlias() {
     resolveWithAndWithoutExperimental(<String> [
-        EngineTestCase.createSource(["library lib1;", "class A {}"]),
-        EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "class B {}",
-        "class M {}",
-        "class C = B with M implements a.A;"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.IMPLEMENTS_DEFERRED_CLASS]);
+        r'''
+library lib1;
+class A {}''',
+        r'''
+library root;
+import 'lib1.dart' deferred as a;
+class B {}
+class M {}
+class C = B with M implements a.A;'''], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.IMPLEMENTS_DEFERRED_CLASS]);
   }
 
   void test_implementsDisallowedClass_class_bool() {
-    Source source = addSource(EngineTestCase.createSource(["class A implements bool {}"]));
+    Source source = addSource("class A implements bool {}");
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
     verify([source]);
   }
 
   void test_implementsDisallowedClass_class_double() {
-    Source source = addSource(EngineTestCase.createSource(["class A implements double {}"]));
+    Source source = addSource("class A implements double {}");
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
     verify([source]);
   }
 
   void test_implementsDisallowedClass_class_int() {
-    Source source = addSource(EngineTestCase.createSource(["class A implements int {}"]));
+    Source source = addSource("class A implements int {}");
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
     verify([source]);
   }
 
   void test_implementsDisallowedClass_class_Null() {
-    Source source = addSource(EngineTestCase.createSource(["class A implements Null {}"]));
+    Source source = addSource("class A implements Null {}");
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
     verify([source]);
   }
 
   void test_implementsDisallowedClass_class_num() {
-    Source source = addSource(EngineTestCase.createSource(["class A implements num {}"]));
+    Source source = addSource("class A implements num {}");
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
     verify([source]);
   }
 
   void test_implementsDisallowedClass_class_String() {
-    Source source = addSource(EngineTestCase.createSource(["class A implements String {}"]));
+    Source source = addSource("class A implements String {}");
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
     verify([source]);
   }
 
   void test_implementsDisallowedClass_class_String_num() {
-    Source source = addSource(EngineTestCase.createSource(["class A implements String, num {}"]));
+    Source source = addSource("class A implements String, num {}");
     resolve(source);
     assertErrors(source, [
         CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS,
@@ -1588,70 +1803,70 @@
   }
 
   void test_implementsDisallowedClass_classTypeAlias_bool() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class M {}",
-        "class C = A with M implements bool;"]));
+    Source source = addSource(r'''
+class A {}
+class M {}
+class C = A with M implements bool;''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
     verify([source]);
   }
 
   void test_implementsDisallowedClass_classTypeAlias_double() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class M {}",
-        "class C = A with M implements double;"]));
+    Source source = addSource(r'''
+class A {}
+class M {}
+class C = A with M implements double;''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
     verify([source]);
   }
 
   void test_implementsDisallowedClass_classTypeAlias_int() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class M {}",
-        "class C = A with M implements int;"]));
+    Source source = addSource(r'''
+class A {}
+class M {}
+class C = A with M implements int;''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
     verify([source]);
   }
 
   void test_implementsDisallowedClass_classTypeAlias_Null() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class M {}",
-        "class C = A with M implements Null;"]));
+    Source source = addSource(r'''
+class A {}
+class M {}
+class C = A with M implements Null;''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
     verify([source]);
   }
 
   void test_implementsDisallowedClass_classTypeAlias_num() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class M {}",
-        "class C = A with M implements num;"]));
+    Source source = addSource(r'''
+class A {}
+class M {}
+class C = A with M implements num;''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
     verify([source]);
   }
 
   void test_implementsDisallowedClass_classTypeAlias_String() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class M {}",
-        "class C = A with M implements String;"]));
+    Source source = addSource(r'''
+class A {}
+class M {}
+class C = A with M implements String;''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS]);
     verify([source]);
   }
 
   void test_implementsDisallowedClass_classTypeAlias_String_num() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class M {}",
-        "class C = A with M implements String, num;"]));
+    Source source = addSource(r'''
+class A {}
+class M {}
+class C = A with M implements String, num;''');
     resolve(source);
     assertErrors(source, [
         CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS,
@@ -1660,7 +1875,7 @@
   }
 
   void test_implementsDynamic() {
-    Source source = addSource(EngineTestCase.createSource(["class A implements dynamic {}"]));
+    Source source = addSource("class A implements dynamic {}");
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DYNAMIC]);
     verify([source]);
@@ -1670,41 +1885,47 @@
     AnalysisOptionsImpl analysisOptions = new AnalysisOptionsImpl();
     analysisOptions.enableEnum = true;
     resetWithOptions(analysisOptions);
-    Source source = addSource(EngineTestCase.createSource(["enum E { ONE }", "class A implements E {}"]));
+    Source source = addSource(r'''
+enum E { ONE }
+class A implements E {}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_ENUM]);
     verify([source]);
   }
 
   void test_implementsNonClass_class() {
-    Source source = addSource(EngineTestCase.createSource(["int A;", "class B implements A {}"]));
+    Source source = addSource(r'''
+int A;
+class B implements A {}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_NON_CLASS]);
     verify([source]);
   }
 
   void test_implementsNonClass_typeAlias() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class M {}",
-        "int B;",
-        "class C = A with M implements B;"]));
+    Source source = addSource(r'''
+class A {}
+class M {}
+int B;
+class C = A with M implements B;''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_NON_CLASS]);
     verify([source]);
   }
 
   void test_implementsRepeated() {
-    Source source = addSource(EngineTestCase.createSource(["class A {}", "class B implements A, A {}"]));
+    Source source = addSource(r'''
+class A {}
+class B implements A, A {}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_REPEATED]);
     verify([source]);
   }
 
   void test_implementsRepeated_3times() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {} class C{}",
-        "class B implements A, A, A, A {}"]));
+    Source source = addSource(r'''
+class A {} class C{}
+class B implements A, A, A, A {}''');
     resolve(source);
     assertErrors(source, [
         CompileTimeErrorCode.IMPLEMENTS_REPEATED,
@@ -1714,85 +1935,95 @@
   }
 
   void test_implementsSuperClass() {
-    Source source = addSource(EngineTestCase.createSource(["class A {}", "class B extends A implements A {}"]));
+    Source source = addSource(r'''
+class A {}
+class B extends A implements A {}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_SUPER_CLASS]);
     verify([source]);
   }
 
   void test_implementsSuperClass_Object() {
-    Source source = addSource(EngineTestCase.createSource(["class A implements Object {}"]));
+    Source source = addSource("class A implements Object {}");
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_SUPER_CLASS]);
     verify([source]);
   }
 
   void test_implicitThisReferenceInInitializer_field() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  var v;",
-        "  A() : v = f;",
-        "  var f;",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  var v;
+  A() : v = f;
+  var f;
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER]);
     verify([source]);
   }
 
   void test_implicitThisReferenceInInitializer_field2() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  final x = 0;", "  final y = x;", "}"]));
+    Source source = addSource(r'''
+class A {
+  final x = 0;
+  final y = x;
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER]);
     verify([source]);
   }
 
   void test_implicitThisReferenceInInitializer_invocation() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  var v;",
-        "  A() : v = f();",
-        "  f() {}",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  var v;
+  A() : v = f();
+  f() {}
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER]);
     verify([source]);
   }
 
   void test_implicitThisReferenceInInitializer_invocationInStatic() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  static var F = m();", "  m() {}", "}"]));
+    Source source = addSource(r'''
+class A {
+  static var F = m();
+  m() {}
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER]);
     verify([source]);
   }
 
   void test_implicitThisReferenceInInitializer_redirectingConstructorInvocation() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  A(p) {}",
-        "  A.named() : this(f);",
-        "  var f;",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  A(p) {}
+  A.named() : this(f);
+  var f;
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER]);
     verify([source]);
   }
 
   void test_implicitThisReferenceInInitializer_superConstructorInvocation() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  A(p) {}",
-        "}",
-        "class B extends A {",
-        "  B() : super(f);",
-        "  var f;",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  A(p) {}
+}
+class B extends A {
+  B() : super(f);
+  var f;
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER]);
     verify([source]);
   }
 
   void test_importInternalLibrary() {
-    Source source = addSource(EngineTestCase.createSource(["import 'dart:_interceptors';"]));
+    Source source = addSource("import 'dart:_interceptors';");
     resolve(source);
     // Note, in these error cases we may generate an UNUSED_IMPORT hint, while we could prevent
     // the hint from being generated by testing the import directive for the error, this is such a
@@ -1805,7 +2036,7 @@
   }
 
   void test_importInternalLibrary_js_helper() {
-    Source source = addSource(EngineTestCase.createSource(["import 'dart:_js_helper';"]));
+    Source source = addSource("import 'dart:_js_helper';");
     resolve(source);
     // Note, in these error cases we may generate an UNUSED_IMPORT hint, while we could prevent
     // the hint from being generated by testing the import directive for the error, this is such a
@@ -1818,23 +2049,28 @@
   }
 
   void test_importOfNonLibrary() {
-    Source source = addSource(EngineTestCase.createSource(["library lib;", "import 'part.dart';", "A a;"]));
-    addNamedSource("/part.dart", EngineTestCase.createSource(["part of lib;", "class A{}"]));
+    Source source = addSource(r'''
+library lib;
+import 'part.dart';
+A a;''');
+    addNamedSource("/part.dart", r'''
+part of lib;
+class A{}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.IMPORT_OF_NON_LIBRARY]);
     verify([source]);
   }
 
   void test_inconsistentCaseExpressionTypes() {
-    Source source = addSource(EngineTestCase.createSource([
-        "f(var p) {",
-        "  switch (p) {",
-        "    case 1:",
-        "      break;",
-        "    case 'a':",
-        "      break;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+f(var p) {
+  switch (p) {
+    case 1:
+      break;
+    case 'a':
+      break;
+  }
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INCONSISTENT_CASE_EXPRESSION_TYPES]);
     verify([source]);
@@ -1843,23 +2079,23 @@
   void test_inconsistentCaseExpressionTypes_dynamic() {
     // Even though A.S and S have a static type of "dynamic", we should see
     // that they fail to match 3, because they are constant strings.
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  static const S = 'A.S';",
-        "}",
-        "",
-        "const S = 'S';",
-        "",
-        "foo(var p) {",
-        "  switch (p) {",
-        "    case 3:",
-        "      break;",
-        "    case S:",
-        "      break;",
-        "    case A.S:",
-        "      break;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  static const S = 'A.S';
+}
+
+const S = 'S';
+
+foo(var p) {
+  switch (p) {
+    case 3:
+      break;
+    case S:
+      break;
+    case A.S:
+      break;
+  }
+}''');
     resolve(source);
     assertErrors(source, [
         CompileTimeErrorCode.INCONSISTENT_CASE_EXPRESSION_TYPES,
@@ -1868,17 +2104,17 @@
   }
 
   void test_inconsistentCaseExpressionTypes_repeated() {
-    Source source = addSource(EngineTestCase.createSource([
-        "f(var p) {",
-        "  switch (p) {",
-        "    case 1:",
-        "      break;",
-        "    case 'a':",
-        "      break;",
-        "    case 'b':",
-        "      break;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+f(var p) {
+  switch (p) {
+    case 1:
+      break;
+    case 'a':
+      break;
+    case 'b':
+      break;
+  }
+}''');
     resolve(source);
     assertErrors(source, [
         CompileTimeErrorCode.INCONSISTENT_CASE_EXPRESSION_TYPES,
@@ -1889,133 +2125,154 @@
   void test_initializerForNonExistent_const() {
     // Check that the absence of a matching field doesn't cause a
     // crash during constant evaluation.
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  const A() : x = 'foo';",
-        "}",
-        "A a = const A();"]));
+    Source source = addSource(r'''
+class A {
+  const A() : x = 'foo';
+}
+A a = const A();''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INITIALIZER_FOR_NON_EXISTENT_FIELD]);
   }
 
   void test_initializerForNonExistent_initializer() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  A() : x = 0 {}", "}"]));
+    Source source = addSource(r'''
+class A {
+  A() : x = 0 {}
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INITIALIZER_FOR_NON_EXISTENT_FIELD]);
   }
 
   void test_initializerForStaticField() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  static int x;", "  A() : x = 0 {}", "}"]));
+    Source source = addSource(r'''
+class A {
+  static int x;
+  A() : x = 0 {}
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INITIALIZER_FOR_STATIC_FIELD]);
     verify([source]);
   }
 
   void test_initializingFormalForNonExistentField() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  A(this.x) {}", "}"]));
+    Source source = addSource(r'''
+class A {
+  A(this.x) {}
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTENT_FIELD]);
     verify([source]);
   }
 
   void test_initializingFormalForNonExistentField_notInEnclosingClass() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "int x;",
-        "}",
-        "class B extends A {",
-        "  B(this.x) {}",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+int x;
+}
+class B extends A {
+  B(this.x) {}
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTENT_FIELD]);
     verify([source]);
   }
 
   void test_initializingFormalForNonExistentField_optional() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  A([this.x]) {}", "}"]));
+    Source source = addSource(r'''
+class A {
+  A([this.x]) {}
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTENT_FIELD]);
     verify([source]);
   }
 
   void test_initializingFormalForNonExistentField_synthetic() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  int get x => 1;", "  A(this.x) {}", "}"]));
+    Source source = addSource(r'''
+class A {
+  int get x => 1;
+  A(this.x) {}
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTENT_FIELD]);
     verify([source]);
   }
 
   void test_initializingFormalForStaticField() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  static int x;", "  A([this.x]) {}", "}"]));
+    Source source = addSource(r'''
+class A {
+  static int x;
+  A([this.x]) {}
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_STATIC_FIELD]);
     verify([source]);
   }
 
   void test_instanceMemberAccessFromFactory_named() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  m() {}",
-        "  A();",
-        "  factory A.make() {",
-        "    m();",
-        "    return new A();",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  m() {}
+  A();
+  factory A.make() {
+    m();
+    return new A();
+  }
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INSTANCE_MEMBER_ACCESS_FROM_FACTORY]);
     verify([source]);
   }
 
   void test_instanceMemberAccessFromFactory_unnamed() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  m() {}",
-        "  A._();",
-        "  factory A() {",
-        "    m();",
-        "    return new A._();",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  m() {}
+  A._();
+  factory A() {
+    m();
+    return new A._();
+  }
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INSTANCE_MEMBER_ACCESS_FROM_FACTORY]);
     verify([source]);
   }
 
   void test_instanceMemberAccessFromStatic_field() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  int f;",
-        "  static foo() {",
-        "    f;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  int f;
+  static foo() {
+    f;
+  }
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INSTANCE_MEMBER_ACCESS_FROM_STATIC]);
     verify([source]);
   }
 
   void test_instanceMemberAccessFromStatic_getter() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  get g => null;",
-        "  static foo() {",
-        "    g;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  get g => null;
+  static foo() {
+    g;
+  }
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INSTANCE_MEMBER_ACCESS_FROM_STATIC]);
     verify([source]);
   }
 
   void test_instanceMemberAccessFromStatic_method() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  m() {}",
-        "  static foo() {",
-        "    m();",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  m() {}
+  static foo() {
+    m();
+  }
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INSTANCE_MEMBER_ACCESS_FROM_STATIC]);
     verify([source]);
@@ -2025,11 +2282,11 @@
     AnalysisOptionsImpl analysisOptions = new AnalysisOptionsImpl();
     analysisOptions.enableEnum = true;
     resetWithOptions(analysisOptions);
-    Source source = addSource(EngineTestCase.createSource([
-        "enum E { ONE }",
-        "E e(String name) {",
-        "  return const E();",
-        "}"]));
+    Source source = addSource(r'''
+enum E { ONE }
+E e(String name) {
+  return const E();
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INSTANTIATE_ENUM]);
     verify([source]);
@@ -2039,98 +2296,138 @@
     AnalysisOptionsImpl analysisOptions = new AnalysisOptionsImpl();
     analysisOptions.enableEnum = true;
     resetWithOptions(analysisOptions);
-    Source source = addSource(EngineTestCase.createSource([
-        "enum E { ONE }",
-        "E e(String name) {",
-        "  return new E();",
-        "}"]));
+    Source source = addSource(r'''
+enum E { ONE }
+E e(String name) {
+  return new E();
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INSTANTIATE_ENUM]);
     verify([source]);
   }
 
   void test_invalidAnnotation_getter() {
-    Source source = addSource(EngineTestCase.createSource(["get V => 0;", "@V", "main() {", "}"]));
+    Source source = addSource(r'''
+get V => 0;
+@V
+main() {
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION]);
     verify([source]);
   }
 
   void test_invalidAnnotation_importWithPrefix_getter() {
-    addNamedSource("/lib.dart", EngineTestCase.createSource(["library lib;", "get V => 0;"]));
-    Source source = addSource(EngineTestCase.createSource(["import 'lib.dart' as p;", "@p.V", "main() {", "}"]));
+    addNamedSource("/lib.dart", r'''
+library lib;
+get V => 0;''');
+    Source source = addSource(r'''
+import 'lib.dart' as p;
+@p.V
+main() {
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION]);
     verify([source]);
   }
 
   void test_invalidAnnotation_importWithPrefix_notConstantVariable() {
-    addNamedSource("/lib.dart", EngineTestCase.createSource(["library lib;", "final V = 0;"]));
-    Source source = addSource(EngineTestCase.createSource(["import 'lib.dart' as p;", "@p.V", "main() {", "}"]));
+    addNamedSource("/lib.dart", r'''
+library lib;
+final V = 0;''');
+    Source source = addSource(r'''
+import 'lib.dart' as p;
+@p.V
+main() {
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION]);
     verify([source]);
   }
 
   void test_invalidAnnotation_importWithPrefix_notVariableOrConstructorInvocation() {
-    addNamedSource("/lib.dart", EngineTestCase.createSource(["library lib;", "typedef V();"]));
-    Source source = addSource(EngineTestCase.createSource(["import 'lib.dart' as p;", "@p.V", "main() {", "}"]));
+    addNamedSource("/lib.dart", r'''
+library lib;
+typedef V();''');
+    Source source = addSource(r'''
+import 'lib.dart' as p;
+@p.V
+main() {
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION]);
     verify([source]);
   }
 
   void test_invalidAnnotation_notConstantVariable() {
-    Source source = addSource(EngineTestCase.createSource(["final V = 0;", "@V", "main() {", "}"]));
+    Source source = addSource(r'''
+final V = 0;
+@V
+main() {
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION]);
     verify([source]);
   }
 
   void test_invalidAnnotation_notVariableOrConstructorInvocation() {
-    Source source = addSource(EngineTestCase.createSource(["typedef V();", "@V", "main() {", "}"]));
+    Source source = addSource(r'''
+typedef V();
+@V
+main() {
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION]);
     verify([source]);
   }
 
   void test_invalidAnnotation_staticMethodReference() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  static f() {}",
-        "}",
-        "@A.f",
-        "main() {",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  static f() {}
+}
+@A.f
+main() {
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION]);
     verify([source]);
   }
 
   void test_invalidAnnotation_unresolved_identifier() {
-    Source source = addSource(EngineTestCase.createSource(["@unresolved", "main() {", "}"]));
+    Source source = addSource(r'''
+@unresolved
+main() {
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION]);
   }
 
   void test_invalidAnnotation_unresolved_invocation() {
-    Source source = addSource(EngineTestCase.createSource(["@Unresolved()", "main() {", "}"]));
+    Source source = addSource(r'''
+@Unresolved()
+main() {
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION]);
   }
 
   void test_invalidAnnotation_unresolved_prefixedIdentifier() {
-    Source source = addSource(EngineTestCase.createSource([
-        "import 'dart:math' as p;",
-        "@p.unresolved",
-        "main() {",
-        "}"]));
+    Source source = addSource(r'''
+import 'dart:math' as p;
+@p.unresolved
+main() {
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION]);
   }
 
   void test_invalidAnnotation_useLibraryScope() {
-    Source source = addSource(EngineTestCase.createSource(["@foo", "class A {", "  static const foo = null;", "}"]));
+    Source source = addSource(r'''
+@foo
+class A {
+  static const foo = null;
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION]);
   }
@@ -2138,59 +2435,77 @@
   void test_invalidAnnotationFromDeferredLibrary() {
     // See test_invalidAnnotation_notConstantVariable
     resolveWithAndWithoutExperimental(<String> [
-        EngineTestCase.createSource([
-        "library lib1;",
-        "class V { const V(); }",
-        "const v = const V();"]),
-        EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "@a.v main () {}"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY]);
+        r'''
+library lib1;
+class V { const V(); }
+const v = const V();''',
+        r'''
+library root;
+import 'lib1.dart' deferred as a;
+@a.v main () {}'''], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY]);
   }
 
   void test_invalidAnnotationFromDeferredLibrary_constructor() {
     // See test_invalidAnnotation_notConstantVariable
     resolveWithAndWithoutExperimental(<String> [
-        EngineTestCase.createSource(["library lib1;", "class C { const C(); }"]),
-        EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "@a.C() main () {}"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY]);
+        r'''
+library lib1;
+class C { const C(); }''',
+        r'''
+library root;
+import 'lib1.dart' deferred as a;
+@a.C() main () {}'''], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY]);
   }
 
   void test_invalidAnnotationFromDeferredLibrary_namedConstructor() {
     // See test_invalidAnnotation_notConstantVariable
     resolveWithAndWithoutExperimental(<String> [
-        EngineTestCase.createSource(["library lib1;", "class C { const C.name(); }"]),
-        EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "@a.C.name() main () {}"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY]);
+        r'''
+library lib1;
+class C { const C.name(); }''',
+        r'''
+library root;
+import 'lib1.dart' deferred as a;
+@a.C.name() main () {}'''], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY]);
   }
 
   void test_invalidConstructorName_notEnclosingClassName_defined() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  B() : super();", "}", "class B {}"]));
+    Source source = addSource(r'''
+class A {
+  B() : super();
+}
+class B {}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INVALID_CONSTRUCTOR_NAME]);
     // no verify() call, "B" is not resolved
   }
 
   void test_invalidConstructorName_notEnclosingClassName_undefined() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  B() : super();", "}"]));
+    Source source = addSource(r'''
+class A {
+  B() : super();
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INVALID_CONSTRUCTOR_NAME]);
     // no verify() call, "B" is not resolved
   }
 
   void test_invalidFactoryNameNotAClass_notClassName() {
-    Source source = addSource(EngineTestCase.createSource(["int B;", "class A {", "  factory B() {}", "}"]));
+    Source source = addSource(r'''
+int B;
+class A {
+  factory B() {}
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INVALID_FACTORY_NAME_NOT_A_CLASS]);
     verify([source]);
   }
 
   void test_invalidFactoryNameNotAClass_notEnclosingClassName() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  factory B() {}", "}"]));
+    Source source = addSource(r'''
+class A {
+  factory B() {}
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INVALID_FACTORY_NAME_NOT_A_CLASS]);
     // no verify() call, "B" is not resolved
@@ -2198,7 +2513,10 @@
 
   void test_invalidModifierOnConstructor_async() {
     resetWithAsync();
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  A() async {}", "}"]));
+    Source source = addSource(r'''
+class A {
+  A() async {}
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INVALID_MODIFIER_ON_CONSTRUCTOR]);
     verify([source]);
@@ -2206,7 +2524,10 @@
 
   void test_invalidModifierOnConstructor_asyncStar() {
     resetWithAsync();
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  A() async* {}", "}"]));
+    Source source = addSource(r'''
+class A {
+  A() async* {}
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INVALID_MODIFIER_ON_CONSTRUCTOR]);
     verify([source]);
@@ -2214,7 +2535,10 @@
 
   void test_invalidModifierOnConstructor_syncStar() {
     resetWithAsync();
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  A() sync* {}", "}"]));
+    Source source = addSource(r'''
+class A {
+  A() sync* {}
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INVALID_MODIFIER_ON_CONSTRUCTOR]);
     verify([source]);
@@ -2222,7 +2546,10 @@
 
   void test_invalidModifierOnSetter_member_async() {
     resetWithAsync();
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  set x(v) async {}", "}"]));
+    Source source = addSource(r'''
+class A {
+  set x(v) async {}
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INVALID_MODIFIER_ON_SETTER]);
     verify([source]);
@@ -2230,7 +2557,10 @@
 
   void test_invalidModifierOnSetter_member_asyncStar() {
     resetWithAsync();
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  set x(v) async* {}", "}"]));
+    Source source = addSource(r'''
+class A {
+  set x(v) async* {}
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INVALID_MODIFIER_ON_SETTER]);
     verify([source]);
@@ -2238,7 +2568,10 @@
 
   void test_invalidModifierOnSetter_member_syncStar() {
     resetWithAsync();
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  set x(v) sync* {}", "}"]));
+    Source source = addSource(r'''
+class A {
+  set x(v) sync* {}
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INVALID_MODIFIER_ON_SETTER]);
     verify([source]);
@@ -2246,7 +2579,7 @@
 
   void test_invalidModifierOnSetter_topLevel_async() {
     resetWithAsync();
-    Source source = addSource(EngineTestCase.createSource(["set x(v) async {}"]));
+    Source source = addSource("set x(v) async {}");
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INVALID_MODIFIER_ON_SETTER]);
     verify([source]);
@@ -2254,7 +2587,7 @@
 
   void test_invalidModifierOnSetter_topLevel_asyncStar() {
     resetWithAsync();
-    Source source = addSource(EngineTestCase.createSource(["set x(v) async* {}"]));
+    Source source = addSource("set x(v) async* {}");
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INVALID_MODIFIER_ON_SETTER]);
     verify([source]);
@@ -2262,55 +2595,71 @@
 
   void test_invalidModifierOnSetter_topLevel_syncStar() {
     resetWithAsync();
-    Source source = addSource(EngineTestCase.createSource(["set x(v) sync* {}"]));
+    Source source = addSource("set x(v) sync* {}");
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INVALID_MODIFIER_ON_SETTER]);
     verify([source]);
   }
 
   void test_invalidReferenceToThis_factoryConstructor() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  factory A() { return this; }", "}"]));
+    Source source = addSource(r'''
+class A {
+  factory A() { return this; }
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS]);
     verify([source]);
   }
 
   void test_invalidReferenceToThis_instanceVariableInitializer_inConstructor() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  var f;", "  A() : f = this;", "}"]));
+    Source source = addSource(r'''
+class A {
+  var f;
+  A() : f = this;
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS]);
     verify([source]);
   }
 
   void test_invalidReferenceToThis_instanceVariableInitializer_inDeclaration() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  var f = this;", "}"]));
+    Source source = addSource(r'''
+class A {
+  var f = this;
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS]);
     verify([source]);
   }
 
   void test_invalidReferenceToThis_staticMethod() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  static m() { return this; }", "}"]));
+    Source source = addSource(r'''
+class A {
+  static m() { return this; }
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS]);
     verify([source]);
   }
 
   void test_invalidReferenceToThis_staticVariableInitializer() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  static A f = this;", "}"]));
+    Source source = addSource(r'''
+class A {
+  static A f = this;
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS]);
     verify([source]);
   }
 
   void test_invalidReferenceToThis_superInitializer() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  A(var x) {}",
-        "}",
-        "class B extends A {",
-        "  B() : super(this);",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  A(var x) {}
+}
+class B extends A {
+  B() : super(this);
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS]);
     verify([source]);
@@ -2331,103 +2680,112 @@
   }
 
   void test_invalidTypeArgumentInConstList() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A<E> {",
-        "  m() {",
-        "    return const <E>[];",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A<E> {
+  m() {
+    return const <E>[];
+  }
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_LIST]);
     verify([source]);
   }
 
   void test_invalidTypeArgumentInConstMap() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A<E> {",
-        "  m() {",
-        "    return const <String, E>{};",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A<E> {
+  m() {
+    return const <String, E>{};
+  }
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_MAP]);
     verify([source]);
   }
 
   void test_invalidUri_export() {
-    Source source = addSource(EngineTestCase.createSource(["export 'ht:';"]));
+    Source source = addSource("export 'ht:';");
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INVALID_URI]);
   }
 
   void test_invalidUri_import() {
-    Source source = addSource(EngineTestCase.createSource(["import 'ht:';"]));
+    Source source = addSource("import 'ht:';");
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INVALID_URI]);
   }
 
   void test_invalidUri_part() {
-    Source source = addSource(EngineTestCase.createSource(["part 'ht:';"]));
+    Source source = addSource("part 'ht:';");
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.INVALID_URI]);
   }
 
   void test_labelInOuterScope() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  void m(int i) {",
-        "    l: while (i > 0) {",
-        "      void f() {",
-        "        break l;",
-        "      };",
-        "    }",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  void m(int i) {
+    l: while (i > 0) {
+      void f() {
+        break l;
+      };
+    }
+  }
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.LABEL_IN_OUTER_SCOPE]);
     // We cannot verify resolution with unresolvable labels
   }
 
   void test_labelUndefined_break() {
-    Source source = addSource(EngineTestCase.createSource([
-        "f() {",
-        "  x: while (true) {",
-        "    break y;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+f() {
+  x: while (true) {
+    break y;
+  }
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.LABEL_UNDEFINED]);
     // We cannot verify resolution with undefined labels
   }
 
   void test_labelUndefined_continue() {
-    Source source = addSource(EngineTestCase.createSource([
-        "f() {",
-        "  x: while (true) {",
-        "    continue y;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+f() {
+  x: while (true) {
+    continue y;
+  }
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.LABEL_UNDEFINED]);
     // We cannot verify resolution with undefined labels
   }
 
   void test_memberWithClassName_field() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  int A = 0;", "}"]));
+    Source source = addSource(r'''
+class A {
+  int A = 0;
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.MEMBER_WITH_CLASS_NAME]);
     verify([source]);
   }
 
   void test_memberWithClassName_field2() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  int z, A, b = 0;", "}"]));
+    Source source = addSource(r'''
+class A {
+  int z, A, b = 0;
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.MEMBER_WITH_CLASS_NAME]);
     verify([source]);
   }
 
   void test_memberWithClassName_getter() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  get A => 0;", "}"]));
+    Source source = addSource(r'''
+class A {
+  get A => 0;
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.MEMBER_WITH_CLASS_NAME]);
     verify([source]);
@@ -2438,7 +2796,11 @@
   }
 
   void test_methodAndGetterWithSameName() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  get x => 0;", "  x(y) {}", "}"]));
+    Source source = addSource(r'''
+class A {
+  get x => 0;
+  x(y) {}
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.METHOD_AND_GETTER_WITH_SAME_NAME]);
     verify([source]);
@@ -2448,15 +2810,15 @@
     AnalysisOptionsImpl analysisOptions = new AnalysisOptionsImpl();
     analysisOptions.enableEnum = true;
     resetWithOptions(analysisOptions);
-    Source source = addSource(EngineTestCase.createSource([
-        "enum E { ONE, TWO, THREE, FOUR }",
-        "bool odd(E e) {",
-        "  switch (e) {",
-        "    case E.ONE:",
-        "    case E.THREE: return true;",
-        "  }",
-        "  return false;",
-        "}"]));
+    Source source = addSource(r'''
+enum E { ONE, TWO, THREE, FOUR }
+bool odd(E e) {
+  switch (e) {
+    case E.ONE:
+    case E.THREE: return true;
+  }
+  return false;
+}''');
     resolve(source);
     assertErrors(source, [
         CompileTimeErrorCode.MISSING_ENUM_CONSTANT_IN_SWITCH,
@@ -2465,18 +2827,22 @@
   }
 
   void test_mixinDeclaresConstructor_classDeclaration() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  A() {}",
-        "}",
-        "class B extends Object with A {}"]));
+    Source source = addSource(r'''
+class A {
+  A() {}
+}
+class B extends Object with A {}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.MIXIN_DECLARES_CONSTRUCTOR]);
     verify([source]);
   }
 
   void test_mixinDeclaresConstructor_typeAlias() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  A() {}", "}", "class B = Object with A;"]));
+    Source source = addSource(r'''
+class A {
+  A() {}
+}
+class B = Object with A;''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.MIXIN_DECLARES_CONSTRUCTOR]);
     verify([source]);
@@ -2484,149 +2850,167 @@
 
   void test_mixinDeferredClass() {
     resolveWithAndWithoutExperimental(<String> [
-        EngineTestCase.createSource(["library lib1;", "class A {}"]),
-        EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "class B extends Object with a.A {}"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.MIXIN_DEFERRED_CLASS]);
+        r'''
+library lib1;
+class A {}''',
+        r'''
+library root;
+import 'lib1.dart' deferred as a;
+class B extends Object with a.A {}'''], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.MIXIN_DEFERRED_CLASS]);
   }
 
   void test_mixinDeferredClass_classTypeAlias() {
     resolveWithAndWithoutExperimental(<String> [
-        EngineTestCase.createSource(["library lib1;", "class A {}"]),
-        EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "class B {}",
-        "class C = B with a.A;"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.MIXIN_DEFERRED_CLASS]);
+        r'''
+library lib1;
+class A {}''',
+        r'''
+library root;
+import 'lib1.dart' deferred as a;
+class B {}
+class C = B with a.A;'''], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.MIXIN_DEFERRED_CLASS]);
   }
 
   void test_mixinInheritsFromNotObject_classDeclaration_extends() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B extends A {}",
-        "class C extends Object with B {}"]));
+    Source source = addSource(r'''
+class A {}
+class B extends A {}
+class C extends Object with B {}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT]);
     verify([source]);
   }
 
   void test_mixinInheritsFromNotObject_classDeclaration_with() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B extends Object with A {}",
-        "class C extends Object with B {}"]));
+    Source source = addSource(r'''
+class A {}
+class B extends Object with A {}
+class C extends Object with B {}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT]);
     verify([source]);
   }
 
   void test_mixinInheritsFromNotObject_typeAlias_extends() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B extends A {}",
-        "class C = Object with B;"]));
+    Source source = addSource(r'''
+class A {}
+class B extends A {}
+class C = Object with B;''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT]);
     verify([source]);
   }
 
   void test_mixinInheritsFromNotObject_typeAlias_with() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B extends Object with A {}",
-        "class C = Object with B;"]));
+    Source source = addSource(r'''
+class A {}
+class B extends Object with A {}
+class C = Object with B;''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT]);
     verify([source]);
   }
 
   void test_mixinOfDisallowedClass_class_bool() {
-    Source source = addSource(EngineTestCase.createSource(["class A extends Object with bool {}"]));
+    Source source = addSource("class A extends Object with bool {}");
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
     verify([source]);
   }
 
   void test_mixinOfDisallowedClass_class_double() {
-    Source source = addSource(EngineTestCase.createSource(["class A extends Object with double {}"]));
+    Source source = addSource("class A extends Object with double {}");
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
     verify([source]);
   }
 
   void test_mixinOfDisallowedClass_class_int() {
-    Source source = addSource(EngineTestCase.createSource(["class A extends Object with int {}"]));
+    Source source = addSource("class A extends Object with int {}");
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
     verify([source]);
   }
 
   void test_mixinOfDisallowedClass_class_Null() {
-    Source source = addSource(EngineTestCase.createSource(["class A extends Object with Null {}"]));
+    Source source = addSource("class A extends Object with Null {}");
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
     verify([source]);
   }
 
   void test_mixinOfDisallowedClass_class_num() {
-    Source source = addSource(EngineTestCase.createSource(["class A extends Object with num {}"]));
+    Source source = addSource("class A extends Object with num {}");
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
     verify([source]);
   }
 
   void test_mixinOfDisallowedClass_class_String() {
-    Source source = addSource(EngineTestCase.createSource(["class A extends Object with String {}"]));
+    Source source = addSource("class A extends Object with String {}");
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
     verify([source]);
   }
 
   void test_mixinOfDisallowedClass_classTypeAlias_bool() {
-    Source source = addSource(EngineTestCase.createSource(["class A {}", "class C = A with bool;"]));
+    Source source = addSource(r'''
+class A {}
+class C = A with bool;''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
     verify([source]);
   }
 
   void test_mixinOfDisallowedClass_classTypeAlias_double() {
-    Source source = addSource(EngineTestCase.createSource(["class A {}", "class C = A with double;"]));
+    Source source = addSource(r'''
+class A {}
+class C = A with double;''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
     verify([source]);
   }
 
   void test_mixinOfDisallowedClass_classTypeAlias_int() {
-    Source source = addSource(EngineTestCase.createSource(["class A {}", "class C = A with int;"]));
+    Source source = addSource(r'''
+class A {}
+class C = A with int;''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
     verify([source]);
   }
 
   void test_mixinOfDisallowedClass_classTypeAlias_Null() {
-    Source source = addSource(EngineTestCase.createSource(["class A {}", "class C = A with Null;"]));
+    Source source = addSource(r'''
+class A {}
+class C = A with Null;''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
     verify([source]);
   }
 
   void test_mixinOfDisallowedClass_classTypeAlias_num() {
-    Source source = addSource(EngineTestCase.createSource(["class A {}", "class C = A with num;"]));
+    Source source = addSource(r'''
+class A {}
+class C = A with num;''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
     verify([source]);
   }
 
   void test_mixinOfDisallowedClass_classTypeAlias_String() {
-    Source source = addSource(EngineTestCase.createSource(["class A {}", "class C = A with String;"]));
+    Source source = addSource(r'''
+class A {}
+class C = A with String;''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS]);
     verify([source]);
   }
 
   void test_mixinOfDisallowedClass_classTypeAlias_String_num() {
-    Source source = addSource(EngineTestCase.createSource(["class A {}", "class C = A with String, num;"]));
+    Source source = addSource(r'''
+class A {}
+class C = A with String, num;''');
     resolve(source);
     assertErrors(source, [
         CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS,
@@ -2638,69 +3022,82 @@
     AnalysisOptionsImpl analysisOptions = new AnalysisOptionsImpl();
     analysisOptions.enableEnum = true;
     resetWithOptions(analysisOptions);
-    Source source = addSource(EngineTestCase.createSource(["enum E { ONE }", "class A extends Object with E {}"]));
+    Source source = addSource(r'''
+enum E { ONE }
+class A extends Object with E {}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_ENUM]);
     verify([source]);
   }
 
   void test_mixinOfNonClass_class() {
-    Source source = addSource(EngineTestCase.createSource(["int A;", "class B extends Object with A {}"]));
+    Source source = addSource(r'''
+int A;
+class B extends Object with A {}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_NON_CLASS]);
     verify([source]);
   }
 
   void test_mixinOfNonClass_typeAlias() {
-    Source source = addSource(EngineTestCase.createSource(["class A {}", "int B;", "class C = A with B;"]));
+    Source source = addSource(r'''
+class A {}
+int B;
+class C = A with B;''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.MIXIN_OF_NON_CLASS]);
     verify([source]);
   }
 
   void test_mixinReferencesSuper() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  toString() => super.toString();",
-        "}",
-        "class B extends Object with A {}"]));
+    Source source = addSource(r'''
+class A {
+  toString() => super.toString();
+}
+class B extends Object with A {}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.MIXIN_REFERENCES_SUPER]);
     verify([source]);
   }
 
   void test_mixinWithNonClassSuperclass_class() {
-    Source source = addSource(EngineTestCase.createSource(["int A;", "class B {}", "class C extends A with B {}"]));
+    Source source = addSource(r'''
+int A;
+class B {}
+class C extends A with B {}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.MIXIN_WITH_NON_CLASS_SUPERCLASS]);
     verify([source]);
   }
 
   void test_mixinWithNonClassSuperclass_typeAlias() {
-    Source source = addSource(EngineTestCase.createSource(["int A;", "class B {}", "class C = A with B;"]));
+    Source source = addSource(r'''
+int A;
+class B {}
+class C = A with B;''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.MIXIN_WITH_NON_CLASS_SUPERCLASS]);
     verify([source]);
   }
 
   void test_multipleRedirectingConstructorInvocations() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  A() : this.a(), this.b();",
-        "  A.a() {}",
-        "  A.b() {}",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  A() : this.a(), this.b();
+  A.a() {}
+  A.b() {}
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS]);
     verify([source]);
   }
 
   void test_multipleSuperInitializers() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B extends A {",
-        "  B() : super(), super() {}",
-        "}"]));
+    Source source = addSource(r'''
+class A {}
+class B extends A {
+  B() : super(), super() {}
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.MULTIPLE_SUPER_INITIALIZERS]);
     verify([source]);
@@ -2709,7 +3106,7 @@
   void test_nativeClauseInNonSDKCode() {
     // TODO(jwren) Move this test somewhere else: This test verifies a parser error code is generated
     // through the ErrorVerifier, it is not a CompileTimeErrorCode.
-    Source source = addSource(EngineTestCase.createSource(["class A native 'string' {}"]));
+    Source source = addSource("class A native 'string' {}");
     resolve(source);
     assertErrors(source, [ParserErrorCode.NATIVE_CLAUSE_IN_NON_SDK_CODE]);
     verify([source]);
@@ -2718,7 +3115,7 @@
   void test_nativeFunctionBodyInNonSDKCode_function() {
     // TODO(jwren) Move this test somewhere else: This test verifies a parser error code is generated
     // through the ErrorVerifier, it is not a CompileTimeErrorCode.
-    Source source = addSource(EngineTestCase.createSource(["int m(a) native 'string';"]));
+    Source source = addSource("int m(a) native 'string';");
     resolve(source);
     assertErrors(source, [ParserErrorCode.NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE]);
     verify([source]);
@@ -2727,103 +3124,145 @@
   void test_nativeFunctionBodyInNonSDKCode_method() {
     // TODO(jwren) Move this test somewhere else: This test verifies a parser error code is generated
     // through the ErrorVerifier, it is not a CompileTimeErrorCode.
-    Source source = addSource(EngineTestCase.createSource(["class A{", "  static int m(a) native 'string';", "}"]));
+    Source source = addSource(r'''
+class A{
+  static int m(a) native 'string';
+}''');
     resolve(source);
     assertErrors(source, [ParserErrorCode.NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE]);
     verify([source]);
   }
 
   void test_noAnnotationConstructorArguments() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  const A();", "}", "@A", "main() {", "}"]));
+    Source source = addSource(r'''
+class A {
+  const A();
+}
+@A
+main() {
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.NO_ANNOTATION_CONSTRUCTOR_ARGUMENTS]);
     verify([source]);
   }
 
   void test_noDefaultSuperConstructorExplicit() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  A(p);",
-        "}",
-        "class B extends A {",
-        "  B() {}",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  A(p);
+}
+class B extends A {
+  B() {}
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT]);
     verify([source]);
   }
 
   void test_noDefaultSuperConstructorImplicit_superHasParameters() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  A(p);", "}", "class B extends A {", "}"]));
+    Source source = addSource(r'''
+class A {
+  A(p);
+}
+class B extends A {
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT]);
     verify([source]);
   }
 
   void test_noDefaultSuperConstructorImplicit_superOnlyNamed() {
-    Source source = addSource(EngineTestCase.createSource(["class A { A.named() {} }", "class B extends A {}"]));
+    Source source = addSource(r'''
+class A { A.named() {} }
+class B extends A {}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT]);
     verify([source]);
   }
 
   void test_nonConstantAnnotationConstructor_named() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  A.fromInt() {}",
-        "}",
-        "@A.fromInt()",
-        "main() {",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  A.fromInt() {}
+}
+@A.fromInt()
+main() {
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_ANNOTATION_CONSTRUCTOR]);
     verify([source]);
   }
 
   void test_nonConstantAnnotationConstructor_unnamed() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  A() {}", "}", "@A()", "main() {", "}"]));
+    Source source = addSource(r'''
+class A {
+  A() {}
+}
+@A()
+main() {
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_ANNOTATION_CONSTRUCTOR]);
     verify([source]);
   }
 
   void test_nonConstantDefaultValue_function_named() {
-    Source source = addSource(EngineTestCase.createSource(["int y;", "f({x : y}) {}"]));
+    Source source = addSource(r'''
+int y;
+f({x : y}) {}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE]);
     verify([source]);
   }
 
   void test_nonConstantDefaultValue_function_positional() {
-    Source source = addSource(EngineTestCase.createSource(["int y;", "f([x = y]) {}"]));
+    Source source = addSource(r'''
+int y;
+f([x = y]) {}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE]);
     verify([source]);
   }
 
   void test_nonConstantDefaultValue_inConstructor_named() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  int y;", "  A({x : y}) {}", "}"]));
+    Source source = addSource(r'''
+class A {
+  int y;
+  A({x : y}) {}
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE]);
     verify([source]);
   }
 
   void test_nonConstantDefaultValue_inConstructor_positional() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  int y;", "  A([x = y]) {}", "}"]));
+    Source source = addSource(r'''
+class A {
+  int y;
+  A([x = y]) {}
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE]);
     verify([source]);
   }
 
   void test_nonConstantDefaultValue_method_named() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  int y;", "  m({x : y}) {}", "}"]));
+    Source source = addSource(r'''
+class A {
+  int y;
+  m({x : y}) {}
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE]);
     verify([source]);
   }
 
   void test_nonConstantDefaultValue_method_positional() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  int y;", "  m([x = y]) {}", "}"]));
+    Source source = addSource(r'''
+class A {
+  int y;
+  m([x = y]) {}
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE]);
     verify([source]);
@@ -2831,30 +3270,34 @@
 
   void test_nonConstantDefaultValueFromDeferredLibrary() {
     resolveWithAndWithoutExperimental(<String> [
-        EngineTestCase.createSource(["library lib1;", "const V = 1;"]),
-        EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "f({x : a.V}) {}"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE_FROM_DEFERRED_LIBRARY]);
+        r'''
+library lib1;
+const V = 1;''',
+        r'''
+library root;
+import 'lib1.dart' deferred as a;
+f({x : a.V}) {}'''], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE_FROM_DEFERRED_LIBRARY]);
   }
 
   void test_nonConstantDefaultValueFromDeferredLibrary_nested() {
     resolveWithAndWithoutExperimental(<String> [
-        EngineTestCase.createSource(["library lib1;", "const V = 1;"]),
-        EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "f({x : a.V + 1}) {}"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE_FROM_DEFERRED_LIBRARY]);
+        r'''
+library lib1;
+const V = 1;''',
+        r'''
+library root;
+import 'lib1.dart' deferred as a;
+f({x : a.V + 1}) {}'''], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE_FROM_DEFERRED_LIBRARY]);
   }
 
   void test_nonConstCaseExpression() {
-    Source source = addSource(EngineTestCase.createSource([
-        "f(int p, int q) {",
-        "  switch (p) {",
-        "    case 3 + q:",
-        "      break;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+f(int p, int q) {
+  switch (p) {
+    case 3 + q:
+      break;
+  }
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_CASE_EXPRESSION]);
     verify([source]);
@@ -2862,34 +3305,41 @@
 
   void test_nonConstCaseExpressionFromDeferredLibrary() {
     resolveWithAndWithoutExperimental(<String> [
-        EngineTestCase.createSource(["library lib1;", "const int c = 1;"]),
-        EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "main (int p) {",
-        "  switch (p) {",
-        "    case a.c:",
-        "      break;",
-        "  }",
-        "}"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.NON_CONSTANT_CASE_EXPRESSION_FROM_DEFERRED_LIBRARY]);
+        r'''
+library lib1;
+const int c = 1;''',
+        r'''
+library root;
+import 'lib1.dart' deferred as a;
+main (int p) {
+  switch (p) {
+    case a.c:
+      break;
+  }
+}'''], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.NON_CONSTANT_CASE_EXPRESSION_FROM_DEFERRED_LIBRARY]);
   }
 
   void test_nonConstCaseExpressionFromDeferredLibrary_nested() {
     resolveWithAndWithoutExperimental(<String> [
-        EngineTestCase.createSource(["library lib1;", "const int c = 1;"]),
-        EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "main (int p) {",
-        "  switch (p) {",
-        "    case a.c + 1:",
-        "      break;",
-        "  }",
-        "}"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.NON_CONSTANT_CASE_EXPRESSION_FROM_DEFERRED_LIBRARY]);
+        r'''
+library lib1;
+const int c = 1;''',
+        r'''
+library root;
+import 'lib1.dart' deferred as a;
+main (int p) {
+  switch (p) {
+    case a.c + 1:
+      break;
+  }
+}'''], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.NON_CONSTANT_CASE_EXPRESSION_FROM_DEFERRED_LIBRARY]);
   }
 
   void test_nonConstListElement() {
-    Source source = addSource(EngineTestCase.createSource(["f(a) {", "  return const [a];", "}"]));
+    Source source = addSource(r'''
+f(a) {
+  return const [a];
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT]);
     verify([source]);
@@ -2897,42 +3347,55 @@
 
   void test_nonConstListElementFromDeferredLibrary() {
     resolveWithAndWithoutExperimental(<String> [
-        EngineTestCase.createSource(["library lib1;", "const int c = 1;"]),
-        EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "f() {",
-        "  return const [a.c];",
-        "}"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT_FROM_DEFERRED_LIBRARY]);
+        r'''
+library lib1;
+const int c = 1;''',
+        r'''
+library root;
+import 'lib1.dart' deferred as a;
+f() {
+  return const [a.c];
+}'''], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT_FROM_DEFERRED_LIBRARY]);
   }
 
   void test_nonConstListElementFromDeferredLibrary_nested() {
     resolveWithAndWithoutExperimental(<String> [
-        EngineTestCase.createSource(["library lib1;", "const int c = 1;"]),
-        EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "f() {",
-        "  return const [a.c + 1];",
-        "}"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT_FROM_DEFERRED_LIBRARY]);
+        r'''
+library lib1;
+const int c = 1;''',
+        r'''
+library root;
+import 'lib1.dart' deferred as a;
+f() {
+  return const [a.c + 1];
+}'''], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT_FROM_DEFERRED_LIBRARY]);
   }
 
   void test_nonConstMapAsExpressionStatement_begin() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  {'a' : 0, 'b' : 1}.length;", "}"]));
+    Source source = addSource(r'''
+f() {
+  {'a' : 0, 'b' : 1}.length;
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.NON_CONST_MAP_AS_EXPRESSION_STATEMENT]);
     verify([source]);
   }
 
   void test_nonConstMapAsExpressionStatement_only() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  {'a' : 0, 'b' : 1};", "}"]));
+    Source source = addSource(r'''
+f() {
+  {'a' : 0, 'b' : 1};
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.NON_CONST_MAP_AS_EXPRESSION_STATEMENT]);
     verify([source]);
   }
 
   void test_nonConstMapKey() {
-    Source source = addSource(EngineTestCase.createSource(["f(a) {", "  return const {a : 0};", "}"]));
+    Source source = addSource(r'''
+f(a) {
+  return const {a : 0};
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_MAP_KEY]);
     verify([source]);
@@ -2940,28 +3403,35 @@
 
   void test_nonConstMapKeyFromDeferredLibrary() {
     resolveWithAndWithoutExperimental(<String> [
-        EngineTestCase.createSource(["library lib1;", "const int c = 1;"]),
-        EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "f() {",
-        "  return const {a.c : 0};",
-        "}"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.NON_CONSTANT_MAP_KEY_FROM_DEFERRED_LIBRARY]);
+        r'''
+library lib1;
+const int c = 1;''',
+        r'''
+library root;
+import 'lib1.dart' deferred as a;
+f() {
+  return const {a.c : 0};
+}'''], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.NON_CONSTANT_MAP_KEY_FROM_DEFERRED_LIBRARY]);
   }
 
   void test_nonConstMapKeyFromDeferredLibrary_nested() {
     resolveWithAndWithoutExperimental(<String> [
-        EngineTestCase.createSource(["library lib1;", "const int c = 1;"]),
-        EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "f() {",
-        "  return const {a.c + 1 : 0};",
-        "}"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.NON_CONSTANT_MAP_KEY_FROM_DEFERRED_LIBRARY]);
+        r'''
+library lib1;
+const int c = 1;''',
+        r'''
+library root;
+import 'lib1.dart' deferred as a;
+f() {
+  return const {a.c + 1 : 0};
+}'''], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.NON_CONSTANT_MAP_KEY_FROM_DEFERRED_LIBRARY]);
   }
 
   void test_nonConstMapValue() {
-    Source source = addSource(EngineTestCase.createSource(["f(a) {", "  return const {'a' : a};", "}"]));
+    Source source = addSource(r'''
+f(a) {
+  return const {'a' : a};
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE]);
     verify([source]);
@@ -2969,32 +3439,36 @@
 
   void test_nonConstMapValueFromDeferredLibrary() {
     resolveWithAndWithoutExperimental(<String> [
-        EngineTestCase.createSource(["library lib1;", "const int c = 1;"]),
-        EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "f() {",
-        "  return const {'a' : a.c};",
-        "}"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE_FROM_DEFERRED_LIBRARY]);
+        r'''
+library lib1;
+const int c = 1;''',
+        r'''
+library root;
+import 'lib1.dart' deferred as a;
+f() {
+  return const {'a' : a.c};
+}'''], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE_FROM_DEFERRED_LIBRARY]);
   }
 
   void test_nonConstMapValueFromDeferredLibrary_nested() {
     resolveWithAndWithoutExperimental(<String> [
-        EngineTestCase.createSource(["library lib1;", "const int c = 1;"]),
-        EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "f() {",
-        "  return const {'a' : a.c + 1};",
-        "}"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE_FROM_DEFERRED_LIBRARY]);
+        r'''
+library lib1;
+const int c = 1;''',
+        r'''
+library root;
+import 'lib1.dart' deferred as a;
+f() {
+  return const {'a' : a.c + 1};
+}'''], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE_FROM_DEFERRED_LIBRARY]);
   }
 
   void test_nonConstValueInInitializer_binary_notBool_left() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  final bool a;",
-        "  const A(String p) : a = p && true;",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  final bool a;
+  const A(String p) : a = p && true;
+}''');
     resolve(source);
     assertErrors(source, [
         CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL,
@@ -3003,11 +3477,11 @@
   }
 
   void test_nonConstValueInInitializer_binary_notBool_right() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  final bool a;",
-        "  const A(String p) : a = true && p;",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  final bool a;
+  const A(String p) : a = true && p;
+}''');
     resolve(source);
     assertErrors(source, [
         CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL,
@@ -3016,11 +3490,11 @@
   }
 
   void test_nonConstValueInInitializer_binary_notInt() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  final int a;",
-        "  const A(String p) : a = 5 & p;",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  final int a;
+  const A(String p) : a = 5 & p;
+}''');
     resolve(source);
     assertErrors(source, [
         CompileTimeErrorCode.CONST_EVAL_TYPE_INT,
@@ -3029,11 +3503,11 @@
   }
 
   void test_nonConstValueInInitializer_binary_notNum() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  final int a;",
-        "  const A(String p) : a = 5 + p;",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  final int a;
+  const A(String p) : a = 5 + p;
+}''');
     resolve(source);
     assertErrors(source, [
         CompileTimeErrorCode.CONST_EVAL_TYPE_NUM,
@@ -3042,53 +3516,53 @@
   }
 
   void test_nonConstValueInInitializer_field() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  static int C;",
-        "  final int a;",
-        "  const A() : a = C;",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  static int C;
+  final int a;
+  const A() : a = C;
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER]);
     verify([source]);
   }
 
   void test_nonConstValueInInitializer_instanceCreation() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  A();",
-        "}",
-        "class B {",
-        "  const B() : a = new A();",
-        "  final a;",
-        "}",
-        "var b = const B();"]));
+    Source source = addSource(r'''
+class A {
+  A();
+}
+class B {
+  const B() : a = new A();
+  final a;
+}
+var b = const B();''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER]);
     verify([source]);
   }
 
   void test_nonConstValueInInitializer_redirecting() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  static var C;",
-        "  const A.named(p);",
-        "  const A() : this.named(C);",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  static var C;
+  const A.named(p);
+  const A() : this.named(C);
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER]);
     verify([source]);
   }
 
   void test_nonConstValueInInitializer_super() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  const A(p);",
-        "}",
-        "class B extends A {",
-        "  static var C;",
-        "  const B() : super(C);",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  const A(p);
+}
+class B extends A {
+  static var C;
+  const B() : super(C);
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER]);
     verify([source]);
@@ -3096,199 +3570,239 @@
 
   void test_nonConstValueInInitializerFromDeferredLibrary_field() {
     resolveWithAndWithoutExperimental(<String> [
-        EngineTestCase.createSource(["library lib1;", "const int c = 1;"]),
-        EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "class A {",
-        "  final int x;",
-        "  const A() : x = a.c;",
-        "}"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER_FROM_DEFERRED_LIBRARY]);
+        r'''
+library lib1;
+const int c = 1;''',
+        r'''
+library root;
+import 'lib1.dart' deferred as a;
+class A {
+  final int x;
+  const A() : x = a.c;
+}'''], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER_FROM_DEFERRED_LIBRARY]);
   }
 
   void test_nonConstValueInInitializerFromDeferredLibrary_field_nested() {
     resolveWithAndWithoutExperimental(<String> [
-        EngineTestCase.createSource(["library lib1;", "const int c = 1;"]),
-        EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "class A {",
-        "  final int x;",
-        "  const A() : x = a.c + 1;",
-        "}"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER_FROM_DEFERRED_LIBRARY]);
+        r'''
+library lib1;
+const int c = 1;''',
+        r'''
+library root;
+import 'lib1.dart' deferred as a;
+class A {
+  final int x;
+  const A() : x = a.c + 1;
+}'''], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER_FROM_DEFERRED_LIBRARY]);
   }
 
   void test_nonConstValueInInitializerFromDeferredLibrary_redirecting() {
     resolveWithAndWithoutExperimental(<String> [
-        EngineTestCase.createSource(["library lib1;", "const int c = 1;"]),
-        EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "class A {",
-        "  const A.named(p);",
-        "  const A() : this.named(a.c);",
-        "}"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER_FROM_DEFERRED_LIBRARY]);
+        r'''
+library lib1;
+const int c = 1;''',
+        r'''
+library root;
+import 'lib1.dart' deferred as a;
+class A {
+  const A.named(p);
+  const A() : this.named(a.c);
+}'''], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER_FROM_DEFERRED_LIBRARY]);
   }
 
   void test_nonConstValueInInitializerFromDeferredLibrary_super() {
     resolveWithAndWithoutExperimental(<String> [
-        EngineTestCase.createSource(["library lib1;", "const int c = 1;"]),
-        EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "class A {",
-        "  const A(p);",
-        "}",
-        "class B extends A {",
-        "  const B() : super(a.c);",
-        "}"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER_FROM_DEFERRED_LIBRARY]);
+        r'''
+library lib1;
+const int c = 1;''',
+        r'''
+library root;
+import 'lib1.dart' deferred as a;
+class A {
+  const A(p);
+}
+class B extends A {
+  const B() : super(a.c);
+}'''], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER_FROM_DEFERRED_LIBRARY]);
   }
 
   void test_nonGenerativeConstructor_explicit() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  factory A.named() {}",
-        "}",
-        "class B extends A {",
-        "  B() : super.named();",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  factory A.named() {}
+}
+class B extends A {
+  B() : super.named();
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR]);
     verify([source]);
   }
 
   void test_nonGenerativeConstructor_implicit() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  factory A() {}",
-        "}",
-        "class B extends A {",
-        "  B();",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  factory A() {}
+}
+class B extends A {
+  B();
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR]);
     verify([source]);
   }
 
   void test_nonGenerativeConstructor_implicit2() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  factory A() {}",
-        "}",
-        "class B extends A {",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  factory A() {}
+}
+class B extends A {
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR]);
     verify([source]);
   }
 
   void test_notEnoughRequiredArguments_const() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  const A(int p);",
-        "}",
-        "main() {",
-        "  const A();",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  const A(int p);
+}
+main() {
+  const A();
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.NOT_ENOUGH_REQUIRED_ARGUMENTS]);
     verify([source]);
   }
 
   void test_notEnoughRequiredArguments_const_super() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  const A(int p);",
-        "}",
-        "class B extends A {",
-        "  const B() : super();",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  const A(int p);
+}
+class B extends A {
+  const B() : super();
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.NOT_ENOUGH_REQUIRED_ARGUMENTS]);
     verify([source]);
   }
 
   void test_optionalParameterInOperator_named() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  operator +({p}) {}", "}"]));
+    Source source = addSource(r'''
+class A {
+  operator +({p}) {}
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.OPTIONAL_PARAMETER_IN_OPERATOR]);
     verify([source]);
   }
 
   void test_optionalParameterInOperator_positional() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  operator +([p]) {}", "}"]));
+    Source source = addSource(r'''
+class A {
+  operator +([p]) {}
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.OPTIONAL_PARAMETER_IN_OPERATOR]);
     verify([source]);
   }
 
   void test_partOfNonPart() {
-    Source source = addSource(EngineTestCase.createSource(["library l1;", "part 'l2.dart';"]));
-    addNamedSource("/l2.dart", EngineTestCase.createSource(["library l2;"]));
+    Source source = addSource(r'''
+library l1;
+part 'l2.dart';''');
+    addNamedSource("/l2.dart", "library l2;");
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.PART_OF_NON_PART]);
     verify([source]);
   }
 
   void test_prefixCollidesWithTopLevelMembers_functionTypeAlias() {
-    addNamedSource("/lib.dart", EngineTestCase.createSource(["library lib;", "class A{}"]));
-    Source source = addSource(EngineTestCase.createSource(["import 'lib.dart' as p;", "typedef p();", "p.A a;"]));
+    addNamedSource("/lib.dart", r'''
+library lib;
+class A{}''');
+    Source source = addSource(r'''
+import 'lib.dart' as p;
+typedef p();
+p.A a;''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER]);
     verify([source]);
   }
 
   void test_prefixCollidesWithTopLevelMembers_topLevelFunction() {
-    addNamedSource("/lib.dart", EngineTestCase.createSource(["library lib;", "class A{}"]));
-    Source source = addSource(EngineTestCase.createSource(["import 'lib.dart' as p;", "p() {}", "p.A a;"]));
+    addNamedSource("/lib.dart", r'''
+library lib;
+class A{}''');
+    Source source = addSource(r'''
+import 'lib.dart' as p;
+p() {}
+p.A a;''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER]);
     verify([source]);
   }
 
   void test_prefixCollidesWithTopLevelMembers_topLevelVariable() {
-    addNamedSource("/lib.dart", EngineTestCase.createSource(["library lib;", "class A{}"]));
-    Source source = addSource(EngineTestCase.createSource(["import 'lib.dart' as p;", "var p = null;", "p.A a;"]));
+    addNamedSource("/lib.dart", r'''
+library lib;
+class A{}''');
+    Source source = addSource(r'''
+import 'lib.dart' as p;
+var p = null;
+p.A a;''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER]);
     verify([source]);
   }
 
   void test_prefixCollidesWithTopLevelMembers_type() {
-    addNamedSource("/lib.dart", EngineTestCase.createSource(["library lib;", "class A{}"]));
-    Source source = addSource(EngineTestCase.createSource(["import 'lib.dart' as p;", "class p {}", "p.A a;"]));
+    addNamedSource("/lib.dart", r'''
+library lib;
+class A{}''');
+    Source source = addSource(r'''
+import 'lib.dart' as p;
+class p {}
+p.A a;''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER]);
     verify([source]);
   }
 
   void test_privateOptionalParameter() {
-    Source source = addSource(EngineTestCase.createSource(["f({var _p}) {}"]));
+    Source source = addSource("f({var _p}) {}");
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.PRIVATE_OPTIONAL_PARAMETER]);
     verify([source]);
   }
 
   void test_privateOptionalParameter_fieldFormal() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  var _p;", "  A({this._p: 0});", "}"]));
+    Source source = addSource(r'''
+class A {
+  var _p;
+  A({this._p: 0});
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.PRIVATE_OPTIONAL_PARAMETER]);
     verify([source]);
   }
 
   void test_privateOptionalParameter_withDefaultValue() {
-    Source source = addSource(EngineTestCase.createSource(["f({_p : 0}) {}"]));
+    Source source = addSource("f({_p : 0}) {}");
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.PRIVATE_OPTIONAL_PARAMETER]);
     verify([source]);
   }
 
   void test_recursiveConstructorRedirect() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  A.a() : this.b();",
-        "  A.b() : this.a();",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  A.a() : this.b();
+  A.b() : this.a();
+}''');
     resolve(source);
     assertErrors(source, [
         CompileTimeErrorCode.RECURSIVE_CONSTRUCTOR_REDIRECT,
@@ -3297,23 +3811,26 @@
   }
 
   void test_recursiveConstructorRedirect_directSelfReference() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  A() : this();", "}"]));
+    Source source = addSource(r'''
+class A {
+  A() : this();
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.RECURSIVE_CONSTRUCTOR_REDIRECT]);
     verify([source]);
   }
 
   void test_recursiveFactoryRedirect() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A implements B {",
-        "  factory A() = C;",
-        "}",
-        "class B implements C {",
-        "  factory B() = A;",
-        "}",
-        "class C implements A {",
-        "  factory C() = B;",
-        "}"]));
+    Source source = addSource(r'''
+class A implements B {
+  factory A() = C;
+}
+class B implements C {
+  factory B() = A;
+}
+class C implements A {
+  factory C() = B;
+}''');
     resolve(source);
     assertErrors(source, [
         CompileTimeErrorCode.RECURSIVE_FACTORY_REDIRECT,
@@ -3326,23 +3843,26 @@
   }
 
   void test_recursiveFactoryRedirect_directSelfReference() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  factory A() = A;", "}"]));
+    Source source = addSource(r'''
+class A {
+  factory A() = A;
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.RECURSIVE_FACTORY_REDIRECT]);
     verify([source]);
   }
 
   void test_recursiveFactoryRedirect_generic() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A<T> implements B<T> {",
-        "  factory A() = C;",
-        "}",
-        "class B<T> implements C<T> {",
-        "  factory B() = A;",
-        "}",
-        "class C<T> implements A<T> {",
-        "  factory C() = B;",
-        "}"]));
+    Source source = addSource(r'''
+class A<T> implements B<T> {
+  factory A() = C;
+}
+class B<T> implements C<T> {
+  factory B() = A;
+}
+class C<T> implements A<T> {
+  factory C() = B;
+}''');
     resolve(source);
     assertErrors(source, [
         CompileTimeErrorCode.RECURSIVE_FACTORY_REDIRECT,
@@ -3355,16 +3875,16 @@
   }
 
   void test_recursiveFactoryRedirect_named() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A implements B {",
-        "  factory A.nameA() = C.nameC;",
-        "}",
-        "class B implements C {",
-        "  factory B.nameB() = A.nameA;",
-        "}",
-        "class C implements A {",
-        "  factory C.nameC() = B.nameB;",
-        "}"]));
+    Source source = addSource(r'''
+class A implements B {
+  factory A.nameA() = C.nameC;
+}
+class B implements C {
+  factory B.nameB() = A.nameA;
+}
+class C implements A {
+  factory C.nameC() = B.nameB;
+}''');
     resolve(source);
     assertErrors(source, [
         CompileTimeErrorCode.RECURSIVE_FACTORY_REDIRECT,
@@ -3381,16 +3901,16 @@
    * not the part of a cycle.
    */
   void test_recursiveFactoryRedirect_outsideCycle() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  factory A() = C;",
-        "}",
-        "class B implements C {",
-        "  factory B() = C;",
-        "}",
-        "class C implements A, B {",
-        "  factory C() = B;",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  factory A() = C;
+}
+class B implements C {
+  factory B() = C;
+}
+class C implements A, B {
+  factory C() = B;
+}''');
     resolve(source);
     assertErrors(source, [
         CompileTimeErrorCode.RECURSIVE_FACTORY_REDIRECT,
@@ -3401,7 +3921,9 @@
   }
 
   void test_recursiveInterfaceInheritance_extends() {
-    Source source = addSource(EngineTestCase.createSource(["class A extends B {}", "class B extends A {}"]));
+    Source source = addSource(r'''
+class A extends B {}
+class B extends A {}''');
     resolve(source);
     assertErrors(source, [
         CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE,
@@ -3410,7 +3932,9 @@
   }
 
   void test_recursiveInterfaceInheritance_extends_implements() {
-    Source source = addSource(EngineTestCase.createSource(["class A extends B {}", "class B implements A {}"]));
+    Source source = addSource(r'''
+class A extends B {}
+class B implements A {}''');
     resolve(source);
     assertErrors(source, [
         CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE,
@@ -3419,7 +3943,9 @@
   }
 
   void test_recursiveInterfaceInheritance_implements() {
-    Source source = addSource(EngineTestCase.createSource(["class A implements B {}", "class B implements A {}"]));
+    Source source = addSource(r'''
+class A implements B {}
+class B implements A {}''');
     resolve(source);
     assertErrors(source, [
         CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE,
@@ -3428,9 +3954,9 @@
   }
 
   void test_recursiveInterfaceInheritance_mixin() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class M1 = Object with M2;",
-        "class M2 = Object with M1;"]));
+    Source source = addSource(r'''
+class M1 = Object with M2;
+class M2 = Object with M1;''');
     resolve(source);
     assertErrors(source, [
         CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE,
@@ -3439,19 +3965,19 @@
   }
 
   void test_recursiveInterfaceInheritance_tail() {
-    Source source = addSource(EngineTestCase.createSource([
-        "abstract class A implements A {}",
-        "class B implements A {}"]));
+    Source source = addSource(r'''
+abstract class A implements A {}
+class B implements A {}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS]);
     verify([source]);
   }
 
   void test_recursiveInterfaceInheritance_tail2() {
-    Source source = addSource(EngineTestCase.createSource([
-        "abstract class A implements B {}",
-        "abstract class B implements A {}",
-        "class C implements A {}"]));
+    Source source = addSource(r'''
+abstract class A implements B {}
+abstract class B implements A {}
+class C implements A {}''');
     resolve(source);
     assertErrors(source, [
         CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE,
@@ -3460,11 +3986,11 @@
   }
 
   void test_recursiveInterfaceInheritance_tail3() {
-    Source source = addSource(EngineTestCase.createSource([
-        "abstract class A implements B {}",
-        "abstract class B implements C {}",
-        "abstract class C implements A {}",
-        "class D implements A {}"]));
+    Source source = addSource(r'''
+abstract class A implements B {}
+abstract class B implements C {}
+abstract class C implements A {}
+class D implements A {}''');
     resolve(source);
     assertErrors(source, [
         CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE,
@@ -3474,168 +4000,193 @@
   }
 
   void test_recursiveInterfaceInheritanceBaseCaseExtends() {
-    Source source = addSource(EngineTestCase.createSource(["class A extends A {}"]));
+    Source source = addSource("class A extends A {}");
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS]);
     verify([source]);
   }
 
   void test_recursiveInterfaceInheritanceBaseCaseImplements() {
-    Source source = addSource(EngineTestCase.createSource(["class A implements A {}"]));
+    Source source = addSource("class A implements A {}");
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS]);
     verify([source]);
   }
 
   void test_recursiveInterfaceInheritanceBaseCaseImplements_typeAlias() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class M {}",
-        "class B = A with M implements B;"]));
+    Source source = addSource(r'''
+class A {}
+class M {}
+class B = A with M implements B;''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS]);
     verify([source]);
   }
 
   void test_recursiveInterfaceInheritanceBaseCaseWith() {
-    Source source = addSource(EngineTestCase.createSource(["class M = Object with M;"]));
+    Source source = addSource("class M = Object with M;");
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_WITH]);
     verify([source]);
   }
 
   void test_redirectGenerativeToMissingConstructor() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  A() : this.noSuchConstructor();", "}"]));
+    Source source = addSource(r'''
+class A {
+  A() : this.noSuchConstructor();
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.REDIRECT_GENERATIVE_TO_MISSING_CONSTRUCTOR]);
   }
 
   void test_redirectGenerativeToNonGenerativeConstructor() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  A() : this.x();",
-        "  factory A.x() => null;",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  A() : this.x();
+  factory A.x() => null;
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.REDIRECT_GENERATIVE_TO_NON_GENERATIVE_CONSTRUCTOR]);
     verify([source]);
   }
 
   void test_redirectToMissingConstructor_named() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A implements B{",
-        "  A() {}",
-        "}",
-        "class B {",
-        "  const factory B() = A.name;",
-        "}"]));
+    Source source = addSource(r'''
+class A implements B{
+  A() {}
+}
+class B {
+  const factory B() = A.name;
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.REDIRECT_TO_MISSING_CONSTRUCTOR]);
   }
 
   void test_redirectToMissingConstructor_unnamed() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A implements B{",
-        "  A.name() {}",
-        "}",
-        "class B {",
-        "  const factory B() = A;",
-        "}"]));
+    Source source = addSource(r'''
+class A implements B{
+  A.name() {}
+}
+class B {
+  const factory B() = A;
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.REDIRECT_TO_MISSING_CONSTRUCTOR]);
   }
 
   void test_redirectToNonClass_notAType() {
-    Source source = addSource(EngineTestCase.createSource(["int A;", "class B {", "  const factory B() = A;", "}"]));
+    Source source = addSource(r'''
+int A;
+class B {
+  const factory B() = A;
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.REDIRECT_TO_NON_CLASS]);
     verify([source]);
   }
 
   void test_redirectToNonClass_undefinedIdentifier() {
-    Source source = addSource(EngineTestCase.createSource(["class B {", "  const factory B() = A;", "}"]));
+    Source source = addSource(r'''
+class B {
+  const factory B() = A;
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.REDIRECT_TO_NON_CLASS]);
     verify([source]);
   }
 
   void test_redirectToNonConstConstructor() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  A.a() {}",
-        "  const factory A.b() = A.a;",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  A.a() {}
+  const factory A.b() = A.a;
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.REDIRECT_TO_NON_CONST_CONSTRUCTOR]);
     verify([source]);
   }
 
   void test_referencedBeforeDeclaration_hideInBlock_function() {
-    Source source = addSource(EngineTestCase.createSource([
-        "var v = 1;",
-        "main() {",
-        "  print(v);",
-        "  v() {}",
-        "}",
-        "print(x) {}"]));
+    Source source = addSource(r'''
+var v = 1;
+main() {
+  print(v);
+  v() {}
+}
+print(x) {}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.REFERENCED_BEFORE_DECLARATION]);
   }
 
   void test_referencedBeforeDeclaration_hideInBlock_local() {
-    Source source = addSource(EngineTestCase.createSource([
-        "var v = 1;",
-        "main() {",
-        "  print(v);",
-        "  var v = 2;",
-        "}",
-        "print(x) {}"]));
+    Source source = addSource(r'''
+var v = 1;
+main() {
+  print(v);
+  var v = 2;
+}
+print(x) {}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.REFERENCED_BEFORE_DECLARATION]);
   }
 
   void test_referencedBeforeDeclaration_hideInBlock_subBlock() {
-    Source source = addSource(EngineTestCase.createSource([
-        "var v = 1;",
-        "main() {",
-        "  {",
-        "    print(v);",
-        "  }",
-        "  var v = 2;",
-        "}",
-        "print(x) {}"]));
+    Source source = addSource(r'''
+var v = 1;
+main() {
+  {
+    print(v);
+  }
+  var v = 2;
+}
+print(x) {}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.REFERENCED_BEFORE_DECLARATION]);
   }
 
   void test_referencedBeforeDeclaration_inInitializer_closure() {
-    Source source = addSource(EngineTestCase.createSource(["main() {", "  var v = () => v;", "}"]));
+    Source source = addSource(r'''
+main() {
+  var v = () => v;
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.REFERENCED_BEFORE_DECLARATION]);
   }
 
   void test_referencedBeforeDeclaration_inInitializer_directly() {
-    Source source = addSource(EngineTestCase.createSource(["main() {", "  var v = v;", "}"]));
+    Source source = addSource(r'''
+main() {
+  var v = v;
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.REFERENCED_BEFORE_DECLARATION]);
   }
 
   void test_rethrowOutsideCatch() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  rethrow;", "}"]));
+    Source source = addSource(r'''
+f() {
+  rethrow;
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.RETHROW_OUTSIDE_CATCH]);
     verify([source]);
   }
 
   void test_returnInGenerativeConstructor() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  A() { return 0; }", "}"]));
+    Source source = addSource(r'''
+class A {
+  A() { return 0; }
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.RETURN_IN_GENERATIVE_CONSTRUCTOR]);
     verify([source]);
   }
 
   void test_returnInGenerativeConstructor_expressionFunctionBody() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  A() => null;", "}"]));
+    Source source = addSource(r'''
+class A {
+  A() => null;
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.RETURN_IN_GENERATIVE_CONSTRUCTOR]);
     verify([source]);
@@ -3643,7 +4194,10 @@
 
   void test_returnInGenerator_asyncStar() {
     resetWithAsync();
-    Source source = addSource(EngineTestCase.createSource(["f() async* {", "  return 0;", "}"]));
+    Source source = addSource(r'''
+f() async* {
+  return 0;
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.RETURN_IN_GENERATOR]);
     verify([source]);
@@ -3651,7 +4205,10 @@
 
   void test_returnInGenerator_syncStar() {
     resetWithAsync();
-    Source source = addSource(EngineTestCase.createSource(["f() sync* {", "  return 0;", "}"]));
+    Source source = addSource(r'''
+f() sync* {
+  return 0;
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.RETURN_IN_GENERATOR]);
     verify([source]);
@@ -3659,135 +4216,142 @@
 
   void test_sharedDeferredPrefix() {
     resolveWithAndWithoutExperimental(<String> [
-        EngineTestCase.createSource(["library lib1;", "f1() {}"]),
-        EngineTestCase.createSource(["library lib2;", "f2() {}"]),
-        EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as lib;",
-        "import 'lib2.dart' as lib;",
-        "main() { lib.f1(); lib.f2(); }"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.SHARED_DEFERRED_PREFIX]);
+        r'''
+library lib1;
+f1() {}''',
+        r'''
+library lib2;
+f2() {}''',
+        r'''
+library root;
+import 'lib1.dart' deferred as lib;
+import 'lib2.dart' as lib;
+main() { lib.f1(); lib.f2(); }'''], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.SHARED_DEFERRED_PREFIX]);
   }
 
   void test_superInInvalidContext_binaryExpression() {
-    Source source = addSource(EngineTestCase.createSource(["var v = super + 0;"]));
+    Source source = addSource("var v = super + 0;");
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT]);
     // no verify(), 'super.v' is not resolved
   }
 
   void test_superInInvalidContext_constructorFieldInitializer() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  m() {}",
-        "}",
-        "class B extends A {",
-        "  var f;",
-        "  B() : f = super.m();",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  m() {}
+}
+class B extends A {
+  var f;
+  B() : f = super.m();
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT]);
     // no verify(), 'super.m' is not resolved
   }
 
   void test_superInInvalidContext_factoryConstructor() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  m() {}",
-        "}",
-        "class B extends A {",
-        "  factory B() {",
-        "    super.m();",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  m() {}
+}
+class B extends A {
+  factory B() {
+    super.m();
+  }
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT]);
     // no verify(), 'super.m' is not resolved
   }
 
   void test_superInInvalidContext_instanceVariableInitializer() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  var a;",
-        "}",
-        "class B extends A {",
-        " var b = super.a;",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  var a;
+}
+class B extends A {
+ var b = super.a;
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT]);
     // no verify(), 'super.a' is not resolved
   }
 
   void test_superInInvalidContext_staticMethod() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  static m() {}",
-        "}",
-        "class B extends A {",
-        "  static n() { return super.m(); }",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  static m() {}
+}
+class B extends A {
+  static n() { return super.m(); }
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT]);
     // no verify(), 'super.m' is not resolved
   }
 
   void test_superInInvalidContext_staticVariableInitializer() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  static int a = 0;",
-        "}",
-        "class B extends A {",
-        "  static int b = super.a;",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  static int a = 0;
+}
+class B extends A {
+  static int b = super.a;
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT]);
     // no verify(), 'super.a' is not resolved
   }
 
   void test_superInInvalidContext_topLevelFunction() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  super.f();", "}"]));
+    Source source = addSource(r'''
+f() {
+  super.f();
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT]);
     // no verify(), 'super.f' is not resolved
   }
 
   void test_superInInvalidContext_topLevelVariableInitializer() {
-    Source source = addSource(EngineTestCase.createSource(["var v = super.y;"]));
+    Source source = addSource("var v = super.y;");
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT]);
     // no verify(), 'super.y' is not resolved
   }
 
   void test_superInRedirectingConstructor_redirectionSuper() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B {",
-        "  B() : this.name(), super();",
-        "  B.name() {}",
-        "}"]));
+    Source source = addSource(r'''
+class A {}
+class B {
+  B() : this.name(), super();
+  B.name() {}
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.SUPER_IN_REDIRECTING_CONSTRUCTOR]);
     verify([source]);
   }
 
   void test_superInRedirectingConstructor_superRedirection() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B {",
-        "  B() : super(), this.name();",
-        "  B.name() {}",
-        "}"]));
+    Source source = addSource(r'''
+class A {}
+class B {
+  B() : super(), this.name();
+  B.name() {}
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.SUPER_IN_REDIRECTING_CONSTRUCTOR]);
     verify([source]);
   }
 
   void test_symbol_constructor_badArgs() {
-    Source source = addSource(EngineTestCase.createSource([
-        "var s1 = const Symbol('3');",
-        "var s2 = const Symbol(3);",
-        "var s3 = const Symbol();",
-        "var s4 = const Symbol('x', 'y');",
-        "var s5 = const Symbol('x', foo: 'x');"]));
+    Source source = addSource(r'''
+var s1 = const Symbol('3');
+var s2 = const Symbol(3);
+var s3 = const Symbol();
+var s4 = const Symbol('x', 'y');
+var s5 = const Symbol('x', foo: 'x');''');
     resolve(source);
     assertErrors(source, [
         CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION,
@@ -3800,12 +4364,12 @@
   }
 
   void test_typeAliasCannotReferenceItself_11987() {
-    Source source = addSource(EngineTestCase.createSource([
-        "typedef void F(List<G> l);",
-        "typedef void G(List<F> l);",
-        "main() {",
-        "  F foo(G g) => g;",
-        "}"]));
+    Source source = addSource(r'''
+typedef void F(List<G> l);
+typedef void G(List<F> l);
+main() {
+  F foo(G g) => g;
+}''');
     resolve(source);
     assertErrors(source, [
         CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF,
@@ -3815,54 +4379,56 @@
   }
 
   void test_typeAliasCannotReferenceItself_parameterType_named() {
-    Source source = addSource(EngineTestCase.createSource(["typedef A({A a});"]));
+    Source source = addSource("typedef A({A a});");
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF]);
     verify([source]);
   }
 
   void test_typeAliasCannotReferenceItself_parameterType_positional() {
-    Source source = addSource(EngineTestCase.createSource(["typedef A([A a]);"]));
+    Source source = addSource("typedef A([A a]);");
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF]);
     verify([source]);
   }
 
   void test_typeAliasCannotReferenceItself_parameterType_required() {
-    Source source = addSource(EngineTestCase.createSource(["typedef A(A a);"]));
+    Source source = addSource("typedef A(A a);");
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF]);
     verify([source]);
   }
 
   void test_typeAliasCannotReferenceItself_parameterType_typeArgument() {
-    Source source = addSource(EngineTestCase.createSource(["typedef A(List<A> a);"]));
+    Source source = addSource("typedef A(List<A> a);");
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF]);
     verify([source]);
   }
 
   void test_typeAliasCannotReferenceItself_returnClass_withTypeAlias() {
-    Source source = addSource(EngineTestCase.createSource([
-        "typedef C A();",
-        "typedef A B();",
-        "class C {",
-        "  B a;",
-        "}"]));
+    Source source = addSource(r'''
+typedef C A();
+typedef A B();
+class C {
+  B a;
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF]);
     verify([source]);
   }
 
   void test_typeAliasCannotReferenceItself_returnType() {
-    Source source = addSource(EngineTestCase.createSource(["typedef A A();"]));
+    Source source = addSource("typedef A A();");
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF]);
     verify([source]);
   }
 
   void test_typeAliasCannotReferenceItself_returnType_indirect() {
-    Source source = addSource(EngineTestCase.createSource(["typedef B A();", "typedef A B();"]));
+    Source source = addSource(r'''
+typedef B A();
+typedef A B();''');
     resolve(source);
     assertErrors(source, [
         CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF,
@@ -3871,102 +4437,105 @@
   }
 
   void test_typeAliasCannotReferenceItself_typeVariableBounds() {
-    Source source = addSource(EngineTestCase.createSource(["typedef A<T extends A>();"]));
+    Source source = addSource("typedef A<T extends A>();");
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF]);
     verify([source]);
   }
 
   void test_typeArgumentNotMatchingBounds_const() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B {}",
-        "class G<E extends A> {",
-        "  const G();",
-        "}",
-        "f() { return const G<B>(); }"]));
+    Source source = addSource(r'''
+class A {}
+class B {}
+class G<E extends A> {
+  const G();
+}
+f() { return const G<B>(); }''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
     verify([source]);
   }
 
   void test_undefinedClass_const() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  return const A();", "}"]));
+    Source source = addSource(r'''
+f() {
+  return const A();
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.UNDEFINED_CLASS]);
     verify([source]);
   }
 
   void test_undefinedConstructorInInitializer_explicit_named() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B extends A {",
-        "  B() : super.named();",
-        "}"]));
+    Source source = addSource(r'''
+class A {}
+class B extends A {
+  B() : super.named();
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER]);
     // no verify(), "super.named()" is not resolved
   }
 
   void test_undefinedConstructorInInitializer_explicit_unnamed() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  A.named() {}",
-        "}",
-        "class B extends A {",
-        "  B() : super();",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  A.named() {}
+}
+class B extends A {
+  B() : super();
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT]);
     verify([source]);
   }
 
   void test_undefinedConstructorInInitializer_implicit() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  A.named() {}",
-        "}",
-        "class B extends A {",
-        "  B();",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  A.named() {}
+}
+class B extends A {
+  B();
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT]);
     verify([source]);
   }
 
   void test_undefinedNamedParameter() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  const A();",
-        "}",
-        "main() {",
-        "  const A(p: 0);",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  const A();
+}
+main() {
+  const A(p: 0);
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.UNDEFINED_NAMED_PARAMETER]);
     // no verify(), 'p' is not resolved
   }
 
   void test_uriDoesNotExist_export() {
-    Source source = addSource(EngineTestCase.createSource(["export 'unknown.dart';"]));
+    Source source = addSource("export 'unknown.dart';");
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.URI_DOES_NOT_EXIST]);
   }
 
   void test_uriDoesNotExist_import() {
-    Source source = addSource(EngineTestCase.createSource(["import 'unknown.dart';"]));
+    Source source = addSource("import 'unknown.dart';");
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.URI_DOES_NOT_EXIST]);
   }
 
   void test_uriDoesNotExist_part() {
-    Source source = addSource(EngineTestCase.createSource(["part 'unknown.dart';"]));
+    Source source = addSource("part 'unknown.dart';");
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.URI_DOES_NOT_EXIST]);
   }
 
   void test_uriWithInterpolation_constant() {
-    Source source = addSource(EngineTestCase.createSource(["import 'stuff_\$platform.dart';"]));
+    Source source = addSource("import 'stuff_\$platform.dart';");
     resolve(source);
     assertErrors(source, [
         CompileTimeErrorCode.URI_WITH_INTERPOLATION,
@@ -3975,14 +4544,19 @@
   }
 
   void test_uriWithInterpolation_nonConstant() {
-    Source source = addSource(EngineTestCase.createSource(["library lib;", "part '\${'a'}.dart';"]));
+    Source source = addSource(r'''
+library lib;
+part '${'a'}.dart';''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.URI_WITH_INTERPOLATION]);
     // We cannot verify resolution with an unresolvable URI: '${'a'}.dart'
   }
 
   void test_wrongNumberOfParametersForOperator_minus() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  operator -(a, b) {}", "}"]));
+    Source source = addSource(r'''
+class A {
+  operator -(a, b) {}
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS]);
     verify([source]);
@@ -4041,35 +4615,47 @@
   }
 
   void test_wrongNumberOfParametersForSetter_method_named() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  set x({p}) {}", "}"]));
+    Source source = addSource(r'''
+class A {
+  set x({p}) {}
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER]);
     verify([source]);
   }
 
   void test_wrongNumberOfParametersForSetter_method_optional() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  set x([p]) {}", "}"]));
+    Source source = addSource(r'''
+class A {
+  set x([p]) {}
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER]);
     verify([source]);
   }
 
   void test_wrongNumberOfParametersForSetter_method_tooFew() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  set x() {}", "}"]));
+    Source source = addSource(r'''
+class A {
+  set x() {}
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER]);
     verify([source]);
   }
 
   void test_wrongNumberOfParametersForSetter_method_tooMany() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  set x(a, b) {}", "}"]));
+    Source source = addSource(r'''
+class A {
+  set x(a, b) {}
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER]);
     verify([source]);
   }
 
   void _check_constEvalThrowsException_binary_null(String expr, bool resolved) {
-    Source source = addSource("const C = ${expr};");
+    Source source = addSource("const C = $expr;");
     resolve(source);
     if (resolved) {
       assertErrors(source, [CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION]);
@@ -4082,11 +4668,11 @@
   }
 
   void _check_constEvalTypeBool_withParameter_binary(String expr) {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  final a;",
-        "  const A(bool p) : a = ${expr};",
-        "}"]));
+    Source source = addSource('''
+class A {
+  final a;
+  const A(bool p) : a = $expr;
+}''');
     resolve(source);
     assertErrors(source, [
         CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL,
@@ -4096,11 +4682,11 @@
   }
 
   void _check_constEvalTypeInt_withParameter_binary(String expr) {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  final a;",
-        "  const A(int p) : a = ${expr};",
-        "}"]));
+    Source source = addSource('''
+class A {
+  final a;
+  const A(int p) : a = $expr;
+}''');
     resolve(source);
     assertErrors(source, [
         CompileTimeErrorCode.CONST_EVAL_TYPE_INT,
@@ -4110,11 +4696,11 @@
   }
 
   void _check_constEvalTypeNum_withParameter_binary(String expr) {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  final a;",
-        "  const A(num p) : a = ${expr};",
-        "}"]));
+    Source source = addSource('''
+class A {
+  final a;
+  const A(num p) : a = $expr;
+}''');
     resolve(source);
     assertErrors(source, [
         CompileTimeErrorCode.CONST_EVAL_TYPE_NUM,
@@ -4124,7 +4710,10 @@
   }
 
   void _check_wrongNumberOfParametersForOperator(String name, String parameters) {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  operator ${name}(${parameters}) {}", "}"]));
+    Source source = addSource('''
+class A {
+  operator $name($parameters) {}
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR]);
     verify([source]);
diff --git a/pkg/analyzer/test/generated/element_test.dart b/pkg/analyzer/test/generated/element_test.dart
index a6c1bf1..7a85c93 100644
--- a/pkg/analyzer/test/generated/element_test.dart
+++ b/pkg/analyzer/test/generated/element_test.dart
@@ -8,12 +8,11 @@
 library engine.element_test;
 
 import 'package:analyzer/src/generated/java_core.dart';
-import 'package:analyzer/src/generated/java_junit.dart';
 import 'package:analyzer/src/generated/source_io.dart';
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/element.dart';
 import 'package:analyzer/src/generated/engine.dart' show AnalysisContext, AnalysisContextImpl;
-import 'package:unittest/unittest.dart' as _ut;
+import 'package:unittest/unittest.dart';
 import 'test_support.dart';
 import 'package:analyzer/src/generated/testing/ast_factory.dart';
 import 'package:analyzer/src/generated/testing/element_factory.dart';
@@ -25,32 +24,32 @@
 class AngularPropertyKindTest extends EngineTestCase {
   void test_ATTR() {
     AngularPropertyKind kind = AngularPropertyKind.ATTR;
-    JUnitTestCase.assertFalse(kind.callsGetter());
-    JUnitTestCase.assertTrue(kind.callsSetter());
+    expect(kind.callsGetter(), isFalse);
+    expect(kind.callsSetter(), isTrue);
   }
 
   void test_CALLBACK() {
     AngularPropertyKind kind = AngularPropertyKind.CALLBACK;
-    JUnitTestCase.assertFalse(kind.callsGetter());
-    JUnitTestCase.assertTrue(kind.callsSetter());
+    expect(kind.callsGetter(), isFalse);
+    expect(kind.callsSetter(), isTrue);
   }
 
   void test_ONE_WAY() {
     AngularPropertyKind kind = AngularPropertyKind.ONE_WAY;
-    JUnitTestCase.assertFalse(kind.callsGetter());
-    JUnitTestCase.assertTrue(kind.callsSetter());
+    expect(kind.callsGetter(), isFalse);
+    expect(kind.callsSetter(), isTrue);
   }
 
   void test_ONE_WAY_ONE_TIME() {
     AngularPropertyKind kind = AngularPropertyKind.ONE_WAY_ONE_TIME;
-    JUnitTestCase.assertFalse(kind.callsGetter());
-    JUnitTestCase.assertTrue(kind.callsSetter());
+    expect(kind.callsGetter(), isFalse);
+    expect(kind.callsSetter(), isTrue);
   }
 
   void test_TWO_WAY() {
     AngularPropertyKind kind = AngularPropertyKind.TWO_WAY;
-    JUnitTestCase.assertTrue(kind.callsGetter());
-    JUnitTestCase.assertTrue(kind.callsSetter());
+    expect(kind.callsGetter(), isTrue);
+    expect(kind.callsSetter(), isTrue);
   }
 }
 
@@ -67,10 +66,10 @@
     List<InterfaceType> supers = elementC.allSupertypes;
     List<InterfaceType> types = new List<InterfaceType>();
     types.addAll(supers);
-    JUnitTestCase.assertTrue(types.contains(typeA));
-    JUnitTestCase.assertTrue(types.contains(typeB));
-    JUnitTestCase.assertTrue(types.contains(typeObject));
-    JUnitTestCase.assertFalse(types.contains(typeC));
+    expect(types.contains(typeA), isTrue);
+    expect(types.contains(typeB), isTrue);
+    expect(types.contains(typeObject), isTrue);
+    expect(types.contains(typeC), isFalse);
   }
 
   void test_getAllSupertypes_mixins() {
@@ -85,10 +84,10 @@
     List<InterfaceType> supers = classC.allSupertypes;
     List<InterfaceType> types = new List<InterfaceType>();
     types.addAll(supers);
-    JUnitTestCase.assertFalse(types.contains(typeA));
-    JUnitTestCase.assertTrue(types.contains(typeB));
-    JUnitTestCase.assertTrue(types.contains(typeObject));
-    JUnitTestCase.assertFalse(types.contains(typeC));
+    expect(types.contains(typeA), isFalse);
+    expect(types.contains(typeB), isTrue);
+    expect(types.contains(typeObject), isTrue);
+    expect(types.contains(typeC), isFalse);
   }
 
   void test_getAllSupertypes_recursive() {
@@ -96,7 +95,7 @@
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
     classA.supertype = classB.type;
     List<InterfaceType> supers = classB.allSupertypes;
-    EngineTestCase.assertLength(1, supers);
+    expect(supers, hasLength(1));
   }
 
   void test_getField() {
@@ -104,9 +103,9 @@
     String fieldName = "f";
     FieldElementImpl field = ElementFactory.fieldElement(fieldName, false, false, false, null);
     classA.fields = <FieldElement> [field];
-    JUnitTestCase.assertSame(field, classA.getField(fieldName));
+    expect(classA.getField(fieldName), same(field));
     // no such field
-    JUnitTestCase.assertSame(null, classA.getField("noSuchField"));
+    expect(classA.getField("noSuchField"), same(null));
   }
 
   void test_getMethod_declared() {
@@ -114,7 +113,7 @@
     String methodName = "m";
     MethodElement method = ElementFactory.methodElement(methodName, null, []);
     classA.methods = <MethodElement> [method];
-    JUnitTestCase.assertSame(method, classA.getMethod(methodName));
+    expect(classA.getMethod(methodName), same(method));
   }
 
   void test_getMethod_undeclared() {
@@ -122,13 +121,15 @@
     String methodName = "m";
     MethodElement method = ElementFactory.methodElement(methodName, null, []);
     classA.methods = <MethodElement> [method];
-    JUnitTestCase.assertNull(classA.getMethod("${methodName}x"));
+    expect(classA.getMethod("${methodName}x"), isNull);
   }
 
   void test_getNode() {
     AnalysisContextHelper contextHelper = new AnalysisContextHelper();
     AnalysisContext context = contextHelper.context;
-    Source source = contextHelper.addSource("/test.dart", EngineTestCase.createSource(["class A {}", "class B {}"]));
+    Source source = contextHelper.addSource("/test.dart", r'''
+class A {}
+class B {}''');
     // prepare CompilationUnitElement
     LibraryElement libraryElement = context.computeLibraryElement(source);
     CompilationUnitElement unitElement = libraryElement.definingCompilationUnit;
@@ -136,70 +137,70 @@
     {
       ClassElement elementA = unitElement.getType("A");
       ClassDeclaration nodeA = elementA.node;
-      JUnitTestCase.assertNotNull(nodeA);
-      JUnitTestCase.assertEquals("A", nodeA.name.name);
-      JUnitTestCase.assertSame(elementA, nodeA.element);
+      expect(nodeA, isNotNull);
+      expect(nodeA.name.name, "A");
+      expect(nodeA.element, same(elementA));
     }
     // B
     {
       ClassElement elementB = unitElement.getType("B");
       ClassDeclaration nodeB = elementB.node;
-      JUnitTestCase.assertNotNull(nodeB);
-      JUnitTestCase.assertEquals("B", nodeB.name.name);
-      JUnitTestCase.assertSame(elementB, nodeB.element);
+      expect(nodeB, isNotNull);
+      expect(nodeB.name.name, "B");
+      expect(nodeB.element, same(elementB));
     }
   }
 
   void test_hasNonFinalField_false_const() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     classA.fields = <FieldElement> [ElementFactory.fieldElement("f", false, false, true, classA.type)];
-    JUnitTestCase.assertFalse(classA.hasNonFinalField);
+    expect(classA.hasNonFinalField, isFalse);
   }
 
   void test_hasNonFinalField_false_final() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     classA.fields = <FieldElement> [ElementFactory.fieldElement("f", false, true, false, classA.type)];
-    JUnitTestCase.assertFalse(classA.hasNonFinalField);
+    expect(classA.hasNonFinalField, isFalse);
   }
 
   void test_hasNonFinalField_false_recursive() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
     classA.supertype = classB.type;
-    JUnitTestCase.assertFalse(classA.hasNonFinalField);
+    expect(classA.hasNonFinalField, isFalse);
   }
 
   void test_hasNonFinalField_true_immediate() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     classA.fields = <FieldElement> [ElementFactory.fieldElement("f", false, false, false, classA.type)];
-    JUnitTestCase.assertTrue(classA.hasNonFinalField);
+    expect(classA.hasNonFinalField, isTrue);
   }
 
   void test_hasNonFinalField_true_inherited() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
     classA.fields = <FieldElement> [ElementFactory.fieldElement("f", false, false, false, classA.type)];
-    JUnitTestCase.assertTrue(classB.hasNonFinalField);
+    expect(classB.hasNonFinalField, isTrue);
   }
 
   void test_hasStaticMember_false_empty() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     // no members
-    JUnitTestCase.assertFalse(classA.hasStaticMember);
+    expect(classA.hasStaticMember, isFalse);
   }
 
   void test_hasStaticMember_false_instanceMethod() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     MethodElement method = ElementFactory.methodElement("foo", null, []);
     classA.methods = <MethodElement> [method];
-    JUnitTestCase.assertFalse(classA.hasStaticMember);
+    expect(classA.hasStaticMember, isFalse);
   }
 
   void test_hasStaticMember_instanceGetter() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     PropertyAccessorElement getter = ElementFactory.getterElement("foo", false, null);
     classA.accessors = <PropertyAccessorElement> [getter];
-    JUnitTestCase.assertFalse(classA.hasStaticMember);
+    expect(classA.hasStaticMember, isFalse);
   }
 
   void test_hasStaticMember_true_getter() {
@@ -208,7 +209,7 @@
     classA.accessors = <PropertyAccessorElement> [getter];
     // "foo" is static
     getter.static = true;
-    JUnitTestCase.assertTrue(classA.hasStaticMember);
+    expect(classA.hasStaticMember, isTrue);
   }
 
   void test_hasStaticMember_true_method() {
@@ -217,7 +218,7 @@
     classA.methods = <MethodElement> [method];
     // "foo" is static
     method.static = true;
-    JUnitTestCase.assertTrue(classA.hasStaticMember);
+    expect(classA.hasStaticMember, isTrue);
   }
 
   void test_hasStaticMember_true_setter() {
@@ -226,7 +227,7 @@
     classA.accessors = <PropertyAccessorElement> [setter];
     // "foo" is static
     setter.static = true;
-    JUnitTestCase.assertTrue(classA.hasStaticMember);
+    expect(classA.hasStaticMember, isTrue);
   }
 
   void test_lookUpConcreteMethod_declared() {
@@ -239,7 +240,7 @@
     MethodElement method = ElementFactory.methodElement(methodName, null, []);
     classA.methods = <MethodElement> [method];
     (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA];
-    JUnitTestCase.assertSame(method, classA.lookUpConcreteMethod(methodName, library));
+    expect(classA.lookUpConcreteMethod(methodName, library), same(method));
   }
 
   void test_lookUpConcreteMethod_declaredAbstract() {
@@ -253,7 +254,7 @@
     method.abstract = true;
     classA.methods = <MethodElement> [method];
     (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA];
-    JUnitTestCase.assertNull(classA.lookUpConcreteMethod(methodName, library));
+    expect(classA.lookUpConcreteMethod(methodName, library), isNull);
   }
 
   void test_lookUpConcreteMethod_declaredAbstractAndInherited() {
@@ -273,7 +274,7 @@
     method.abstract = true;
     classB.methods = <MethodElement> [method];
     (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA, classB];
-    JUnitTestCase.assertSame(inheritedMethod, classB.lookUpConcreteMethod(methodName, library));
+    expect(classB.lookUpConcreteMethod(methodName, library), same(inheritedMethod));
   }
 
   void test_lookUpConcreteMethod_declaredAndInherited() {
@@ -292,7 +293,7 @@
     MethodElement method = ElementFactory.methodElement(methodName, null, []);
     classB.methods = <MethodElement> [method];
     (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA, classB];
-    JUnitTestCase.assertSame(method, classB.lookUpConcreteMethod(methodName, library));
+    expect(classB.lookUpConcreteMethod(methodName, library), same(method));
   }
 
   void test_lookUpConcreteMethod_declaredAndInheritedAbstract() {
@@ -313,7 +314,7 @@
     MethodElement method = ElementFactory.methodElement(methodName, null, []);
     classB.methods = <MethodElement> [method];
     (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA, classB];
-    JUnitTestCase.assertSame(method, classB.lookUpConcreteMethod(methodName, library));
+    expect(classB.lookUpConcreteMethod(methodName, library), same(method));
   }
 
   void test_lookUpConcreteMethod_inherited() {
@@ -329,7 +330,7 @@
     classA.methods = <MethodElement> [inheritedMethod];
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
     (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA, classB];
-    JUnitTestCase.assertSame(inheritedMethod, classB.lookUpConcreteMethod(methodName, library));
+    expect(classB.lookUpConcreteMethod(methodName, library), same(inheritedMethod));
   }
 
   void test_lookUpConcreteMethod_undeclared() {
@@ -338,7 +339,7 @@
     LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA];
-    JUnitTestCase.assertNull(classA.lookUpConcreteMethod("m", library));
+    expect(classA.lookUpConcreteMethod("m", library), isNull);
   }
 
   void test_lookUpGetter_declared() {
@@ -351,7 +352,7 @@
     PropertyAccessorElement getter = ElementFactory.getterElement(getterName, false, null);
     classA.accessors = <PropertyAccessorElement> [getter];
     (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA];
-    JUnitTestCase.assertSame(getter, classA.lookUpGetter(getterName, library));
+    expect(classA.lookUpGetter(getterName, library), same(getter));
   }
 
   void test_lookUpGetter_inherited() {
@@ -367,7 +368,7 @@
     classA.accessors = <PropertyAccessorElement> [getter];
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
     (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA, classB];
-    JUnitTestCase.assertSame(getter, classB.lookUpGetter(getterName, library));
+    expect(classB.lookUpGetter(getterName, library), same(getter));
   }
 
   void test_lookUpGetter_undeclared() {
@@ -376,7 +377,7 @@
     LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA];
-    JUnitTestCase.assertNull(classA.lookUpGetter("g", library));
+    expect(classA.lookUpGetter("g", library), isNull);
   }
 
   void test_lookUpGetter_undeclared_recursive() {
@@ -389,7 +390,7 @@
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
     classA.supertype = classB.type;
     (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA, classB];
-    JUnitTestCase.assertNull(classA.lookUpGetter("g", library));
+    expect(classA.lookUpGetter("g", library), isNull);
   }
 
   void test_lookUpInheritedConcreteGetter_declared() {
@@ -402,7 +403,7 @@
     PropertyAccessorElement getter = ElementFactory.getterElement(getterName, false, null);
     classA.accessors = <PropertyAccessorElement> [getter];
     (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA];
-    JUnitTestCase.assertNull(classA.lookUpInheritedConcreteGetter(getterName, library));
+    expect(classA.lookUpInheritedConcreteGetter(getterName, library), isNull);
   }
 
   void test_lookUpInheritedConcreteGetter_inherited() {
@@ -418,7 +419,7 @@
     classA.accessors = <PropertyAccessorElement> [inheritedGetter];
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
     (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA, classB];
-    JUnitTestCase.assertSame(inheritedGetter, classB.lookUpInheritedConcreteGetter(getterName, library));
+    expect(classB.lookUpInheritedConcreteGetter(getterName, library), same(inheritedGetter));
   }
 
   void test_lookUpInheritedConcreteGetter_undeclared() {
@@ -427,7 +428,7 @@
     LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA];
-    JUnitTestCase.assertNull(classA.lookUpInheritedConcreteGetter("g", library));
+    expect(classA.lookUpInheritedConcreteGetter("g", library), isNull);
   }
 
   void test_lookUpInheritedConcreteGetter_undeclared_recursive() {
@@ -440,7 +441,7 @@
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
     classA.supertype = classB.type;
     (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA, classB];
-    JUnitTestCase.assertNull(classA.lookUpInheritedConcreteGetter("g", library));
+    expect(classA.lookUpInheritedConcreteGetter("g", library), isNull);
   }
 
   void test_lookUpInheritedConcreteMethod_declared() {
@@ -453,7 +454,7 @@
     MethodElement method = ElementFactory.methodElement(methodName, null, []);
     classA.methods = <MethodElement> [method];
     (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA];
-    JUnitTestCase.assertNull(classA.lookUpInheritedConcreteMethod(methodName, library));
+    expect(classA.lookUpInheritedConcreteMethod(methodName, library), isNull);
   }
 
   void test_lookUpInheritedConcreteMethod_declaredAbstractAndInherited() {
@@ -473,7 +474,7 @@
     method.abstract = true;
     classB.methods = <MethodElement> [method];
     (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA, classB];
-    JUnitTestCase.assertSame(inheritedMethod, classB.lookUpInheritedConcreteMethod(methodName, library));
+    expect(classB.lookUpInheritedConcreteMethod(methodName, library), same(inheritedMethod));
   }
 
   void test_lookUpInheritedConcreteMethod_declaredAndInherited() {
@@ -492,7 +493,7 @@
     MethodElement method = ElementFactory.methodElement(methodName, null, []);
     classB.methods = <MethodElement> [method];
     (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA, classB];
-    JUnitTestCase.assertSame(inheritedMethod, classB.lookUpInheritedConcreteMethod(methodName, library));
+    expect(classB.lookUpInheritedConcreteMethod(methodName, library), same(inheritedMethod));
   }
 
   void test_lookUpInheritedConcreteMethod_declaredAndInheritedAbstract() {
@@ -513,7 +514,7 @@
     MethodElement method = ElementFactory.methodElement(methodName, null, []);
     classB.methods = <MethodElement> [method];
     (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA, classB];
-    JUnitTestCase.assertNull(classB.lookUpInheritedConcreteMethod(methodName, library));
+    expect(classB.lookUpInheritedConcreteMethod(methodName, library), isNull);
   }
 
   void test_lookUpInheritedConcreteMethod_declaredAndInheritedWithAbstractBetween() {
@@ -539,7 +540,7 @@
     MethodElementImpl method = ElementFactory.methodElement(methodName, null, []);
     classC.methods = <MethodElement> [method];
     (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA, classB, classC];
-    JUnitTestCase.assertSame(inheritedMethod, classC.lookUpInheritedConcreteMethod(methodName, library));
+    expect(classC.lookUpInheritedConcreteMethod(methodName, library), same(inheritedMethod));
   }
 
   void test_lookUpInheritedConcreteMethod_inherited() {
@@ -555,7 +556,7 @@
     classA.methods = <MethodElement> [inheritedMethod];
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
     (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA, classB];
-    JUnitTestCase.assertSame(inheritedMethod, classB.lookUpInheritedConcreteMethod(methodName, library));
+    expect(classB.lookUpInheritedConcreteMethod(methodName, library), same(inheritedMethod));
   }
 
   void test_lookUpInheritedConcreteMethod_undeclared() {
@@ -564,7 +565,7 @@
     LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA];
-    JUnitTestCase.assertNull(classA.lookUpInheritedConcreteMethod("m", library));
+    expect(classA.lookUpInheritedConcreteMethod("m", library), isNull);
   }
 
   void test_lookUpInheritedConcreteSetter_declared() {
@@ -577,7 +578,7 @@
     PropertyAccessorElement setter = ElementFactory.setterElement(setterName, false, null);
     classA.accessors = <PropertyAccessorElement> [setter];
     (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA];
-    JUnitTestCase.assertNull(classA.lookUpInheritedConcreteSetter(setterName, library));
+    expect(classA.lookUpInheritedConcreteSetter(setterName, library), isNull);
   }
 
   void test_lookUpInheritedConcreteSetter_inherited() {
@@ -593,7 +594,7 @@
     classA.accessors = <PropertyAccessorElement> [setter];
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
     (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA, classB];
-    JUnitTestCase.assertSame(setter, classB.lookUpInheritedConcreteSetter(setterName, library));
+    expect(classB.lookUpInheritedConcreteSetter(setterName, library), same(setter));
   }
 
   void test_lookUpInheritedConcreteSetter_undeclared() {
@@ -602,7 +603,7 @@
     LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA];
-    JUnitTestCase.assertNull(classA.lookUpInheritedConcreteSetter("s", library));
+    expect(classA.lookUpInheritedConcreteSetter("s", library), isNull);
   }
 
   void test_lookUpInheritedConcreteSetter_undeclared_recursive() {
@@ -615,7 +616,7 @@
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
     classA.supertype = classB.type;
     (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA, classB];
-    JUnitTestCase.assertNull(classA.lookUpInheritedConcreteSetter("s", library));
+    expect(classA.lookUpInheritedConcreteSetter("s", library), isNull);
   }
 
   void test_lookUpInheritedMethod_declared() {
@@ -628,7 +629,7 @@
     MethodElement method = ElementFactory.methodElement(methodName, null, []);
     classA.methods = <MethodElement> [method];
     (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA];
-    JUnitTestCase.assertNull(classA.lookUpInheritedMethod(methodName, library));
+    expect(classA.lookUpInheritedMethod(methodName, library), isNull);
   }
 
   void test_lookUpInheritedMethod_declaredAndInherited() {
@@ -647,7 +648,7 @@
     MethodElement method = ElementFactory.methodElement(methodName, null, []);
     classB.methods = <MethodElement> [method];
     (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA, classB];
-    JUnitTestCase.assertSame(inheritedMethod, classB.lookUpInheritedMethod(methodName, library));
+    expect(classB.lookUpInheritedMethod(methodName, library), same(inheritedMethod));
   }
 
   void test_lookUpInheritedMethod_inherited() {
@@ -663,7 +664,7 @@
     classA.methods = <MethodElement> [inheritedMethod];
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
     (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA, classB];
-    JUnitTestCase.assertSame(inheritedMethod, classB.lookUpInheritedMethod(methodName, library));
+    expect(classB.lookUpInheritedMethod(methodName, library), same(inheritedMethod));
   }
 
   void test_lookUpInheritedMethod_undeclared() {
@@ -672,7 +673,7 @@
     LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA];
-    JUnitTestCase.assertNull(classA.lookUpInheritedMethod("m", library));
+    expect(classA.lookUpInheritedMethod("m", library), isNull);
   }
 
   void test_lookUpMethod_declared() {
@@ -682,7 +683,7 @@
     MethodElement method = ElementFactory.methodElement(methodName, null, []);
     classA.methods = <MethodElement> [method];
     (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA];
-    JUnitTestCase.assertSame(method, classA.lookUpMethod(methodName, library));
+    expect(classA.lookUpMethod(methodName, library), same(method));
   }
 
   void test_lookUpMethod_inherited() {
@@ -693,14 +694,14 @@
     classA.methods = <MethodElement> [method];
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
     (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA, classB];
-    JUnitTestCase.assertSame(method, classB.lookUpMethod(methodName, library));
+    expect(classB.lookUpMethod(methodName, library), same(method));
   }
 
   void test_lookUpMethod_undeclared() {
     LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA];
-    JUnitTestCase.assertNull(classA.lookUpMethod("m", library));
+    expect(classA.lookUpMethod("m", library), isNull);
   }
 
   void test_lookUpMethod_undeclared_recursive() {
@@ -709,7 +710,7 @@
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
     classA.supertype = classB.type;
     (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA, classB];
-    JUnitTestCase.assertNull(classA.lookUpMethod("m", library));
+    expect(classA.lookUpMethod("m", library), isNull);
   }
 
   void test_lookUpSetter_declared() {
@@ -722,7 +723,7 @@
     PropertyAccessorElement setter = ElementFactory.setterElement(setterName, false, null);
     classA.accessors = <PropertyAccessorElement> [setter];
     (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA];
-    JUnitTestCase.assertSame(setter, classA.lookUpSetter(setterName, library));
+    expect(classA.lookUpSetter(setterName, library), same(setter));
   }
 
   void test_lookUpSetter_inherited() {
@@ -738,7 +739,7 @@
     classA.accessors = <PropertyAccessorElement> [setter];
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
     (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA, classB];
-    JUnitTestCase.assertSame(setter, classB.lookUpSetter(setterName, library));
+    expect(classB.lookUpSetter(setterName, library), same(setter));
   }
 
   void test_lookUpSetter_undeclared() {
@@ -747,7 +748,7 @@
     LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA];
-    JUnitTestCase.assertNull(classA.lookUpSetter("s", library));
+    expect(classA.lookUpSetter("s", library), isNull);
   }
 
   void test_lookUpSetter_undeclared_recursive() {
@@ -760,7 +761,7 @@
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
     classA.supertype = classB.type;
     (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA, classB];
-    JUnitTestCase.assertNull(classA.lookUpSetter("s", library));
+    expect(classA.lookUpSetter("s", library), isNull);
   }
 }
 
@@ -771,7 +772,7 @@
     String enumName = "E";
     ClassElement enumElement = ElementFactory.enumElement(typeProvider, enumName, []);
     unit.enums = <ClassElement> [enumElement];
-    JUnitTestCase.assertSame(enumElement, unit.getEnum(enumName));
+    expect(unit.getEnum(enumName), same(enumElement));
   }
 
   void test_getEnum_undeclared() {
@@ -780,7 +781,7 @@
     String enumName = "E";
     ClassElement enumElement = ElementFactory.enumElement(typeProvider, enumName, []);
     unit.enums = <ClassElement> [enumElement];
-    JUnitTestCase.assertNull(unit.getEnum("${enumName}x"));
+    expect(unit.getEnum("${enumName}x"), isNull);
   }
 
   void test_getType_declared() {
@@ -788,7 +789,7 @@
     String className = "C";
     ClassElement classElement = ElementFactory.classElement2(className, []);
     unit.types = <ClassElement> [classElement];
-    JUnitTestCase.assertSame(classElement, unit.getType(className));
+    expect(unit.getType(className), same(classElement));
   }
 
   void test_getType_undeclared() {
@@ -796,7 +797,7 @@
     String className = "C";
     ClassElement classElement = ElementFactory.classElement2(className, []);
     unit.types = <ClassElement> [classElement];
-    JUnitTestCase.assertNull(unit.getType("${className}x"));
+    expect(unit.getType("${className}x"), isNull);
   }
 }
 
@@ -807,10 +808,10 @@
     (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classElement];
     FieldElement field = ElementFactory.fieldElement("next", false, false, false, classElement.type);
     classElement.fields = <FieldElement> [field];
-    JUnitTestCase.assertTrue(field == field);
-    JUnitTestCase.assertFalse(field == field.getter);
-    JUnitTestCase.assertFalse(field == field.setter);
-    JUnitTestCase.assertFalse(field.getter == field.setter);
+    expect(field == field, isTrue);
+    expect(field == field.getter, isFalse);
+    expect(field == field.setter, isFalse);
+    expect(field.getter == field.setter, isFalse);
   }
 
   void test_isAccessibleIn_private_differentLibrary() {
@@ -819,14 +820,14 @@
     ClassElement classElement = ElementFactory.classElement2("_C", []);
     (library1.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classElement];
     LibraryElementImpl library2 = ElementFactory.library(context, "lib2");
-    JUnitTestCase.assertFalse(classElement.isAccessibleIn(library2));
+    expect(classElement.isAccessibleIn(library2), isFalse);
   }
 
   void test_isAccessibleIn_private_sameLibrary() {
     LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
     ClassElement classElement = ElementFactory.classElement2("_C", []);
     (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classElement];
-    JUnitTestCase.assertTrue(classElement.isAccessibleIn(library));
+    expect(classElement.isAccessibleIn(library), isTrue);
   }
 
   void test_isAccessibleIn_public_differentLibrary() {
@@ -835,44 +836,44 @@
     ClassElement classElement = ElementFactory.classElement2("C", []);
     (library1.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classElement];
     LibraryElementImpl library2 = ElementFactory.library(context, "lib2");
-    JUnitTestCase.assertTrue(classElement.isAccessibleIn(library2));
+    expect(classElement.isAccessibleIn(library2), isTrue);
   }
 
   void test_isAccessibleIn_public_sameLibrary() {
     LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
     ClassElement classElement = ElementFactory.classElement2("C", []);
     (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classElement];
-    JUnitTestCase.assertTrue(classElement.isAccessibleIn(library));
+    expect(classElement.isAccessibleIn(library), isTrue);
   }
 
   void test_isPrivate_false() {
     Element element = ElementFactory.classElement2("C", []);
-    JUnitTestCase.assertFalse(element.isPrivate);
+    expect(element.isPrivate, isFalse);
   }
 
   void test_isPrivate_null() {
     Element element = ElementFactory.classElement2(null, []);
-    JUnitTestCase.assertTrue(element.isPrivate);
+    expect(element.isPrivate, isTrue);
   }
 
   void test_isPrivate_true() {
     Element element = ElementFactory.classElement2("_C", []);
-    JUnitTestCase.assertTrue(element.isPrivate);
+    expect(element.isPrivate, isTrue);
   }
 
   void test_isPublic_false() {
     Element element = ElementFactory.classElement2("_C", []);
-    JUnitTestCase.assertFalse(element.isPublic);
+    expect(element.isPublic, isFalse);
   }
 
   void test_isPublic_null() {
     Element element = ElementFactory.classElement2(null, []);
-    JUnitTestCase.assertFalse(element.isPublic);
+    expect(element.isPublic, isFalse);
   }
 
   void test_isPublic_true() {
     Element element = ElementFactory.classElement2("C", []);
-    JUnitTestCase.assertTrue(element.isPublic);
+    expect(element.isPublic, isTrue);
   }
 
   void test_SORT_BY_OFFSET() {
@@ -880,19 +881,19 @@
     classElementA.nameOffset = 1;
     ClassElementImpl classElementB = ElementFactory.classElement2("B", []);
     classElementB.nameOffset = 2;
-    JUnitTestCase.assertEquals(0, Element.SORT_BY_OFFSET(classElementA, classElementA));
-    JUnitTestCase.assertTrue(Element.SORT_BY_OFFSET(classElementA, classElementB) < 0);
-    JUnitTestCase.assertTrue(Element.SORT_BY_OFFSET(classElementB, classElementA) > 0);
+    expect(Element.SORT_BY_OFFSET(classElementA, classElementA), 0);
+    expect(Element.SORT_BY_OFFSET(classElementA, classElementB) < 0, isTrue);
+    expect(Element.SORT_BY_OFFSET(classElementB, classElementA) > 0, isTrue);
   }
 }
 
 class ElementKindTest extends EngineTestCase {
   void test_of_nonNull() {
-    JUnitTestCase.assertSame(ElementKind.CLASS, ElementKind.of(ElementFactory.classElement2("A", [])));
+    expect(ElementKind.of(ElementFactory.classElement2("A", [])), same(ElementKind.CLASS));
   }
 
   void test_of_null() {
-    JUnitTestCase.assertSame(ElementKind.ERROR, ElementKind.of(null));
+    expect(ElementKind.of(null), same(ElementKind.ERROR));
   }
 }
 
@@ -900,7 +901,7 @@
   void test_create_encoding() {
     String encoding = "a;b;c";
     ElementLocationImpl location = new ElementLocationImpl.con2(encoding);
-    JUnitTestCase.assertEquals(encoding, location.encoding);
+    expect(location.encoding, encoding);
   }
 
   /**
@@ -909,78 +910,78 @@
   void test_create_encoding_emptyLast() {
     String encoding = "a;b;c;";
     ElementLocationImpl location = new ElementLocationImpl.con2(encoding);
-    JUnitTestCase.assertEquals(encoding, location.encoding);
+    expect(location.encoding, encoding);
   }
 
   void test_equals_equal() {
     String encoding = "a;b;c";
     ElementLocationImpl first = new ElementLocationImpl.con2(encoding);
     ElementLocationImpl second = new ElementLocationImpl.con2(encoding);
-    JUnitTestCase.assertTrue(first == second);
+    expect(first == second, isTrue);
   }
 
   void test_equals_notEqual_differentLengths() {
     ElementLocationImpl first = new ElementLocationImpl.con2("a;b;c");
     ElementLocationImpl second = new ElementLocationImpl.con2("a;b;c;d");
-    JUnitTestCase.assertFalse(first == second);
+    expect(first == second, isFalse);
   }
 
   void test_equals_notEqual_notLocation() {
     ElementLocationImpl first = new ElementLocationImpl.con2("a;b;c");
-    JUnitTestCase.assertFalse(first == "a;b;d");
+    expect(first == "a;b;d", isFalse);
   }
 
   void test_equals_notEqual_sameLengths() {
     ElementLocationImpl first = new ElementLocationImpl.con2("a;b;c");
     ElementLocationImpl second = new ElementLocationImpl.con2("a;b;d");
-    JUnitTestCase.assertFalse(first == second);
+    expect(first == second, isFalse);
   }
 
   void test_getComponents() {
     String encoding = "a;b;c";
     ElementLocationImpl location = new ElementLocationImpl.con2(encoding);
     List<String> components = location.components;
-    EngineTestCase.assertLength(3, components);
-    JUnitTestCase.assertEquals("a", components[0]);
-    JUnitTestCase.assertEquals("b", components[1]);
-    JUnitTestCase.assertEquals("c", components[2]);
+    expect(components, hasLength(3));
+    expect(components[0], "a");
+    expect(components[1], "b");
+    expect(components[2], "c");
   }
 
   void test_getEncoding() {
     String encoding = "a;b;c;;d";
     ElementLocationImpl location = new ElementLocationImpl.con2(encoding);
-    JUnitTestCase.assertEquals(encoding, location.encoding);
+    expect(location.encoding, encoding);
   }
 
   void test_hashCode_equal() {
     String encoding = "a;b;c";
     ElementLocationImpl first = new ElementLocationImpl.con2(encoding);
     ElementLocationImpl second = new ElementLocationImpl.con2(encoding);
-    JUnitTestCase.assertTrue(first.hashCode == second.hashCode);
+    expect(first.hashCode == second.hashCode, isTrue);
   }
 }
 
 class FunctionTypeImplTest extends EngineTestCase {
   void test_creation() {
-    JUnitTestCase.assertNotNull(new FunctionTypeImpl.con1(new FunctionElementImpl.forNode(AstFactory.identifier3("f"))));
+    expect(new FunctionTypeImpl.con1(new FunctionElementImpl.forNode(AstFactory.identifier3("f"))), isNotNull);
   }
 
   void test_getElement() {
     FunctionElementImpl typeElement = new FunctionElementImpl.forNode(AstFactory.identifier3("f"));
     FunctionTypeImpl type = new FunctionTypeImpl.con1(typeElement);
-    JUnitTestCase.assertEquals(typeElement, type.element);
+    expect(type.element, typeElement);
   }
 
   void test_getNamedParameterTypes() {
     FunctionTypeImpl type = new FunctionTypeImpl.con1(new FunctionElementImpl.forNode(AstFactory.identifier3("f")));
     Map<String, DartType> types = type.namedParameterTypes;
-    EngineTestCase.assertSizeOfMap(0, types);
+    expect(types, hasLength(0));
   }
 
   void test_getNormalParameterTypes() {
     FunctionTypeImpl type = new FunctionTypeImpl.con1(new FunctionElementImpl.forNode(AstFactory.identifier3("f")));
     List<DartType> types = type.normalParameterTypes;
-    EngineTestCase.assertLength(0, types);
+    expect(types, hasLength(0));
   }
 
   void test_getReturnType() {
@@ -989,13 +990,13 @@
     functionElement.returnType = expectedReturnType;
     FunctionTypeImpl type = new FunctionTypeImpl.con1(functionElement);
     DartType returnType = type.returnType;
-    JUnitTestCase.assertEquals(expectedReturnType, returnType);
+    expect(returnType, expectedReturnType);
   }
 
   void test_getTypeArguments() {
     FunctionTypeImpl type = new FunctionTypeImpl.con1(new FunctionElementImpl.forNode(AstFactory.identifier3("f")));
     List<DartType> types = type.typeArguments;
-    EngineTestCase.assertLength(0, types);
+    expect(types, hasLength(0));
   }
 
   void test_hashCode_element() {
@@ -1013,11 +1014,11 @@
     ClassElement a = ElementFactory.classElement2("A", []);
     FunctionType t = ElementFactory.functionElement6("t", null, <ClassElement> [a]).type;
     FunctionType s = ElementFactory.functionElement5("s", <ClassElement> [a]).type;
-    JUnitTestCase.assertTrue(t.isSubtypeOf(s));
-    JUnitTestCase.assertFalse(s.isSubtypeOf(t));
+    expect(t.isSubtypeOf(s), isTrue);
+    expect(s.isSubtypeOf(t), isFalse);
     // assignable iff subtype
-    JUnitTestCase.assertTrue(t.isAssignableTo(s));
-    JUnitTestCase.assertFalse(s.isAssignableTo(t));
+    expect(t.isAssignableTo(s), isTrue);
+    expect(s.isAssignableTo(t), isFalse);
   }
 
   void test_isSubtypeOf_baseCase_classFunction() {
@@ -1025,7 +1026,7 @@
     ClassElementImpl functionElement = ElementFactory.classElement2("Function", []);
     InterfaceTypeImpl functionType = new InterfaceTypeImpl_FunctionTypeImplTest_test_isSubtypeOf_baseCase_classFunction(functionElement);
     FunctionType f = ElementFactory.functionElement("f").type;
-    JUnitTestCase.assertTrue(f.isSubtypeOf(functionType));
+    expect(f.isSubtypeOf(functionType), isTrue);
   }
 
   void test_isSubtypeOf_baseCase_notFunctionType() {
@@ -1033,19 +1034,19 @@
     // ! () -> void <: C
     FunctionType f = ElementFactory.functionElement("f").type;
     InterfaceType t = ElementFactory.classElement2("C", []).type;
-    JUnitTestCase.assertFalse(f.isSubtypeOf(t));
+    expect(f.isSubtypeOf(t), isFalse);
   }
 
   void test_isSubtypeOf_baseCase_null() {
     // ! () -> void <: null
     FunctionType f = ElementFactory.functionElement("f").type;
-    JUnitTestCase.assertFalse(f.isSubtypeOf(null));
+    expect(f.isSubtypeOf(null), isFalse);
   }
 
   void test_isSubtypeOf_baseCase_self() {
     // () -> void <: () -> void
     FunctionType f = ElementFactory.functionElement("f").type;
-    JUnitTestCase.assertTrue(f.isSubtypeOf(f));
+    expect(f.isSubtypeOf(f), isTrue);
   }
 
   void test_isSubtypeOf_namedParameters_isAssignable() {
@@ -1056,15 +1057,15 @@
     ClassElement b = ElementFactory.classElement("B", a.type, []);
     FunctionType t = ElementFactory.functionElement4("t", null, null, <String> ["name"], <ClassElement> [a]).type;
     FunctionType s = ElementFactory.functionElement4("s", null, null, <String> ["name"], <ClassElement> [b]).type;
-    JUnitTestCase.assertTrue(t.isSubtypeOf(s));
-    JUnitTestCase.assertTrue(s.isSubtypeOf(t));
+    expect(t.isSubtypeOf(s), isTrue);
+    expect(s.isSubtypeOf(t), isTrue);
   }
 
   void test_isSubtypeOf_namedParameters_isNotAssignable() {
     // ! ({name: A}) -> void <: ({name: B}) -> void
     FunctionType t = ElementFactory.functionElement4("t", null, null, <String> ["name"], <ClassElement> [ElementFactory.classElement2("A", [])]).type;
     FunctionType s = ElementFactory.functionElement4("s", null, null, <String> ["name"], <ClassElement> [ElementFactory.classElement2("B", [])]).type;
-    JUnitTestCase.assertFalse(t.isSubtypeOf(s));
+    expect(t.isSubtypeOf(s), isFalse);
   }
 
   void test_isSubtypeOf_namedParameters_namesDifferent() {
@@ -1077,8 +1078,8 @@
     ClassElement b = ElementFactory.classElement("B", a.type, []);
     FunctionType t = ElementFactory.functionElement4("t", null, null, <String> ["name"], <ClassElement> [a]).type;
     FunctionType s = ElementFactory.functionElement4("s", null, null, <String> ["diff"], <ClassElement> [b]).type;
-    JUnitTestCase.assertFalse(t.isSubtypeOf(s));
-    JUnitTestCase.assertFalse(s.isSubtypeOf(t));
+    expect(t.isSubtypeOf(s), isFalse);
+    expect(s.isSubtypeOf(t), isFalse);
   }
 
   void test_isSubtypeOf_namedParameters_orderOfParams() {
@@ -1088,7 +1089,7 @@
     ClassElement b = ElementFactory.classElement("B", a.type, []);
     FunctionType t = ElementFactory.functionElement4("t", null, null, <String> ["A", "B"], <ClassElement> [a, b]).type;
     FunctionType s = ElementFactory.functionElement4("s", null, null, <String> ["B", "A"], <ClassElement> [b, a]).type;
-    JUnitTestCase.assertTrue(t.isSubtypeOf(s));
+    expect(t.isSubtypeOf(s), isTrue);
   }
 
   void test_isSubtypeOf_namedParameters_orderOfParams2() {
@@ -1098,7 +1099,7 @@
     ClassElement b = ElementFactory.classElement("B", a.type, []);
     FunctionType t = ElementFactory.functionElement4("t", null, null, <String> ["B"], <ClassElement> [b]).type;
     FunctionType s = ElementFactory.functionElement4("s", null, null, <String> ["B", "A"], <ClassElement> [b, a]).type;
-    JUnitTestCase.assertFalse(t.isSubtypeOf(s));
+    expect(t.isSubtypeOf(s), isFalse);
   }
 
   void test_isSubtypeOf_namedParameters_orderOfParams3() {
@@ -1108,7 +1109,7 @@
     ClassElement b = ElementFactory.classElement("B", a.type, []);
     FunctionType t = ElementFactory.functionElement4("t", null, null, <String> ["A", "B"], <ClassElement> [a, b]).type;
     FunctionType s = ElementFactory.functionElement4("s", null, null, <String> ["B"], <ClassElement> [b]).type;
-    JUnitTestCase.assertTrue(t.isSubtypeOf(s));
+    expect(t.isSubtypeOf(s), isTrue);
   }
 
   void test_isSubtypeOf_namedParameters_sHasMoreParams() {
@@ -1118,7 +1119,7 @@
     ClassElement b = ElementFactory.classElement("B", a.type, []);
     FunctionType t = ElementFactory.functionElement4("t", null, null, <String> ["name"], <ClassElement> [a]).type;
     FunctionType s = ElementFactory.functionElement4("s", null, null, <String> ["name", "name2"], <ClassElement> [b, b]).type;
-    JUnitTestCase.assertFalse(t.isSubtypeOf(s));
+    expect(t.isSubtypeOf(s), isFalse);
   }
 
   void test_isSubtypeOf_namedParameters_tHasMoreParams() {
@@ -1128,7 +1129,7 @@
     ClassElement b = ElementFactory.classElement("B", a.type, []);
     FunctionType t = ElementFactory.functionElement4("t", null, null, <String> ["name", "name2"], <ClassElement> [a, a]).type;
     FunctionType s = ElementFactory.functionElement4("s", null, null, <String> ["name"], <ClassElement> [b]).type;
-    JUnitTestCase.assertTrue(t.isSubtypeOf(s));
+    expect(t.isSubtypeOf(s), isTrue);
   }
 
   void test_isSubtypeOf_normalAndPositionalArgs_1() {
@@ -1136,8 +1137,8 @@
     ClassElement a = ElementFactory.classElement2("A", []);
     FunctionType t = ElementFactory.functionElement6("t", null, <ClassElement> [a]).type;
     FunctionType s = ElementFactory.functionElement5("s", <ClassElement> [a]).type;
-    JUnitTestCase.assertTrue(t.isSubtypeOf(s));
-    JUnitTestCase.assertFalse(s.isSubtypeOf(t));
+    expect(t.isSubtypeOf(s), isTrue);
+    expect(s.isSubtypeOf(t), isFalse);
   }
 
   void test_isSubtypeOf_normalAndPositionalArgs_2() {
@@ -1145,8 +1146,8 @@
     ClassElement a = ElementFactory.classElement2("A", []);
     FunctionType t = ElementFactory.functionElement6("t", <ClassElement> [a], <ClassElement> [a]).type;
     FunctionType s = ElementFactory.functionElement5("s", <ClassElement> [a]).type;
-    JUnitTestCase.assertTrue(t.isSubtypeOf(s));
-    JUnitTestCase.assertFalse(s.isSubtypeOf(t));
+    expect(t.isSubtypeOf(s), isTrue);
+    expect(s.isSubtypeOf(t), isFalse);
   }
 
   void test_isSubtypeOf_normalAndPositionalArgs_3() {
@@ -1154,8 +1155,8 @@
     ClassElement a = ElementFactory.classElement2("A", []);
     FunctionType t = ElementFactory.functionElement6("t", null, <ClassElement> [a]).type;
     FunctionType s = ElementFactory.functionElement("s").type;
-    JUnitTestCase.assertTrue(t.isSubtypeOf(s));
-    JUnitTestCase.assertFalse(s.isSubtypeOf(t));
+    expect(t.isSubtypeOf(s), isTrue);
+    expect(s.isSubtypeOf(t), isFalse);
   }
 
   void test_isSubtypeOf_normalAndPositionalArgs_4() {
@@ -1167,8 +1168,8 @@
     ClassElement e = ElementFactory.classElement2("E", []);
     FunctionType t = ElementFactory.functionElement6("t", <ClassElement> [a, b], <ClassElement> [c, d, e]).type;
     FunctionType s = ElementFactory.functionElement6("s", <ClassElement> [a, b, c], <ClassElement> [d]).type;
-    JUnitTestCase.assertTrue(t.isSubtypeOf(s));
-    JUnitTestCase.assertFalse(s.isSubtypeOf(t));
+    expect(t.isSubtypeOf(s), isTrue);
+    expect(s.isSubtypeOf(t), isFalse);
   }
 
   void test_isSubtypeOf_normalParameters_isAssignable() {
@@ -1179,15 +1180,15 @@
     ClassElement b = ElementFactory.classElement("B", a.type, []);
     FunctionType t = ElementFactory.functionElement5("t", <ClassElement> [a]).type;
     FunctionType s = ElementFactory.functionElement5("s", <ClassElement> [b]).type;
-    JUnitTestCase.assertTrue(t.isSubtypeOf(s));
-    JUnitTestCase.assertTrue(s.isSubtypeOf(t));
+    expect(t.isSubtypeOf(s), isTrue);
+    expect(s.isSubtypeOf(t), isTrue);
   }
 
   void test_isSubtypeOf_normalParameters_isNotAssignable() {
     // ! (a) -> void <: (b) -> void
     FunctionType t = ElementFactory.functionElement5("t", <ClassElement> [ElementFactory.classElement2("A", [])]).type;
     FunctionType s = ElementFactory.functionElement5("s", <ClassElement> [ElementFactory.classElement2("B", [])]).type;
-    JUnitTestCase.assertFalse(t.isSubtypeOf(s));
+    expect(t.isSubtypeOf(s), isFalse);
   }
 
   void test_isSubtypeOf_normalParameters_sHasMoreParams() {
@@ -1197,7 +1198,7 @@
     ClassElement b = ElementFactory.classElement("B", a.type, []);
     FunctionType t = ElementFactory.functionElement5("t", <ClassElement> [a]).type;
     FunctionType s = ElementFactory.functionElement5("s", <ClassElement> [b, b]).type;
-    JUnitTestCase.assertFalse(t.isSubtypeOf(s));
+    expect(t.isSubtypeOf(s), isFalse);
   }
 
   void test_isSubtypeOf_normalParameters_tHasMoreParams() {
@@ -1209,14 +1210,14 @@
     FunctionType s = ElementFactory.functionElement5("s", <ClassElement> [b]).type;
     // note, this is a different assertion from the other "tHasMoreParams" tests, this is
     // intentional as it is a difference of the "normal parameters"
-    JUnitTestCase.assertFalse(t.isSubtypeOf(s));
+    expect(t.isSubtypeOf(s), isFalse);
   }
 
   void test_isSubtypeOf_Object() {
     // () -> void <: Object
     FunctionType f = ElementFactory.functionElement("f").type;
     InterfaceType t = ElementFactory.object.type;
-    JUnitTestCase.assertTrue(f.isSubtypeOf(t));
+    expect(f.isSubtypeOf(t), isTrue);
   }
 
   void test_isSubtypeOf_positionalParameters_isAssignable() {
@@ -1227,15 +1228,15 @@
     ClassElement b = ElementFactory.classElement("B", a.type, []);
     FunctionType t = ElementFactory.functionElement6("t", null, <ClassElement> [a]).type;
     FunctionType s = ElementFactory.functionElement6("s", null, <ClassElement> [b]).type;
-    JUnitTestCase.assertTrue(t.isSubtypeOf(s));
-    JUnitTestCase.assertTrue(s.isSubtypeOf(t));
+    expect(t.isSubtypeOf(s), isTrue);
+    expect(s.isSubtypeOf(t), isTrue);
   }
 
   void test_isSubtypeOf_positionalParameters_isNotAssignable() {
     // ! ([a]) -> void <: ([b]) -> void
     FunctionType t = ElementFactory.functionElement6("t", null, <ClassElement> [ElementFactory.classElement2("A", [])]).type;
     FunctionType s = ElementFactory.functionElement6("s", null, <ClassElement> [ElementFactory.classElement2("B", [])]).type;
-    JUnitTestCase.assertFalse(t.isSubtypeOf(s));
+    expect(t.isSubtypeOf(s), isFalse);
   }
 
   void test_isSubtypeOf_positionalParameters_sHasMoreParams() {
@@ -1245,7 +1246,7 @@
     ClassElement b = ElementFactory.classElement("B", a.type, []);
     FunctionType t = ElementFactory.functionElement6("t", null, <ClassElement> [a]).type;
     FunctionType s = ElementFactory.functionElement6("s", null, <ClassElement> [b, b]).type;
-    JUnitTestCase.assertFalse(t.isSubtypeOf(s));
+    expect(t.isSubtypeOf(s), isFalse);
   }
 
   void test_isSubtypeOf_positionalParameters_tHasMoreParams() {
@@ -1255,7 +1256,7 @@
     ClassElement b = ElementFactory.classElement("B", a.type, []);
     FunctionType t = ElementFactory.functionElement6("t", null, <ClassElement> [a, a]).type;
     FunctionType s = ElementFactory.functionElement6("s", null, <ClassElement> [b]).type;
-    JUnitTestCase.assertTrue(t.isSubtypeOf(s));
+    expect(t.isSubtypeOf(s), isTrue);
   }
 
   void test_isSubtypeOf_returnType_sIsVoid() {
@@ -1263,8 +1264,8 @@
     FunctionType t = ElementFactory.functionElement("t").type;
     FunctionType s = ElementFactory.functionElement("s").type;
     // function s has the implicit return type of void, we assert it here
-    JUnitTestCase.assertTrue(VoidTypeImpl.instance == s.returnType);
-    JUnitTestCase.assertTrue(t.isSubtypeOf(s));
+    expect(VoidTypeImpl.instance == s.returnType, isTrue);
+    expect(t.isSubtypeOf(s), isTrue);
   }
 
   void test_isSubtypeOf_returnType_tAssignableToS() {
@@ -1275,15 +1276,15 @@
     ClassElement b = ElementFactory.classElement("B", a.type, []);
     FunctionType t = ElementFactory.functionElement2("t", a).type;
     FunctionType s = ElementFactory.functionElement2("s", b).type;
-    JUnitTestCase.assertTrue(t.isSubtypeOf(s));
-    JUnitTestCase.assertTrue(s.isSubtypeOf(t));
+    expect(t.isSubtypeOf(s), isTrue);
+    expect(s.isSubtypeOf(t), isTrue);
   }
 
   void test_isSubtypeOf_returnType_tNotAssignableToS() {
     // ! () -> A <: () -> B
     FunctionType t = ElementFactory.functionElement2("t", ElementFactory.classElement2("A", [])).type;
     FunctionType s = ElementFactory.functionElement2("s", ElementFactory.classElement2("B", [])).type;
-    JUnitTestCase.assertFalse(t.isSubtypeOf(s));
+    expect(t.isSubtypeOf(s), isFalse);
   }
 
   void test_isSubtypeOf_typeParameters_matchesBounds() {
@@ -1310,7 +1311,7 @@
     functionElement.returnType = provider.dynamicType;
     FunctionTypeImpl functionType = new FunctionTypeImpl.con1(functionElement);
     functionElement.type = functionType;
-    JUnitTestCase.assertTrue(functionType.isAssignableTo(functionAliasType));
+    expect(functionType.isAssignableTo(functionAliasType), isTrue);
   }
 
   void test_isSubtypeOf_wrongFunctionType_normal_named() {
@@ -1319,8 +1320,8 @@
     ClassElement a = ElementFactory.classElement2("A", []);
     FunctionType t = ElementFactory.functionElement5("t", <ClassElement> [a]).type;
     FunctionType s = ElementFactory.functionElement7("s", null, <String> ["name"], <ClassElement> [a]).type;
-    JUnitTestCase.assertFalse(t.isSubtypeOf(s));
-    JUnitTestCase.assertFalse(s.isSubtypeOf(t));
+    expect(t.isSubtypeOf(s), isFalse);
+    expect(s.isSubtypeOf(t), isFalse);
   }
 
   void test_isSubtypeOf_wrongFunctionType_optional_named() {
@@ -1329,8 +1330,8 @@
     ClassElement a = ElementFactory.classElement2("A", []);
     FunctionType t = ElementFactory.functionElement6("t", null, <ClassElement> [a]).type;
     FunctionType s = ElementFactory.functionElement7("s", null, <String> ["name"], <ClassElement> [a]).type;
-    JUnitTestCase.assertFalse(t.isSubtypeOf(s));
-    JUnitTestCase.assertFalse(s.isSubtypeOf(t));
+    expect(t.isSubtypeOf(s), isFalse);
+    expect(s.isSubtypeOf(t), isFalse);
   }
 
   void test_setTypeArguments() {
@@ -1341,8 +1342,8 @@
     DartType expectedType = enclosingClass.typeParameters[0].type;
     type.typeArguments = <DartType> [expectedType];
     List<DartType> arguments = type.typeArguments;
-    EngineTestCase.assertLength(1, arguments);
-    JUnitTestCase.assertEquals(expectedType, arguments[0]);
+    expect(arguments, hasLength(1));
+    expect(arguments[0], expectedType);
   }
 
   void test_substitute2_equal() {
@@ -1360,16 +1361,16 @@
     functionType.typeArguments = <DartType> [parameterType];
     InterfaceTypeImpl argumentType = new InterfaceTypeImpl.con1(new ClassElementImpl.forNode(AstFactory.identifier3("D")));
     FunctionType result = functionType.substitute2(<DartType> [argumentType], <DartType> [parameterType]);
-    JUnitTestCase.assertEquals(argumentType, result.returnType);
+    expect(result.returnType, argumentType);
     List<DartType> normalParameters = result.normalParameterTypes;
-    EngineTestCase.assertLength(1, normalParameters);
-    JUnitTestCase.assertEquals(argumentType, normalParameters[0]);
+    expect(normalParameters, hasLength(1));
+    expect(normalParameters[0], argumentType);
     List<DartType> optionalParameters = result.optionalParameterTypes;
-    EngineTestCase.assertLength(1, optionalParameters);
-    JUnitTestCase.assertEquals(argumentType, optionalParameters[0]);
+    expect(optionalParameters, hasLength(1));
+    expect(optionalParameters[0], argumentType);
     Map<String, DartType> namedParameters = result.namedParameterTypes;
-    EngineTestCase.assertSizeOfMap(1, namedParameters);
-    JUnitTestCase.assertEquals(argumentType, namedParameters[namedParameterName]);
+    expect(namedParameters, hasLength(1));
+    expect(namedParameters[namedParameterName], argumentType);
   }
 
   void test_substitute2_notEqual() {
@@ -1388,16 +1389,16 @@
     InterfaceTypeImpl argumentType = new InterfaceTypeImpl.con1(new ClassElementImpl.forNode(AstFactory.identifier3("D")));
     TypeParameterTypeImpl parameterType = new TypeParameterTypeImpl(new TypeParameterElementImpl.forNode(AstFactory.identifier3("E")));
     FunctionType result = functionType.substitute2(<DartType> [argumentType], <DartType> [parameterType]);
-    JUnitTestCase.assertEquals(returnType, result.returnType);
+    expect(result.returnType, returnType);
     List<DartType> normalParameters = result.normalParameterTypes;
-    EngineTestCase.assertLength(1, normalParameters);
-    JUnitTestCase.assertEquals(normalParameterType, normalParameters[0]);
+    expect(normalParameters, hasLength(1));
+    expect(normalParameters[0], normalParameterType);
     List<DartType> optionalParameters = result.optionalParameterTypes;
-    EngineTestCase.assertLength(1, optionalParameters);
-    JUnitTestCase.assertEquals(optionalParameterType, optionalParameters[0]);
+    expect(optionalParameters, hasLength(1));
+    expect(optionalParameters[0], optionalParameterType);
     Map<String, DartType> namedParameters = result.namedParameterTypes;
-    EngineTestCase.assertSizeOfMap(1, namedParameters);
-    JUnitTestCase.assertEquals(namedParameterType, namedParameters[namedParameterName]);
+    expect(namedParameters, hasLength(1));
+    expect(namedParameters[namedParameterName], namedParameterType);
   }
 }
 
@@ -1406,26 +1407,26 @@
     AnalysisContextImpl context = createAnalysisContext();
     HtmlElementImpl elementA = ElementFactory.htmlUnit(context, "indexA.html");
     HtmlElementImpl elementB = ElementFactory.htmlUnit(context, "indexB.html");
-    JUnitTestCase.assertFalse(elementA == elementB);
+    expect(elementA == elementB, isFalse);
   }
 
   void test_equals_null() {
     AnalysisContextImpl context = createAnalysisContext();
     HtmlElementImpl element = ElementFactory.htmlUnit(context, "index.html");
-    JUnitTestCase.assertFalse(element == null);
+    expect(element == null, isFalse);
   }
 
   void test_equals_sameSource() {
     AnalysisContextImpl context = createAnalysisContext();
     HtmlElementImpl elementA = ElementFactory.htmlUnit(context, "index.html");
     HtmlElementImpl elementB = ElementFactory.htmlUnit(context, "index.html");
-    JUnitTestCase.assertTrue(elementA == elementB);
+    expect(elementA == elementB, isTrue);
   }
 
   void test_equals_self() {
     AnalysisContextImpl context = createAnalysisContext();
     HtmlElementImpl element = ElementFactory.htmlUnit(context, "index.html");
-    JUnitTestCase.assertTrue(element == element);
+    expect(element == element, isTrue);
   }
 }
 
@@ -1463,8 +1464,8 @@
     classE.interfaces = <InterfaceType> [classB.type, classD.type];
     // assertion: even though the longest path to Object for typeB is 2, and typeE implements typeB,
     // the longest path for typeE is 4 since it also implements typeD
-    JUnitTestCase.assertEquals(2, InterfaceTypeImpl.computeLongestInheritancePathToObject(classB.type));
-    JUnitTestCase.assertEquals(4, InterfaceTypeImpl.computeLongestInheritancePathToObject(classE.type));
+    expect(InterfaceTypeImpl.computeLongestInheritancePathToObject(classB.type), 2);
+    expect(InterfaceTypeImpl.computeLongestInheritancePathToObject(classE.type), 4);
   }
 
   void test_computeLongestInheritancePathToObject_multipleSuperclassPaths() {
@@ -1487,8 +1488,8 @@
     classE.interfaces = <InterfaceType> [classD.type];
     // assertion: even though the longest path to Object for typeB is 2, and typeE extends typeB,
     // the longest path for typeE is 4 since it also implements typeD
-    JUnitTestCase.assertEquals(2, InterfaceTypeImpl.computeLongestInheritancePathToObject(classB.type));
-    JUnitTestCase.assertEquals(4, InterfaceTypeImpl.computeLongestInheritancePathToObject(classE.type));
+    expect(InterfaceTypeImpl.computeLongestInheritancePathToObject(classB.type), 2);
+    expect(InterfaceTypeImpl.computeLongestInheritancePathToObject(classE.type), 4);
   }
 
   void test_computeLongestInheritancePathToObject_object() {
@@ -1499,14 +1500,14 @@
     //
     ClassElement classA = ElementFactory.classElement2("A", []);
     InterfaceType object = classA.supertype;
-    JUnitTestCase.assertEquals(0, InterfaceTypeImpl.computeLongestInheritancePathToObject(object));
+    expect(InterfaceTypeImpl.computeLongestInheritancePathToObject(object), 0);
   }
 
   void test_computeLongestInheritancePathToObject_recursion() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
     classA.supertype = classB.type;
-    JUnitTestCase.assertEquals(2, InterfaceTypeImpl.computeLongestInheritancePathToObject(classA.type));
+    expect(InterfaceTypeImpl.computeLongestInheritancePathToObject(classA.type), 2);
   }
 
   void test_computeLongestInheritancePathToObject_singleInterfacePath() {
@@ -1524,9 +1525,9 @@
     ClassElementImpl classC = ElementFactory.classElement2("C", []);
     classB.interfaces = <InterfaceType> [classA.type];
     classC.interfaces = <InterfaceType> [classB.type];
-    JUnitTestCase.assertEquals(1, InterfaceTypeImpl.computeLongestInheritancePathToObject(classA.type));
-    JUnitTestCase.assertEquals(2, InterfaceTypeImpl.computeLongestInheritancePathToObject(classB.type));
-    JUnitTestCase.assertEquals(3, InterfaceTypeImpl.computeLongestInheritancePathToObject(classC.type));
+    expect(InterfaceTypeImpl.computeLongestInheritancePathToObject(classA.type), 1);
+    expect(InterfaceTypeImpl.computeLongestInheritancePathToObject(classB.type), 2);
+    expect(InterfaceTypeImpl.computeLongestInheritancePathToObject(classC.type), 3);
   }
 
   void test_computeLongestInheritancePathToObject_singleSuperclassPath() {
@@ -1542,9 +1543,9 @@
     ClassElement classA = ElementFactory.classElement2("A", []);
     ClassElement classB = ElementFactory.classElement("B", classA.type, []);
     ClassElement classC = ElementFactory.classElement("C", classB.type, []);
-    JUnitTestCase.assertEquals(1, InterfaceTypeImpl.computeLongestInheritancePathToObject(classA.type));
-    JUnitTestCase.assertEquals(2, InterfaceTypeImpl.computeLongestInheritancePathToObject(classB.type));
-    JUnitTestCase.assertEquals(3, InterfaceTypeImpl.computeLongestInheritancePathToObject(classC.type));
+    expect(InterfaceTypeImpl.computeLongestInheritancePathToObject(classA.type), 1);
+    expect(InterfaceTypeImpl.computeLongestInheritancePathToObject(classB.type), 2);
+    expect(InterfaceTypeImpl.computeLongestInheritancePathToObject(classC.type), 3);
   }
 
   void test_computeSuperinterfaceSet_genericInterfacePath() {
@@ -1569,24 +1570,24 @@
     classC.interfaces = <InterfaceType> [typeBT];
     // A
     Set<InterfaceType> superinterfacesOfA = InterfaceTypeImpl.computeSuperinterfaceSet(typeA);
-    EngineTestCase.assertSizeOfSet(1, superinterfacesOfA);
+    expect(superinterfacesOfA, hasLength(1));
     InterfaceType typeObject = ElementFactory.object.type;
-    JUnitTestCase.assertTrue(superinterfacesOfA.contains(typeObject));
+    expect(superinterfacesOfA.contains(typeObject), isTrue);
     // B<D>
     InterfaceTypeImpl typeBD = new InterfaceTypeImpl.con1(classB);
     typeBD.typeArguments = <DartType> [classD.type];
     Set<InterfaceType> superinterfacesOfBD = InterfaceTypeImpl.computeSuperinterfaceSet(typeBD);
-    EngineTestCase.assertSizeOfSet(2, superinterfacesOfBD);
-    JUnitTestCase.assertTrue(superinterfacesOfBD.contains(typeObject));
-    JUnitTestCase.assertTrue(superinterfacesOfBD.contains(typeA));
+    expect(superinterfacesOfBD, hasLength(2));
+    expect(superinterfacesOfBD.contains(typeObject), isTrue);
+    expect(superinterfacesOfBD.contains(typeA), isTrue);
     // C<D>
     InterfaceTypeImpl typeCD = new InterfaceTypeImpl.con1(classC);
     typeCD.typeArguments = <DartType> [classD.type];
     Set<InterfaceType> superinterfacesOfCD = InterfaceTypeImpl.computeSuperinterfaceSet(typeCD);
-    EngineTestCase.assertSizeOfSet(3, superinterfacesOfCD);
-    JUnitTestCase.assertTrue(superinterfacesOfCD.contains(typeObject));
-    JUnitTestCase.assertTrue(superinterfacesOfCD.contains(typeA));
-    JUnitTestCase.assertTrue(superinterfacesOfCD.contains(typeBD));
+    expect(superinterfacesOfCD, hasLength(3));
+    expect(superinterfacesOfCD.contains(typeObject), isTrue);
+    expect(superinterfacesOfCD.contains(typeA), isTrue);
+    expect(superinterfacesOfCD.contains(typeBD), isTrue);
   }
 
   void test_computeSuperinterfaceSet_genericSuperclassPath() {
@@ -1610,24 +1611,24 @@
     ClassElement classD = ElementFactory.classElement2("D", []);
     // A
     Set<InterfaceType> superinterfacesOfA = InterfaceTypeImpl.computeSuperinterfaceSet(typeA);
-    EngineTestCase.assertSizeOfSet(1, superinterfacesOfA);
+    expect(superinterfacesOfA, hasLength(1));
     InterfaceType typeObject = ElementFactory.object.type;
-    JUnitTestCase.assertTrue(superinterfacesOfA.contains(typeObject));
+    expect(superinterfacesOfA.contains(typeObject), isTrue);
     // B<D>
     InterfaceTypeImpl typeBD = new InterfaceTypeImpl.con1(classB);
     typeBD.typeArguments = <DartType> [classD.type];
     Set<InterfaceType> superinterfacesOfBD = InterfaceTypeImpl.computeSuperinterfaceSet(typeBD);
-    EngineTestCase.assertSizeOfSet(2, superinterfacesOfBD);
-    JUnitTestCase.assertTrue(superinterfacesOfBD.contains(typeObject));
-    JUnitTestCase.assertTrue(superinterfacesOfBD.contains(typeA));
+    expect(superinterfacesOfBD, hasLength(2));
+    expect(superinterfacesOfBD.contains(typeObject), isTrue);
+    expect(superinterfacesOfBD.contains(typeA), isTrue);
     // C<D>
     InterfaceTypeImpl typeCD = new InterfaceTypeImpl.con1(classC);
     typeCD.typeArguments = <DartType> [classD.type];
     Set<InterfaceType> superinterfacesOfCD = InterfaceTypeImpl.computeSuperinterfaceSet(typeCD);
-    EngineTestCase.assertSizeOfSet(3, superinterfacesOfCD);
-    JUnitTestCase.assertTrue(superinterfacesOfCD.contains(typeObject));
-    JUnitTestCase.assertTrue(superinterfacesOfCD.contains(typeA));
-    JUnitTestCase.assertTrue(superinterfacesOfCD.contains(typeBD));
+    expect(superinterfacesOfCD, hasLength(3));
+    expect(superinterfacesOfCD.contains(typeObject), isTrue);
+    expect(superinterfacesOfCD.contains(typeA), isTrue);
+    expect(superinterfacesOfCD.contains(typeBD), isTrue);
   }
 
   void test_computeSuperinterfaceSet_multipleInterfacePaths() {
@@ -1642,18 +1643,18 @@
     classE.interfaces = <InterfaceType> [classB.type, classD.type];
     // D
     Set<InterfaceType> superinterfacesOfD = InterfaceTypeImpl.computeSuperinterfaceSet(classD.type);
-    EngineTestCase.assertSizeOfSet(3, superinterfacesOfD);
-    JUnitTestCase.assertTrue(superinterfacesOfD.contains(ElementFactory.object.type));
-    JUnitTestCase.assertTrue(superinterfacesOfD.contains(classA.type));
-    JUnitTestCase.assertTrue(superinterfacesOfD.contains(classC.type));
+    expect(superinterfacesOfD, hasLength(3));
+    expect(superinterfacesOfD.contains(ElementFactory.object.type), isTrue);
+    expect(superinterfacesOfD.contains(classA.type), isTrue);
+    expect(superinterfacesOfD.contains(classC.type), isTrue);
     // E
     Set<InterfaceType> superinterfacesOfE = InterfaceTypeImpl.computeSuperinterfaceSet(classE.type);
-    EngineTestCase.assertSizeOfSet(5, superinterfacesOfE);
-    JUnitTestCase.assertTrue(superinterfacesOfE.contains(ElementFactory.object.type));
-    JUnitTestCase.assertTrue(superinterfacesOfE.contains(classA.type));
-    JUnitTestCase.assertTrue(superinterfacesOfE.contains(classB.type));
-    JUnitTestCase.assertTrue(superinterfacesOfE.contains(classC.type));
-    JUnitTestCase.assertTrue(superinterfacesOfE.contains(classD.type));
+    expect(superinterfacesOfE, hasLength(5));
+    expect(superinterfacesOfE.contains(ElementFactory.object.type), isTrue);
+    expect(superinterfacesOfE.contains(classA.type), isTrue);
+    expect(superinterfacesOfE.contains(classB.type), isTrue);
+    expect(superinterfacesOfE.contains(classC.type), isTrue);
+    expect(superinterfacesOfE.contains(classD.type), isTrue);
   }
 
   void test_computeSuperinterfaceSet_multipleSuperclassPaths() {
@@ -1665,18 +1666,18 @@
     classE.interfaces = <InterfaceType> [classD.type];
     // D
     Set<InterfaceType> superinterfacesOfD = InterfaceTypeImpl.computeSuperinterfaceSet(classD.type);
-    EngineTestCase.assertSizeOfSet(3, superinterfacesOfD);
-    JUnitTestCase.assertTrue(superinterfacesOfD.contains(ElementFactory.object.type));
-    JUnitTestCase.assertTrue(superinterfacesOfD.contains(classA.type));
-    JUnitTestCase.assertTrue(superinterfacesOfD.contains(classC.type));
+    expect(superinterfacesOfD, hasLength(3));
+    expect(superinterfacesOfD.contains(ElementFactory.object.type), isTrue);
+    expect(superinterfacesOfD.contains(classA.type), isTrue);
+    expect(superinterfacesOfD.contains(classC.type), isTrue);
     // E
     Set<InterfaceType> superinterfacesOfE = InterfaceTypeImpl.computeSuperinterfaceSet(classE.type);
-    EngineTestCase.assertSizeOfSet(5, superinterfacesOfE);
-    JUnitTestCase.assertTrue(superinterfacesOfE.contains(ElementFactory.object.type));
-    JUnitTestCase.assertTrue(superinterfacesOfE.contains(classA.type));
-    JUnitTestCase.assertTrue(superinterfacesOfE.contains(classB.type));
-    JUnitTestCase.assertTrue(superinterfacesOfE.contains(classC.type));
-    JUnitTestCase.assertTrue(superinterfacesOfE.contains(classD.type));
+    expect(superinterfacesOfE, hasLength(5));
+    expect(superinterfacesOfE.contains(ElementFactory.object.type), isTrue);
+    expect(superinterfacesOfE.contains(classA.type), isTrue);
+    expect(superinterfacesOfE.contains(classB.type), isTrue);
+    expect(superinterfacesOfE.contains(classC.type), isTrue);
+    expect(superinterfacesOfE.contains(classD.type), isTrue);
   }
 
   void test_computeSuperinterfaceSet_recursion() {
@@ -1684,7 +1685,7 @@
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
     classA.supertype = classB.type;
     Set<InterfaceType> superinterfacesOfB = InterfaceTypeImpl.computeSuperinterfaceSet(classB.type);
-    EngineTestCase.assertSizeOfSet(2, superinterfacesOfB);
+    expect(superinterfacesOfB, hasLength(2));
   }
 
   void test_computeSuperinterfaceSet_singleInterfacePath() {
@@ -1695,19 +1696,19 @@
     classC.interfaces = <InterfaceType> [classB.type];
     // A
     Set<InterfaceType> superinterfacesOfA = InterfaceTypeImpl.computeSuperinterfaceSet(classA.type);
-    EngineTestCase.assertSizeOfSet(1, superinterfacesOfA);
-    JUnitTestCase.assertTrue(superinterfacesOfA.contains(ElementFactory.object.type));
+    expect(superinterfacesOfA, hasLength(1));
+    expect(superinterfacesOfA.contains(ElementFactory.object.type), isTrue);
     // B
     Set<InterfaceType> superinterfacesOfB = InterfaceTypeImpl.computeSuperinterfaceSet(classB.type);
-    EngineTestCase.assertSizeOfSet(2, superinterfacesOfB);
-    JUnitTestCase.assertTrue(superinterfacesOfB.contains(ElementFactory.object.type));
-    JUnitTestCase.assertTrue(superinterfacesOfB.contains(classA.type));
+    expect(superinterfacesOfB, hasLength(2));
+    expect(superinterfacesOfB.contains(ElementFactory.object.type), isTrue);
+    expect(superinterfacesOfB.contains(classA.type), isTrue);
     // C
     Set<InterfaceType> superinterfacesOfC = InterfaceTypeImpl.computeSuperinterfaceSet(classC.type);
-    EngineTestCase.assertSizeOfSet(3, superinterfacesOfC);
-    JUnitTestCase.assertTrue(superinterfacesOfC.contains(ElementFactory.object.type));
-    JUnitTestCase.assertTrue(superinterfacesOfC.contains(classA.type));
-    JUnitTestCase.assertTrue(superinterfacesOfC.contains(classB.type));
+    expect(superinterfacesOfC, hasLength(3));
+    expect(superinterfacesOfC.contains(ElementFactory.object.type), isTrue);
+    expect(superinterfacesOfC.contains(classA.type), isTrue);
+    expect(superinterfacesOfC.contains(classB.type), isTrue);
   }
 
   void test_computeSuperinterfaceSet_singleSuperclassPath() {
@@ -1723,23 +1724,23 @@
     ClassElement classC = ElementFactory.classElement("C", classB.type, []);
     // A
     Set<InterfaceType> superinterfacesOfA = InterfaceTypeImpl.computeSuperinterfaceSet(classA.type);
-    EngineTestCase.assertSizeOfSet(1, superinterfacesOfA);
-    JUnitTestCase.assertTrue(superinterfacesOfA.contains(ElementFactory.object.type));
+    expect(superinterfacesOfA, hasLength(1));
+    expect(superinterfacesOfA.contains(ElementFactory.object.type), isTrue);
     // B
     Set<InterfaceType> superinterfacesOfB = InterfaceTypeImpl.computeSuperinterfaceSet(classB.type);
-    EngineTestCase.assertSizeOfSet(2, superinterfacesOfB);
-    JUnitTestCase.assertTrue(superinterfacesOfB.contains(ElementFactory.object.type));
-    JUnitTestCase.assertTrue(superinterfacesOfB.contains(classA.type));
+    expect(superinterfacesOfB, hasLength(2));
+    expect(superinterfacesOfB.contains(ElementFactory.object.type), isTrue);
+    expect(superinterfacesOfB.contains(classA.type), isTrue);
     // C
     Set<InterfaceType> superinterfacesOfC = InterfaceTypeImpl.computeSuperinterfaceSet(classC.type);
-    EngineTestCase.assertSizeOfSet(3, superinterfacesOfC);
-    JUnitTestCase.assertTrue(superinterfacesOfC.contains(ElementFactory.object.type));
-    JUnitTestCase.assertTrue(superinterfacesOfC.contains(classA.type));
-    JUnitTestCase.assertTrue(superinterfacesOfC.contains(classB.type));
+    expect(superinterfacesOfC, hasLength(3));
+    expect(superinterfacesOfC.contains(ElementFactory.object.type), isTrue);
+    expect(superinterfacesOfC.contains(classA.type), isTrue);
+    expect(superinterfacesOfC.contains(classB.type), isTrue);
   }
 
   void test_creation() {
-    JUnitTestCase.assertNotNull(new InterfaceTypeImpl.con1(ElementFactory.classElement2("A", [])));
+    expect(new InterfaceTypeImpl.con1(ElementFactory.classElement2("A", [])), isNotNull);
   }
 
   void test_getAccessors() {
@@ -1748,19 +1749,19 @@
     PropertyAccessorElement getterH = ElementFactory.getterElement("h", false, null);
     typeElement.accessors = <PropertyAccessorElement> [getterG, getterH];
     InterfaceTypeImpl type = new InterfaceTypeImpl.con1(typeElement);
-    JUnitTestCase.assertEquals(2, type.accessors.length);
+    expect(type.accessors.length, 2);
   }
 
   void test_getAccessors_empty() {
     ClassElementImpl typeElement = ElementFactory.classElement2("A", []);
     InterfaceTypeImpl type = new InterfaceTypeImpl.con1(typeElement);
-    JUnitTestCase.assertEquals(0, type.accessors.length);
+    expect(type.accessors.length, 0);
   }
 
   void test_getElement() {
     ClassElementImpl typeElement = ElementFactory.classElement2("A", []);
     InterfaceTypeImpl type = new InterfaceTypeImpl.con1(typeElement);
-    JUnitTestCase.assertEquals(typeElement, type.element);
+    expect(type.element, typeElement);
   }
 
   void test_getGetter_implemented() {
@@ -1772,7 +1773,7 @@
     PropertyAccessorElement getterG = ElementFactory.getterElement(getterName, false, null);
     classA.accessors = <PropertyAccessorElement> [getterG];
     InterfaceType typeA = classA.type;
-    JUnitTestCase.assertSame(getterG, typeA.getGetter(getterName));
+    expect(typeA.getGetter(getterName), same(getterG));
   }
 
   void test_getGetter_parameterized() {
@@ -1792,9 +1793,9 @@
     InterfaceTypeImpl typeAI = new InterfaceTypeImpl.con1(classA);
     typeAI.typeArguments = <DartType> [typeI];
     PropertyAccessorElement getter = typeAI.getGetter(getterName);
-    JUnitTestCase.assertNotNull(getter);
+    expect(getter, isNotNull);
     FunctionType getterType = getter.type;
-    JUnitTestCase.assertSame(typeI, getterType.returnType);
+    expect(getterType.returnType, same(typeI));
   }
 
   void test_getGetter_unimplemented() {
@@ -1803,7 +1804,7 @@
     //
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     InterfaceType typeA = classA.type;
-    JUnitTestCase.assertNull(typeA.getGetter("g"));
+    expect(typeA.getGetter("g"), isNull);
   }
 
   void test_getInterfaces_nonParameterized() {
@@ -1817,12 +1818,12 @@
     ClassElementImpl classC = ElementFactory.classElement2("C", []);
     classC.interfaces = <InterfaceType> [typeA, typeB];
     List<InterfaceType> interfaces = classC.type.interfaces;
-    EngineTestCase.assertLength(2, interfaces);
+    expect(interfaces, hasLength(2));
     if (identical(interfaces[0], typeA)) {
-      JUnitTestCase.assertSame(typeB, interfaces[1]);
+      expect(interfaces[1], same(typeB));
     } else {
-      JUnitTestCase.assertSame(typeB, interfaces[0]);
-      JUnitTestCase.assertSame(typeA, interfaces[1]);
+      expect(interfaces[0], same(typeB));
+      expect(interfaces[1], same(typeA));
     }
   }
 
@@ -1844,10 +1845,10 @@
     InterfaceTypeImpl typeBI = new InterfaceTypeImpl.con1(classB);
     typeBI.typeArguments = <DartType> [typeI];
     List<InterfaceType> interfaces = typeBI.interfaces;
-    EngineTestCase.assertLength(1, interfaces);
+    expect(interfaces, hasLength(1));
     InterfaceType result = interfaces[0];
-    JUnitTestCase.assertSame(classA, result.element);
-    JUnitTestCase.assertSame(typeI, result.typeArguments[0]);
+    expect(result.element, same(classA));
+    expect(result.typeArguments[0], same(typeI));
   }
 
   void test_getLeastUpperBound_directInterfaceCase() {
@@ -1864,8 +1865,8 @@
     InterfaceType typeC = classC.type;
     classB.interfaces = <InterfaceType> [typeA];
     classC.interfaces = <InterfaceType> [typeB];
-    JUnitTestCase.assertEquals(typeB, typeB.getLeastUpperBound(typeC));
-    JUnitTestCase.assertEquals(typeB, typeC.getLeastUpperBound(typeB));
+    expect(typeB.getLeastUpperBound(typeC), typeB);
+    expect(typeC.getLeastUpperBound(typeB), typeB);
   }
 
   void test_getLeastUpperBound_directSubclassCase() {
@@ -1879,14 +1880,14 @@
     ClassElementImpl classC = ElementFactory.classElement("C", classB.type, []);
     InterfaceType typeB = classB.type;
     InterfaceType typeC = classC.type;
-    JUnitTestCase.assertEquals(typeB, typeB.getLeastUpperBound(typeC));
-    JUnitTestCase.assertEquals(typeB, typeC.getLeastUpperBound(typeB));
+    expect(typeB.getLeastUpperBound(typeC), typeB);
+    expect(typeC.getLeastUpperBound(typeB), typeB);
   }
 
   void test_getLeastUpperBound_functionType() {
     DartType interfaceType = ElementFactory.classElement2("A", []).type;
     FunctionTypeImpl functionType = new FunctionTypeImpl.con1(new FunctionElementImpl.forNode(AstFactory.identifier3("f")));
-    JUnitTestCase.assertNull(interfaceType.getLeastUpperBound(functionType));
+    expect(interfaceType.getLeastUpperBound(functionType), isNull);
   }
 
   void test_getLeastUpperBound_mixinCase() {
@@ -1908,13 +1909,13 @@
         ElementFactory.classElement2("N", []).type,
         ElementFactory.classElement2("O", []).type,
         ElementFactory.classElement2("P", []).type];
-    JUnitTestCase.assertEquals(typeA, typeD.getLeastUpperBound(typeC));
-    JUnitTestCase.assertEquals(typeA, typeC.getLeastUpperBound(typeD));
+    expect(typeD.getLeastUpperBound(typeC), typeA);
+    expect(typeC.getLeastUpperBound(typeD), typeA);
   }
 
   void test_getLeastUpperBound_null() {
     DartType interfaceType = ElementFactory.classElement2("A", []).type;
-    JUnitTestCase.assertNull(interfaceType.getLeastUpperBound(null));
+    expect(interfaceType.getLeastUpperBound(null), isNull);
   }
 
   void test_getLeastUpperBound_object() {
@@ -1924,17 +1925,17 @@
     InterfaceType typeB = classB.type;
     DartType typeObject = typeA.element.supertype;
     // assert that object does not have a super type
-    JUnitTestCase.assertNull((typeObject.element as ClassElement).supertype);
+    expect((typeObject.element as ClassElement).supertype, isNull);
     // assert that both A and B have the same super type of Object
-    JUnitTestCase.assertEquals(typeObject, typeB.element.supertype);
+    expect(typeB.element.supertype, typeObject);
     // finally, assert that the only least upper bound of A and B is Object
-    JUnitTestCase.assertEquals(typeObject, typeA.getLeastUpperBound(typeB));
+    expect(typeA.getLeastUpperBound(typeB), typeObject);
   }
 
   void test_getLeastUpperBound_self() {
     ClassElement classA = ElementFactory.classElement2("A", []);
     InterfaceType typeA = classA.type;
-    JUnitTestCase.assertEquals(typeA, typeA.getLeastUpperBound(typeA));
+    expect(typeA.getLeastUpperBound(typeA), typeA);
   }
 
   void test_getLeastUpperBound_sharedSuperclass1() {
@@ -1944,8 +1945,8 @@
     InterfaceType typeA = classA.type;
     InterfaceType typeB = classB.type;
     InterfaceType typeC = classC.type;
-    JUnitTestCase.assertEquals(typeA, typeB.getLeastUpperBound(typeC));
-    JUnitTestCase.assertEquals(typeA, typeC.getLeastUpperBound(typeB));
+    expect(typeB.getLeastUpperBound(typeC), typeA);
+    expect(typeC.getLeastUpperBound(typeB), typeA);
   }
 
   void test_getLeastUpperBound_sharedSuperclass2() {
@@ -1956,8 +1957,8 @@
     InterfaceType typeA = classA.type;
     InterfaceType typeB = classB.type;
     InterfaceType typeD = classD.type;
-    JUnitTestCase.assertEquals(typeA, typeB.getLeastUpperBound(typeD));
-    JUnitTestCase.assertEquals(typeA, typeD.getLeastUpperBound(typeB));
+    expect(typeB.getLeastUpperBound(typeD), typeA);
+    expect(typeD.getLeastUpperBound(typeB), typeA);
   }
 
   void test_getLeastUpperBound_sharedSuperclass3() {
@@ -1968,8 +1969,8 @@
     InterfaceType typeB = classB.type;
     InterfaceType typeC = classC.type;
     InterfaceType typeD = classD.type;
-    JUnitTestCase.assertEquals(typeB, typeC.getLeastUpperBound(typeD));
-    JUnitTestCase.assertEquals(typeB, typeD.getLeastUpperBound(typeC));
+    expect(typeC.getLeastUpperBound(typeD), typeB);
+    expect(typeD.getLeastUpperBound(typeC), typeB);
   }
 
   void test_getLeastUpperBound_sharedSuperclass4() {
@@ -1985,8 +1986,8 @@
     InterfaceType typeC = classC.type;
     classB.interfaces = <InterfaceType> [typeA2];
     classC.interfaces = <InterfaceType> [typeA3];
-    JUnitTestCase.assertEquals(typeA, typeB.getLeastUpperBound(typeC));
-    JUnitTestCase.assertEquals(typeA, typeC.getLeastUpperBound(typeB));
+    expect(typeB.getLeastUpperBound(typeC), typeA);
+    expect(typeC.getLeastUpperBound(typeB), typeA);
   }
 
   void test_getLeastUpperBound_sharedSuperinterface1() {
@@ -1998,8 +1999,8 @@
     InterfaceType typeC = classC.type;
     classB.interfaces = <InterfaceType> [typeA];
     classC.interfaces = <InterfaceType> [typeA];
-    JUnitTestCase.assertEquals(typeA, typeB.getLeastUpperBound(typeC));
-    JUnitTestCase.assertEquals(typeA, typeC.getLeastUpperBound(typeB));
+    expect(typeB.getLeastUpperBound(typeC), typeA);
+    expect(typeC.getLeastUpperBound(typeB), typeA);
   }
 
   void test_getLeastUpperBound_sharedSuperinterface2() {
@@ -2014,8 +2015,8 @@
     classB.interfaces = <InterfaceType> [typeA];
     classC.interfaces = <InterfaceType> [typeA];
     classD.interfaces = <InterfaceType> [typeC];
-    JUnitTestCase.assertEquals(typeA, typeB.getLeastUpperBound(typeD));
-    JUnitTestCase.assertEquals(typeA, typeD.getLeastUpperBound(typeB));
+    expect(typeB.getLeastUpperBound(typeD), typeA);
+    expect(typeD.getLeastUpperBound(typeB), typeA);
   }
 
   void test_getLeastUpperBound_sharedSuperinterface3() {
@@ -2030,8 +2031,8 @@
     classB.interfaces = <InterfaceType> [typeA];
     classC.interfaces = <InterfaceType> [typeB];
     classD.interfaces = <InterfaceType> [typeB];
-    JUnitTestCase.assertEquals(typeB, typeC.getLeastUpperBound(typeD));
-    JUnitTestCase.assertEquals(typeB, typeD.getLeastUpperBound(typeC));
+    expect(typeC.getLeastUpperBound(typeD), typeB);
+    expect(typeD.getLeastUpperBound(typeC), typeB);
   }
 
   void test_getLeastUpperBound_sharedSuperinterface4() {
@@ -2047,14 +2048,14 @@
     InterfaceType typeC = classC.type;
     classB.interfaces = <InterfaceType> [typeA, typeA2];
     classC.interfaces = <InterfaceType> [typeA, typeA3];
-    JUnitTestCase.assertEquals(typeA, typeB.getLeastUpperBound(typeC));
-    JUnitTestCase.assertEquals(typeA, typeC.getLeastUpperBound(typeB));
+    expect(typeB.getLeastUpperBound(typeC), typeA);
+    expect(typeC.getLeastUpperBound(typeB), typeA);
   }
 
   void test_getLeastUpperBound_twoComparables() {
     InterfaceType string = _typeProvider.stringType;
     InterfaceType num = _typeProvider.numType;
-    JUnitTestCase.assertEquals(_typeProvider.objectType, string.getLeastUpperBound(num));
+    expect(string.getLeastUpperBound(num), _typeProvider.objectType);
   }
 
   void test_getLeastUpperBound_typeParameters_different() {
@@ -2067,7 +2068,7 @@
     InterfaceType doubleType = _typeProvider.doubleType;
     InterfaceType listOfIntType = listType.substitute4(<DartType> [intType]);
     InterfaceType listOfDoubleType = listType.substitute4(<DartType> [doubleType]);
-    JUnitTestCase.assertEquals(_typeProvider.objectType, listOfIntType.getLeastUpperBound(listOfDoubleType));
+    expect(listOfIntType.getLeastUpperBound(listOfDoubleType), _typeProvider.objectType);
   }
 
   void test_getLeastUpperBound_typeParameters_same() {
@@ -2078,7 +2079,7 @@
     InterfaceType listType = _typeProvider.listType;
     InterfaceType intType = _typeProvider.intType;
     InterfaceType listOfIntType = listType.substitute4(<DartType> [intType]);
-    JUnitTestCase.assertEquals(listOfIntType, listOfIntType.getLeastUpperBound(listOfIntType));
+    expect(listOfIntType.getLeastUpperBound(listOfIntType), listOfIntType);
   }
 
   void test_getMethod_implemented() {
@@ -2090,7 +2091,7 @@
     MethodElementImpl methodM = ElementFactory.methodElement(methodName, null, []);
     classA.methods = <MethodElement> [methodM];
     InterfaceType typeA = classA.type;
-    JUnitTestCase.assertSame(methodM, typeA.getMethod(methodName));
+    expect(typeA.getMethod(methodName), same(methodM));
   }
 
   void test_getMethod_parameterized() {
@@ -2110,12 +2111,12 @@
     InterfaceTypeImpl typeAI = new InterfaceTypeImpl.con1(classA);
     typeAI.typeArguments = <DartType> [typeI];
     MethodElement method = typeAI.getMethod(methodName);
-    JUnitTestCase.assertNotNull(method);
+    expect(method, isNotNull);
     FunctionType methodType = method.type;
-    JUnitTestCase.assertSame(typeI, methodType.returnType);
+    expect(methodType.returnType, same(typeI));
     List<DartType> parameterTypes = methodType.normalParameterTypes;
-    EngineTestCase.assertLength(1, parameterTypes);
-    JUnitTestCase.assertSame(typeI, parameterTypes[0]);
+    expect(parameterTypes, hasLength(1));
+    expect(parameterTypes[0], same(typeI));
   }
 
   void test_getMethod_unimplemented() {
@@ -2124,7 +2125,7 @@
     //
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     InterfaceType typeA = classA.type;
-    JUnitTestCase.assertNull(typeA.getMethod("m"));
+    expect(typeA.getMethod("m"), isNull);
   }
 
   void test_getMethods() {
@@ -2133,13 +2134,13 @@
     MethodElementImpl methodTwo = ElementFactory.methodElement("two", null, []);
     typeElement.methods = <MethodElement> [methodOne, methodTwo];
     InterfaceTypeImpl type = new InterfaceTypeImpl.con1(typeElement);
-    JUnitTestCase.assertEquals(2, type.methods.length);
+    expect(type.methods.length, 2);
   }
 
   void test_getMethods_empty() {
     ClassElementImpl typeElement = ElementFactory.classElement2("A", []);
     InterfaceTypeImpl type = new InterfaceTypeImpl.con1(typeElement);
-    JUnitTestCase.assertEquals(0, type.methods.length);
+    expect(type.methods.length, 0);
   }
 
   void test_getMixins_nonParameterized() {
@@ -2153,12 +2154,12 @@
     ClassElementImpl classC = ElementFactory.classElement2("C", []);
     classC.mixins = <InterfaceType> [typeA, typeB];
     List<InterfaceType> interfaces = classC.type.mixins;
-    EngineTestCase.assertLength(2, interfaces);
+    expect(interfaces, hasLength(2));
     if (identical(interfaces[0], typeA)) {
-      JUnitTestCase.assertSame(typeB, interfaces[1]);
+      expect(interfaces[1], same(typeB));
     } else {
-      JUnitTestCase.assertSame(typeB, interfaces[0]);
-      JUnitTestCase.assertSame(typeA, interfaces[1]);
+      expect(interfaces[0], same(typeB));
+      expect(interfaces[1], same(typeA));
     }
   }
 
@@ -2180,10 +2181,10 @@
     InterfaceTypeImpl typeBI = new InterfaceTypeImpl.con1(classB);
     typeBI.typeArguments = <DartType> [typeI];
     List<InterfaceType> interfaces = typeBI.mixins;
-    EngineTestCase.assertLength(1, interfaces);
+    expect(interfaces, hasLength(1));
     InterfaceType result = interfaces[0];
-    JUnitTestCase.assertSame(classA, result.element);
-    JUnitTestCase.assertSame(typeI, result.typeArguments[0]);
+    expect(result.element, same(classA));
+    expect(result.typeArguments[0], same(typeI));
   }
 
   void test_getSetter_implemented() {
@@ -2195,7 +2196,7 @@
     PropertyAccessorElement setterS = ElementFactory.setterElement(setterName, false, null);
     classA.accessors = <PropertyAccessorElement> [setterS];
     InterfaceType typeA = classA.type;
-    JUnitTestCase.assertSame(setterS, typeA.getSetter(setterName));
+    expect(typeA.getSetter(setterName), same(setterS));
   }
 
   void test_getSetter_parameterized() {
@@ -2215,11 +2216,11 @@
     InterfaceTypeImpl typeAI = new InterfaceTypeImpl.con1(classA);
     typeAI.typeArguments = <DartType> [typeI];
     PropertyAccessorElement setter = typeAI.getSetter(setterName);
-    JUnitTestCase.assertNotNull(setter);
+    expect(setter, isNotNull);
     FunctionType setterType = setter.type;
     List<DartType> parameterTypes = setterType.normalParameterTypes;
-    EngineTestCase.assertLength(1, parameterTypes);
-    JUnitTestCase.assertSame(typeI, parameterTypes[0]);
+    expect(parameterTypes, hasLength(1));
+    expect(parameterTypes[0], same(typeI));
   }
 
   void test_getSetter_unimplemented() {
@@ -2228,7 +2229,7 @@
     //
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     InterfaceType typeA = classA.type;
-    JUnitTestCase.assertNull(typeA.getSetter("s"));
+    expect(typeA.getSetter("s"), isNull);
   }
 
   void test_getSuperclass_nonParameterized() {
@@ -2239,7 +2240,7 @@
     InterfaceType typeA = classA.type;
     ClassElementImpl classB = ElementFactory.classElement("B", typeA, []);
     InterfaceType typeB = classB.type;
-    JUnitTestCase.assertSame(typeA, typeB.superclass);
+    expect(typeB.superclass, same(typeA));
   }
 
   void test_getSuperclass_parameterized() {
@@ -2260,19 +2261,19 @@
     InterfaceTypeImpl typeBI = new InterfaceTypeImpl.con1(classB);
     typeBI.typeArguments = <DartType> [typeI];
     InterfaceType superclass = typeBI.superclass;
-    JUnitTestCase.assertSame(classA, superclass.element);
-    JUnitTestCase.assertSame(typeI, superclass.typeArguments[0]);
+    expect(superclass.element, same(classA));
+    expect(superclass.typeArguments[0], same(typeI));
   }
 
   void test_getTypeArguments_empty() {
     InterfaceType type = ElementFactory.classElement2("A", []).type;
-    EngineTestCase.assertLength(0, type.typeArguments);
+    expect(type.typeArguments, hasLength(0));
   }
 
   void test_hashCode() {
     ClassElement classA = ElementFactory.classElement2("A", []);
     InterfaceType typeA = classA.type;
-    JUnitTestCase.assertFalse(0 == typeA.hashCode);
+    expect(0 == typeA.hashCode, isFalse);
   }
 
   void test_isAssignableTo_typeVariables() {
@@ -2291,11 +2292,11 @@
     typeAF.typeArguments = <DartType> [classB.typeParameters[0].type];
     InterfaceTypeImpl typeAG = new InterfaceTypeImpl.con1(classA);
     typeAG.typeArguments = <DartType> [classB.typeParameters[1].type];
-    JUnitTestCase.assertFalse(typeAG.isAssignableTo(typeAF));
+    expect(typeAG.isAssignableTo(typeAF), isFalse);
   }
 
   void test_isAssignableTo_void() {
-    JUnitTestCase.assertFalse(VoidTypeImpl.instance.isAssignableTo(_typeProvider.intType));
+    expect(VoidTypeImpl.instance.isAssignableTo(_typeProvider.intType), isFalse);
   }
 
   void test_isDirectSupertypeOf_extends() {
@@ -2303,7 +2304,7 @@
     ClassElement classB = ElementFactory.classElement("B", classA.type, []);
     InterfaceType typeA = classA.type;
     InterfaceType typeB = classB.type;
-    JUnitTestCase.assertTrue(typeA.isDirectSupertypeOf(typeB));
+    expect(typeA.isDirectSupertypeOf(typeB), isTrue);
   }
 
   void test_isDirectSupertypeOf_false() {
@@ -2312,7 +2313,7 @@
     ClassElement classC = ElementFactory.classElement("C", classB.type, []);
     InterfaceType typeA = classA.type;
     InterfaceType typeC = classC.type;
-    JUnitTestCase.assertFalse(typeA.isDirectSupertypeOf(typeC));
+    expect(typeA.isDirectSupertypeOf(typeC), isFalse);
   }
 
   void test_isDirectSupertypeOf_implements() {
@@ -2321,7 +2322,7 @@
     InterfaceType typeA = classA.type;
     InterfaceType typeB = classB.type;
     classB.interfaces = <InterfaceType> [typeA];
-    JUnitTestCase.assertTrue(typeA.isDirectSupertypeOf(typeB));
+    expect(typeA.isDirectSupertypeOf(typeB), isTrue);
   }
 
   void test_isDirectSupertypeOf_with() {
@@ -2330,12 +2331,12 @@
     InterfaceType typeA = classA.type;
     InterfaceType typeB = classB.type;
     classB.mixins = <InterfaceType> [typeA];
-    JUnitTestCase.assertTrue(typeA.isDirectSupertypeOf(typeB));
+    expect(typeA.isDirectSupertypeOf(typeB), isTrue);
   }
 
   void test_isMoreSpecificThan_bottom() {
     DartType type = ElementFactory.classElement2("A", []).type;
-    JUnitTestCase.assertTrue(BottomTypeImpl.instance.isMoreSpecificThan(type));
+    expect(BottomTypeImpl.instance.isMoreSpecificThan(type), isTrue);
   }
 
   void test_isMoreSpecificThan_covariance() {
@@ -2346,8 +2347,8 @@
     InterfaceTypeImpl typeAJ = new InterfaceTypeImpl.con1(classA);
     typeAI.typeArguments = <DartType> [classI.type];
     typeAJ.typeArguments = <DartType> [classJ.type];
-    JUnitTestCase.assertTrue(typeAJ.isMoreSpecificThan(typeAI));
-    JUnitTestCase.assertFalse(typeAI.isMoreSpecificThan(typeAJ));
+    expect(typeAJ.isMoreSpecificThan(typeAI), isTrue);
+    expect(typeAI.isMoreSpecificThan(typeAJ), isFalse);
   }
 
   void test_isMoreSpecificThan_directSupertype() {
@@ -2355,14 +2356,14 @@
     ClassElement classB = ElementFactory.classElement("B", classA.type, []);
     InterfaceType typeA = classA.type;
     InterfaceType typeB = classB.type;
-    JUnitTestCase.assertTrue(typeB.isMoreSpecificThan(typeA));
+    expect(typeB.isMoreSpecificThan(typeA), isTrue);
     // the opposite test tests a different branch in isMoreSpecificThan()
-    JUnitTestCase.assertFalse(typeA.isMoreSpecificThan(typeB));
+    expect(typeA.isMoreSpecificThan(typeB), isFalse);
   }
 
   void test_isMoreSpecificThan_dynamic() {
     InterfaceType type = ElementFactory.classElement2("A", []).type;
-    JUnitTestCase.assertTrue(type.isMoreSpecificThan(DynamicTypeImpl.instance));
+    expect(type.isMoreSpecificThan(DynamicTypeImpl.instance), isTrue);
   }
 
   void test_isMoreSpecificThan_generic() {
@@ -2371,13 +2372,13 @@
     DartType dynamicType = DynamicTypeImpl.instance;
     InterfaceType typeAOfDynamic = classA.type.substitute4(<DartType> [dynamicType]);
     InterfaceType typeAOfB = classA.type.substitute4(<DartType> [classB.type]);
-    JUnitTestCase.assertFalse(typeAOfDynamic.isMoreSpecificThan(typeAOfB));
-    JUnitTestCase.assertTrue(typeAOfB.isMoreSpecificThan(typeAOfDynamic));
+    expect(typeAOfDynamic.isMoreSpecificThan(typeAOfB), isFalse);
+    expect(typeAOfB.isMoreSpecificThan(typeAOfDynamic), isTrue);
   }
 
   void test_isMoreSpecificThan_self() {
     InterfaceType type = ElementFactory.classElement2("A", []).type;
-    JUnitTestCase.assertTrue(type.isMoreSpecificThan(type));
+    expect(type.isMoreSpecificThan(type), isTrue);
   }
 
   void test_isMoreSpecificThan_transitive_interface() {
@@ -2392,7 +2393,7 @@
     classC.interfaces = <InterfaceType> [classB.type];
     InterfaceType typeA = classA.type;
     InterfaceType typeC = classC.type;
-    JUnitTestCase.assertTrue(typeC.isMoreSpecificThan(typeA));
+    expect(typeC.isMoreSpecificThan(typeA), isTrue);
   }
 
   void test_isMoreSpecificThan_transitive_mixin() {
@@ -2407,7 +2408,7 @@
     classC.mixins = <InterfaceType> [classB.type];
     InterfaceType typeA = classA.type;
     InterfaceType typeC = classC.type;
-    JUnitTestCase.assertTrue(typeC.isMoreSpecificThan(typeA));
+    expect(typeC.isMoreSpecificThan(typeA), isTrue);
   }
 
   void test_isMoreSpecificThan_transitive_recursive() {
@@ -2422,7 +2423,7 @@
     InterfaceType typeA = classA.type;
     InterfaceType typeC = classC.type;
     classA.supertype = classB.type;
-    JUnitTestCase.assertFalse(typeA.isMoreSpecificThan(typeC));
+    expect(typeA.isMoreSpecificThan(typeC), isFalse);
   }
 
   void test_isMoreSpecificThan_transitive_superclass() {
@@ -2436,7 +2437,7 @@
     ClassElement classC = ElementFactory.classElement("C", classB.type, []);
     InterfaceType typeA = classA.type;
     InterfaceType typeC = classC.type;
-    JUnitTestCase.assertTrue(typeC.isMoreSpecificThan(typeA));
+    expect(typeC.isMoreSpecificThan(typeA), isTrue);
   }
 
   void test_isMoreSpecificThan_typeParameterType() {
@@ -2447,8 +2448,8 @@
     InterfaceType typeA = classA.type;
     TypeParameterType parameterType = classA.typeParameters[0].type;
     DartType objectType = _typeProvider.objectType;
-    JUnitTestCase.assertTrue(parameterType.isMoreSpecificThan(objectType));
-    JUnitTestCase.assertFalse(parameterType.isMoreSpecificThan(typeA));
+    expect(parameterType.isMoreSpecificThan(objectType), isTrue);
+    expect(parameterType.isMoreSpecificThan(typeA), isFalse);
   }
 
   void test_isMoreSpecificThan_typeParameterType_withBound() {
@@ -2464,7 +2465,7 @@
     parameterEA.bound = typeA;
     parameterEA.type = parameterAEType;
     classB.typeParameters = <TypeParameterElementImpl> [parameterEA];
-    JUnitTestCase.assertTrue(parameterAEType.isMoreSpecificThan(typeA));
+    expect(parameterAEType.isMoreSpecificThan(typeA), isTrue);
   }
 
   void test_isSubtypeOf_directSubtype() {
@@ -2472,16 +2473,16 @@
     ClassElement classB = ElementFactory.classElement("B", classA.type, []);
     InterfaceType typeA = classA.type;
     InterfaceType typeB = classB.type;
-    JUnitTestCase.assertTrue(typeB.isSubtypeOf(typeA));
-    JUnitTestCase.assertFalse(typeA.isSubtypeOf(typeB));
+    expect(typeB.isSubtypeOf(typeA), isTrue);
+    expect(typeA.isSubtypeOf(typeB), isFalse);
   }
 
   void test_isSubtypeOf_dynamic() {
     ClassElement classA = ElementFactory.classElement2("A", []);
     InterfaceType typeA = classA.type;
     DartType dynamicType = DynamicTypeImpl.instance;
-    JUnitTestCase.assertTrue(dynamicType.isSubtypeOf(typeA));
-    JUnitTestCase.assertTrue(typeA.isSubtypeOf(dynamicType));
+    expect(dynamicType.isSubtypeOf(typeA), isTrue);
+    expect(typeA.isSubtypeOf(dynamicType), isTrue);
   }
 
   void test_isSubtypeOf_function() {
@@ -2495,7 +2496,7 @@
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     classA.methods = <MethodElement> [ElementFactory.methodElement("call", VoidTypeImpl.instance, [stringType])];
     FunctionType functionType = ElementFactory.functionElement5("f", <ClassElement> [stringType.element]).type;
-    JUnitTestCase.assertTrue(classA.type.isSubtypeOf(functionType));
+    expect(classA.type.isSubtypeOf(functionType), isTrue);
   }
 
   void test_isSubtypeOf_generic() {
@@ -2504,8 +2505,8 @@
     DartType dynamicType = DynamicTypeImpl.instance;
     InterfaceType typeAOfDynamic = classA.type.substitute4(<DartType> [dynamicType]);
     InterfaceType typeAOfB = classA.type.substitute4(<DartType> [classB.type]);
-    JUnitTestCase.assertTrue(typeAOfDynamic.isSubtypeOf(typeAOfB));
-    JUnitTestCase.assertTrue(typeAOfB.isSubtypeOf(typeAOfDynamic));
+    expect(typeAOfDynamic.isSubtypeOf(typeAOfB), isTrue);
+    expect(typeAOfB.isSubtypeOf(typeAOfDynamic), isTrue);
   }
 
   void test_isSubtypeOf_interface() {
@@ -2517,10 +2518,10 @@
     InterfaceType typeB = classB.type;
     InterfaceType typeC = classC.type;
     classC.interfaces = <InterfaceType> [typeB];
-    JUnitTestCase.assertTrue(typeC.isSubtypeOf(typeB));
-    JUnitTestCase.assertTrue(typeC.isSubtypeOf(typeObject));
-    JUnitTestCase.assertTrue(typeC.isSubtypeOf(typeA));
-    JUnitTestCase.assertFalse(typeA.isSubtypeOf(typeC));
+    expect(typeC.isSubtypeOf(typeB), isTrue);
+    expect(typeC.isSubtypeOf(typeObject), isTrue);
+    expect(typeC.isSubtypeOf(typeA), isTrue);
+    expect(typeA.isSubtypeOf(typeC), isFalse);
   }
 
   void test_isSubtypeOf_mixins() {
@@ -2537,24 +2538,24 @@
     InterfaceType typeB = classB.type;
     InterfaceType typeC = classC.type;
     classC.mixins = <InterfaceType> [typeB];
-    JUnitTestCase.assertTrue(typeC.isSubtypeOf(typeB));
-    JUnitTestCase.assertTrue(typeC.isSubtypeOf(typeObject));
-    JUnitTestCase.assertTrue(typeC.isSubtypeOf(typeA));
-    JUnitTestCase.assertFalse(typeA.isSubtypeOf(typeC));
+    expect(typeC.isSubtypeOf(typeB), isTrue);
+    expect(typeC.isSubtypeOf(typeObject), isTrue);
+    expect(typeC.isSubtypeOf(typeA), isTrue);
+    expect(typeA.isSubtypeOf(typeC), isFalse);
   }
 
   void test_isSubtypeOf_object() {
     ClassElement classA = ElementFactory.classElement2("A", []);
     InterfaceType typeA = classA.type;
     InterfaceType typeObject = classA.supertype;
-    JUnitTestCase.assertTrue(typeA.isSubtypeOf(typeObject));
-    JUnitTestCase.assertFalse(typeObject.isSubtypeOf(typeA));
+    expect(typeA.isSubtypeOf(typeObject), isTrue);
+    expect(typeObject.isSubtypeOf(typeA), isFalse);
   }
 
   void test_isSubtypeOf_self() {
     ClassElement classA = ElementFactory.classElement2("A", []);
     InterfaceType typeA = classA.type;
-    JUnitTestCase.assertTrue(typeA.isSubtypeOf(typeA));
+    expect(typeA.isSubtypeOf(typeA), isTrue);
   }
 
   void test_isSubtypeOf_transitive_recursive() {
@@ -2569,7 +2570,7 @@
     InterfaceType typeA = classA.type;
     InterfaceType typeC = classC.type;
     classA.supertype = classB.type;
-    JUnitTestCase.assertFalse(typeA.isSubtypeOf(typeC));
+    expect(typeA.isSubtypeOf(typeC), isFalse);
   }
 
   void test_isSubtypeOf_transitive_superclass() {
@@ -2578,8 +2579,8 @@
     ClassElement classC = ElementFactory.classElement("C", classB.type, []);
     InterfaceType typeA = classA.type;
     InterfaceType typeC = classC.type;
-    JUnitTestCase.assertTrue(typeC.isSubtypeOf(typeA));
-    JUnitTestCase.assertFalse(typeA.isSubtypeOf(typeC));
+    expect(typeC.isSubtypeOf(typeA), isTrue);
+    expect(typeA.isSubtypeOf(typeC), isFalse);
   }
 
   void test_isSubtypeOf_typeArguments() {
@@ -2597,19 +2598,19 @@
     typeAJ.typeArguments = <DartType> [classJ.type];
     typeAK.typeArguments = <DartType> [classK.type];
     // A<J> <: A<I> since J <: I
-    JUnitTestCase.assertTrue(typeAJ.isSubtypeOf(typeAI));
-    JUnitTestCase.assertFalse(typeAI.isSubtypeOf(typeAJ));
+    expect(typeAJ.isSubtypeOf(typeAI), isTrue);
+    expect(typeAI.isSubtypeOf(typeAJ), isFalse);
     // A<I> <: A<I> since I <: I
-    JUnitTestCase.assertTrue(typeAI.isSubtypeOf(typeAI));
+    expect(typeAI.isSubtypeOf(typeAI), isTrue);
     // A <: A<I> and A <: A<J>
-    JUnitTestCase.assertTrue(typeA_dynamic.isSubtypeOf(typeAI));
-    JUnitTestCase.assertTrue(typeA_dynamic.isSubtypeOf(typeAJ));
+    expect(typeA_dynamic.isSubtypeOf(typeAI), isTrue);
+    expect(typeA_dynamic.isSubtypeOf(typeAJ), isTrue);
     // A<I> <: A and A<J> <: A
-    JUnitTestCase.assertTrue(typeAI.isSubtypeOf(typeA_dynamic));
-    JUnitTestCase.assertTrue(typeAJ.isSubtypeOf(typeA_dynamic));
+    expect(typeAI.isSubtypeOf(typeA_dynamic), isTrue);
+    expect(typeAJ.isSubtypeOf(typeA_dynamic), isTrue);
     // A<I> !<: A<K> and A<K> !<: A<I>
-    JUnitTestCase.assertFalse(typeAI.isSubtypeOf(typeAK));
-    JUnitTestCase.assertFalse(typeAK.isSubtypeOf(typeAI));
+    expect(typeAI.isSubtypeOf(typeAK), isFalse);
+    expect(typeAK.isSubtypeOf(typeAI), isFalse);
   }
 
   void test_isSubtypeOf_typeParameter() {
@@ -2619,7 +2620,7 @@
     ClassElement classA = ElementFactory.classElement2("A", ["E"]);
     InterfaceType typeA = classA.type;
     TypeParameterType parameterType = classA.typeParameters[0].type;
-    JUnitTestCase.assertFalse(typeA.isSubtypeOf(parameterType));
+    expect(typeA.isSubtypeOf(parameterType), isFalse);
   }
 
   void test_isSupertypeOf_directSupertype() {
@@ -2627,16 +2628,16 @@
     ClassElement classB = ElementFactory.classElement("B", classA.type, []);
     InterfaceType typeA = classA.type;
     InterfaceType typeB = classB.type;
-    JUnitTestCase.assertFalse(typeB.isSupertypeOf(typeA));
-    JUnitTestCase.assertTrue(typeA.isSupertypeOf(typeB));
+    expect(typeB.isSupertypeOf(typeA), isFalse);
+    expect(typeA.isSupertypeOf(typeB), isTrue);
   }
 
   void test_isSupertypeOf_dynamic() {
     ClassElement classA = ElementFactory.classElement2("A", []);
     InterfaceType typeA = classA.type;
     DartType dynamicType = DynamicTypeImpl.instance;
-    JUnitTestCase.assertTrue(dynamicType.isSupertypeOf(typeA));
-    JUnitTestCase.assertTrue(typeA.isSupertypeOf(dynamicType));
+    expect(dynamicType.isSupertypeOf(typeA), isTrue);
+    expect(typeA.isSupertypeOf(dynamicType), isTrue);
   }
 
   void test_isSupertypeOf_indirectSupertype() {
@@ -2645,8 +2646,8 @@
     ClassElement classC = ElementFactory.classElement("C", classB.type, []);
     InterfaceType typeA = classA.type;
     InterfaceType typeC = classC.type;
-    JUnitTestCase.assertFalse(typeC.isSupertypeOf(typeA));
-    JUnitTestCase.assertTrue(typeA.isSupertypeOf(typeC));
+    expect(typeC.isSupertypeOf(typeA), isFalse);
+    expect(typeA.isSupertypeOf(typeC), isTrue);
   }
 
   void test_isSupertypeOf_interface() {
@@ -2658,10 +2659,10 @@
     InterfaceType typeB = classB.type;
     InterfaceType typeC = classC.type;
     classC.interfaces = <InterfaceType> [typeB];
-    JUnitTestCase.assertTrue(typeB.isSupertypeOf(typeC));
-    JUnitTestCase.assertTrue(typeObject.isSupertypeOf(typeC));
-    JUnitTestCase.assertTrue(typeA.isSupertypeOf(typeC));
-    JUnitTestCase.assertFalse(typeC.isSupertypeOf(typeA));
+    expect(typeB.isSupertypeOf(typeC), isTrue);
+    expect(typeObject.isSupertypeOf(typeC), isTrue);
+    expect(typeA.isSupertypeOf(typeC), isTrue);
+    expect(typeC.isSupertypeOf(typeA), isFalse);
   }
 
   void test_isSupertypeOf_mixins() {
@@ -2678,24 +2679,24 @@
     InterfaceType typeB = classB.type;
     InterfaceType typeC = classC.type;
     classC.mixins = <InterfaceType> [typeB];
-    JUnitTestCase.assertTrue(typeB.isSupertypeOf(typeC));
-    JUnitTestCase.assertTrue(typeObject.isSupertypeOf(typeC));
-    JUnitTestCase.assertTrue(typeA.isSupertypeOf(typeC));
-    JUnitTestCase.assertFalse(typeC.isSupertypeOf(typeA));
+    expect(typeB.isSupertypeOf(typeC), isTrue);
+    expect(typeObject.isSupertypeOf(typeC), isTrue);
+    expect(typeA.isSupertypeOf(typeC), isTrue);
+    expect(typeC.isSupertypeOf(typeA), isFalse);
   }
 
   void test_isSupertypeOf_object() {
     ClassElement classA = ElementFactory.classElement2("A", []);
     InterfaceType typeA = classA.type;
     InterfaceType typeObject = classA.supertype;
-    JUnitTestCase.assertFalse(typeA.isSupertypeOf(typeObject));
-    JUnitTestCase.assertTrue(typeObject.isSupertypeOf(typeA));
+    expect(typeA.isSupertypeOf(typeObject), isFalse);
+    expect(typeObject.isSupertypeOf(typeA), isTrue);
   }
 
   void test_isSupertypeOf_self() {
     ClassElement classA = ElementFactory.classElement2("A", []);
     InterfaceType typeA = classA.type;
-    JUnitTestCase.assertTrue(typeA.isSupertypeOf(typeA));
+    expect(typeA.isSupertypeOf(typeA), isTrue);
   }
 
   void test_lookUpGetter_implemented() {
@@ -2710,7 +2711,7 @@
     LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
     CompilationUnitElement unit = library.definingCompilationUnit;
     (unit as CompilationUnitElementImpl).types = <ClassElement> [classA];
-    JUnitTestCase.assertSame(getterG, typeA.lookUpGetter(getterName, library));
+    expect(typeA.lookUpGetter(getterName, library), same(getterG));
   }
 
   void test_lookUpGetter_inherited() {
@@ -2727,7 +2728,7 @@
     LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
     CompilationUnitElement unit = library.definingCompilationUnit;
     (unit as CompilationUnitElementImpl).types = <ClassElement> [classA, classB];
-    JUnitTestCase.assertSame(getterG, typeB.lookUpGetter(getterName, library));
+    expect(typeB.lookUpGetter(getterName, library), same(getterG));
   }
 
   void test_lookUpGetter_recursive() {
@@ -2742,7 +2743,7 @@
     LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
     CompilationUnitElement unit = library.definingCompilationUnit;
     (unit as CompilationUnitElementImpl).types = <ClassElement> [classA, classB];
-    JUnitTestCase.assertNull(typeA.lookUpGetter("g", library));
+    expect(typeA.lookUpGetter("g", library), isNull);
   }
 
   void test_lookUpGetter_unimplemented() {
@@ -2754,7 +2755,7 @@
     LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
     CompilationUnitElement unit = library.definingCompilationUnit;
     (unit as CompilationUnitElementImpl).types = <ClassElement> [classA];
-    JUnitTestCase.assertNull(typeA.lookUpGetter("g", library));
+    expect(typeA.lookUpGetter("g", library), isNull);
   }
 
   void test_lookUpMethod_implemented() {
@@ -2769,7 +2770,7 @@
     LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
     CompilationUnitElement unit = library.definingCompilationUnit;
     (unit as CompilationUnitElementImpl).types = <ClassElement> [classA];
-    JUnitTestCase.assertSame(methodM, typeA.lookUpMethod(methodName, library));
+    expect(typeA.lookUpMethod(methodName, library), same(methodM));
   }
 
   void test_lookUpMethod_inherited() {
@@ -2786,7 +2787,7 @@
     LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
     CompilationUnitElement unit = library.definingCompilationUnit;
     (unit as CompilationUnitElementImpl).types = <ClassElement> [classA, classB];
-    JUnitTestCase.assertSame(methodM, typeB.lookUpMethod(methodName, library));
+    expect(typeB.lookUpMethod(methodName, library), same(methodM));
   }
 
   void test_lookUpMethod_parameterized() {
@@ -2815,12 +2816,12 @@
     InterfaceTypeImpl typeBI = new InterfaceTypeImpl.con1(classB);
     typeBI.typeArguments = <DartType> [typeI];
     MethodElement method = typeBI.lookUpMethod(methodName, library);
-    JUnitTestCase.assertNotNull(method);
+    expect(method, isNotNull);
     FunctionType methodType = method.type;
-    JUnitTestCase.assertSame(typeI, methodType.returnType);
+    expect(methodType.returnType, same(typeI));
     List<DartType> parameterTypes = methodType.normalParameterTypes;
-    EngineTestCase.assertLength(1, parameterTypes);
-    JUnitTestCase.assertSame(typeI, parameterTypes[0]);
+    expect(parameterTypes, hasLength(1));
+    expect(parameterTypes[0], same(typeI));
   }
 
   void test_lookUpMethod_recursive() {
@@ -2835,7 +2836,7 @@
     LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
     CompilationUnitElement unit = library.definingCompilationUnit;
     (unit as CompilationUnitElementImpl).types = <ClassElement> [classA, classB];
-    JUnitTestCase.assertNull(typeA.lookUpMethod("m", library));
+    expect(typeA.lookUpMethod("m", library), isNull);
   }
 
   void test_lookUpMethod_unimplemented() {
@@ -2847,7 +2848,7 @@
     LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
     CompilationUnitElement unit = library.definingCompilationUnit;
     (unit as CompilationUnitElementImpl).types = <ClassElement> [classA];
-    JUnitTestCase.assertNull(typeA.lookUpMethod("m", library));
+    expect(typeA.lookUpMethod("m", library), isNull);
   }
 
   void test_lookUpSetter_implemented() {
@@ -2862,7 +2863,7 @@
     LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
     CompilationUnitElement unit = library.definingCompilationUnit;
     (unit as CompilationUnitElementImpl).types = <ClassElement> [classA];
-    JUnitTestCase.assertSame(setterS, typeA.lookUpSetter(setterName, library));
+    expect(typeA.lookUpSetter(setterName, library), same(setterS));
   }
 
   void test_lookUpSetter_inherited() {
@@ -2879,7 +2880,7 @@
     LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
     CompilationUnitElement unit = library.definingCompilationUnit;
     (unit as CompilationUnitElementImpl).types = <ClassElement> [classA, classB];
-    JUnitTestCase.assertSame(setterS, typeB.lookUpSetter(setterName, library));
+    expect(typeB.lookUpSetter(setterName, library), same(setterS));
   }
 
   void test_lookUpSetter_recursive() {
@@ -2894,7 +2895,7 @@
     LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
     CompilationUnitElement unit = library.definingCompilationUnit;
     (unit as CompilationUnitElementImpl).types = <ClassElement> [classA, classB];
-    JUnitTestCase.assertNull(typeA.lookUpSetter("s", library));
+    expect(typeA.lookUpSetter("s", library), isNull);
   }
 
   void test_lookUpSetter_unimplemented() {
@@ -2906,7 +2907,7 @@
     LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
     CompilationUnitElement unit = library.definingCompilationUnit;
     (unit as CompilationUnitElementImpl).types = <ClassElement> [classA];
-    JUnitTestCase.assertNull(typeA.lookUpSetter("s", library));
+    expect(typeA.lookUpSetter("s", library), isNull);
   }
 
   void test_setTypeArguments() {
@@ -2915,7 +2916,7 @@
         ElementFactory.classElement2("B", []).type,
         ElementFactory.classElement2("C", []).type];
     type.typeArguments = typeArguments;
-    JUnitTestCase.assertEquals(typeArguments, type.typeArguments);
+    expect(type.typeArguments, typeArguments);
   }
 
   void test_substitute_equal() {
@@ -2925,10 +2926,10 @@
     List<DartType> args = [argumentType];
     List<DartType> params = [classAE.typeParameters[0].type];
     InterfaceType typeAESubbed = typeAE.substitute2(args, params);
-    JUnitTestCase.assertEquals(classAE, typeAESubbed.element);
+    expect(typeAESubbed.element, classAE);
     List<DartType> resultArguments = typeAESubbed.typeArguments;
-    EngineTestCase.assertLength(1, resultArguments);
-    JUnitTestCase.assertEquals(argumentType, resultArguments[0]);
+    expect(resultArguments, hasLength(1));
+    expect(resultArguments[0], argumentType);
   }
 
   void test_substitute_exception() {
@@ -2937,7 +2938,7 @@
       InterfaceTypeImpl type = new InterfaceTypeImpl.con1(classA);
       InterfaceType argumentType = ElementFactory.classElement2("B", []).type;
       type.substitute2(<DartType> [argumentType], <DartType> []);
-      JUnitTestCase.fail("Expected to encounter exception, argument and parameter type array lengths not equal.");
+      fail("Expected to encounter exception, argument and parameter type array lengths not equal.");
     } catch (e) {
       // Expected result
     }
@@ -2953,10 +2954,10 @@
     InterfaceType argumentType = ElementFactory.classElement2("B", []).type;
     TypeParameterTypeImpl parameterType = new TypeParameterTypeImpl(new TypeParameterElementImpl.forNode(AstFactory.identifier3("F")));
     InterfaceType result = type.substitute2(<DartType> [argumentType], <DartType> [parameterType]);
-    JUnitTestCase.assertEquals(classA, result.element);
+    expect(result.element, classA);
     List<DartType> resultArguments = result.typeArguments;
-    EngineTestCase.assertLength(1, resultArguments);
-    JUnitTestCase.assertEquals(parameter, resultArguments[0]);
+    expect(resultArguments, hasLength(1));
+    expect(resultArguments[0], parameter);
   }
 }
 
@@ -2969,7 +2970,7 @@
 
 class LibraryElementImplTest extends EngineTestCase {
   void test_creation() {
-    JUnitTestCase.assertNotNull(new LibraryElementImpl.forNode(createAnalysisContext(), AstFactory.libraryIdentifier2(["l"])));
+    expect(new LibraryElementImpl.forNode(createAnalysisContext(), AstFactory.libraryIdentifier2(["l"])), isNotNull);
   }
 
   void test_getImportedLibraries() {
@@ -2989,7 +2990,7 @@
         ElementFactory.importFor(library4, prefixA, [])];
     library1.imports = imports;
     List<LibraryElement> libraries = library1.importedLibraries;
-    EngineTestCase.assertEqualsIgnoreOrder(<LibraryElement> [library2, library3, library4], libraries);
+    expect(libraries, unorderedEquals(<LibraryElement> [library2, library3, library4]));
   }
 
   void test_getPrefixes() {
@@ -3005,12 +3006,12 @@
         ElementFactory.importFor(ElementFactory.library(context, "l6"), prefixB, [])];
     library.imports = imports;
     List<PrefixElement> prefixes = library.prefixes;
-    EngineTestCase.assertLength(2, prefixes);
+    expect(prefixes, hasLength(2));
     if (identical(prefixA, prefixes[0])) {
-      JUnitTestCase.assertSame(prefixB, prefixes[1]);
+      expect(prefixes[1], same(prefixB));
     } else {
-      JUnitTestCase.assertSame(prefixB, prefixes[0]);
-      JUnitTestCase.assertSame(prefixA, prefixes[1]);
+      expect(prefixes[0], same(prefixB));
+      expect(prefixes[1], same(prefixA));
     }
   }
 
@@ -3021,7 +3022,7 @@
     CompilationUnitElementImpl unitA = ElementFactory.compilationUnit("unit_a.dart");
     CompilationUnitElementImpl unitB = ElementFactory.compilationUnit("unit_b.dart");
     library.parts = <CompilationUnitElement> [unitA, unitB];
-    EngineTestCase.assertEqualsIgnoreOrder(<CompilationUnitElement> [unitLib, unitA, unitB], library.units);
+    expect(library.units, unorderedEquals(<CompilationUnitElement> [unitLib, unitA, unitB]));
   }
 
   void test_getVisibleLibraries_cycle() {
@@ -3031,7 +3032,7 @@
     libraryA.imports = <ImportElementImpl> [ElementFactory.importFor(library, null, [])];
     library.imports = <ImportElementImpl> [ElementFactory.importFor(libraryA, null, [])];
     List<LibraryElement> libraries = library.visibleLibraries;
-    EngineTestCase.assertEqualsIgnoreOrder(<LibraryElement> [library, libraryA], libraries);
+    expect(libraries, unorderedEquals(<LibraryElement> [library, libraryA]));
   }
 
   void test_getVisibleLibraries_directExports() {
@@ -3040,7 +3041,7 @@
     LibraryElementImpl libraryA = ElementFactory.library(context, "A");
     library.exports = <ExportElementImpl> [ElementFactory.exportFor(libraryA, [])];
     List<LibraryElement> libraries = library.visibleLibraries;
-    EngineTestCase.assertEqualsIgnoreOrder(<LibraryElement> [library], libraries);
+    expect(libraries, unorderedEquals(<LibraryElement> [library]));
   }
 
   void test_getVisibleLibraries_directImports() {
@@ -3049,7 +3050,7 @@
     LibraryElementImpl libraryA = ElementFactory.library(context, "A");
     library.imports = <ImportElementImpl> [ElementFactory.importFor(libraryA, null, [])];
     List<LibraryElement> libraries = library.visibleLibraries;
-    EngineTestCase.assertEqualsIgnoreOrder(<LibraryElement> [library, libraryA], libraries);
+    expect(libraries, unorderedEquals(<LibraryElement> [library, libraryA]));
   }
 
   void test_getVisibleLibraries_indirectExports() {
@@ -3060,7 +3061,7 @@
     libraryA.exports = <ExportElementImpl> [ElementFactory.exportFor(libraryAA, [])];
     library.imports = <ImportElementImpl> [ElementFactory.importFor(libraryA, null, [])];
     List<LibraryElement> libraries = library.visibleLibraries;
-    EngineTestCase.assertEqualsIgnoreOrder(<LibraryElement> [library, libraryA, libraryAA], libraries);
+    expect(libraries, unorderedEquals(<LibraryElement> [library, libraryA, libraryAA]));
   }
 
   void test_getVisibleLibraries_indirectImports() {
@@ -3074,13 +3075,13 @@
         ElementFactory.importFor(libraryA, null, []),
         ElementFactory.importFor(libraryB, null, [])];
     List<LibraryElement> libraries = library.visibleLibraries;
-    EngineTestCase.assertEqualsIgnoreOrder(<LibraryElement> [library, libraryA, libraryAA, libraryB], libraries);
+    expect(libraries, unorderedEquals(<LibraryElement> [library, libraryA, libraryAA, libraryB]));
   }
 
   void test_getVisibleLibraries_noImports() {
     AnalysisContext context = createAnalysisContext();
     LibraryElementImpl library = ElementFactory.library(context, "app");
-    EngineTestCase.assertEqualsIgnoreOrder(<LibraryElement> [library], library.visibleLibraries);
+    expect(library.visibleLibraries, unorderedEquals(<LibraryElement> [library]));
   }
 
   void test_isUpToDate() {
@@ -3089,9 +3090,9 @@
     LibraryElement library = ElementFactory.library(context, "foo");
     context.setContents(library.definingCompilationUnit.source, "sdfsdff");
     // Assert that we are not up to date if the target has an old time stamp.
-    JUnitTestCase.assertFalse(library.isUpToDate(0));
+    expect(library.isUpToDate(0), isFalse);
     // Assert that we are up to date with a target modification time in the future.
-    JUnitTestCase.assertTrue(library.isUpToDate(JavaSystem.currentTimeMillis() + 1000));
+    expect(library.isUpToDate(JavaSystem.currentTimeMillis() + 1000), isTrue);
   }
 
   void test_setImports() {
@@ -3102,9 +3103,9 @@
         ElementFactory.importFor(ElementFactory.library(context, "l3"), null, [])];
     library.imports = expectedImports;
     List<ImportElement> actualImports = library.imports;
-    EngineTestCase.assertLength(expectedImports.length, actualImports);
+    expect(actualImports, hasLength(expectedImports.length));
     for (int i = 0; i < actualImports.length; i++) {
-      JUnitTestCase.assertSame(expectedImports[i], actualImports[i]);
+      expect(actualImports[i], same(expectedImports[i]));
     }
   }
 }
@@ -3116,7 +3117,7 @@
     Element result = MultiplyDefinedElementImpl.fromElements(null, firstElement, secondElement);
     EngineTestCase.assertInstanceOf((obj) => obj is MultiplyDefinedElement, MultiplyDefinedElement, result);
     List<Element> elements = (result as MultiplyDefinedElement).conflictingElements;
-    EngineTestCase.assertLength(2, elements);
+    expect(elements, hasLength(2));
     for (int i = 0; i < elements.length; i++) {
       EngineTestCase.assertInstanceOf((obj) => obj is LocalVariableElement, LocalVariableElement, elements[i]);
     }
@@ -3129,7 +3130,7 @@
     Element result = MultiplyDefinedElementImpl.fromElements(null, MultiplyDefinedElementImpl.fromElements(null, firstElement, secondElement), thirdElement);
     EngineTestCase.assertInstanceOf((obj) => obj is MultiplyDefinedElement, MultiplyDefinedElement, result);
     List<Element> elements = (result as MultiplyDefinedElement).conflictingElements;
-    EngineTestCase.assertLength(3, elements);
+    expect(elements, hasLength(3));
     for (int i = 0; i < elements.length; i++) {
       EngineTestCase.assertInstanceOf((obj) => obj is LocalVariableElement, LocalVariableElement, elements[i]);
     }
@@ -3137,33 +3138,33 @@
 
   void test_fromElements_nonConflicting() {
     Element element = ElementFactory.localVariableElement2("xx");
-    JUnitTestCase.assertSame(element, MultiplyDefinedElementImpl.fromElements(null, element, element));
+    expect(MultiplyDefinedElementImpl.fromElements(null, element, element), same(element));
   }
 }
 
 class TypeParameterTypeImplTest extends EngineTestCase {
   void test_creation() {
-    JUnitTestCase.assertNotNull(new TypeParameterTypeImpl(new TypeParameterElementImpl.forNode(AstFactory.identifier3("E"))));
+    expect(new TypeParameterTypeImpl(new TypeParameterElementImpl.forNode(AstFactory.identifier3("E"))), isNotNull);
   }
 
   void test_getElement() {
     TypeParameterElementImpl element = new TypeParameterElementImpl.forNode(AstFactory.identifier3("E"));
     TypeParameterTypeImpl type = new TypeParameterTypeImpl(element);
-    JUnitTestCase.assertEquals(element, type.element);
+    expect(type.element, element);
   }
 
   void test_isMoreSpecificThan_typeArguments_dynamic() {
     TypeParameterElementImpl element = new TypeParameterElementImpl.forNode(AstFactory.identifier3("E"));
     TypeParameterTypeImpl type = new TypeParameterTypeImpl(element);
     // E << dynamic
-    JUnitTestCase.assertTrue(type.isMoreSpecificThan(DynamicTypeImpl.instance));
+    expect(type.isMoreSpecificThan(DynamicTypeImpl.instance), isTrue);
   }
 
   void test_isMoreSpecificThan_typeArguments_object() {
     TypeParameterElementImpl element = new TypeParameterElementImpl.forNode(AstFactory.identifier3("E"));
     TypeParameterTypeImpl type = new TypeParameterTypeImpl(element);
     // E << Object
-    JUnitTestCase.assertTrue(type.isMoreSpecificThan(ElementFactory.object.type));
+    expect(type.isMoreSpecificThan(ElementFactory.object.type), isTrue);
   }
 
   void test_isMoreSpecificThan_typeArguments_resursive() {
@@ -3176,14 +3177,14 @@
     typeParameterU.bound = typeParameterTypeU;
     // <T extends U> and <U extends T>
     // T << S
-    JUnitTestCase.assertFalse(typeParameterTypeT.isMoreSpecificThan(classS.type));
+    expect(typeParameterTypeT.isMoreSpecificThan(classS.type), isFalse);
   }
 
   void test_isMoreSpecificThan_typeArguments_self() {
     TypeParameterElementImpl element = new TypeParameterElementImpl.forNode(AstFactory.identifier3("E"));
     TypeParameterTypeImpl type = new TypeParameterTypeImpl(element);
     // E << E
-    JUnitTestCase.assertTrue(type.isMoreSpecificThan(type));
+    expect(type.isMoreSpecificThan(type), isTrue);
   }
 
   void test_isMoreSpecificThan_typeArguments_transitivity_interfaceTypes() {
@@ -3199,7 +3200,7 @@
     TypeParameterTypeImpl typeParameterTypeT = new TypeParameterTypeImpl(typeParameterT);
     // <T extends B>
     // T << A
-    JUnitTestCase.assertTrue(typeParameterTypeT.isMoreSpecificThan(typeA));
+    expect(typeParameterTypeT.isMoreSpecificThan(typeA), isTrue);
   }
 
   void test_isMoreSpecificThan_typeArguments_transitivity_typeParameters() {
@@ -3212,7 +3213,7 @@
     TypeParameterTypeImpl typeParameterTypeT = new TypeParameterTypeImpl(typeParameterT);
     // <T extends U> and <U extends S>
     // T << S
-    JUnitTestCase.assertTrue(typeParameterTypeT.isMoreSpecificThan(classS.type));
+    expect(typeParameterTypeT.isMoreSpecificThan(classS.type), isTrue);
   }
 
   void test_isMoreSpecificThan_typeArguments_upperBound() {
@@ -3222,7 +3223,7 @@
     TypeParameterTypeImpl typeParameterTypeT = new TypeParameterTypeImpl(typeParameterT);
     // <T extends S>
     // T << S
-    JUnitTestCase.assertTrue(typeParameterTypeT.isMoreSpecificThan(classS.type));
+    expect(typeParameterTypeT.isMoreSpecificThan(classS.type), isTrue);
   }
 
   void test_substitute_equal() {
@@ -3230,14 +3231,14 @@
     TypeParameterTypeImpl type = new TypeParameterTypeImpl(element);
     InterfaceTypeImpl argument = new InterfaceTypeImpl.con1(new ClassElementImpl.forNode(AstFactory.identifier3("A")));
     TypeParameterTypeImpl parameter = new TypeParameterTypeImpl(element);
-    JUnitTestCase.assertSame(argument, type.substitute2(<DartType> [argument], <DartType> [parameter]));
+    expect(type.substitute2(<DartType> [argument], <DartType> [parameter]), same(argument));
   }
 
   void test_substitute_notEqual() {
     TypeParameterTypeImpl type = new TypeParameterTypeImpl(new TypeParameterElementImpl.forNode(AstFactory.identifier3("E")));
     InterfaceTypeImpl argument = new InterfaceTypeImpl.con1(new ClassElementImpl.forNode(AstFactory.identifier3("A")));
     TypeParameterTypeImpl parameter = new TypeParameterTypeImpl(new TypeParameterElementImpl.forNode(AstFactory.identifier3("F")));
-    JUnitTestCase.assertSame(type, type.substitute2(<DartType> [argument], <DartType> [parameter]));
+    expect(type.substitute2(<DartType> [argument], <DartType> [parameter]), same(type));
   }
 }
 
@@ -3266,104 +3267,104 @@
     } on IllegalArgumentException catch (e) {
       return;
     }
-    JUnitTestCase.fail("Expected illegal argument exception.");
+    fail("Expected illegal argument exception.");
   }
 
   void test_equality_beingASubtypeOfAnElementIsNotSufficient() {
     // Non-equal if some elements are different
-    JUnitTestCase.assertFalse(_uAB == _uA);
+    expect(_uAB == _uA, isFalse);
   }
 
   void test_equality_insertionOrderDoesntMatter() {
     // Insertion order doesn't matter, only sets of elements
-    JUnitTestCase.assertTrue(_uAB == _uBA);
-    JUnitTestCase.assertTrue(_uBA == _uAB);
+    expect(_uAB == _uBA, isTrue);
+    expect(_uBA == _uAB, isTrue);
   }
 
   void test_equality_reflexivity() {
     for (DartType u in _us) {
-      JUnitTestCase.assertTrue(u == u);
+      expect(u == u, isTrue);
     }
   }
 
   void test_equality_singletonsCollapse() {
-    JUnitTestCase.assertTrue(_typeA == _uA);
-    JUnitTestCase.assertTrue(_uA == _typeA);
+    expect(_typeA == _uA, isTrue);
+    expect(_uA == _typeA, isTrue);
   }
 
   void test_isMoreSpecificThan_allElementsOnLHSAreSubtypesOfSomeElementOnRHS() {
     // Unions are subtypes when all elements are subtypes
-    JUnitTestCase.assertTrue(_uAB.isMoreSpecificThan(_uA));
-    JUnitTestCase.assertTrue(_uAB.isMoreSpecificThan(_typeA));
+    expect(_uAB.isMoreSpecificThan(_uA), isTrue);
+    expect(_uAB.isMoreSpecificThan(_typeA), isTrue);
   }
 
   void test_isMoreSpecificThan_element() {
     // Elements of union are sub types
-    JUnitTestCase.assertTrue(_typeA.isMoreSpecificThan(_uAB));
-    JUnitTestCase.assertTrue(_typeB.isMoreSpecificThan(_uAB));
+    expect(_typeA.isMoreSpecificThan(_uAB), isTrue);
+    expect(_typeB.isMoreSpecificThan(_uAB), isTrue);
   }
 
   void test_isMoreSpecificThan_notSubtypeOfAnyElement() {
     // Types that are not subtypes of elements are not subtypes
-    JUnitTestCase.assertFalse(_typeA.isMoreSpecificThan(_uB));
+    expect(_typeA.isMoreSpecificThan(_uB), isFalse);
   }
 
   void test_isMoreSpecificThan_reflexivity() {
     for (DartType u in _us) {
-      JUnitTestCase.assertTrue(u.isMoreSpecificThan(u));
+      expect(u.isMoreSpecificThan(u), isTrue);
     }
   }
 
   void test_isMoreSpecificThan_someElementOnLHSIsNotASubtypeOfAnyElementOnRHS() {
     // Unions are subtypes when some element is a subtype
-    JUnitTestCase.assertTrue(_uAB.isMoreSpecificThan(_uB));
-    JUnitTestCase.assertTrue(_uAB.isMoreSpecificThan(_typeB));
+    expect(_uAB.isMoreSpecificThan(_uB), isTrue);
+    expect(_uAB.isMoreSpecificThan(_typeB), isTrue);
   }
 
   void test_isMoreSpecificThan_subtypeOfSomeElement() {
     // Subtypes of elements are sub types
-    JUnitTestCase.assertTrue(_typeB.isMoreSpecificThan(_uA));
+    expect(_typeB.isMoreSpecificThan(_uA), isTrue);
   }
 
   void test_isSubtypeOf_allElementsOnLHSAreSubtypesOfSomeElementOnRHS() {
     // Unions are subtypes when all elements are subtypes
-    JUnitTestCase.assertTrue(_uAB.isSubtypeOf(_uA));
-    JUnitTestCase.assertTrue(_uAB.isSubtypeOf(_typeA));
+    expect(_uAB.isSubtypeOf(_uA), isTrue);
+    expect(_uAB.isSubtypeOf(_typeA), isTrue);
   }
 
   void test_isSubtypeOf_element() {
     // Elements of union are sub types
-    JUnitTestCase.assertTrue(_typeA.isSubtypeOf(_uAB));
-    JUnitTestCase.assertTrue(_typeB.isSubtypeOf(_uAB));
+    expect(_typeA.isSubtypeOf(_uAB), isTrue);
+    expect(_typeB.isSubtypeOf(_uAB), isTrue);
   }
 
   void test_isSubtypeOf_notSubtypeOfAnyElement() {
     // Types that are not subtypes of elements are not subtypes
-    JUnitTestCase.assertFalse(_typeA.isSubtypeOf(_uB));
+    expect(_typeA.isSubtypeOf(_uB), isFalse);
   }
 
   void test_isSubtypeOf_reflexivity() {
     for (DartType u in _us) {
-      JUnitTestCase.assertTrue(u.isSubtypeOf(u));
+      expect(u.isSubtypeOf(u), isTrue);
     }
   }
 
   void test_isSubtypeOf_someElementOnLHSIsNotASubtypeOfAnyElementOnRHS() {
     // Unions are subtypes when some element is a subtype
-    JUnitTestCase.assertTrue(_uAB.isSubtypeOf(_uB));
-    JUnitTestCase.assertTrue(_uAB.isSubtypeOf(_typeB));
+    expect(_uAB.isSubtypeOf(_uB), isTrue);
+    expect(_uAB.isSubtypeOf(_typeB), isTrue);
   }
 
   void test_isSubtypeOf_subtypeOfSomeElement() {
     // Subtypes of elements are sub types
-    JUnitTestCase.assertTrue(_typeB.isSubtypeOf(_uA));
+    expect(_typeB.isSubtypeOf(_uA), isTrue);
   }
 
   void test_nestedUnionsCollapse() {
     UnionType u = UnionTypeImpl.union([_uAB, _typeA]) as UnionType;
     for (DartType t in u.elements) {
       if (t is UnionType) {
-        JUnitTestCase.fail("Expected only non-union types but found ${t}!");
+        fail("Expected only non-union types but found $t!");
       }
     }
   }
@@ -3371,9 +3372,9 @@
   void test_noLossage() {
     UnionType u = UnionTypeImpl.union([_typeA, _typeB, _typeB, _typeA, _typeB, _typeB]) as UnionType;
     Set<DartType> elements = u.elements;
-    JUnitTestCase.assertTrue(elements.contains(_typeA));
-    JUnitTestCase.assertTrue(elements.contains(_typeB));
-    JUnitTestCase.assertTrue(elements.length == 2);
+    expect(elements.contains(_typeA), isTrue);
+    expect(elements.contains(_typeB), isTrue);
+    expect(elements.length == 2, isTrue);
   }
 
   void test_substitute() {
@@ -3383,19 +3384,19 @@
     List<DartType> args = [_typeB];
     List<DartType> params = [classAE.typeParameters[0].type];
     DartType typeAESubbed = typeAE.substitute2(args, params);
-    JUnitTestCase.assertFalse(typeAE == typeAESubbed);
-    JUnitTestCase.assertEquals(UnionTypeImpl.union([_typeA, typeAE]).substitute2(args, params), UnionTypeImpl.union([_typeA, typeAESubbed]));
+    expect(typeAE == typeAESubbed, isFalse);
+    expect(UnionTypeImpl.union([_typeA, typeAESubbed]), UnionTypeImpl.union([_typeA, typeAE]).substitute2(args, params));
   }
 
   void test_toString_pair() {
     String s = _uAB.toString();
-    JUnitTestCase.assertTrue(s == "{A,B}" || s == "{B,A}");
-    JUnitTestCase.assertEquals(s, _uAB.displayName);
+    expect(s == "{A,B}" || s == "{B,A}", isTrue);
+    expect(_uAB.displayName, s);
   }
 
   void test_toString_singleton() {
     // Singleton unions collapse to the the single type.
-    JUnitTestCase.assertEquals("A", _uA.toString());
+    expect(_uA.toString(), "A");
   }
 
   void test_unionTypeIsLessSpecificThan_function() {
@@ -3403,8 +3404,8 @@
     ClassElement a = ElementFactory.classElement2("A", []);
     FunctionType t = ElementFactory.functionElement6("t", null, <ClassElement> [a]).type;
     DartType uAT = UnionTypeImpl.union([_uA, t]);
-    JUnitTestCase.assertTrue(t.isMoreSpecificThan(uAT));
-    JUnitTestCase.assertFalse(t.isMoreSpecificThan(_uAB));
+    expect(t.isMoreSpecificThan(uAT), isTrue);
+    expect(t.isMoreSpecificThan(_uAB), isFalse);
   }
 
   void test_unionTypeIsSuperTypeOf_function() {
@@ -3412,8 +3413,8 @@
     ClassElement a = ElementFactory.classElement2("A", []);
     FunctionType t = ElementFactory.functionElement6("t", null, <ClassElement> [a]).type;
     DartType uAT = UnionTypeImpl.union([_uA, t]);
-    JUnitTestCase.assertTrue(t.isSubtypeOf(uAT));
-    JUnitTestCase.assertFalse(t.isSubtypeOf(_uAB));
+    expect(t.isSubtypeOf(uAT), isTrue);
+    expect(t.isSubtypeOf(_uAB), isFalse);
   }
 
   @override
@@ -3439,37 +3440,37 @@
 
   void test_isMoreSpecificThan_void_A() {
     ClassElement classA = ElementFactory.classElement2("A", []);
-    JUnitTestCase.assertFalse(_voidType.isMoreSpecificThan(classA.type));
+    expect(_voidType.isMoreSpecificThan(classA.type), isFalse);
   }
 
   void test_isMoreSpecificThan_void_dynamic() {
-    JUnitTestCase.assertTrue(_voidType.isMoreSpecificThan(DynamicTypeImpl.instance));
+    expect(_voidType.isMoreSpecificThan(DynamicTypeImpl.instance), isTrue);
   }
 
   void test_isMoreSpecificThan_void_void() {
-    JUnitTestCase.assertTrue(_voidType.isMoreSpecificThan(_voidType));
+    expect(_voidType.isMoreSpecificThan(_voidType), isTrue);
   }
 
   void test_isSubtypeOf_void_A() {
     ClassElement classA = ElementFactory.classElement2("A", []);
-    JUnitTestCase.assertFalse(_voidType.isSubtypeOf(classA.type));
+    expect(_voidType.isSubtypeOf(classA.type), isFalse);
   }
 
   void test_isSubtypeOf_void_dynamic() {
-    JUnitTestCase.assertTrue(_voidType.isSubtypeOf(DynamicTypeImpl.instance));
+    expect(_voidType.isSubtypeOf(DynamicTypeImpl.instance), isTrue);
   }
 
   void test_isSubtypeOf_void_void() {
-    JUnitTestCase.assertTrue(_voidType.isSubtypeOf(_voidType));
+    expect(_voidType.isSubtypeOf(_voidType), isTrue);
   }
 
   void test_isVoid() {
-    JUnitTestCase.assertTrue(_voidType.isVoid);
+    expect(_voidType.isVoid, isTrue);
   }
 }
 
 main() {
-  _ut.groupSep = ' | ';
+  groupSep = ' | ';
   runReflectiveTests(AngularPropertyKindTest);
   runReflectiveTests(ElementKindTest);
   runReflectiveTests(FunctionTypeImplTest);
diff --git a/pkg/analyzer/test/generated/engine_test.dart b/pkg/analyzer/test/generated/engine_test.dart
index 845636e..fdbf762 100644
--- a/pkg/analyzer/test/generated/engine_test.dart
+++ b/pkg/analyzer/test/generated/engine_test.dart
@@ -18,7 +18,6 @@
 import 'package:analyzer/src/generated/java_core.dart';
 import 'package:analyzer/src/generated/java_engine.dart';
 import 'package:analyzer/src/generated/java_engine_io.dart';
-import 'package:analyzer/src/generated/java_junit.dart';
 import 'package:analyzer/src/generated/parser.dart';
 import 'package:analyzer/src/generated/resolver.dart';
 import 'package:analyzer/src/generated/scanner.dart';
@@ -30,7 +29,7 @@
 import 'package:analyzer/src/generated/utilities_collection.dart';
 import 'package:analyzer/src/task/task_dart.dart';
 import 'package:typed_mock/typed_mock.dart';
-import 'package:unittest/unittest.dart' as _ut;
+import 'package:unittest/unittest.dart';
 
 import 'all_the_rest.dart';
 import 'resolver_test.dart';
@@ -39,7 +38,7 @@
 
 
 main() {
-  _ut.groupSep = ' | ';
+  groupSep = ' | ';
   runReflectiveTests(AnalysisCacheTest);
   runReflectiveTests(AnalysisContextImplTest);
   runReflectiveTests(AnalysisTaskTest);
@@ -67,13 +66,13 @@
 
 class AnalysisCacheTest extends EngineTestCase {
   void test_creation() {
-    JUnitTestCase.assertNotNull(new AnalysisCache(new List<CachePartition>(0)));
+    expect(new AnalysisCache(new List<CachePartition>(0)), isNotNull);
   }
 
   void test_get() {
     AnalysisCache cache = new AnalysisCache(new List<CachePartition>(0));
     TestSource source = new TestSource();
-    JUnitTestCase.assertNull(cache.get(source));
+    expect(cache.get(source), isNull);
   }
 
   void test_iterator() {
@@ -84,10 +83,10 @@
     DartEntry entry = new DartEntry();
     cache.put(source, entry);
     MapIterator<Source, SourceEntry> iterator = cache.iterator();
-    JUnitTestCase.assertTrue(iterator.moveNext());
-    JUnitTestCase.assertSame(source, iterator.key);
-    JUnitTestCase.assertSame(entry, iterator.value);
-    JUnitTestCase.assertFalse(iterator.moveNext());
+    expect(iterator.moveNext(), isTrue);
+    expect(iterator.key, same(source));
+    expect(iterator.value, same(entry));
+    expect(iterator.moveNext(), isFalse);
   }
 
   void test_put_noFlush() {
@@ -97,7 +96,7 @@
     TestSource source = new TestSource();
     DartEntry entry = new DartEntry();
     cache.put(source, entry);
-    JUnitTestCase.assertSame(entry, cache.get(source));
+    expect(cache.get(source), same(entry));
   }
 
   void test_setMaxCacheSize() {
@@ -108,7 +107,7 @@
     AnalysisCache cache = new AnalysisCache(<CachePartition>[partition]);
     int size = 6;
     for (int i = 0; i < size; i++) {
-      Source source = new TestSource("/test${i}.dart");
+      Source source = new TestSource("/test$i.dart");
       DartEntry entry = new DartEntry();
       entry.setValue(DartEntry.PARSED_UNIT, null);
       cache.put(source, entry);
@@ -126,11 +125,11 @@
     AnalysisCache cache = new AnalysisCache(<CachePartition>[partition]);
     int size = 4;
     for (int i = 0; i < size; i++) {
-      Source source = new TestSource("/test${i}.dart");
+      Source source = new TestSource("/test$i.dart");
       cache.put(source, new DartEntry());
       cache.accessedAst(source);
     }
-    JUnitTestCase.assertEquals(size, cache.size());
+    expect(cache.size(), size);
   }
 
   void _assertNonFlushedCount(int expectedCount, AnalysisCache cache) {
@@ -142,7 +141,7 @@
         nonFlushedCount++;
       }
     }
-    JUnitTestCase.assertEquals(expectedCount, nonFlushedCount);
+    expect(nonFlushedCount, expectedCount);
   }
 }
 
@@ -159,47 +158,36 @@
   SourceFactory _sourceFactory;
 
   void fail_extractContext() {
-    JUnitTestCase.fail("Implement this");
+    fail("Implement this");
   }
 
   void fail_mergeContext() {
-    JUnitTestCase.fail("Implement this");
+    fail("Implement this");
   }
 
   void fail_performAnalysisTask_importedLibraryDelete_html() {
     Source htmlSource = _addSource(
         "/page.html",
-        EngineTestCase.createSource(
-            [
-                "<html><body><script type=\"application/dart\">",
-                "  import 'libB.dart';",
-                "  main() {print('hello dart');}",
-                "</script></body></html>"]));
+        r'''
+<html><body><script type="application/dart">
+  import 'libB.dart';
+  main() {print('hello dart');}
+</script></body></html>''');
     Source libBSource = _addSource("/libB.dart", "library libB;");
     _analyzeAll_assertFinished();
-    JUnitTestCase.assertNotNullMsg(
-        "htmlUnit resolved 1",
-        _context.getResolvedHtmlUnit(htmlSource));
-    JUnitTestCase.assertNotNullMsg(
-        "libB resolved 1",
-        _context.getResolvedCompilationUnit2(libBSource, libBSource));
-    JUnitTestCase.assertTrueMsg(
-        "htmlSource doesn't have errors",
-        !_hasAnalysisErrorWithErrorSeverity(_context.getErrors(htmlSource)));
+    expect(_context.getResolvedHtmlUnit(htmlSource), isNotNull, reason: "htmlUnit resolved 1");
+    expect(_context.getResolvedCompilationUnit2(libBSource, libBSource), isNotNull, reason: "libB resolved 1");
+    expect(!_hasAnalysisErrorWithErrorSeverity(_context.getErrors(htmlSource)), isTrue, reason: "htmlSource doesn't have errors");
     // remove libB.dart content and analyze
     _context.setContents(libBSource, null);
     _analyzeAll_assertFinished();
-    JUnitTestCase.assertNotNullMsg(
-        "htmlUnit resolved 1",
-        _context.getResolvedHtmlUnit(htmlSource));
+    expect(_context.getResolvedHtmlUnit(htmlSource), isNotNull, reason: "htmlUnit resolved 1");
     AnalysisErrorInfo errors = _context.getErrors(htmlSource);
-    JUnitTestCase.assertTrueMsg(
-        "htmlSource has an error",
-        _hasAnalysisErrorWithErrorSeverity(errors));
+    expect(_hasAnalysisErrorWithErrorSeverity(errors), isTrue, reason: "htmlSource has an error");
   }
 
   void fail_recordLibraryElements() {
-    JUnitTestCase.fail("Implement this");
+    fail("Implement this");
   }
 
   @override
@@ -211,6 +199,8 @@
     AnalysisOptionsImpl options =
         new AnalysisOptionsImpl.con1(_context.analysisOptions);
     options.cacheSize = 256;
+    options.enableAsync = true;
+    options.enableEnum = true;
     _context.analysisOptions = options;
   }
 
@@ -222,10 +212,9 @@
   }
 
   void test_applyChanges_add() {
-    JUnitTestCase.assertTrue(_context.sourcesNeedingProcessing.isEmpty);
+    expect(_context.sourcesNeedingProcessing.isEmpty, isTrue);
     Source source = _addSource("/test.dart", "main() {}");
-    JUnitTestCase.assertTrue(
-        _context.sourcesNeedingProcessing.contains(source));
+    expect(_context.sourcesNeedingProcessing.contains(source), isTrue);
   }
 
   void test_applyChanges_change_flush_element() {
@@ -233,12 +222,16 @@
     _sourceFactory = _context.sourceFactory;
     Source librarySource = _addSource(
         "/lib.dart",
-        EngineTestCase.createSource(["library lib;", "int a = 0;"]));
-    JUnitTestCase.assertNotNull(_context.computeLibraryElement(librarySource));
+        r'''
+library lib;
+int a = 0;''');
+    expect(_context.computeLibraryElement(librarySource), isNotNull);
     _context.setContents(
         librarySource,
-        EngineTestCase.createSource(["library lib;", "int aa = 0;"]));
-    JUnitTestCase.assertNull(_context.getLibraryElement(librarySource));
+        r'''
+library lib;
+int aa = 0;''');
+    expect(_context.getLibraryElement(librarySource), isNull);
   }
 
   void test_applyChanges_change_multiple() {
@@ -246,19 +239,27 @@
     _sourceFactory = _context.sourceFactory;
     Source librarySource = _addSource(
         "/lib.dart",
-        EngineTestCase.createSource(
-            ["library lib;", "part 'part.dart';", "int a = 0;"]));
+        r'''
+library lib;
+part 'part.dart';
+int a = 0;''');
     Source partSource = _addSource(
         "/part.dart",
-        EngineTestCase.createSource(["part of lib;", "int b = a;"]));
+        r'''
+part of lib;
+int b = a;''');
     _context.computeLibraryElement(librarySource);
     _context.setContents(
         librarySource,
-        EngineTestCase.createSource(
-            ["library lib;", "part 'part.dart';", "int aa = 0;"]));
+        r'''
+library lib;
+part 'part.dart';
+int aa = 0;''');
     _context.setContents(
         partSource,
-        EngineTestCase.createSource(["part of lib;", "int b = aa;"]));
+        r'''
+part of lib;
+int b = aa;''');
     _context.computeLibraryElement(librarySource);
     CompilationUnit libraryUnit =
         _context.resolveCompilationUnit2(librarySource, librarySource);
@@ -271,14 +272,12 @@
         partUnit.declarations[0] as TopLevelVariableDeclaration;
     Element useElement =
         (use.variables.variables[0].initializer as SimpleIdentifier).staticElement;
-    JUnitTestCase.assertSame(
-        declarationElement,
-        (useElement as PropertyAccessorElement).variable);
+    expect((useElement as PropertyAccessorElement).variable, same(declarationElement));
   }
 
   void test_applyChanges_empty() {
     _context.applyChanges(new ChangeSet());
-    JUnitTestCase.assertNull(_context.performAnalysisTask().changeNotices);
+    expect(_context.performAnalysisTask().changeNotices, isNull);
   }
 
   void test_applyChanges_overriddenSource() {
@@ -293,7 +292,7 @@
     ChangeSet changeSet = new ChangeSet();
     changeSet.changedSource(source);
     _context.applyChanges(changeSet);
-    EngineTestCase.assertSizeOfList(0, _context.sourcesNeedingProcessing);
+    expect(_context.sourcesNeedingProcessing, hasLength(0));
   }
 
   void test_applyChanges_remove() {
@@ -301,23 +300,25 @@
     _sourceFactory = _context.sourceFactory;
     Source libA = _addSource(
         "/libA.dart",
-        EngineTestCase.createSource(["library libA;", "import 'libB.dart';"]));
+        r'''
+library libA;
+import 'libB.dart';''');
     Source libB =
-        _addSource("/libB.dart", EngineTestCase.createSource(["library libB;"]));
+        _addSource("/libB.dart", "library libB;");
     LibraryElement libAElement = _context.computeLibraryElement(libA);
     List<LibraryElement> importedLibraries = libAElement.importedLibraries;
-    EngineTestCase.assertLength(2, importedLibraries);
+    expect(importedLibraries, hasLength(2));
     _context.computeErrors(libA);
     _context.computeErrors(libB);
-    EngineTestCase.assertSizeOfList(0, _context.sourcesNeedingProcessing);
+    expect(_context.sourcesNeedingProcessing, hasLength(0));
     _context.setContents(libB, null);
     _removeSource(libB);
     List<Source> sources = _context.sourcesNeedingProcessing;
-    EngineTestCase.assertSizeOfList(1, sources);
-    JUnitTestCase.assertSame(libA, sources[0]);
+    expect(sources, hasLength(1));
+    expect(sources[0], same(libA));
     libAElement = _context.computeLibraryElement(libA);
     importedLibraries = libAElement.importedLibraries;
-    EngineTestCase.assertLength(1, importedLibraries);
+    expect(importedLibraries, hasLength(1));
   }
 
   void test_applyChanges_removeContainer() {
@@ -325,20 +326,22 @@
     _sourceFactory = _context.sourceFactory;
     Source libA = _addSource(
         "/libA.dart",
-        EngineTestCase.createSource(["library libA;", "import 'libB.dart';"]));
+        r'''
+library libA;
+import 'libB.dart';''');
     Source libB =
-        _addSource("/libB.dart", EngineTestCase.createSource(["library libB;"]));
+        _addSource("/libB.dart", "library libB;");
     _context.computeLibraryElement(libA);
     _context.computeErrors(libA);
     _context.computeErrors(libB);
-    EngineTestCase.assertSizeOfList(0, _context.sourcesNeedingProcessing);
+    expect(_context.sourcesNeedingProcessing, hasLength(0));
     ChangeSet changeSet = new ChangeSet();
     changeSet.removedContainer(
         new _AnalysisContextImplTest_test_applyChanges_removeContainer(libB));
     _context.applyChanges(changeSet);
     List<Source> sources = _context.sourcesNeedingProcessing;
-    EngineTestCase.assertSizeOfList(1, sources);
-    JUnitTestCase.assertSame(libA, sources[0]);
+    expect(sources, hasLength(1));
+    expect(sources[0], same(libA));
   }
 
   void test_computeDocumentationComment_block() {
@@ -346,31 +349,30 @@
     _sourceFactory = _context.sourceFactory;
     String comment = "/** Comment */";
     Source source =
-        _addSource("/test.dart", EngineTestCase.createSource([comment, "class A {}"]));
+        _addSource("/test.dart", """
+$comment
+class A {}""");
     LibraryElement libraryElement = _context.computeLibraryElement(source);
-    JUnitTestCase.assertNotNull(libraryElement);
+    expect(libraryElement, isNotNull);
     ClassElement classElement = libraryElement.definingCompilationUnit.types[0];
-    JUnitTestCase.assertNotNull(libraryElement);
-    JUnitTestCase.assertEquals(
-        comment,
-        _context.computeDocumentationComment(classElement));
+    expect(libraryElement, isNotNull);
+    expect(_context.computeDocumentationComment(classElement), comment);
   }
 
   void test_computeDocumentationComment_none() {
     _context = AnalysisContextFactory.contextWithCore();
     _sourceFactory = _context.sourceFactory;
     Source source =
-        _addSource("/test.dart", EngineTestCase.createSource(["class A {}"]));
+        _addSource("/test.dart", "class A {}");
     LibraryElement libraryElement = _context.computeLibraryElement(source);
-    JUnitTestCase.assertNotNull(libraryElement);
+    expect(libraryElement, isNotNull);
     ClassElement classElement = libraryElement.definingCompilationUnit.types[0];
-    JUnitTestCase.assertNotNull(libraryElement);
-    JUnitTestCase.assertNull(
-        _context.computeDocumentationComment(classElement));
+    expect(libraryElement, isNotNull);
+    expect(_context.computeDocumentationComment(classElement), isNull);
   }
 
   void test_computeDocumentationComment_null() {
-    JUnitTestCase.assertNull(_context.computeDocumentationComment(null));
+    expect(_context.computeDocumentationComment(null), isNull);
   }
 
   void test_computeDocumentationComment_singleLine_multiple_EOL_n() {
@@ -379,11 +381,11 @@
     String comment = "/// line 1\n/// line 2\n/// line 3\n";
     Source source = _addSource("/test.dart", "${comment}class A {}");
     LibraryElement libraryElement = _context.computeLibraryElement(source);
-    JUnitTestCase.assertNotNull(libraryElement);
+    expect(libraryElement, isNotNull);
     ClassElement classElement = libraryElement.definingCompilationUnit.types[0];
-    JUnitTestCase.assertNotNull(libraryElement);
+    expect(libraryElement, isNotNull);
     String actual = _context.computeDocumentationComment(classElement);
-    JUnitTestCase.assertEquals("/// line 1\n/// line 2\n/// line 3", actual);
+    expect(actual, "/// line 1\n/// line 2\n/// line 3");
   }
 
   void test_computeDocumentationComment_singleLine_multiple_EOL_rn() {
@@ -392,17 +394,17 @@
     String comment = "/// line 1\r\n/// line 2\r\n/// line 3\r\n";
     Source source = _addSource("/test.dart", "${comment}class A {}");
     LibraryElement libraryElement = _context.computeLibraryElement(source);
-    JUnitTestCase.assertNotNull(libraryElement);
+    expect(libraryElement, isNotNull);
     ClassElement classElement = libraryElement.definingCompilationUnit.types[0];
-    JUnitTestCase.assertNotNull(libraryElement);
+    expect(libraryElement, isNotNull);
     String actual = _context.computeDocumentationComment(classElement);
-    JUnitTestCase.assertEquals("/// line 1\n/// line 2\n/// line 3", actual);
+    expect(actual, "/// line 1\n/// line 2\n/// line 3");
   }
 
   void test_computeErrors_dart_none() {
     Source source = _addSource("/lib.dart", "library lib;");
     List<AnalysisError> errors = _context.computeErrors(source);
-    EngineTestCase.assertLength(0, errors);
+    expect(errors, hasLength(0));
   }
 
   void test_computeErrors_dart_part() {
@@ -411,26 +413,26 @@
     Source partSource = _addSource("/part.dart", "part of 'lib';");
     _context.parseCompilationUnit(librarySource);
     List<AnalysisError> errors = _context.computeErrors(partSource);
-    JUnitTestCase.assertNotNull(errors);
-    JUnitTestCase.assertTrue(errors.length > 0);
+    expect(errors, isNotNull);
+    expect(errors.length > 0, isTrue);
   }
 
   void test_computeErrors_dart_some() {
     Source source = _addSource("/lib.dart", "library 'lib';");
     List<AnalysisError> errors = _context.computeErrors(source);
-    JUnitTestCase.assertNotNull(errors);
-    JUnitTestCase.assertTrue(errors.length > 0);
+    expect(errors, isNotNull);
+    expect(errors.length > 0, isTrue);
   }
 
   void test_computeErrors_html_none() {
     Source source = _addSource("/test.html", "<html></html>");
     List<AnalysisError> errors = _context.computeErrors(source);
-    EngineTestCase.assertLength(0, errors);
+    expect(errors, hasLength(0));
   }
 
   void test_computeExportedLibraries_none() {
     Source source = _addSource("/test.dart", "library test;");
-    EngineTestCase.assertLength(0, _context.computeExportedLibraries(source));
+    expect(_context.computeExportedLibraries(source), hasLength(0));
   }
 
   void test_computeExportedLibraries_some() {
@@ -439,24 +441,24 @@
     Source source = _addSource(
         "/test.dart",
         "library test; export 'lib1.dart'; export 'lib2.dart';");
-    EngineTestCase.assertLength(2, _context.computeExportedLibraries(source));
+    expect(_context.computeExportedLibraries(source), hasLength(2));
   }
 
   void test_computeHtmlElement_nonHtml() {
     Source source = _addSource("/test.dart", "library test;");
-    JUnitTestCase.assertNull(_context.computeHtmlElement(source));
+    expect(_context.computeHtmlElement(source), isNull);
   }
 
   void test_computeHtmlElement_valid() {
     Source source = _addSource("/test.html", "<html></html>");
     HtmlElement element = _context.computeHtmlElement(source);
-    JUnitTestCase.assertNotNull(element);
-    JUnitTestCase.assertSame(element, _context.computeHtmlElement(source));
+    expect(element, isNotNull);
+    expect(_context.computeHtmlElement(source), same(element));
   }
 
   void test_computeImportedLibraries_none() {
     Source source = _addSource("/test.dart", "library test;");
-    EngineTestCase.assertLength(0, _context.computeImportedLibraries(source));
+    expect(_context.computeImportedLibraries(source), hasLength(0));
   }
 
   void test_computeImportedLibraries_some() {
@@ -465,31 +467,27 @@
     Source source = _addSource(
         "/test.dart",
         "library test; import 'lib1.dart'; import 'lib2.dart';");
-    EngineTestCase.assertLength(2, _context.computeImportedLibraries(source));
+    expect(_context.computeImportedLibraries(source), hasLength(2));
   }
 
   void test_computeKindOf_html() {
     Source source = _addSource("/test.html", "");
-    JUnitTestCase.assertSame(SourceKind.HTML, _context.computeKindOf(source));
+    expect(_context.computeKindOf(source), same(SourceKind.HTML));
   }
 
   void test_computeKindOf_library() {
     Source source = _addSource("/test.dart", "library lib;");
-    JUnitTestCase.assertSame(
-        SourceKind.LIBRARY,
-        _context.computeKindOf(source));
+    expect(_context.computeKindOf(source), same(SourceKind.LIBRARY));
   }
 
   void test_computeKindOf_libraryAndPart() {
     Source source = _addSource("/test.dart", "library lib; part of lib;");
-    JUnitTestCase.assertSame(
-        SourceKind.LIBRARY,
-        _context.computeKindOf(source));
+    expect(_context.computeKindOf(source), same(SourceKind.LIBRARY));
   }
 
   void test_computeKindOf_part() {
     Source source = _addSource("/test.dart", "part of lib;");
-    JUnitTestCase.assertSame(SourceKind.PART, _context.computeKindOf(source));
+    expect(_context.computeKindOf(source), same(SourceKind.PART));
   }
 
   void test_computeLibraryElement() {
@@ -497,31 +495,38 @@
     _sourceFactory = _context.sourceFactory;
     Source source = _addSource("/test.dart", "library lib;");
     LibraryElement element = _context.computeLibraryElement(source);
-    JUnitTestCase.assertNotNull(element);
+    expect(element, isNotNull);
   }
 
   void test_computeLineInfo_dart() {
     Source source = _addSource(
         "/test.dart",
-        EngineTestCase.createSource(["library lib;", "", "main() {}"]));
+        r'''
+library lib;
+
+main() {}''');
     LineInfo info = _context.computeLineInfo(source);
-    JUnitTestCase.assertNotNull(info);
+    expect(info, isNotNull);
   }
 
   void test_computeLineInfo_html() {
     Source source = _addSource(
         "/test.html",
-        EngineTestCase.createSource(
-            ["<html>", "  <body>", "    <h1>A</h1>", "  </body>", "</html>"]));
+        r'''
+<html>
+  <body>
+    <h1>A</h1>
+  </body>
+</html>''');
     LineInfo info = _context.computeLineInfo(source);
-    JUnitTestCase.assertNotNull(info);
+    expect(info, isNotNull);
   }
 
   void test_computeResolvableCompilationUnit_dart_exception() {
     TestSource source = _addSourceWithException("/test.dart");
     try {
       _context.computeResolvableCompilationUnit(source);
-      JUnitTestCase.fail("Expected AnalysisException");
+      fail("Expected AnalysisException");
     } on AnalysisException catch (exception) {
       // Expected
     }
@@ -531,7 +536,7 @@
     Source source = _addSource("/lib.html", "<html></html>");
     try {
       _context.computeResolvableCompilationUnit(source);
-      JUnitTestCase.fail("Expected AnalysisException");
+      fail("Expected AnalysisException");
     } on AnalysisException catch (exception) {
       // Expected
     }
@@ -540,49 +545,48 @@
   void test_computeResolvableCompilationUnit_valid() {
     Source source = _addSource("/lib.dart", "library lib;");
     CompilationUnit parsedUnit = _context.parseCompilationUnit(source);
-    JUnitTestCase.assertNotNull(parsedUnit);
+    expect(parsedUnit, isNotNull);
     CompilationUnit resolvedUnit =
         _context.computeResolvableCompilationUnit(source);
-    JUnitTestCase.assertNotNull(resolvedUnit);
-    JUnitTestCase.assertSame(parsedUnit, resolvedUnit);
+    expect(resolvedUnit, isNotNull);
+    expect(resolvedUnit, same(parsedUnit));
   }
 
   void test_dispose() {
-    JUnitTestCase.assertFalse(_context.isDisposed);
+    expect(_context.isDisposed, isFalse);
     _context.dispose();
-    JUnitTestCase.assertTrue(_context.isDisposed);
+    expect(_context.isDisposed, isTrue);
   }
 
   void test_exists_false() {
     TestSource source = new TestSource();
     source.exists2 = false;
-    JUnitTestCase.assertFalse(_context.exists(source));
+    expect(_context.exists(source), isFalse);
   }
 
   void test_exists_null() {
-    JUnitTestCase.assertFalse(_context.exists(null));
+    expect(_context.exists(null), isFalse);
   }
 
   void test_exists_overridden() {
     Source source = new TestSource();
     _context.setContents(source, "");
-    JUnitTestCase.assertTrue(_context.exists(source));
+    expect(_context.exists(source), isTrue);
   }
 
   void test_exists_true() {
-    JUnitTestCase.assertTrue(
-        _context.exists(new AnalysisContextImplTest_Source_exists_true()));
+    expect(_context.exists(new AnalysisContextImplTest_Source_exists_true()), isTrue);
   }
 
   void test_getAnalysisOptions() {
-    JUnitTestCase.assertNotNull(_context.analysisOptions);
+    expect(_context.analysisOptions, isNotNull);
   }
 
   void test_getContents_fromSource() {
     String content = "library lib;";
     TimestampedData<String> contents =
         _context.getContents(new TestSource('/test.dart', content));
-    JUnitTestCase.assertEquals(content, contents.data.toString());
+    expect(contents.data.toString(), content);
   }
 
   void test_getContents_overridden() {
@@ -590,7 +594,7 @@
     Source source = new TestSource();
     _context.setContents(source, content);
     TimestampedData<String> contents = _context.getContents(source);
-    JUnitTestCase.assertEquals(content, contents.data.toString());
+    expect(contents.data.toString(), content);
   }
 
   void test_getContents_unoverridden() {
@@ -599,12 +603,12 @@
     _context.setContents(source, "part of lib;");
     _context.setContents(source, null);
     TimestampedData<String> contents = _context.getContents(source);
-    JUnitTestCase.assertEquals(content, contents.data.toString());
+    expect(contents.data.toString(), content);
   }
 
   void test_getDeclaredVariables() {
     _context = AnalysisContextFactory.contextWithCore();
-    JUnitTestCase.assertNotNull(_context.declaredVariables);
+    expect(_context.declaredVariables, isNotNull);
   }
 
   void test_getElement() {
@@ -612,97 +616,112 @@
     _sourceFactory = _context.sourceFactory;
     LibraryElement core =
         _context.computeLibraryElement(_sourceFactory.forUri("dart:core"));
-    JUnitTestCase.assertNotNull(core);
+    expect(core, isNotNull);
     ClassElement classObject =
         _findClass(core.definingCompilationUnit, "Object");
-    JUnitTestCase.assertNotNull(classObject);
+    expect(classObject, isNotNull);
     ElementLocation location = classObject.location;
     Element element = _context.getElement(location);
-    JUnitTestCase.assertSame(classObject, element);
+    expect(element, same(classObject));
   }
 
   void test_getElement_constructor_named() {
     Source source = _addSource(
         "/lib.dart",
-        EngineTestCase.createSource(["class A {", "  A.named() {}", "}"]));
+        r'''
+class A {
+  A.named() {}
+}''');
     _analyzeAll_assertFinished();
     LibraryElement library = _context.computeLibraryElement(source);
     ClassElement classA = _findClass(library.definingCompilationUnit, "A");
     ConstructorElement constructor = classA.constructors[0];
     ElementLocation location = constructor.location;
     Element element = _context.getElement(location);
-    JUnitTestCase.assertSame(constructor, element);
+    expect(element, same(constructor));
   }
 
   void test_getElement_constructor_unnamed() {
     Source source = _addSource(
         "/lib.dart",
-        EngineTestCase.createSource(["class A {", "  A() {}", "}"]));
+        r'''
+class A {
+  A() {}
+}''');
     _analyzeAll_assertFinished();
     LibraryElement library = _context.computeLibraryElement(source);
     ClassElement classA = _findClass(library.definingCompilationUnit, "A");
     ConstructorElement constructor = classA.constructors[0];
     ElementLocation location = constructor.location;
     Element element = _context.getElement(location);
-    JUnitTestCase.assertSame(constructor, element);
+    expect(element, same(constructor));
+  }
+
+  void test_getElement_enum() {
+    Source source = _addSource('/test.dart', 'enum MyEnum {A, B, C}');
+    _analyzeAll_assertFinished();
+    LibraryElement library = _context.computeLibraryElement(source);
+    ClassElement myEnum = library.definingCompilationUnit.getEnum('MyEnum');
+    ElementLocation location = myEnum.location;
+    Element element = _context.getElement(location);
+    expect(element, same(myEnum));
   }
 
   void test_getErrors_dart_none() {
     Source source = _addSource("/lib.dart", "library lib;");
     List<AnalysisError> errors = _context.getErrors(source).errors;
-    EngineTestCase.assertLength(0, errors);
+    expect(errors, hasLength(0));
     _context.computeErrors(source);
     errors = _context.getErrors(source).errors;
-    EngineTestCase.assertLength(0, errors);
+    expect(errors, hasLength(0));
   }
 
   void test_getErrors_dart_some() {
     Source source = _addSource("/lib.dart", "library 'lib';");
     List<AnalysisError> errors = _context.getErrors(source).errors;
-    EngineTestCase.assertLength(0, errors);
+    expect(errors, hasLength(0));
     _context.computeErrors(source);
     errors = _context.getErrors(source).errors;
-    EngineTestCase.assertLength(1, errors);
+    expect(errors, hasLength(1));
   }
 
   void test_getErrors_html_none() {
     Source source = _addSource("/test.html", "<html></html>");
     List<AnalysisError> errors = _context.getErrors(source).errors;
-    EngineTestCase.assertLength(0, errors);
+    expect(errors, hasLength(0));
     _context.computeErrors(source);
     errors = _context.getErrors(source).errors;
-    EngineTestCase.assertLength(0, errors);
+    expect(errors, hasLength(0));
   }
 
   void test_getErrors_html_some() {
     Source source = _addSource(
         "/test.html",
-        EngineTestCase.createSource(
-            [
-                "<html><head>",
-                "<script type='application/dart' src='test.dart'/>",
-                "</head></html>"]));
+        r'''
+<html><head>
+<script type='application/dart' src='test.dart'/>
+</head></html>''');
     List<AnalysisError> errors = _context.getErrors(source).errors;
-    EngineTestCase.assertLength(0, errors);
+    expect(errors, hasLength(0));
     _context.computeErrors(source);
     errors = _context.getErrors(source).errors;
-    EngineTestCase.assertLength(1, errors);
+    expect(errors, hasLength(1));
   }
 
   void test_getHtmlElement_dart() {
     Source source = _addSource("/test.dart", "");
-    JUnitTestCase.assertNull(_context.getHtmlElement(source));
-    JUnitTestCase.assertNull(_context.computeHtmlElement(source));
-    JUnitTestCase.assertNull(_context.getHtmlElement(source));
+    expect(_context.getHtmlElement(source), isNull);
+    expect(_context.computeHtmlElement(source), isNull);
+    expect(_context.getHtmlElement(source), isNull);
   }
 
   void test_getHtmlElement_html() {
     Source source = _addSource("/test.html", "<html></html>");
     HtmlElement element = _context.getHtmlElement(source);
-    JUnitTestCase.assertNull(element);
+    expect(element, isNull);
     _context.computeHtmlElement(source);
     element = _context.getHtmlElement(source);
-    JUnitTestCase.assertNotNull(element);
+    expect(element, isNotNull);
   }
 
   void test_getHtmlFilesReferencing_html() {
@@ -710,38 +729,36 @@
     _sourceFactory = _context.sourceFactory;
     Source htmlSource = _addSource(
         "/test.html",
-        EngineTestCase.createSource(
-            [
-                "<html><head>",
-                "<script type='application/dart' src='test.dart'/>",
-                "<script type='application/dart' src='test.js'/>",
-                "</head></html>"]));
+        r'''
+<html><head>
+<script type='application/dart' src='test.dart'/>
+<script type='application/dart' src='test.js'/>
+</head></html>''');
     Source librarySource = _addSource("/test.dart", "library lib;");
     Source secondHtmlSource = _addSource("/test.html", "<html></html>");
     _context.computeLibraryElement(librarySource);
     List<Source> result = _context.getHtmlFilesReferencing(secondHtmlSource);
-    EngineTestCase.assertLength(0, result);
+    expect(result, hasLength(0));
     _context.parseHtmlUnit(htmlSource);
     result = _context.getHtmlFilesReferencing(secondHtmlSource);
-    EngineTestCase.assertLength(0, result);
+    expect(result, hasLength(0));
   }
 
   void test_getHtmlFilesReferencing_library() {
     Source htmlSource = _addSource(
         "/test.html",
-        EngineTestCase.createSource(
-            [
-                "<html><head>",
-                "<script type='application/dart' src='test.dart'/>",
-                "<script type='application/dart' src='test.js'/>",
-                "</head></html>"]));
+        r'''
+<html><head>
+<script type='application/dart' src='test.dart'/>
+<script type='application/dart' src='test.js'/>
+</head></html>''');
     Source librarySource = _addSource("/test.dart", "library lib;");
     List<Source> result = _context.getHtmlFilesReferencing(librarySource);
-    EngineTestCase.assertLength(0, result);
+    expect(result, hasLength(0));
     _context.parseHtmlUnit(htmlSource);
     result = _context.getHtmlFilesReferencing(librarySource);
-    EngineTestCase.assertLength(1, result);
-    JUnitTestCase.assertEquals(htmlSource, result[0]);
+    expect(result, hasLength(1));
+    expect(result[0], htmlSource);
   }
 
   void test_getHtmlFilesReferencing_part() {
@@ -749,80 +766,81 @@
     _sourceFactory = _context.sourceFactory;
     Source htmlSource = _addSource(
         "/test.html",
-        EngineTestCase.createSource(
-            [
-                "<html><head>",
-                "<script type='application/dart' src='test.dart'/>",
-                "<script type='application/dart' src='test.js'/>",
-                "</head></html>"]));
+        r'''
+<html><head>
+<script type='application/dart' src='test.dart'/>
+<script type='application/dart' src='test.js'/>
+</head></html>''');
     Source librarySource =
         _addSource("/test.dart", "library lib; part 'part.dart';");
     Source partSource = _addSource("/part.dart", "part of lib;");
     _context.computeLibraryElement(librarySource);
     List<Source> result = _context.getHtmlFilesReferencing(partSource);
-    EngineTestCase.assertLength(0, result);
+    expect(result, hasLength(0));
     _context.parseHtmlUnit(htmlSource);
     result = _context.getHtmlFilesReferencing(partSource);
-    EngineTestCase.assertLength(1, result);
-    JUnitTestCase.assertEquals(htmlSource, result[0]);
+    expect(result, hasLength(1));
+    expect(result[0], htmlSource);
   }
 
   void test_getHtmlSources() {
     List<Source> sources = _context.htmlSources;
-    EngineTestCase.assertLength(0, sources);
+    expect(sources, hasLength(0));
     Source source = _addSource("/test.html", "");
     _context.computeKindOf(source);
     sources = _context.htmlSources;
-    EngineTestCase.assertLength(1, sources);
-    JUnitTestCase.assertEquals(source, sources[0]);
+    expect(sources, hasLength(1));
+    expect(sources[0], source);
   }
 
   void test_getKindOf_html() {
     Source source = _addSource("/test.html", "");
-    JUnitTestCase.assertSame(SourceKind.HTML, _context.getKindOf(source));
+    expect(_context.getKindOf(source), same(SourceKind.HTML));
   }
 
   void test_getKindOf_library() {
     Source source = _addSource("/test.dart", "library lib;");
-    JUnitTestCase.assertSame(SourceKind.UNKNOWN, _context.getKindOf(source));
+    expect(_context.getKindOf(source), same(SourceKind.UNKNOWN));
     _context.computeKindOf(source);
-    JUnitTestCase.assertSame(SourceKind.LIBRARY, _context.getKindOf(source));
+    expect(_context.getKindOf(source), same(SourceKind.LIBRARY));
   }
 
   void test_getKindOf_part() {
     Source source = _addSource("/test.dart", "part of lib;");
-    JUnitTestCase.assertSame(SourceKind.UNKNOWN, _context.getKindOf(source));
+    expect(_context.getKindOf(source), same(SourceKind.UNKNOWN));
     _context.computeKindOf(source);
-    JUnitTestCase.assertSame(SourceKind.PART, _context.getKindOf(source));
+    expect(_context.getKindOf(source), same(SourceKind.PART));
   }
 
   void test_getKindOf_unknown() {
     Source source = _addSource("/test.css", "");
-    JUnitTestCase.assertSame(SourceKind.UNKNOWN, _context.getKindOf(source));
+    expect(_context.getKindOf(source), same(SourceKind.UNKNOWN));
   }
 
   void test_getLaunchableClientLibrarySources() {
     _context = AnalysisContextFactory.contextWithCore();
     _sourceFactory = _context.sourceFactory;
     List<Source> sources = _context.launchableClientLibrarySources;
-    EngineTestCase.assertLength(0, sources);
+    expect(sources, hasLength(0));
     Source source = _addSource(
         "/test.dart",
-        EngineTestCase.createSource(["import 'dart:html';", "main() {}"]));
+        r'''
+import 'dart:html';
+main() {}''');
     _context.computeLibraryElement(source);
     sources = _context.launchableClientLibrarySources;
-    EngineTestCase.assertLength(1, sources);
+    expect(sources, hasLength(1));
   }
 
   void test_getLaunchableServerLibrarySources() {
     _context = AnalysisContextFactory.contextWithCore();
     _sourceFactory = _context.sourceFactory;
     List<Source> sources = _context.launchableServerLibrarySources;
-    EngineTestCase.assertLength(0, sources);
+    expect(sources, hasLength(0));
     Source source = _addSource("/test.dart", "main() {}");
     _context.computeLibraryElement(source);
     sources = _context.launchableServerLibrarySources;
-    EngineTestCase.assertLength(1, sources);
+    expect(sources, hasLength(1));
   }
 
   void test_getLibrariesContaining() {
@@ -830,15 +848,17 @@
     _sourceFactory = _context.sourceFactory;
     Source librarySource = _addSource(
         "/lib.dart",
-        EngineTestCase.createSource(["library lib;", "part 'part.dart';"]));
+        r'''
+library lib;
+part 'part.dart';''');
     Source partSource = _addSource("/part.dart", "part of lib;");
     _context.computeLibraryElement(librarySource);
     List<Source> result = _context.getLibrariesContaining(librarySource);
-    EngineTestCase.assertLength(1, result);
-    JUnitTestCase.assertEquals(librarySource, result[0]);
+    expect(result, hasLength(1));
+    expect(result[0], librarySource);
     result = _context.getLibrariesContaining(partSource);
-    EngineTestCase.assertLength(1, result);
-    JUnitTestCase.assertEquals(librarySource, result[0]);
+    expect(result, hasLength(1));
+    expect(result[0], librarySource);
   }
 
   void test_getLibrariesDependingOn() {
@@ -848,16 +868,20 @@
     _addSource("/libB.dart", "library libB;");
     Source lib1Source = _addSource(
         "/lib1.dart",
-        EngineTestCase.createSource(
-            ["library lib1;", "import 'libA.dart';", "export 'libB.dart';"]));
+        r'''
+library lib1;
+import 'libA.dart';
+export 'libB.dart';''');
     Source lib2Source = _addSource(
         "/lib2.dart",
-        EngineTestCase.createSource(
-            ["library lib2;", "import 'libB.dart';", "export 'libA.dart';"]));
+        r'''
+library lib2;
+import 'libB.dart';
+export 'libA.dart';''');
     _context.computeLibraryElement(lib1Source);
     _context.computeLibraryElement(lib2Source);
     List<Source> result = _context.getLibrariesDependingOn(libASource);
-    EngineTestCase.assertContains(result, [lib1Source, lib2Source]);
+    expect(result, unorderedEquals([lib1Source, lib2Source]));
   }
 
   void test_getLibrariesReferencedFromHtml() {
@@ -865,18 +889,17 @@
     _sourceFactory = _context.sourceFactory;
     Source htmlSource = _addSource(
         "/test.html",
-        EngineTestCase.createSource(
-            [
-                "<html><head>",
-                "<script type='application/dart' src='test.dart'/>",
-                "<script type='application/dart' src='test.js'/>",
-                "</head></html>"]));
+        r'''
+<html><head>
+<script type='application/dart' src='test.dart'/>
+<script type='application/dart' src='test.js'/>
+</head></html>''');
     Source librarySource = _addSource("/test.dart", "library lib;");
     _context.computeLibraryElement(librarySource);
     _context.parseHtmlUnit(htmlSource);
     List<Source> result = _context.getLibrariesReferencedFromHtml(htmlSource);
-    EngineTestCase.assertLength(1, result);
-    JUnitTestCase.assertEquals(librarySource, result[0]);
+    expect(result, hasLength(1));
+    expect(result[0], librarySource);
   }
 
   void test_getLibrariesReferencedFromHtml_no() {
@@ -884,15 +907,14 @@
     _sourceFactory = _context.sourceFactory;
     Source htmlSource = _addSource(
         "/test.html",
-        EngineTestCase.createSource(
-            [
-                "<html><head>",
-                "<script type='application/dart' src='test.js'/>",
-                "</head></html>"]));
+        r'''
+<html><head>
+<script type='application/dart' src='test.js'/>
+</head></html>''');
     _addSource("/test.dart", "library lib;");
     _context.parseHtmlUnit(htmlSource);
     List<Source> result = _context.getLibrariesReferencedFromHtml(htmlSource);
-    EngineTestCase.assertLength(0, result);
+    expect(result, hasLength(0));
   }
 
   void test_getLibraryElement() {
@@ -900,10 +922,10 @@
     _sourceFactory = _context.sourceFactory;
     Source source = _addSource("/test.dart", "library lib;");
     LibraryElement element = _context.getLibraryElement(source);
-    JUnitTestCase.assertNull(element);
+    expect(element, isNull);
     _context.computeLibraryElement(source);
     element = _context.getLibraryElement(source);
-    JUnitTestCase.assertNotNull(element);
+    expect(element, isNotNull);
   }
 
   void test_getLibrarySources() {
@@ -912,33 +934,33 @@
     Source source = _addSource("/test.dart", "library lib;");
     _context.computeKindOf(source);
     sources = _context.librarySources;
-    EngineTestCase.assertLength(originalLength + 1, sources);
+    expect(sources, hasLength(originalLength + 1));
     for (Source returnedSource in sources) {
       if (returnedSource == source) {
         return;
       }
     }
-    JUnitTestCase.fail(
-        "The added source was not in the list of library sources");
+    fail("The added source was not in the list of library sources");
   }
 
   void test_getLineInfo() {
     Source source = _addSource(
         "/test.dart",
-        EngineTestCase.createSource(["library lib;", "", "main() {}"]));
+        r'''
+library lib;
+
+main() {}''');
     LineInfo info = _context.getLineInfo(source);
-    JUnitTestCase.assertNull(info);
+    expect(info, isNull);
     _context.parseCompilationUnit(source);
     info = _context.getLineInfo(source);
-    JUnitTestCase.assertNotNull(info);
+    expect(info, isNotNull);
   }
 
   void test_getModificationStamp_fromSource() {
     int stamp = 42;
-    JUnitTestCase.assertEquals(
-        stamp,
-        _context.getModificationStamp(
-            new AnalysisContextImplTest_Source_getModificationStamp_fromSource(stamp)));
+    expect(_context.getModificationStamp(
+            new AnalysisContextImplTest_Source_getModificationStamp_fromSource(stamp)), stamp);
   }
 
   void test_getModificationStamp_overridden() {
@@ -946,7 +968,7 @@
     Source source =
         new AnalysisContextImplTest_Source_getModificationStamp_overridden(stamp);
     _context.setContents(source, "");
-    JUnitTestCase.assertTrue(stamp != _context.getModificationStamp(source));
+    expect(stamp != _context.getModificationStamp(source), isTrue);
   }
 
   void test_getPublicNamespace_element() {
@@ -955,7 +977,7 @@
     Source source = _addSource("/test.dart", "class A {}");
     LibraryElement library = _context.computeLibraryElement(source);
     Namespace namespace = _context.getPublicNamespace(library);
-    JUnitTestCase.assertNotNull(namespace);
+    expect(namespace, isNotNull);
     EngineTestCase.assertInstanceOf(
         (obj) => obj is ClassElement,
         ClassElement,
@@ -965,16 +987,16 @@
   void test_getRefactoringUnsafeSources() {
     // not sources initially
     List<Source> sources = _context.refactoringUnsafeSources;
-    EngineTestCase.assertLength(0, sources);
+    expect(sources, hasLength(0));
     // add new source, unresolved
     Source source = _addSource("/test.dart", "library lib;");
     sources = _context.refactoringUnsafeSources;
-    EngineTestCase.assertLength(1, sources);
-    JUnitTestCase.assertEquals(source, sources[0]);
+    expect(sources, hasLength(1));
+    expect(sources[0], source);
     // resolve source
     _context.computeLibraryElement(source);
     sources = _context.refactoringUnsafeSources;
-    EngineTestCase.assertLength(0, sources);
+    expect(sources, hasLength(0));
   }
 
   void test_getResolvedCompilationUnit_library() {
@@ -982,58 +1004,52 @@
     _sourceFactory = _context.sourceFactory;
     Source source = _addSource("/lib.dart", "library libb;");
     LibraryElement library = _context.computeLibraryElement(source);
-    JUnitTestCase.assertNotNull(
-        _context.getResolvedCompilationUnit(source, library));
+    expect(_context.getResolvedCompilationUnit(source, library), isNotNull);
     _context.setContents(source, "library lib;");
-    JUnitTestCase.assertNull(
-        _context.getResolvedCompilationUnit(source, library));
+    expect(_context.getResolvedCompilationUnit(source, library), isNull);
   }
 
   void test_getResolvedCompilationUnit_library_null() {
     _context = AnalysisContextFactory.contextWithCore();
     _sourceFactory = _context.sourceFactory;
     Source source = _addSource("/lib.dart", "library lib;");
-    JUnitTestCase.assertNull(_context.getResolvedCompilationUnit(source, null));
+    expect(_context.getResolvedCompilationUnit(source, null), isNull);
   }
 
   void test_getResolvedCompilationUnit_source_dart() {
     _context = AnalysisContextFactory.contextWithCore();
     _sourceFactory = _context.sourceFactory;
     Source source = _addSource("/lib.dart", "library lib;");
-    JUnitTestCase.assertNull(
-        _context.getResolvedCompilationUnit2(source, source));
+    expect(_context.getResolvedCompilationUnit2(source, source), isNull);
     _context.resolveCompilationUnit2(source, source);
-    JUnitTestCase.assertNotNull(
-        _context.getResolvedCompilationUnit2(source, source));
+    expect(_context.getResolvedCompilationUnit2(source, source), isNotNull);
   }
 
   void test_getResolvedCompilationUnit_source_html() {
     _context = AnalysisContextFactory.contextWithCore();
     _sourceFactory = _context.sourceFactory;
     Source source = _addSource("/test.html", "<html></html>");
-    JUnitTestCase.assertNull(
-        _context.getResolvedCompilationUnit2(source, source));
-    JUnitTestCase.assertNull(_context.resolveCompilationUnit2(source, source));
-    JUnitTestCase.assertNull(
-        _context.getResolvedCompilationUnit2(source, source));
+    expect(_context.getResolvedCompilationUnit2(source, source), isNull);
+    expect(_context.resolveCompilationUnit2(source, source), isNull);
+    expect(_context.getResolvedCompilationUnit2(source, source), isNull);
   }
 
   void test_getResolvedHtmlUnit() {
     _context = AnalysisContextFactory.contextWithCore();
     _sourceFactory = _context.sourceFactory;
     Source source = _addSource("/test.html", "<html></html>");
-    JUnitTestCase.assertNull(_context.getResolvedHtmlUnit(source));
+    expect(_context.getResolvedHtmlUnit(source), isNull);
     _context.resolveHtmlUnit(source);
-    JUnitTestCase.assertNotNull(_context.getResolvedHtmlUnit(source));
+    expect(_context.getResolvedHtmlUnit(source), isNotNull);
   }
 
   void test_getSourceFactory() {
-    JUnitTestCase.assertSame(_sourceFactory, _context.sourceFactory);
+    expect(_context.sourceFactory, same(_sourceFactory));
   }
 
   void test_getStatistics() {
     AnalysisContextStatistics statistics = _context.statistics;
-    JUnitTestCase.assertNotNull(statistics);
+    expect(statistics, isNotNull);
     // The following lines are fragile.
     // The values depend on the number of libraries in the SDK.
 //    assertLength(0, statistics.getCacheRows());
@@ -1046,17 +1062,20 @@
     _sourceFactory = _context.sourceFactory;
     Source source = _addSource(
         "/test.dart",
-        EngineTestCase.createSource(["import 'dart:html';", "", "main() {}"]));
-    JUnitTestCase.assertFalse(_context.isClientLibrary(source));
-    JUnitTestCase.assertFalse(_context.isServerLibrary(source));
+        r'''
+import 'dart:html';
+
+main() {}''');
+    expect(_context.isClientLibrary(source), isFalse);
+    expect(_context.isServerLibrary(source), isFalse);
     _context.computeLibraryElement(source);
-    JUnitTestCase.assertTrue(_context.isClientLibrary(source));
-    JUnitTestCase.assertFalse(_context.isServerLibrary(source));
+    expect(_context.isClientLibrary(source), isTrue);
+    expect(_context.isServerLibrary(source), isFalse);
   }
 
   void test_isClientLibrary_html() {
     Source source = _addSource("/test.html", "<html></html>");
-    JUnitTestCase.assertFalse(_context.isClientLibrary(source));
+    expect(_context.isClientLibrary(source), isFalse);
   }
 
   void test_isServerLibrary_dart() {
@@ -1064,33 +1083,36 @@
     _sourceFactory = _context.sourceFactory;
     Source source = _addSource(
         "/test.dart",
-        EngineTestCase.createSource(["library lib;", "", "main() {}"]));
-    JUnitTestCase.assertFalse(_context.isClientLibrary(source));
-    JUnitTestCase.assertFalse(_context.isServerLibrary(source));
+        r'''
+library lib;
+
+main() {}''');
+    expect(_context.isClientLibrary(source), isFalse);
+    expect(_context.isServerLibrary(source), isFalse);
     _context.computeLibraryElement(source);
-    JUnitTestCase.assertFalse(_context.isClientLibrary(source));
-    JUnitTestCase.assertTrue(_context.isServerLibrary(source));
+    expect(_context.isClientLibrary(source), isFalse);
+    expect(_context.isServerLibrary(source), isTrue);
   }
 
   void test_isServerLibrary_html() {
     Source source = _addSource("/test.html", "<html></html>");
-    JUnitTestCase.assertFalse(_context.isServerLibrary(source));
+    expect(_context.isServerLibrary(source), isFalse);
   }
 
   void test_parseCompilationUnit_errors() {
     Source source = _addSource("/lib.dart", "library {");
     CompilationUnit compilationUnit = _context.parseCompilationUnit(source);
-    JUnitTestCase.assertNotNull(compilationUnit);
+    expect(compilationUnit, isNotNull);
     List<AnalysisError> errors = _context.getErrors(source).errors;
-    JUnitTestCase.assertNotNull(errors);
-    JUnitTestCase.assertTrue(errors.length > 0);
+    expect(errors, isNotNull);
+    expect(errors.length > 0, isTrue);
   }
 
   void test_parseCompilationUnit_exception() {
     Source source = _addSourceWithException("/test.dart");
     try {
       _context.parseCompilationUnit(source);
-      JUnitTestCase.fail("Expected AnalysisException");
+      fail("Expected AnalysisException");
     } on AnalysisException catch (exception) {
       // Expected
     }
@@ -1098,14 +1120,14 @@
 
   void test_parseCompilationUnit_html() {
     Source source = _addSource("/test.html", "<html></html>");
-    JUnitTestCase.assertNull(_context.parseCompilationUnit(source));
+    expect(_context.parseCompilationUnit(source), isNull);
   }
 
   void test_parseCompilationUnit_noErrors() {
     Source source = _addSource("/lib.dart", "library lib;");
     CompilationUnit compilationUnit = _context.parseCompilationUnit(source);
-    JUnitTestCase.assertNotNull(compilationUnit);
-    EngineTestCase.assertLength(0, _context.getErrors(source).errors);
+    expect(compilationUnit, isNotNull);
+    expect(_context.getErrors(source).errors, hasLength(0));
   }
 
   void test_parseCompilationUnit_nonExistentSource() {
@@ -1113,8 +1135,7 @@
         new FileBasedSource.con1(FileUtilities2.createFile("/test.dart"));
     try {
       _context.parseCompilationUnit(source);
-      JUnitTestCase.fail(
-          "Expected AnalysisException because file does not exist");
+      fail("Expected AnalysisException because file does not exist");
     } on AnalysisException catch (exception) {
       // Expected result
     }
@@ -1123,27 +1144,28 @@
   void test_parseHtmlUnit_noErrors() {
     Source source = _addSource("/lib.html", "<html></html>");
     ht.HtmlUnit unit = _context.parseHtmlUnit(source);
-    JUnitTestCase.assertNotNull(unit);
+    expect(unit, isNotNull);
   }
 
   void test_parseHtmlUnit_resolveDirectives() {
     Source libSource = _addSource(
         "/lib.dart",
-        EngineTestCase.createSource(["library lib;", "class ClassA {}"]));
+        r'''
+library lib;
+class ClassA {}''');
     Source source = _addSource(
         "/lib.html",
-        EngineTestCase.createSource(
-            [
-                "<html>",
-                "<head>",
-                "  <script type='application/dart'>",
-                "    import 'lib.dart';",
-                "    ClassA v = null;",
-                "  </script>",
-                "</head>",
-                "<body>",
-                "</body>",
-                "</html>"]));
+        r'''
+<html>
+<head>
+  <script type='application/dart'>
+    import 'lib.dart';
+    ClassA v = null;
+  </script>
+</head>
+<body>
+</body>
+</html>''');
     ht.HtmlUnit unit = _context.parseHtmlUnit(source);
     // import directive should be resolved
     ht.XmlTagNode htmlNode = unit.tagNodes[0];
@@ -1151,8 +1173,8 @@
     ht.HtmlScriptTagNode scriptNode = headNode.tagNodes[0];
     CompilationUnit script = scriptNode.script;
     ImportDirective importNode = script.directives[0] as ImportDirective;
-    JUnitTestCase.assertNotNull(importNode.uriContent);
-    JUnitTestCase.assertEquals(libSource, importNode.source);
+    expect(importNode.uriContent, isNotNull);
+    expect(importNode.source, libSource);
   }
 
   void test_performAnalysisTask_IOException() {
@@ -1160,7 +1182,7 @@
     int oldTimestamp = _context.getModificationStamp(source);
     source.generateExceptionOnRead = false;
     _analyzeAll_assertFinished();
-    JUnitTestCase.assertEquals(1, source.readCount);
+    expect(source.readCount, 1);
     source.generateExceptionOnRead = true;
     do {
       _changeSource(source, "");
@@ -1168,23 +1190,27 @@
       // so that analysis engine notices the change
     } while (oldTimestamp == _context.getModificationStamp(source));
     _analyzeAll_assertFinished();
-    JUnitTestCase.assertEquals(2, source.readCount);
+    expect(source.readCount, 2);
   }
 
   void test_performAnalysisTask_addPart() {
     Source libSource = _addSource(
         "/lib.dart",
-        EngineTestCase.createSource(["library lib;", "part 'part.dart';"]));
+        r'''
+library lib;
+part 'part.dart';''');
     // run all tasks without part
     _analyzeAll_assertFinished();
     // add part and run all tasks
     Source partSource =
-        _addSource("/part.dart", EngineTestCase.createSource(["part of lib;", ""]));
+        _addSource("/part.dart", r'''
+part of lib;
+''');
     _analyzeAll_assertFinished();
     // "libSource" should be here
     List<Source> librariesWithPart =
         _context.getLibrariesContaining(partSource);
-    EngineTestCase.assertContains(librariesWithPart, [libSource]);
+    expect(librariesWithPart, unorderedEquals([libSource]));
   }
 
   void test_performAnalysisTask_changeLibraryContents() {
@@ -1192,42 +1218,22 @@
         _addSource("/test.dart", "library lib; part 'test-part.dart';");
     Source partSource = _addSource("/test-part.dart", "part of lib;");
     _analyzeAll_assertFinished();
-    JUnitTestCase.assertNotNullMsg(
-        "library resolved 1",
-        _context.getResolvedCompilationUnit2(libSource, libSource));
-    JUnitTestCase.assertNotNullMsg(
-        "part resolved 1",
-        _context.getResolvedCompilationUnit2(partSource, libSource));
+    expect(_context.getResolvedCompilationUnit2(libSource, libSource), isNotNull, reason: "library resolved 1");
+    expect(_context.getResolvedCompilationUnit2(partSource, libSource), isNotNull, reason: "part resolved 1");
     // update and analyze #1
     _context.setContents(libSource, "library lib;");
-    JUnitTestCase.assertNullMsg(
-        "library changed 2",
-        _context.getResolvedCompilationUnit2(libSource, libSource));
-    JUnitTestCase.assertNullMsg(
-        "part changed 2",
-        _context.getResolvedCompilationUnit2(partSource, libSource));
+    expect(_context.getResolvedCompilationUnit2(libSource, libSource), isNull, reason: "library changed 2");
+    expect(_context.getResolvedCompilationUnit2(partSource, libSource), isNull, reason: "part changed 2");
     _analyzeAll_assertFinished();
-    JUnitTestCase.assertNotNullMsg(
-        "library resolved 2",
-        _context.getResolvedCompilationUnit2(libSource, libSource));
-    JUnitTestCase.assertNullMsg(
-        "part resolved 2",
-        _context.getResolvedCompilationUnit2(partSource, libSource));
+    expect(_context.getResolvedCompilationUnit2(libSource, libSource), isNotNull, reason: "library resolved 2");
+    expect(_context.getResolvedCompilationUnit2(partSource, libSource), isNull, reason: "part resolved 2");
     // update and analyze #2
     _context.setContents(libSource, "library lib; part 'test-part.dart';");
-    JUnitTestCase.assertNullMsg(
-        "library changed 3",
-        _context.getResolvedCompilationUnit2(libSource, libSource));
-    JUnitTestCase.assertNullMsg(
-        "part changed 3",
-        _context.getResolvedCompilationUnit2(partSource, libSource));
+    expect(_context.getResolvedCompilationUnit2(libSource, libSource), isNull, reason: "library changed 3");
+    expect(_context.getResolvedCompilationUnit2(partSource, libSource), isNull, reason: "part changed 3");
     _analyzeAll_assertFinished();
-    JUnitTestCase.assertNotNullMsg(
-        "library resolved 2",
-        _context.getResolvedCompilationUnit2(libSource, libSource));
-    JUnitTestCase.assertNotNullMsg(
-        "part resolved 3",
-        _context.getResolvedCompilationUnit2(partSource, libSource));
+    expect(_context.getResolvedCompilationUnit2(libSource, libSource), isNotNull, reason: "library resolved 2");
+    expect(_context.getResolvedCompilationUnit2(partSource, libSource), isNotNull, reason: "part resolved 3");
   }
 
   void test_performAnalysisTask_changeLibraryThenPartContents() {
@@ -1235,80 +1241,52 @@
         _addSource("/test.dart", "library lib; part 'test-part.dart';");
     Source partSource = _addSource("/test-part.dart", "part of lib;");
     _analyzeAll_assertFinished();
-    JUnitTestCase.assertNotNullMsg(
-        "library resolved 1",
-        _context.getResolvedCompilationUnit2(libSource, libSource));
-    JUnitTestCase.assertNotNullMsg(
-        "part resolved 1",
-        _context.getResolvedCompilationUnit2(partSource, libSource));
+    expect(_context.getResolvedCompilationUnit2(libSource, libSource), isNotNull, reason: "library resolved 1");
+    expect(_context.getResolvedCompilationUnit2(partSource, libSource), isNotNull, reason: "part resolved 1");
     // update and analyze #1
     _context.setContents(libSource, "library lib;");
-    JUnitTestCase.assertNullMsg(
-        "library changed 2",
-        _context.getResolvedCompilationUnit2(libSource, libSource));
-    JUnitTestCase.assertNullMsg(
-        "part changed 2",
-        _context.getResolvedCompilationUnit2(partSource, libSource));
+    expect(_context.getResolvedCompilationUnit2(libSource, libSource), isNull, reason: "library changed 2");
+    expect(_context.getResolvedCompilationUnit2(partSource, libSource), isNull, reason: "part changed 2");
     _analyzeAll_assertFinished();
-    JUnitTestCase.assertNotNullMsg(
-        "library resolved 2",
-        _context.getResolvedCompilationUnit2(libSource, libSource));
-    JUnitTestCase.assertNullMsg(
-        "part resolved 2",
-        _context.getResolvedCompilationUnit2(partSource, libSource));
+    expect(_context.getResolvedCompilationUnit2(libSource, libSource), isNotNull, reason: "library resolved 2");
+    expect(_context.getResolvedCompilationUnit2(partSource, libSource), isNull, reason: "part resolved 2");
     // update and analyze #2
     _context.setContents(partSource, "part of lib; // 1");
     // Assert that changing the part's content does not effect the library
     // now that it is no longer part of that library
-    JUnitTestCase.assertNotNullMsg(
-        "library changed 3",
-        _context.getResolvedCompilationUnit2(libSource, libSource));
-    JUnitTestCase.assertNullMsg(
-        "part changed 3",
-        _context.getResolvedCompilationUnit2(partSource, libSource));
+    expect(_context.getResolvedCompilationUnit2(libSource, libSource), isNotNull, reason: "library changed 3");
+    expect(_context.getResolvedCompilationUnit2(partSource, libSource), isNull, reason: "part changed 3");
     _analyzeAll_assertFinished();
-    JUnitTestCase.assertNotNullMsg(
-        "library resolved 3",
-        _context.getResolvedCompilationUnit2(libSource, libSource));
-    JUnitTestCase.assertNullMsg(
-        "part resolved 3",
-        _context.getResolvedCompilationUnit2(partSource, libSource));
+    expect(_context.getResolvedCompilationUnit2(libSource, libSource), isNotNull, reason: "library resolved 3");
+    expect(_context.getResolvedCompilationUnit2(partSource, libSource), isNull, reason: "part resolved 3");
   }
 
   void test_performAnalysisTask_changePartContents_makeItAPart() {
     Source libSource = _addSource(
         "/lib.dart",
-        EngineTestCase.createSource(
-            ["library lib;", "part 'part.dart';", "void f(x) {}"]));
+        r'''
+library lib;
+part 'part.dart';
+void f(x) {}''');
     Source partSource = _addSource(
         "/part.dart",
-        EngineTestCase.createSource(["void g() { f(null); }"]));
+        "void g() { f(null); }");
     _analyzeAll_assertFinished();
-    JUnitTestCase.assertNotNullMsg(
-        "library resolved 1",
-        _context.getResolvedCompilationUnit2(libSource, libSource));
-    JUnitTestCase.assertNotNullMsg(
-        "part resolved 1",
-        _context.getResolvedCompilationUnit2(partSource, libSource));
+    expect(_context.getResolvedCompilationUnit2(libSource, libSource), isNotNull, reason: "library resolved 1");
+    expect(_context.getResolvedCompilationUnit2(partSource, libSource), isNotNull, reason: "part resolved 1");
     // update and analyze
     _context.setContents(
         partSource,
-        EngineTestCase.createSource(["part of lib;", "void g() { f(null); }"]));
-    JUnitTestCase.assertNullMsg(
-        "library changed 2",
-        _context.getResolvedCompilationUnit2(libSource, libSource));
-    JUnitTestCase.assertNullMsg(
-        "part changed 2",
-        _context.getResolvedCompilationUnit2(partSource, libSource));
+        r'''
+part of lib;
+void g() { f(null); }''');
+    expect(_context.getResolvedCompilationUnit2(libSource, libSource), isNull, reason: "library changed 2");
+    expect(_context.getResolvedCompilationUnit2(partSource, libSource), isNull, reason: "part changed 2");
     _analyzeAll_assertFinished();
-    JUnitTestCase.assertNotNullMsg(
-        "library resolved 2",
-        _context.getResolvedCompilationUnit2(libSource, libSource));
-    JUnitTestCase.assertNotNullMsg(
-        "part resolved 2",
-        _context.getResolvedCompilationUnit2(partSource, libSource));
-    EngineTestCase.assertLength(0, _context.getErrors(libSource).errors);
-    EngineTestCase.assertLength(0, _context.getErrors(partSource).errors);
+    expect(_context.getResolvedCompilationUnit2(libSource, libSource), isNotNull, reason: "library resolved 2");
+    expect(_context.getResolvedCompilationUnit2(partSource, libSource), isNotNull, reason: "part resolved 2");
+    expect(_context.getErrors(libSource).errors, hasLength(0));
+    expect(_context.getErrors(partSource).errors, hasLength(0));
   }
 
   /**
@@ -1317,20 +1295,26 @@
   void test_performAnalysisTask_changePartContents_makeItNotPart() {
     Source libSource = _addSource(
         "/lib.dart",
-        EngineTestCase.createSource(
-            ["library lib;", "part 'part.dart';", "void f(x) {}"]));
+        r'''
+library lib;
+part 'part.dart';
+void f(x) {}''');
     Source partSource = _addSource(
         "/part.dart",
-        EngineTestCase.createSource(["part of lib;", "void g() { f(null); }"]));
+        r'''
+part of lib;
+void g() { f(null); }''');
     _analyzeAll_assertFinished();
-    EngineTestCase.assertLength(0, _context.getErrors(libSource).errors);
-    EngineTestCase.assertLength(0, _context.getErrors(partSource).errors);
+    expect(_context.getErrors(libSource).errors, hasLength(0));
+    expect(_context.getErrors(partSource).errors, hasLength(0));
     // Remove 'part' directive, which should make "f(null)" an error.
     _context.setContents(
         partSource,
-        EngineTestCase.createSource(["//part of lib;", "void g() { f(null); }"]));
+        r'''
+//part of lib;
+void g() { f(null); }''');
     _analyzeAll_assertFinished();
-    JUnitTestCase.assertTrue(_context.getErrors(libSource).errors.length != 0);
+    expect(_context.getErrors(libSource).errors.length != 0, isTrue);
   }
 
   void test_performAnalysisTask_changePartContents_noSemanticChanges() {
@@ -1338,97 +1322,56 @@
         _addSource("/test.dart", "library lib; part 'test-part.dart';");
     Source partSource = _addSource("/test-part.dart", "part of lib;");
     _analyzeAll_assertFinished();
-    JUnitTestCase.assertNotNullMsg(
-        "library resolved 1",
-        _context.getResolvedCompilationUnit2(libSource, libSource));
-    JUnitTestCase.assertNotNullMsg(
-        "part resolved 1",
-        _context.getResolvedCompilationUnit2(partSource, libSource));
+    expect(_context.getResolvedCompilationUnit2(libSource, libSource), isNotNull, reason: "library resolved 1");
+    expect(_context.getResolvedCompilationUnit2(partSource, libSource), isNotNull, reason: "part resolved 1");
     // update and analyze #1
     _context.setContents(partSource, "part of lib; // 1");
-    JUnitTestCase.assertNullMsg(
-        "library changed 2",
-        _context.getResolvedCompilationUnit2(libSource, libSource));
-    JUnitTestCase.assertNullMsg(
-        "part changed 2",
-        _context.getResolvedCompilationUnit2(partSource, libSource));
+    expect(_context.getResolvedCompilationUnit2(libSource, libSource), isNull, reason: "library changed 2");
+    expect(_context.getResolvedCompilationUnit2(partSource, libSource), isNull, reason: "part changed 2");
     _analyzeAll_assertFinished();
-    JUnitTestCase.assertNotNullMsg(
-        "library resolved 2",
-        _context.getResolvedCompilationUnit2(libSource, libSource));
-    JUnitTestCase.assertNotNullMsg(
-        "part resolved 2",
-        _context.getResolvedCompilationUnit2(partSource, libSource));
+    expect(_context.getResolvedCompilationUnit2(libSource, libSource), isNotNull, reason: "library resolved 2");
+    expect(_context.getResolvedCompilationUnit2(partSource, libSource), isNotNull, reason: "part resolved 2");
     // update and analyze #2
     _context.setContents(partSource, "part of lib; // 12");
-    JUnitTestCase.assertNullMsg(
-        "library changed 3",
-        _context.getResolvedCompilationUnit2(libSource, libSource));
-    JUnitTestCase.assertNullMsg(
-        "part changed 3",
-        _context.getResolvedCompilationUnit2(partSource, libSource));
+    expect(_context.getResolvedCompilationUnit2(libSource, libSource), isNull, reason: "library changed 3");
+    expect(_context.getResolvedCompilationUnit2(partSource, libSource), isNull, reason: "part changed 3");
     _analyzeAll_assertFinished();
-    JUnitTestCase.assertNotNullMsg(
-        "library resolved 3",
-        _context.getResolvedCompilationUnit2(libSource, libSource));
-    JUnitTestCase.assertNotNullMsg(
-        "part resolved 3",
-        _context.getResolvedCompilationUnit2(partSource, libSource));
+    expect(_context.getResolvedCompilationUnit2(libSource, libSource), isNotNull, reason: "library resolved 3");
+    expect(_context.getResolvedCompilationUnit2(partSource, libSource), isNotNull, reason: "part resolved 3");
   }
 
   void test_performAnalysisTask_importedLibraryAdd() {
     Source libASource =
         _addSource("/libA.dart", "library libA; import 'libB.dart';");
     _analyzeAll_assertFinished();
-    JUnitTestCase.assertNotNullMsg(
-        "libA resolved 1",
-        _context.getResolvedCompilationUnit2(libASource, libASource));
-    JUnitTestCase.assertTrueMsg(
-        "libA has an error",
-        _hasAnalysisErrorWithErrorSeverity(_context.getErrors(libASource)));
+    expect(_context.getResolvedCompilationUnit2(libASource, libASource), isNotNull, reason: "libA resolved 1");
+    expect(_hasAnalysisErrorWithErrorSeverity(_context.getErrors(libASource)), isTrue, reason: "libA has an error");
     // add libB.dart and analyze
     Source libBSource = _addSource("/libB.dart", "library libB;");
     _analyzeAll_assertFinished();
-    JUnitTestCase.assertNotNullMsg(
-        "libA resolved 2",
-        _context.getResolvedCompilationUnit2(libASource, libASource));
-    JUnitTestCase.assertNotNullMsg(
-        "libB resolved 2",
-        _context.getResolvedCompilationUnit2(libBSource, libBSource));
-    JUnitTestCase.assertTrueMsg(
-        "libA doesn't have errors",
-        !_hasAnalysisErrorWithErrorSeverity(_context.getErrors(libASource)));
+    expect(_context.getResolvedCompilationUnit2(libASource, libASource), isNotNull, reason: "libA resolved 2");
+    expect(_context.getResolvedCompilationUnit2(libBSource, libBSource), isNotNull, reason: "libB resolved 2");
+    expect(!_hasAnalysisErrorWithErrorSeverity(_context.getErrors(libASource)), isTrue, reason: "libA doesn't have errors");
   }
 
   void test_performAnalysisTask_importedLibraryAdd_html() {
     Source htmlSource = _addSource(
         "/page.html",
-        EngineTestCase.createSource(
-            [
-                "<html><body><script type=\"application/dart\">",
-                "  import '/libB.dart';",
-                "  main() {print('hello dart');}",
-                "</script></body></html>"]));
+        r'''
+<html><body><script type="application/dart">
+  import '/libB.dart';
+  main() {print('hello dart');}
+</script></body></html>''');
     _analyzeAll_assertFinished();
-    JUnitTestCase.assertNotNullMsg(
-        "htmlUnit resolved 1",
-        _context.getResolvedHtmlUnit(htmlSource));
-    JUnitTestCase.assertTrueMsg(
-        "htmlSource has an error",
-        _hasAnalysisErrorWithErrorSeverity(_context.getErrors(htmlSource)));
+    expect(_context.getResolvedHtmlUnit(htmlSource), isNotNull, reason: "htmlUnit resolved 1");
+    expect(_hasAnalysisErrorWithErrorSeverity(_context.getErrors(htmlSource)), isTrue, reason: "htmlSource has an error");
     // add libB.dart and analyze
     Source libBSource = _addSource("/libB.dart", "library libB;");
     _analyzeAll_assertFinished();
-    JUnitTestCase.assertNotNullMsg(
-        "htmlUnit resolved 1",
-        _context.getResolvedHtmlUnit(htmlSource));
-    JUnitTestCase.assertNotNullMsg(
-        "libB resolved 2",
-        _context.getResolvedCompilationUnit2(libBSource, libBSource));
+    expect(_context.getResolvedHtmlUnit(htmlSource), isNotNull, reason: "htmlUnit resolved 1");
+    expect(_context.getResolvedCompilationUnit2(libBSource, libBSource), isNotNull, reason: "libB resolved 2");
     AnalysisErrorInfo errors = _context.getErrors(htmlSource);
-    JUnitTestCase.assertTrueMsg(
-        "htmlSource doesn't have errors",
-        !_hasAnalysisErrorWithErrorSeverity(errors));
+    expect(!_hasAnalysisErrorWithErrorSeverity(errors), isTrue, reason: "htmlSource doesn't have errors");
   }
 
   void test_performAnalysisTask_importedLibraryDelete() {
@@ -1436,33 +1379,21 @@
         _addSource("/libA.dart", "library libA; import 'libB.dart';");
     Source libBSource = _addSource("/libB.dart", "library libB;");
     _analyzeAll_assertFinished();
-    JUnitTestCase.assertNotNullMsg(
-        "libA resolved 1",
-        _context.getResolvedCompilationUnit2(libASource, libASource));
-    JUnitTestCase.assertNotNullMsg(
-        "libB resolved 1",
-        _context.getResolvedCompilationUnit2(libBSource, libBSource));
-    JUnitTestCase.assertTrueMsg(
-        "libA doesn't have errors",
-        !_hasAnalysisErrorWithErrorSeverity(_context.getErrors(libASource)));
+    expect(_context.getResolvedCompilationUnit2(libASource, libASource), isNotNull, reason: "libA resolved 1");
+    expect(_context.getResolvedCompilationUnit2(libBSource, libBSource), isNotNull, reason: "libB resolved 1");
+    expect(!_hasAnalysisErrorWithErrorSeverity(_context.getErrors(libASource)), isTrue, reason: "libA doesn't have errors");
     // remove libB.dart content and analyze
     _context.setContents(libBSource, null);
     _analyzeAll_assertFinished();
-    JUnitTestCase.assertNotNullMsg(
-        "libA resolved 2",
-        _context.getResolvedCompilationUnit2(libASource, libASource));
-    JUnitTestCase.assertTrueMsg(
-        "libA has an error",
-        _hasAnalysisErrorWithErrorSeverity(_context.getErrors(libASource)));
+    expect(_context.getResolvedCompilationUnit2(libASource, libASource), isNotNull, reason: "libA resolved 2");
+    expect(_hasAnalysisErrorWithErrorSeverity(_context.getErrors(libASource)), isTrue, reason: "libA has an error");
   }
 
   void test_performAnalysisTask_missingPart() {
     Source source =
         _addSource("/test.dart", "library lib; part 'no-such-file.dart';");
     _analyzeAll_assertFinished();
-    JUnitTestCase.assertNotNullMsg(
-        "performAnalysisTask failed to compute an element model",
-        _context.getLibraryElement(source));
+    expect(_context.getLibraryElement(source), isNotNull, reason: "performAnalysisTask failed to compute an element model");
   }
 
   void test_performAnalysisTask_modifiedAfterParse() {
@@ -1518,8 +1449,8 @@
     LibraryElement library = _context.computeLibraryElement(source);
     CompilationUnit compilationUnit =
         _context.resolveCompilationUnit(source, library);
-    JUnitTestCase.assertNotNull(compilationUnit);
-    JUnitTestCase.assertNotNull(compilationUnit.element);
+    expect(compilationUnit, isNotNull);
+    expect(compilationUnit.element, isNotNull);
   }
 
   void test_resolveCompilationUnit_source() {
@@ -1528,7 +1459,7 @@
     Source source = _addSource("/lib.dart", "library lib;");
     CompilationUnit compilationUnit =
         _context.resolveCompilationUnit2(source, source);
-    JUnitTestCase.assertNotNull(compilationUnit);
+    expect(compilationUnit, isNotNull);
   }
 
   void test_resolveCompilationUnit_sourceChangeDuringResolution() {
@@ -1538,14 +1469,14 @@
     Source source = _addSource("/lib.dart", "library lib;");
     CompilationUnit compilationUnit =
         _context.resolveCompilationUnit2(source, source);
-    JUnitTestCase.assertNotNull(compilationUnit);
-    JUnitTestCase.assertNotNull(_context.getLineInfo(source));
+    expect(compilationUnit, isNotNull);
+    expect(_context.getLineInfo(source), isNotNull);
   }
 
   void test_resolveHtmlUnit() {
     Source source = _addSource("/lib.html", "<html></html>");
     ht.HtmlUnit unit = _context.resolveHtmlUnit(source);
-    JUnitTestCase.assertNotNull(unit);
+    expect(unit, isNotNull);
   }
 
   void test_setAnalysisOptions() {
@@ -1555,9 +1486,9 @@
     options.hint = false;
     _context.analysisOptions = options;
     AnalysisOptions result = _context.analysisOptions;
-    JUnitTestCase.assertEquals(options.cacheSize, result.cacheSize);
-    JUnitTestCase.assertEquals(options.dart2jsHint, result.dart2jsHint);
-    JUnitTestCase.assertEquals(options.hint, result.hint);
+    expect(result.cacheSize, options.cacheSize);
+    expect(result.dart2jsHint, options.dart2jsHint);
+    expect(result.hint, options.hint);
   }
 
   void test_setAnalysisOptions_reduceAnalysisPriorityOrder() {
@@ -1565,14 +1496,13 @@
         new AnalysisOptionsImpl.con1(_context.analysisOptions);
     List<Source> sources = new List<Source>();
     for (int index = 0; index < options.cacheSize; index++) {
-      sources.add(_addSource("/lib.dart${index}", ""));
+      sources.add(_addSource("/lib.dart$index", ""));
     }
     _context.analysisPriorityOrder = sources;
     int oldPriorityOrderSize = _getPriorityOrder(_context).length;
     options.cacheSize = options.cacheSize - 10;
     _context.analysisOptions = options;
-    JUnitTestCase.assertTrue(
-        oldPriorityOrderSize > _getPriorityOrder(_context).length);
+    expect(oldPriorityOrderSize > _getPriorityOrder(_context).length, isTrue);
   }
 
   void test_setAnalysisPriorityOrder_empty() {
@@ -1583,11 +1513,10 @@
     AnalysisOptions options = _context.analysisOptions;
     List<Source> sources = new List<Source>();
     for (int index = 0; index < options.cacheSize; index++) {
-      sources.add(_addSource("/lib.dart${index}", ""));
+      sources.add(_addSource("/lib.dart$index", ""));
     }
     _context.analysisPriorityOrder = sources;
-    JUnitTestCase.assertTrue(
-        options.cacheSize > _getPriorityOrder(_context).length);
+    expect(options.cacheSize > _getPriorityOrder(_context).length, isTrue);
   }
 
   void test_setAnalysisPriorityOrder_nonEmpty() {
@@ -1601,31 +1530,34 @@
     options.incremental = true;
     _context = AnalysisContextFactory.contextWithCoreAndOptions(options);
     _sourceFactory = _context.sourceFactory;
-    String oldCode = EngineTestCase.createSource(
-        ["library lib;", "part 'part.dart';", "int a = 0;"]);
+    String oldCode = r'''
+library lib;
+part 'part.dart';
+int a = 0;''';
     Source librarySource = _addSource("/lib.dart", oldCode);
     Source partSource = _addSource(
         "/part.dart",
-        EngineTestCase.createSource(["part of lib;", "int b = a;"]));
+        r'''
+part of lib;
+int b = a;''');
     LibraryElement element = _context.computeLibraryElement(librarySource);
     CompilationUnit unit =
         _context.getResolvedCompilationUnit(librarySource, element);
-    JUnitTestCase.assertNotNull(unit);
+    expect(unit, isNotNull);
     int offset = oldCode.indexOf("int a") + 4;
-    String newCode = EngineTestCase.createSource(
-        ["library lib;", "part 'part.dart';", "int ya = 0;"]);
-    JUnitTestCase.assertNull(_getIncrementalAnalysisCache(_context));
+    String newCode = r'''
+library lib;
+part 'part.dart';
+int ya = 0;''';
+    expect(_getIncrementalAnalysisCache(_context), isNull);
     _context.setChangedContents(librarySource, newCode, offset, 0, 1);
-    JUnitTestCase.assertEquals(
-        newCode,
-        _context.getContents(librarySource).data);
+    expect(_context.getContents(librarySource).data, newCode);
     IncrementalAnalysisCache incrementalCache =
         _getIncrementalAnalysisCache(_context);
-    JUnitTestCase.assertEquals(librarySource, incrementalCache.librarySource);
-    JUnitTestCase.assertSame(unit, incrementalCache.resolvedUnit);
-    JUnitTestCase.assertNull(
-        _context.getResolvedCompilationUnit2(partSource, librarySource));
-    JUnitTestCase.assertEquals(newCode, incrementalCache.newContents);
+    expect(incrementalCache.librarySource, librarySource);
+    expect(incrementalCache.resolvedUnit, same(unit));
+    expect(_context.getResolvedCompilationUnit2(partSource, librarySource), isNull);
+    expect(incrementalCache.newContents, newCode);
   }
 
   void test_setChangedContents_notResolved() {
@@ -1636,16 +1568,18 @@
     _context.analysisOptions = options;
     _sourceFactory = _context.sourceFactory;
     String oldCode =
-        EngineTestCase.createSource(["library lib;", "int a = 0;"]);
+        r'''
+library lib;
+int a = 0;''';
     Source librarySource = _addSource("/lib.dart", oldCode);
     int offset = oldCode.indexOf("int a") + 4;
     String newCode =
-        EngineTestCase.createSource(["library lib;", "int ya = 0;"]);
+        r'''
+library lib;
+int ya = 0;''';
     _context.setChangedContents(librarySource, newCode, offset, 0, 1);
-    JUnitTestCase.assertEquals(
-        newCode,
-        _context.getContents(librarySource).data);
-    JUnitTestCase.assertNull(_getIncrementalAnalysisCache(_context));
+    expect(_context.getContents(librarySource).data, newCode);
+    expect(_getIncrementalAnalysisCache(_context), isNull);
   }
 
   void test_setContents_libraryWithPart() {
@@ -1653,11 +1587,15 @@
     _sourceFactory = _context.sourceFactory;
     Source librarySource = _addSource(
         "/lib.dart",
-        EngineTestCase.createSource(
-            ["library lib;", "part 'part.dart';", "int a = 0;"]));
+        r'''
+library lib;
+part 'part.dart';
+int a = 0;''');
     Source partSource = _addSource(
         "/part.dart",
-        EngineTestCase.createSource(["part of lib;", "int b = a;"]));
+        r'''
+part of lib;
+int b = a;''');
     _context.computeLibraryElement(librarySource);
     IncrementalAnalysisCache incrementalCache = new IncrementalAnalysisCache(
         librarySource,
@@ -1669,16 +1607,15 @@
         0,
         0);
     _setIncrementalAnalysisCache(_context, incrementalCache);
-    JUnitTestCase.assertSame(
-        incrementalCache,
-        _getIncrementalAnalysisCache(_context));
+    expect(_getIncrementalAnalysisCache(_context), same(incrementalCache));
     _context.setContents(
         librarySource,
-        EngineTestCase.createSource(
-            ["library lib;", "part 'part.dart';", "int aa = 0;"]));
-    JUnitTestCase.assertNull(
-        _context.getResolvedCompilationUnit2(partSource, librarySource));
-    JUnitTestCase.assertNull(_getIncrementalAnalysisCache(_context));
+        r'''
+library lib;
+part 'part.dart';
+int aa = 0;''');
+    expect(_context.getResolvedCompilationUnit2(partSource, librarySource), isNull);
+    expect(_getIncrementalAnalysisCache(_context), isNull);
   }
 
   void test_setContents_null() {
@@ -1686,7 +1623,9 @@
     _sourceFactory = _context.sourceFactory;
     Source librarySource = _addSource(
         "/lib.dart",
-        EngineTestCase.createSource(["library lib;", "int a = 0;"]));
+        r'''
+library lib;
+int a = 0;''');
     _context.computeLibraryElement(librarySource);
     IncrementalAnalysisCache incrementalCache = new IncrementalAnalysisCache(
         librarySource,
@@ -1698,20 +1637,17 @@
         0,
         0);
     _setIncrementalAnalysisCache(_context, incrementalCache);
-    JUnitTestCase.assertSame(
-        incrementalCache,
-        _getIncrementalAnalysisCache(_context));
+    expect(_getIncrementalAnalysisCache(_context), same(incrementalCache));
     _context.setContents(librarySource, null);
-    JUnitTestCase.assertNull(
-        _context.getResolvedCompilationUnit2(librarySource, librarySource));
-    JUnitTestCase.assertNull(_getIncrementalAnalysisCache(_context));
+    expect(_context.getResolvedCompilationUnit2(librarySource, librarySource), isNull);
+    expect(_getIncrementalAnalysisCache(_context), isNull);
   }
 
   void test_setSourceFactory() {
-    JUnitTestCase.assertEquals(_sourceFactory, _context.sourceFactory);
+    expect(_context.sourceFactory, _sourceFactory);
     SourceFactory factory = new SourceFactory([]);
     _context.sourceFactory = factory;
-    JUnitTestCase.assertEquals(factory, _context.sourceFactory);
+    expect(_context.sourceFactory, factory);
   }
 
   void test_unreadableSource() {
@@ -1719,34 +1655,36 @@
     _sourceFactory = _context.sourceFactory;
     Source test1 = _addSource(
         "/test1.dart",
-        EngineTestCase.createSource(["import 'test2.dart';", "library test1;"]));
+        r'''
+import 'test2.dart';
+library test1;''');
     Source test2 = _addSource(
         "/test2.dart",
-        EngineTestCase.createSource(
-            ["import 'test1.dart';", "import 'test3.dart';", "library test2;"]));
+        r'''
+import 'test1.dart';
+import 'test3.dart';
+library test2;''');
     Source test3 = _addSourceWithException("/test3.dart");
     _analyzeAll_assertFinished();
     // test1 and test2 should have been successfully analyzed
     // despite the fact that test3 couldn't be read.
-    JUnitTestCase.assertNotNull(_context.computeLibraryElement(test1));
-    JUnitTestCase.assertNotNull(_context.computeLibraryElement(test2));
-    JUnitTestCase.assertNull(_context.computeLibraryElement(test3));
+    expect(_context.computeLibraryElement(test1), isNotNull);
+    expect(_context.computeLibraryElement(test2), isNotNull);
+    expect(_context.computeLibraryElement(test3), isNull);
   }
 
   void test_updateAnalysis() {
-    JUnitTestCase.assertTrue(_context.sourcesNeedingProcessing.isEmpty);
+    expect(_context.sourcesNeedingProcessing.isEmpty, isTrue);
     Source source =
         new FileBasedSource.con1(FileUtilities2.createFile("/test.dart"));
     AnalysisDelta delta = new AnalysisDelta();
     delta.setAnalysisLevel(source, AnalysisLevel.ALL);
     _context.applyAnalysisDelta(delta);
-    JUnitTestCase.assertTrue(
-        _context.sourcesNeedingProcessing.contains(source));
+    expect(_context.sourcesNeedingProcessing.contains(source), isTrue);
     delta = new AnalysisDelta();
     delta.setAnalysisLevel(source, AnalysisLevel.NONE);
     _context.applyAnalysisDelta(delta);
-    JUnitTestCase.assertFalse(
-        _context.sourcesNeedingProcessing.contains(source));
+    expect(_context.sourcesNeedingProcessing.contains(source), isFalse);
   }
 
   void xtest_performAnalysisTask_stress() {
@@ -1759,7 +1697,7 @@
     List<Source> sources = new List<Source>();
     ChangeSet changeSet = new ChangeSet();
     for (int i = 0; i < sourceCount; i++) {
-      Source source = _addSource("/lib${i}.dart", "library lib${i};");
+      Source source = _addSource("/lib$i.dart", "library lib$i;");
       sources.add(source);
       changeSet.addedSource(source);
     }
@@ -1774,8 +1712,7 @@
     }
     List<ChangeNotice> notice = _context.performAnalysisTask().changeNotices;
     if (notice != null) {
-      JUnitTestCase.fail(
-          "performAnalysisTask failed to terminate after analyzing all sources");
+      fail("performAnalysisTask failed to terminate after analyzing all sources");
     }
   }
 
@@ -1821,8 +1758,7 @@
         return;
       }
     }
-    JUnitTestCase.fail(
-        "performAnalysisTask failed to terminate after analyzing all sources");
+    fail("performAnalysisTask failed to terminate after analyzing all sources");
   }
 
   void _changeSource(TestSource source, String contents) {
@@ -1925,26 +1861,18 @@
       options.incremental = booleanValue;
       options.preserveComments = booleanValue;
       AnalysisOptionsImpl copy = new AnalysisOptionsImpl.con1(options);
-      JUnitTestCase.assertEquals(options.analyzeAngular, copy.analyzeAngular);
-      JUnitTestCase.assertEquals(
-          options.analyzeFunctionBodies,
-          copy.analyzeFunctionBodies);
-      JUnitTestCase.assertEquals(options.analyzePolymer, copy.analyzePolymer);
-      JUnitTestCase.assertEquals(options.cacheSize, copy.cacheSize);
-      JUnitTestCase.assertEquals(options.dart2jsHint, copy.dart2jsHint);
-      JUnitTestCase.assertEquals(options.enableAsync, copy.enableAsync);
-      JUnitTestCase.assertEquals(
-          options.enableDeferredLoading,
-          copy.enableDeferredLoading);
-      JUnitTestCase.assertEquals(options.enableEnum, copy.enableEnum);
-      JUnitTestCase.assertEquals(
-          options.generateSdkErrors,
-          copy.generateSdkErrors);
-      JUnitTestCase.assertEquals(options.hint, copy.hint);
-      JUnitTestCase.assertEquals(options.incremental, copy.incremental);
-      JUnitTestCase.assertEquals(
-          options.preserveComments,
-          copy.preserveComments);
+      expect(copy.analyzeAngular, options.analyzeAngular);
+      expect(copy.analyzeFunctionBodies, options.analyzeFunctionBodies);
+      expect(copy.analyzePolymer, options.analyzePolymer);
+      expect(copy.cacheSize, options.cacheSize);
+      expect(copy.dart2jsHint, options.dart2jsHint);
+      expect(copy.enableAsync, options.enableAsync);
+      expect(copy.enableDeferredLoading, options.enableDeferredLoading);
+      expect(copy.enableEnum, options.enableEnum);
+      expect(copy.generateSdkErrors, options.generateSdkErrors);
+      expect(copy.hint, options.hint);
+      expect(copy.incremental, options.incremental);
+      expect(copy.preserveComments, options.preserveComments);
     }
   }
 
@@ -1952,96 +1880,88 @@
     AnalysisOptionsImpl options = new AnalysisOptionsImpl();
     bool value = !options.analyzeAngular;
     options.analyzeAngular = value;
-    JUnitTestCase.assertEquals(value, options.analyzeAngular);
+    expect(options.analyzeAngular, value);
   }
 
   void test_getAnalyzeFunctionBodies() {
     AnalysisOptionsImpl options = new AnalysisOptionsImpl();
     bool value = !options.analyzeFunctionBodies;
     options.analyzeFunctionBodies = value;
-    JUnitTestCase.assertEquals(value, options.analyzeFunctionBodies);
+    expect(options.analyzeFunctionBodies, value);
   }
 
   void test_getAnalyzePolymer() {
     AnalysisOptionsImpl options = new AnalysisOptionsImpl();
     bool value = !options.analyzePolymer;
     options.analyzePolymer = value;
-    JUnitTestCase.assertEquals(value, options.analyzePolymer);
+    expect(options.analyzePolymer, value);
   }
 
   void test_getCacheSize() {
     AnalysisOptionsImpl options = new AnalysisOptionsImpl();
-    JUnitTestCase.assertEquals(
-        AnalysisOptionsImpl.DEFAULT_CACHE_SIZE,
-        options.cacheSize);
+    expect(options.cacheSize, AnalysisOptionsImpl.DEFAULT_CACHE_SIZE);
     int value = options.cacheSize + 1;
     options.cacheSize = value;
-    JUnitTestCase.assertEquals(value, options.cacheSize);
+    expect(options.cacheSize, value);
   }
 
   void test_getDart2jsHint() {
     AnalysisOptionsImpl options = new AnalysisOptionsImpl();
     bool value = !options.dart2jsHint;
     options.dart2jsHint = value;
-    JUnitTestCase.assertEquals(value, options.dart2jsHint);
+    expect(options.dart2jsHint, value);
   }
 
   void test_getEnableAsync() {
     AnalysisOptionsImpl options = new AnalysisOptionsImpl();
-    JUnitTestCase.assertEquals(
-        AnalysisOptionsImpl.DEFAULT_ENABLE_ASYNC,
-        options.enableAsync);
+    expect(options.enableAsync, AnalysisOptionsImpl.DEFAULT_ENABLE_ASYNC);
     bool value = !options.enableAsync;
     options.enableAsync = value;
-    JUnitTestCase.assertEquals(value, options.enableAsync);
+    expect(options.enableAsync, value);
   }
 
   void test_getEnableDeferredLoading() {
     AnalysisOptionsImpl options = new AnalysisOptionsImpl();
-    JUnitTestCase.assertEquals(
-        AnalysisOptionsImpl.DEFAULT_ENABLE_DEFERRED_LOADING,
-        options.enableDeferredLoading);
+    expect(options.enableDeferredLoading, AnalysisOptionsImpl.DEFAULT_ENABLE_DEFERRED_LOADING);
     bool value = !options.enableDeferredLoading;
     options.enableDeferredLoading = value;
-    JUnitTestCase.assertEquals(value, options.enableDeferredLoading);
+    expect(options.enableDeferredLoading, value);
   }
 
   void test_getEnableEnum() {
     AnalysisOptionsImpl options = new AnalysisOptionsImpl();
-    JUnitTestCase.assertEquals(
-        AnalysisOptionsImpl.DEFAULT_ENABLE_ENUM,
-        options.enableEnum);
+    expect(options.enableEnum, AnalysisOptionsImpl.DEFAULT_ENABLE_ENUM);
     bool value = !options.enableEnum;
     options.enableEnum = value;
-    JUnitTestCase.assertEquals(value, options.enableEnum);
+    expect(options.enableEnum, value);
   }
 
   void test_getGenerateSdkErrors() {
     AnalysisOptionsImpl options = new AnalysisOptionsImpl();
     bool value = !options.generateSdkErrors;
     options.generateSdkErrors = value;
-    JUnitTestCase.assertEquals(value, options.generateSdkErrors);
+    expect(options.generateSdkErrors, value);
   }
 
   void test_getHint() {
     AnalysisOptionsImpl options = new AnalysisOptionsImpl();
     bool value = !options.hint;
     options.hint = value;
-    JUnitTestCase.assertEquals(value, options.hint);
+    expect(options.hint, value);
   }
 
   void test_getIncremental() {
     AnalysisOptionsImpl options = new AnalysisOptionsImpl();
     bool value = !options.incremental;
     options.incremental = value;
-    JUnitTestCase.assertEquals(value, options.incremental);
+    expect(options.incremental, value);
   }
 
   void test_getPreserveComments() {
     AnalysisOptionsImpl options = new AnalysisOptionsImpl();
     bool value = !options.preserveComments;
     options.preserveComments = value;
-    JUnitTestCase.assertEquals(value, options.preserveComments);
+    expect(options.preserveComments, value);
   }
 }
 
@@ -2063,7 +1983,7 @@
   String get taskDescription => null;
   @override
   accept(AnalysisTaskVisitor visitor) {
-    JUnitTestCase.assertNotNull(exception);
+    expect(exception, isNotNull);
     return null;
   }
   @override
@@ -2081,86 +2001,46 @@
 class DartEntryTest extends EngineTestCase {
   void set state2(DataDescriptor descriptor) {
     DartEntry entry = new DartEntry();
-    JUnitTestCase.assertNotSame(CacheState.FLUSHED, entry.getState(descriptor));
+    expect(entry.getState(descriptor), isNot(same(CacheState.FLUSHED)));
     entry.setState(descriptor, CacheState.FLUSHED);
-    JUnitTestCase.assertSame(CacheState.FLUSHED, entry.getState(descriptor));
+    expect(entry.getState(descriptor), same(CacheState.FLUSHED));
   }
 
   void set state3(DataDescriptor descriptor) {
     Source source = new TestSource();
     DartEntry entry = new DartEntry();
-    JUnitTestCase.assertNotSame(
-        CacheState.FLUSHED,
-        entry.getStateInLibrary(descriptor, source));
+    expect(entry.getStateInLibrary(descriptor, source), isNot(same(CacheState.FLUSHED)));
     entry.setStateInLibrary(descriptor, source, CacheState.FLUSHED);
-    JUnitTestCase.assertSame(
-        CacheState.FLUSHED,
-        entry.getStateInLibrary(descriptor, source));
+    expect(entry.getStateInLibrary(descriptor, source), same(CacheState.FLUSHED));
   }
 
   void test_creation() {
     Source librarySource = new TestSource();
     DartEntry entry = new DartEntry();
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(SourceEntry.CONTENT));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.ELEMENT));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.EXPORTED_LIBRARIES));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.IMPORTED_LIBRARIES));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.INCLUDED_PARTS));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.IS_CLIENT));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.IS_LAUNCHABLE));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(SourceEntry.LINE_INFO));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.PARSE_ERRORS));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.PARSED_UNIT));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.PUBLIC_NAMESPACE));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.SCAN_ERRORS));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.SOURCE_KIND));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.TOKEN_STREAM));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getStateInLibrary(DartEntry.HINTS, librarySource));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getStateInLibrary(DartEntry.RESOLUTION_ERRORS, librarySource));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getStateInLibrary(DartEntry.RESOLVED_UNIT, librarySource));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, librarySource));
+    expect(entry.getState(SourceEntry.CONTENT), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.ELEMENT), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.EXPORTED_LIBRARIES), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.IMPORTED_LIBRARIES), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.INCLUDED_PARTS), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.IS_CLIENT), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.IS_LAUNCHABLE), same(CacheState.INVALID));
+    expect(entry.getState(SourceEntry.LINE_INFO), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.PARSE_ERRORS), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.PARSED_UNIT), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.PUBLIC_NAMESPACE), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.SCAN_ERRORS), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.SOURCE_KIND), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.TOKEN_STREAM), same(CacheState.INVALID));
+    expect(entry.getStateInLibrary(DartEntry.HINTS, librarySource), same(CacheState.INVALID));
+    expect(entry.getStateInLibrary(DartEntry.RESOLUTION_ERRORS, librarySource), same(CacheState.INVALID));
+    expect(entry.getStateInLibrary(DartEntry.RESOLVED_UNIT, librarySource), same(CacheState.INVALID));
+    expect(entry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, librarySource), same(CacheState.INVALID));
   }
 
   void test_getAllErrors() {
     Source source = new TestSource();
     DartEntry entry = new DartEntry();
-    EngineTestCase.assertLength(0, entry.allErrors);
+    expect(entry.allErrors, hasLength(0));
     entry.setValue(
         DartEntry.SCAN_ERRORS,
         <AnalysisError>[
@@ -2192,12 +2072,12 @@
         DartEntry.HINTS,
         source,
         <AnalysisError>[new AnalysisError.con1(source, HintCode.DEAD_CODE, [])]);
-    EngineTestCase.assertLength(5, entry.allErrors);
+    expect(entry.allErrors, hasLength(5));
   }
 
   void test_getResolvableCompilationUnit_none() {
     DartEntry entry = new DartEntry();
-    JUnitTestCase.assertNull(entry.resolvableCompilationUnit);
+    expect(entry.resolvableCompilationUnit, isNull);
   }
 
   void test_getResolvableCompilationUnit_parsed_accessed() {
@@ -2225,27 +2105,27 @@
     entry.setValue(DartEntry.PARSED_UNIT, unit);
     entry.getValue(DartEntry.PARSED_UNIT);
     CompilationUnit result = entry.resolvableCompilationUnit;
-    JUnitTestCase.assertSame(unit, result);
+    expect(result, same(unit));
     entry.setValueInLibrary(DartEntry.RESOLVED_UNIT, librarySource, unit);
     result = entry.resolvableCompilationUnit;
-    JUnitTestCase.assertNotSame(unit, result);
+    expect(result, isNot(same(unit)));
     NodeList<Directive> directives = result.directives;
     ImportDirective resultImportDirective = directives[0] as ImportDirective;
-    JUnitTestCase.assertEquals(importUri, resultImportDirective.uriContent);
-    JUnitTestCase.assertSame(importSource, resultImportDirective.source);
+    expect(resultImportDirective.uriContent, importUri);
+    expect(resultImportDirective.source, same(importSource));
     ExportDirective resultExportDirective = directives[1] as ExportDirective;
-    JUnitTestCase.assertEquals(exportUri, resultExportDirective.uriContent);
-    JUnitTestCase.assertSame(exportSource, resultExportDirective.source);
+    expect(resultExportDirective.uriContent, exportUri);
+    expect(resultExportDirective.source, same(exportSource));
     PartDirective resultPartDirective = directives[2] as PartDirective;
-    JUnitTestCase.assertEquals(partUri, resultPartDirective.uriContent);
-    JUnitTestCase.assertSame(partSource, resultPartDirective.source);
+    expect(resultPartDirective.uriContent, partUri);
+    expect(resultPartDirective.source, same(partSource));
   }
 
   void test_getResolvableCompilationUnit_parsed_notAccessed() {
     CompilationUnit unit = AstFactory.compilationUnit();
     DartEntry entry = new DartEntry();
     entry.setValue(DartEntry.PARSED_UNIT, unit);
-    JUnitTestCase.assertSame(unit, entry.resolvableCompilationUnit);
+    expect(entry.resolvableCompilationUnit, same(unit));
   }
 
   void test_getResolvableCompilationUnit_resolved() {
@@ -2274,24 +2154,24 @@
         new TestSource("lib.dart"),
         unit);
     CompilationUnit result = entry.resolvableCompilationUnit;
-    JUnitTestCase.assertNotSame(unit, result);
+    expect(result, isNot(same(unit)));
     NodeList<Directive> directives = result.directives;
     ImportDirective resultImportDirective = directives[0] as ImportDirective;
-    JUnitTestCase.assertEquals(importUri, resultImportDirective.uriContent);
-    JUnitTestCase.assertSame(importSource, resultImportDirective.source);
+    expect(resultImportDirective.uriContent, importUri);
+    expect(resultImportDirective.source, same(importSource));
     ExportDirective resultExportDirective = directives[1] as ExportDirective;
-    JUnitTestCase.assertEquals(exportUri, resultExportDirective.uriContent);
-    JUnitTestCase.assertSame(exportSource, resultExportDirective.source);
+    expect(resultExportDirective.uriContent, exportUri);
+    expect(resultExportDirective.source, same(exportSource));
     PartDirective resultPartDirective = directives[2] as PartDirective;
-    JUnitTestCase.assertEquals(partUri, resultPartDirective.uriContent);
-    JUnitTestCase.assertSame(partSource, resultPartDirective.source);
+    expect(resultPartDirective.uriContent, partUri);
+    expect(resultPartDirective.source, same(partSource));
   }
 
   void test_getStateInLibrary_invalid_element() {
     DartEntry entry = new DartEntry();
     try {
       entry.getStateInLibrary(DartEntry.ELEMENT, new TestSource());
-      JUnitTestCase.fail("Expected IllegalArgumentException for ELEMENT");
+      fail("Expected IllegalArgumentException for ELEMENT");
     } on ArgumentError catch (exception) {
       // Expected
     }
@@ -2301,8 +2181,7 @@
     DartEntry entry = new DartEntry();
     try {
       entry.getState(DartEntry.RESOLUTION_ERRORS);
-      JUnitTestCase.fail(
-          "Expected IllegalArgumentException for RESOLUTION_ERRORS");
+      fail("Expected IllegalArgumentException for RESOLUTION_ERRORS");
     } on ArgumentError catch (exception) {
       // Expected
     }
@@ -2312,8 +2191,7 @@
     DartEntry entry = new DartEntry();
     try {
       entry.getState(DartEntry.VERIFICATION_ERRORS);
-      JUnitTestCase.fail(
-          "Expected IllegalArgumentException for VERIFICATION_ERRORS");
+      fail("Expected IllegalArgumentException for VERIFICATION_ERRORS");
     } on ArgumentError catch (exception) {
       // Expected
     }
@@ -2323,21 +2201,21 @@
     Source testSource = new TestSource();
     DartEntry entry = new DartEntry();
     List<Source> value = entry.containingLibraries;
-    EngineTestCase.assertLength(0, value);
+    expect(value, hasLength(0));
     entry.addContainingLibrary(testSource);
     value = entry.containingLibraries;
-    EngineTestCase.assertLength(1, value);
-    JUnitTestCase.assertEquals(testSource, value[0]);
+    expect(value, hasLength(1));
+    expect(value[0], testSource);
     entry.removeContainingLibrary(testSource);
     value = entry.containingLibraries;
-    EngineTestCase.assertLength(0, value);
+    expect(value, hasLength(0));
   }
 
   void test_getValueInLibrary_invalid_element() {
     DartEntry entry = new DartEntry();
     try {
       entry.getValueInLibrary(DartEntry.ELEMENT, new TestSource());
-      JUnitTestCase.fail("Expected IllegalArgumentException for ELEMENT");
+      fail("Expected IllegalArgumentException for ELEMENT");
     } on ArgumentError catch (exception) {
       // Expected
     }
@@ -2362,7 +2240,7 @@
         AstFactory.compilationUnit());
     try {
       entry.getValueInLibrary(DartEntry.ELEMENT, source3);
-      JUnitTestCase.fail("Expected IllegalArgumentException for ELEMENT");
+      fail("Expected IllegalArgumentException for ELEMENT");
     } on ArgumentError catch (exception) {
       // Expected
     }
@@ -2372,8 +2250,7 @@
     DartEntry entry = new DartEntry();
     try {
       entry.getValue(DartEntry.RESOLUTION_ERRORS);
-      JUnitTestCase.fail(
-          "Expected IllegalArgumentException for RESOLUTION_ERRORS");
+      fail("Expected IllegalArgumentException for RESOLUTION_ERRORS");
     } on ArgumentError catch (exception) {
     }
   }
@@ -2382,8 +2259,7 @@
     DartEntry entry = new DartEntry();
     try {
       entry.getValue(DartEntry.VERIFICATION_ERRORS);
-      JUnitTestCase.fail(
-          "Expected IllegalArgumentException for VERIFICATION_ERRORS");
+      fail("Expected IllegalArgumentException for VERIFICATION_ERRORS");
     } on ArgumentError catch (exception) {
       // Expected
     }
@@ -2392,200 +2268,117 @@
   void test_hasInvalidData_false() {
     DartEntry entry = new DartEntry();
     entry.recordScanError(new CaughtException(new AnalysisException(), null));
-    JUnitTestCase.assertFalse(entry.hasInvalidData(DartEntry.ELEMENT));
-    JUnitTestCase.assertFalse(
-        entry.hasInvalidData(DartEntry.EXPORTED_LIBRARIES));
-    JUnitTestCase.assertFalse(entry.hasInvalidData(DartEntry.HINTS));
-    JUnitTestCase.assertFalse(
-        entry.hasInvalidData(DartEntry.IMPORTED_LIBRARIES));
-    JUnitTestCase.assertFalse(entry.hasInvalidData(DartEntry.INCLUDED_PARTS));
-    JUnitTestCase.assertFalse(entry.hasInvalidData(DartEntry.IS_CLIENT));
-    JUnitTestCase.assertFalse(entry.hasInvalidData(DartEntry.IS_LAUNCHABLE));
-    JUnitTestCase.assertFalse(entry.hasInvalidData(SourceEntry.LINE_INFO));
-    JUnitTestCase.assertFalse(entry.hasInvalidData(DartEntry.PARSE_ERRORS));
-    JUnitTestCase.assertFalse(entry.hasInvalidData(DartEntry.PARSED_UNIT));
-    JUnitTestCase.assertFalse(entry.hasInvalidData(DartEntry.PUBLIC_NAMESPACE));
-    JUnitTestCase.assertFalse(entry.hasInvalidData(DartEntry.SOURCE_KIND));
-    JUnitTestCase.assertFalse(
-        entry.hasInvalidData(DartEntry.RESOLUTION_ERRORS));
-    JUnitTestCase.assertFalse(entry.hasInvalidData(DartEntry.RESOLVED_UNIT));
-    JUnitTestCase.assertFalse(
-        entry.hasInvalidData(DartEntry.VERIFICATION_ERRORS));
+    expect(entry.hasInvalidData(DartEntry.ELEMENT), isFalse);
+    expect(entry.hasInvalidData(DartEntry.EXPORTED_LIBRARIES), isFalse);
+    expect(entry.hasInvalidData(DartEntry.HINTS), isFalse);
+    expect(entry.hasInvalidData(DartEntry.IMPORTED_LIBRARIES), isFalse);
+    expect(entry.hasInvalidData(DartEntry.INCLUDED_PARTS), isFalse);
+    expect(entry.hasInvalidData(DartEntry.IS_CLIENT), isFalse);
+    expect(entry.hasInvalidData(DartEntry.IS_LAUNCHABLE), isFalse);
+    expect(entry.hasInvalidData(SourceEntry.LINE_INFO), isFalse);
+    expect(entry.hasInvalidData(DartEntry.PARSE_ERRORS), isFalse);
+    expect(entry.hasInvalidData(DartEntry.PARSED_UNIT), isFalse);
+    expect(entry.hasInvalidData(DartEntry.PUBLIC_NAMESPACE), isFalse);
+    expect(entry.hasInvalidData(DartEntry.SOURCE_KIND), isFalse);
+    expect(entry.hasInvalidData(DartEntry.RESOLUTION_ERRORS), isFalse);
+    expect(entry.hasInvalidData(DartEntry.RESOLVED_UNIT), isFalse);
+    expect(entry.hasInvalidData(DartEntry.VERIFICATION_ERRORS), isFalse);
   }
 
   void test_hasInvalidData_true() {
     DartEntry entry = new DartEntry();
-    JUnitTestCase.assertTrue(entry.hasInvalidData(DartEntry.ELEMENT));
-    JUnitTestCase.assertTrue(
-        entry.hasInvalidData(DartEntry.EXPORTED_LIBRARIES));
-    JUnitTestCase.assertTrue(entry.hasInvalidData(DartEntry.HINTS));
-    JUnitTestCase.assertTrue(
-        entry.hasInvalidData(DartEntry.IMPORTED_LIBRARIES));
-    JUnitTestCase.assertTrue(entry.hasInvalidData(DartEntry.INCLUDED_PARTS));
-    JUnitTestCase.assertTrue(entry.hasInvalidData(DartEntry.IS_CLIENT));
-    JUnitTestCase.assertTrue(entry.hasInvalidData(DartEntry.IS_LAUNCHABLE));
-    JUnitTestCase.assertTrue(entry.hasInvalidData(SourceEntry.LINE_INFO));
-    JUnitTestCase.assertTrue(entry.hasInvalidData(DartEntry.PARSE_ERRORS));
-    JUnitTestCase.assertTrue(entry.hasInvalidData(DartEntry.PARSED_UNIT));
-    JUnitTestCase.assertTrue(entry.hasInvalidData(DartEntry.PUBLIC_NAMESPACE));
-    JUnitTestCase.assertTrue(entry.hasInvalidData(DartEntry.SOURCE_KIND));
-    JUnitTestCase.assertTrue(entry.hasInvalidData(DartEntry.RESOLUTION_ERRORS));
-    JUnitTestCase.assertTrue(entry.hasInvalidData(DartEntry.RESOLVED_UNIT));
-    JUnitTestCase.assertTrue(
-        entry.hasInvalidData(DartEntry.VERIFICATION_ERRORS));
+    expect(entry.hasInvalidData(DartEntry.ELEMENT), isTrue);
+    expect(entry.hasInvalidData(DartEntry.EXPORTED_LIBRARIES), isTrue);
+    expect(entry.hasInvalidData(DartEntry.HINTS), isTrue);
+    expect(entry.hasInvalidData(DartEntry.IMPORTED_LIBRARIES), isTrue);
+    expect(entry.hasInvalidData(DartEntry.INCLUDED_PARTS), isTrue);
+    expect(entry.hasInvalidData(DartEntry.IS_CLIENT), isTrue);
+    expect(entry.hasInvalidData(DartEntry.IS_LAUNCHABLE), isTrue);
+    expect(entry.hasInvalidData(SourceEntry.LINE_INFO), isTrue);
+    expect(entry.hasInvalidData(DartEntry.PARSE_ERRORS), isTrue);
+    expect(entry.hasInvalidData(DartEntry.PARSED_UNIT), isTrue);
+    expect(entry.hasInvalidData(DartEntry.PUBLIC_NAMESPACE), isTrue);
+    expect(entry.hasInvalidData(DartEntry.SOURCE_KIND), isTrue);
+    expect(entry.hasInvalidData(DartEntry.RESOLUTION_ERRORS), isTrue);
+    expect(entry.hasInvalidData(DartEntry.RESOLVED_UNIT), isTrue);
+    expect(entry.hasInvalidData(DartEntry.VERIFICATION_ERRORS), isTrue);
   }
 
   void test_invalidateAllInformation() {
     DartEntry entry = _entryWithValidState();
     entry.invalidateAllInformation();
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.ELEMENT));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.EXPORTED_LIBRARIES));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.IMPORTED_LIBRARIES));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.INCLUDED_PARTS));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.IS_CLIENT));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.IS_LAUNCHABLE));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(SourceEntry.LINE_INFO));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.PARSE_ERRORS));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.PARSED_UNIT));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.PUBLIC_NAMESPACE));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.SCAN_ERRORS));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.TOKEN_STREAM));
+    expect(entry.getState(DartEntry.ELEMENT), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.EXPORTED_LIBRARIES), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.IMPORTED_LIBRARIES), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.INCLUDED_PARTS), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.IS_CLIENT), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.IS_LAUNCHABLE), same(CacheState.INVALID));
+    expect(entry.getState(SourceEntry.LINE_INFO), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.PARSE_ERRORS), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.PARSED_UNIT), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.PUBLIC_NAMESPACE), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.SCAN_ERRORS), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.TOKEN_STREAM), same(CacheState.INVALID));
   }
 
   void test_invalidateAllResolutionInformation() {
     DartEntry entry = _entryWithValidState();
     entry.invalidateAllResolutionInformation(false);
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.ELEMENT));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.IS_CLIENT));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.IS_LAUNCHABLE));
-    JUnitTestCase.assertSame(
-        CacheState.VALID,
-        entry.getState(SourceEntry.LINE_INFO));
-    JUnitTestCase.assertSame(
-        CacheState.VALID,
-        entry.getState(DartEntry.PARSE_ERRORS));
-    JUnitTestCase.assertSame(
-        CacheState.VALID,
-        entry.getState(DartEntry.PARSED_UNIT));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.PUBLIC_NAMESPACE));
-    JUnitTestCase.assertSame(
-        CacheState.VALID,
-        entry.getState(DartEntry.EXPORTED_LIBRARIES));
-    JUnitTestCase.assertSame(
-        CacheState.VALID,
-        entry.getState(DartEntry.IMPORTED_LIBRARIES));
-    JUnitTestCase.assertSame(
-        CacheState.VALID,
-        entry.getState(DartEntry.INCLUDED_PARTS));
+    expect(entry.getState(DartEntry.ELEMENT), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.IS_CLIENT), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.IS_LAUNCHABLE), same(CacheState.INVALID));
+    expect(entry.getState(SourceEntry.LINE_INFO), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.PARSE_ERRORS), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.PARSED_UNIT), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.PUBLIC_NAMESPACE), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.EXPORTED_LIBRARIES), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.IMPORTED_LIBRARIES), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.INCLUDED_PARTS), same(CacheState.VALID));
   }
 
   void test_invalidateAllResolutionInformation_includingUris() {
     DartEntry entry = _entryWithValidState();
     entry.invalidateAllResolutionInformation(true);
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.ELEMENT));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.IS_CLIENT));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.IS_LAUNCHABLE));
-    JUnitTestCase.assertSame(
-        CacheState.VALID,
-        entry.getState(SourceEntry.LINE_INFO));
-    JUnitTestCase.assertSame(
-        CacheState.VALID,
-        entry.getState(DartEntry.PARSE_ERRORS));
-    JUnitTestCase.assertSame(
-        CacheState.VALID,
-        entry.getState(DartEntry.PARSED_UNIT));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.PUBLIC_NAMESPACE));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.EXPORTED_LIBRARIES));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.IMPORTED_LIBRARIES));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.INCLUDED_PARTS));
+    expect(entry.getState(DartEntry.ELEMENT), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.IS_CLIENT), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.IS_LAUNCHABLE), same(CacheState.INVALID));
+    expect(entry.getState(SourceEntry.LINE_INFO), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.PARSE_ERRORS), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.PARSED_UNIT), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.PUBLIC_NAMESPACE), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.EXPORTED_LIBRARIES), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.IMPORTED_LIBRARIES), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.INCLUDED_PARTS), same(CacheState.INVALID));
   }
 
   void test_isClient() {
     DartEntry entry = new DartEntry();
     // true
     entry.setValue(DartEntry.IS_CLIENT, true);
-    JUnitTestCase.assertTrue(entry.getValue(DartEntry.IS_CLIENT));
-    JUnitTestCase.assertSame(
-        CacheState.VALID,
-        entry.getState(DartEntry.IS_CLIENT));
+    expect(entry.getValue(DartEntry.IS_CLIENT), isTrue);
+    expect(entry.getState(DartEntry.IS_CLIENT), same(CacheState.VALID));
     // invalidate
     entry.setState(DartEntry.IS_CLIENT, CacheState.INVALID);
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.IS_CLIENT));
+    expect(entry.getState(DartEntry.IS_CLIENT), same(CacheState.INVALID));
     // false
     entry.setValue(DartEntry.IS_CLIENT, false);
-    JUnitTestCase.assertFalse(entry.getValue(DartEntry.IS_CLIENT));
-    JUnitTestCase.assertSame(
-        CacheState.VALID,
-        entry.getState(DartEntry.IS_CLIENT));
+    expect(entry.getValue(DartEntry.IS_CLIENT), isFalse);
+    expect(entry.getState(DartEntry.IS_CLIENT), same(CacheState.VALID));
   }
 
   void test_isLaunchable() {
     DartEntry entry = new DartEntry();
     // true
     entry.setValue(DartEntry.IS_LAUNCHABLE, true);
-    JUnitTestCase.assertTrue(entry.getValue(DartEntry.IS_LAUNCHABLE));
-    JUnitTestCase.assertSame(
-        CacheState.VALID,
-        entry.getState(DartEntry.IS_LAUNCHABLE));
+    expect(entry.getValue(DartEntry.IS_LAUNCHABLE), isTrue);
+    expect(entry.getState(DartEntry.IS_LAUNCHABLE), same(CacheState.VALID));
     // invalidate
     entry.setState(DartEntry.IS_LAUNCHABLE, CacheState.INVALID);
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.IS_LAUNCHABLE));
+    expect(entry.getState(DartEntry.IS_LAUNCHABLE), same(CacheState.INVALID));
     // false
     entry.setValue(DartEntry.IS_LAUNCHABLE, false);
-    JUnitTestCase.assertFalse(entry.getValue(DartEntry.IS_LAUNCHABLE));
-    JUnitTestCase.assertSame(
-        CacheState.VALID,
-        entry.getState(DartEntry.IS_LAUNCHABLE));
+    expect(entry.getValue(DartEntry.IS_LAUNCHABLE), isFalse);
+    expect(entry.getState(DartEntry.IS_LAUNCHABLE), same(CacheState.VALID));
   }
 
   void test_recordBuildElementError() {
@@ -2597,114 +2390,46 @@
     entry.recordBuildElementErrorInLibrary(
         source,
         new CaughtException(new AnalysisException(), null));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(SourceEntry.CONTENT));
-    JUnitTestCase.assertSame(
-        CacheState.ERROR,
-        entry.getStateInLibrary(DartEntry.BUILT_ELEMENT, source));
-    JUnitTestCase.assertSame(
-        CacheState.ERROR,
-        entry.getStateInLibrary(DartEntry.BUILT_UNIT, source));
-    JUnitTestCase.assertSame(
-        CacheState.ERROR,
-        entry.getState(DartEntry.ELEMENT));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.EXPORTED_LIBRARIES));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.IMPORTED_LIBRARIES));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.INCLUDED_PARTS));
-    JUnitTestCase.assertSame(
-        CacheState.ERROR,
-        entry.getState(DartEntry.IS_CLIENT));
-    JUnitTestCase.assertSame(
-        CacheState.ERROR,
-        entry.getState(DartEntry.IS_LAUNCHABLE));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(SourceEntry.LINE_INFO));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.PARSE_ERRORS));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.PARSED_UNIT));
-    JUnitTestCase.assertSame(
-        CacheState.ERROR,
-        entry.getState(DartEntry.PUBLIC_NAMESPACE));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.SCAN_ERRORS));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.SOURCE_KIND));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.TOKEN_STREAM));
-    JUnitTestCase.assertSame(
-        CacheState.ERROR,
-        entry.getStateInLibrary(DartEntry.HINTS, source));
-    JUnitTestCase.assertSame(
-        CacheState.ERROR,
-        entry.getStateInLibrary(DartEntry.RESOLUTION_ERRORS, source));
-    JUnitTestCase.assertSame(
-        CacheState.ERROR,
-        entry.getStateInLibrary(DartEntry.RESOLVED_UNIT, source));
-    JUnitTestCase.assertSame(
-        CacheState.ERROR,
-        entry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, source));
+    expect(entry.getState(SourceEntry.CONTENT), same(CacheState.INVALID));
+    expect(entry.getStateInLibrary(DartEntry.BUILT_ELEMENT, source), same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.BUILT_UNIT, source), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.ELEMENT), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.EXPORTED_LIBRARIES), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.IMPORTED_LIBRARIES), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.INCLUDED_PARTS), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.IS_CLIENT), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.IS_LAUNCHABLE), same(CacheState.ERROR));
+    expect(entry.getState(SourceEntry.LINE_INFO), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.PARSE_ERRORS), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.PARSED_UNIT), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.PUBLIC_NAMESPACE), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.SCAN_ERRORS), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.SOURCE_KIND), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.TOKEN_STREAM), same(CacheState.INVALID));
+    expect(entry.getStateInLibrary(DartEntry.HINTS, source), same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.RESOLUTION_ERRORS, source), same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.RESOLVED_UNIT, source), same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, source), same(CacheState.ERROR));
   }
 
   void test_recordContentError() {
     DartEntry entry = new DartEntry();
     entry.recordContentError(
         new CaughtException(new AnalysisException(), null));
-    JUnitTestCase.assertSame(
-        CacheState.ERROR,
-        entry.getState(SourceEntry.CONTENT));
-    JUnitTestCase.assertSame(
-        CacheState.ERROR,
-        entry.getState(DartEntry.ELEMENT));
-    JUnitTestCase.assertSame(
-        CacheState.ERROR,
-        entry.getState(DartEntry.EXPORTED_LIBRARIES));
-    JUnitTestCase.assertSame(
-        CacheState.ERROR,
-        entry.getState(DartEntry.IMPORTED_LIBRARIES));
-    JUnitTestCase.assertSame(
-        CacheState.ERROR,
-        entry.getState(DartEntry.INCLUDED_PARTS));
-    JUnitTestCase.assertSame(
-        CacheState.ERROR,
-        entry.getState(DartEntry.IS_CLIENT));
-    JUnitTestCase.assertSame(
-        CacheState.ERROR,
-        entry.getState(DartEntry.IS_LAUNCHABLE));
-    JUnitTestCase.assertSame(
-        CacheState.ERROR,
-        entry.getState(SourceEntry.LINE_INFO));
-    JUnitTestCase.assertSame(
-        CacheState.ERROR,
-        entry.getState(DartEntry.PARSE_ERRORS));
-    JUnitTestCase.assertSame(
-        CacheState.ERROR,
-        entry.getState(DartEntry.PARSED_UNIT));
-    JUnitTestCase.assertSame(
-        CacheState.ERROR,
-        entry.getState(DartEntry.PUBLIC_NAMESPACE));
-    JUnitTestCase.assertSame(
-        CacheState.ERROR,
-        entry.getState(DartEntry.SCAN_ERRORS));
-    JUnitTestCase.assertSame(
-        CacheState.ERROR,
-        entry.getState(DartEntry.SOURCE_KIND));
-    JUnitTestCase.assertSame(
-        CacheState.ERROR,
-        entry.getState(DartEntry.TOKEN_STREAM));
+    expect(entry.getState(SourceEntry.CONTENT), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.ELEMENT), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.EXPORTED_LIBRARIES), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.IMPORTED_LIBRARIES), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.INCLUDED_PARTS), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.IS_CLIENT), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.IS_LAUNCHABLE), same(CacheState.ERROR));
+    expect(entry.getState(SourceEntry.LINE_INFO), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.PARSE_ERRORS), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.PARSED_UNIT), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.PUBLIC_NAMESPACE), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.SCAN_ERRORS), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.SOURCE_KIND), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.TOKEN_STREAM), same(CacheState.ERROR));
     // The following lines are commented out because we don't currently have
     // any way of setting the state for data associated with a library we
     // don't know anything about.
@@ -2725,107 +2450,43 @@
     entry.recordHintErrorInLibrary(
         source,
         new CaughtException(new AnalysisException(), null));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(SourceEntry.CONTENT));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.ELEMENT));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.EXPORTED_LIBRARIES));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.IMPORTED_LIBRARIES));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.INCLUDED_PARTS));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.IS_CLIENT));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.IS_LAUNCHABLE));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(SourceEntry.LINE_INFO));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.PARSE_ERRORS));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.PARSED_UNIT));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.PUBLIC_NAMESPACE));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.SCAN_ERRORS));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.SOURCE_KIND));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.TOKEN_STREAM));
-    JUnitTestCase.assertSame(
-        CacheState.ERROR,
-        entry.getStateInLibrary(DartEntry.HINTS, source));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getStateInLibrary(DartEntry.RESOLUTION_ERRORS, source));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getStateInLibrary(DartEntry.RESOLVED_UNIT, source));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, source));
+    expect(entry.getState(SourceEntry.CONTENT), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.ELEMENT), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.EXPORTED_LIBRARIES), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.IMPORTED_LIBRARIES), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.INCLUDED_PARTS), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.IS_CLIENT), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.IS_LAUNCHABLE), same(CacheState.INVALID));
+    expect(entry.getState(SourceEntry.LINE_INFO), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.PARSE_ERRORS), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.PARSED_UNIT), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.PUBLIC_NAMESPACE), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.SCAN_ERRORS), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.SOURCE_KIND), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.TOKEN_STREAM), same(CacheState.INVALID));
+    expect(entry.getStateInLibrary(DartEntry.HINTS, source), same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.RESOLUTION_ERRORS, source), same(CacheState.INVALID));
+    expect(entry.getStateInLibrary(DartEntry.RESOLVED_UNIT, source), same(CacheState.INVALID));
+    expect(entry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, source), same(CacheState.INVALID));
   }
 
   void test_recordParseError() {
     DartEntry entry = new DartEntry();
     entry.recordParseError(new CaughtException(new AnalysisException(), null));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(SourceEntry.CONTENT));
-    JUnitTestCase.assertSame(
-        CacheState.ERROR,
-        entry.getState(DartEntry.ELEMENT));
-    JUnitTestCase.assertSame(
-        CacheState.ERROR,
-        entry.getState(DartEntry.EXPORTED_LIBRARIES));
-    JUnitTestCase.assertSame(
-        CacheState.ERROR,
-        entry.getState(DartEntry.IMPORTED_LIBRARIES));
-    JUnitTestCase.assertSame(
-        CacheState.ERROR,
-        entry.getState(DartEntry.INCLUDED_PARTS));
-    JUnitTestCase.assertSame(
-        CacheState.ERROR,
-        entry.getState(DartEntry.IS_CLIENT));
-    JUnitTestCase.assertSame(
-        CacheState.ERROR,
-        entry.getState(DartEntry.IS_LAUNCHABLE));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(SourceEntry.LINE_INFO));
-    JUnitTestCase.assertSame(
-        CacheState.ERROR,
-        entry.getState(DartEntry.PARSE_ERRORS));
-    JUnitTestCase.assertSame(
-        CacheState.ERROR,
-        entry.getState(DartEntry.PARSED_UNIT));
-    JUnitTestCase.assertSame(
-        CacheState.ERROR,
-        entry.getState(DartEntry.PUBLIC_NAMESPACE));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.SCAN_ERRORS));
-    JUnitTestCase.assertSame(
-        CacheState.ERROR,
-        entry.getState(DartEntry.SOURCE_KIND));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.TOKEN_STREAM));
+    expect(entry.getState(SourceEntry.CONTENT), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.ELEMENT), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.EXPORTED_LIBRARIES), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.IMPORTED_LIBRARIES), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.INCLUDED_PARTS), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.IS_CLIENT), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.IS_LAUNCHABLE), same(CacheState.ERROR));
+    expect(entry.getState(SourceEntry.LINE_INFO), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.PARSE_ERRORS), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.PARSED_UNIT), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.PUBLIC_NAMESPACE), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.SCAN_ERRORS), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.SOURCE_KIND), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.TOKEN_STREAM), same(CacheState.INVALID));
     // The following lines are commented out because we don't currently have
     // any way of setting the state for data associated with a library we
     // don't know anything about.
@@ -2842,48 +2503,20 @@
     DartEntry entry = new DartEntry();
     entry.recordResolutionError(
         new CaughtException(new AnalysisException(), null));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(SourceEntry.CONTENT));
-    JUnitTestCase.assertSame(
-        CacheState.ERROR,
-        entry.getState(DartEntry.ELEMENT));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.EXPORTED_LIBRARIES));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.IMPORTED_LIBRARIES));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.INCLUDED_PARTS));
-    JUnitTestCase.assertSame(
-        CacheState.ERROR,
-        entry.getState(DartEntry.IS_CLIENT));
-    JUnitTestCase.assertSame(
-        CacheState.ERROR,
-        entry.getState(DartEntry.IS_LAUNCHABLE));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(SourceEntry.LINE_INFO));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.PARSE_ERRORS));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.PARSED_UNIT));
-    JUnitTestCase.assertSame(
-        CacheState.ERROR,
-        entry.getState(DartEntry.PUBLIC_NAMESPACE));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.SCAN_ERRORS));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.SOURCE_KIND));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.TOKEN_STREAM));
+    expect(entry.getState(SourceEntry.CONTENT), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.ELEMENT), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.EXPORTED_LIBRARIES), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.IMPORTED_LIBRARIES), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.INCLUDED_PARTS), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.IS_CLIENT), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.IS_LAUNCHABLE), same(CacheState.ERROR));
+    expect(entry.getState(SourceEntry.LINE_INFO), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.PARSE_ERRORS), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.PARSED_UNIT), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.PUBLIC_NAMESPACE), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.SCAN_ERRORS), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.SOURCE_KIND), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.TOKEN_STREAM), same(CacheState.INVALID));
     // The following lines are commented out because we don't currently have
     // any way of setting the state for data associated with a library we
     // don't know anything about.
@@ -2904,108 +2537,44 @@
     entry.recordResolutionErrorInLibrary(
         source,
         new CaughtException(new AnalysisException(), null));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(SourceEntry.CONTENT));
-    JUnitTestCase.assertSame(
-        CacheState.ERROR,
-        entry.getState(DartEntry.ELEMENT));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.EXPORTED_LIBRARIES));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.IMPORTED_LIBRARIES));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.INCLUDED_PARTS));
-    JUnitTestCase.assertSame(
-        CacheState.ERROR,
-        entry.getState(DartEntry.IS_CLIENT));
-    JUnitTestCase.assertSame(
-        CacheState.ERROR,
-        entry.getState(DartEntry.IS_LAUNCHABLE));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(SourceEntry.LINE_INFO));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.PARSE_ERRORS));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.PARSED_UNIT));
-    JUnitTestCase.assertSame(
-        CacheState.ERROR,
-        entry.getState(DartEntry.PUBLIC_NAMESPACE));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.SCAN_ERRORS));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.SOURCE_KIND));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.TOKEN_STREAM));
-    JUnitTestCase.assertSame(
-        CacheState.ERROR,
-        entry.getStateInLibrary(DartEntry.HINTS, source));
-    JUnitTestCase.assertSame(
-        CacheState.ERROR,
-        entry.getStateInLibrary(DartEntry.RESOLUTION_ERRORS, source));
-    JUnitTestCase.assertSame(
-        CacheState.ERROR,
-        entry.getStateInLibrary(DartEntry.RESOLVED_UNIT, source));
-    JUnitTestCase.assertSame(
-        CacheState.ERROR,
-        entry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, source));
+    expect(entry.getState(SourceEntry.CONTENT), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.ELEMENT), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.EXPORTED_LIBRARIES), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.IMPORTED_LIBRARIES), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.INCLUDED_PARTS), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.IS_CLIENT), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.IS_LAUNCHABLE), same(CacheState.ERROR));
+    expect(entry.getState(SourceEntry.LINE_INFO), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.PARSE_ERRORS), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.PARSED_UNIT), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.PUBLIC_NAMESPACE), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.SCAN_ERRORS), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.SOURCE_KIND), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.TOKEN_STREAM), same(CacheState.INVALID));
+    expect(entry.getStateInLibrary(DartEntry.HINTS, source), same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.RESOLUTION_ERRORS, source), same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.RESOLVED_UNIT, source), same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, source), same(CacheState.ERROR));
   }
 
   void test_recordScanError() {
 //    Source source = new TestSource();
     DartEntry entry = new DartEntry();
     entry.recordScanError(new CaughtException(new AnalysisException(), null));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(SourceEntry.CONTENT));
-    JUnitTestCase.assertSame(
-        CacheState.ERROR,
-        entry.getState(DartEntry.ELEMENT));
-    JUnitTestCase.assertSame(
-        CacheState.ERROR,
-        entry.getState(DartEntry.EXPORTED_LIBRARIES));
-    JUnitTestCase.assertSame(
-        CacheState.ERROR,
-        entry.getState(DartEntry.IMPORTED_LIBRARIES));
-    JUnitTestCase.assertSame(
-        CacheState.ERROR,
-        entry.getState(DartEntry.INCLUDED_PARTS));
-    JUnitTestCase.assertSame(
-        CacheState.ERROR,
-        entry.getState(DartEntry.IS_CLIENT));
-    JUnitTestCase.assertSame(
-        CacheState.ERROR,
-        entry.getState(DartEntry.IS_LAUNCHABLE));
-    JUnitTestCase.assertSame(
-        CacheState.ERROR,
-        entry.getState(SourceEntry.LINE_INFO));
-    JUnitTestCase.assertSame(
-        CacheState.ERROR,
-        entry.getState(DartEntry.PARSE_ERRORS));
-    JUnitTestCase.assertSame(
-        CacheState.ERROR,
-        entry.getState(DartEntry.PARSED_UNIT));
-    JUnitTestCase.assertSame(
-        CacheState.ERROR,
-        entry.getState(DartEntry.PUBLIC_NAMESPACE));
-    JUnitTestCase.assertSame(
-        CacheState.ERROR,
-        entry.getState(DartEntry.SCAN_ERRORS));
-    JUnitTestCase.assertSame(
-        CacheState.ERROR,
-        entry.getState(DartEntry.SOURCE_KIND));
-    JUnitTestCase.assertSame(
-        CacheState.ERROR,
-        entry.getState(DartEntry.TOKEN_STREAM));
+    expect(entry.getState(SourceEntry.CONTENT), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.ELEMENT), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.EXPORTED_LIBRARIES), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.IMPORTED_LIBRARIES), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.INCLUDED_PARTS), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.IS_CLIENT), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.IS_LAUNCHABLE), same(CacheState.ERROR));
+    expect(entry.getState(SourceEntry.LINE_INFO), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.PARSE_ERRORS), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.PARSED_UNIT), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.PUBLIC_NAMESPACE), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.SCAN_ERRORS), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.SOURCE_KIND), same(CacheState.ERROR));
+    expect(entry.getState(DartEntry.TOKEN_STREAM), same(CacheState.ERROR));
     // The following lines are commented out because we don't currently have
     // any way of setting the state for data associated with a library we
     // don't know anything about.
@@ -3026,60 +2595,24 @@
     entry.recordVerificationErrorInLibrary(
         source,
         new CaughtException(new AnalysisException(), null));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(SourceEntry.CONTENT));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.ELEMENT));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.EXPORTED_LIBRARIES));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.IMPORTED_LIBRARIES));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.INCLUDED_PARTS));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.IS_CLIENT));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.IS_LAUNCHABLE));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(SourceEntry.LINE_INFO));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.PARSE_ERRORS));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.PARSED_UNIT));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.PUBLIC_NAMESPACE));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.SCAN_ERRORS));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.SOURCE_KIND));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(DartEntry.TOKEN_STREAM));
-    JUnitTestCase.assertSame(
-        CacheState.ERROR,
-        entry.getStateInLibrary(DartEntry.HINTS, source));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getStateInLibrary(DartEntry.RESOLUTION_ERRORS, source));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getStateInLibrary(DartEntry.RESOLVED_UNIT, source));
-    JUnitTestCase.assertSame(
-        CacheState.ERROR,
-        entry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, source));
+    expect(entry.getState(SourceEntry.CONTENT), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.ELEMENT), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.EXPORTED_LIBRARIES), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.IMPORTED_LIBRARIES), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.INCLUDED_PARTS), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.IS_CLIENT), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.IS_LAUNCHABLE), same(CacheState.INVALID));
+    expect(entry.getState(SourceEntry.LINE_INFO), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.PARSE_ERRORS), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.PARSED_UNIT), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.PUBLIC_NAMESPACE), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.SCAN_ERRORS), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.SOURCE_KIND), same(CacheState.INVALID));
+    expect(entry.getState(DartEntry.TOKEN_STREAM), same(CacheState.INVALID));
+    expect(entry.getStateInLibrary(DartEntry.HINTS, source), same(CacheState.ERROR));
+    expect(entry.getStateInLibrary(DartEntry.RESOLUTION_ERRORS, source), same(CacheState.INVALID));
+    expect(entry.getStateInLibrary(DartEntry.RESOLVED_UNIT, source), same(CacheState.INVALID));
+    expect(entry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, source), same(CacheState.ERROR));
   }
 
   void test_removeResolution_multiple_first() {
@@ -3176,7 +2709,7 @@
     DartEntry entry = new DartEntry();
     try {
       entry.setStateInLibrary(DartEntry.ELEMENT, null, CacheState.FLUSHED);
-      JUnitTestCase.fail("Expected IllegalArgumentException for ELEMENT");
+      fail("Expected IllegalArgumentException for ELEMENT");
     } on ArgumentError catch (exception) {
       // Expected
     }
@@ -3186,8 +2719,7 @@
     DartEntry entry = new DartEntry();
     try {
       entry.setState(DartEntry.RESOLUTION_ERRORS, CacheState.FLUSHED);
-      JUnitTestCase.fail(
-          "Expected IllegalArgumentException for RESOLUTION_ERRORS");
+      fail("Expected IllegalArgumentException for RESOLUTION_ERRORS");
     } on ArgumentError catch (exception) {
       // Expected
     }
@@ -3197,8 +2729,7 @@
     DartEntry entry = new DartEntry();
     try {
       entry.setState(SourceEntry.LINE_INFO, CacheState.VALID);
-      JUnitTestCase.fail(
-          "Expected ArgumentError for a state of VALID");
+      fail("Expected ArgumentError for a state of VALID");
     } on ArgumentError catch (exception) {
     }
   }
@@ -3207,8 +2738,7 @@
     DartEntry entry = new DartEntry();
     try {
       entry.setState(DartEntry.VERIFICATION_ERRORS, CacheState.FLUSHED);
-      JUnitTestCase.fail(
-          "Expected IllegalArgumentException for VERIFICATION_ERRORS");
+      fail("Expected IllegalArgumentException for VERIFICATION_ERRORS");
     } on ArgumentError catch (exception) {
       // Expected
      }
@@ -3366,60 +2896,36 @@
     entry.setValue(DartEntry.PARSE_ERRORS, null);
     entry.setValue(DartEntry.PARSED_UNIT, null);
     entry.setValue(DartEntry.PUBLIC_NAMESPACE, null);
-    JUnitTestCase.assertSame(
-        CacheState.VALID,
-        entry.getState(DartEntry.ELEMENT));
-    JUnitTestCase.assertSame(
-        CacheState.VALID,
-        entry.getState(DartEntry.EXPORTED_LIBRARIES));
-    JUnitTestCase.assertSame(
-        CacheState.VALID,
-        entry.getState(DartEntry.IMPORTED_LIBRARIES));
-    JUnitTestCase.assertSame(
-        CacheState.VALID,
-        entry.getState(DartEntry.INCLUDED_PARTS));
-    JUnitTestCase.assertSame(
-        CacheState.VALID,
-        entry.getState(DartEntry.IS_CLIENT));
-    JUnitTestCase.assertSame(
-        CacheState.VALID,
-        entry.getState(DartEntry.IS_LAUNCHABLE));
-    JUnitTestCase.assertSame(
-        CacheState.VALID,
-        entry.getState(SourceEntry.LINE_INFO));
-    JUnitTestCase.assertSame(
-        CacheState.VALID,
-        entry.getState(DartEntry.PARSE_ERRORS));
-    JUnitTestCase.assertSame(
-        CacheState.VALID,
-        entry.getState(DartEntry.PARSED_UNIT));
-    JUnitTestCase.assertSame(
-        CacheState.VALID,
-        entry.getState(DartEntry.PUBLIC_NAMESPACE));
+    expect(entry.getState(DartEntry.ELEMENT), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.EXPORTED_LIBRARIES), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.IMPORTED_LIBRARIES), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.INCLUDED_PARTS), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.IS_CLIENT), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.IS_LAUNCHABLE), same(CacheState.VALID));
+    expect(entry.getState(SourceEntry.LINE_INFO), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.PARSE_ERRORS), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.PARSED_UNIT), same(CacheState.VALID));
+    expect(entry.getState(DartEntry.PUBLIC_NAMESPACE), same(CacheState.VALID));
     return entry;
   }
 
   void _setValue2(DataDescriptor descriptor, Object newValue) {
     DartEntry entry = new DartEntry();
     Object value = entry.getValue(descriptor);
-    JUnitTestCase.assertNotSame(value, newValue);
+    expect(newValue, isNot(same(value)));
     entry.setValue(descriptor, newValue);
-    JUnitTestCase.assertSame(CacheState.VALID, entry.getState(descriptor));
-    JUnitTestCase.assertSame(newValue, entry.getValue(descriptor));
+    expect(entry.getState(descriptor), same(CacheState.VALID));
+    expect(entry.getValue(descriptor), same(newValue));
   }
 
   void _setValue3(DataDescriptor descriptor, Object newValue) {
     Source source = new TestSource();
     DartEntry entry = new DartEntry();
     Object value = entry.getValueInLibrary(descriptor, source);
-    JUnitTestCase.assertNotSame(value, newValue);
+    expect(newValue, isNot(same(value)));
     entry.setValueInLibrary(descriptor, source, newValue);
-    JUnitTestCase.assertSame(
-        CacheState.VALID,
-        entry.getStateInLibrary(descriptor, source));
-    JUnitTestCase.assertSame(
-        newValue,
-        entry.getValueInLibrary(descriptor, source));
+    expect(entry.getStateInLibrary(descriptor, source), same(CacheState.VALID));
+    expect(entry.getValueInLibrary(descriptor, source), same(newValue));
   }
 }
 
@@ -3428,14 +2934,13 @@
   void test_accept() {
     GenerateDartErrorsTask task =
         new GenerateDartErrorsTask(null, null, null, null);
-    JUnitTestCase.assertTrue(
-        task.accept(new GenerateDartErrorsTaskTestTV_accept()));
+    expect(task.accept(new GenerateDartErrorsTaskTestTV_accept()), isTrue);
   }
 
   void test_getException() {
     GenerateDartErrorsTask task =
         new GenerateDartErrorsTask(null, null, null, null);
-    JUnitTestCase.assertNull(task.exception);
+    expect(task.exception, isNull);
   }
 
   void test_getLibraryElement() {
@@ -3443,7 +2948,7 @@
     LibraryElement element = ElementFactory.library(context, "lib");
     GenerateDartErrorsTask task =
         new GenerateDartErrorsTask(context, null, null, element);
-    JUnitTestCase.assertSame(element, task.libraryElement);
+    expect(task.libraryElement, same(element));
   }
 
   void test_getSource() {
@@ -3451,7 +2956,7 @@
         new FileBasedSource.con1(FileUtilities2.createFile("/test.dart"));
     GenerateDartErrorsTask task =
         new GenerateDartErrorsTask(null, source, null, null);
-    JUnitTestCase.assertSame(source, task.source);
+    expect(task.source, same(source));
   }
 
   void test_perform() {
@@ -3463,8 +2968,11 @@
     context.applyChanges(changeSet);
     context.setContents(
         source,
-        EngineTestCase.createSource(
-            ["library lib;", "class A {", "  int f = new A();", "}"]));
+        r'''
+library lib;
+class A {
+  int f = new A();
+}''');
     LibraryElement libraryElement = context.computeLibraryElement(source);
     CompilationUnit unit =
         context.getResolvedCompilationUnit(source, libraryElement);
@@ -3493,8 +3001,10 @@
 //        "class A {}"]));
     context.setContents(
         source,
-        EngineTestCase.createSource(
-            ["library lib;", "part '/does/not/exist.dart';", "class A {}"]));
+        r'''
+library lib;
+part '/does/not/exist.dart';
+class A {}''');
     LibraryElement libraryElement = context.computeLibraryElement(source);
     CompilationUnit unit =
         context.getResolvedCompilationUnit(source, libraryElement);
@@ -3527,10 +3037,10 @@
     if (exception != null) {
       throw exception;
     }
-    JUnitTestCase.assertSame(libraryElement, task.libraryElement);
-    JUnitTestCase.assertSame(source, task.source);
+    expect(task.libraryElement, same(libraryElement));
+    expect(task.source, same(source));
     List<AnalysisError> errors = task.errors;
-    EngineTestCase.assertLength(1, errors);
+    expect(errors, hasLength(1));
     return true;
   }
 }
@@ -3548,13 +3058,11 @@
     if (exception != null) {
       throw exception;
     }
-    JUnitTestCase.assertSame(libraryElement, task.libraryElement);
-    JUnitTestCase.assertSame(source, task.source);
+    expect(task.libraryElement, same(libraryElement));
+    expect(task.source, same(source));
     List<AnalysisError> errors = task.errors;
-    EngineTestCase.assertLength(1, errors);
-    JUnitTestCase.assertSame(
-        CompileTimeErrorCode.URI_DOES_NOT_EXIST,
-        errors[0].errorCode);
+    expect(errors, hasLength(1));
+    expect(errors[0].errorCode, same(CompileTimeErrorCode.URI_DOES_NOT_EXIST));
     return true;
   }
 }
@@ -3562,23 +3070,22 @@
 class GenerateDartHintsTaskTest extends EngineTestCase {
   void test_accept() {
     GenerateDartHintsTask task = new GenerateDartHintsTask(null, null, null);
-    JUnitTestCase.assertTrue(
-        task.accept(new GenerateDartHintsTaskTestTV_accept()));
+    expect(task.accept(new GenerateDartHintsTaskTestTV_accept()), isTrue);
   }
   void test_getException() {
     GenerateDartHintsTask task = new GenerateDartHintsTask(null, null, null);
-    JUnitTestCase.assertNull(task.exception);
+    expect(task.exception, isNull);
   }
   void test_getHintMap() {
     GenerateDartHintsTask task = new GenerateDartHintsTask(null, null, null);
-    JUnitTestCase.assertNull(task.hintMap);
+    expect(task.hintMap, isNull);
   }
   void test_getLibraryElement() {
     InternalAnalysisContext context = AnalysisContextFactory.contextWithCore();
     LibraryElement element = ElementFactory.library(context, "lib");
     GenerateDartHintsTask task =
         new GenerateDartHintsTask(context, null, element);
-    JUnitTestCase.assertSame(element, task.libraryElement);
+    expect(task.libraryElement, same(element));
   }
   void test_perform() {
     InternalAnalysisContext context = AnalysisContextFactory.contextWithCore();
@@ -3595,14 +3102,16 @@
     context.applyChanges(changeSet);
     context.setContents(
         librarySource,
-        EngineTestCase.createSource(
-            ["library lib;", "import 'unused.dart';", "part 'part.dart';"]));
+        r'''
+library lib;
+import 'unused.dart';
+part 'part.dart';''');
     context.setContents(
         unusedSource,
-        EngineTestCase.createSource(["library unused;"]));
+        "library unused;");
     context.setContents(
         partSource,
-        EngineTestCase.createSource(["part of lib;"]));
+        "part of lib;");
     List<TimestampedData<CompilationUnit>> units = new List<TimestampedData>(2);
     units[0] = new TimestampedData<CompilationUnit>(
         context.getModificationStamp(librarySource),
@@ -3636,11 +3145,11 @@
     if (exception != null) {
       throw exception;
     }
-    JUnitTestCase.assertNotNull(task.libraryElement);
+    expect(task.libraryElement, isNotNull);
     HashMap<Source, List<AnalysisError>> hintMap = task.hintMap;
-    EngineTestCase.assertSizeOfMap(2, hintMap);
-    EngineTestCase.assertLength(1, hintMap[librarySource]);
-    EngineTestCase.assertLength(0, hintMap[partSource]);
+    expect(hintMap, hasLength(2));
+    expect(hintMap[librarySource], hasLength(1));
+    expect(hintMap[partSource], hasLength(0));
     return true;
   }
 }
@@ -3650,25 +3159,25 @@
   void test_accept() {
     Source source = new TestSource('/test.dart', '');
     GetContentTask task = new GetContentTask(null, source);
-    JUnitTestCase.assertTrue(task.accept(new GetContentTaskTestTV_accept()));
+    expect(task.accept(new GetContentTaskTestTV_accept()), isTrue);
   }
 
   void test_getException() {
     Source source = new TestSource('/test.dart', '');
     GetContentTask task = new GetContentTask(null, source);
-    JUnitTestCase.assertNull(task.exception);
+    expect(task.exception, isNull);
   }
 
   void test_getModificationTime() {
     Source source = new TestSource('/test.dart', '');
     GetContentTask task = new GetContentTask(null, source);
-    JUnitTestCase.assertEquals(-1, task.modificationTime);
+    expect(task.modificationTime, -1);
   }
 
   void test_getSource() {
     Source source = new TestSource('/test.dart', '');
     GetContentTask task = new GetContentTask(null, source);
-    JUnitTestCase.assertSame(source, task.source);
+    expect(task.source, same(source));
   }
 
   void test_perform_exception() {
@@ -3699,7 +3208,7 @@
 class GetContentTaskTestTV_perform_exception extends TestTaskVisitor<bool> {
   @override
   bool visitGetContentTask(GetContentTask task) {
-    JUnitTestCase.assertNotNull(task.exception);
+    expect(task.exception, isNotNull);
     return true;
   }
 }
@@ -3715,10 +3224,8 @@
     if (exception != null) {
       throw exception;
     }
-    JUnitTestCase.assertEquals(
-        context.getModificationStamp(source),
-        task.modificationTime);
-    JUnitTestCase.assertSame(source, task.source);
+    expect(task.modificationTime, context.getModificationStamp(source));
+    expect(task.source, same(source));
     return true;
   }
 }
@@ -3727,20 +3234,20 @@
 class HtmlEntryTest extends EngineTestCase {
   void set state(DataDescriptor descriptor) {
     HtmlEntry entry = new HtmlEntry();
-    JUnitTestCase.assertNotSame(CacheState.FLUSHED, entry.getState(descriptor));
+    expect(entry.getState(descriptor), isNot(same(CacheState.FLUSHED)));
     entry.setState(descriptor, CacheState.FLUSHED);
-    JUnitTestCase.assertSame(CacheState.FLUSHED, entry.getState(descriptor));
+    expect(entry.getState(descriptor), same(CacheState.FLUSHED));
   }
 
   void test_creation() {
     HtmlEntry entry = new HtmlEntry();
-    JUnitTestCase.assertNotNull(entry);
+    expect(entry, isNotNull);
   }
 
   void test_getAllErrors() {
     Source source = new TestSource();
     HtmlEntry entry = new HtmlEntry();
-    EngineTestCase.assertLength(0, entry.allErrors);
+    expect(entry.allErrors, hasLength(0));
     entry.setValue(
         HtmlEntry.PARSE_ERRORS,
         <AnalysisError>[
@@ -3764,95 +3271,43 @@
     entry.setValue(
         HtmlEntry.HINTS,
         <AnalysisError>[new AnalysisError.con1(source, HintCode.DEAD_CODE, [])]);
-    EngineTestCase.assertLength(6, entry.allErrors);
+    expect(entry.allErrors, hasLength(6));
   }
 
   void test_invalidateAllResolutionInformation() {
     HtmlEntry entry = _entryWithValidState();
     entry.invalidateAllResolutionInformation(false);
-    JUnitTestCase.assertSame(
-        CacheState.VALID,
-        entry.getState(HtmlEntry.ANGULAR_APPLICATION));
-    JUnitTestCase.assertSame(
-        CacheState.VALID,
-        entry.getState(HtmlEntry.ANGULAR_COMPONENT));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(HtmlEntry.ANGULAR_ENTRY));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(HtmlEntry.ANGULAR_ERRORS));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(HtmlEntry.POLYMER_BUILD_ERRORS));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(HtmlEntry.POLYMER_RESOLUTION_ERRORS));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(HtmlEntry.ELEMENT));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(HtmlEntry.HINTS));
-    JUnitTestCase.assertSame(
-        CacheState.VALID,
-        entry.getState(SourceEntry.LINE_INFO));
-    JUnitTestCase.assertSame(
-        CacheState.VALID,
-        entry.getState(HtmlEntry.PARSE_ERRORS));
-    JUnitTestCase.assertSame(
-        CacheState.VALID,
-        entry.getState(HtmlEntry.PARSED_UNIT));
-    JUnitTestCase.assertSame(
-        CacheState.VALID,
-        entry.getState(HtmlEntry.REFERENCED_LIBRARIES));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(HtmlEntry.RESOLUTION_ERRORS));
+    expect(entry.getState(HtmlEntry.ANGULAR_APPLICATION), same(CacheState.VALID));
+    expect(entry.getState(HtmlEntry.ANGULAR_COMPONENT), same(CacheState.VALID));
+    expect(entry.getState(HtmlEntry.ANGULAR_ENTRY), same(CacheState.INVALID));
+    expect(entry.getState(HtmlEntry.ANGULAR_ERRORS), same(CacheState.INVALID));
+    expect(entry.getState(HtmlEntry.POLYMER_BUILD_ERRORS), same(CacheState.INVALID));
+    expect(entry.getState(HtmlEntry.POLYMER_RESOLUTION_ERRORS), same(CacheState.INVALID));
+    expect(entry.getState(HtmlEntry.ELEMENT), same(CacheState.INVALID));
+    expect(entry.getState(HtmlEntry.HINTS), same(CacheState.INVALID));
+    expect(entry.getState(SourceEntry.LINE_INFO), same(CacheState.VALID));
+    expect(entry.getState(HtmlEntry.PARSE_ERRORS), same(CacheState.VALID));
+    expect(entry.getState(HtmlEntry.PARSED_UNIT), same(CacheState.VALID));
+    expect(entry.getState(HtmlEntry.REFERENCED_LIBRARIES), same(CacheState.VALID));
+    expect(entry.getState(HtmlEntry.RESOLUTION_ERRORS), same(CacheState.INVALID));
   }
 
   void test_invalidateAllResolutionInformation_includingUris() {
     HtmlEntry entry = _entryWithValidState();
     entry.invalidateAllResolutionInformation(true);
-    JUnitTestCase.assertSame(
-        CacheState.VALID,
-        entry.getState(HtmlEntry.ANGULAR_APPLICATION));
-    JUnitTestCase.assertSame(
-        CacheState.VALID,
-        entry.getState(HtmlEntry.ANGULAR_COMPONENT));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(HtmlEntry.ANGULAR_ENTRY));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(HtmlEntry.ANGULAR_ERRORS));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(HtmlEntry.POLYMER_BUILD_ERRORS));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(HtmlEntry.POLYMER_RESOLUTION_ERRORS));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(HtmlEntry.ELEMENT));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(HtmlEntry.HINTS));
-    JUnitTestCase.assertSame(
-        CacheState.VALID,
-        entry.getState(SourceEntry.LINE_INFO));
-    JUnitTestCase.assertSame(
-        CacheState.VALID,
-        entry.getState(HtmlEntry.PARSE_ERRORS));
-    JUnitTestCase.assertSame(
-        CacheState.VALID,
-        entry.getState(HtmlEntry.PARSED_UNIT));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(HtmlEntry.REFERENCED_LIBRARIES));
-    JUnitTestCase.assertSame(
-        CacheState.INVALID,
-        entry.getState(HtmlEntry.RESOLUTION_ERRORS));
+    expect(entry.getState(HtmlEntry.ANGULAR_APPLICATION), same(CacheState.VALID));
+    expect(entry.getState(HtmlEntry.ANGULAR_COMPONENT), same(CacheState.VALID));
+    expect(entry.getState(HtmlEntry.ANGULAR_ENTRY), same(CacheState.INVALID));
+    expect(entry.getState(HtmlEntry.ANGULAR_ERRORS), same(CacheState.INVALID));
+    expect(entry.getState(HtmlEntry.POLYMER_BUILD_ERRORS), same(CacheState.INVALID));
+    expect(entry.getState(HtmlEntry.POLYMER_RESOLUTION_ERRORS), same(CacheState.INVALID));
+    expect(entry.getState(HtmlEntry.ELEMENT), same(CacheState.INVALID));
+    expect(entry.getState(HtmlEntry.HINTS), same(CacheState.INVALID));
+    expect(entry.getState(SourceEntry.LINE_INFO), same(CacheState.VALID));
+    expect(entry.getState(HtmlEntry.PARSE_ERRORS), same(CacheState.VALID));
+    expect(entry.getState(HtmlEntry.PARSED_UNIT), same(CacheState.VALID));
+    expect(entry.getState(HtmlEntry.REFERENCED_LIBRARIES), same(CacheState.INVALID));
+    expect(entry.getState(HtmlEntry.RESOLUTION_ERRORS), same(CacheState.INVALID));
   }
 
   void test_setState_angularErrors() {
@@ -3916,8 +3371,7 @@
     HtmlEntry entry = new HtmlEntry();
     try {
       entry.setValue(DartEntry.ELEMENT, null);
-      JUnitTestCase.fail(
-          "Expected IllegalArgumentException for DartEntry.ELEMENT");
+      fail("Expected IllegalArgumentException for DartEntry.ELEMENT");
     } on ArgumentError catch (exception) {
     }
   }
@@ -3976,54 +3430,35 @@
     entry.setValue(HtmlEntry.POLYMER_RESOLUTION_ERRORS, null);
     entry.setValue(HtmlEntry.REFERENCED_LIBRARIES, null);
     entry.setValue(HtmlEntry.RESOLUTION_ERRORS, null);
-    JUnitTestCase.assertSame(
-        CacheState.VALID,
-        entry.getState(HtmlEntry.ANGULAR_ERRORS));
-    JUnitTestCase.assertSame(
-        CacheState.VALID,
-        entry.getState(HtmlEntry.ELEMENT));
-    JUnitTestCase.assertSame(CacheState.VALID, entry.getState(HtmlEntry.HINTS));
-    JUnitTestCase.assertSame(
-        CacheState.VALID,
-        entry.getState(SourceEntry.LINE_INFO));
-    JUnitTestCase.assertSame(
-        CacheState.VALID,
-        entry.getState(HtmlEntry.PARSE_ERRORS));
-    JUnitTestCase.assertSame(
-        CacheState.VALID,
-        entry.getState(HtmlEntry.PARSED_UNIT));
-    JUnitTestCase.assertSame(
-        CacheState.VALID,
-        entry.getState(HtmlEntry.POLYMER_BUILD_ERRORS));
-    JUnitTestCase.assertSame(
-        CacheState.VALID,
-        entry.getState(HtmlEntry.POLYMER_RESOLUTION_ERRORS));
-    JUnitTestCase.assertSame(
-        CacheState.VALID,
-        entry.getState(HtmlEntry.REFERENCED_LIBRARIES));
-    JUnitTestCase.assertSame(
-        CacheState.VALID,
-        entry.getState(HtmlEntry.RESOLUTION_ERRORS));
+    expect(entry.getState(HtmlEntry.ANGULAR_ERRORS), same(CacheState.VALID));
+    expect(entry.getState(HtmlEntry.ELEMENT), same(CacheState.VALID));
+    expect(entry.getState(HtmlEntry.HINTS), same(CacheState.VALID));
+    expect(entry.getState(SourceEntry.LINE_INFO), same(CacheState.VALID));
+    expect(entry.getState(HtmlEntry.PARSE_ERRORS), same(CacheState.VALID));
+    expect(entry.getState(HtmlEntry.PARSED_UNIT), same(CacheState.VALID));
+    expect(entry.getState(HtmlEntry.POLYMER_BUILD_ERRORS), same(CacheState.VALID));
+    expect(entry.getState(HtmlEntry.POLYMER_RESOLUTION_ERRORS), same(CacheState.VALID));
+    expect(entry.getState(HtmlEntry.REFERENCED_LIBRARIES), same(CacheState.VALID));
+    expect(entry.getState(HtmlEntry.RESOLUTION_ERRORS), same(CacheState.VALID));
     return entry;
   }
 
   void _setValue(DataDescriptor descriptor, Object newValue) {
     HtmlEntry entry = new HtmlEntry();
     Object value = entry.getValue(descriptor);
-    JUnitTestCase.assertNotSame(value, newValue);
+    expect(newValue, isNot(same(value)));
     entry.setValue(descriptor, newValue);
-    JUnitTestCase.assertSame(CacheState.VALID, entry.getState(descriptor));
-    JUnitTestCase.assertSame(newValue, entry.getValue(descriptor));
+    expect(entry.getState(descriptor), same(CacheState.VALID));
+    expect(entry.getValue(descriptor), same(newValue));
   }
 }
 
 
-class IncrementalAnalysisCacheTest extends JUnitTestCase {
+class IncrementalAnalysisCacheTest {
   Source _source = new TestSource();
   DartEntry _entry = new DartEntry();
   CompilationUnit _unit = new CompilationUnitMock();
   IncrementalAnalysisCache _result;
-  @override
   void setUp() {
     _entry.setValueInLibrary(DartEntry.RESOLVED_UNIT, _source, _unit);
   }
@@ -4039,26 +3474,26 @@
         _entry);
     CompilationUnit newUnit = new CompilationUnitMock();
     _result = IncrementalAnalysisCache.cacheResult(cache, newUnit);
-    JUnitTestCase.assertNotNull(_result);
-    JUnitTestCase.assertSame(_source, _result.source);
-    JUnitTestCase.assertSame(newUnit, _result.resolvedUnit);
-    JUnitTestCase.assertEquals("hbazlo", _result.oldContents);
-    JUnitTestCase.assertEquals("hbazlo", _result.newContents);
-    JUnitTestCase.assertEquals(0, _result.offset);
-    JUnitTestCase.assertEquals(0, _result.oldLength);
-    JUnitTestCase.assertEquals(0, _result.newLength);
+    expect(_result, isNotNull);
+    expect(_result.source, same(_source));
+    expect(_result.resolvedUnit, same(newUnit));
+    expect(_result.oldContents, "hbazlo");
+    expect(_result.newContents, "hbazlo");
+    expect(_result.offset, 0);
+    expect(_result.oldLength, 0);
+    expect(_result.newLength, 0);
   }
   void test_cacheResult_noCache() {
     IncrementalAnalysisCache cache = null;
     CompilationUnit newUnit = new CompilationUnitMock();
     _result = IncrementalAnalysisCache.cacheResult(cache, newUnit);
-    JUnitTestCase.assertNull(_result);
+    expect(_result, isNull);
   }
   void test_cacheResult_noCacheNoResult() {
     IncrementalAnalysisCache cache = null;
     CompilationUnit newUnit = null;
     _result = IncrementalAnalysisCache.cacheResult(cache, newUnit);
-    JUnitTestCase.assertNull(_result);
+    expect(_result, isNull);
   }
   void test_cacheResult_noResult() {
     IncrementalAnalysisCache cache = IncrementalAnalysisCache.update(
@@ -4072,7 +3507,7 @@
         _entry);
     CompilationUnit newUnit = null;
     _result = IncrementalAnalysisCache.cacheResult(cache, newUnit);
-    JUnitTestCase.assertNull(_result);
+    expect(_result, isNull);
   }
   void test_clear_differentSource() {
     IncrementalAnalysisCache cache = IncrementalAnalysisCache.update(
@@ -4086,12 +3521,12 @@
         _entry);
     Source otherSource = new TestSource("blat.dart", "blat");
     _result = IncrementalAnalysisCache.clear(cache, otherSource);
-    JUnitTestCase.assertSame(cache, _result);
+    expect(_result, same(cache));
   }
   void test_clear_nullCache() {
     IncrementalAnalysisCache cache = null;
     _result = IncrementalAnalysisCache.clear(cache, _source);
-    JUnitTestCase.assertNull(_result);
+    expect(_result, isNull);
   }
   void test_clear_sameSource() {
     IncrementalAnalysisCache cache = IncrementalAnalysisCache.update(
@@ -4104,7 +3539,7 @@
         3,
         _entry);
     _result = IncrementalAnalysisCache.clear(cache, _source);
-    JUnitTestCase.assertNull(_result);
+    expect(_result, isNull);
   }
   void test_update_append() {
     IncrementalAnalysisCache cache = IncrementalAnalysisCache.update(
@@ -4126,14 +3561,14 @@
         0,
         1,
         newEntry);
-    JUnitTestCase.assertNotNull(_result);
-    JUnitTestCase.assertSame(_source, _result.source);
-    JUnitTestCase.assertSame(_unit, _result.resolvedUnit);
-    JUnitTestCase.assertEquals("hello", _result.oldContents);
-    JUnitTestCase.assertEquals("hbazxlo", _result.newContents);
-    JUnitTestCase.assertEquals(1, _result.offset);
-    JUnitTestCase.assertEquals(2, _result.oldLength);
-    JUnitTestCase.assertEquals(4, _result.newLength);
+    expect(_result, isNotNull);
+    expect(_result.source, same(_source));
+    expect(_result.resolvedUnit, same(_unit));
+    expect(_result.oldContents, "hello");
+    expect(_result.newContents, "hbazxlo");
+    expect(_result.offset, 1);
+    expect(_result.oldLength, 2);
+    expect(_result.newLength, 4);
   }
   void test_update_appendToCachedResult() {
     IncrementalAnalysisCache cache = IncrementalAnalysisCache.update(
@@ -4147,7 +3582,7 @@
         _entry);
     CompilationUnit newUnit = new CompilationUnitMock();
     cache = IncrementalAnalysisCache.cacheResult(cache, newUnit);
-    JUnitTestCase.assertNotNull(cache);
+    expect(cache, isNotNull);
     DartEntry newEntry = new DartEntry();
     _result = IncrementalAnalysisCache.update(
         cache,
@@ -4158,14 +3593,14 @@
         0,
         1,
         newEntry);
-    JUnitTestCase.assertNotNull(_result);
-    JUnitTestCase.assertSame(_source, _result.source);
-    JUnitTestCase.assertSame(newUnit, _result.resolvedUnit);
-    JUnitTestCase.assertEquals("hbazlo", _result.oldContents);
-    JUnitTestCase.assertEquals("hbazxlo", _result.newContents);
-    JUnitTestCase.assertEquals(4, _result.offset);
-    JUnitTestCase.assertEquals(0, _result.oldLength);
-    JUnitTestCase.assertEquals(1, _result.newLength);
+    expect(_result, isNotNull);
+    expect(_result.source, same(_source));
+    expect(_result.resolvedUnit, same(newUnit));
+    expect(_result.oldContents, "hbazlo");
+    expect(_result.newContents, "hbazxlo");
+    expect(_result.offset, 4);
+    expect(_result.oldLength, 0);
+    expect(_result.newLength, 1);
   }
   void test_update_appendWithNewResolvedUnit() {
     IncrementalAnalysisCache cache = IncrementalAnalysisCache.update(
@@ -4189,14 +3624,14 @@
         0,
         1,
         newEntry);
-    JUnitTestCase.assertNotNull(_result);
-    JUnitTestCase.assertSame(_source, _result.source);
-    JUnitTestCase.assertSame(newUnit, _result.resolvedUnit);
-    JUnitTestCase.assertEquals("hbazlo", _result.oldContents);
-    JUnitTestCase.assertEquals("hbazxlo", _result.newContents);
-    JUnitTestCase.assertEquals(4, _result.offset);
-    JUnitTestCase.assertEquals(0, _result.oldLength);
-    JUnitTestCase.assertEquals(1, _result.newLength);
+    expect(_result, isNotNull);
+    expect(_result.source, same(_source));
+    expect(_result.resolvedUnit, same(newUnit));
+    expect(_result.oldContents, "hbazlo");
+    expect(_result.newContents, "hbazxlo");
+    expect(_result.offset, 4);
+    expect(_result.oldLength, 0);
+    expect(_result.newLength, 1);
   }
   void test_update_appendWithNoNewResolvedUnit() {
     IncrementalAnalysisCache cache = IncrementalAnalysisCache.update(
@@ -4218,14 +3653,14 @@
         0,
         1,
         newEntry);
-    JUnitTestCase.assertNotNull(_result);
-    JUnitTestCase.assertSame(_source, _result.source);
-    JUnitTestCase.assertSame(_unit, _result.resolvedUnit);
-    JUnitTestCase.assertEquals("hello", _result.oldContents);
-    JUnitTestCase.assertEquals("hbazxlo", _result.newContents);
-    JUnitTestCase.assertEquals(1, _result.offset);
-    JUnitTestCase.assertEquals(2, _result.oldLength);
-    JUnitTestCase.assertEquals(4, _result.newLength);
+    expect(_result, isNotNull);
+    expect(_result.source, same(_source));
+    expect(_result.resolvedUnit, same(_unit));
+    expect(_result.oldContents, "hello");
+    expect(_result.newContents, "hbazxlo");
+    expect(_result.offset, 1);
+    expect(_result.oldLength, 2);
+    expect(_result.newLength, 4);
   }
   void test_update_delete() {
     IncrementalAnalysisCache cache = IncrementalAnalysisCache.update(
@@ -4247,14 +3682,14 @@
         2,
         0,
         newEntry);
-    JUnitTestCase.assertNotNull(_result);
-    JUnitTestCase.assertSame(_source, _result.source);
-    JUnitTestCase.assertSame(_unit, _result.resolvedUnit);
-    JUnitTestCase.assertEquals("hello", _result.oldContents);
-    JUnitTestCase.assertEquals("hzlo", _result.newContents);
-    JUnitTestCase.assertEquals(1, _result.offset);
-    JUnitTestCase.assertEquals(2, _result.oldLength);
-    JUnitTestCase.assertEquals(1, _result.newLength);
+    expect(_result, isNotNull);
+    expect(_result.source, same(_source));
+    expect(_result.resolvedUnit, same(_unit));
+    expect(_result.oldContents, "hello");
+    expect(_result.newContents, "hzlo");
+    expect(_result.offset, 1);
+    expect(_result.oldLength, 2);
+    expect(_result.newLength, 1);
   }
   void test_update_insert_nonContiguous_after() {
     IncrementalAnalysisCache cache = IncrementalAnalysisCache.update(
@@ -4276,7 +3711,7 @@
         0,
         1,
         newEntry);
-    JUnitTestCase.assertNull(_result);
+    expect(_result, isNull);
   }
   void test_update_insert_nonContiguous_before() {
     IncrementalAnalysisCache cache = IncrementalAnalysisCache.update(
@@ -4298,7 +3733,7 @@
         0,
         1,
         newEntry);
-    JUnitTestCase.assertNull(_result);
+    expect(_result, isNull);
   }
   void test_update_newSource_entry() {
     Source oldSource = new TestSource("blat.dart", "blat");
@@ -4314,8 +3749,8 @@
         2,
         3,
         oldEntry);
-    JUnitTestCase.assertSame(oldSource, cache.source);
-    JUnitTestCase.assertSame(oldUnit, cache.resolvedUnit);
+    expect(cache.source, same(oldSource));
+    expect(cache.resolvedUnit, same(oldUnit));
     _result = IncrementalAnalysisCache.update(
         cache,
         _source,
@@ -4325,14 +3760,14 @@
         0,
         2,
         _entry);
-    JUnitTestCase.assertNotNull(_result);
-    JUnitTestCase.assertSame(_source, _result.source);
-    JUnitTestCase.assertSame(_unit, _result.resolvedUnit);
-    JUnitTestCase.assertEquals("foo", _result.oldContents);
-    JUnitTestCase.assertEquals("foobz", _result.newContents);
-    JUnitTestCase.assertEquals(3, _result.offset);
-    JUnitTestCase.assertEquals(0, _result.oldLength);
-    JUnitTestCase.assertEquals(2, _result.newLength);
+    expect(_result, isNotNull);
+    expect(_result.source, same(_source));
+    expect(_result.resolvedUnit, same(_unit));
+    expect(_result.oldContents, "foo");
+    expect(_result.newContents, "foobz");
+    expect(_result.offset, 3);
+    expect(_result.oldLength, 0);
+    expect(_result.newLength, 2);
   }
   void test_update_newSource_noEntry() {
     Source oldSource = new TestSource("blat.dart", "blat");
@@ -4348,8 +3783,8 @@
         2,
         3,
         oldEntry);
-    JUnitTestCase.assertSame(oldSource, cache.source);
-    JUnitTestCase.assertSame(oldUnit, cache.resolvedUnit);
+    expect(cache.source, same(oldSource));
+    expect(cache.resolvedUnit, same(oldUnit));
     _result = IncrementalAnalysisCache.update(
         cache,
         _source,
@@ -4359,7 +3794,7 @@
         0,
         3,
         null);
-    JUnitTestCase.assertNull(_result);
+    expect(_result, isNull);
   }
   void test_update_noCache_entry() {
     _result = IncrementalAnalysisCache.update(
@@ -4371,15 +3806,15 @@
         2,
         3,
         _entry);
-    JUnitTestCase.assertNotNull(_result);
-    JUnitTestCase.assertSame(_source, _result.source);
-    JUnitTestCase.assertSame(_unit, _result.resolvedUnit);
-    JUnitTestCase.assertEquals("hello", _result.oldContents);
-    JUnitTestCase.assertEquals("hbazlo", _result.newContents);
-    JUnitTestCase.assertEquals(1, _result.offset);
-    JUnitTestCase.assertEquals(2, _result.oldLength);
-    JUnitTestCase.assertEquals(3, _result.newLength);
-    JUnitTestCase.assertTrue(_result.hasWork);
+    expect(_result, isNotNull);
+    expect(_result.source, same(_source));
+    expect(_result.resolvedUnit, same(_unit));
+    expect(_result.oldContents, "hello");
+    expect(_result.newContents, "hbazlo");
+    expect(_result.offset, 1);
+    expect(_result.oldLength, 2);
+    expect(_result.newLength, 3);
+    expect(_result.hasWork, isTrue);
   }
   void test_update_noCache_entry_noOldSource_append() {
     _result = IncrementalAnalysisCache.update(
@@ -4391,25 +3826,25 @@
         0,
         1,
         _entry);
-    JUnitTestCase.assertNotNull(_result);
-    JUnitTestCase.assertSame(_source, _result.source);
-    JUnitTestCase.assertSame(_unit, _result.resolvedUnit);
-    JUnitTestCase.assertEquals("hello", _result.oldContents);
-    JUnitTestCase.assertEquals("hellxo", _result.newContents);
-    JUnitTestCase.assertEquals(4, _result.offset);
-    JUnitTestCase.assertEquals(0, _result.oldLength);
-    JUnitTestCase.assertEquals(1, _result.newLength);
-    JUnitTestCase.assertTrue(_result.hasWork);
+    expect(_result, isNotNull);
+    expect(_result.source, same(_source));
+    expect(_result.resolvedUnit, same(_unit));
+    expect(_result.oldContents, "hello");
+    expect(_result.newContents, "hellxo");
+    expect(_result.offset, 4);
+    expect(_result.oldLength, 0);
+    expect(_result.newLength, 1);
+    expect(_result.hasWork, isTrue);
   }
   void test_update_noCache_entry_noOldSource_delete() {
     _result =
         IncrementalAnalysisCache.update(null, _source, null, "helo", 4, 1, 0, _entry);
-    JUnitTestCase.assertNull(_result);
+    expect(_result, isNull);
   }
   void test_update_noCache_entry_noOldSource_replace() {
     _result =
         IncrementalAnalysisCache.update(null, _source, null, "helxo", 4, 1, 1, _entry);
-    JUnitTestCase.assertNull(_result);
+    expect(_result, isNull);
   }
   void test_update_noCache_noEntry() {
     _result = IncrementalAnalysisCache.update(
@@ -4421,7 +3856,7 @@
         2,
         3,
         null);
-    JUnitTestCase.assertNull(_result);
+    expect(_result, isNull);
   }
   void test_update_replace() {
     IncrementalAnalysisCache cache = IncrementalAnalysisCache.update(
@@ -4442,14 +3877,14 @@
         1,
         2,
         null);
-    JUnitTestCase.assertNotNull(_result);
-    JUnitTestCase.assertSame(_source, _result.source);
-    JUnitTestCase.assertSame(_unit, _result.resolvedUnit);
-    JUnitTestCase.assertEquals("hello", _result.oldContents);
-    JUnitTestCase.assertEquals("hbarrlo", _result.newContents);
-    JUnitTestCase.assertEquals(1, _result.offset);
-    JUnitTestCase.assertEquals(2, _result.oldLength);
-    JUnitTestCase.assertEquals(4, _result.newLength);
+    expect(_result, isNotNull);
+    expect(_result.source, same(_source));
+    expect(_result.resolvedUnit, same(_unit));
+    expect(_result.oldContents, "hello");
+    expect(_result.newContents, "hbarrlo");
+    expect(_result.offset, 1);
+    expect(_result.oldLength, 2);
+    expect(_result.newLength, 4);
   }
   void test_verifyStructure_invalidUnit() {
     String oldCode = "main() {foo;}";
@@ -4467,19 +3902,19 @@
         _entry);
     CompilationUnit newUnit = _parse(newCode);
     _result = IncrementalAnalysisCache.verifyStructure(cache, _source, newUnit);
-    JUnitTestCase.assertNull(_result);
+    expect(_result, isNull);
   }
   void test_verifyStructure_noCache() {
     IncrementalAnalysisCache cache = null;
     CompilationUnit newUnit = new CompilationUnitMock();
     _result = IncrementalAnalysisCache.verifyStructure(cache, _source, newUnit);
-    JUnitTestCase.assertNull(_result);
+    expect(_result, isNull);
   }
   void test_verifyStructure_noCacheNoUnit() {
     IncrementalAnalysisCache cache = null;
     CompilationUnit newUnit = null;
     _result = IncrementalAnalysisCache.verifyStructure(cache, _source, newUnit);
-    JUnitTestCase.assertNull(_result);
+    expect(_result, isNull);
   }
   void test_verifyStructure_noUnit() {
     IncrementalAnalysisCache cache = IncrementalAnalysisCache.update(
@@ -4493,8 +3928,8 @@
         _entry);
     CompilationUnit newUnit = null;
     _result = IncrementalAnalysisCache.verifyStructure(cache, _source, newUnit);
-    JUnitTestCase.assertSame(cache, _result);
-    JUnitTestCase.assertSame(_unit, _result.resolvedUnit);
+    expect(_result, same(cache));
+    expect(_result.resolvedUnit, same(_unit));
   }
   void test_verifyStructure_otherSource() {
     IncrementalAnalysisCache cache = IncrementalAnalysisCache.update(
@@ -4510,8 +3945,8 @@
     Source otherSource = new TestSource("blat.dart", "blat");
     _result =
         IncrementalAnalysisCache.verifyStructure(cache, otherSource, newUnit);
-    JUnitTestCase.assertSame(cache, _result);
-    JUnitTestCase.assertSame(_unit, _result.resolvedUnit);
+    expect(_result, same(cache));
+    expect(_result.resolvedUnit, same(_unit));
   }
   void test_verifyStructure_validUnit() {
     String oldCode = "main() {foo;}";
@@ -4529,8 +3964,8 @@
         _entry);
     CompilationUnit newUnit = _parse(newCode);
     _result = IncrementalAnalysisCache.verifyStructure(cache, _source, newUnit);
-    JUnitTestCase.assertSame(cache, _result);
-    JUnitTestCase.assertSame(goodUnit, _result.resolvedUnit);
+    expect(_result, same(cache));
+    expect(_result.resolvedUnit, same(goodUnit));
   }
   CompilationUnit _parse(String code) {
     Scanner scanner = new Scanner(
@@ -4547,8 +3982,7 @@
 class IncrementalAnalysisTaskTest extends EngineTestCase {
   void test_accept() {
     IncrementalAnalysisTask task = new IncrementalAnalysisTask(null, null);
-    JUnitTestCase.assertTrue(
-        task.accept(new IncrementalAnalysisTaskTestTV_accept()));
+    expect(task.accept(new IncrementalAnalysisTaskTestTV_accept()), isTrue);
   }
 
   void test_perform() {
@@ -4558,33 +3992,31 @@
         _assertTask("main() {", "", "String", "} String foo;");
     NodeList<CompilationUnitMember> declarations = newUnit.declarations;
     FunctionDeclaration main = declarations[0] as FunctionDeclaration;
-    JUnitTestCase.assertEquals("main", main.name.name);
+    expect(main.name.name, "main");
     BlockFunctionBody body = main.functionExpression.body as BlockFunctionBody;
     ExpressionStatement statement =
         body.block.statements[0] as ExpressionStatement;
-    JUnitTestCase.assertEquals("String;", statement.toSource());
+    expect(statement.toSource(), "String;");
     SimpleIdentifier identifier = statement.expression as SimpleIdentifier;
-    JUnitTestCase.assertEquals("String", identifier.name);
-    JUnitTestCase.assertNotNull(identifier.staticElement);
+    expect(identifier.name, "String");
+    expect(identifier.staticElement, isNotNull);
     TopLevelVariableDeclaration fooDecl =
         declarations[1] as TopLevelVariableDeclaration;
     SimpleIdentifier fooName = fooDecl.variables.variables[0].name;
-    JUnitTestCase.assertEquals("foo", fooName.name);
-    JUnitTestCase.assertNotNull(fooName.staticElement);
+    expect(fooName.name, "foo");
+    expect(fooName.staticElement, isNotNull);
     // assert element reference is preserved
   }
 
   CompilationUnit _assertTask(String prefix, String removed, String added,
       String suffix) {
-    String oldCode =
-        EngineTestCase.createSource(["${prefix}${removed}${suffix}"]);
-    String newCode =
-        EngineTestCase.createSource(["${prefix}${added}${suffix}"]);
+    String oldCode = "$prefix$removed$suffix";
+    String newCode = "$prefix$added$suffix";
     InternalAnalysisContext context = AnalysisContextFactory.contextWithCore();
     Source source = new TestSource("/test.dart", oldCode);
     DartEntry entry = new DartEntry();
     CompilationUnit oldUnit = context.resolveCompilationUnit2(source, source);
-    JUnitTestCase.assertNotNull(oldUnit);
+    expect(oldUnit, isNotNull);
     entry.setValueInLibrary(DartEntry.RESOLVED_UNIT, source, oldUnit);
     IncrementalAnalysisCache cache = IncrementalAnalysisCache.update(
         null,
@@ -4595,11 +4027,11 @@
         removed.length,
         added.length,
         entry);
-    JUnitTestCase.assertNotNull(cache);
+    expect(cache, isNotNull);
     IncrementalAnalysisTask task = new IncrementalAnalysisTask(context, cache);
     CompilationUnit newUnit =
         task.perform(new IncrementalAnalysisTaskTestTV_assertTask(task));
-    JUnitTestCase.assertNotNull(newUnit);
+    expect(newUnit, isNotNull);
     return newUnit;
   }
 }
@@ -4624,509 +4056,455 @@
 
 class InstrumentedAnalysisContextImplTest extends EngineTestCase {
   void test_addSourceInfo() {
-    List<bool> invoked = [false];
+    TestAnalysisContext_test_addSourceInfo innerContext = new TestAnalysisContext_test_addSourceInfo();
     InstrumentedAnalysisContextImpl context =
-        new InstrumentedAnalysisContextImpl.con1(
-            new TestAnalysisContext_test_addSourceInfo(invoked));
+        new InstrumentedAnalysisContextImpl.con1(innerContext);
     context.addSourceInfo(null, null);
-    JUnitTestCase.assertTrue(invoked[0]);
+    expect(innerContext.invoked, isTrue);
   }
 
   void test_applyChanges() {
-    List<bool> invoked = [false];
+    TestAnalysisContext_test_applyChanges innerContext = new TestAnalysisContext_test_applyChanges();
     InstrumentedAnalysisContextImpl context =
-        new InstrumentedAnalysisContextImpl.con1(
-            new TestAnalysisContext_test_applyChanges(invoked));
+        new InstrumentedAnalysisContextImpl.con1(innerContext);
     context.applyChanges(null);
-    JUnitTestCase.assertTrue(invoked[0]);
+    expect(innerContext.invoked, isTrue);
   }
 
   void test_computeDocumentationComment() {
-    List<bool> invoked = [false];
+    TestAnalysisContext_test_computeDocumentationComment innerContext = new TestAnalysisContext_test_computeDocumentationComment();
     InstrumentedAnalysisContextImpl context =
-        new InstrumentedAnalysisContextImpl.con1(
-            new TestAnalysisContext_test_computeDocumentationComment(invoked));
+        new InstrumentedAnalysisContextImpl.con1(innerContext);
     context.computeDocumentationComment(null);
-    JUnitTestCase.assertTrue(invoked[0]);
+    expect(innerContext.invoked, isTrue);
   }
 
   void test_computeErrors() {
-    List<bool> invoked = [false];
+    TestAnalysisContext_test_computeErrors innerContext = new TestAnalysisContext_test_computeErrors();
     InstrumentedAnalysisContextImpl context =
-        new InstrumentedAnalysisContextImpl.con1(
-            new TestAnalysisContext_test_computeErrors(invoked));
+        new InstrumentedAnalysisContextImpl.con1(innerContext);
     context.computeErrors(null);
-    JUnitTestCase.assertTrue(invoked[0]);
+    expect(innerContext.invoked, isTrue);
   }
 
   void test_computeExportedLibraries() {
-    List<bool> invoked = [false];
+    TestAnalysisContext_test_computeExportedLibraries innerContext = new TestAnalysisContext_test_computeExportedLibraries();
     InstrumentedAnalysisContextImpl context =
-        new InstrumentedAnalysisContextImpl.con1(
-            new TestAnalysisContext_test_computeExportedLibraries(invoked));
+        new InstrumentedAnalysisContextImpl.con1(innerContext);
     context.computeExportedLibraries(null);
-    JUnitTestCase.assertTrue(invoked[0]);
+    expect(innerContext.invoked, isTrue);
   }
 
   void test_computeHtmlElement() {
-    List<bool> invoked = [false];
+    TestAnalysisContext_test_computeHtmlElement innerContext = new TestAnalysisContext_test_computeHtmlElement();
     InstrumentedAnalysisContextImpl context =
-        new InstrumentedAnalysisContextImpl.con1(
-            new TestAnalysisContext_test_computeHtmlElement(invoked));
+        new InstrumentedAnalysisContextImpl.con1(innerContext);
     context.computeHtmlElement(null);
-    JUnitTestCase.assertTrue(invoked[0]);
+    expect(innerContext.invoked, isTrue);
   }
 
   void test_computeImportedLibraries() {
-    List<bool> invoked = [false];
+    TestAnalysisContext_test_computeImportedLibraries innerContext = new TestAnalysisContext_test_computeImportedLibraries();
     InstrumentedAnalysisContextImpl context =
-        new InstrumentedAnalysisContextImpl.con1(
-            new TestAnalysisContext_test_computeImportedLibraries(invoked));
+        new InstrumentedAnalysisContextImpl.con1(innerContext);
     context.computeImportedLibraries(null);
-    JUnitTestCase.assertTrue(invoked[0]);
+    expect(innerContext.invoked, isTrue);
   }
 
   void test_computeKindOf() {
-    List<bool> invoked = [false];
+    TestAnalysisContext_test_computeKindOf innerContext = new TestAnalysisContext_test_computeKindOf();
     InstrumentedAnalysisContextImpl context =
-        new InstrumentedAnalysisContextImpl.con1(
-            new TestAnalysisContext_test_computeKindOf(invoked));
+        new InstrumentedAnalysisContextImpl.con1(innerContext);
     context.computeKindOf(null);
-    JUnitTestCase.assertTrue(invoked[0]);
+    expect(innerContext.invoked, isTrue);
   }
 
   void test_computeLibraryElement() {
-    List<bool> invoked = [false];
+    TestAnalysisContext_test_computeLibraryElement innerContext = new TestAnalysisContext_test_computeLibraryElement();
     InstrumentedAnalysisContextImpl context =
-        new InstrumentedAnalysisContextImpl.con1(
-            new TestAnalysisContext_test_computeLibraryElement(invoked));
+        new InstrumentedAnalysisContextImpl.con1(innerContext);
     context.computeLibraryElement(null);
-    JUnitTestCase.assertTrue(invoked[0]);
+    expect(innerContext.invoked, isTrue);
   }
 
   void test_computeLineInfo() {
-    List<bool> invoked = [false];
+    TestAnalysisContext_test_computeLineInfo innerContext = new TestAnalysisContext_test_computeLineInfo();
     InstrumentedAnalysisContextImpl context =
-        new InstrumentedAnalysisContextImpl.con1(
-            new TestAnalysisContext_test_computeLineInfo(invoked));
+        new InstrumentedAnalysisContextImpl.con1(innerContext);
     context.computeLineInfo(null);
-    JUnitTestCase.assertTrue(invoked[0]);
+    expect(innerContext.invoked, isTrue);
   }
 
   void test_computeResolvableCompilationUnit() {
-    List<bool> invoked = [false];
+    TestAnalysisContext_test_computeResolvableCompilationUnit innerContext = new TestAnalysisContext_test_computeResolvableCompilationUnit();
     InstrumentedAnalysisContextImpl context =
-        new InstrumentedAnalysisContextImpl.con1(
-            new TestAnalysisContext_test_computeResolvableCompilationUnit(invoked));
+        new InstrumentedAnalysisContextImpl.con1(innerContext);
     context.computeResolvableCompilationUnit(null);
-    JUnitTestCase.assertTrue(invoked[0]);
+    expect(innerContext.invoked, isTrue);
   }
 
   void test_creation() {
-    JUnitTestCase.assertNotNull(new InstrumentedAnalysisContextImpl());
+    expect(new InstrumentedAnalysisContextImpl(), isNotNull);
   }
 
   void test_dispose() {
-    List<bool> invoked = [false];
+    TestAnalysisContext_test_dispose innerContext = new TestAnalysisContext_test_dispose();
     InstrumentedAnalysisContextImpl context =
-        new InstrumentedAnalysisContextImpl.con1(
-            new TestAnalysisContext_test_dispose(invoked));
+        new InstrumentedAnalysisContextImpl.con1(innerContext);
     context.dispose();
-    JUnitTestCase.assertTrue(invoked[0]);
+    expect(innerContext.invoked, isTrue);
   }
 
   void test_exists() {
-    List<bool> invoked = [false];
+    TestAnalysisContext_test_exists innerContext = new TestAnalysisContext_test_exists();
     InstrumentedAnalysisContextImpl context =
-        new InstrumentedAnalysisContextImpl.con1(
-            new TestAnalysisContext_test_exists(invoked));
+        new InstrumentedAnalysisContextImpl.con1(innerContext);
     context.exists(null);
-    JUnitTestCase.assertTrue(invoked[0]);
+    expect(innerContext.invoked, isTrue);
   }
 
   void test_getAnalysisOptions() {
-    List<bool> invoked = [false];
+    TestAnalysisContext_test_getAnalysisOptions innerContext = new TestAnalysisContext_test_getAnalysisOptions();
     InstrumentedAnalysisContextImpl context =
-        new InstrumentedAnalysisContextImpl.con1(
-            new TestAnalysisContext_test_getAnalysisOptions(invoked));
+        new InstrumentedAnalysisContextImpl.con1(innerContext);
     context.analysisOptions;
-    JUnitTestCase.assertTrue(invoked[0]);
+    expect(innerContext.invoked, isTrue);
   }
 
   void test_getAngularApplicationWithHtml() {
-    List<bool> invoked = [false];
+    TestAnalysisContext_test_getAngularApplicationWithHtml innerContext = new TestAnalysisContext_test_getAngularApplicationWithHtml();
     InstrumentedAnalysisContextImpl context =
-        new InstrumentedAnalysisContextImpl.con1(
-            new TestAnalysisContext_test_getAngularApplicationWithHtml(invoked));
+        new InstrumentedAnalysisContextImpl.con1(innerContext);
     context.getAngularApplicationWithHtml(null);
-    JUnitTestCase.assertTrue(invoked[0]);
+    expect(innerContext.invoked, isTrue);
   }
 
   void test_getCompilationUnitElement() {
-    List<bool> invoked = [false];
+    TestAnalysisContext_test_getCompilationUnitElement innerContext = new TestAnalysisContext_test_getCompilationUnitElement();
     InstrumentedAnalysisContextImpl context =
-        new InstrumentedAnalysisContextImpl.con1(
-            new TestAnalysisContext_test_getCompilationUnitElement(invoked));
+        new InstrumentedAnalysisContextImpl.con1(innerContext);
     context.getCompilationUnitElement(null, null);
-    JUnitTestCase.assertTrue(invoked[0]);
+    expect(innerContext.invoked, isTrue);
   }
 
   void test_getContents() {
-    List<bool> invoked = [false];
+    TestAnalysisContext_test_getContents innerContext = new TestAnalysisContext_test_getContents();
     InstrumentedAnalysisContextImpl context =
-        new InstrumentedAnalysisContextImpl.con1(
-            new TestAnalysisContext_test_getContents(invoked));
+        new InstrumentedAnalysisContextImpl.con1(innerContext);
     context.getContents(null);
-    JUnitTestCase.assertTrue(invoked[0]);
+    expect(innerContext.invoked, isTrue);
   }
 
 //  void test_getContentsToReceiver() {
-//    List<bool> invoked = [false];
-//    InstrumentedAnalysisContextImpl context = new InstrumentedAnalysisContextImpl.con1(new TestAnalysisContext_test_getContentsToReceiver(invoked));
+//    TestAnalysisContext_test_getContentsToReceiver innerContext = new TestAnalysisContext_test_getContentsToReceiver();
+//    InstrumentedAnalysisContextImpl context
+//        = new InstrumentedAnalysisContextImpl.con1(innerContext);
 //    context.getContentsToReceiver(null, null);
-//    JUnitTestCase.assertTrue(invoked[0]);
+//    expect(innerContext.invoked, isTrue);
 //  }
 
   void test_getElement() {
-    List<bool> invoked = [false];
+    TestAnalysisContext_test_getElement innerContext = new TestAnalysisContext_test_getElement();
     InstrumentedAnalysisContextImpl context =
-        new InstrumentedAnalysisContextImpl.con1(
-            new TestAnalysisContext_test_getElement(invoked));
+        new InstrumentedAnalysisContextImpl.con1(innerContext);
     context.getElement(null);
-    JUnitTestCase.assertTrue(invoked[0]);
+    expect(innerContext.invoked, isTrue);
   }
 
   void test_getErrors() {
-    List<bool> invoked = [false];
+    TestAnalysisContext_test_getErrors innerContext = new TestAnalysisContext_test_getErrors();
     InstrumentedAnalysisContextImpl context =
-        new InstrumentedAnalysisContextImpl.con1(
-            new TestAnalysisContext_test_getErrors(invoked));
+        new InstrumentedAnalysisContextImpl.con1(innerContext);
     context.getErrors(null);
-    JUnitTestCase.assertTrue(invoked[0]);
+    expect(innerContext.invoked, isTrue);
   }
 
   void test_getHtmlElement() {
-    List<bool> invoked = [false];
+    TestAnalysisContext_test_getHtmlElement innerContext = new TestAnalysisContext_test_getHtmlElement();
     InstrumentedAnalysisContextImpl context =
-        new InstrumentedAnalysisContextImpl.con1(
-            new TestAnalysisContext_test_getHtmlElement(invoked));
+        new InstrumentedAnalysisContextImpl.con1(innerContext);
     context.getHtmlElement(null);
-    JUnitTestCase.assertTrue(invoked[0]);
+    expect(innerContext.invoked, isTrue);
   }
 
   void test_getHtmlFilesReferencing() {
-    List<bool> invoked = [false];
+    TestAnalysisContext_test_getHtmlFilesReferencing innerContext = new TestAnalysisContext_test_getHtmlFilesReferencing();
     InstrumentedAnalysisContextImpl context =
-        new InstrumentedAnalysisContextImpl.con1(
-            new TestAnalysisContext_test_getHtmlFilesReferencing(invoked));
+        new InstrumentedAnalysisContextImpl.con1(innerContext);
     context.getHtmlFilesReferencing(null);
-    JUnitTestCase.assertTrue(invoked[0]);
+    expect(innerContext.invoked, isTrue);
   }
 
   void test_getHtmlSources() {
-    List<bool> invoked = [false];
+    TestAnalysisContext_test_getHtmlSources innerContext = new TestAnalysisContext_test_getHtmlSources();
     InstrumentedAnalysisContextImpl context =
-        new InstrumentedAnalysisContextImpl.con1(
-            new TestAnalysisContext_test_getHtmlSources(invoked));
+        new InstrumentedAnalysisContextImpl.con1(innerContext);
     context.htmlSources;
-    JUnitTestCase.assertTrue(invoked[0]);
+    expect(innerContext.invoked, isTrue);
   }
 
   void test_getKindOf() {
-    List<bool> invoked = [false];
+    TestAnalysisContext_test_getKindOf innerContext = new TestAnalysisContext_test_getKindOf();
     InstrumentedAnalysisContextImpl context =
-        new InstrumentedAnalysisContextImpl.con1(
-            new TestAnalysisContext_test_getKindOf(invoked));
+        new InstrumentedAnalysisContextImpl.con1(innerContext);
     context.getKindOf(null);
-    JUnitTestCase.assertTrue(invoked[0]);
+    expect(innerContext.invoked, isTrue);
   }
 
   void test_getLaunchableClientLibrarySources() {
-    List<bool> invoked = [false];
+    TestAnalysisContext_test_getLaunchableClientLibrarySources innerContext = new TestAnalysisContext_test_getLaunchableClientLibrarySources();
     InstrumentedAnalysisContextImpl context =
-        new InstrumentedAnalysisContextImpl.con1(
-            new TestAnalysisContext_test_getLaunchableClientLibrarySources(invoked));
+        new InstrumentedAnalysisContextImpl.con1(innerContext);
     context.launchableClientLibrarySources;
-    JUnitTestCase.assertTrue(invoked[0]);
+    expect(innerContext.invoked, isTrue);
   }
 
   void test_getLaunchableServerLibrarySources() {
-    List<bool> invoked = [false];
+    TestAnalysisContext_test_getLaunchableServerLibrarySources innerContext = new TestAnalysisContext_test_getLaunchableServerLibrarySources();
     InstrumentedAnalysisContextImpl context =
-        new InstrumentedAnalysisContextImpl.con1(
-            new TestAnalysisContext_test_getLaunchableServerLibrarySources(invoked));
+        new InstrumentedAnalysisContextImpl.con1(innerContext);
     context.launchableServerLibrarySources;
-    JUnitTestCase.assertTrue(invoked[0]);
+    expect(innerContext.invoked, isTrue);
   }
 
   void test_getLibrariesContaining() {
-    List<bool> invoked = [false];
+    TestAnalysisContext_test_getLibrariesContaining innerContext = new TestAnalysisContext_test_getLibrariesContaining();
     InstrumentedAnalysisContextImpl context =
-        new InstrumentedAnalysisContextImpl.con1(
-            new TestAnalysisContext_test_getLibrariesContaining(invoked));
+        new InstrumentedAnalysisContextImpl.con1(innerContext);
     context.getLibrariesContaining(null);
-    JUnitTestCase.assertTrue(invoked[0]);
+    expect(innerContext.invoked, isTrue);
   }
 
   void test_getLibrariesDependingOn() {
-    List<bool> invoked = [false];
+    TestAnalysisContext_test_getLibrariesDependingOn innerContext = new TestAnalysisContext_test_getLibrariesDependingOn();
     InstrumentedAnalysisContextImpl context =
-        new InstrumentedAnalysisContextImpl.con1(
-            new TestAnalysisContext_test_getLibrariesDependingOn(invoked));
+        new InstrumentedAnalysisContextImpl.con1(innerContext);
     context.getLibrariesDependingOn(null);
-    JUnitTestCase.assertTrue(invoked[0]);
+    expect(innerContext.invoked, isTrue);
   }
 
   void test_getLibrariesReferencedFromHtml() {
-    List<bool> invoked = [false];
+    TestAnalysisContext_test_getLibrariesReferencedFromHtml innerContext = new TestAnalysisContext_test_getLibrariesReferencedFromHtml();
     InstrumentedAnalysisContextImpl context =
-        new InstrumentedAnalysisContextImpl.con1(
-            new TestAnalysisContext_test_getLibrariesReferencedFromHtml(invoked));
+        new InstrumentedAnalysisContextImpl.con1(innerContext);
     context.getLibrariesReferencedFromHtml(null);
-    JUnitTestCase.assertTrue(invoked[0]);
+    expect(innerContext.invoked, isTrue);
   }
 
   void test_getLibraryElement() {
-    List<bool> invoked = [false];
+    TestAnalysisContext_test_getLibraryElement innerContext = new TestAnalysisContext_test_getLibraryElement();
     InstrumentedAnalysisContextImpl context =
-        new InstrumentedAnalysisContextImpl.con1(
-            new TestAnalysisContext_test_getLibraryElement(invoked));
+        new InstrumentedAnalysisContextImpl.con1(innerContext);
     context.getLibraryElement(null);
-    JUnitTestCase.assertTrue(invoked[0]);
+    expect(innerContext.invoked, isTrue);
   }
 
   void test_getLibrarySources() {
-    List<bool> invoked = [false];
+    TestAnalysisContext_test_getLibrarySources innerContext = new TestAnalysisContext_test_getLibrarySources();
     InstrumentedAnalysisContextImpl context =
-        new InstrumentedAnalysisContextImpl.con1(
-            new TestAnalysisContext_test_getLibrarySources(invoked));
+        new InstrumentedAnalysisContextImpl.con1(innerContext);
     context.librarySources;
-    JUnitTestCase.assertTrue(invoked[0]);
+    expect(innerContext.invoked, isTrue);
   }
 
   void test_getLineInfo() {
-    List<bool> invoked = [false];
+    TestAnalysisContext_test_getLineInfo innerContext = new TestAnalysisContext_test_getLineInfo();
     InstrumentedAnalysisContextImpl context =
-        new InstrumentedAnalysisContextImpl.con1(
-            new TestAnalysisContext_test_getLineInfo(invoked));
+        new InstrumentedAnalysisContextImpl.con1(innerContext);
     context.getLineInfo(null);
-    JUnitTestCase.assertTrue(invoked[0]);
+    expect(innerContext.invoked, isTrue);
   }
 
   void test_getModificationStamp() {
-    List<bool> invoked = [false];
+    TestAnalysisContext_test_getModificationStamp innerContext = new TestAnalysisContext_test_getModificationStamp();
     InstrumentedAnalysisContextImpl context =
-        new InstrumentedAnalysisContextImpl.con1(
-            new TestAnalysisContext_test_getModificationStamp(invoked));
+        new InstrumentedAnalysisContextImpl.con1(innerContext);
     context.getModificationStamp(null);
-    JUnitTestCase.assertTrue(invoked[0]);
+    expect(innerContext.invoked, isTrue);
   }
 
   void test_getPublicNamespace() {
-    List<bool> invoked = [false];
+    TestAnalysisContext_test_getPublicNamespace innerContext = new TestAnalysisContext_test_getPublicNamespace();
     InstrumentedAnalysisContextImpl context =
-        new InstrumentedAnalysisContextImpl.con1(
-            new TestAnalysisContext_test_getPublicNamespace(invoked));
+        new InstrumentedAnalysisContextImpl.con1(innerContext);
     context.getPublicNamespace(null);
-    JUnitTestCase.assertTrue(invoked[0]);
+    expect(innerContext.invoked, isTrue);
   }
 
   void test_getRefactoringUnsafeSources() {
-    List<bool> invoked = [false];
+    TestAnalysisContext_test_getRefactoringUnsafeSources innerContext = new TestAnalysisContext_test_getRefactoringUnsafeSources();
     InstrumentedAnalysisContextImpl context =
-        new InstrumentedAnalysisContextImpl.con1(
-            new TestAnalysisContext_test_getRefactoringUnsafeSources(invoked));
+        new InstrumentedAnalysisContextImpl.con1(innerContext);
     context.refactoringUnsafeSources;
-    JUnitTestCase.assertTrue(invoked[0]);
+    expect(innerContext.invoked, isTrue);
   }
 
   void test_getResolvedCompilationUnit_element() {
-    List<bool> invoked = [false];
+    TestAnalysisContext_test_getResolvedCompilationUnit_element innerContext = new TestAnalysisContext_test_getResolvedCompilationUnit_element();
     InstrumentedAnalysisContextImpl context =
-        new InstrumentedAnalysisContextImpl.con1(
-            new TestAnalysisContext_test_getResolvedCompilationUnit_element(invoked));
+        new InstrumentedAnalysisContextImpl.con1(innerContext);
     context.getResolvedCompilationUnit(null, null);
-    JUnitTestCase.assertTrue(invoked[0]);
+    expect(innerContext.invoked, isTrue);
   }
 
   void test_getResolvedCompilationUnit_source() {
-    List<bool> invoked = [false];
+    TestAnalysisContext_test_getResolvedCompilationUnit_source innerContext = new TestAnalysisContext_test_getResolvedCompilationUnit_source();
     InstrumentedAnalysisContextImpl context =
-        new InstrumentedAnalysisContextImpl.con1(
-            new TestAnalysisContext_test_getResolvedCompilationUnit_source(invoked));
+        new InstrumentedAnalysisContextImpl.con1(innerContext);
     context.getResolvedCompilationUnit2(null, null);
-    JUnitTestCase.assertTrue(invoked[0]);
+    expect(innerContext.invoked, isTrue);
   }
 
   void test_getResolvedHtmlUnit() {
-    List<bool> invoked = [false];
+    TestAnalysisContext_test_getResolvedHtmlUnit innerContext = new TestAnalysisContext_test_getResolvedHtmlUnit();
     InstrumentedAnalysisContextImpl context =
-        new InstrumentedAnalysisContextImpl.con1(
-            new TestAnalysisContext_test_getResolvedHtmlUnit(invoked));
+        new InstrumentedAnalysisContextImpl.con1(innerContext);
     context.getResolvedHtmlUnit(null);
-    JUnitTestCase.assertTrue(invoked[0]);
+    expect(innerContext.invoked, isTrue);
   }
 
   void test_getSourceFactory() {
-    List<bool> invoked = [false];
+    TestAnalysisContext_test_getSourceFactory innerContext = new TestAnalysisContext_test_getSourceFactory();
     InstrumentedAnalysisContextImpl context =
-        new InstrumentedAnalysisContextImpl.con1(
-            new TestAnalysisContext_test_getSourceFactory(invoked));
+        new InstrumentedAnalysisContextImpl.con1(innerContext);
     context.sourceFactory;
-    JUnitTestCase.assertTrue(invoked[0]);
+    expect(innerContext.invoked, isTrue);
   }
 
   void test_getStatistics() {
-    List<bool> invoked = [false];
+    TestAnalysisContext_test_getStatistics innerContext = new TestAnalysisContext_test_getStatistics();
     InstrumentedAnalysisContextImpl context =
-        new InstrumentedAnalysisContextImpl.con1(
-            new TestAnalysisContext_test_getStatistics(invoked));
+        new InstrumentedAnalysisContextImpl.con1(innerContext);
     context.statistics;
-    JUnitTestCase.assertTrue(invoked[0]);
+    expect(innerContext.invoked, isTrue);
   }
 
   void test_getTypeProvider() {
-    List<bool> invoked = [false];
+    TestAnalysisContext_test_getTypeProvider innerContext = new TestAnalysisContext_test_getTypeProvider();
     InstrumentedAnalysisContextImpl context =
-        new InstrumentedAnalysisContextImpl.con1(
-            new TestAnalysisContext_test_getTypeProvider(invoked));
+        new InstrumentedAnalysisContextImpl.con1(innerContext);
     context.typeProvider;
-    JUnitTestCase.assertTrue(invoked[0]);
+    expect(innerContext.invoked, isTrue);
   }
 
   void test_isClientLibrary() {
-    List<bool> invoked = [false];
+    TestAnalysisContext_test_isClientLibrary innerContext = new TestAnalysisContext_test_isClientLibrary();
     InstrumentedAnalysisContextImpl context =
-        new InstrumentedAnalysisContextImpl.con1(
-            new TestAnalysisContext_test_isClientLibrary(invoked));
+        new InstrumentedAnalysisContextImpl.con1(innerContext);
     context.isClientLibrary(null);
-    JUnitTestCase.assertTrue(invoked[0]);
+    expect(innerContext.invoked, isTrue);
   }
 
   void test_isDisposed() {
-    List<bool> invoked = [false];
+    TestAnalysisContext_test_isDisposed innerContext = new TestAnalysisContext_test_isDisposed();
     InstrumentedAnalysisContextImpl context =
-        new InstrumentedAnalysisContextImpl.con1(
-            new TestAnalysisContext_test_isDisposed(invoked));
+        new InstrumentedAnalysisContextImpl.con1(innerContext);
     context.isDisposed;
-    JUnitTestCase.assertTrue(invoked[0]);
+    expect(innerContext.invoked, isTrue);
   }
 
   void test_isServerLibrary() {
-    List<bool> invoked = [false];
+    TestAnalysisContext_test_isServerLibrary innerContext = new TestAnalysisContext_test_isServerLibrary();
     InstrumentedAnalysisContextImpl context =
-        new InstrumentedAnalysisContextImpl.con1(
-            new TestAnalysisContext_test_isServerLibrary(invoked));
+        new InstrumentedAnalysisContextImpl.con1(innerContext);
     context.isServerLibrary(null);
-    JUnitTestCase.assertTrue(invoked[0]);
+    expect(innerContext.invoked, isTrue);
   }
 
   void test_parseCompilationUnit() {
-    List<bool> invoked = [false];
+    TestAnalysisContext_test_parseCompilationUnit innerContext = new TestAnalysisContext_test_parseCompilationUnit();
     InstrumentedAnalysisContextImpl context =
-        new InstrumentedAnalysisContextImpl.con1(
-            new TestAnalysisContext_test_parseCompilationUnit(invoked));
+        new InstrumentedAnalysisContextImpl.con1(innerContext);
     context.parseCompilationUnit(null);
-    JUnitTestCase.assertTrue(invoked[0]);
+    expect(innerContext.invoked, isTrue);
   }
 
   void test_parseHtmlUnit() {
-    List<bool> invoked = [false];
+    TestAnalysisContext_test_parseHtmlUnit innerContext = new TestAnalysisContext_test_parseHtmlUnit();
     InstrumentedAnalysisContextImpl context =
-        new InstrumentedAnalysisContextImpl.con1(
-            new TestAnalysisContext_test_parseHtmlUnit(invoked));
+        new InstrumentedAnalysisContextImpl.con1(innerContext);
     context.parseHtmlUnit(null);
-    JUnitTestCase.assertTrue(invoked[0]);
+    expect(innerContext.invoked, isTrue);
   }
 
   void test_performAnalysisTask() {
-    List<bool> invoked = [false];
+    TestAnalysisContext_test_performAnalysisTask innerContext = new TestAnalysisContext_test_performAnalysisTask();
     InstrumentedAnalysisContextImpl context =
-        new InstrumentedAnalysisContextImpl.con1(
-            new TestAnalysisContext_test_performAnalysisTask(invoked));
+        new InstrumentedAnalysisContextImpl.con1(innerContext);
     context.performAnalysisTask();
-    JUnitTestCase.assertTrue(invoked[0]);
+    expect(innerContext.invoked, isTrue);
   }
 
   void test_recordLibraryElements() {
-    List<bool> invoked = [false];
+    TestAnalysisContext_test_recordLibraryElements innerContext = new TestAnalysisContext_test_recordLibraryElements();
     InstrumentedAnalysisContextImpl context =
-        new InstrumentedAnalysisContextImpl.con1(
-            new TestAnalysisContext_test_recordLibraryElements(invoked));
+        new InstrumentedAnalysisContextImpl.con1(innerContext);
     context.recordLibraryElements(null);
-    JUnitTestCase.assertTrue(invoked[0]);
+    expect(innerContext.invoked, isTrue);
   }
 
   void test_resolveCompilationUnit() {
-    List<bool> invoked = [false];
+    TestAnalysisContext_test_resolveCompilationUnit innerContext = new TestAnalysisContext_test_resolveCompilationUnit();
     InstrumentedAnalysisContextImpl context =
-        new InstrumentedAnalysisContextImpl.con1(
-            new TestAnalysisContext_test_resolveCompilationUnit(invoked));
+        new InstrumentedAnalysisContextImpl.con1(innerContext);
     context.resolveCompilationUnit2(null, null);
-    JUnitTestCase.assertTrue(invoked[0]);
+    expect(innerContext.invoked, isTrue);
   }
 
   void test_resolveCompilationUnit_element() {
-    List<bool> invoked = [false];
+    TestAnalysisContext_test_resolveCompilationUnit_element innerContext = new TestAnalysisContext_test_resolveCompilationUnit_element();
     InstrumentedAnalysisContextImpl context =
-        new InstrumentedAnalysisContextImpl.con1(
-            new TestAnalysisContext_test_resolveCompilationUnit_element(invoked));
+        new InstrumentedAnalysisContextImpl.con1(innerContext);
     context.resolveCompilationUnit(null, null);
-    JUnitTestCase.assertTrue(invoked[0]);
+    expect(innerContext.invoked, isTrue);
   }
 
   void test_resolveHtmlUnit() {
-    List<bool> invoked = [false];
+    TestAnalysisContext_test_resolveHtmlUnit innerContext = new TestAnalysisContext_test_resolveHtmlUnit();
     InstrumentedAnalysisContextImpl context =
-        new InstrumentedAnalysisContextImpl.con1(
-            new TestAnalysisContext_test_resolveHtmlUnit(invoked));
+        new InstrumentedAnalysisContextImpl.con1(innerContext);
     context.resolveHtmlUnit(null);
-    JUnitTestCase.assertTrue(invoked[0]);
+    expect(innerContext.invoked, isTrue);
   }
 
   void test_setAnalysisOptions() {
-    List<bool> invoked = [false];
+    TestAnalysisContext_test_setAnalysisOptions innerContext = new TestAnalysisContext_test_setAnalysisOptions();
     InstrumentedAnalysisContextImpl context =
-        new InstrumentedAnalysisContextImpl.con1(
-            new TestAnalysisContext_test_setAnalysisOptions(invoked));
+        new InstrumentedAnalysisContextImpl.con1(innerContext);
     context.analysisOptions = null;
-    JUnitTestCase.assertTrue(invoked[0]);
+    expect(innerContext.invoked, isTrue);
   }
 
   void test_setAnalysisPriorityOrder() {
-    List<bool> invoked = [false];
+    TestAnalysisContext_test_setAnalysisPriorityOrder innerContext = new TestAnalysisContext_test_setAnalysisPriorityOrder();
     InstrumentedAnalysisContextImpl context =
-        new InstrumentedAnalysisContextImpl.con1(
-            new TestAnalysisContext_test_setAnalysisPriorityOrder(invoked));
+        new InstrumentedAnalysisContextImpl.con1(innerContext);
     context.analysisPriorityOrder = null;
-    JUnitTestCase.assertTrue(invoked[0]);
+    expect(innerContext.invoked, isTrue);
   }
 
   void test_setChangedContents() {
-    List<bool> invoked = [false];
+    TestAnalysisContext_test_setChangedContents innerContext = new TestAnalysisContext_test_setChangedContents();
     InstrumentedAnalysisContextImpl context =
-        new InstrumentedAnalysisContextImpl.con1(
-            new TestAnalysisContext_test_setChangedContents(invoked));
+        new InstrumentedAnalysisContextImpl.con1(innerContext);
     context.setChangedContents(null, null, 0, 0, 0);
-    JUnitTestCase.assertTrue(invoked[0]);
+    expect(innerContext.invoked, isTrue);
   }
 
   void test_setContents() {
-    List<bool> invoked = [false];
+    TestAnalysisContext_test_setContents innerContext = new TestAnalysisContext_test_setContents();
     InstrumentedAnalysisContextImpl context =
-        new InstrumentedAnalysisContextImpl.con1(
-            new TestAnalysisContext_test_setContents(invoked));
+        new InstrumentedAnalysisContextImpl.con1(innerContext);
     context.setContents(null, null);
-    JUnitTestCase.assertTrue(invoked[0]);
+    expect(innerContext.invoked, isTrue);
   }
 
   void test_setSourceFactory() {
-    List<bool> invoked = [false];
+    TestAnalysisContext_test_setSourceFactory innerContext = new TestAnalysisContext_test_setSourceFactory();
     InstrumentedAnalysisContextImpl context =
-        new InstrumentedAnalysisContextImpl.con1(
-            new TestAnalysisContext_test_setSourceFactory(invoked));
+        new InstrumentedAnalysisContextImpl.con1(innerContext);
     context.sourceFactory = null;
-    JUnitTestCase.assertTrue(invoked[0]);
+    expect(innerContext.invoked, isTrue);
   }
 }
 
@@ -5134,38 +4512,38 @@
 class ParseDartTaskTest extends EngineTestCase {
   void test_accept() {
     ParseDartTask task = new ParseDartTask(null, null, null, null);
-    JUnitTestCase.assertTrue(task.accept(new ParseDartTaskTestTV_accept()));
+    expect(task.accept(new ParseDartTaskTestTV_accept()), isTrue);
   }
 
   void test_getCompilationUnit() {
     ParseDartTask task = new ParseDartTask(null, null, null, null);
-    JUnitTestCase.assertNull(task.compilationUnit);
+    expect(task.compilationUnit, isNull);
   }
 
   void test_getErrors() {
     ParseDartTask task = new ParseDartTask(null, null, null, null);
-    EngineTestCase.assertLength(0, task.errors);
+    expect(task.errors, hasLength(0));
   }
 
   void test_getException() {
     ParseDartTask task = new ParseDartTask(null, null, null, null);
-    JUnitTestCase.assertNull(task.exception);
+    expect(task.exception, isNull);
   }
 
   void test_getSource() {
     Source source = new TestSource('/test.dart');
     ParseDartTask task = new ParseDartTask(null, source, null, null);
-    JUnitTestCase.assertSame(source, task.source);
+    expect(task.source, same(source));
   }
 
   void test_hasNonPartOfDirective() {
     ParseDartTask task = new ParseDartTask(null, null, null, null);
-    JUnitTestCase.assertFalse(task.hasNonPartOfDirective);
+    expect(task.hasNonPartOfDirective, isFalse);
   }
 
   void test_hasPartOfDirective() {
     ParseDartTask task = new ParseDartTask(null, null, null, null);
-    JUnitTestCase.assertFalse(task.hasPartOfDirective);
+    expect(task.hasPartOfDirective, isFalse);
   }
 
   void test_perform_exception() {
@@ -5178,13 +4556,12 @@
   }
 
   void test_perform_library() {
-    String content = EngineTestCase.createSource(
-        [
-            "library lib;",
-            "import 'lib2.dart';",
-            "export 'lib3.dart';",
-            "part 'part.dart';",
-            "class A {"]);
+    String content = r'''
+library lib;
+import 'lib2.dart';
+export 'lib3.dart';
+part 'part.dart';
+class A {''';
     Source source = new TestSource('/test.dart', content);
     InternalAnalysisContext context = new AnalysisContextImpl();
     context.sourceFactory = new SourceFactory([new FileUriResolver()]);
@@ -5194,7 +4571,9 @@
 
   void test_perform_part() {
     String content =
-        EngineTestCase.createSource(["part of lib;", "class B {}"]);
+        r'''
+part of lib;
+class B {}''';
     Source source = new TestSource('/test.dart', content);
     InternalAnalysisContext context = new AnalysisContextImpl();
     context.sourceFactory = new SourceFactory([new FileUriResolver()]);
@@ -5203,14 +4582,13 @@
   }
 
   void test_perform_validateDirectives() {
-    String content = EngineTestCase.createSource(
-        [
-            "library lib;",
-            "import '/does/not/exist.dart';",
-            "import '://invaliduri.dart';",
-            "export '\${a}lib3.dart';",
-            "part 'part.dart';",
-            "class A {}"]);
+    String content = r'''
+library lib;
+import '/does/not/exist.dart';
+import '://invaliduri.dart';
+export '${a}lib3.dart';
+part 'part.dart';
+class A {}''';
     Source source = new TestSource('/test.dart', content);
     InternalAnalysisContext context = new AnalysisContextImpl();
     context.sourceFactory = new SourceFactory([new FileUriResolver()]);
@@ -5260,7 +4638,7 @@
 class ParseDartTaskTestTV_perform_exception extends TestTaskVisitor<bool> {
   @override
   bool visitParseDartTask(ParseDartTask task) {
-    JUnitTestCase.assertNotNull(task.exception);
+    expect(task.exception, isNotNull);
     return true;
   }
 }
@@ -5276,11 +4654,11 @@
     if (exception != null) {
       throw exception;
     }
-    JUnitTestCase.assertNotNull(task.compilationUnit);
-    EngineTestCase.assertLength(1, task.errors);
-    JUnitTestCase.assertSame(source, task.source);
-    JUnitTestCase.assertTrue(task.hasNonPartOfDirective);
-    JUnitTestCase.assertFalse(task.hasPartOfDirective);
+    expect(task.compilationUnit, isNotNull);
+    expect(task.errors, hasLength(1));
+    expect(task.source, same(source));
+    expect(task.hasNonPartOfDirective, isTrue);
+    expect(task.hasPartOfDirective, isFalse);
     return null;
   }
 }
@@ -5296,11 +4674,11 @@
     if (exception != null) {
       throw exception;
     }
-    JUnitTestCase.assertNotNull(task.compilationUnit);
-    EngineTestCase.assertLength(0, task.errors);
-    JUnitTestCase.assertSame(source, task.source);
-    JUnitTestCase.assertFalse(task.hasNonPartOfDirective);
-    JUnitTestCase.assertTrue(task.hasPartOfDirective);
+    expect(task.compilationUnit, isNotNull);
+    expect(task.errors, hasLength(0));
+    expect(task.source, same(source));
+    expect(task.hasNonPartOfDirective, isFalse);
+    expect(task.hasPartOfDirective, isTrue);
     return null;
   }
 }
@@ -5317,16 +4695,16 @@
     if (exception != null) {
       throw exception;
     }
-    JUnitTestCase.assertNotNull(task.compilationUnit);
+    expect(task.compilationUnit, isNotNull);
     GatheringErrorListener errorListener = new GatheringErrorListener();
     errorListener.addAll(task.errors);
     errorListener.assertErrorsWithCodes(
         [
             CompileTimeErrorCode.URI_WITH_INTERPOLATION,
             CompileTimeErrorCode.INVALID_URI]);
-    JUnitTestCase.assertSame(source, task.source);
-    JUnitTestCase.assertTrue(task.hasNonPartOfDirective);
-    JUnitTestCase.assertFalse(task.hasPartOfDirective);
+    expect(task.source, same(source));
+    expect(task.hasNonPartOfDirective, isTrue);
+    expect(task.hasPartOfDirective, isFalse);
     return null;
   }
 }
@@ -5361,106 +4739,102 @@
 
   void test_accept() {
     ParseHtmlTask task = new ParseHtmlTask(null, null, "");
-    JUnitTestCase.assertTrue(task.accept(new ParseHtmlTaskTestTV_accept()));
+    expect(task.accept(new ParseHtmlTaskTestTV_accept()), isTrue);
   }
 
   void test_getException() {
     ParseHtmlTask task = new ParseHtmlTask(null, null, "");
-    JUnitTestCase.assertNull(task.exception);
+    expect(task.exception, isNull);
   }
 
   void test_getHtmlUnit() {
     ParseHtmlTask task = new ParseHtmlTask(null, null, "");
-    JUnitTestCase.assertNull(task.htmlUnit);
+    expect(task.htmlUnit, isNull);
   }
 
   void test_getLineInfo() {
     ParseHtmlTask task = new ParseHtmlTask(null, null, "");
-    JUnitTestCase.assertNull(task.lineInfo);
+    expect(task.lineInfo, isNull);
   }
 
   void test_getReferencedLibraries() {
     ParseHtmlTask task = new ParseHtmlTask(null, null, "");
-    EngineTestCase.assertLength(0, task.referencedLibraries);
+    expect(task.referencedLibraries, hasLength(0));
   }
 
   void test_getSource() {
     Source source = new TestSource('/test.dart');
     ParseHtmlTask task = new ParseHtmlTask(null, source, "");
-    JUnitTestCase.assertSame(source, task.source);
+    expect(task.source, same(source));
   }
 
   void test_perform_embedded_source() {
-    String contents = EngineTestCase.createSource(
-        [
-            "<html>",
-            "<head>",
-            "  <script type='application/dart'>",
-            "    void buttonPressed() {}",
-            "  </script>",
-            "</head>",
-            "<body>",
-            "</body>",
-            "</html>"]);
+    String contents = r'''
+<html>
+<head>
+  <script type='application/dart'>
+    void buttonPressed() {}
+  </script>
+</head>
+<body>
+</body>
+</html>''';
     TestLogger testLogger = new TestLogger();
     ParseHtmlTask task = parseContents(contents, testLogger);
-    EngineTestCase.assertLength(0, task.referencedLibraries);
-    JUnitTestCase.assertEquals(0, testLogger.errorCount);
-    JUnitTestCase.assertEquals(0, testLogger.infoCount);
+    expect(task.referencedLibraries, hasLength(0));
+    expect(testLogger.errorCount, 0);
+    expect(testLogger.infoCount, 0);
   }
 
   void test_perform_empty_source_reference() {
-    String contents = EngineTestCase.createSource(
-        [
-            "<html>",
-            "<head>",
-            "  <script type='application/dart' src=''/>",
-            "</head>",
-            "<body>",
-            "</body>",
-            "</html>"]);
+    String contents = r'''
+<html>
+<head>
+  <script type='application/dart' src=''/>
+</head>
+<body>
+</body>
+</html>''';
     TestLogger testLogger = new TestLogger();
     ParseHtmlTask task = parseContents(contents, testLogger);
-    EngineTestCase.assertLength(0, task.referencedLibraries);
-    JUnitTestCase.assertEquals(0, testLogger.errorCount);
-    JUnitTestCase.assertEquals(0, testLogger.infoCount);
+    expect(task.referencedLibraries, hasLength(0));
+    expect(testLogger.errorCount, 0);
+    expect(testLogger.infoCount, 0);
   }
 
   void test_perform_invalid_source_reference() {
-    String contents = EngineTestCase.createSource(
-        [
-            "<html>",
-            "<head>",
-            "  <script type='application/dart' src='an;invalid:[]uri'/>",
-            "</head>",
-            "<body>",
-            "</body>",
-            "</html>"]);
+    String contents = r'''
+<html>
+<head>
+  <script type='application/dart' src='an;invalid:[]uri'/>
+</head>
+<body>
+</body>
+</html>''';
     TestLogger testLogger = new TestLogger();
     ParseHtmlTask task = parseContents(contents, testLogger);
-    EngineTestCase.assertLength(0, task.referencedLibraries);
-    JUnitTestCase.assertEquals(0, testLogger.errorCount);
-    JUnitTestCase.assertEquals(0, testLogger.infoCount);
+    expect(task.referencedLibraries, hasLength(0));
+    expect(testLogger.errorCount, 0);
+    expect(testLogger.infoCount, 0);
   }
 
   void test_perform_non_existing_source_reference() {
-    String contents = EngineTestCase.createSource(
-        [
-            "<html>",
-            "<head>",
-            "  <script type='application/dart' src='does/not/exist.dart'/>",
-            "</head>",
-            "<body>",
-            "</body>",
-            "</html>"]);
+    String contents = r'''
+<html>
+<head>
+  <script type='application/dart' src='does/not/exist.dart'/>
+</head>
+<body>
+</body>
+</html>''';
     TestLogger testLogger = new TestLogger();
     ParseHtmlTask task = parseSource(
         new ParseHtmlTaskTest_non_existing_source(contents),
         contents,
         testLogger);
-    EngineTestCase.assertLength(0, task.referencedLibraries);
-    JUnitTestCase.assertEquals(0, testLogger.errorCount);
-    JUnitTestCase.assertEquals(0, testLogger.infoCount);
+    expect(task.referencedLibraries, hasLength(0));
+    expect(testLogger.errorCount, 0);
+    expect(testLogger.infoCount, 0);
   }
 
   void test_perform_referenced_source() {
@@ -5501,9 +4875,9 @@
     if (exception != null) {
       throw exception;
     }
-    JUnitTestCase.assertNotNull(task.htmlUnit);
-    JUnitTestCase.assertNotNull(task.lineInfo);
-    JUnitTestCase.assertSame(source, task.source);
+    expect(task.htmlUnit, isNotNull);
+    expect(task.lineInfo, isNotNull);
+    expect(task.source, same(source));
     return true;
   }
 }
@@ -5529,24 +4903,24 @@
     SdkCachePartition oldPartition = manager.forSdk(sdk);
     manager.clearCache();
     SdkCachePartition newPartition = manager.forSdk(sdk);
-    JUnitTestCase.assertNotSame(oldPartition, newPartition);
+    expect(newPartition, isNot(same(oldPartition)));
   }
 
   void test_creation() {
-    JUnitTestCase.assertNotNull(new PartitionManager());
+    expect(new PartitionManager(), isNotNull);
   }
 
   void test_forSdk() {
     PartitionManager manager = new PartitionManager();
     DartSdk sdk1 = new MockDartSdk();
     SdkCachePartition partition1 = manager.forSdk(sdk1);
-    JUnitTestCase.assertNotNull(partition1);
-    JUnitTestCase.assertSame(partition1, manager.forSdk(sdk1));
+    expect(partition1, isNotNull);
+    expect(manager.forSdk(sdk1), same(partition1));
     DartSdk sdk2 = new MockDartSdk();
     SdkCachePartition partition2 = manager.forSdk(sdk2);
-    JUnitTestCase.assertNotNull(partition2);
-    JUnitTestCase.assertSame(partition2, manager.forSdk(sdk2));
-    JUnitTestCase.assertNotSame(partition1, partition2);
+    expect(partition2, isNotNull);
+    expect(manager.forSdk(sdk2), same(partition2));
+    expect(partition2, isNot(same(partition1)));
   }
 }
 
@@ -5554,28 +4928,27 @@
 class ResolveDartLibraryTaskTest extends EngineTestCase {
   void test_accept() {
     ResolveDartLibraryTask task = new ResolveDartLibraryTask(null, null, null);
-    JUnitTestCase.assertTrue(
-        task.accept(new ResolveDartLibraryTaskTestTV_accept()));
+    expect(task.accept(new ResolveDartLibraryTaskTestTV_accept()), isTrue);
   }
   void test_getException() {
     ResolveDartLibraryTask task = new ResolveDartLibraryTask(null, null, null);
-    JUnitTestCase.assertNull(task.exception);
+    expect(task.exception, isNull);
   }
   void test_getLibraryResolver() {
     ResolveDartLibraryTask task = new ResolveDartLibraryTask(null, null, null);
-    JUnitTestCase.assertNull(task.libraryResolver);
+    expect(task.libraryResolver, isNull);
   }
   void test_getLibrarySource() {
     Source source = new TestSource('/test.dart');
     ResolveDartLibraryTask task =
         new ResolveDartLibraryTask(null, null, source);
-    JUnitTestCase.assertSame(source, task.librarySource);
+    expect(task.librarySource, same(source));
   }
   void test_getUnitSource() {
     Source source = new TestSource('/test.dart');
     ResolveDartLibraryTask task =
         new ResolveDartLibraryTask(null, source, null);
-    JUnitTestCase.assertSame(source, task.unitSource);
+    expect(task.unitSource, same(source));
   }
   void test_perform_exception() {
     TestSource source = new TestSource();
@@ -5589,7 +4962,9 @@
   void test_perform_library() {
     Source source = new TestSource(
         '/test.dart',
-        EngineTestCase.createSource(["library lib;", "class A {}"]));
+        r'''
+library lib;
+class A {}''');
     InternalAnalysisContext context = AnalysisContextFactory.contextWithCore();
     ResolveDartLibraryTask task =
         new ResolveDartLibraryTask(context, source, source);
@@ -5608,7 +4983,7 @@
     TestTaskVisitor<bool> {
   @override
   bool visitResolveDartLibraryTask(ResolveDartLibraryTask task) {
-    JUnitTestCase.assertNotNull(task.exception);
+    expect(task.exception, isNotNull);
     return true;
   }
 }
@@ -5624,9 +4999,9 @@
     if (exception != null) {
       throw exception;
     }
-    JUnitTestCase.assertNotNull(task.libraryResolver);
-    JUnitTestCase.assertSame(source, task.librarySource);
-    JUnitTestCase.assertSame(source, task.unitSource);
+    expect(task.libraryResolver, isNotNull);
+    expect(task.librarySource, same(source));
+    expect(task.unitSource, same(source));
     return true;
   }
 }
@@ -5635,13 +5010,12 @@
 class ResolveDartUnitTaskTest extends EngineTestCase {
   void test_accept() {
     ResolveDartUnitTask task = new ResolveDartUnitTask(null, null, null);
-    JUnitTestCase.assertTrue(
-        task.accept(new ResolveDartUnitTaskTestTV_accept()));
+    expect(task.accept(new ResolveDartUnitTaskTestTV_accept()), isTrue);
   }
 
   void test_getException() {
     ResolveDartUnitTask task = new ResolveDartUnitTask(null, null, null);
-    JUnitTestCase.assertNull(task.exception);
+    expect(task.exception, isNull);
   }
 
   void test_getLibrarySource() {
@@ -5649,18 +5023,18 @@
     LibraryElementImpl element = ElementFactory.library(context, "lib");
     Source source = element.source;
     ResolveDartUnitTask task = new ResolveDartUnitTask(null, null, element);
-    JUnitTestCase.assertSame(source, task.librarySource);
+    expect(task.librarySource, same(source));
   }
 
   void test_getResolvedUnit() {
     ResolveDartUnitTask task = new ResolveDartUnitTask(null, null, null);
-    JUnitTestCase.assertNull(task.resolvedUnit);
+    expect(task.resolvedUnit, isNull);
   }
 
   void test_getSource() {
     Source source = new TestSource('/test.dart');
     ResolveDartUnitTask task = new ResolveDartUnitTask(null, source, null);
-    JUnitTestCase.assertSame(source, task.source);
+    expect(task.source, same(source));
   }
 
   void test_perform_exception() {
@@ -5690,7 +5064,9 @@
     Source source = unitElement.source;
     context.setContents(
         source,
-        EngineTestCase.createSource(["library lib;", "class A {}"]));
+        r'''
+library lib;
+class A {}''');
     ResolveDartUnitTask task =
         new ResolveDartUnitTask(context, source, libraryElement);
     task.perform(
@@ -5709,7 +5085,7 @@
     {
   @override
   bool visitResolveDartUnitTask(ResolveDartUnitTask task) {
-    JUnitTestCase.assertNotNull(task.exception);
+    expect(task.exception, isNotNull);
     return true;
   }
 }
@@ -5725,9 +5101,9 @@
     if (exception != null) {
       throw exception;
     }
-    JUnitTestCase.assertSame(source, task.librarySource);
-    JUnitTestCase.assertNotNull(task.resolvedUnit);
-    JUnitTestCase.assertSame(source, task.source);
+    expect(task.librarySource, same(source));
+    expect(task.resolvedUnit, isNotNull);
+    expect(task.source, same(source));
     return true;
   }
 }
@@ -5736,28 +5112,28 @@
 class ResolveHtmlTaskTest extends EngineTestCase {
   void test_accept() {
     ResolveHtmlTask task = new ResolveHtmlTask(null, null, 0, null);
-    JUnitTestCase.assertTrue(task.accept(new ResolveHtmlTaskTestTV_accept()));
+    expect(task.accept(new ResolveHtmlTaskTestTV_accept()), isTrue);
   }
 
   void test_getElement() {
     ResolveHtmlTask task = new ResolveHtmlTask(null, null, 0, null);
-    JUnitTestCase.assertNull(task.element);
+    expect(task.element, isNull);
   }
 
   void test_getException() {
     ResolveHtmlTask task = new ResolveHtmlTask(null, null, 0, null);
-    JUnitTestCase.assertNull(task.exception);
+    expect(task.exception, isNull);
   }
 
   void test_getResolutionErrors() {
     ResolveHtmlTask task = new ResolveHtmlTask(null, null, 0, null);
-    EngineTestCase.assertLength(0, task.resolutionErrors);
+    expect(task.resolutionErrors, hasLength(0));
   }
 
   void test_getSource() {
     Source source = new TestSource('test.dart', '');
     ResolveHtmlTask task = new ResolveHtmlTask(null, source, 0, null);
-    JUnitTestCase.assertSame(source, task.source);
+    expect(task.source, same(source));
   }
 
   void test_perform_exception() {
@@ -5770,17 +5146,16 @@
 
   void test_perform_valid() {
     int modificationStamp = 73;
-    String content = EngineTestCase.createSource(
-        [
-            "<html>",
-            "<head>",
-            "  <script type='application/dart'>",
-            "    void f() { x = 0; }",
-            "  </script>",
-            "</head>",
-            "<body>",
-            "</body>",
-            "</html>"]);
+    String content = r'''
+<html>
+<head>
+  <script type='application/dart'>
+    void f() { x = 0; }
+  </script>
+</head>
+<body>
+</body>
+</html>''';
     Source source = new TestSource("/test.html", content);
     InternalAnalysisContext context = AnalysisContextFactory.contextWithCore();
     ParseHtmlTask parseTask =
@@ -5806,7 +5181,7 @@
 class ResolveHtmlTaskTestTV_perform_exception extends TestTaskVisitor<bool> {
   @override
   bool visitResolveHtmlTask(ResolveHtmlTask task) {
-    JUnitTestCase.assertNotNull(task.exception);
+    expect(task.exception, isNotNull);
     return true;
   }
 }
@@ -5822,9 +5197,9 @@
     if (exception != null) {
       throw exception;
     }
-    JUnitTestCase.assertNotNull(task.element);
-    EngineTestCase.assertLength(1, task.resolutionErrors);
-    JUnitTestCase.assertSame(source, task.source);
+    expect(task.element, isNotNull);
+    expect(task.resolutionErrors, hasLength(1));
+    expect(task.source, same(source));
     return null;
   }
 }
@@ -5839,28 +5214,28 @@
 class ScanDartTaskTest extends EngineTestCase {
   void test_accept() {
     ScanDartTask task = new ScanDartTask(null, null, null);
-    JUnitTestCase.assertTrue(task.accept(new ScanDartTaskTestTV_accept()));
+    expect(task.accept(new ScanDartTaskTestTV_accept()), isTrue);
   }
 
   void test_getErrors() {
     ScanDartTask task = new ScanDartTask(null, null, null);
-    EngineTestCase.assertLength(0, task.errors);
+    expect(task.errors, hasLength(0));
   }
 
   void test_getException() {
     ScanDartTask task = new ScanDartTask(null, null, null);
-    JUnitTestCase.assertNull(task.exception);
+    expect(task.exception, isNull);
   }
 
   void test_getLineInfo() {
     ScanDartTask task = new ScanDartTask(null, null, null);
-    JUnitTestCase.assertNull(task.lineInfo);
+    expect(task.lineInfo, isNull);
   }
 
   void test_getSource() {
     Source source = new TestSource('test.dart', '');
     ScanDartTask task = new ScanDartTask(null, source, null);
-    JUnitTestCase.assertSame(source, task.source);
+    expect(task.source, same(source));
   }
 
   void test_perform_valid() {
@@ -5891,10 +5266,10 @@
     if (exception != null) {
       throw exception;
     }
-    JUnitTestCase.assertNotNull(task.tokenStream);
-    EngineTestCase.assertLength(0, task.errors);
-    JUnitTestCase.assertNotNull(task.lineInfo);
-    JUnitTestCase.assertSame(source, task.source);
+    expect(task.tokenStream, isNotNull);
+    expect(task.errors, hasLength(0));
+    expect(task.lineInfo, isNotNull);
+    expect(task.source, same(source));
     return true;
   }
 }
@@ -5904,7 +5279,7 @@
   void test_contains_false() {
     SdkCachePartition partition = new SdkCachePartition(null, 8);
     Source source = new TestSource();
-    JUnitTestCase.assertFalse(partition.contains(source));
+    expect(partition.contains(source), isFalse);
   }
 
   void test_contains_true() {
@@ -5912,11 +5287,11 @@
     SourceFactory factory =
         new SourceFactory([new DartUriResolver(DirectoryBasedDartSdk.defaultSdk)]);
     Source source = factory.forUri("dart:core");
-    JUnitTestCase.assertTrue(partition.contains(source));
+    expect(partition.contains(source), isTrue);
   }
 
   void test_creation() {
-    JUnitTestCase.assertNotNull(new SdkCachePartition(null, 8));
+    expect(new SdkCachePartition(null, 8), isNotNull);
   }
 }
 
@@ -5928,349 +5303,344 @@
 class TestAnalysisContext implements InternalAnalysisContext {
   @override
   AnalysisOptions get analysisOptions {
-    JUnitTestCase.fail("Unexpected invocation of getAnalysisOptions");
+    fail("Unexpected invocation of getAnalysisOptions");
     return null;
   }
   @override
   void set analysisOptions(AnalysisOptions options) {
-    JUnitTestCase.fail("Unexpected invocation of setAnalysisOptions");
+    fail("Unexpected invocation of setAnalysisOptions");
   }
   @override
   void set analysisPriorityOrder(List<Source> sources) {
-    JUnitTestCase.fail("Unexpected invocation of setAnalysisPriorityOrder");
+    fail("Unexpected invocation of setAnalysisPriorityOrder");
   }
   @override
   DeclaredVariables get declaredVariables {
-    JUnitTestCase.fail("Unexpected invocation of getDeclaredVariables");
+    fail("Unexpected invocation of getDeclaredVariables");
     return null;
   }
   @override
   List<Source> get htmlSources {
-    JUnitTestCase.fail("Unexpected invocation of getHtmlSources");
+    fail("Unexpected invocation of getHtmlSources");
     return null;
   }
   @override
   bool get isDisposed {
-    JUnitTestCase.fail("Unexpected invocation of isDisposed");
+    fail("Unexpected invocation of isDisposed");
     return false;
   }
   @override
   List<Source> get launchableClientLibrarySources {
-    JUnitTestCase.fail(
-        "Unexpected invocation of getLaunchableClientLibrarySources");
+    fail("Unexpected invocation of getLaunchableClientLibrarySources");
     return null;
   }
   @override
   List<Source> get launchableServerLibrarySources {
-    JUnitTestCase.fail(
-        "Unexpected invocation of getLaunchableServerLibrarySources");
+    fail("Unexpected invocation of getLaunchableServerLibrarySources");
     return null;
   }
   @override
   List<Source> get librarySources {
-    JUnitTestCase.fail("Unexpected invocation of getLibrarySources");
+    fail("Unexpected invocation of getLibrarySources");
     return null;
   }
   @override
   List<Source> get prioritySources {
-    JUnitTestCase.fail("Unexpected invocation of getPrioritySources");
+    fail("Unexpected invocation of getPrioritySources");
     return null;
   }
   @override
   List<Source> get refactoringUnsafeSources {
-    JUnitTestCase.fail("Unexpected invocation of getRefactoringUnsafeSources");
+    fail("Unexpected invocation of getRefactoringUnsafeSources");
     return null;
   }
   @override
   SourceFactory get sourceFactory {
-    JUnitTestCase.fail("Unexpected invocation of getSourceFactory");
+    fail("Unexpected invocation of getSourceFactory");
     return null;
   }
   @override
   void set sourceFactory(SourceFactory factory) {
-    JUnitTestCase.fail("Unexpected invocation of setSourceFactory");
+    fail("Unexpected invocation of setSourceFactory");
   }
   @override
   AnalysisContextStatistics get statistics {
-    JUnitTestCase.fail("Unexpected invocation of getStatistics");
+    fail("Unexpected invocation of getStatistics");
     return null;
   }
   @override
   TypeProvider get typeProvider {
-    JUnitTestCase.fail("Unexpected invocation of getTypeProvider");
+    fail("Unexpected invocation of getTypeProvider");
     return null;
   }
   @override
   void addListener(AnalysisListener listener) {
-    JUnitTestCase.fail("Unexpected invocation of addListener");
+    fail("Unexpected invocation of addListener");
   }
   @override
   void addSourceInfo(Source source, SourceEntry info) {
-    JUnitTestCase.fail("Unexpected invocation of addSourceInfo");
+    fail("Unexpected invocation of addSourceInfo");
   }
   @override
   void applyAnalysisDelta(AnalysisDelta delta) {
-    JUnitTestCase.fail("Unexpected invocation of applyAnalysisDelta");
+    fail("Unexpected invocation of applyAnalysisDelta");
   }
   @override
   void applyChanges(ChangeSet changeSet) {
-    JUnitTestCase.fail("Unexpected invocation of applyChanges");
+    fail("Unexpected invocation of applyChanges");
   }
   @override
   String computeDocumentationComment(Element element) {
-    JUnitTestCase.fail("Unexpected invocation of computeDocumentationComment");
+    fail("Unexpected invocation of computeDocumentationComment");
     return null;
   }
   @override
   List<AnalysisError> computeErrors(Source source) {
-    JUnitTestCase.fail("Unexpected invocation of computeErrors");
+    fail("Unexpected invocation of computeErrors");
     return null;
   }
   @override
   List<Source> computeExportedLibraries(Source source) {
-    JUnitTestCase.fail("Unexpected invocation of computeExportedLibraries");
+    fail("Unexpected invocation of computeExportedLibraries");
     return null;
   }
   @override
   HtmlElement computeHtmlElement(Source source) {
-    JUnitTestCase.fail("Unexpected invocation of computeHtmlElement");
+    fail("Unexpected invocation of computeHtmlElement");
     return null;
   }
   @override
   List<Source> computeImportedLibraries(Source source) {
-    JUnitTestCase.fail("Unexpected invocation of computeImportedLibraries");
+    fail("Unexpected invocation of computeImportedLibraries");
     return null;
   }
   @override
   SourceKind computeKindOf(Source source) {
-    JUnitTestCase.fail("Unexpected invocation of computeKindOf");
+    fail("Unexpected invocation of computeKindOf");
     return null;
   }
   @override
   LibraryElement computeLibraryElement(Source source) {
-    JUnitTestCase.fail("Unexpected invocation of computeLibraryElement");
+    fail("Unexpected invocation of computeLibraryElement");
     return null;
   }
   @override
   LineInfo computeLineInfo(Source source) {
-    JUnitTestCase.fail("Unexpected invocation of computeLineInfo");
+    fail("Unexpected invocation of computeLineInfo");
     return null;
   }
   @override
   CompilationUnit computeResolvableCompilationUnit(Source source) {
-    JUnitTestCase.fail(
-        "Unexpected invocation of computeResolvableCompilationUnit");
+    fail("Unexpected invocation of computeResolvableCompilationUnit");
     return null;
   }
   @override
   void dispose() {
-    JUnitTestCase.fail("Unexpected invocation of dispose");
+    fail("Unexpected invocation of dispose");
   }
   @override
   bool exists(Source source) {
-    JUnitTestCase.fail("Unexpected invocation of exists");
+    fail("Unexpected invocation of exists");
     return false;
   }
   @override
   AngularApplication getAngularApplicationWithHtml(Source htmlSource) {
-    JUnitTestCase.fail(
-        "Unexpected invocation of getAngularApplicationWithHtml");
+    fail("Unexpected invocation of getAngularApplicationWithHtml");
     return null;
   }
   @override
   CompilationUnitElement getCompilationUnitElement(Source unitSource,
       Source librarySource) {
-    JUnitTestCase.fail("Unexpected invocation of getCompilationUnitElement");
+    fail("Unexpected invocation of getCompilationUnitElement");
     return null;
   }
   @override
   TimestampedData<String> getContents(Source source) {
-    JUnitTestCase.fail("Unexpected invocation of getContents");
+    fail("Unexpected invocation of getContents");
     return null;
   }
   @override
   InternalAnalysisContext getContextFor(Source source) {
-    JUnitTestCase.fail("Unexpected invocation of getContextFor");
+    fail("Unexpected invocation of getContextFor");
     return null;
   }
   @override
   Element getElement(ElementLocation location) {
-    JUnitTestCase.fail("Unexpected invocation of getElement");
+    fail("Unexpected invocation of getElement");
     return null;
   }
   @override
   AnalysisErrorInfo getErrors(Source source) {
-    JUnitTestCase.fail("Unexpected invocation of getErrors");
+    fail("Unexpected invocation of getErrors");
     return null;
   }
   @override
   HtmlElement getHtmlElement(Source source) {
-    JUnitTestCase.fail("Unexpected invocation of getHtmlElement");
+    fail("Unexpected invocation of getHtmlElement");
     return null;
   }
   @override
   List<Source> getHtmlFilesReferencing(Source source) {
-    JUnitTestCase.fail("Unexpected invocation of getHtmlFilesReferencing");
+    fail("Unexpected invocation of getHtmlFilesReferencing");
     return null;
   }
   @override
   SourceKind getKindOf(Source source) {
-    JUnitTestCase.fail("Unexpected invocation of getKindOf");
+    fail("Unexpected invocation of getKindOf");
     return null;
   }
   @override
   List<Source> getLibrariesContaining(Source source) {
-    JUnitTestCase.fail("Unexpected invocation of getLibrariesContaining");
+    fail("Unexpected invocation of getLibrariesContaining");
     return null;
   }
   @override
   List<Source> getLibrariesDependingOn(Source librarySource) {
-    JUnitTestCase.fail("Unexpected invocation of getLibrariesDependingOn");
+    fail("Unexpected invocation of getLibrariesDependingOn");
     return null;
   }
   @override
   List<Source> getLibrariesReferencedFromHtml(Source htmlSource) {
-    JUnitTestCase.fail(
-        "Unexpected invocation of getLibrariesReferencedFromHtml");
+    fail("Unexpected invocation of getLibrariesReferencedFromHtml");
     return null;
   }
   @override
   LibraryElement getLibraryElement(Source source) {
-    JUnitTestCase.fail("Unexpected invocation of getLibraryElement");
+    fail("Unexpected invocation of getLibraryElement");
     return null;
   }
   @override
   LineInfo getLineInfo(Source source) {
-    JUnitTestCase.fail("Unexpected invocation of getLineInfo");
+    fail("Unexpected invocation of getLineInfo");
     return null;
   }
   @override
   int getModificationStamp(Source source) {
-    JUnitTestCase.fail("Unexpected invocation of getModificationStamp");
+    fail("Unexpected invocation of getModificationStamp");
     return 0;
   }
   @override
   Namespace getPublicNamespace(LibraryElement library) {
-    JUnitTestCase.fail("Unexpected invocation of getPublicNamespace");
+    fail("Unexpected invocation of getPublicNamespace");
     return null;
   }
   @override
   CompilationUnit getResolvedCompilationUnit(Source unitSource,
       LibraryElement library) {
-    JUnitTestCase.fail("Unexpected invocation of getResolvedCompilationUnit");
+    fail("Unexpected invocation of getResolvedCompilationUnit");
     return null;
   }
   @override
   CompilationUnit getResolvedCompilationUnit2(Source unitSource,
       Source librarySource) {
-    JUnitTestCase.fail("Unexpected invocation of getResolvedCompilationUnit");
+    fail("Unexpected invocation of getResolvedCompilationUnit");
     return null;
   }
   @override
   ht.HtmlUnit getResolvedHtmlUnit(Source htmlSource) {
-    JUnitTestCase.fail("Unexpected invocation of getResolvedHtmlUnit");
+    fail("Unexpected invocation of getResolvedHtmlUnit");
     return null;
   }
   @override
   bool isClientLibrary(Source librarySource) {
-    JUnitTestCase.fail("Unexpected invocation of isClientLibrary");
+    fail("Unexpected invocation of isClientLibrary");
     return false;
   }
   @override
   bool isServerLibrary(Source librarySource) {
-    JUnitTestCase.fail("Unexpected invocation of isServerLibrary");
+    fail("Unexpected invocation of isServerLibrary");
     return false;
   }
   @override
   CompilationUnit parseCompilationUnit(Source source) {
-    JUnitTestCase.fail("Unexpected invocation of parseCompilationUnit");
+    fail("Unexpected invocation of parseCompilationUnit");
     return null;
   }
   @override
   ht.HtmlUnit parseHtmlUnit(Source source) {
-    JUnitTestCase.fail("Unexpected invocation of parseHtmlUnit");
+    fail("Unexpected invocation of parseHtmlUnit");
     return null;
   }
   @override
   AnalysisResult performAnalysisTask() {
-    JUnitTestCase.fail("Unexpected invocation of performAnalysisTask");
+    fail("Unexpected invocation of performAnalysisTask");
     return null;
   }
   @override
   void recordLibraryElements(Map<Source, LibraryElement> elementMap) {
-    JUnitTestCase.fail("Unexpected invocation of recordLibraryElements");
+    fail("Unexpected invocation of recordLibraryElements");
   }
   @override
   void removeListener(AnalysisListener listener) {
-    JUnitTestCase.fail("Unexpected invocation of removeListener");
+    fail("Unexpected invocation of removeListener");
   }
   @override
   CompilationUnit resolveCompilationUnit(Source unitSource,
       LibraryElement library) {
-    JUnitTestCase.fail("Unexpected invocation of resolveCompilationUnit");
+    fail("Unexpected invocation of resolveCompilationUnit");
     return null;
   }
   @override
   CompilationUnit resolveCompilationUnit2(Source unitSource,
       Source librarySource) {
-    JUnitTestCase.fail("Unexpected invocation of resolveCompilationUnit");
+    fail("Unexpected invocation of resolveCompilationUnit");
     return null;
   }
   @override
   ht.HtmlUnit resolveHtmlUnit(Source htmlSource) {
-    JUnitTestCase.fail("Unexpected invocation of resolveHtmlUnit");
+    fail("Unexpected invocation of resolveHtmlUnit");
     return null;
   }
   @override
   void setChangedContents(Source source, String contents, int offset,
       int oldLength, int newLength) {
-    JUnitTestCase.fail("Unexpected invocation of setChangedContents");
+    fail("Unexpected invocation of setChangedContents");
   }
   @override
   void setContents(Source source, String contents) {
-    JUnitTestCase.fail("Unexpected invocation of setContents");
+    fail("Unexpected invocation of setContents");
   }
 }
 
 
 class TestAnalysisContext_test_addSourceInfo extends TestAnalysisContext {
-  List<bool> invoked;
-  TestAnalysisContext_test_addSourceInfo(this.invoked);
+  bool invoked = false;
+  TestAnalysisContext_test_addSourceInfo();
   @override
   void addSourceInfo(Source source, SourceEntry info) {
-    invoked[0] = true;
+    invoked = true;
   }
 }
 
 
 class TestAnalysisContext_test_applyChanges extends TestAnalysisContext {
-  List<bool> invoked;
-  TestAnalysisContext_test_applyChanges(this.invoked);
+  bool invoked = false;
+  TestAnalysisContext_test_applyChanges();
   @override
   void applyChanges(ChangeSet changeSet) {
-    invoked[0] = true;
+    invoked = true;
   }
 }
 
 
 class TestAnalysisContext_test_computeDocumentationComment extends
     TestAnalysisContext {
-  List<bool> invoked;
-  TestAnalysisContext_test_computeDocumentationComment(this.invoked);
+  bool invoked = false;
+  TestAnalysisContext_test_computeDocumentationComment();
   @override
   String computeDocumentationComment(Element element) {
-    invoked[0] = true;
+    invoked = true;
     return null;
   }
 }
 
 
 class TestAnalysisContext_test_computeErrors extends TestAnalysisContext {
-  List<bool> invoked;
-  TestAnalysisContext_test_computeErrors(this.invoked);
+  bool invoked = false;
+  TestAnalysisContext_test_computeErrors();
   @override
   List<AnalysisError> computeErrors(Source source) {
-    invoked[0] = true;
+    invoked = true;
     return AnalysisError.NO_ERRORS;
   }
 }
@@ -6278,22 +5648,22 @@
 
 class TestAnalysisContext_test_computeExportedLibraries extends
     TestAnalysisContext {
-  List<bool> invoked;
-  TestAnalysisContext_test_computeExportedLibraries(this.invoked);
+  bool invoked = false;
+  TestAnalysisContext_test_computeExportedLibraries();
   @override
   List<Source> computeExportedLibraries(Source source) {
-    invoked[0] = true;
+    invoked = true;
     return null;
   }
 }
 
 
 class TestAnalysisContext_test_computeHtmlElement extends TestAnalysisContext {
-  List<bool> invoked;
-  TestAnalysisContext_test_computeHtmlElement(this.invoked);
+  bool invoked = false;
+  TestAnalysisContext_test_computeHtmlElement();
   @override
   HtmlElement computeHtmlElement(Source source) {
-    invoked[0] = true;
+    invoked = true;
     return null;
   }
 }
@@ -6301,22 +5671,22 @@
 
 class TestAnalysisContext_test_computeImportedLibraries extends
     TestAnalysisContext {
-  List<bool> invoked;
-  TestAnalysisContext_test_computeImportedLibraries(this.invoked);
+  bool invoked = false;
+  TestAnalysisContext_test_computeImportedLibraries();
   @override
   List<Source> computeImportedLibraries(Source source) {
-    invoked[0] = true;
+    invoked = true;
     return null;
   }
 }
 
 
 class TestAnalysisContext_test_computeKindOf extends TestAnalysisContext {
-  List<bool> invoked;
-  TestAnalysisContext_test_computeKindOf(this.invoked);
+  bool invoked = false;
+  TestAnalysisContext_test_computeKindOf();
   @override
   SourceKind computeKindOf(Source source) {
-    invoked[0] = true;
+    invoked = true;
     return null;
   }
 }
@@ -6324,22 +5694,22 @@
 
 class TestAnalysisContext_test_computeLibraryElement extends TestAnalysisContext
     {
-  List<bool> invoked;
-  TestAnalysisContext_test_computeLibraryElement(this.invoked);
+  bool invoked = false;
+  TestAnalysisContext_test_computeLibraryElement();
   @override
   LibraryElement computeLibraryElement(Source source) {
-    invoked[0] = true;
+    invoked = true;
     return null;
   }
 }
 
 
 class TestAnalysisContext_test_computeLineInfo extends TestAnalysisContext {
-  List<bool> invoked;
-  TestAnalysisContext_test_computeLineInfo(this.invoked);
+  bool invoked = false;
+  TestAnalysisContext_test_computeLineInfo();
   @override
   LineInfo computeLineInfo(Source source) {
-    invoked[0] = true;
+    invoked = true;
     return null;
   }
 }
@@ -6347,43 +5717,43 @@
 
 class TestAnalysisContext_test_computeResolvableCompilationUnit extends
     TestAnalysisContext {
-  List<bool> invoked;
-  TestAnalysisContext_test_computeResolvableCompilationUnit(this.invoked);
+  bool invoked = false;
+  TestAnalysisContext_test_computeResolvableCompilationUnit();
   @override
   CompilationUnit computeResolvableCompilationUnit(Source source) {
-    invoked[0] = true;
+    invoked = true;
     return null;
   }
 }
 
 
 class TestAnalysisContext_test_dispose extends TestAnalysisContext {
-  List<bool> invoked;
-  TestAnalysisContext_test_dispose(this.invoked);
+  bool invoked = false;
+  TestAnalysisContext_test_dispose();
   @override
   void dispose() {
-    invoked[0] = true;
+    invoked = true;
   }
 }
 
 
 class TestAnalysisContext_test_exists extends TestAnalysisContext {
-  List<bool> invoked;
-  TestAnalysisContext_test_exists(this.invoked);
+  bool invoked = false;
+  TestAnalysisContext_test_exists();
   @override
   bool exists(Source source) {
-    invoked[0] = true;
+    invoked = true;
     return false;
   }
 }
 
 
 class TestAnalysisContext_test_getAnalysisOptions extends TestAnalysisContext {
-  List<bool> invoked;
-  TestAnalysisContext_test_getAnalysisOptions(this.invoked);
+  bool invoked = false;
+  TestAnalysisContext_test_getAnalysisOptions();
   @override
   AnalysisOptions get analysisOptions {
-    invoked[0] = true;
+    invoked = true;
     return null;
   }
 }
@@ -6391,11 +5761,11 @@
 
 class TestAnalysisContext_test_getAngularApplicationWithHtml extends
     TestAnalysisContext {
-  List<bool> invoked;
-  TestAnalysisContext_test_getAngularApplicationWithHtml(this.invoked);
+  bool invoked = false;
+  TestAnalysisContext_test_getAngularApplicationWithHtml();
   @override
   AngularApplication getAngularApplicationWithHtml(Source htmlSource) {
-    invoked[0] = true;
+    invoked = true;
     return null;
   }
 }
@@ -6403,56 +5773,56 @@
 
 class TestAnalysisContext_test_getCompilationUnitElement extends
     TestAnalysisContext {
-  List<bool> invoked;
-  TestAnalysisContext_test_getCompilationUnitElement(this.invoked);
+  bool invoked = false;
+  TestAnalysisContext_test_getCompilationUnitElement();
   @override
   CompilationUnitElement getCompilationUnitElement(Source unitSource,
       Source librarySource) {
-    invoked[0] = true;
+    invoked = true;
     return null;
   }
 }
 
 
 class TestAnalysisContext_test_getContents extends TestAnalysisContext {
-  List<bool> invoked;
-  TestAnalysisContext_test_getContents(this.invoked);
+  bool invoked = false;
+  TestAnalysisContext_test_getContents();
   @override
   TimestampedData<String> getContents(Source source) {
-    invoked[0] = true;
+    invoked = true;
     return null;
   }
 }
 
 
 class TestAnalysisContext_test_getElement extends TestAnalysisContext {
-  List<bool> invoked;
-  TestAnalysisContext_test_getElement(this.invoked);
+  bool invoked = false;
+  TestAnalysisContext_test_getElement();
   @override
   Element getElement(ElementLocation location) {
-    invoked[0] = true;
+    invoked = true;
     return null;
   }
 }
 
 
 class TestAnalysisContext_test_getErrors extends TestAnalysisContext {
-  List<bool> invoked;
-  TestAnalysisContext_test_getErrors(this.invoked);
+  bool invoked = false;
+  TestAnalysisContext_test_getErrors();
   @override
   AnalysisErrorInfo getErrors(Source source) {
-    invoked[0] = true;
+    invoked = true;
     return new AnalysisErrorInfoImpl(AnalysisError.NO_ERRORS, null);
   }
 }
 
 
 class TestAnalysisContext_test_getHtmlElement extends TestAnalysisContext {
-  List<bool> invoked;
-  TestAnalysisContext_test_getHtmlElement(this.invoked);
+  bool invoked = false;
+  TestAnalysisContext_test_getHtmlElement();
   @override
   HtmlElement getHtmlElement(Source source) {
-    invoked[0] = true;
+    invoked = true;
     return null;
   }
 }
@@ -6460,33 +5830,33 @@
 
 class TestAnalysisContext_test_getHtmlFilesReferencing extends
     TestAnalysisContext {
-  List<bool> invoked;
-  TestAnalysisContext_test_getHtmlFilesReferencing(this.invoked);
+  bool invoked = false;
+  TestAnalysisContext_test_getHtmlFilesReferencing();
   @override
   List<Source> getHtmlFilesReferencing(Source source) {
-    invoked[0] = true;
+    invoked = true;
     return Source.EMPTY_ARRAY;
   }
 }
 
 
 class TestAnalysisContext_test_getHtmlSources extends TestAnalysisContext {
-  List<bool> invoked;
-  TestAnalysisContext_test_getHtmlSources(this.invoked);
+  bool invoked = false;
+  TestAnalysisContext_test_getHtmlSources();
   @override
   List<Source> get htmlSources {
-    invoked[0] = true;
+    invoked = true;
     return Source.EMPTY_ARRAY;
   }
 }
 
 
 class TestAnalysisContext_test_getKindOf extends TestAnalysisContext {
-  List<bool> invoked;
-  TestAnalysisContext_test_getKindOf(this.invoked);
+  bool invoked = false;
+  TestAnalysisContext_test_getKindOf();
   @override
   SourceKind getKindOf(Source source) {
-    invoked[0] = true;
+    invoked = true;
     return null;
   }
 }
@@ -6494,11 +5864,11 @@
 
 class TestAnalysisContext_test_getLaunchableClientLibrarySources extends
     TestAnalysisContext {
-  List<bool> invoked;
-  TestAnalysisContext_test_getLaunchableClientLibrarySources(this.invoked);
+  bool invoked = false;
+  TestAnalysisContext_test_getLaunchableClientLibrarySources();
   @override
   List<Source> get launchableClientLibrarySources {
-    invoked[0] = true;
+    invoked = true;
     return Source.EMPTY_ARRAY;
   }
 }
@@ -6506,11 +5876,11 @@
 
 class TestAnalysisContext_test_getLaunchableServerLibrarySources extends
     TestAnalysisContext {
-  List<bool> invoked;
-  TestAnalysisContext_test_getLaunchableServerLibrarySources(this.invoked);
+  bool invoked = false;
+  TestAnalysisContext_test_getLaunchableServerLibrarySources();
   @override
   List<Source> get launchableServerLibrarySources {
-    invoked[0] = true;
+    invoked = true;
     return Source.EMPTY_ARRAY;
   }
 }
@@ -6518,11 +5888,11 @@
 
 class TestAnalysisContext_test_getLibrariesContaining extends
     TestAnalysisContext {
-  List<bool> invoked;
-  TestAnalysisContext_test_getLibrariesContaining(this.invoked);
+  bool invoked = false;
+  TestAnalysisContext_test_getLibrariesContaining();
   @override
   List<Source> getLibrariesContaining(Source source) {
-    invoked[0] = true;
+    invoked = true;
     return Source.EMPTY_ARRAY;
   }
 }
@@ -6530,11 +5900,11 @@
 
 class TestAnalysisContext_test_getLibrariesDependingOn extends
     TestAnalysisContext {
-  List<bool> invoked;
-  TestAnalysisContext_test_getLibrariesDependingOn(this.invoked);
+  bool invoked = false;
+  TestAnalysisContext_test_getLibrariesDependingOn();
   @override
   List<Source> getLibrariesDependingOn(Source librarySource) {
-    invoked[0] = true;
+    invoked = true;
     return Source.EMPTY_ARRAY;
   }
 }
@@ -6542,44 +5912,44 @@
 
 class TestAnalysisContext_test_getLibrariesReferencedFromHtml extends
     TestAnalysisContext {
-  List<bool> invoked;
-  TestAnalysisContext_test_getLibrariesReferencedFromHtml(this.invoked);
+  bool invoked = false;
+  TestAnalysisContext_test_getLibrariesReferencedFromHtml();
   @override
   List<Source> getLibrariesReferencedFromHtml(Source htmlSource) {
-    invoked[0] = true;
+    invoked = true;
     return null;
   }
 }
 
 
 class TestAnalysisContext_test_getLibraryElement extends TestAnalysisContext {
-  List<bool> invoked;
-  TestAnalysisContext_test_getLibraryElement(this.invoked);
+  bool invoked = false;
+  TestAnalysisContext_test_getLibraryElement();
   @override
   LibraryElement getLibraryElement(Source source) {
-    invoked[0] = true;
+    invoked = true;
     return null;
   }
 }
 
 
 class TestAnalysisContext_test_getLibrarySources extends TestAnalysisContext {
-  List<bool> invoked;
-  TestAnalysisContext_test_getLibrarySources(this.invoked);
+  bool invoked = false;
+  TestAnalysisContext_test_getLibrarySources();
   @override
   List<Source> get librarySources {
-    invoked[0] = true;
+    invoked = true;
     return Source.EMPTY_ARRAY;
   }
 }
 
 
 class TestAnalysisContext_test_getLineInfo extends TestAnalysisContext {
-  List<bool> invoked;
-  TestAnalysisContext_test_getLineInfo(this.invoked);
+  bool invoked = false;
+  TestAnalysisContext_test_getLineInfo();
   @override
   LineInfo getLineInfo(Source source) {
-    invoked[0] = true;
+    invoked = true;
     return null;
   }
 }
@@ -6587,22 +5957,22 @@
 
 class TestAnalysisContext_test_getModificationStamp extends TestAnalysisContext
     {
-  List<bool> invoked;
-  TestAnalysisContext_test_getModificationStamp(this.invoked);
+  bool invoked = false;
+  TestAnalysisContext_test_getModificationStamp();
   @override
   int getModificationStamp(Source source) {
-    invoked[0] = true;
+    invoked = true;
     return 0;
   }
 }
 
 
 class TestAnalysisContext_test_getPublicNamespace extends TestAnalysisContext {
-  List<bool> invoked;
-  TestAnalysisContext_test_getPublicNamespace(this.invoked);
+  bool invoked = false;
+  TestAnalysisContext_test_getPublicNamespace();
   @override
   Namespace getPublicNamespace(LibraryElement library) {
-    invoked[0] = true;
+    invoked = true;
     return null;
   }
 }
@@ -6610,11 +5980,11 @@
 
 class TestAnalysisContext_test_getRefactoringUnsafeSources extends
     TestAnalysisContext {
-  List<bool> invoked;
-  TestAnalysisContext_test_getRefactoringUnsafeSources(this.invoked);
+  bool invoked = false;
+  TestAnalysisContext_test_getRefactoringUnsafeSources();
   @override
   List<Source> get refactoringUnsafeSources {
-    invoked[0] = true;
+    invoked = true;
     return null;
   }
 }
@@ -6622,12 +5992,12 @@
 
 class TestAnalysisContext_test_getResolvedCompilationUnit_element extends
     TestAnalysisContext {
-  List<bool> invoked;
-  TestAnalysisContext_test_getResolvedCompilationUnit_element(this.invoked);
+  bool invoked = false;
+  TestAnalysisContext_test_getResolvedCompilationUnit_element();
   @override
   CompilationUnit getResolvedCompilationUnit(Source unitSource,
       LibraryElement library) {
-    invoked[0] = true;
+    invoked = true;
     return null;
   }
 }
@@ -6635,89 +6005,89 @@
 
 class TestAnalysisContext_test_getResolvedCompilationUnit_source extends
     TestAnalysisContext {
-  List<bool> invoked;
-  TestAnalysisContext_test_getResolvedCompilationUnit_source(this.invoked);
+  bool invoked = false;
+  TestAnalysisContext_test_getResolvedCompilationUnit_source();
   @override
   CompilationUnit getResolvedCompilationUnit2(Source unitSource,
       Source librarySource) {
-    invoked[0] = true;
+    invoked = true;
     return null;
   }
 }
 
 
 class TestAnalysisContext_test_getResolvedHtmlUnit extends TestAnalysisContext {
-  List<bool> invoked;
-  TestAnalysisContext_test_getResolvedHtmlUnit(this.invoked);
+  bool invoked = false;
+  TestAnalysisContext_test_getResolvedHtmlUnit();
   @override
   ht.HtmlUnit getResolvedHtmlUnit(Source htmlSource) {
-    invoked[0] = true;
+    invoked = true;
     return null;
   }
 }
 
 
 class TestAnalysisContext_test_getSourceFactory extends TestAnalysisContext {
-  List<bool> invoked;
-  TestAnalysisContext_test_getSourceFactory(this.invoked);
+  bool invoked = false;
+  TestAnalysisContext_test_getSourceFactory();
   @override
   SourceFactory get sourceFactory {
-    invoked[0] = true;
+    invoked = true;
     return null;
   }
 }
 
 
 class TestAnalysisContext_test_getStatistics extends TestAnalysisContext {
-  List<bool> invoked;
-  TestAnalysisContext_test_getStatistics(this.invoked);
+  bool invoked = false;
+  TestAnalysisContext_test_getStatistics();
   @override
   AnalysisContextStatistics get statistics {
-    invoked[0] = true;
+    invoked = true;
     return null;
   }
 }
 
 
 class TestAnalysisContext_test_getTypeProvider extends TestAnalysisContext {
-  List<bool> invoked;
-  TestAnalysisContext_test_getTypeProvider(this.invoked);
+  bool invoked = false;
+  TestAnalysisContext_test_getTypeProvider();
   @override
   TypeProvider get typeProvider {
-    invoked[0] = true;
+    invoked = true;
     return null;
   }
 }
 
 
 class TestAnalysisContext_test_isClientLibrary extends TestAnalysisContext {
-  List<bool> invoked;
-  TestAnalysisContext_test_isClientLibrary(this.invoked);
+  bool invoked = false;
+  TestAnalysisContext_test_isClientLibrary();
   @override
   bool isClientLibrary(Source librarySource) {
-    invoked[0] = true;
+    invoked = true;
     return false;
   }
 }
 
 
 class TestAnalysisContext_test_isDisposed extends TestAnalysisContext {
-  List<bool> invoked;
-  TestAnalysisContext_test_isDisposed(this.invoked);
+  bool invoked = false;
+  TestAnalysisContext_test_isDisposed();
   @override
   bool get isDisposed {
-    invoked[0] = true;
+    invoked = true;
     return false;
   }
 }
 
 
 class TestAnalysisContext_test_isServerLibrary extends TestAnalysisContext {
-  List<bool> invoked;
-  TestAnalysisContext_test_isServerLibrary(this.invoked);
+  bool invoked = false;
+  TestAnalysisContext_test_isServerLibrary();
   @override
   bool isServerLibrary(Source librarySource) {
-    invoked[0] = true;
+    invoked = true;
     return false;
   }
 }
@@ -6725,33 +6095,33 @@
 
 class TestAnalysisContext_test_parseCompilationUnit extends TestAnalysisContext
     {
-  List<bool> invoked;
-  TestAnalysisContext_test_parseCompilationUnit(this.invoked);
+  bool invoked = false;
+  TestAnalysisContext_test_parseCompilationUnit();
   @override
   CompilationUnit parseCompilationUnit(Source source) {
-    invoked[0] = true;
+    invoked = true;
     return null;
   }
 }
 
 
 class TestAnalysisContext_test_parseHtmlUnit extends TestAnalysisContext {
-  List<bool> invoked;
-  TestAnalysisContext_test_parseHtmlUnit(this.invoked);
+  bool invoked = false;
+  TestAnalysisContext_test_parseHtmlUnit();
   @override
   ht.HtmlUnit parseHtmlUnit(Source source) {
-    invoked[0] = true;
+    invoked = true;
     return null;
   }
 }
 
 
 class TestAnalysisContext_test_performAnalysisTask extends TestAnalysisContext {
-  List<bool> invoked;
-  TestAnalysisContext_test_performAnalysisTask(this.invoked);
+  bool invoked = false;
+  TestAnalysisContext_test_performAnalysisTask();
   @override
   AnalysisResult performAnalysisTask() {
-    invoked[0] = true;
+    invoked = true;
     return new AnalysisResult(new List<ChangeNotice>(0), 0, null, 0);
   }
 }
@@ -6759,23 +6129,23 @@
 
 class TestAnalysisContext_test_recordLibraryElements extends TestAnalysisContext
     {
-  List<bool> invoked;
-  TestAnalysisContext_test_recordLibraryElements(this.invoked);
+  bool invoked = false;
+  TestAnalysisContext_test_recordLibraryElements();
   @override
   void recordLibraryElements(Map<Source, LibraryElement> elementMap) {
-    invoked[0] = true;
+    invoked = true;
   }
 }
 
 
 class TestAnalysisContext_test_resolveCompilationUnit extends
     TestAnalysisContext {
-  List<bool> invoked;
-  TestAnalysisContext_test_resolveCompilationUnit(this.invoked);
+  bool invoked = false;
+  TestAnalysisContext_test_resolveCompilationUnit();
   @override
   CompilationUnit resolveCompilationUnit2(Source unitSource,
       Source librarySource) {
-    invoked[0] = true;
+    invoked = true;
     return null;
   }
 }
@@ -6783,76 +6153,76 @@
 
 class TestAnalysisContext_test_resolveCompilationUnit_element extends
     TestAnalysisContext {
-  List<bool> invoked;
-  TestAnalysisContext_test_resolveCompilationUnit_element(this.invoked);
+  bool invoked = false;
+  TestAnalysisContext_test_resolveCompilationUnit_element();
   @override
   CompilationUnit resolveCompilationUnit(Source unitSource,
       LibraryElement library) {
-    invoked[0] = true;
+    invoked = true;
     return null;
   }
 }
 
 
 class TestAnalysisContext_test_resolveHtmlUnit extends TestAnalysisContext {
-  List<bool> invoked;
-  TestAnalysisContext_test_resolveHtmlUnit(this.invoked);
+  bool invoked = false;
+  TestAnalysisContext_test_resolveHtmlUnit();
   @override
   ht.HtmlUnit resolveHtmlUnit(Source htmlSource) {
-    invoked[0] = true;
+    invoked = true;
     return null;
   }
 }
 
 
 class TestAnalysisContext_test_setAnalysisOptions extends TestAnalysisContext {
-  List<bool> invoked;
-  TestAnalysisContext_test_setAnalysisOptions(this.invoked);
+  bool invoked = false;
+  TestAnalysisContext_test_setAnalysisOptions();
   @override
   void set analysisOptions(AnalysisOptions options) {
-    invoked[0] = true;
+    invoked = true;
   }
 }
 
 
 class TestAnalysisContext_test_setAnalysisPriorityOrder extends
     TestAnalysisContext {
-  List<bool> invoked;
-  TestAnalysisContext_test_setAnalysisPriorityOrder(this.invoked);
+  bool invoked = false;
+  TestAnalysisContext_test_setAnalysisPriorityOrder();
   @override
   void set analysisPriorityOrder(List<Source> sources) {
-    invoked[0] = true;
+    invoked = true;
   }
 }
 
 
 class TestAnalysisContext_test_setChangedContents extends TestAnalysisContext {
-  List<bool> invoked;
-  TestAnalysisContext_test_setChangedContents(this.invoked);
+  bool invoked = false;
+  TestAnalysisContext_test_setChangedContents();
   @override
   void setChangedContents(Source source, String contents, int offset,
       int oldLength, int newLength) {
-    invoked[0] = true;
+    invoked = true;
   }
 }
 
 
 class TestAnalysisContext_test_setContents extends TestAnalysisContext {
-  List<bool> invoked;
-  TestAnalysisContext_test_setContents(this.invoked);
+  bool invoked = false;
+  TestAnalysisContext_test_setContents();
   @override
   void setContents(Source source, String contents) {
-    invoked[0] = true;
+    invoked = true;
   }
 }
 
 
 class TestAnalysisContext_test_setSourceFactory extends TestAnalysisContext {
-  List<bool> invoked;
-  TestAnalysisContext_test_setSourceFactory(this.invoked);
+  bool invoked = false;
+  TestAnalysisContext_test_setSourceFactory();
   @override
   void set sourceFactory(SourceFactory factory) {
-    invoked[0] = true;
+    invoked = true;
   }
 }
 
@@ -6865,86 +6235,85 @@
 class TestTaskVisitor<E> implements AnalysisTaskVisitor<E> {
   @override
   E visitBuildUnitElementTask(BuildUnitElementTask task) {
-    JUnitTestCase.fail("Unexpectedly invoked visitGenerateDartErrorsTask");
+    fail("Unexpectedly invoked visitGenerateDartErrorsTask");
     return null;
   }
 
   @override
   E visitGenerateDartErrorsTask(GenerateDartErrorsTask task) {
-    JUnitTestCase.fail("Unexpectedly invoked visitGenerateDartErrorsTask");
+    fail("Unexpectedly invoked visitGenerateDartErrorsTask");
     return null;
   }
   @override
   E visitGenerateDartHintsTask(GenerateDartHintsTask task) {
-    JUnitTestCase.fail("Unexpectedly invoked visitGenerateDartHintsTask");
+    fail("Unexpectedly invoked visitGenerateDartHintsTask");
     return null;
   }
   @override
   E visitGetContentTask(GetContentTask task) {
-    JUnitTestCase.fail("Unexpectedly invoked visitGetContentsTask");
+    fail("Unexpectedly invoked visitGetContentsTask");
     return null;
   }
   @override
   E
       visitIncrementalAnalysisTask(IncrementalAnalysisTask incrementalAnalysisTask) {
-    JUnitTestCase.fail("Unexpectedly invoked visitIncrementalAnalysisTask");
+    fail("Unexpectedly invoked visitIncrementalAnalysisTask");
     return null;
   }
   @override
   E visitParseDartTask(ParseDartTask task) {
-    JUnitTestCase.fail("Unexpectedly invoked visitParseDartTask");
+    fail("Unexpectedly invoked visitParseDartTask");
     return null;
   }
   @override
   E visitParseHtmlTask(ParseHtmlTask task) {
-    JUnitTestCase.fail("Unexpectedly invoked visitParseHtmlTask");
+    fail("Unexpectedly invoked visitParseHtmlTask");
     return null;
   }
   @override
   E visitPolymerBuildHtmlTask(PolymerBuildHtmlTask task) {
-    JUnitTestCase.fail("Unexpectedly invoked visitPolymerBuildHtmlTask");
+    fail("Unexpectedly invoked visitPolymerBuildHtmlTask");
     return null;
   }
   @override
   E visitPolymerResolveHtmlTask(PolymerResolveHtmlTask task) {
-    JUnitTestCase.fail("Unexpectedly invoked visitPolymerResolveHtmlTask");
+    fail("Unexpectedly invoked visitPolymerResolveHtmlTask");
     return null;
   }
   @override
   E
       visitResolveAngularComponentTemplateTask(ResolveAngularComponentTemplateTask task) {
-    JUnitTestCase.fail(
-        "Unexpectedly invoked visitResolveAngularComponentTemplateTask");
+    fail("Unexpectedly invoked visitResolveAngularComponentTemplateTask");
     return null;
   }
   @override
   E visitResolveAngularEntryHtmlTask(ResolveAngularEntryHtmlTask task) {
-    JUnitTestCase.fail("Unexpectedly invoked visitResolveAngularEntryHtmlTask");
+    fail("Unexpectedly invoked visitResolveAngularEntryHtmlTask");
     return null;
   }
   @override
   E visitResolveDartLibraryCycleTask(ResolveDartLibraryCycleTask task) {
-    JUnitTestCase.fail("Unexpectedly invoked visitResolveDartLibraryCycleTask");
+    fail("Unexpectedly invoked visitResolveDartLibraryCycleTask");
     return null;
   }
   @override
   E visitResolveDartLibraryTask(ResolveDartLibraryTask task) {
-    JUnitTestCase.fail("Unexpectedly invoked visitResolveDartLibraryTask");
+    fail("Unexpectedly invoked visitResolveDartLibraryTask");
     return null;
   }
   @override
   E visitResolveDartUnitTask(ResolveDartUnitTask task) {
-    JUnitTestCase.fail("Unexpectedly invoked visitResolveDartUnitTask");
+    fail("Unexpectedly invoked visitResolveDartUnitTask");
     return null;
   }
   @override
   E visitResolveHtmlTask(ResolveHtmlTask task) {
-    JUnitTestCase.fail("Unexpectedly invoked visitResolveHtmlTask");
+    fail("Unexpectedly invoked visitResolveHtmlTask");
     return null;
   }
   @override
   E visitScanDartTask(ScanDartTask task) {
-    JUnitTestCase.fail("Unexpectedly invoked visitScanDartTask");
+    fail("Unexpectedly invoked visitScanDartTask");
     return null;
   }
 }
@@ -6955,10 +6324,10 @@
     UniversalCachePartition partition =
         new UniversalCachePartition(null, 8, null);
     TestSource source = new TestSource();
-    JUnitTestCase.assertTrue(partition.contains(source));
+    expect(partition.contains(source), isTrue);
   }
   void test_creation() {
-    JUnitTestCase.assertNotNull(new UniversalCachePartition(null, 8, null));
+    expect(new UniversalCachePartition(null, 8, null), isNotNull);
   }
   void test_entrySet() {
     UniversalCachePartition partition =
@@ -6966,19 +6335,17 @@
     TestSource source = new TestSource();
     DartEntry entry = new DartEntry();
     partition.put(source, entry);
-    JavaIterator<MapEntry<Source, SourceEntry>> entries =
-        new JavaIterator(getMapEntrySet(partition.map));
-    JUnitTestCase.assertTrue(entries.hasNext);
-    MapEntry<Source, SourceEntry> mapEntry = entries.next();
-    JUnitTestCase.assertSame(source, mapEntry.getKey());
-    JUnitTestCase.assertSame(entry, mapEntry.getValue());
-    JUnitTestCase.assertFalse(entries.hasNext);
+    Map<Source, SourceEntry> entryMap = partition.map;
+    expect(entryMap.length, 1);
+    Source entryKey = entryMap.keys.first;
+    expect(entryKey, same(source));
+    expect(entryMap[entryKey], same(entry));
   }
   void test_get() {
     UniversalCachePartition partition =
         new UniversalCachePartition(null, 8, null);
     TestSource source = new TestSource();
-    JUnitTestCase.assertNull(partition.get(source));
+    expect(partition.get(source), isNull);
   }
   void test_put_noFlush() {
     UniversalCachePartition partition =
@@ -6986,7 +6353,7 @@
     TestSource source = new TestSource();
     DartEntry entry = new DartEntry();
     partition.put(source, entry);
-    JUnitTestCase.assertSame(entry, partition.get(source));
+    expect(partition.get(source), same(entry));
   }
   void test_remove() {
     UniversalCachePartition partition =
@@ -6994,9 +6361,9 @@
     TestSource source = new TestSource();
     DartEntry entry = new DartEntry();
     partition.put(source, entry);
-    JUnitTestCase.assertSame(entry, partition.get(source));
+    expect(partition.get(source), same(entry));
     partition.remove(source);
-    JUnitTestCase.assertNull(partition.get(source));
+    expect(partition.get(source), isNull);
   }
   void test_setMaxCacheSize() {
     UniversalCachePartition partition = new UniversalCachePartition(
@@ -7005,7 +6372,7 @@
         new _UniversalCachePartitionTest_test_setMaxCacheSize());
     int size = 6;
     for (int i = 0; i < size; i++) {
-      Source source = new TestSource("/test${i}.dart");
+      Source source = new TestSource("/test$i.dart");
       DartEntry entry = new DartEntry();
       entry.setValue(DartEntry.PARSED_UNIT, null);
       partition.put(source, entry);
@@ -7021,25 +6388,22 @@
         new UniversalCachePartition(null, 8, null);
     int size = 4;
     for (int i = 0; i < size; i++) {
-      Source source = new TestSource("/test${i}.dart");
+      Source source = new TestSource("/test$i.dart");
       partition.put(source, new DartEntry());
       partition.accessedAst(source);
     }
-    JUnitTestCase.assertEquals(size, partition.size());
+    expect(partition.size(), size);
   }
   void _assertNonFlushedCount(int expectedCount,
       UniversalCachePartition partition) {
     int nonFlushedCount = 0;
-    JavaIterator<MapEntry<Source, SourceEntry>> entries =
-        new JavaIterator(getMapEntrySet(partition.map));
-    while (entries.hasNext) {
-      MapEntry<Source, SourceEntry> entry = entries.next();
-      if (entry.getValue().getState(DartEntry.PARSED_UNIT) !=
-          CacheState.FLUSHED) {
+    Map<Source, SourceEntry> entryMap = partition.map;
+    entryMap.values.forEach((SourceEntry value) {
+      if (value.getState(DartEntry.PARSED_UNIT) != CacheState.FLUSHED) {
         nonFlushedCount++;
       }
-    }
-    JUnitTestCase.assertEquals(expectedCount, nonFlushedCount);
+    });
+    expect(nonFlushedCount, expectedCount);
   }
 }
 
@@ -7052,19 +6416,19 @@
     manager.add(source1, SourcePriority.UNKNOWN);
     manager.addFirst(source2, SourcePriority.UNKNOWN);
     WorkManager_WorkIterator iterator = manager.iterator();
-    JUnitTestCase.assertSame(source2, iterator.next());
-    JUnitTestCase.assertSame(source1, iterator.next());
+    expect(iterator.next(), same(source2));
+    expect(iterator.next(), same(source1));
   }
   void test_creation() {
-    JUnitTestCase.assertNotNull(new WorkManager());
+    expect(new WorkManager(), isNotNull);
   }
   void test_iterator_empty() {
     WorkManager manager = new WorkManager();
     WorkManager_WorkIterator iterator = manager.iterator();
-    JUnitTestCase.assertFalse(iterator.hasNext);
+    expect(iterator.hasNext, isFalse);
     try {
       iterator.next();
-      JUnitTestCase.fail("Expected NoSuchElementException");
+      fail("Expected NoSuchElementException");
     } on NoSuchElementException catch (exception) {
     }
   }
@@ -7073,8 +6437,8 @@
     WorkManager manager = new WorkManager();
     manager.add(source, SourcePriority.UNKNOWN);
     WorkManager_WorkIterator iterator = manager.iterator();
-    JUnitTestCase.assertTrue(iterator.hasNext);
-    JUnitTestCase.assertSame(source, iterator.next());
+    expect(iterator.hasNext, isTrue);
+    expect(iterator.next(), same(source));
   }
   void test_remove() {
     TestSource source1 = new TestSource("/f1.dart");
@@ -7086,12 +6450,12 @@
     manager.add(source3, SourcePriority.UNKNOWN);
     manager.remove(source2);
     WorkManager_WorkIterator iterator = manager.iterator();
-    JUnitTestCase.assertSame(source1, iterator.next());
-    JUnitTestCase.assertSame(source3, iterator.next());
+    expect(iterator.next(), same(source1));
+    expect(iterator.next(), same(source3));
   }
   void test_toString_empty() {
     WorkManager manager = new WorkManager();
-    JUnitTestCase.assertNotNull(manager.toString());
+    expect(manager.toString(), isNotNull);
   }
   void test_toString_nonEmpty() {
     WorkManager manager = new WorkManager();
@@ -7100,7 +6464,7 @@
     manager.add(new TestSource(), SourcePriority.NORMAL_PART);
     manager.add(new TestSource(), SourcePriority.PRIORITY_PART);
     manager.add(new TestSource(), SourcePriority.UNKNOWN);
-    JUnitTestCase.assertNotNull(manager.toString());
+    expect(manager.toString(), isNotNull);
   }
 }
 
diff --git a/pkg/analyzer/test/generated/non_error_resolver_test.dart b/pkg/analyzer/test/generated/non_error_resolver_test.dart
index 58ad1c6..16d5494 100644
--- a/pkg/analyzer/test/generated/non_error_resolver_test.dart
+++ b/pkg/analyzer/test/generated/non_error_resolver_test.dart
@@ -18,222 +18,272 @@
 
 class NonErrorResolverTest extends ResolverTestCase {
   void fail_undefinedEnumConstant() {
-    Source source = addSource(EngineTestCase.createSource(["enum E { ONE }", "E e() {", "  return E.ONE;", "}"]));
+    Source source = addSource(r'''
+enum E { ONE }
+E e() {
+  return E.TWO;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_ambiguousExport() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library L;",
-        "export 'lib1.dart';",
-        "export 'lib2.dart';"]));
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class M {}"]));
-    addNamedSource("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class N {}"]));
+    Source source = addSource(r'''
+library L;
+export 'lib1.dart';
+export 'lib2.dart';''');
+    addNamedSource("/lib1.dart", r'''
+library lib1;
+class M {}''');
+    addNamedSource("/lib2.dart", r'''
+library lib2;
+class N {}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_ambiguousExport_combinators_hide() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library L;",
-        "export 'lib1.dart';",
-        "export 'lib2.dart' hide B;"]));
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library L1;", "class A {}", "class B {}"]));
-    addNamedSource("/lib2.dart", EngineTestCase.createSource(["library L2;", "class B {}", "class C {}"]));
+    Source source = addSource(r'''
+library L;
+export 'lib1.dart';
+export 'lib2.dart' hide B;''');
+    addNamedSource("/lib1.dart", r'''
+library L1;
+class A {}
+class B {}''');
+    addNamedSource("/lib2.dart", r'''
+library L2;
+class B {}
+class C {}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_ambiguousExport_combinators_show() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library L;",
-        "export 'lib1.dart';",
-        "export 'lib2.dart' show C;"]));
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library L1;", "class A {}", "class B {}"]));
-    addNamedSource("/lib2.dart", EngineTestCase.createSource(["library L2;", "class B {}", "class C {}"]));
+    Source source = addSource(r'''
+library L;
+export 'lib1.dart';
+export 'lib2.dart' show C;''');
+    addNamedSource("/lib1.dart", r'''
+library L1;
+class A {}
+class B {}''');
+    addNamedSource("/lib2.dart", r'''
+library L2;
+class B {}
+class C {}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_ambiguousExport_sameDeclaration() {
-    Source source = addSource(EngineTestCase.createSource(["library L;", "export 'lib.dart';", "export 'lib.dart';"]));
-    addNamedSource("/lib.dart", EngineTestCase.createSource(["library lib;", "class N {}"]));
+    Source source = addSource(r'''
+library L;
+export 'lib.dart';
+export 'lib.dart';''');
+    addNamedSource("/lib.dart", r'''
+library lib;
+class N {}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_ambiguousImport_hideCombinator() {
-    Source source = addSource(EngineTestCase.createSource([
-        "import 'lib1.dart';",
-        "import 'lib2.dart';",
-        "import 'lib3.dart' hide N;",
-        "main() {",
-        "  new N1();",
-        "  new N2();",
-        "  new N3();",
-        "}"]));
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class N {}", "class N1 {}"]));
-    addNamedSource("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class N {}", "class N2 {}"]));
-    addNamedSource("/lib3.dart", EngineTestCase.createSource(["library lib3;", "class N {}", "class N3 {}"]));
+    Source source = addSource(r'''
+import 'lib1.dart';
+import 'lib2.dart';
+import 'lib3.dart' hide N;
+main() {
+  new N1();
+  new N2();
+  new N3();
+}''');
+    addNamedSource("/lib1.dart", r'''
+library lib1;
+class N {}
+class N1 {}''');
+    addNamedSource("/lib2.dart", r'''
+library lib2;
+class N {}
+class N2 {}''');
+    addNamedSource("/lib3.dart", r'''
+library lib3;
+class N {}
+class N3 {}''');
     resolve(source);
     assertNoErrors(source);
   }
 
   void test_ambiguousImport_showCombinator() {
-    Source source = addSource(EngineTestCase.createSource([
-        "import 'lib1.dart';",
-        "import 'lib2.dart' show N, N2;",
-        "main() {",
-        "  new N1();",
-        "  new N2();",
-        "}"]));
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class N {}", "class N1 {}"]));
-    addNamedSource("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class N {}", "class N2 {}"]));
+    Source source = addSource(r'''
+import 'lib1.dart';
+import 'lib2.dart' show N, N2;
+main() {
+  new N1();
+  new N2();
+}''');
+    addNamedSource("/lib1.dart", r'''
+library lib1;
+class N {}
+class N1 {}''');
+    addNamedSource("/lib2.dart", r'''
+library lib2;
+class N {}
+class N2 {}''');
     resolve(source);
     assertNoErrors(source);
   }
 
   void test_argumentTypeNotAssignable_classWithCall_Function() {
-    Source source = addSource(EngineTestCase.createSource([
-        "  caller(Function callee) {",
-        "    callee();",
-        "  }",
-        "",
-        "  class CallMeBack {",
-        "    call() => 0;",
-        "  }",
-        "",
-        "  main() {",
-        "    caller(new CallMeBack());",
-        "  }"]));
+    Source source = addSource(r'''
+  caller(Function callee) {
+    callee();
+  }
+
+  class CallMeBack {
+    call() => 0;
+  }
+
+  main() {
+    caller(new CallMeBack());
+  }''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_argumentTypeNotAssignable_fieldFormalParameterElement_member() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class ObjectSink<T> {",
-        "  void sink(T object) {",
-        "    new TimestampedObject<T>(object);",
-        "  }",
-        "}",
-        "class TimestampedObject<E> {",
-        "  E object2;",
-        "  TimestampedObject(this.object2);",
-        "}"]));
+    Source source = addSource(r'''
+class ObjectSink<T> {
+  void sink(T object) {
+    new TimestampedObject<T>(object);
+  }
+}
+class TimestampedObject<E> {
+  E object2;
+  TimestampedObject(this.object2);
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_argumentTypeNotAssignable_invocation_functionParameter_generic() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A<K> {",
-        "  m(f(K k), K v) {",
-        "    f(v);",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A<K> {
+  m(f(K k), K v) {
+    f(v);
+  }
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_argumentTypeNotAssignable_invocation_typedef_generic() {
-    Source source = addSource(EngineTestCase.createSource(["typedef A<T>(T p);", "f(A<int> a) {", "  a(1);", "}"]));
+    Source source = addSource(r'''
+typedef A<T>(T p);
+f(A<int> a) {
+  a(1);
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_argumentTypeNotAssignable_Object_Function() {
-    Source source = addSource(EngineTestCase.createSource([
-        "main() {",
-        "  process(() {});",
-        "}",
-        "process(Object x) {}"]));
+    Source source = addSource(r'''
+main() {
+  process(() {});
+}
+process(Object x) {}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_argumentTypeNotAssignable_typedef_local() {
-    Source source = addSource(EngineTestCase.createSource([
-        "typedef A(int p1, String p2);",
-        "A getA() => null;",
-        "f() {",
-        "  A a = getA();",
-        "  a(1, '2');",
-        "}"]));
+    Source source = addSource(r'''
+typedef A(int p1, String p2);
+A getA() => null;
+f() {
+  A a = getA();
+  a(1, '2');
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_argumentTypeNotAssignable_typedef_parameter() {
-    Source source = addSource(EngineTestCase.createSource([
-        "typedef A(int p1, String p2);",
-        "f(A a) {",
-        "  a(1, '2');",
-        "}"]));
+    Source source = addSource(r'''
+typedef A(int p1, String p2);
+f(A a) {
+  a(1, '2');
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_assignmentToFinal_prefixNegate() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  final x = 0;", "  -x;", "}"]));
+    Source source = addSource(r'''
+f() {
+  final x = 0;
+  -x;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_assignmentToFinalNoSetter_prefixedIdentifier() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  int get x => 0;",
-        "  set x(v) {}",
-        "}",
-        "main() {",
-        "  A a = new A();",
-        "  a.x = 0;",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  int get x => 0;
+  set x(v) {}
+}
+main() {
+  A a = new A();
+  a.x = 0;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_assignmentToFinalNoSetter_propertyAccess() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  int get x => 0;",
-        "  set x(v) {}",
-        "}",
-        "class B {",
-        "  static A a;",
-        "}",
-        "main() {",
-        "  B.a.x = 0;",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  int get x => 0;
+  set x(v) {}
+}
+class B {
+  static A a;
+}
+main() {
+  B.a.x = 0;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_assignmentToFinals_importWithPrefix() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library lib;",
-        "import 'lib1.dart' as foo;",
-        "main() {",
-        "  foo.x = true;",
-        "}"]));
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "bool x = false;"]));
+    Source source = addSource(r'''
+library lib;
+import 'lib1.dart' as foo;
+main() {
+  foo.x = true;
+}''');
+    addNamedSource("/lib1.dart", r'''
+library lib1;
+bool x = false;''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -241,11 +291,11 @@
 
   void test_asyncForInWrongContext_async() {
     resetWithAsync();
-    Source source = addSource(EngineTestCase.createSource([
-        "f(list) async {",
-        "  await for (var e in list) {",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+f(list) async {
+  await for (var e in list) {
+  }
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -253,11 +303,11 @@
 
   void test_asyncForInWrongContext_asyncStar() {
     resetWithAsync();
-    Source source = addSource(EngineTestCase.createSource([
-        "f(list) async* {",
-        "  await for (var e in list) {",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+f(list) async* {
+  await for (var e in list) {
+  }
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -265,7 +315,10 @@
 
   void test_awaitInWrongContext_async() {
     resetWithAsync();
-    Source source = addSource(EngineTestCase.createSource(["f(x, y) async {", "  return await x + await y;", "}"]));
+    Source source = addSource(r'''
+f(x, y) async {
+  return await x + await y;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -273,147 +326,157 @@
 
   void test_awaitInWrongContext_asyncStar() {
     resetWithAsync();
-    Source source = addSource(EngineTestCase.createSource(["f(x, y) async* {", "  yield await x + await y;", "}"]));
+    Source source = addSource(r'''
+f(x, y) async* {
+  yield await x + await y;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_breakWithoutLabelInSwitch() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  void m(int i) {",
-        "    switch (i) {",
-        "      case 0:",
-        "        break;",
-        "    }",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  void m(int i) {
+    switch (i) {
+      case 0:
+        break;
+    }
+  }
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_builtInIdentifierAsType_dynamic() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  dynamic x;", "}"]));
+    Source source = addSource(r'''
+f() {
+  dynamic x;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_caseBlockNotTerminated() {
-    Source source = addSource(EngineTestCase.createSource([
-        "f(int p) {",
-        "  for (int i = 0; i < 10; i++) {",
-        "    switch (p) {",
-        "      case 0:",
-        "        break;",
-        "      case 1:",
-        "        continue;",
-        "      case 2:",
-        "        return;",
-        "      case 3:",
-        "        throw new Object();",
-        "      case 4:",
-        "      case 5:",
-        "        return;",
-        "      case 6:",
-        "      default:",
-        "        return;",
-        "    }",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+f(int p) {
+  for (int i = 0; i < 10; i++) {
+    switch (p) {
+      case 0:
+        break;
+      case 1:
+        continue;
+      case 2:
+        return;
+      case 3:
+        throw new Object();
+      case 4:
+      case 5:
+        return;
+      case 6:
+      default:
+        return;
+    }
+  }
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_caseBlockNotTerminated_lastCase() {
-    Source source = addSource(EngineTestCase.createSource([
-        "f(int p) {",
-        "  switch (p) {",
-        "    case 0:",
-        "      p = p + 1;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+f(int p) {
+  switch (p) {
+    case 0:
+      p = p + 1;
+  }
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_caseExpressionTypeImplementsEquals() {
-    Source source = addSource(EngineTestCase.createSource([
-        "print(p) {}",
-        "",
-        "abstract class B {",
-        "  final id;",
-        "  const B(this.id);",
-        "  String toString() => 'C(\$id)';",
-        "  /** Equality is identity equality, the id isn't used. */",
-        "  bool operator==(Object other);",
-        "  }",
-        "",
-        "class C extends B {",
-        "  const C(id) : super(id);",
-        "}",
-        "",
-        "void doSwitch(c) {",
-        "  switch (c) {",
-        "  case const C(0): print('Switch: 0'); break;",
-        "  case const C(1): print('Switch: 1'); break;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+print(p) {}
+
+abstract class B {
+  final id;
+  const B(this.id);
+  String toString() => 'C($id)';
+  /** Equality is identity equality, the id isn't used. */
+  bool operator==(Object other);
+  }
+
+class C extends B {
+  const C(id) : super(id);
+}
+
+void doSwitch(c) {
+  switch (c) {
+  case const C(0): print('Switch: 0'); break;
+  case const C(1): print('Switch: 1'); break;
+  }
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_caseExpressionTypeImplementsEquals_int() {
-    Source source = addSource(EngineTestCase.createSource([
-        "f(int i) {",
-        "  switch(i) {",
-        "    case(1) : return 1;",
-        "    default: return 0;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+f(int i) {
+  switch(i) {
+    case(1) : return 1;
+    default: return 0;
+  }
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_caseExpressionTypeImplementsEquals_Object() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class IntWrapper {",
-        "  final int value;",
-        "  const IntWrapper(this.value);",
-        "}",
-        "",
-        "f(IntWrapper intWrapper) {",
-        "  switch(intWrapper) {",
-        "    case(const IntWrapper(1)) : return 1;",
-        "    default: return 0;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class IntWrapper {
+  final int value;
+  const IntWrapper(this.value);
+}
+
+f(IntWrapper intWrapper) {
+  switch(intWrapper) {
+    case(const IntWrapper(1)) : return 1;
+    default: return 0;
+  }
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_caseExpressionTypeImplementsEquals_String() {
-    Source source = addSource(EngineTestCase.createSource([
-        "f(String s) {",
-        "  switch(s) {",
-        "    case('1') : return 1;",
-        "    default: return 0;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+f(String s) {
+  switch(s) {
+    case('1') : return 1;
+    default: return 0;
+  }
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_commentReference_beforeConstructor() {
-    String code = EngineTestCase.createSource(["abstract class A {", "  /// [p]", "  A(int p) {}", "}"]);
+    String code = r'''
+abstract class A {
+  /// [p]
+  A(int p) {}
+}''';
     Source source = addSource(code);
     resolve(source);
     assertNoErrors(source);
@@ -426,7 +489,10 @@
   }
 
   void test_commentReference_beforeFunction_blockBody() {
-    String code = EngineTestCase.createSource(["/// [p]", "foo(int p) {", "}"]);
+    String code = r'''
+/// [p]
+foo(int p) {
+}''';
     Source source = addSource(code);
     resolve(source);
     assertNoErrors(source);
@@ -437,7 +503,9 @@
   }
 
   void test_commentReference_beforeFunction_expressionBody() {
-    String code = EngineTestCase.createSource(["/// [p]", "foo(int p) => null;"]);
+    String code = r'''
+/// [p]
+foo(int p) => null;''';
     Source source = addSource(code);
     resolve(source);
     assertNoErrors(source);
@@ -448,13 +516,13 @@
   }
 
   void test_commentReference_beforeMethod() {
-    String code = EngineTestCase.createSource([
-        "abstract class A {",
-        "  /// [p1]",
-        "  ma(int p1) {}",
-        "  /// [p2]",
-        "  mb(int p2);",
-        "}"]);
+    String code = r'''
+abstract class A {
+  /// [p1]
+  ma(int p1) {}
+  /// [p2]
+  mb(int p2);
+}''';
     Source source = addSource(code);
     resolve(source);
     assertNoErrors(source);
@@ -471,7 +539,11 @@
   }
 
   void test_commentReference_class() {
-    String code = EngineTestCase.createSource(["/// [foo]", "class A {", "  foo() {}", "}"]);
+    String code = r'''
+/// [foo]
+class A {
+  foo() {}
+}''';
     Source source = addSource(code);
     resolve(source);
     assertNoErrors(source);
@@ -482,17 +554,17 @@
   }
 
   void test_commentReference_setter() {
-    String code = EngineTestCase.createSource([
-        "class A {",
-        "  /// [x] in A",
-        "  mA() {}",
-        "  set x(value) {}",
-        "}",
-        "class B extends A {",
-        "  /// [x] in B",
-        "  mB() {}",
-        "}",
-        ""]);
+    String code = r'''
+class A {
+  /// [x] in A
+  mA() {}
+  set x(value) {}
+}
+class B extends A {
+  /// [x] in B
+  mB() {}
+}
+''';
     Source source = addSource(code);
     resolve(source);
     assertNoErrors(source);
@@ -509,136 +581,147 @@
   }
 
   void test_concreteClassWithAbstractMember() {
-    Source source = addSource(EngineTestCase.createSource(["abstract class A {", "  m();", "}"]));
+    Source source = addSource(r'''
+abstract class A {
+  m();
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_concreteClassWithAbstractMember_inherited() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  m() {}",
-        "}",
-        "class B extends A {",
-        "  m();",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  m() {}
+}
+class B extends A {
+  m();
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_conflictingInstanceGetterAndSuperclassMember_instance() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  get v => 0;",
-        "}",
-        "class B extends A {",
-        "  get v => 1;",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  get v => 0;
+}
+class B extends A {
+  get v => 1;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_conflictingStaticGetterAndInstanceSetter_thisClass() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  static get x => 0;",
-        "  static set x(int p) {}",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  static get x => 0;
+  static set x(int p) {}
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_conflictingStaticSetterAndInstanceMember_thisClass_method() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  static x() {}",
-        "  static set x(int p) {}",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  static x() {}
+  static set x(int p) {}
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_constConstructorWithNonConstSuper_explicit() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  const A();",
-        "}",
-        "class B extends A {",
-        "  const B(): super();",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  const A();
+}
+class B extends A {
+  const B(): super();
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_constConstructorWithNonConstSuper_redirectingFactory() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  A();",
-        "}",
-        "class B implements C {",
-        "  const B();",
-        "}",
-        "class C extends A {",
-        "  const factory C() = B;",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  A();
+}
+class B implements C {
+  const B();
+}
+class C extends A {
+  const factory C() = B;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_constConstructorWithNonConstSuper_unresolved() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  A.a();",
-        "}",
-        "class B extends A {",
-        "  const B(): super();",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  A.a();
+}
+class B extends A {
+  const B(): super();
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT]);
     verify([source]);
   }
 
   void test_constConstructorWithNonFinalField_finalInstanceVar() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  final int x = 0;", "  const A();", "}"]));
+    Source source = addSource(r'''
+class A {
+  final int x = 0;
+  const A();
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_constConstructorWithNonFinalField_mixin() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  a() {}",
-        "}",
-        "class B extends Object with A {",
-        "  const B();",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  a() {}
+}
+class B extends Object with A {
+  const B();
+}''');
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_MIXIN]);
     verify([source]);
   }
 
   void test_constConstructorWithNonFinalField_static() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  static int x;", "  const A();", "}"]));
+    Source source = addSource(r'''
+class A {
+  static int x;
+  const A();
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_constConstructorWithNonFinalField_syntheticField() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  const A();",
-        "  set x(value) {}",
-        "  get x {return 0;}",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  const A();
+  set x(value) {}
+  get x {return 0;}
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -646,235 +729,255 @@
 
   void test_constDeferredClass_new() {
     resolveWithAndWithoutExperimental(<String> [
-        EngineTestCase.createSource(["library lib1;", "class A {", "  const A.b();", "}"]),
-        EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "main() {",
-        "  new a.A.b();",
-        "}"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> []);
+        r'''
+library lib1;
+class A {
+  const A.b();
+}''',
+        r'''
+library root;
+import 'lib1.dart' deferred as a;
+main() {
+  new a.A.b();
+}'''], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> []);
   }
 
   void test_constEval_functionTypeLiteral() {
-    Source source = addSource(EngineTestCase.createSource(["typedef F();", "const C = F;"]));
+    Source source = addSource(r'''
+typedef F();
+const C = F;''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_constEval_propertyExtraction_fieldStatic_targetType() {
-    addNamedSource("/math.dart", EngineTestCase.createSource(["library math;", "const PI = 3.14;"]));
-    Source source = addSource(EngineTestCase.createSource(["import 'math.dart' as math;", "const C = math.PI;"]));
+    addNamedSource("/math.dart", r'''
+library math;
+const PI = 3.14;''');
+    Source source = addSource(r'''
+import 'math.dart' as math;
+const C = math.PI;''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_constEval_propertyExtraction_methodStatic_targetType() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  const A();",
-        "  static m() {}",
-        "}",
-        "const C = A.m;"]));
+    Source source = addSource(r'''
+class A {
+  const A();
+  static m() {}
+}
+const C = A.m;''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_constEval_symbol() {
-    addNamedSource("/math.dart", EngineTestCase.createSource(["library math;", "const PI = 3.14;"]));
-    Source source = addSource(EngineTestCase.createSource(["const C = #foo;", "foo() {}"]));
+    addNamedSource("/math.dart", r'''
+library math;
+const PI = 3.14;''');
+    Source source = addSource(r'''
+const C = #foo;
+foo() {}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_constEvalTypeBoolNumString_equal() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  const A();",
-        "}",
-        "class B {",
-        "  final v;",
-        "  const B.a1(bool p) : v = p == true;",
-        "  const B.a2(bool p) : v = p == false;",
-        "  const B.a3(bool p) : v = p == 0;",
-        "  const B.a4(bool p) : v = p == 0.0;",
-        "  const B.a5(bool p) : v = p == '';",
-        "  const B.b1(int p) : v = p == true;",
-        "  const B.b2(int p) : v = p == false;",
-        "  const B.b3(int p) : v = p == 0;",
-        "  const B.b4(int p) : v = p == 0.0;",
-        "  const B.b5(int p) : v = p == '';",
-        "  const B.c1(String p) : v = p == true;",
-        "  const B.c2(String p) : v = p == false;",
-        "  const B.c3(String p) : v = p == 0;",
-        "  const B.c4(String p) : v = p == 0.0;",
-        "  const B.c5(String p) : v = p == '';",
-        "  const B.n1(num p) : v = p == null;",
-        "  const B.n2(num p) : v = null == p;",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  const A();
+}
+class B {
+  final v;
+  const B.a1(bool p) : v = p == true;
+  const B.a2(bool p) : v = p == false;
+  const B.a3(bool p) : v = p == 0;
+  const B.a4(bool p) : v = p == 0.0;
+  const B.a5(bool p) : v = p == '';
+  const B.b1(int p) : v = p == true;
+  const B.b2(int p) : v = p == false;
+  const B.b3(int p) : v = p == 0;
+  const B.b4(int p) : v = p == 0.0;
+  const B.b5(int p) : v = p == '';
+  const B.c1(String p) : v = p == true;
+  const B.c2(String p) : v = p == false;
+  const B.c3(String p) : v = p == 0;
+  const B.c4(String p) : v = p == 0.0;
+  const B.c5(String p) : v = p == '';
+  const B.n1(num p) : v = p == null;
+  const B.n2(num p) : v = null == p;
+}''');
     resolve(source);
     assertNoErrors(source);
   }
 
   void test_constEvalTypeBoolNumString_notEqual() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  const A();",
-        "}",
-        "class B {",
-        "  final v;",
-        "  const B.a1(bool p) : v = p != true;",
-        "  const B.a2(bool p) : v = p != false;",
-        "  const B.a3(bool p) : v = p != 0;",
-        "  const B.a4(bool p) : v = p != 0.0;",
-        "  const B.a5(bool p) : v = p != '';",
-        "  const B.b1(int p) : v = p != true;",
-        "  const B.b2(int p) : v = p != false;",
-        "  const B.b3(int p) : v = p != 0;",
-        "  const B.b4(int p) : v = p != 0.0;",
-        "  const B.b5(int p) : v = p != '';",
-        "  const B.c1(String p) : v = p != true;",
-        "  const B.c2(String p) : v = p != false;",
-        "  const B.c3(String p) : v = p != 0;",
-        "  const B.c4(String p) : v = p != 0.0;",
-        "  const B.c5(String p) : v = p != '';",
-        "  const B.n1(num p) : v = p != null;",
-        "  const B.n2(num p) : v = null != p;",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  const A();
+}
+class B {
+  final v;
+  const B.a1(bool p) : v = p != true;
+  const B.a2(bool p) : v = p != false;
+  const B.a3(bool p) : v = p != 0;
+  const B.a4(bool p) : v = p != 0.0;
+  const B.a5(bool p) : v = p != '';
+  const B.b1(int p) : v = p != true;
+  const B.b2(int p) : v = p != false;
+  const B.b3(int p) : v = p != 0;
+  const B.b4(int p) : v = p != 0.0;
+  const B.b5(int p) : v = p != '';
+  const B.c1(String p) : v = p != true;
+  const B.c2(String p) : v = p != false;
+  const B.c3(String p) : v = p != 0;
+  const B.c4(String p) : v = p != 0.0;
+  const B.c5(String p) : v = p != '';
+  const B.n1(num p) : v = p != null;
+  const B.n2(num p) : v = null != p;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_constMapKeyExpressionTypeImplementsEquals_abstract() {
-    Source source = addSource(EngineTestCase.createSource([
-        "abstract class B {",
-        "  final id;",
-        "  const B(this.id);",
-        "  String toString() => 'C(\$id)';",
-        "  /** Equality is identity equality, the id isn't used. */",
-        "  bool operator==(Object other);",
-        "  }",
-        "",
-        "class C extends B {",
-        "  const C(id) : super(id);",
-        "}",
-        "",
-        "Map getMap() {",
-        "  return const { const C(0): 'Map: 0' };",
-        "}"]));
+    Source source = addSource(r'''
+abstract class B {
+  final id;
+  const B(this.id);
+  String toString() => 'C($id)';
+  /** Equality is identity equality, the id isn't used. */
+  bool operator==(Object other);
+  }
+
+class C extends B {
+  const C(id) : super(id);
+}
+
+Map getMap() {
+  return const { const C(0): 'Map: 0' };
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_constNotInitialized_field() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  static const int x = 0;", "}"]));
+    Source source = addSource(r'''
+class A {
+  static const int x = 0;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_constNotInitialized_local() {
-    Source source = addSource(EngineTestCase.createSource(["main() {", "  const int x = 0;", "}"]));
+    Source source = addSource(r'''
+main() {
+  const int x = 0;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_constructorDeclaration_scope_signature() {
-    Source source = addSource(EngineTestCase.createSource([
-        "const app = 0;",
-        "class A {",
-        "  A(@app int app) {}",
-        "}"]));
+    Source source = addSource(r'''
+const app = 0;
+class A {
+  A(@app int app) {}
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_constWithNonConstantArgument_literals() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  const A(a, b, c, d);",
-        "}",
-        "f() { return const A(true, 0, 1.0, '2'); }"]));
+    Source source = addSource(r'''
+class A {
+  const A(a, b, c, d);
+}
+f() { return const A(true, 0, 1.0, '2'); }''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_constWithTypeParameters_direct() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A<T> {",
-        "  static const V = const A<int>();",
-        "  const A();",
-        "}"]));
+    Source source = addSource(r'''
+class A<T> {
+  static const V = const A<int>();
+  const A();
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_constWithUndefinedConstructor() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  const A.name();",
-        "}",
-        "f() {",
-        "  return const A.name();",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  const A.name();
+}
+f() {
+  return const A.name();
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_constWithUndefinedConstructorDefault() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  const A();",
-        "}",
-        "f() {",
-        "  return const A();",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  const A();
+}
+f() {
+  return const A();
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_defaultValueInFunctionTypeAlias() {
-    Source source = addSource(EngineTestCase.createSource(["typedef F([x]);"]));
+    Source source = addSource("typedef F([x]);");
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_defaultValueInFunctionTypedParameter_named() {
-    Source source = addSource(EngineTestCase.createSource(["f(g({p})) {}"]));
+    Source source = addSource("f(g({p})) {}");
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_defaultValueInFunctionTypedParameter_optional() {
-    Source source = addSource(EngineTestCase.createSource(["f(g([p])) {}"]));
+    Source source = addSource("f(g([p])) {}");
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_deprecatedMemberUse_hide() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library lib;",
-        "import 'lib1.dart' hide B;",
-        "A a = new A();"]));
-    addNamedSource("/lib1.dart", EngineTestCase.createSource([
-        "library lib1;",
-        "class A {}",
-        "@deprecated",
-        "class B {}"]));
+    Source source = addSource(r'''
+library lib;
+import 'lib1.dart' hide B;
+A a = new A();''');
+    addNamedSource("/lib1.dart", r'''
+library lib1;
+class A {}
+@deprecated
+class B {}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -883,286 +986,353 @@
   void test_duplicateDefinition_emptyName() {
     // Note: This code has two FunctionElements '() {}' with an empty name, this tests that the
     // empty string is not put into the scope (more than once).
-    Source source = addSource(EngineTestCase.createSource([
-        "Map _globalMap = {",
-        "  'a' : () {},",
-        "  'b' : () {}",
-        "};"]));
+    Source source = addSource(r'''
+Map _globalMap = {
+  'a' : () {},
+  'b' : () {}
+};''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_duplicateDefinition_getter() {
-    Source source = addSource(EngineTestCase.createSource(["bool get a => true;"]));
+    Source source = addSource("bool get a => true;");
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_dynamicIdentifier() {
-    Source source = addSource(EngineTestCase.createSource(["main() {", "  var v = dynamic;", "}"]));
+    Source source = addSource(r'''
+main() {
+  var v = dynamic;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_expectedOneListTypeArgument() {
-    Source source = addSource(EngineTestCase.createSource(["main() {", "  <int> [];", "}"]));
+    Source source = addSource(r'''
+main() {
+  <int> [];
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_expectedTwoMapTypeArguments() {
-    Source source = addSource(EngineTestCase.createSource(["main() {", "  <int, int> {};", "}"]));
+    Source source = addSource(r'''
+main() {
+  <int, int> {};
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_exportOfNonLibrary_libraryDeclared() {
-    Source source = addSource(EngineTestCase.createSource(["library L;", "export 'lib1.dart';"]));
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;"]));
+    Source source = addSource(r'''
+library L;
+export 'lib1.dart';''');
+    addNamedSource("/lib1.dart", "library lib1;");
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_exportOfNonLibrary_libraryNotDeclared() {
-    Source source = addSource(EngineTestCase.createSource(["library L;", "export 'lib1.dart';"]));
-    addNamedSource("/lib1.dart", EngineTestCase.createSource([""]));
+    Source source = addSource(r'''
+library L;
+export 'lib1.dart';''');
+    addNamedSource("/lib1.dart", "");
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_extraPositionalArguments_function() {
-    Source source = addSource(EngineTestCase.createSource(["f(p1, p2) {}", "main() {", "  f(1, 2);", "}"]));
+    Source source = addSource(r'''
+f(p1, p2) {}
+main() {
+  f(1, 2);
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_extraPositionalArguments_Function() {
-    Source source = addSource(EngineTestCase.createSource(["f(Function a) {", "  a(1, 2);", "}"]));
+    Source source = addSource(r'''
+f(Function a) {
+  a(1, 2);
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_extraPositionalArguments_implicitConstructor() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A<E extends num> {",
-        "  A(E x, E y);",
-        "}",
-        "class M {}",
-        "class B<E extends num> = A<E> with M;",
-        "void main() {",
-        "   B<int> x = new B<int>(0,0);",
-        "}"]));
+    Source source = addSource(r'''
+class A<E extends num> {
+  A(E x, E y);
+}
+class M {}
+class B<E extends num> = A<E> with M;
+void main() {
+   B<int> x = new B<int>(0,0);
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_extraPositionalArguments_typedef_local() {
-    Source source = addSource(EngineTestCase.createSource([
-        "typedef A(p1, p2);",
-        "A getA() => null;",
-        "f() {",
-        "  A a = getA();",
-        "  a(1, 2);",
-        "}"]));
+    Source source = addSource(r'''
+typedef A(p1, p2);
+A getA() => null;
+f() {
+  A a = getA();
+  a(1, 2);
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_extraPositionalArguments_typedef_parameter() {
-    Source source = addSource(EngineTestCase.createSource(["typedef A(p1, p2);", "f(A a) {", "  a(1, 2);", "}"]));
+    Source source = addSource(r'''
+typedef A(p1, p2);
+f(A a) {
+  a(1, 2);
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_fieldInitializedByMultipleInitializers() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  int x;",
-        "  int y;",
-        "  A() : x = 0, y = 0 {}",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  int x;
+  int y;
+  A() : x = 0, y = 0 {}
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_fieldInitializedInInitializerAndDeclaration_fieldNotFinal() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  int x = 0;", "  A() : x = 1 {}", "}"]));
+    Source source = addSource(r'''
+class A {
+  int x = 0;
+  A() : x = 1 {}
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_fieldInitializedInInitializerAndDeclaration_finalFieldNotSet() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  final int x;", "  A() : x = 1 {}", "}"]));
+    Source source = addSource(r'''
+class A {
+  final int x;
+  A() : x = 1 {}
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_fieldInitializerOutsideConstructor() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  int x;", "  A(this.x) {}", "}"]));
+    Source source = addSource(r'''
+class A {
+  int x;
+  A(this.x) {}
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_fieldInitializerOutsideConstructor_defaultParameters() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  int x;", "  A([this.x]) {}", "}"]));
+    Source source = addSource(r'''
+class A {
+  int x;
+  A([this.x]) {}
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_fieldInitializerRedirectingConstructor_super() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  A() {}",
-        "}",
-        "class B extends A {",
-        "  int x;",
-        "  B(this.x) : super();",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  A() {}
+}
+class B extends A {
+  int x;
+  B(this.x) : super();
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_finalInitializedInDeclarationAndConstructor_initializer() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  final x;", "  A() : x = 1 {}", "}"]));
+    Source source = addSource(r'''
+class A {
+  final x;
+  A() : x = 1 {}
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_finalInitializedInDeclarationAndConstructor_initializingFormal() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  final x;", "  A(this.x) {}", "}"]));
+    Source source = addSource(r'''
+class A {
+  final x;
+  A(this.x) {}
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_finalNotInitialized_atDeclaration() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  final int x = 0;", "  A() {}", "}"]));
+    Source source = addSource(r'''
+class A {
+  final int x = 0;
+  A() {}
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_finalNotInitialized_fieldFormal() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  final int x = 0;", "  A() {}", "}"]));
+    Source source = addSource(r'''
+class A {
+  final int x = 0;
+  A() {}
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_finalNotInitialized_functionTypedFieldFormal() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  final Function x;",
-        "  A(int this.x(int p)) {}",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  final Function x;
+  A(int this.x(int p)) {}
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_finalNotInitialized_hasNativeClause_hasConstructor() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A native 'something' {",
-        "  final int x;",
-        "  A() {}",
-        "}"]));
+    Source source = addSource(r'''
+class A native 'something' {
+  final int x;
+  A() {}
+}''');
     resolve(source);
     assertErrors(source, [ParserErrorCode.NATIVE_CLAUSE_IN_NON_SDK_CODE]);
     verify([source]);
   }
 
   void test_finalNotInitialized_hasNativeClause_noConstructor() {
-    Source source = addSource(EngineTestCase.createSource(["class A native 'something' {", "  final int x;", "}"]));
+    Source source = addSource(r'''
+class A native 'something' {
+  final int x;
+}''');
     resolve(source);
     assertErrors(source, [ParserErrorCode.NATIVE_CLAUSE_IN_NON_SDK_CODE]);
     verify([source]);
   }
 
   void test_finalNotInitialized_initializer() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  final int x;", "  A() : x = 0 {}", "}"]));
+    Source source = addSource(r'''
+class A {
+  final int x;
+  A() : x = 0 {}
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_finalNotInitialized_redirectingConstructor() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  final int x;",
-        "  A(this.x);",
-        "  A.named() : this (42);",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  final int x;
+  A(this.x);
+  A.named() : this (42);
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_functionDeclaration_scope_returnType() {
-    Source source = addSource(EngineTestCase.createSource(["int f(int) { return 0; }"]));
+    Source source = addSource("int f(int) { return 0; }");
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_functionDeclaration_scope_signature() {
-    Source source = addSource(EngineTestCase.createSource(["const app = 0;", "f(@app int app) {}"]));
+    Source source = addSource(r'''
+const app = 0;
+f(@app int app) {}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_functionTypeAlias_scope_returnType() {
-    Source source = addSource(EngineTestCase.createSource(["typedef int f(int);"]));
+    Source source = addSource("typedef int f(int);");
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_functionTypeAlias_scope_signature() {
-    Source source = addSource(EngineTestCase.createSource(["const app = 0;", "typedef int f(@app int app);"]));
+    Source source = addSource(r'''
+const app = 0;
+typedef int f(@app int app);''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_functionWithoutCall() {
-    Source source = addSource(EngineTestCase.createSource([
-        "abstract class A implements Function {",
-        "}",
-        "class B implements A {",
-        "  void call() {}",
-        "}",
-        "class C extends A {",
-        "  void call() {}",
-        "}",
-        "class D extends C {",
-        "}"]));
+    Source source = addSource(r'''
+abstract class A implements Function {
+}
+class B implements A {
+  void call() {}
+}
+class C extends A {
+  void call() {}
+}
+class D extends C {
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_functionWithoutCall_doesNotImplementFunction() {
-    Source source = addSource(EngineTestCase.createSource(["class A {}"]));
+    Source source = addSource("class A {}");
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -1170,168 +1340,172 @@
 
   void test_functionWithoutCall_withNoSuchMethod() {
     // 16078
-    Source source = addSource(EngineTestCase.createSource([
-        "class A implements Function {",
-        "  noSuchMethod(inv) {",
-        "    return 42;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A implements Function {
+  noSuchMethod(inv) {
+    return 42;
+  }
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_implicitThisReferenceInInitializer_constructorName() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  A.named() {}",
-        "}",
-        "class B {",
-        "  var v;",
-        "  B() : v = new A.named();",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  A.named() {}
+}
+class B {
+  var v;
+  B() : v = new A.named();
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_implicitThisReferenceInInitializer_importPrefix() {
-    Source source = addSource(EngineTestCase.createSource([
-        "import 'dart:async' as abstract;",
-        "class A {",
-        "  var v = new abstract.Completer();",
-        "}"]));
+    Source source = addSource(r'''
+import 'dart:async' as abstract;
+class A {
+  var v = new abstract.Completer();
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_implicitThisReferenceInInitializer_prefixedIdentifier() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  var f;",
-        "}",
-        "class B {",
-        "  var v;",
-        "  B(A a) : v = a.f;",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  var f;
+}
+class B {
+  var v;
+  B(A a) : v = a.f;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_implicitThisReferenceInInitializer_qualifiedMethodInvocation() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  f() {}",
-        "}",
-        "class B {",
-        "  var v;",
-        "  B() : v = new A().f();",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  f() {}
+}
+class B {
+  var v;
+  B() : v = new A().f();
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_implicitThisReferenceInInitializer_qualifiedPropertyAccess() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  var f;",
-        "}",
-        "class B {",
-        "  var v;",
-        "  B() : v = new A().f;",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  var f;
+}
+class B {
+  var v;
+  B() : v = new A().f;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_implicitThisReferenceInInitializer_staticField_thisClass() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  var v;",
-        "  A() : v = f;",
-        "  static var f;",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  var v;
+  A() : v = f;
+  static var f;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_implicitThisReferenceInInitializer_staticGetter() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  var v;",
-        "  A() : v = f;",
-        "  static get f => 42;",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  var v;
+  A() : v = f;
+  static get f => 42;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_implicitThisReferenceInInitializer_staticMethod() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  var v;",
-        "  A() : v = f();",
-        "  static f() => 42;",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  var v;
+  A() : v = f();
+  static f() => 42;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_implicitThisReferenceInInitializer_topLevelField() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  var v;",
-        "  A() : v = f;",
-        "}",
-        "var f = 42;"]));
+    Source source = addSource(r'''
+class A {
+  var v;
+  A() : v = f;
+}
+var f = 42;''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_implicitThisReferenceInInitializer_topLevelFunction() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  var v;",
-        "  A() : v = f();",
-        "}",
-        "f() => 42;"]));
+    Source source = addSource(r'''
+class A {
+  var v;
+  A() : v = f();
+}
+f() => 42;''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_implicitThisReferenceInInitializer_topLevelGetter() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  var v;",
-        "  A() : v = f;",
-        "}",
-        "get f => 42;"]));
+    Source source = addSource(r'''
+class A {
+  var v;
+  A() : v = f;
+}
+get f => 42;''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_implicitThisReferenceInInitializer_typeParameter() {
-    Source source = addSource(EngineTestCase.createSource(["class A<T> {", "  var v;", "  A(p) : v = (p is T);", "}"]));
+    Source source = addSource(r'''
+class A<T> {
+  var v;
+  A(p) : v = (p is T);
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_importDuplicatedLibraryName() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library test;",
-        "import 'lib.dart';",
-        "import 'lib.dart';"]));
+    Source source = addSource(r'''
+library test;
+import 'lib.dart';
+import 'lib.dart';''');
     addNamedSource("/lib.dart", "library lib;");
     resolve(source);
     assertErrors(source, [
@@ -1342,128 +1516,140 @@
   }
 
   void test_importOfNonLibrary_libraryDeclared() {
-    Source source = addSource(EngineTestCase.createSource(["library lib;", "import 'part.dart';", "A a;"]));
-    addNamedSource("/part.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
+    Source source = addSource(r'''
+library lib;
+import 'part.dart';
+A a;''');
+    addNamedSource("/part.dart", r'''
+library lib1;
+class A {}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_importOfNonLibrary_libraryNotDeclared() {
-    Source source = addSource(EngineTestCase.createSource(["library lib;", "import 'part.dart';", "A a;"]));
-    addNamedSource("/part.dart", EngineTestCase.createSource(["class A {}"]));
+    Source source = addSource(r'''
+library lib;
+import 'part.dart';
+A a;''');
+    addNamedSource("/part.dart", "class A {}");
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_importPrefixes_withFirstLetterDifference() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library L;",
-        "import 'lib1.dart' as math;",
-        "import 'lib2.dart' as path;",
-        "main() {",
-        "  math.test1();",
-        "  path.test2();",
-        "}"]));
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "test1() {}"]));
-    addNamedSource("/lib2.dart", EngineTestCase.createSource(["library lib2;", "test2() {}"]));
+    Source source = addSource(r'''
+library L;
+import 'lib1.dart' as math;
+import 'lib2.dart' as path;
+main() {
+  math.test1();
+  path.test2();
+}''');
+    addNamedSource("/lib1.dart", r'''
+library lib1;
+test1() {}''');
+    addNamedSource("/lib2.dart", r'''
+library lib2;
+test2() {}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_inconsistentCaseExpressionTypes() {
-    Source source = addSource(EngineTestCase.createSource([
-        "f(var p) {",
-        "  switch (p) {",
-        "    case 1:",
-        "      break;",
-        "    case 2:",
-        "      break;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+f(var p) {
+  switch (p) {
+    case 1:
+      break;
+    case 2:
+      break;
+  }
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_inconsistentMethodInheritance_accessors_typeParameter2() {
-    Source source = addSource(EngineTestCase.createSource([
-        "abstract class A<E> {",
-        "  E get x {return null;}",
-        "}",
-        "class B<E> {",
-        "  E get x {return null;}",
-        "}",
-        "class C<E> extends A<E> implements B<E> {}"]));
+    Source source = addSource(r'''
+abstract class A<E> {
+  E get x {return null;}
+}
+class B<E> {
+  E get x {return null;}
+}
+class C<E> extends A<E> implements B<E> {}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_inconsistentMethodInheritance_accessors_typeParameters_diamond() {
-    Source source = addSource(EngineTestCase.createSource([
-        "abstract class F<E> extends B<E> {}",
-        "class D<E> extends F<E> {",
-        "  external E get g;",
-        "}",
-        "abstract class C<E> {",
-        "  E get g;",
-        "}",
-        "abstract class B<E> implements C<E> {",
-        "  E get g { return null; }",
-        "}",
-        "class A<E> extends B<E> implements D<E> {",
-        "}"]));
+    Source source = addSource(r'''
+abstract class F<E> extends B<E> {}
+class D<E> extends F<E> {
+  external E get g;
+}
+abstract class C<E> {
+  E get g;
+}
+abstract class B<E> implements C<E> {
+  E get g { return null; }
+}
+class A<E> extends B<E> implements D<E> {
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_inconsistentMethodInheritance_accessors_typeParameters1() {
-    Source source = addSource(EngineTestCase.createSource([
-        "abstract class A<E> {",
-        "  E get x;",
-        "}",
-        "abstract class B<E> {",
-        "  E get x;",
-        "}",
-        "class C<E> implements A<E>, B<E> {",
-        "  E get x => null;",
-        "}"]));
+    Source source = addSource(r'''
+abstract class A<E> {
+  E get x;
+}
+abstract class B<E> {
+  E get x;
+}
+class C<E> implements A<E>, B<E> {
+  E get x => null;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_inconsistentMethodInheritance_methods_typeParameter2() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A<E> {",
-        "  x(E e) {}",
-        "}",
-        "class B<E> {",
-        "  x(E e) {}",
-        "}",
-        "class C<E> extends A<E> implements B<E> {",
-        "  x(E e) {}",
-        "}"]));
+    Source source = addSource(r'''
+class A<E> {
+  x(E e) {}
+}
+class B<E> {
+  x(E e) {}
+}
+class C<E> extends A<E> implements B<E> {
+  x(E e) {}
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_inconsistentMethodInheritance_methods_typeParameters1() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A<E> {",
-        "  x(E e) {}",
-        "}",
-        "class B<E> {",
-        "  x(E e) {}",
-        "}",
-        "class C<E> implements A<E>, B<E> {",
-        "  x(E e) {}",
-        "}"]));
+    Source source = addSource(r'''
+class A<E> {
+  x(E e) {}
+}
+class B<E> {
+  x(E e) {}
+}
+class C<E> implements A<E>, B<E> {
+  x(E e) {}
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -1471,16 +1657,16 @@
 
   void test_inconsistentMethodInheritance_overrideTrumpsInherits_getter() {
     // 16134
-    Source source = addSource(EngineTestCase.createSource([
-        "class B<S> {",
-        "  S get g => null;",
-        "}",
-        "abstract class I<U> {",
-        "  U get g => null;",
-        "}",
-        "class C extends B<double> implements I<int> {",
-        "  num get g => null;",
-        "}"]));
+    Source source = addSource(r'''
+class B<S> {
+  S get g => null;
+}
+abstract class I<U> {
+  U get g => null;
+}
+class C extends B<double> implements I<int> {
+  num get g => null;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -1488,16 +1674,16 @@
 
   void test_inconsistentMethodInheritance_overrideTrumpsInherits_method() {
     // 16134
-    Source source = addSource(EngineTestCase.createSource([
-        "class B<S> {",
-        "  m(S s) => null;",
-        "}",
-        "abstract class I<U> {",
-        "  m(U u) => null;",
-        "}",
-        "class C extends B<double> implements I<int> {",
-        "  m(num n) => null;",
-        "}"]));
+    Source source = addSource(r'''
+class B<S> {
+  m(S s) => null;
+}
+abstract class I<U> {
+  m(U u) => null;
+}
+class C extends B<double> implements I<int> {
+  m(num n) => null;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -1505,188 +1691,243 @@
 
   void test_inconsistentMethodInheritance_overrideTrumpsInherits_setter() {
     // 16134
-    Source source = addSource(EngineTestCase.createSource([
-        "class B<S> {",
-        "  set t(S s) {}",
-        "}",
-        "abstract class I<U> {",
-        "  set t(U u) {}",
-        "}",
-        "class C extends B<double> implements I<int> {",
-        "  set t(num n) {}",
-        "}"]));
+    Source source = addSource(r'''
+class B<S> {
+  set t(S s) {}
+}
+abstract class I<U> {
+  set t(U u) {}
+}
+class C extends B<double> implements I<int> {
+  set t(num n) {}
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_inconsistentMethodInheritance_simple() {
-    Source source = addSource(EngineTestCase.createSource([
-        "abstract class A {",
-        "  x();",
-        "}",
-        "abstract class B {",
-        "  x();",
-        "}",
-        "class C implements A, B {",
-        "  x() {}",
-        "}"]));
+    Source source = addSource(r'''
+abstract class A {
+  x();
+}
+abstract class B {
+  x();
+}
+class C implements A, B {
+  x() {}
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_initializingFormalForNonExistentField() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  int x;", "  A(this.x) {}", "}"]));
+    Source source = addSource(r'''
+class A {
+  int x;
+  A(this.x) {}
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_instanceAccessToStaticMember_fromComment() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  static m() {}",
-        "}",
-        "/// [A.m]",
-        "main() {",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  static m() {}
+}
+/// [A.m]
+main() {
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_instanceAccessToStaticMember_topLevel() {
-    Source source = addSource(EngineTestCase.createSource(["m() {}", "main() {", "  m();", "}"]));
+    Source source = addSource(r'''
+m() {}
+main() {
+  m();
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_instanceMemberAccessFromStatic_fromComment() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  m() {}",
-        "  /// [m]",
-        "  static foo() {",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  m() {}
+  /// [m]
+  static foo() {
+  }
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_instanceMethodNameCollidesWithSuperclassStatic_field() {
-    Source source = addSource(EngineTestCase.createSource([
-        "import 'lib.dart';",
-        "class B extends A {",
-        "  _m() {}",
-        "}"]));
-    addNamedSource("/lib.dart", EngineTestCase.createSource(["library L;", "class A {", "  static var _m;", "}"]));
+    Source source = addSource(r'''
+import 'lib.dart';
+class B extends A {
+  _m() {}
+}''');
+    addNamedSource("/lib.dart", r'''
+library L;
+class A {
+  static var _m;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_instanceMethodNameCollidesWithSuperclassStatic_method() {
-    Source source = addSource(EngineTestCase.createSource([
-        "import 'lib.dart';",
-        "class B extends A {",
-        "  _m() {}",
-        "}"]));
-    addNamedSource("/lib.dart", EngineTestCase.createSource(["library L;", "class A {", "  static _m() {}", "}"]));
+    Source source = addSource(r'''
+import 'lib.dart';
+class B extends A {
+  _m() {}
+}''');
+    addNamedSource("/lib.dart", r'''
+library L;
+class A {
+  static _m() {}
+}''');
     resolve(source);
     assertErrors(source, []);
     verify([source]);
   }
 
   void test_invalidAnnotation_constantVariable_field() {
-    Source source = addSource(EngineTestCase.createSource(["@A.C", "class A {", "  static const C = 0;", "}"]));
+    Source source = addSource(r'''
+@A.C
+class A {
+  static const C = 0;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_invalidAnnotation_constantVariable_field_importWithPrefix() {
-    addNamedSource("/lib.dart", EngineTestCase.createSource(["library lib;", "class A {", "  static const C = 0;", "}"]));
-    Source source = addSource(EngineTestCase.createSource(["import 'lib.dart' as p;", "@p.A.C", "main() {", "}"]));
+    addNamedSource("/lib.dart", r'''
+library lib;
+class A {
+  static const C = 0;
+}''');
+    Source source = addSource(r'''
+import 'lib.dart' as p;
+@p.A.C
+main() {
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_invalidAnnotation_constantVariable_topLevel() {
-    Source source = addSource(EngineTestCase.createSource(["const C = 0;", "@C", "main() {", "}"]));
+    Source source = addSource(r'''
+const C = 0;
+@C
+main() {
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_invalidAnnotation_constantVariable_topLevel_importWithPrefix() {
-    addNamedSource("/lib.dart", EngineTestCase.createSource(["library lib;", "const C = 0;"]));
-    Source source = addSource(EngineTestCase.createSource(["import 'lib.dart' as p;", "@p.C", "main() {", "}"]));
+    addNamedSource("/lib.dart", r'''
+library lib;
+const C = 0;''');
+    Source source = addSource(r'''
+import 'lib.dart' as p;
+@p.C
+main() {
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_invalidAnnotation_constConstructor_importWithPrefix() {
-    addNamedSource("/lib.dart", EngineTestCase.createSource(["library lib;", "class A {", "  const A(int p);", "}"]));
-    Source source = addSource(EngineTestCase.createSource(["import 'lib.dart' as p;", "@p.A(42)", "main() {", "}"]));
+    addNamedSource("/lib.dart", r'''
+library lib;
+class A {
+  const A(int p);
+}''');
+    Source source = addSource(r'''
+import 'lib.dart' as p;
+@p.A(42)
+main() {
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_invalidAnnotation_constConstructor_named_importWithPrefix() {
-    addNamedSource("/lib.dart", EngineTestCase.createSource([
-        "library lib;",
-        "class A {",
-        "  const A.named(int p);",
-        "}"]));
-    Source source = addSource(EngineTestCase.createSource([
-        "import 'lib.dart' as p;",
-        "@p.A.named(42)",
-        "main() {",
-        "}"]));
+    addNamedSource("/lib.dart", r'''
+library lib;
+class A {
+  const A.named(int p);
+}''');
+    Source source = addSource(r'''
+import 'lib.dart' as p;
+@p.A.named(42)
+main() {
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_invalidAssignment() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  var x;", "  var y;", "  x = y;", "}"]));
+    Source source = addSource(r'''
+f() {
+  var x;
+  var y;
+  x = y;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_invalidAssignment_compoundAssignment() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class byte {",
-        "  int _value;",
-        "  byte(this._value);",
-        "  byte operator +(int val) { return this; }",
-        "}",
-        "",
-        "void main() {",
-        "  byte b = new byte(52);",
-        "  b += 3;",
-        "}"]));
+    Source source = addSource(r'''
+class byte {
+  int _value;
+  byte(this._value);
+  byte operator +(int val) { return this; }
+}
+
+void main() {
+  byte b = new byte(52);
+  b += 3;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_invalidAssignment_defaultValue_named() {
-    Source source = addSource(EngineTestCase.createSource(["f({String x: '0'}) {", "}"]));
+    Source source = addSource(r'''
+f({String x: '0'}) {
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_invalidAssignment_defaultValue_optional() {
-    Source source = addSource(EngineTestCase.createSource(["f([String x = '0']) {", "}"]));
+    Source source = addSource(r'''
+f([String x = '0']) {
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -1697,15 +1938,15 @@
     //
     // This test and 'test_invalidAssignment_implicitlyImplementFunctionViaCall_2()'
     // are closely related: here we see that 'I' checks as a subtype of 'IntToInt'.
-    Source source = addSource(EngineTestCase.createSource([
-        "class I {",
-        "  int call(int x) => 0;",
-        "}",
-        "class C implements I {",
-        "  noSuchMethod(_) => null;",
-        "}",
-        "typedef int IntToInt(int x);",
-        "IntToInt f = new I();"]));
+    Source source = addSource(r'''
+class I {
+  int call(int x) => 0;
+}
+class C implements I {
+  noSuchMethod(_) => null;
+}
+typedef int IntToInt(int x);
+IntToInt f = new I();''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -1718,15 +1959,15 @@
     // check as a subtype of 'IntToInt'. Together with
     // 'test_invalidAssignment_implicitlyImplementFunctionViaCall_1()' we see
     // that subtyping is not transitive here.
-    Source source = addSource(EngineTestCase.createSource([
-        "class I {",
-        "  int call(int x) => 0;",
-        "}",
-        "class C implements I {",
-        "  noSuchMethod(_) => null;",
-        "}",
-        "typedef int IntToInt(int x);",
-        "IntToInt f = new C();"]));
+    Source source = addSource(r'''
+class I {
+  int call(int x) => 0;
+}
+class C implements I {
+  noSuchMethod(_) => null;
+}
+typedef int IntToInt(int x);
+IntToInt f = new C();''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -1737,15 +1978,15 @@
     //
     // Like 'test_invalidAssignment_implicitlyImplementFunctionViaCall_2()',
     // but uses type 'Function' instead of more precise type 'IntToInt' for 'f'.
-    Source source = addSource(EngineTestCase.createSource([
-        "class I {",
-        "  int call(int x) => 0;",
-        "}",
-        "class C implements I {",
-        "  noSuchMethod(_) => null;",
-        "}",
-        "typedef int IntToInt(int x);",
-        "Function f = new C();"]));
+    Source source = addSource(r'''
+class I {
+  int call(int x) => 0;
+}
+class C implements I {
+  noSuchMethod(_) => null;
+}
+typedef int IntToInt(int x);
+Function f = new C();''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -1761,383 +2002,413 @@
     // for '<:'. However, many of the :/tools/test.py tests assume this transitivity
     // for 'JsBuilder' objects, assigning them to '(String) -> dynamic'. The declared type of
     // 'JsBuilder.call' is '(String, [dynamic]) -> Expression'.
-    Source source = addSource(EngineTestCase.createSource([
-        "class I {",
-        "  int call([int x]) => 0;",
-        "}",
-        "class C implements I {",
-        "  noSuchMethod(_) => null;",
-        "}",
-        "typedef int VoidToInt();",
-        "VoidToInt f = new C();"]));
+    Source source = addSource(r'''
+class I {
+  int call([int x]) => 0;
+}
+class C implements I {
+  noSuchMethod(_) => null;
+}
+typedef int VoidToInt();
+VoidToInt f = new C();''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_invalidAssignment_toDynamic() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  var g;", "  g = () => 0;", "}"]));
+    Source source = addSource(r'''
+f() {
+  var g;
+  g = () => 0;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_invalidFactoryNameNotAClass() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  factory A() {}", "}"]));
+    Source source = addSource(r'''
+class A {
+  factory A() {}
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_invalidIdentifierInAsync() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  m() {",
-        "    int async;",
-        "    int await;",
-        "    int yield;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  m() {
+    int async;
+    int await;
+    int yield;
+  }
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_invalidMethodOverrideNamedParamType() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  m({int a}) {}",
-        "}",
-        "class B implements A {",
-        "  m({int a, int b}) {}",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  m({int a}) {}
+}
+class B implements A {
+  m({int a, int b}) {}
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_invalidOverrideDifferentDefaultValues_named() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  m({int p : 0}) {}",
-        "}",
-        "class B extends A {",
-        "  m({int p : 0}) {}",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  m({int p : 0}) {}
+}
+class B extends A {
+  m({int p : 0}) {}
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_invalidOverrideDifferentDefaultValues_named_function() {
-    Source source = addSource(EngineTestCase.createSource([
-        "nothing() => 'nothing';",
-        "class A {",
-        "  thing(String a, {orElse : nothing}) {}",
-        "}",
-        "class B extends A {",
-        "  thing(String a, {orElse : nothing}) {}",
-        "}"]));
+    Source source = addSource(r'''
+nothing() => 'nothing';
+class A {
+  thing(String a, {orElse : nothing}) {}
+}
+class B extends A {
+  thing(String a, {orElse : nothing}) {}
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_invalidOverrideDifferentDefaultValues_positional() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  m([int p = 0]) {}",
-        "}",
-        "class B extends A {",
-        "  m([int p = 0]) {}",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  m([int p = 0]) {}
+}
+class B extends A {
+  m([int p = 0]) {}
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_invalidOverrideDifferentDefaultValues_positional_changedOrder() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  m([int a = 0, String b = '0']) {}",
-        "}",
-        "class B extends A {",
-        "  m([int b = 0, String a = '0']) {}",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  m([int a = 0, String b = '0']) {}
+}
+class B extends A {
+  m([int b = 0, String a = '0']) {}
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_invalidOverrideDifferentDefaultValues_positional_function() {
-    Source source = addSource(EngineTestCase.createSource([
-        "nothing() => 'nothing';",
-        "class A {",
-        "  thing(String a, [orElse = nothing]) {}",
-        "}",
-        "class B extends A {",
-        "  thing(String a, [orElse = nothing]) {}",
-        "}"]));
+    Source source = addSource(r'''
+nothing() => 'nothing';
+class A {
+  thing(String a, [orElse = nothing]) {}
+}
+class B extends A {
+  thing(String a, [orElse = nothing]) {}
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_invalidOverrideNamed_unorderedNamedParameter() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  m({a, b}) {}",
-        "}",
-        "class B extends A {",
-        "  m({b, a}) {}",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  m({a, b}) {}
+}
+class B extends A {
+  m({b, a}) {}
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_invalidOverrideRequired_less() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  m(a, b) {}",
-        "}",
-        "class B extends A {",
-        "  m(a, [b]) {}",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  m(a, b) {}
+}
+class B extends A {
+  m(a, [b]) {}
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_invalidOverrideRequired_same() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  m(a) {}",
-        "}",
-        "class B extends A {",
-        "  m(a) {}",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  m(a) {}
+}
+class B extends A {
+  m(a) {}
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_invalidOverrideReturnType_returnType_interface() {
-    Source source = addNamedSource("/test.dart", EngineTestCase.createSource([
-        "abstract class A {",
-        "  num m();",
-        "}",
-        "class B implements A {",
-        "  int m() { return 1; }",
-        "}"]));
+    Source source = addNamedSource("/test.dart", r'''
+abstract class A {
+  num m();
+}
+class B implements A {
+  int m() { return 1; }
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_invalidOverrideReturnType_returnType_interface2() {
-    Source source = addNamedSource("/test.dart", EngineTestCase.createSource([
-        "abstract class A {",
-        "  num m();",
-        "}",
-        "abstract class B implements A {",
-        "}",
-        "class C implements B {",
-        "  int m() { return 1; }",
-        "}"]));
+    Source source = addNamedSource("/test.dart", r'''
+abstract class A {
+  num m();
+}
+abstract class B implements A {
+}
+class C implements B {
+  int m() { return 1; }
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_invalidOverrideReturnType_returnType_mixin() {
-    Source source = addNamedSource("/test.dart", EngineTestCase.createSource([
-        "class A {",
-        "  num m() { return 0; }",
-        "}",
-        "class B extends Object with A {",
-        "  int m() { return 1; }",
-        "}"]));
+    Source source = addNamedSource("/test.dart", r'''
+class A {
+  num m() { return 0; }
+}
+class B extends Object with A {
+  int m() { return 1; }
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_invalidOverrideReturnType_returnType_parameterizedTypes() {
-    Source source = addSource(EngineTestCase.createSource([
-        "abstract class A<E> {",
-        "  List<E> m();",
-        "}",
-        "class B extends A<dynamic> {",
-        "  List<dynamic> m() { return new List<dynamic>(); }",
-        "}"]));
+    Source source = addSource(r'''
+abstract class A<E> {
+  List<E> m();
+}
+class B extends A<dynamic> {
+  List<dynamic> m() { return new List<dynamic>(); }
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_invalidOverrideReturnType_returnType_sameType() {
-    Source source = addNamedSource("/test.dart", EngineTestCase.createSource([
-        "class A {",
-        "  int m() { return 0; }",
-        "}",
-        "class B extends A {",
-        "  int m() { return 1; }",
-        "}"]));
+    Source source = addNamedSource("/test.dart", r'''
+class A {
+  int m() { return 0; }
+}
+class B extends A {
+  int m() { return 1; }
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_invalidOverrideReturnType_returnType_superclass() {
-    Source source = addNamedSource("/test.dart", EngineTestCase.createSource([
-        "class A {",
-        "  num m() { return 0; }",
-        "}",
-        "class B extends A {",
-        "  int m() { return 1; }",
-        "}"]));
+    Source source = addNamedSource("/test.dart", r'''
+class A {
+  num m() { return 0; }
+}
+class B extends A {
+  int m() { return 1; }
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_invalidOverrideReturnType_returnType_superclass2() {
-    Source source = addNamedSource("/test.dart", EngineTestCase.createSource([
-        "class A {",
-        "  num m() { return 0; }",
-        "}",
-        "class B extends A {",
-        "}",
-        "class C extends B {",
-        "  int m() { return 1; }",
-        "}"]));
+    Source source = addNamedSource("/test.dart", r'''
+class A {
+  num m() { return 0; }
+}
+class B extends A {
+}
+class C extends B {
+  int m() { return 1; }
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_invalidOverrideReturnType_returnType_void() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  void m() {}",
-        "}",
-        "class B extends A {",
-        "  int m() { return 0; }",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  void m() {}
+}
+class B extends A {
+  int m() { return 0; }
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_invalidReferenceToThis_constructor() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  A() {", "    var v = this;", "  }", "}"]));
+    Source source = addSource(r'''
+class A {
+  A() {
+    var v = this;
+  }
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_invalidReferenceToThis_instanceMethod() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  m() {", "    var v = this;", "  }", "}"]));
+    Source source = addSource(r'''
+class A {
+  m() {
+    var v = this;
+  }
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_invalidTypeArgumentForKey() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  m() {",
-        "    return const <int, int>{};",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  m() {
+    return const <int, int>{};
+  }
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_invalidTypeArgumentInConstList() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A<E> {",
-        "  m() {",
-        "    return <E>[];",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A<E> {
+  m() {
+    return <E>[];
+  }
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_invalidTypeArgumentInConstMap() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A<E> {",
-        "  m() {",
-        "    return <String, E>{};",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A<E> {
+  m() {
+    return <String, E>{};
+  }
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_invocationOfNonFunction_dynamic() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  var f;",
-        "}",
-        "class B extends A {",
-        "  g() {",
-        "    f();",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  var f;
+}
+class B extends A {
+  g() {
+    f();
+  }
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_invocationOfNonFunction_getter() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  var g;",
-        "}",
-        "f() {",
-        "  A a;",
-        "  a.g();",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  var g;
+}
+f() {
+  A a;
+  a.g();
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_invocationOfNonFunction_localVariable() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  var g;", "  g();", "}"]));
+    Source source = addSource(r'''
+f() {
+  var g;
+  g();
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_invocationOfNonFunction_localVariable_dynamic() {
-    Source source = addSource(EngineTestCase.createSource(["f() {}", "main() {", "  var v = f;", "  v();", "}"]));
+    Source source = addSource(r'''
+f() {}
+main() {
+  var v = f;
+  v();
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_invocationOfNonFunction_localVariable_dynamic2() {
-    Source source = addSource(EngineTestCase.createSource([
-        "f() {}",
-        "main() {",
-        "  var v = f;",
-        "  v = 1;",
-        "  v();",
-        "}"]));
+    Source source = addSource(r'''
+f() {}
+main() {
+  var v = f;
+  v = 1;
+  v();
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_invocationOfNonFunction_Object() {
-    Source source = addSource(EngineTestCase.createSource(["main() {", "  Object v = null;", "  v();", "}"]));
+    Source source = addSource(r'''
+main() {
+  Object v = null;
+  v();
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -2145,24 +2416,26 @@
 
   void test_invocationOfNonFunction_proxyOnFunctionClass() {
     // 16078
-    Source source = addSource(EngineTestCase.createSource([
-        "@proxy",
-        "class Functor implements Function {",
-        "  noSuchMethod(inv) {",
-        "    return 42;",
-        "  }",
-        "}",
-        "main() {",
-        "  Functor f = new Functor();",
-        "  f();",
-        "}"]));
+    Source source = addSource(r'''
+@proxy
+class Functor implements Function {
+  noSuchMethod(inv) {
+    return 42;
+  }
+}
+main() {
+  Functor f = new Functor();
+  f();
+}''');
     resolve(source);
     assertErrors(source, []);
     verify([source]);
   }
 
   void test_listElementTypeNotAssignable() {
-    Source source = addSource(EngineTestCase.createSource(["var v1 = <int> [42];", "var v2 = const <int> [42];"]));
+    Source source = addSource(r'''
+var v1 = <int> [42];
+var v2 = const <int> [42];''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -2170,82 +2443,101 @@
 
   void test_loadLibraryDefined() {
     resolveWithAndWithoutExperimental(<String> [
-        EngineTestCase.createSource(["library lib1;", "foo() => 22;"]),
-        EngineTestCase.createSource([
-        "import 'lib1.dart' deferred as other;",
-        "main() {",
-        "  other.loadLibrary().then((_) => other.foo());",
-        "}"])], <ErrorCode> [
+        r'''
+library lib1;
+foo() => 22;''',
+        r'''
+import 'lib1.dart' deferred as other;
+main() {
+  other.loadLibrary().then((_) => other.foo());
+}'''], <ErrorCode> [
         ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED,
         StaticTypeWarningCode.UNDEFINED_FUNCTION], <ErrorCode> []);
   }
 
   void test_mapKeyTypeNotAssignable() {
-    Source source = addSource(EngineTestCase.createSource(["var v = <String, int > {'a' : 1};"]));
+    Source source = addSource("var v = <String, int > {'a' : 1};");
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_memberWithClassName_setter() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  set A(v) {}", "}"]));
+    Source source = addSource(r'''
+class A {
+  set A(v) {}
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_methodDeclaration_scope_signature() {
-    Source source = addSource(EngineTestCase.createSource([
-        "const app = 0;",
-        "class A {",
-        "  foo(@app int app) {}",
-        "}"]));
+    Source source = addSource(r'''
+const app = 0;
+class A {
+  foo(@app int app) {}
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_misMatchedGetterAndSetterTypes_instance_sameTypes() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class C {",
-        "  int get x => 0;",
-        "  set x(int v) {}",
-        "}"]));
+    Source source = addSource(r'''
+class C {
+  int get x => 0;
+  set x(int v) {}
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_misMatchedGetterAndSetterTypes_instance_unspecifiedGetter() {
-    Source source = addSource(EngineTestCase.createSource(["class C {", "  get x => 0;", "  set x(String v) {}", "}"]));
+    Source source = addSource(r'''
+class C {
+  get x => 0;
+  set x(String v) {}
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_misMatchedGetterAndSetterTypes_instance_unspecifiedSetter() {
-    Source source = addSource(EngineTestCase.createSource(["class C {", "  int get x => 0;", "  set x(v) {}", "}"]));
+    Source source = addSource(r'''
+class C {
+  int get x => 0;
+  set x(v) {}
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_misMatchedGetterAndSetterTypes_topLevel_sameTypes() {
-    Source source = addSource(EngineTestCase.createSource(["int get x => 0;", "set x(int v) {}"]));
+    Source source = addSource(r'''
+int get x => 0;
+set x(int v) {}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_misMatchedGetterAndSetterTypes_topLevel_unspecifiedGetter() {
-    Source source = addSource(EngineTestCase.createSource(["get x => 0;", "set x(String v) {}"]));
+    Source source = addSource(r'''
+get x => 0;
+set x(String v) {}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_misMatchedGetterAndSetterTypes_topLevel_unspecifiedSetter() {
-    Source source = addSource(EngineTestCase.createSource(["int get x => 0;", "set x(v) {}"]));
+    Source source = addSource(r'''
+int get x => 0;
+set x(v) {}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -2255,16 +2547,16 @@
     AnalysisOptionsImpl analysisOptions = new AnalysisOptionsImpl();
     analysisOptions.enableEnum = true;
     resetWithOptions(analysisOptions);
-    Source source = addSource(EngineTestCase.createSource([
-        "enum E { A, B, C }",
-        "",
-        "f(E e) {",
-        "  switch (e) {",
-        "    case E.A: break;",
-        "    case E.B: break;",
-        "    case E.C: break;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+enum E { A, B, C }
+
+f(E e) {
+  switch (e) {
+    case E.A: break;
+    case E.B: break;
+    case E.C: break;
+  }
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -2274,217 +2566,229 @@
     AnalysisOptionsImpl analysisOptions = new AnalysisOptionsImpl();
     analysisOptions.enableEnum = true;
     resetWithOptions(analysisOptions);
-    Source source = addSource(EngineTestCase.createSource([
-        "enum E { A, B, C }",
-        "",
-        "f(E e) {",
-        "  switch (e) {",
-        "    case E.B: break;",
-        "    default: break;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+enum E { A, B, C }
+
+f(E e) {
+  switch (e) {
+    case E.B: break;
+    default: break;
+  }
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_mixedReturnTypes_differentScopes() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class C {",
-        "  m(int x) {",
-        "    f(int y) {",
-        "      return;",
-        "    }",
-        "    f(x);",
-        "    return 0;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class C {
+  m(int x) {
+    f(int y) {
+      return;
+    }
+    f(x);
+    return 0;
+  }
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_mixedReturnTypes_ignoreImplicit() {
-    Source source = addSource(EngineTestCase.createSource([
-        "f(bool p) {",
-        "  if (p) return 42;",
-        "  // implicit 'return;' is ignored",
-        "}"]));
+    Source source = addSource(r'''
+f(bool p) {
+  if (p) return 42;
+  // implicit 'return;' is ignored
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_mixedReturnTypes_ignoreImplicit2() {
-    Source source = addSource(EngineTestCase.createSource([
-        "f(bool p) {",
-        "  if (p) {",
-        "    return 42;",
-        "  } else {",
-        "    return 42;",
-        "  }",
-        "  // implicit 'return;' is ignored",
-        "}"]));
+    Source source = addSource(r'''
+f(bool p) {
+  if (p) {
+    return 42;
+  } else {
+    return 42;
+  }
+  // implicit 'return;' is ignored
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_mixedReturnTypes_sameKind() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class C {",
-        "  m(int x) {",
-        "    if (x < 0) {",
-        "      return 1;",
-        "    }",
-        "    return 0;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class C {
+  m(int x) {
+    if (x < 0) {
+      return 1;
+    }
+    return 0;
+  }
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_mixinDeclaresConstructor() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  m() {}",
-        "}",
-        "class B extends Object with A {}"]));
+    Source source = addSource(r'''
+class A {
+  m() {}
+}
+class B extends Object with A {}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_mixinDeclaresConstructor_factory() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  factory A() {}",
-        "}",
-        "class B extends Object with A {}"]));
+    Source source = addSource(r'''
+class A {
+  factory A() {}
+}
+class B extends Object with A {}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_mixinInheritsFromNotObject_classDeclaration_mixTypeAlias() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B = Object with A;",
-        "class C extends Object with B {}"]));
+    Source source = addSource(r'''
+class A {}
+class B = Object with A;
+class C extends Object with B {}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_mixinInheritsFromNotObject_typedef_mixTypeAlias() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B = Object with A;",
-        "class C = Object with B;"]));
+    Source source = addSource(r'''
+class A {}
+class B = Object with A;
+class C = Object with B;''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_multipleSuperInitializers_no() {
-    Source source = addSource(EngineTestCase.createSource(["class A {}", "class B extends A {", "  B() {}", "}"]));
+    Source source = addSource(r'''
+class A {}
+class B extends A {
+  B() {}
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_multipleSuperInitializers_single() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B extends A {",
-        "  B() : super() {}",
-        "}"]));
+    Source source = addSource(r'''
+class A {}
+class B extends A {
+  B() : super() {}
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_nativeFunctionBodyInNonSDKCode_function() {
-    Source source = addSource(EngineTestCase.createSource(["import 'dart-ext:x';", "int m(a) native 'string';"]));
+    Source source = addSource(r'''
+import 'dart-ext:x';
+int m(a) native 'string';''');
     resolve(source);
     assertNoErrors(source);
     // Cannot verify the AST because the import's URI cannot be resolved.
   }
 
   void test_newWithAbstractClass_factory() {
-    Source source = addSource(EngineTestCase.createSource([
-        "abstract class A {",
-        "  factory A() { return new B(); }",
-        "}",
-        "class B implements A {",
-        "  B() {}",
-        "}",
-        "A f() {",
-        "  return new A();",
-        "}"]));
+    Source source = addSource(r'''
+abstract class A {
+  factory A() { return new B(); }
+}
+class B implements A {
+  B() {}
+}
+A f() {
+  return new A();
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_newWithUndefinedConstructor() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  A.name() {}",
-        "}",
-        "f() {",
-        "  new A.name();",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  A.name() {}
+}
+f() {
+  new A.name();
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_newWithUndefinedConstructorDefault() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  A() {}", "}", "f() {", "  new A();", "}"]));
+    Source source = addSource(r'''
+class A {
+  A() {}
+}
+f() {
+  new A();
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_nonAbstractClassInheritsAbstractMemberOne_abstractsDontOverrideConcretes_getter() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  int get g => 0;",
-        "}",
-        "abstract class B extends A {",
-        "  int get g;",
-        "}",
-        "class C extends B {}"]));
+    Source source = addSource(r'''
+class A {
+  int get g => 0;
+}
+abstract class B extends A {
+  int get g;
+}
+class C extends B {}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_nonAbstractClassInheritsAbstractMemberOne_abstractsDontOverrideConcretes_method() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  m(p) {}",
-        "}",
-        "abstract class B extends A {",
-        "  m(p);",
-        "}",
-        "class C extends B {}"]));
+    Source source = addSource(r'''
+class A {
+  m(p) {}
+}
+abstract class B extends A {
+  m(p);
+}
+class C extends B {}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_nonAbstractClassInheritsAbstractMemberOne_abstractsDontOverrideConcretes_setter() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  set s(v) {}",
-        "}",
-        "abstract class B extends A {",
-        "  set s(v);",
-        "}",
-        "class C extends B {}"]));
+    Source source = addSource(r'''
+class A {
+  set s(v) {}
+}
+abstract class B extends A {
+  set s(v);
+}
+class C extends B {}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -2492,13 +2796,13 @@
 
   void test_nonAbstractClassInheritsAbstractMemberOne_classTypeAlias_interface() {
     // 15979
-    Source source = addSource(EngineTestCase.createSource([
-        "abstract class M {}",
-        "abstract class A {}",
-        "abstract class I {",
-        "  m();",
-        "}",
-        "abstract class B = A with M implements I;"]));
+    Source source = addSource(r'''
+abstract class M {}
+abstract class A {}
+abstract class I {
+  m();
+}
+abstract class B = A with M implements I;''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -2506,12 +2810,12 @@
 
   void test_nonAbstractClassInheritsAbstractMemberOne_classTypeAlias_mixin() {
     // 15979
-    Source source = addSource(EngineTestCase.createSource([
-        "abstract class M {",
-        "  m();",
-        "}",
-        "abstract class A {}",
-        "abstract class B = A with M;"]));
+    Source source = addSource(r'''
+abstract class M {
+  m();
+}
+abstract class A {}
+abstract class B = A with M;''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -2519,12 +2823,12 @@
 
   void test_nonAbstractClassInheritsAbstractMemberOne_classTypeAlias_superclass() {
     // 15979
-    Source source = addSource(EngineTestCase.createSource([
-        "class M {}",
-        "abstract class A {",
-        "  m();",
-        "}",
-        "abstract class B = A with M;"]));
+    Source source = addSource(r'''
+class M {}
+abstract class A {
+  m();
+}
+abstract class B = A with M;''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -2532,451 +2836,486 @@
 
   void test_nonAbstractClassInheritsAbstractMemberOne_mixin_getter() {
     // 17034
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  var a;",
-        "}",
-        "abstract class M {",
-        "  get a;",
-        "}",
-        "class B extends A with M {}",
-        "class C extends B {}"]));
+    Source source = addSource(r'''
+class A {
+  var a;
+}
+abstract class M {
+  get a;
+}
+class B extends A with M {}
+class C extends B {}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_nonAbstractClassInheritsAbstractMemberOne_mixin_method() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  m() {}",
-        "}",
-        "abstract class M {",
-        "  m();",
-        "}",
-        "class B extends A with M {}",
-        "class C extends B {}"]));
+    Source source = addSource(r'''
+class A {
+  m() {}
+}
+abstract class M {
+  m();
+}
+class B extends A with M {}
+class C extends B {}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_nonAbstractClassInheritsAbstractMemberOne_mixin_setter() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  var a;",
-        "}",
-        "abstract class M {",
-        "  set a(dynamic v);",
-        "}",
-        "class B extends A with M {}",
-        "class C extends B {}"]));
+    Source source = addSource(r'''
+class A {
+  var a;
+}
+abstract class M {
+  set a(dynamic v);
+}
+class B extends A with M {}
+class C extends B {}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_nonAbstractClassInheritsAbstractMemberOne_noSuchMethod_accessor() {
-    Source source = addSource(EngineTestCase.createSource([
-        "abstract class A {",
-        "  int get g;",
-        "}",
-        "class B extends A {",
-        "  noSuchMethod(v) => '';",
-        "}"]));
+    Source source = addSource(r'''
+abstract class A {
+  int get g;
+}
+class B extends A {
+  noSuchMethod(v) => '';
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_nonAbstractClassInheritsAbstractMemberOne_noSuchMethod_method() {
-    Source source = addSource(EngineTestCase.createSource([
-        "abstract class A {",
-        "  m(p);",
-        "}",
-        "class B extends A {",
-        "  noSuchMethod(v) => '';",
-        "}"]));
+    Source source = addSource(r'''
+abstract class A {
+  m(p);
+}
+class B extends A {
+  noSuchMethod(v) => '';
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_nonBoolExpression_functionType() {
-    Source source = addSource(EngineTestCase.createSource([
-        "bool makeAssertion() => true;",
-        "f() {",
-        "  assert(makeAssertion);",
-        "}"]));
+    Source source = addSource(r'''
+bool makeAssertion() => true;
+f() {
+  assert(makeAssertion);
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_nonBoolExpression_interfaceType() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  assert(true);", "}"]));
+    Source source = addSource(r'''
+f() {
+  assert(true);
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_nonBoolNegationExpression() {
-    Source source = addSource(EngineTestCase.createSource([
-        "f(bool pb, pd) {",
-        "  !true;",
-        "  !false;",
-        "  !pb;",
-        "  !pd;",
-        "}"]));
+    Source source = addSource(r'''
+f(bool pb, pd) {
+  !true;
+  !false;
+  !pb;
+  !pd;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_nonBoolOperand_and_bool() {
-    Source source = addSource(EngineTestCase.createSource([
-        "bool f(bool left, bool right) {",
-        "  return left && right;",
-        "}"]));
+    Source source = addSource(r'''
+bool f(bool left, bool right) {
+  return left && right;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_nonBoolOperand_and_dynamic() {
-    Source source = addSource(EngineTestCase.createSource([
-        "bool f(left, dynamic right) {",
-        "  return left && right;",
-        "}"]));
+    Source source = addSource(r'''
+bool f(left, dynamic right) {
+  return left && right;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_nonBoolOperand_or_bool() {
-    Source source = addSource(EngineTestCase.createSource([
-        "bool f(bool left, bool right) {",
-        "  return left || right;",
-        "}"]));
+    Source source = addSource(r'''
+bool f(bool left, bool right) {
+  return left || right;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_nonBoolOperand_or_dynamic() {
-    Source source = addSource(EngineTestCase.createSource([
-        "bool f(dynamic left, right) {",
-        "  return left || right;",
-        "}"]));
+    Source source = addSource(r'''
+bool f(dynamic left, right) {
+  return left || right;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_nonConstantDefaultValue_function_named() {
-    Source source = addSource(EngineTestCase.createSource(["f({x : 2 + 3}) {}"]));
+    Source source = addSource("f({x : 2 + 3}) {}");
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_nonConstantDefaultValue_function_positional() {
-    Source source = addSource(EngineTestCase.createSource(["f([x = 2 + 3]) {}"]));
+    Source source = addSource("f([x = 2 + 3]) {}");
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_nonConstantDefaultValue_inConstructor_named() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  A({x : 2 + 3}) {}", "}"]));
+    Source source = addSource(r'''
+class A {
+  A({x : 2 + 3}) {}
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_nonConstantDefaultValue_inConstructor_positional() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  A([x = 2 + 3]) {}", "}"]));
+    Source source = addSource(r'''
+class A {
+  A([x = 2 + 3]) {}
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_nonConstantDefaultValue_method_named() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  m({x : 2 + 3}) {}", "}"]));
+    Source source = addSource(r'''
+class A {
+  m({x : 2 + 3}) {}
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_nonConstantDefaultValue_method_positional() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  m([x = 2 + 3]) {}", "}"]));
+    Source source = addSource(r'''
+class A {
+  m([x = 2 + 3]) {}
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_nonConstantValueInInitializer_namedArgument() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  final a;",
-        "  const A({this.a});",
-        "}",
-        "class B extends A {",
-        "  const B({b}) : super(a: b);",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  final a;
+  const A({this.a});
+}
+class B extends A {
+  const B({b}) : super(a: b);
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_nonConstCaseExpression() {
-    Source source = addSource(EngineTestCase.createSource([
-        "f(Type t) {",
-        "  switch (t) {",
-        "    case bool:",
-        "    case int:",
-        "      return true;",
-        "    default:",
-        "      return false;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+f(Type t) {
+  switch (t) {
+    case bool:
+    case int:
+      return true;
+    default:
+      return false;
+  }
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_nonConstMapAsExpressionStatement_const() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  const {'a' : 0, 'b' : 1};", "}"]));
+    Source source = addSource(r'''
+f() {
+  const {'a' : 0, 'b' : 1};
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_nonConstMapAsExpressionStatement_notExpressionStatement() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  var m = {'a' : 0, 'b' : 1};", "}"]));
+    Source source = addSource(r'''
+f() {
+  var m = {'a' : 0, 'b' : 1};
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_nonConstMapAsExpressionStatement_typeArguments() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  <String, int> {'a' : 0, 'b' : 1};", "}"]));
+    Source source = addSource(r'''
+f() {
+  <String, int> {'a' : 0, 'b' : 1};
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_nonConstValueInInitializer_binary_bool() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  final v;",
-        "  const A.a1(bool p) : v = p && true;",
-        "  const A.a2(bool p) : v = true && p;",
-        "  const A.b1(bool p) : v = p || true;",
-        "  const A.b2(bool p) : v = true || p;",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  final v;
+  const A.a1(bool p) : v = p && true;
+  const A.a2(bool p) : v = true && p;
+  const A.b1(bool p) : v = p || true;
+  const A.b2(bool p) : v = true || p;
+}''');
     resolve(source);
     assertErrors(source, [HintCode.DEAD_CODE]);
     verify([source]);
   }
 
   void test_nonConstValueInInitializer_binary_dynamic() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  final v;",
-        "  const A.a1(p) : v = p + 5;",
-        "  const A.a2(p) : v = 5 + p;",
-        "  const A.b1(p) : v = p - 5;",
-        "  const A.b2(p) : v = 5 - p;",
-        "  const A.c1(p) : v = p * 5;",
-        "  const A.c2(p) : v = 5 * p;",
-        "  const A.d1(p) : v = p / 5;",
-        "  const A.d2(p) : v = 5 / p;",
-        "  const A.e1(p) : v = p ~/ 5;",
-        "  const A.e2(p) : v = 5 ~/ p;",
-        "  const A.f1(p) : v = p > 5;",
-        "  const A.f2(p) : v = 5 > p;",
-        "  const A.g1(p) : v = p < 5;",
-        "  const A.g2(p) : v = 5 < p;",
-        "  const A.h1(p) : v = p >= 5;",
-        "  const A.h2(p) : v = 5 >= p;",
-        "  const A.i1(p) : v = p <= 5;",
-        "  const A.i2(p) : v = 5 <= p;",
-        "  const A.j1(p) : v = p % 5;",
-        "  const A.j2(p) : v = 5 % p;",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  final v;
+  const A.a1(p) : v = p + 5;
+  const A.a2(p) : v = 5 + p;
+  const A.b1(p) : v = p - 5;
+  const A.b2(p) : v = 5 - p;
+  const A.c1(p) : v = p * 5;
+  const A.c2(p) : v = 5 * p;
+  const A.d1(p) : v = p / 5;
+  const A.d2(p) : v = 5 / p;
+  const A.e1(p) : v = p ~/ 5;
+  const A.e2(p) : v = 5 ~/ p;
+  const A.f1(p) : v = p > 5;
+  const A.f2(p) : v = 5 > p;
+  const A.g1(p) : v = p < 5;
+  const A.g2(p) : v = 5 < p;
+  const A.h1(p) : v = p >= 5;
+  const A.h2(p) : v = 5 >= p;
+  const A.i1(p) : v = p <= 5;
+  const A.i2(p) : v = 5 <= p;
+  const A.j1(p) : v = p % 5;
+  const A.j2(p) : v = 5 % p;
+}''');
     resolve(source);
     assertNoErrors(source);
     // operations on "p" are not resolved
   }
 
   void test_nonConstValueInInitializer_binary_int() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  final v;",
-        "  const A.a1(int p) : v = p ^ 5;",
-        "  const A.a2(int p) : v = 5 ^ p;",
-        "  const A.b1(int p) : v = p & 5;",
-        "  const A.b2(int p) : v = 5 & p;",
-        "  const A.c1(int p) : v = p | 5;",
-        "  const A.c2(int p) : v = 5 | p;",
-        "  const A.d1(int p) : v = p >> 5;",
-        "  const A.d2(int p) : v = 5 >> p;",
-        "  const A.e1(int p) : v = p << 5;",
-        "  const A.e2(int p) : v = 5 << p;",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  final v;
+  const A.a1(int p) : v = p ^ 5;
+  const A.a2(int p) : v = 5 ^ p;
+  const A.b1(int p) : v = p & 5;
+  const A.b2(int p) : v = 5 & p;
+  const A.c1(int p) : v = p | 5;
+  const A.c2(int p) : v = 5 | p;
+  const A.d1(int p) : v = p >> 5;
+  const A.d2(int p) : v = 5 >> p;
+  const A.e1(int p) : v = p << 5;
+  const A.e2(int p) : v = 5 << p;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_nonConstValueInInitializer_binary_num() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  final v;",
-        "  const A.a1(num p) : v = p + 5;",
-        "  const A.a2(num p) : v = 5 + p;",
-        "  const A.b1(num p) : v = p - 5;",
-        "  const A.b2(num p) : v = 5 - p;",
-        "  const A.c1(num p) : v = p * 5;",
-        "  const A.c2(num p) : v = 5 * p;",
-        "  const A.d1(num p) : v = p / 5;",
-        "  const A.d2(num p) : v = 5 / p;",
-        "  const A.e1(num p) : v = p ~/ 5;",
-        "  const A.e2(num p) : v = 5 ~/ p;",
-        "  const A.f1(num p) : v = p > 5;",
-        "  const A.f2(num p) : v = 5 > p;",
-        "  const A.g1(num p) : v = p < 5;",
-        "  const A.g2(num p) : v = 5 < p;",
-        "  const A.h1(num p) : v = p >= 5;",
-        "  const A.h2(num p) : v = 5 >= p;",
-        "  const A.i1(num p) : v = p <= 5;",
-        "  const A.i2(num p) : v = 5 <= p;",
-        "  const A.j1(num p) : v = p % 5;",
-        "  const A.j2(num p) : v = 5 % p;",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  final v;
+  const A.a1(num p) : v = p + 5;
+  const A.a2(num p) : v = 5 + p;
+  const A.b1(num p) : v = p - 5;
+  const A.b2(num p) : v = 5 - p;
+  const A.c1(num p) : v = p * 5;
+  const A.c2(num p) : v = 5 * p;
+  const A.d1(num p) : v = p / 5;
+  const A.d2(num p) : v = 5 / p;
+  const A.e1(num p) : v = p ~/ 5;
+  const A.e2(num p) : v = 5 ~/ p;
+  const A.f1(num p) : v = p > 5;
+  const A.f2(num p) : v = 5 > p;
+  const A.g1(num p) : v = p < 5;
+  const A.g2(num p) : v = 5 < p;
+  const A.h1(num p) : v = p >= 5;
+  const A.h2(num p) : v = 5 >= p;
+  const A.i1(num p) : v = p <= 5;
+  const A.i2(num p) : v = 5 <= p;
+  const A.j1(num p) : v = p % 5;
+  const A.j2(num p) : v = 5 % p;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_nonConstValueInInitializer_field() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  final int a;",
-        "  const A() : a = 5;",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  final int a;
+  const A() : a = 5;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_nonConstValueInInitializer_redirecting() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  const A.named(p);",
-        "  const A() : this.named(42);",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  const A.named(p);
+  const A() : this.named(42);
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_nonConstValueInInitializer_super() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  const A(p);",
-        "}",
-        "class B extends A {",
-        "  const B() : super(42);",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  const A(p);
+}
+class B extends A {
+  const B() : super(42);
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_nonConstValueInInitializer_unary() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  final v;",
-        "  const A.a(bool p) : v = !p;",
-        "  const A.b(int p) : v = ~p;",
-        "  const A.c(num p) : v = -p;",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  final v;
+  const A.a(bool p) : v = !p;
+  const A.b(int p) : v = ~p;
+  const A.c(num p) : v = -p;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_nonGenerativeConstructor() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  A.named() {}",
-        "  factory A() {}",
-        "}",
-        "class B extends A {",
-        "  B() : super.named();",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  A.named() {}
+  factory A() {}
+}
+class B extends A {
+  B() : super.named();
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_nonTypeInCatchClause_isClass() {
-    Source source = addSource(EngineTestCase.createSource([
-        "f() {",
-        "  try {",
-        "  } on String catch (e) {",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+f() {
+  try {
+  } on String catch (e) {
+  }
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_nonTypeInCatchClause_isFunctionTypeAlias() {
-    Source source = addSource(EngineTestCase.createSource([
-        "typedef F();",
-        "f() {",
-        "  try {",
-        "  } on F catch (e) {",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+typedef F();
+f() {
+  try {
+  } on F catch (e) {
+  }
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_nonTypeInCatchClause_isTypeParameter() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A<T> {",
-        "  f() {",
-        "    try {",
-        "    } on T catch (e) {",
-        "    }",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A<T> {
+  f() {
+    try {
+    } on T catch (e) {
+    }
+  }
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_nonTypeInCatchClause_noType() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  try {", "  } catch (e) {", "  }", "}"]));
+    Source source = addSource(r'''
+f() {
+  try {
+  } catch (e) {
+  }
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_nonVoidReturnForOperator_no() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  operator []=(a, b) {}", "}"]));
+    Source source = addSource(r'''
+class A {
+  operator []=(a, b) {}
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_nonVoidReturnForOperator_void() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  void operator []=(a, b) {}", "}"]));
+    Source source = addSource(r'''
+class A {
+  void operator []=(a, b) {}
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -2997,354 +3336,371 @@
   }
 
   void test_nonVoidReturnForSetter_method_no() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  set x(v) {}", "}"]));
+    Source source = addSource(r'''
+class A {
+  set x(v) {}
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_nonVoidReturnForSetter_method_void() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  void set x(v) {}", "}"]));
+    Source source = addSource(r'''
+class A {
+  void set x(v) {}
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_null_callMethod() {
-    Source source = addSource(EngineTestCase.createSource(["main() {", "  null.m();", "}"]));
+    Source source = addSource(r'''
+main() {
+  null.m();
+}''');
     resolve(source);
     assertNoErrors(source);
   }
 
   void test_null_callOperator() {
-    Source source = addSource(EngineTestCase.createSource([
-        "main() {",
-        "  null + 5;",
-        "  null == 5;",
-        "  null[0];",
-        "}"]));
+    Source source = addSource(r'''
+main() {
+  null + 5;
+  null == 5;
+  null[0];
+}''');
     resolve(source);
     assertNoErrors(source);
   }
 
   void test_optionalParameterInOperator_required() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  operator +(p) {}", "}"]));
+    Source source = addSource(r'''
+class A {
+  operator +(p) {}
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_prefixCollidesWithTopLevelMembers() {
-    addNamedSource("/lib.dart", EngineTestCase.createSource(["library lib;", "class A {}"]));
-    Source source = addSource(EngineTestCase.createSource([
-        "import 'lib.dart' as p;",
-        "typedef P();",
-        "p2() {}",
-        "var p3;",
-        "class p4 {}",
-        "p.A a;"]));
+    addNamedSource("/lib.dart", r'''
+library lib;
+class A {}''');
+    Source source = addSource(r'''
+import 'lib.dart' as p;
+typedef P();
+p2() {}
+var p3;
+class p4 {}
+p.A a;''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_propagateTypeArgs_intoBounds() {
-    Source source = addSource(EngineTestCase.createSource([
-        "abstract class A<E> {}",
-        "abstract class B<F> implements A<F>{}",
-        "abstract class C<G, H extends A<G>> {}",
-        "class D<I> extends C<I, B<I>> {}"]));
+    Source source = addSource(r'''
+abstract class A<E> {}
+abstract class B<F> implements A<F>{}
+abstract class C<G, H extends A<G>> {}
+class D<I> extends C<I, B<I>> {}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_propagateTypeArgs_intoSupertype() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A<T> {",
-        "  A(T p);",
-        "  A.named(T p);",
-        "}",
-        "class B<S> extends A<S> {",
-        "  B(S p) : super(p);",
-        "  B.named(S p) : super.named(p);",
-        "}"]));
+    Source source = addSource(r'''
+class A<T> {
+  A(T p);
+  A.named(T p);
+}
+class B<S> extends A<S> {
+  B(S p) : super(p);
+  B.named(S p) : super.named(p);
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_proxy_annotation_prefixed() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library L;",
-        "@proxy",
-        "class A {}",
-        "f(A a) {",
-        "  a.m();",
-        "  var x = a.g;",
-        "  a.s = 1;",
-        "  var y = a + a;",
-        "  a++;",
-        "  ++a;",
-        "}"]));
+    Source source = addSource(r'''
+library L;
+@proxy
+class A {}
+f(A a) {
+  a.m();
+  var x = a.g;
+  a.s = 1;
+  var y = a + a;
+  a++;
+  ++a;
+}''');
     resolve(source);
     assertNoErrors(source);
   }
 
   void test_proxy_annotation_prefixed2() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library L;",
-        "@proxy",
-        "class A {}",
-        "class B {",
-        "  f(A a) {",
-        "    a.m();",
-        "    var x = a.g;",
-        "    a.s = 1;",
-        "    var y = a + a;",
-        "    a++;",
-        "    ++a;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+library L;
+@proxy
+class A {}
+class B {
+  f(A a) {
+    a.m();
+    var x = a.g;
+    a.s = 1;
+    var y = a + a;
+    a++;
+    ++a;
+  }
+}''');
     resolve(source);
     assertNoErrors(source);
   }
 
   void test_proxy_annotation_prefixed3() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library L;",
-        "class B {",
-        "  f(A a) {",
-        "    a.m();",
-        "    var x = a.g;",
-        "    a.s = 1;",
-        "    var y = a + a;",
-        "    a++;",
-        "    ++a;",
-        "  }",
-        "}",
-        "@proxy",
-        "class A {}"]));
+    Source source = addSource(r'''
+library L;
+class B {
+  f(A a) {
+    a.m();
+    var x = a.g;
+    a.s = 1;
+    var y = a + a;
+    a++;
+    ++a;
+  }
+}
+@proxy
+class A {}''');
     resolve(source);
     assertNoErrors(source);
   }
 
   void test_proxy_annotation_proxyHasPrefixedIdentifier() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library L;",
-        "import 'dart:core' as core;",
-        "@core.proxy class PrefixProxy {}",
-        "main() {",
-        "  new PrefixProxy().foo;",
-        "  new PrefixProxy().foo();",
-        "}"]));
+    Source source = addSource(r'''
+library L;
+import 'dart:core' as core;
+@core.proxy class PrefixProxy {}
+main() {
+  new PrefixProxy().foo;
+  new PrefixProxy().foo();
+}''');
     resolve(source);
     assertNoErrors(source);
   }
 
   void test_proxy_annotation_simple() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library L;",
-        "@proxy",
-        "class B {",
-        "  m() {",
-        "    n();",
-        "    var x = g;",
-        "    s = 1;",
-        "    var y = this + this;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+library L;
+@proxy
+class B {
+  m() {
+    n();
+    var x = g;
+    s = 1;
+    var y = this + this;
+  }
+}''');
     resolve(source);
     assertNoErrors(source);
   }
 
   void test_proxy_annotation_superclass() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library L;",
-        "class B extends A {",
-        "  m() {",
-        "    n();",
-        "    var x = g;",
-        "    s = 1;",
-        "    var y = this + this;",
-        "  }",
-        "}",
-        "@proxy",
-        "class A {}"]));
+    Source source = addSource(r'''
+library L;
+class B extends A {
+  m() {
+    n();
+    var x = g;
+    s = 1;
+    var y = this + this;
+  }
+}
+@proxy
+class A {}''');
     resolve(source);
     assertNoErrors(source);
   }
 
   void test_proxy_annotation_superclass_mixin() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library L;",
-        "class B extends Object with A {",
-        "  m() {",
-        "    n();",
-        "    var x = g;",
-        "    s = 1;",
-        "    var y = this + this;",
-        "  }",
-        "}",
-        "@proxy",
-        "class A {}"]));
+    Source source = addSource(r'''
+library L;
+class B extends Object with A {
+  m() {
+    n();
+    var x = g;
+    s = 1;
+    var y = this + this;
+  }
+}
+@proxy
+class A {}''');
     resolve(source);
     assertNoErrors(source);
   }
 
   void test_proxy_annotation_superinterface() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library L;",
-        "class B implements A {",
-        "  m() {",
-        "    n();",
-        "    var x = g;",
-        "    s = 1;",
-        "    var y = this + this;",
-        "  }",
-        "}",
-        "@proxy",
-        "class A {}"]));
+    Source source = addSource(r'''
+library L;
+class B implements A {
+  m() {
+    n();
+    var x = g;
+    s = 1;
+    var y = this + this;
+  }
+}
+@proxy
+class A {}''');
     resolve(source);
     assertNoErrors(source);
   }
 
   void test_proxy_annotation_superinterface_infiniteLoop() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library L;",
-        "class C implements A {",
-        "  m() {",
-        "    n();",
-        "    var x = g;",
-        "    s = 1;",
-        "    var y = this + this;",
-        "  }",
-        "}",
-        "class B implements A{}",
-        "class A implements B{}"]));
+    Source source = addSource(r'''
+library L;
+class C implements A {
+  m() {
+    n();
+    var x = g;
+    s = 1;
+    var y = this + this;
+  }
+}
+class B implements A{}
+class A implements B{}''');
     resolve(source);
     // Test is that a stack overflow isn't reached in resolution (previous line), no need to assert
     // error set.
   }
 
   void test_recursiveConstructorRedirect() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  A.a() : this.b();",
-        "  A.b() : this.c();",
-        "  A.c() {}",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  A.a() : this.b();
+  A.b() : this.c();
+  A.c() {}
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_recursiveFactoryRedirect() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  factory A() = B;",
-        "}",
-        "class B implements A {",
-        "  factory B() = C;",
-        "}",
-        "class C implements B {",
-        "  factory C() {}",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  factory A() = B;
+}
+class B implements A {
+  factory B() = C;
+}
+class C implements B {
+  factory C() {}
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_redirectToInvalidFunctionType() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A implements B {",
-        "  A(int p) {}",
-        "}",
-        "class B {",
-        "  factory B(int p) = A;",
-        "}"]));
+    Source source = addSource(r'''
+class A implements B {
+  A(int p) {}
+}
+class B {
+  factory B(int p) = A;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_redirectToInvalidReturnType() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  A() {}",
-        "}",
-        "class B extends A {",
-        "  factory B() = A;",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  A() {}
+}
+class B extends A {
+  factory B() = A;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_redirectToNonConstConstructor() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  const A.a();",
-        "  const factory A.b() = A.a;",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  const A.a();
+  const factory A.b() = A.a;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_referenceToDeclaredVariableInInitializer_constructorName() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  A.x() {}",
-        "}",
-        "f() {",
-        "  var x = new A.x();",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  A.x() {}
+}
+f() {
+  var x = new A.x();
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_referenceToDeclaredVariableInInitializer_methodName() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  x() {}",
-        "}",
-        "f(A a) {",
-        "  var x = a.x();",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  x() {}
+}
+f(A a) {
+  var x = a.x();
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_referenceToDeclaredVariableInInitializer_propertyName() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  var x;",
-        "}",
-        "f(A a) {",
-        "  var x = a.x;",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  var x;
+}
+f(A a) {
+  var x = a.x;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_rethrowOutsideCatch() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  void m() {",
-        "    try {} catch (e) {rethrow;}",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  void m() {
+    try {} catch (e) {rethrow;}
+  }
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_returnInGenerativeConstructor() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  A() { return; }", "}"]));
+    Source source = addSource(r'''
+class A {
+  A() { return; }
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -3352,14 +3708,20 @@
 
   void test_returnInGenerator_async() {
     resetWithAsync();
-    Source source = addSource(EngineTestCase.createSource(["f() async {", "  return 0;", "}"]));
+    Source source = addSource(r'''
+f() async {
+  return 0;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_returnInGenerator_sync() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  return 0;", "}"]));
+    Source source = addSource(r'''
+f() {
+  return 0;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -3369,64 +3731,64 @@
     AnalysisOptionsImpl options = new AnalysisOptionsImpl.con1(analysisContext2.analysisOptions);
     options.enableAsync = true;
     resetWithOptions(options);
-    Source source = addSource(EngineTestCase.createSource([
-        "import 'dart:async';",
-        "class A {",
-        "  Future<int> m() async {",
-        "    return 0;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+import 'dart:async';
+class A {
+  Future<int> m() async {
+    return 0;
+  }
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_returnOfInvalidType_dynamic() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class TypeError {}",
-        "class A {",
-        "  static void testLogicalOp() {",
-        "    testOr(a, b, onTypeError) {",
-        "      try {",
-        "        return a || b;",
-        "      } on TypeError catch (t) {",
-        "        return onTypeError;",
-        "      }",
-        "    }",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class TypeError {}
+class A {
+  static void testLogicalOp() {
+    testOr(a, b, onTypeError) {
+      try {
+        return a || b;
+      } on TypeError catch (t) {
+        return onTypeError;
+      }
+    }
+  }
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_returnOfInvalidType_dynamicAsTypeArgument() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class I<T> {",
-        "  factory I() => new A<T>();",
-        "}",
-        "class A<T> implements I {",
-        "}"]));
+    Source source = addSource(r'''
+class I<T> {
+  factory I() => new A<T>();
+}
+class A<T> implements I {
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_returnOfInvalidType_subtype() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B extends A {}",
-        "A f(B b) { return b; }"]));
+    Source source = addSource(r'''
+class A {}
+class B extends A {}
+A f(B b) { return b; }''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_returnOfInvalidType_supertype() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B extends A {}",
-        "B f(A a) { return a; }"]));
+    Source source = addSource(r'''
+class A {}
+class B extends A {}
+B f(A a) { return a; }''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -3442,49 +3804,52 @@
     // A test cannot be added to TypeParameterTypeImplTest since the types returned out of the
     // TestTypeProvider don't have a mock 'dart.core' enclosing library element.
     // See TypeParameterTypeImpl.isMoreSpecificThan().
-    Source source = addSource(EngineTestCase.createSource(["class Foo<T> {", "  Type get t => T;", "}"]));
+    Source source = addSource(r'''
+class Foo<T> {
+  Type get t => T;
+}''');
     resolve(source);
     assertErrors(source, []);
     verify([source]);
   }
 
   void test_returnOfInvalidType_void() {
-    Source source = addSource(EngineTestCase.createSource([
-        "void f1() {}",
-        "void f2() { return; }",
-        "void f3() { return null; }",
-        "void f4() { return g1(); }",
-        "void f5() { return g2(); }",
-        "g1() {}",
-        "void g2() {}",
-        ""]));
+    Source source = addSource(r'''
+void f1() {}
+void f2() { return; }
+void f3() { return null; }
+void f4() { return g1(); }
+void f5() { return g2(); }
+g1() {}
+void g2() {}
+''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_returnWithoutValue_noReturnType() {
-    Source source = addSource(EngineTestCase.createSource(["f() { return; }"]));
+    Source source = addSource("f() { return; }");
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_returnWithoutValue_void() {
-    Source source = addSource(EngineTestCase.createSource(["void f() { return; }"]));
+    Source source = addSource("void f() { return; }");
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_reversedTypeArguments() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class Codec<S1, T1> {",
-        "  Codec<T1, S1> get inverted => new _InvertedCodec<T1, S1>(this);",
-        "}",
-        "class _InvertedCodec<T2, S2> extends Codec<T2, S2> {",
-        "  _InvertedCodec(Codec<S2, T2> codec);",
-        "}"]));
+    Source source = addSource(r'''
+class Codec<S1, T1> {
+  Codec<T1, S1> get inverted => new _InvertedCodec<T1, S1>(this);
+}
+class _InvertedCodec<T2, S2> extends Codec<T2, S2> {
+  _InvertedCodec(Codec<S2, T2> codec);
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -3492,669 +3857,717 @@
 
   void test_sharedDeferredPrefix() {
     resolveWithAndWithoutExperimental(<String> [
-        EngineTestCase.createSource(["library lib1;", "f1() {}"]),
-        EngineTestCase.createSource(["library lib2;", "f2() {}"]),
-        EngineTestCase.createSource(["library lib3;", "f3() {}"]),
-        EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as lib1;",
-        "import 'lib2.dart' as lib;",
-        "import 'lib3.dart' as lib;",
-        "main() { lib1.f1(); lib.f2(); lib.f3(); }"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> []);
+        r'''
+library lib1;
+f1() {}''',
+        r'''
+library lib2;
+f2() {}''',
+        r'''
+library lib3;
+f3() {}''',
+        r'''
+library root;
+import 'lib1.dart' deferred as lib1;
+import 'lib2.dart' as lib;
+import 'lib3.dart' as lib;
+main() { lib1.f1(); lib.f2(); lib.f3(); }'''], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> []);
   }
 
   void test_staticAccessToInstanceMember_annotation() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  const A.name();",
-        "}",
-        "@A.name()",
-        "main() {",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  const A.name();
+}
+@A.name()
+main() {
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_staticAccessToInstanceMember_method() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  static m() {}",
-        "}",
-        "main() {",
-        "  A.m;",
-        "  A.m();",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  static m() {}
+}
+main() {
+  A.m;
+  A.m();
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_staticAccessToInstanceMember_propertyAccess_field() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  static var f;",
-        "}",
-        "main() {",
-        "  A.f;",
-        "  A.f = 1;",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  static var f;
+}
+main() {
+  A.f;
+  A.f = 1;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_staticAccessToInstanceMember_propertyAccess_propertyAccessor() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  static get f => 42;",
-        "  static set f(x) {}",
-        "}",
-        "main() {",
-        "  A.f;",
-        "  A.f = 1;",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  static get f => 42;
+  static set f(x) {}
+}
+main() {
+  A.f;
+  A.f = 1;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_superInInvalidContext() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  m() {}",
-        "}",
-        "class B extends A {",
-        "  B() {",
-        "    var v = super.m();",
-        "  }",
-        "  n() {",
-        "    var v = super.m();",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  m() {}
+}
+class B extends A {
+  B() {
+    var v = super.m();
+  }
+  n() {
+    var v = super.m();
+  }
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_typeAliasCannotReferenceItself_returnClass_withTypeAlias() {
-    Source source = addSource(EngineTestCase.createSource(["typedef B A();", "class B {", "  A a;", "}"]));
+    Source source = addSource(r'''
+typedef B A();
+class B {
+  A a;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_typeArgumentNotMatchingBounds_const() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B extends A {}",
-        "class G<E extends A> {",
-        "  const G();",
-        "}",
-        "f() { return const G<B>(); }"]));
+    Source source = addSource(r'''
+class A {}
+class B extends A {}
+class G<E extends A> {
+  const G();
+}
+f() { return const G<B>(); }''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_typeArgumentNotMatchingBounds_new() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B extends A {}",
-        "class G<E extends A> {}",
-        "f() { return new G<B>(); }"]));
+    Source source = addSource(r'''
+class A {}
+class B extends A {}
+class G<E extends A> {}
+f() { return new G<B>(); }''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_typeArgumentNotMatchingBounds_typeArgumentList_0() {
-    Source source = addSource(EngineTestCase.createSource(["abstract class A<T extends A>{}"]));
+    Source source = addSource("abstract class A<T extends A>{}");
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_typeArgumentNotMatchingBounds_typeArgumentList_1() {
-    Source source = addSource(EngineTestCase.createSource(["abstract class A<T extends A<A>>{}"]));
+    Source source = addSource("abstract class A<T extends A<A>>{}");
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_typeArgumentNotMatchingBounds_typeArgumentList_20() {
-    Source source = addSource(EngineTestCase.createSource(["abstract class A<T extends A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A>>>>>>>>>>>>>>>>>>>>>{}"]));
+    Source source = addSource("abstract class A<T extends A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A>>>>>>>>>>>>>>>>>>>>>{}");
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_typePromotion_booleanAnd_useInRight() {
-    Source source = addSource(EngineTestCase.createSource([
-        "main(Object p) {",
-        "  p is String && p.length != 0;",
-        "}"]));
+    Source source = addSource(r'''
+main(Object p) {
+  p is String && p.length != 0;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_typePromotion_booleanAnd_useInRight_accessedInClosureRight_noAssignment() {
-    Source source = addSource(EngineTestCase.createSource([
-        "callMe(f()) { f(); }",
-        "main(Object p) {",
-        "  (p is String) && callMe(() { p.length; });",
-        "}"]));
+    Source source = addSource(r'''
+callMe(f()) { f(); }
+main(Object p) {
+  (p is String) && callMe(() { p.length; });
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_typePromotion_conditional_issue14655() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B extends A {}",
-        "class C extends B {",
-        "  mc() {}",
-        "}",
-        "print(_) {}",
-        "main(A p) {",
-        "  (p is C) && (print(() => p) && (p is B)) ? p.mc() : p = null;",
-        "}"]));
+    Source source = addSource(r'''
+class A {}
+class B extends A {}
+class C extends B {
+  mc() {}
+}
+print(_) {}
+main(A p) {
+  (p is C) && (print(() => p) && (p is B)) ? p.mc() : p = null;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_typePromotion_conditional_useInThen() {
-    Source source = addSource(EngineTestCase.createSource(["main(Object p) {", "  p is String ? p.length : 0;", "}"]));
+    Source source = addSource(r'''
+main(Object p) {
+  p is String ? p.length : 0;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_typePromotion_conditional_useInThen_accessedInClosure_noAssignment() {
-    Source source = addSource(EngineTestCase.createSource([
-        "callMe(f()) { f(); }",
-        "main(Object p) {",
-        "  p is String ? callMe(() { p.length; }) : 0;",
-        "}"]));
+    Source source = addSource(r'''
+callMe(f()) { f(); }
+main(Object p) {
+  p is String ? callMe(() { p.length; }) : 0;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_typePromotion_functionType_arg_ignoreIfNotMoreSpecific() {
-    Source source = addSource(EngineTestCase.createSource([
-        "typedef FuncB(B b);",
-        "typedef FuncA(A a);",
-        "class A {}",
-        "class B {}",
-        "main(FuncA f) {",
-        "  if (f is FuncB) {",
-        "    f(new A());",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+typedef FuncB(B b);
+typedef FuncA(A a);
+class A {}
+class B {}
+main(FuncA f) {
+  if (f is FuncB) {
+    f(new A());
+  }
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_typePromotion_functionType_return_ignoreIfNotMoreSpecific() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "typedef FuncAtoDyn(A a);",
-        "typedef FuncDynToDyn(x);",
-        "main(FuncAtoDyn f) {",
-        "  if (f is FuncDynToDyn) {",
-        "    A a = f(new A());",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A {}
+typedef FuncAtoDyn(A a);
+typedef FuncDynToDyn(x);
+main(FuncAtoDyn f) {
+  if (f is FuncDynToDyn) {
+    A a = f(new A());
+  }
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_typePromotion_functionType_return_voidToDynamic() {
-    Source source = addSource(EngineTestCase.createSource([
-        "typedef FuncDynToDyn(x);",
-        "typedef void FuncDynToVoid(x);",
-        "class A {}",
-        "main(FuncDynToVoid f) {",
-        "  if (f is FuncDynToDyn) {",
-        "    A a = f(null);",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+typedef FuncDynToDyn(x);
+typedef void FuncDynToVoid(x);
+class A {}
+main(FuncDynToVoid f) {
+  if (f is FuncDynToDyn) {
+    A a = f(null);
+  }
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_typePromotion_if_accessedInClosure_noAssignment() {
-    Source source = addSource(EngineTestCase.createSource([
-        "callMe(f()) { f(); }",
-        "main(Object p) {",
-        "  if (p is String) {",
-        "    callMe(() {",
-        "      p.length;",
-        "    });",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+callMe(f()) { f(); }
+main(Object p) {
+  if (p is String) {
+    callMe(() {
+      p.length;
+    });
+  }
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_typePromotion_if_extends_moreSpecific() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class V {}",
-        "class VP extends V {}",
-        "class A<T> {}",
-        "class B<S> extends A<S> {",
-        "  var b;",
-        "}",
-        "",
-        "main(A<V> p) {",
-        "  if (p is B<VP>) {",
-        "    p.b;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class V {}
+class VP extends V {}
+class A<T> {}
+class B<S> extends A<S> {
+  var b;
+}
+
+main(A<V> p) {
+  if (p is B<VP>) {
+    p.b;
+  }
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_typePromotion_if_hasAssignment_outsideAfter() {
-    Source source = addSource(EngineTestCase.createSource([
-        "main(Object p) {",
-        "  if (p is String) {",
-        "    p.length;",
-        "  }",
-        "  p = 0;",
-        "}"]));
+    Source source = addSource(r'''
+main(Object p) {
+  if (p is String) {
+    p.length;
+  }
+  p = 0;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_typePromotion_if_hasAssignment_outsideBefore() {
-    Source source = addSource(EngineTestCase.createSource([
-        "main(Object p, Object p2) {",
-        "  p = p2;",
-        "  if (p is String) {",
-        "    p.length;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+main(Object p, Object p2) {
+  p = p2;
+  if (p is String) {
+    p.length;
+  }
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_typePromotion_if_implements_moreSpecific() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class V {}",
-        "class VP extends V {}",
-        "class A<T> {}",
-        "class B<S> implements A<S> {",
-        "  var b;",
-        "}",
-        "",
-        "main(A<V> p) {",
-        "  if (p is B<VP>) {",
-        "    p.b;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class V {}
+class VP extends V {}
+class A<T> {}
+class B<S> implements A<S> {
+  var b;
+}
+
+main(A<V> p) {
+  if (p is B<VP>) {
+    p.b;
+  }
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_typePromotion_if_inClosure_assignedAfter_inSameFunction() {
-    Source source = addSource(EngineTestCase.createSource([
-        "main() {",
-        "  f(Object p) {",
-        "    if (p is String) {",
-        "      p.length;",
-        "    }",
-        "    p = 0;",
-        "  };",
-        "}"]));
+    Source source = addSource(r'''
+main() {
+  f(Object p) {
+    if (p is String) {
+      p.length;
+    }
+    p = 0;
+  };
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_typePromotion_if_is_and_left() {
-    Source source = addSource(EngineTestCase.createSource([
-        "bool tt() => true;",
-        "main(Object p) {",
-        "  if (p is String && tt()) {",
-        "    p.length;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+bool tt() => true;
+main(Object p) {
+  if (p is String && tt()) {
+    p.length;
+  }
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_typePromotion_if_is_and_right() {
-    Source source = addSource(EngineTestCase.createSource([
-        "bool tt() => true;",
-        "main(Object p) {",
-        "  if (tt() && p is String) {",
-        "    p.length;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+bool tt() => true;
+main(Object p) {
+  if (tt() && p is String) {
+    p.length;
+  }
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_typePromotion_if_is_and_subThenSuper() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  var a;",
-        "}",
-        "class B extends A {",
-        "  var b;",
-        "}",
-        "main(Object p) {",
-        "  if (p is B && p is A) {",
-        "    p.a;",
-        "    p.b;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  var a;
+}
+class B extends A {
+  var b;
+}
+main(Object p) {
+  if (p is B && p is A) {
+    p.a;
+    p.b;
+  }
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_typePromotion_if_is_parenthesized() {
-    Source source = addSource(EngineTestCase.createSource([
-        "main(Object p) {",
-        "  if ((p is String)) {",
-        "    p.length;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+main(Object p) {
+  if ((p is String)) {
+    p.length;
+  }
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_typePromotion_if_is_single() {
-    Source source = addSource(EngineTestCase.createSource([
-        "main(Object p) {",
-        "  if (p is String) {",
-        "    p.length;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+main(Object p) {
+  if (p is String) {
+    p.length;
+  }
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_typePromotion_parentheses() {
-    Source source = addSource(EngineTestCase.createSource([
-        "main(Object p) {",
-        "  (p is String) ? p.length : 0;",
-        "  (p) is String ? p.length : 0;",
-        "  ((p)) is String ? p.length : 0;",
-        "  ((p) is String) ? p.length : 0;",
-        "}"]));
+    Source source = addSource(r'''
+main(Object p) {
+  (p is String) ? p.length : 0;
+  (p) is String ? p.length : 0;
+  ((p)) is String ? p.length : 0;
+  ((p) is String) ? p.length : 0;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_typeType_class() {
-    Source source = addSource(EngineTestCase.createSource(["class C {}", "f(Type t) {}", "main() {", "  f(C);", "}"]));
+    Source source = addSource(r'''
+class C {}
+f(Type t) {}
+main() {
+  f(C);
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_typeType_class_prefixed() {
-    addNamedSource("/lib.dart", EngineTestCase.createSource(["library lib;", "class C {}"]));
-    Source source = addSource(EngineTestCase.createSource([
-        "import 'lib.dart' as p;",
-        "f(Type t) {}",
-        "main() {",
-        "  f(p.C);",
-        "}"]));
+    addNamedSource("/lib.dart", r'''
+library lib;
+class C {}''');
+    Source source = addSource(r'''
+import 'lib.dart' as p;
+f(Type t) {}
+main() {
+  f(p.C);
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_typeType_functionTypeAlias() {
-    Source source = addSource(EngineTestCase.createSource([
-        "typedef F();",
-        "f(Type t) {}",
-        "main() {",
-        "  f(F);",
-        "}"]));
+    Source source = addSource(r'''
+typedef F();
+f(Type t) {}
+main() {
+  f(F);
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_typeType_functionTypeAlias_prefixed() {
-    addNamedSource("/lib.dart", EngineTestCase.createSource(["library lib;", "typedef F();"]));
-    Source source = addSource(EngineTestCase.createSource([
-        "import 'lib.dart' as p;",
-        "f(Type t) {}",
-        "main() {",
-        "  f(p.F);",
-        "}"]));
+    addNamedSource("/lib.dart", r'''
+library lib;
+typedef F();''');
+    Source source = addSource(r'''
+import 'lib.dart' as p;
+f(Type t) {}
+main() {
+  f(p.F);
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_undefinedConstructorInInitializer_explicit_named() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  A.named() {}",
-        "}",
-        "class B extends A {",
-        "  B() : super.named();",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  A.named() {}
+}
+class B extends A {
+  B() : super.named();
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_undefinedConstructorInInitializer_explicit_unnamed() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  A() {}",
-        "}",
-        "class B extends A {",
-        "  B() : super();",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  A() {}
+}
+class B extends A {
+  B() : super();
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_undefinedConstructorInInitializer_hasOptionalParameters() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  A([p]) {}",
-        "}",
-        "class B extends A {",
-        "  B();",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  A([p]) {}
+}
+class B extends A {
+  B();
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_undefinedConstructorInInitializer_implicit() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  A() {}",
-        "}",
-        "class B extends A {",
-        "  B();",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  A() {}
+}
+class B extends A {
+  B();
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_undefinedConstructorInInitializer_implicit_typeAlias() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class M {}",
-        "class A = Object with M;",
-        "class B extends A {",
-        "  B();",
-        "}"]));
+    Source source = addSource(r'''
+class M {}
+class A = Object with M;
+class B extends A {
+  B();
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_undefinedConstructorInInitializer_redirecting() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class Foo {",
-        "  Foo.ctor();",
-        "}",
-        "class Bar extends Foo {",
-        "  Bar() : this.ctor();",
-        "  Bar.ctor() : super.ctor();",
-        "}"]));
+    Source source = addSource(r'''
+class Foo {
+  Foo.ctor();
+}
+class Bar extends Foo {
+  Bar() : this.ctor();
+  Bar.ctor() : super.ctor();
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_undefinedGetter_typeSubstitution() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A<E> {",
-        "  E element;",
-        "}",
-        "class B extends A<List> {",
-        "  m() {",
-        "    element.last;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A<E> {
+  E element;
+}
+class B extends A<List> {
+  m() {
+    element.last;
+  }
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_undefinedIdentifier_hide() {
-    Source source = addSource(EngineTestCase.createSource(["library L;", "export 'lib1.dart' hide a;"]));
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;"]));
+    Source source = addSource(r'''
+library L;
+export 'lib1.dart' hide a;''');
+    addNamedSource("/lib1.dart", "library lib1;");
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_undefinedIdentifier_show() {
-    Source source = addSource(EngineTestCase.createSource(["library L;", "export 'lib1.dart' show a;"]));
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;"]));
+    Source source = addSource(r'''
+library L;
+export 'lib1.dart' show a;''');
+    addNamedSource("/lib1.dart", "library lib1;");
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_undefinedIdentifier_synthetic_whenExpression() {
-    Source source = addSource(EngineTestCase.createSource(["print(x) {}", "main() {", "  print(is String);", "}"]));
+    Source source = addSource(r'''
+print(x) {}
+main() {
+  print(is String);
+}''');
     resolve(source);
     assertErrors(source, [ParserErrorCode.MISSING_IDENTIFIER]);
   }
 
   void test_undefinedIdentifier_synthetic_whenMethodName() {
-    Source source = addSource(EngineTestCase.createSource(["print(x) {}", "main(int p) {", "  p.();", "}"]));
+    Source source = addSource(r'''
+print(x) {}
+main(int p) {
+  p.();
+}''');
     resolve(source);
     assertErrors(source, [ParserErrorCode.MISSING_IDENTIFIER]);
   }
 
   void test_undefinedMethod_functionExpression_callMethod() {
-    Source source = addSource(EngineTestCase.createSource(["main() {", "  (() => null).call();", "}"]));
+    Source source = addSource(r'''
+main() {
+  (() => null).call();
+}''');
     resolve(source);
     assertNoErrors(source);
     // A call to verify(source) fails as '.call()' isn't resolved.
   }
 
   void test_undefinedMethod_functionExpression_directCall() {
-    Source source = addSource(EngineTestCase.createSource(["main() {", "  (() => null)();", "}"]));
+    Source source = addSource(r'''
+main() {
+  (() => null)();
+}''');
     resolve(source);
     assertNoErrors(source);
     // A call to verify(source) fails as '(() => null)()' isn't resolved.
   }
 
   void test_undefinedOperator_index() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  operator [](a) {}",
-        "  operator []=(a, b) {}",
-        "}",
-        "f(A a) {",
-        "  a[0];",
-        "  a[0] = 1;",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  operator [](a) {}
+  operator []=(a, b) {}
+}
+f(A a) {
+  a[0];
+  a[0] = 1;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_undefinedOperator_tilde() {
-    Source source = addSource(EngineTestCase.createSource(["const A = 3;", "const B = ~((1 << A) - 1);"]));
+    Source source = addSource(r'''
+const A = 3;
+const B = ~((1 << A) - 1);''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_undefinedSetter_importWithPrefix() {
-    addNamedSource("/lib.dart", EngineTestCase.createSource(["library lib;", "set y(int value) {}"]));
-    Source source = addSource(EngineTestCase.createSource(["import 'lib.dart' as x;", "main() {", "  x.y = 0;", "}"]));
+    addNamedSource("/lib.dart", r'''
+library lib;
+set y(int value) {}''');
+    Source source = addSource(r'''
+import 'lib.dart' as x;
+main() {
+  x.y = 0;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_undefinedSuperMethod_field() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  var m;",
-        "}",
-        "class B extends A {",
-        "  f() {",
-        "    super.m();",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  var m;
+}
+class B extends A {
+  f() {
+    super.m();
+  }
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_undefinedSuperMethod_method() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  m() {}",
-        "}",
-        "class B extends A {",
-        "  f() {",
-        "    super.m();",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  m() {}
+}
+class B extends A {
+  f() {
+    super.m();
+  }
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_unqualifiedReferenceToNonLocalStaticMember_fromComment_new() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  A() {}",
-        "  A.named() {}",
-        "}",
-        "/// [new A] or [new A.named]",
-        "main() {",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  A() {}
+  A.named() {}
+}
+/// [new A] or [new A.named]
+main() {
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -4162,27 +4575,30 @@
 
   void test_uriDoesNotExist_dll() {
     addNamedSource("/lib.dll", "");
-    Source source = addSource(EngineTestCase.createSource(["import 'dart-ext:lib';"]));
+    Source source = addSource("import 'dart-ext:lib';");
     resolve(source);
     assertNoErrors(source);
   }
 
   void test_uriDoesNotExist_dylib() {
     addNamedSource("/lib.dylib", "");
-    Source source = addSource(EngineTestCase.createSource(["import 'dart-ext:lib';"]));
+    Source source = addSource("import 'dart-ext:lib';");
     resolve(source);
     assertNoErrors(source);
   }
 
   void test_uriDoesNotExist_so() {
     addNamedSource("/lib.so", "");
-    Source source = addSource(EngineTestCase.createSource(["import 'dart-ext:lib';"]));
+    Source source = addSource("import 'dart-ext:lib';");
     resolve(source);
     assertNoErrors(source);
   }
 
   void test_wrongNumberOfParametersForOperator_index() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  operator []=(a, b) {}", "}"]));
+    Source source = addSource(r'''
+class A {
+  operator []=(a, b) {}
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -4212,7 +4628,10 @@
   }
 
   void test_wrongNumberOfParametersForSetter() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  set x(a) {}", "}"]));
+    Source source = addSource(r'''
+class A {
+  set x(a) {}
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -4220,7 +4639,10 @@
 
   void test_yieldEachInNonGenerator_asyncStar() {
     resetWithAsync();
-    Source source = addSource(EngineTestCase.createSource(["f() async* {", "  yield* 0;", "}"]));
+    Source source = addSource(r'''
+f() async* {
+  yield* 0;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -4228,7 +4650,10 @@
 
   void test_yieldEachInNonGenerator_syncStar() {
     resetWithAsync();
-    Source source = addSource(EngineTestCase.createSource(["f() sync* {", "  yield* 0;", "}"]));
+    Source source = addSource(r'''
+f() sync* {
+  yield* 0;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -4236,7 +4661,10 @@
 
   void test_yieldInNonGenerator_asyncStar() {
     resetWithAsync();
-    Source source = addSource(EngineTestCase.createSource(["f() async* {", "  yield 0;", "}"]));
+    Source source = addSource(r'''
+f() async* {
+  yield 0;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -4244,14 +4672,20 @@
 
   void test_yieldInNonGenerator_syncStar() {
     resetWithAsync();
-    Source source = addSource(EngineTestCase.createSource(["f() sync* {", "  yield 0;", "}"]));
+    Source source = addSource(r'''
+f() sync* {
+  yield 0;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void _check_wrongNumberOfParametersForOperator(String name, String parameters) {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  operator ${name}(${parameters}) {}", "}"]));
+    Source source = addSource("""
+class A {
+  operator $name($parameters) {}
+}""");
     resolve(source);
     assertNoErrors(source);
     verify([source]);
diff --git a/pkg/analyzer/test/generated/parser_test.dart b/pkg/analyzer/test/generated/parser_test.dart
index 78bee70..501b539 100644
--- a/pkg/analyzer/test/generated/parser_test.dart
+++ b/pkg/analyzer/test/generated/parser_test.dart
@@ -7,8 +7,6 @@
 
 library engine.parser_test;
 
-import 'package:analyzer/src/generated/java_core.dart';
-import 'package:analyzer/src/generated/java_junit.dart';
 import 'package:analyzer/src/generated/error.dart';
 import 'package:analyzer/src/generated/source.dart' show Source;
 import 'package:analyzer/src/generated/scanner.dart';
@@ -16,7 +14,7 @@
 import 'package:analyzer/src/generated/parser.dart';
 import 'package:analyzer/src/generated/element.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
-import 'package:unittest/unittest.dart' as _ut;
+import 'package:unittest/unittest.dart';
 import 'test_support.dart';
 import 'package:analyzer/src/generated/testing/ast_factory.dart';
 import 'package:analyzer/src/generated/testing/element_factory.dart';
@@ -28,7 +26,7 @@
 class AnalysisErrorListener_SimpleParserTest_computeStringValue implements AnalysisErrorListener {
   @override
   void onError(AnalysisError event) {
-    JUnitTestCase.fail("Unexpected compilation error: ${event.message} (${event.offset}, ${event.length})");
+    fail("Unexpected compilation error: ${event.message} (${event.offset}, ${event.length})");
   }
 }
 
@@ -48,13 +46,13 @@
    */
   void assertValid() {
     if (!_errors.isEmpty) {
-      JavaStringBuilder builder = new JavaStringBuilder();
-      builder.append("Invalid AST structure:");
+      StringBuffer buffer = new StringBuffer();
+      buffer.write("Invalid AST structure:");
       for (String message in _errors) {
-        builder.append("\r\n   ");
-        builder.append(message);
+        buffer.write("\r\n   ");
+        buffer.write(message);
       }
-      JUnitTestCase.fail(builder.toString());
+      fail(buffer.toString());
     }
   }
 
@@ -77,29 +75,29 @@
       }
     } else {
       if (parent == null) {
-        _errors.add("No parent for ${node.runtimeType.toString()}");
+        _errors.add("No parent for ${node.runtimeType}");
       }
     }
     if (node.beginToken == null) {
-      _errors.add("No begin token for ${node.runtimeType.toString()}");
+      _errors.add("No begin token for ${node.runtimeType}");
     }
     if (node.endToken == null) {
-      _errors.add("No end token for ${node.runtimeType.toString()}");
+      _errors.add("No end token for ${node.runtimeType}");
     }
     int nodeStart = node.offset;
     int nodeLength = node.length;
     if (nodeStart < 0 || nodeLength < 0) {
-      _errors.add("No source info for ${node.runtimeType.toString()}");
+      _errors.add("No source info for ${node.runtimeType}");
     }
     if (parent != null) {
       int nodeEnd = nodeStart + nodeLength;
       int parentStart = parent.offset;
       int parentEnd = parentStart + parent.length;
       if (nodeStart < parentStart) {
-        _errors.add("Invalid source start (${nodeStart}) for ${node.runtimeType.toString()} inside ${parent.runtimeType.toString()} (${parentStart})");
+        _errors.add("Invalid source start ($nodeStart) for ${node.runtimeType} inside ${parent.runtimeType} ($parentStart)");
       }
       if (nodeEnd > parentEnd) {
-        _errors.add("Invalid source end (${nodeEnd}) for ${node.runtimeType.toString()} inside ${parent.runtimeType.toString()} (${parentStart})");
+        _errors.add("Invalid source end ($nodeEnd) for ${node.runtimeType} inside ${parent.runtimeType} ($parentStart)");
       }
     }
   }
@@ -146,30 +144,30 @@
 
   void test_assignableExpression_arguments_normal_chain() {
     PropertyAccess propertyAccess1 = ParserTestCase.parseExpression("a(b)(c).d(e).f", []);
-    JUnitTestCase.assertEquals("f", propertyAccess1.propertyName.name);
+    expect(propertyAccess1.propertyName.name, "f");
     //
     // a(b)(c).d(e)
     //
     MethodInvocation invocation2 = EngineTestCase.assertInstanceOf((obj) => obj is MethodInvocation, MethodInvocation, propertyAccess1.target);
-    JUnitTestCase.assertEquals("d", invocation2.methodName.name);
+    expect(invocation2.methodName.name, "d");
     ArgumentList argumentList2 = invocation2.argumentList;
-    JUnitTestCase.assertNotNull(argumentList2);
-    EngineTestCase.assertSizeOfList(1, argumentList2.arguments);
+    expect(argumentList2, isNotNull);
+    expect(argumentList2.arguments, hasLength(1));
     //
     // a(b)(c)
     //
     FunctionExpressionInvocation invocation3 = EngineTestCase.assertInstanceOf((obj) => obj is FunctionExpressionInvocation, FunctionExpressionInvocation, invocation2.target);
     ArgumentList argumentList3 = invocation3.argumentList;
-    JUnitTestCase.assertNotNull(argumentList3);
-    EngineTestCase.assertSizeOfList(1, argumentList3.arguments);
+    expect(argumentList3, isNotNull);
+    expect(argumentList3.arguments, hasLength(1));
     //
     // a(b)
     //
     MethodInvocation invocation4 = EngineTestCase.assertInstanceOf((obj) => obj is MethodInvocation, MethodInvocation, invocation3.function);
-    JUnitTestCase.assertEquals("a", invocation4.methodName.name);
+    expect(invocation4.methodName.name, "a");
     ArgumentList argumentList4 = invocation4.argumentList;
-    JUnitTestCase.assertNotNull(argumentList4);
-    EngineTestCase.assertSizeOfList(1, argumentList4.arguments);
+    expect(argumentList4, isNotNull);
+    expect(argumentList4.arguments, hasLength(1));
   }
 
   void test_assignmentExpression_compound() {
@@ -264,8 +262,8 @@
       Expression lhs = (section as AssignmentExpression).leftHandSide;
       EngineTestCase.assertInstanceOf((obj) => obj is IndexExpression, IndexExpression, lhs);
       IndexExpression index = lhs as IndexExpression;
-      JUnitTestCase.assertTrue(index.isCascaded);
-      JUnitTestCase.assertSame(target, index.realTarget);
+      expect(index.isCascaded, isTrue);
+      expect(index.realTarget, same(target));
     }
   }
 
@@ -275,14 +273,14 @@
   }
 
   void test_constructor_initializer_withParenthesizedExpression() {
-    CompilationUnit unit = ParserTestCase.parseCompilationUnit(EngineTestCase.createSource([
-        "class C {",
-        "  C() :",
-        "    this.a = (b == null ? c : d) {",
-        "  }",
-        "}"]), []);
+    CompilationUnit unit = ParserTestCase.parseCompilationUnit(r'''
+class C {
+  C() :
+    this.a = (b == null ? c : d) {
+  }
+}''', []);
     NodeList<CompilationUnitMember> declarations = unit.declarations;
-    EngineTestCase.assertSizeOfList(1, declarations);
+    expect(declarations, hasLength(1));
   }
 
   void test_equalityExpression_normal() {
@@ -337,7 +335,7 @@
 
   void test_multipleLabels_statement() {
     LabeledStatement statement = ParserTestCase.parseStatement("a: b: c: return x;", []);
-    EngineTestCase.assertSizeOfList(3, statement.labels);
+    expect(statement.labels, hasLength(3));
     EngineTestCase.assertInstanceOf((obj) => obj is ReturnStatement, ReturnStatement, statement.statement);
   }
 
@@ -402,7 +400,7 @@
     // the synthetic list literals that are being created are not always zero length (because they
     // could have type parameters), which violates the contract of isSynthetic().
     TypedLiteral literal = ParserTestCase.parse3("parseListOrMapLiteral", <Object> [null], "1", [ParserErrorCode.EXPECTED_LIST_OR_MAP_LITERAL]);
-    JUnitTestCase.assertTrue(literal.isSynthetic);
+    expect(literal.isSynthetic, isTrue);
   }
 
   void fail_illegalAssignmentToNonAssignable_superAssigned() {
@@ -655,12 +653,12 @@
 
   void test_directiveAfterDeclaration_classBeforeDirective() {
     CompilationUnit unit = ParserTestCase.parseCompilationUnit("class Foo{} library l;", [ParserErrorCode.DIRECTIVE_AFTER_DECLARATION]);
-    JUnitTestCase.assertNotNull(unit);
+    expect(unit, isNotNull);
   }
 
   void test_directiveAfterDeclaration_classBetweenDirectives() {
     CompilationUnit unit = ParserTestCase.parseCompilationUnit("library l;\nclass Foo{}\npart 'a.dart';", [ParserErrorCode.DIRECTIVE_AFTER_DECLARATION]);
-    JUnitTestCase.assertNotNull(unit);
+    expect(unit, isNotNull);
   }
 
   void test_duplicatedModifier_const() {
@@ -752,7 +750,7 @@
 
   void test_expectedStringLiteral() {
     StringLiteral expression = ParserTestCase.parse4("parseStringLiteral", "1", [ParserErrorCode.EXPECTED_STRING_LITERAL]);
-    JUnitTestCase.assertTrue(expression.isSynthetic);
+    expect(expression.isSynthetic, isTrue);
   }
 
   void test_expectedToken_commaMissingInArgumentList() {
@@ -774,8 +772,8 @@
     CompilationUnit unit = ParserTestCase.parseCompilationUnit("export '' class A {}", [ParserErrorCode.EXPECTED_TOKEN]);
     ExportDirective directive = unit.directives[0] as ExportDirective;
     Token semicolon = directive.semicolon;
-    JUnitTestCase.assertNotNull(semicolon);
-    JUnitTestCase.assertTrue(semicolon.isSynthetic);
+    expect(semicolon, isNotNull);
+    expect(semicolon.isSynthetic, isTrue);
   }
 
   void test_expectedToken_semicolonMissingAfterExpression() {
@@ -786,8 +784,8 @@
     CompilationUnit unit = ParserTestCase.parseCompilationUnit("import '' class A {}", [ParserErrorCode.EXPECTED_TOKEN]);
     ImportDirective directive = unit.directives[0] as ImportDirective;
     Token semicolon = directive.semicolon;
-    JUnitTestCase.assertNotNull(semicolon);
-    JUnitTestCase.assertTrue(semicolon.isSynthetic);
+    expect(semicolon, isNotNull);
+    expect(semicolon.isSynthetic, isTrue);
   }
 
   void test_expectedToken_whileMissingInDoStatement() {
@@ -1051,7 +1049,7 @@
 
   void test_libraryDirectiveNotFirst_afterPart() {
     CompilationUnit unit = ParserTestCase.parseCompilationUnit("part 'a.dart';\nlibrary l;", [ParserErrorCode.LIBRARY_DIRECTIVE_NOT_FIRST]);
-    JUnitTestCase.assertNotNull(unit);
+    expect(unit, isNotNull);
   }
 
   void test_localFunctionDeclarationModifier_abstract() {
@@ -1088,7 +1086,7 @@
 
   void test_missingAssignableSelector_superPrimaryExpression() {
     SuperExpression expression = ParserTestCase.parse4("parsePrimaryExpression", "super", [ParserErrorCode.MISSING_ASSIGNABLE_SELECTOR]);
-    JUnitTestCase.assertNotNull(expression.keyword);
+    expect(expression.keyword, isNotNull);
   }
 
   void test_missingAssignableSelector_superPropertyAccessAssigned() {
@@ -1097,7 +1095,7 @@
 
   void test_missingCatchOrFinally() {
     TryStatement statement = ParserTestCase.parse4("parseTryStatement", "try {}", [ParserErrorCode.MISSING_CATCH_OR_FINALLY]);
-    JUnitTestCase.assertNotNull(statement);
+    expect(statement, isNotNull);
   }
 
   void test_missingClassBody() {
@@ -1184,7 +1182,7 @@
 
   void test_missingIdentifier_number() {
     SimpleIdentifier expression = ParserTestCase.parse4("parseSimpleIdentifier", "1", [ParserErrorCode.MISSING_IDENTIFIER]);
-    JUnitTestCase.assertTrue(expression.isSynthetic);
+    expect(expression.isSynthetic, isTrue);
   }
 
   void test_missingKeywordOperator() {
@@ -1205,12 +1203,12 @@
 
   void test_missingNameInLibraryDirective() {
     CompilationUnit unit = ParserTestCase.parseCompilationUnit("library;", [ParserErrorCode.MISSING_NAME_IN_LIBRARY_DIRECTIVE]);
-    JUnitTestCase.assertNotNull(unit);
+    expect(unit, isNotNull);
   }
 
   void test_missingNameInPartOfDirective() {
     CompilationUnit unit = ParserTestCase.parseCompilationUnit("part of;", [ParserErrorCode.MISSING_NAME_IN_PART_OF_DIRECTIVE]);
-    JUnitTestCase.assertNotNull(unit);
+    expect(unit, isNotNull);
   }
 
   void test_missingPrefixInDeferredImport() {
@@ -1311,12 +1309,12 @@
 
   void test_nonIdentifierLibraryName_library() {
     CompilationUnit unit = ParserTestCase.parseCompilationUnit("library 'lib';", [ParserErrorCode.NON_IDENTIFIER_LIBRARY_NAME]);
-    JUnitTestCase.assertNotNull(unit);
+    expect(unit, isNotNull);
   }
 
   void test_nonIdentifierLibraryName_partOf() {
     CompilationUnit unit = ParserTestCase.parseCompilationUnit("part of 'lib';", [ParserErrorCode.NON_IDENTIFIER_LIBRARY_NAME]);
-    JUnitTestCase.assertNotNull(unit);
+    expect(unit, isNotNull);
   }
 
   void test_nonPartOfDirectiveInPart_after() {
@@ -1341,9 +1339,9 @@
 
   void test_parseCascadeSection_missingIdentifier() {
     MethodInvocation methodInvocation = ParserTestCase.parse4("parseCascadeSection", "..()", [ParserErrorCode.MISSING_IDENTIFIER]);
-    JUnitTestCase.assertNull(methodInvocation.target);
-    JUnitTestCase.assertEquals("", methodInvocation.methodName.name);
-    EngineTestCase.assertSizeOfList(0, methodInvocation.argumentList.arguments);
+    expect(methodInvocation.target, isNull);
+    expect(methodInvocation.methodName.name, "");
+    expect(methodInvocation.argumentList.arguments, hasLength(0));
   }
 
   void test_positionalAfterNamedArgument() {
@@ -1465,7 +1463,7 @@
   void test_useOfUnaryPlusOperator() {
     SimpleIdentifier expression = ParserTestCase.parse4("parseUnaryExpression", "+x", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression);
-    JUnitTestCase.assertTrue(expression.isSynthetic);
+    expect(expression.isSynthetic, isTrue);
   }
 
   void test_varAndType_field() {
@@ -1782,8 +1780,8 @@
     //
     // Compute the information needed to perform the test.
     //
-    String originalContents = "${prefix}${removed}${suffix}";
-    String modifiedContents = "${prefix}${added}${suffix}";
+    String originalContents = "$prefix$removed$suffix";
+    String modifiedContents = "$prefix$added$suffix";
     int replaceStart = prefix.length;
     Source source = new TestSource();
     //
@@ -1792,35 +1790,35 @@
     GatheringErrorListener originalListener = new GatheringErrorListener();
     Scanner originalScanner = new Scanner(source, new CharSequenceReader(originalContents), originalListener);
     Token originalTokens = originalScanner.tokenize();
-    JUnitTestCase.assertNotNull(originalTokens);
+    expect(originalTokens, isNotNull);
     Parser originalParser = new Parser(source, originalListener);
     CompilationUnit originalUnit = originalParser.parseCompilationUnit(originalTokens);
-    JUnitTestCase.assertNotNull(originalUnit);
+    expect(originalUnit, isNotNull);
     //
     // Parse the modified contents.
     //
     GatheringErrorListener modifiedListener = new GatheringErrorListener();
     Scanner modifiedScanner = new Scanner(source, new CharSequenceReader(modifiedContents), modifiedListener);
     Token modifiedTokens = modifiedScanner.tokenize();
-    JUnitTestCase.assertNotNull(modifiedTokens);
+    expect(modifiedTokens, isNotNull);
     Parser modifiedParser = new Parser(source, modifiedListener);
     CompilationUnit modifiedUnit = modifiedParser.parseCompilationUnit(modifiedTokens);
-    JUnitTestCase.assertNotNull(modifiedUnit);
+    expect(modifiedUnit, isNotNull);
     //
     // Incrementally parse the modified contents.
     //
     GatheringErrorListener incrementalListener = new GatheringErrorListener();
     IncrementalScanner incrementalScanner = new IncrementalScanner(source, new CharSequenceReader(modifiedContents), incrementalListener);
     Token incrementalTokens = incrementalScanner.rescan(originalTokens, replaceStart, removed.length, added.length);
-    JUnitTestCase.assertNotNull(incrementalTokens);
+    expect(incrementalTokens, isNotNull);
     IncrementalParser incrementalParser = new IncrementalParser(source, incrementalScanner.tokenMap, incrementalListener);
     CompilationUnit incrementalUnit = incrementalParser.reparse(originalUnit, incrementalScanner.leftToken, incrementalScanner.rightToken, replaceStart, prefix.length + removed.length);
-    JUnitTestCase.assertNotNull(incrementalUnit);
+    expect(incrementalUnit, isNotNull);
     //
     // Validate that the results of the incremental parse are the same as the full parse of the
     // modified source.
     //
-    JUnitTestCase.assertTrue(AstComparator.equalNodes(modifiedUnit, incrementalUnit));
+    expect(AstComparator.equalNodes(modifiedUnit, incrementalUnit), isTrue);
     // TODO(brianwilkerson) Verify that the errors are correct?
   }
 }
@@ -1950,7 +1948,7 @@
     Token token = scanner.tokenize();
     Parser parser = createParser(listener);
     CompilationUnit unit = parser.parseCompilationUnit(token);
-    JUnitTestCase.assertNotNull(unit);
+    expect(unit, isNotNull);
     listener.assertErrorsWithCodes(errorCodes);
     return unit;
   }
@@ -1971,7 +1969,7 @@
     Token token = scanner.tokenize();
     Parser parser = createParser(listener);
     Expression expression = parser.parseExpression(token);
-    JUnitTestCase.assertNotNull(expression);
+    expect(expression, isNotNull);
     listener.assertErrorsWithCodes(errorCodes);
     return expression;
   }
@@ -1992,7 +1990,7 @@
     Token token = scanner.tokenize();
     Parser parser = createParser(listener);
     Statement statement = parser.parseStatement(token);
-    JUnitTestCase.assertNotNull(statement);
+    expect(statement, isNotNull);
     listener.assertErrorsWithCodes(errorCodes);
     return statement;
   }
@@ -2015,7 +2013,7 @@
     Token token = scanner.tokenize();
     Parser parser = createParser(listener);
     List<Statement> statements = parser.parseStatements(token);
-    EngineTestCase.assertSizeOfList(expectedCount, statements);
+    expect(statements, hasLength(expectedCount));
     listener.assertErrorsWithCodes(errorCodes);
     return statements;
   }
@@ -2055,7 +2053,7 @@
     // Partially test the results.
     //
     if (!listener.hasErrors) {
-      JUnitTestCase.assertNotNull(result);
+      expect(result, isNotNull);
     }
     return result;
   }
@@ -2111,21 +2109,21 @@
  */
 class RecoveryParserTest extends ParserTestCase {
   void fail_incomplete_returnType() {
-    ParserTestCase.parseCompilationUnit(EngineTestCase.createSource([
-        "Map<Symbol, convertStringToSymbolMap(Map<String, dynamic> map) {",
-        "  if (map == null) return null;",
-        "  Map<Symbol, dynamic> result = new Map<Symbol, dynamic>();",
-        "  map.forEach((name, value) {",
-        "    result[new Symbol(name)] = value;",
-        "  });",
-        "  return result;",
-        "}"]), []);
+    ParserTestCase.parseCompilationUnit(r'''
+Map<Symbol, convertStringToSymbolMap(Map<String, dynamic> map) {
+  if (map == null) return null;
+  Map<Symbol, dynamic> result = new Map<Symbol, dynamic>();
+  map.forEach((name, value) {
+    result[new Symbol(name)] = value;
+  });
+  return result;
+}''', []);
   }
 
   void test_additiveExpression_missing_LHS() {
     BinaryExpression expression = ParserTestCase.parseExpression("+ y", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.leftOperand);
-    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
+    expect(expression.leftOperand.isSynthetic, isTrue);
   }
 
   void test_additiveExpression_missing_LHS_RHS() {
@@ -2133,21 +2131,21 @@
         ParserErrorCode.MISSING_IDENTIFIER,
         ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.leftOperand);
-    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
+    expect(expression.leftOperand.isSynthetic, isTrue);
     EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+    expect(expression.rightOperand.isSynthetic, isTrue);
   }
 
   void test_additiveExpression_missing_RHS() {
     BinaryExpression expression = ParserTestCase.parseExpression("x +", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+    expect(expression.rightOperand.isSynthetic, isTrue);
   }
 
   void test_additiveExpression_missing_RHS_super() {
     BinaryExpression expression = ParserTestCase.parseExpression("super +", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+    expect(expression.rightOperand.isSynthetic, isTrue);
   }
 
   void test_additiveExpression_precedence_multiplicative_left() {
@@ -2177,39 +2175,39 @@
     AssignmentExpression expression = ParserTestCase.parseExpression("= y = 0", [ParserErrorCode.MISSING_IDENTIFIER]);
     Expression syntheticExpression = expression.leftHandSide;
     EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, syntheticExpression);
-    JUnitTestCase.assertTrue(syntheticExpression.isSynthetic);
+    expect(syntheticExpression.isSynthetic, isTrue);
   }
 
   void test_assignmentExpression_missing_compound2() {
     AssignmentExpression expression = ParserTestCase.parseExpression("x = = 0", [ParserErrorCode.MISSING_IDENTIFIER]);
     Expression syntheticExpression = (expression.rightHandSide as AssignmentExpression).leftHandSide;
     EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, syntheticExpression);
-    JUnitTestCase.assertTrue(syntheticExpression.isSynthetic);
+    expect(syntheticExpression.isSynthetic, isTrue);
   }
 
   void test_assignmentExpression_missing_compound3() {
     AssignmentExpression expression = ParserTestCase.parseExpression("x = y =", [ParserErrorCode.MISSING_IDENTIFIER]);
     Expression syntheticExpression = (expression.rightHandSide as AssignmentExpression).rightHandSide;
     EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, syntheticExpression);
-    JUnitTestCase.assertTrue(syntheticExpression.isSynthetic);
+    expect(syntheticExpression.isSynthetic, isTrue);
   }
 
   void test_assignmentExpression_missing_LHS() {
     AssignmentExpression expression = ParserTestCase.parseExpression("= 0", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.leftHandSide);
-    JUnitTestCase.assertTrue(expression.leftHandSide.isSynthetic);
+    expect(expression.leftHandSide.isSynthetic, isTrue);
   }
 
   void test_assignmentExpression_missing_RHS() {
     AssignmentExpression expression = ParserTestCase.parseExpression("x =", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.leftHandSide);
-    JUnitTestCase.assertTrue(expression.rightHandSide.isSynthetic);
+    expect(expression.rightHandSide.isSynthetic, isTrue);
   }
 
   void test_bitwiseAndExpression_missing_LHS() {
     BinaryExpression expression = ParserTestCase.parseExpression("& y", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.leftOperand);
-    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
+    expect(expression.leftOperand.isSynthetic, isTrue);
   }
 
   void test_bitwiseAndExpression_missing_LHS_RHS() {
@@ -2217,21 +2215,21 @@
         ParserErrorCode.MISSING_IDENTIFIER,
         ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.leftOperand);
-    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
+    expect(expression.leftOperand.isSynthetic, isTrue);
     EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+    expect(expression.rightOperand.isSynthetic, isTrue);
   }
 
   void test_bitwiseAndExpression_missing_RHS() {
     BinaryExpression expression = ParserTestCase.parseExpression("x &", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+    expect(expression.rightOperand.isSynthetic, isTrue);
   }
 
   void test_bitwiseAndExpression_missing_RHS_super() {
     BinaryExpression expression = ParserTestCase.parseExpression("super &", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+    expect(expression.rightOperand.isSynthetic, isTrue);
   }
 
   void test_bitwiseAndExpression_precedence_equality_left() {
@@ -2260,7 +2258,7 @@
   void test_bitwiseOrExpression_missing_LHS() {
     BinaryExpression expression = ParserTestCase.parseExpression("| y", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.leftOperand);
-    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
+    expect(expression.leftOperand.isSynthetic, isTrue);
   }
 
   void test_bitwiseOrExpression_missing_LHS_RHS() {
@@ -2268,21 +2266,21 @@
         ParserErrorCode.MISSING_IDENTIFIER,
         ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.leftOperand);
-    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
+    expect(expression.leftOperand.isSynthetic, isTrue);
     EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+    expect(expression.rightOperand.isSynthetic, isTrue);
   }
 
   void test_bitwiseOrExpression_missing_RHS() {
     BinaryExpression expression = ParserTestCase.parseExpression("x |", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+    expect(expression.rightOperand.isSynthetic, isTrue);
   }
 
   void test_bitwiseOrExpression_missing_RHS_super() {
     BinaryExpression expression = ParserTestCase.parseExpression("super |", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+    expect(expression.rightOperand.isSynthetic, isTrue);
   }
 
   void test_bitwiseOrExpression_precedence_xor_left() {
@@ -2311,7 +2309,7 @@
   void test_bitwiseXorExpression_missing_LHS() {
     BinaryExpression expression = ParserTestCase.parseExpression("^ y", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.leftOperand);
-    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
+    expect(expression.leftOperand.isSynthetic, isTrue);
   }
 
   void test_bitwiseXorExpression_missing_LHS_RHS() {
@@ -2319,21 +2317,21 @@
         ParserErrorCode.MISSING_IDENTIFIER,
         ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.leftOperand);
-    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
+    expect(expression.leftOperand.isSynthetic, isTrue);
     EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+    expect(expression.rightOperand.isSynthetic, isTrue);
   }
 
   void test_bitwiseXorExpression_missing_RHS() {
     BinaryExpression expression = ParserTestCase.parseExpression("x ^", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+    expect(expression.rightOperand.isSynthetic, isTrue);
   }
 
   void test_bitwiseXorExpression_missing_RHS_super() {
     BinaryExpression expression = ParserTestCase.parseExpression("super ^", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+    expect(expression.rightOperand.isSynthetic, isTrue);
   }
 
   void test_bitwiseXorExpression_precedence_and_left() {
@@ -2360,25 +2358,27 @@
   }
 
   void test_classTypeAlias_withBody() {
-    ParserTestCase.parseCompilationUnit(EngineTestCase.createSource(["class A {}", "class B = Object with A {}"]), [ParserErrorCode.EXPECTED_TOKEN]);
+    ParserTestCase.parseCompilationUnit(r'''
+class A {}
+class B = Object with A {}''', [ParserErrorCode.EXPECTED_TOKEN]);
   }
 
   void test_conditionalExpression_missingElse() {
     ConditionalExpression expression = ParserTestCase.parse4("parseConditionalExpression", "x ? y :", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.elseExpression);
-    JUnitTestCase.assertTrue(expression.elseExpression.isSynthetic);
+    expect(expression.elseExpression.isSynthetic, isTrue);
   }
 
   void test_conditionalExpression_missingThen() {
     ConditionalExpression expression = ParserTestCase.parse4("parseConditionalExpression", "x ? : z", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.thenExpression);
-    JUnitTestCase.assertTrue(expression.thenExpression.isSynthetic);
+    expect(expression.thenExpression.isSynthetic, isTrue);
   }
 
   void test_equalityExpression_missing_LHS() {
     BinaryExpression expression = ParserTestCase.parseExpression("== y", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.leftOperand);
-    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
+    expect(expression.leftOperand.isSynthetic, isTrue);
   }
 
   void test_equalityExpression_missing_LHS_RHS() {
@@ -2386,21 +2386,21 @@
         ParserErrorCode.MISSING_IDENTIFIER,
         ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.leftOperand);
-    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
+    expect(expression.leftOperand.isSynthetic, isTrue);
     EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+    expect(expression.rightOperand.isSynthetic, isTrue);
   }
 
   void test_equalityExpression_missing_RHS() {
     BinaryExpression expression = ParserTestCase.parseExpression("x ==", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+    expect(expression.rightOperand.isSynthetic, isTrue);
   }
 
   void test_equalityExpression_missing_RHS_super() {
     BinaryExpression expression = ParserTestCase.parseExpression("super ==", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+    expect(expression.rightOperand.isSynthetic, isTrue);
   }
 
   void test_equalityExpression_precedence_relational_left() {
@@ -2429,26 +2429,26 @@
 
   void test_expressionList_multiple_end() {
     List<Expression> result = ParserTestCase.parse4("parseExpressionList", ", 2, 3, 4", [ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertSizeOfList(4, result);
+    expect(result, hasLength(4));
     Expression syntheticExpression = result[0];
     EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, syntheticExpression);
-    JUnitTestCase.assertTrue(syntheticExpression.isSynthetic);
+    expect(syntheticExpression.isSynthetic, isTrue);
   }
 
   void test_expressionList_multiple_middle() {
     List<Expression> result = ParserTestCase.parse4("parseExpressionList", "1, 2, , 4", [ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertSizeOfList(4, result);
+    expect(result, hasLength(4));
     Expression syntheticExpression = result[2];
     EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, syntheticExpression);
-    JUnitTestCase.assertTrue(syntheticExpression.isSynthetic);
+    expect(syntheticExpression.isSynthetic, isTrue);
   }
 
   void test_expressionList_multiple_start() {
     List<Expression> result = ParserTestCase.parse4("parseExpressionList", "1, 2, 3,", [ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertSizeOfList(4, result);
+    expect(result, hasLength(4));
     Expression syntheticExpression = result[3];
     EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, syntheticExpression);
-    JUnitTestCase.assertTrue(syntheticExpression.isSynthetic);
+    expect(syntheticExpression.isSynthetic, isTrue);
   }
 
   void test_functionExpression_in_ConstructorFieldInitializer() {
@@ -2461,20 +2461,20 @@
     ClassMember fieldDecl = members[1];
     EngineTestCase.assertInstanceOf((obj) => obj is FieldDeclaration, FieldDeclaration, fieldDecl);
     NodeList<VariableDeclaration> vars = (fieldDecl as FieldDeclaration).fields.variables;
-    EngineTestCase.assertSizeOfList(1, vars);
-    JUnitTestCase.assertEquals("v", vars[0].name.name);
+    expect(vars, hasLength(1));
+    expect(vars[0].name.name, "v");
   }
 
   void test_incomplete_topLevelVariable() {
     CompilationUnit unit = ParserTestCase.parseCompilationUnit("String", [ParserErrorCode.EXPECTED_EXECUTABLE]);
     NodeList<CompilationUnitMember> declarations = unit.declarations;
-    EngineTestCase.assertSizeOfList(1, declarations);
+    expect(declarations, hasLength(1));
     CompilationUnitMember member = declarations[0];
     EngineTestCase.assertInstanceOf((obj) => obj is TopLevelVariableDeclaration, TopLevelVariableDeclaration, member);
     NodeList<VariableDeclaration> variables = (member as TopLevelVariableDeclaration).variables.variables;
-    EngineTestCase.assertSizeOfList(1, variables);
+    expect(variables, hasLength(1));
     SimpleIdentifier name = variables[0].name;
-    JUnitTestCase.assertTrue(name.isSynthetic);
+    expect(name.isSynthetic, isTrue);
   }
 
   void test_incomplete_topLevelVariable_const() {
@@ -2482,13 +2482,13 @@
         ParserErrorCode.MISSING_IDENTIFIER,
         ParserErrorCode.EXPECTED_TOKEN]);
     NodeList<CompilationUnitMember> declarations = unit.declarations;
-    EngineTestCase.assertSizeOfList(1, declarations);
+    expect(declarations, hasLength(1));
     CompilationUnitMember member = declarations[0];
     EngineTestCase.assertInstanceOf((obj) => obj is TopLevelVariableDeclaration, TopLevelVariableDeclaration, member);
     NodeList<VariableDeclaration> variables = (member as TopLevelVariableDeclaration).variables.variables;
-    EngineTestCase.assertSizeOfList(1, variables);
+    expect(variables, hasLength(1));
     SimpleIdentifier name = variables[0].name;
-    JUnitTestCase.assertTrue(name.isSynthetic);
+    expect(name.isSynthetic, isTrue);
   }
 
   void test_incomplete_topLevelVariable_final() {
@@ -2496,13 +2496,13 @@
         ParserErrorCode.MISSING_IDENTIFIER,
         ParserErrorCode.EXPECTED_TOKEN]);
     NodeList<CompilationUnitMember> declarations = unit.declarations;
-    EngineTestCase.assertSizeOfList(1, declarations);
+    expect(declarations, hasLength(1));
     CompilationUnitMember member = declarations[0];
     EngineTestCase.assertInstanceOf((obj) => obj is TopLevelVariableDeclaration, TopLevelVariableDeclaration, member);
     NodeList<VariableDeclaration> variables = (member as TopLevelVariableDeclaration).variables.variables;
-    EngineTestCase.assertSizeOfList(1, variables);
+    expect(variables, hasLength(1));
     SimpleIdentifier name = variables[0].name;
-    JUnitTestCase.assertTrue(name.isSynthetic);
+    expect(name.isSynthetic, isTrue);
   }
 
   void test_incomplete_topLevelVariable_var() {
@@ -2510,73 +2510,82 @@
         ParserErrorCode.MISSING_IDENTIFIER,
         ParserErrorCode.EXPECTED_TOKEN]);
     NodeList<CompilationUnitMember> declarations = unit.declarations;
-    EngineTestCase.assertSizeOfList(1, declarations);
+    expect(declarations, hasLength(1));
     CompilationUnitMember member = declarations[0];
     EngineTestCase.assertInstanceOf((obj) => obj is TopLevelVariableDeclaration, TopLevelVariableDeclaration, member);
     NodeList<VariableDeclaration> variables = (member as TopLevelVariableDeclaration).variables.variables;
-    EngineTestCase.assertSizeOfList(1, variables);
+    expect(variables, hasLength(1));
     SimpleIdentifier name = variables[0].name;
-    JUnitTestCase.assertTrue(name.isSynthetic);
+    expect(name.isSynthetic, isTrue);
   }
 
   void test_incompleteField_const() {
-    CompilationUnit unit = ParserTestCase.parseCompilationUnit(EngineTestCase.createSource(["class C {", "  const", "}"]), [
+    CompilationUnit unit = ParserTestCase.parseCompilationUnit(r'''
+class C {
+  const
+}''', [
         ParserErrorCode.MISSING_IDENTIFIER,
         ParserErrorCode.EXPECTED_TOKEN]);
     NodeList<CompilationUnitMember> declarations = unit.declarations;
-    EngineTestCase.assertSizeOfList(1, declarations);
+    expect(declarations, hasLength(1));
     CompilationUnitMember unitMember = declarations[0];
     EngineTestCase.assertInstanceOf((obj) => obj is ClassDeclaration, ClassDeclaration, unitMember);
     NodeList<ClassMember> members = (unitMember as ClassDeclaration).members;
-    EngineTestCase.assertSizeOfList(1, members);
+    expect(members, hasLength(1));
     ClassMember classMember = members[0];
     EngineTestCase.assertInstanceOf((obj) => obj is FieldDeclaration, FieldDeclaration, classMember);
     VariableDeclarationList fieldList = (classMember as FieldDeclaration).fields;
-    JUnitTestCase.assertEquals(Keyword.CONST, (fieldList.keyword as KeywordToken).keyword);
+    expect((fieldList.keyword as KeywordToken).keyword, Keyword.CONST);
     NodeList<VariableDeclaration> fields = fieldList.variables;
-    EngineTestCase.assertSizeOfList(1, fields);
+    expect(fields, hasLength(1));
     VariableDeclaration field = fields[0];
-    JUnitTestCase.assertTrue(field.name.isSynthetic);
+    expect(field.name.isSynthetic, isTrue);
   }
 
   void test_incompleteField_final() {
-    CompilationUnit unit = ParserTestCase.parseCompilationUnit(EngineTestCase.createSource(["class C {", "  final", "}"]), [
+    CompilationUnit unit = ParserTestCase.parseCompilationUnit(r'''
+class C {
+  final
+}''', [
         ParserErrorCode.MISSING_IDENTIFIER,
         ParserErrorCode.EXPECTED_TOKEN]);
     NodeList<CompilationUnitMember> declarations = unit.declarations;
-    EngineTestCase.assertSizeOfList(1, declarations);
+    expect(declarations, hasLength(1));
     CompilationUnitMember unitMember = declarations[0];
     EngineTestCase.assertInstanceOf((obj) => obj is ClassDeclaration, ClassDeclaration, unitMember);
     NodeList<ClassMember> members = (unitMember as ClassDeclaration).members;
-    EngineTestCase.assertSizeOfList(1, members);
+    expect(members, hasLength(1));
     ClassMember classMember = members[0];
     EngineTestCase.assertInstanceOf((obj) => obj is FieldDeclaration, FieldDeclaration, classMember);
     VariableDeclarationList fieldList = (classMember as FieldDeclaration).fields;
-    JUnitTestCase.assertEquals(Keyword.FINAL, (fieldList.keyword as KeywordToken).keyword);
+    expect((fieldList.keyword as KeywordToken).keyword, Keyword.FINAL);
     NodeList<VariableDeclaration> fields = fieldList.variables;
-    EngineTestCase.assertSizeOfList(1, fields);
+    expect(fields, hasLength(1));
     VariableDeclaration field = fields[0];
-    JUnitTestCase.assertTrue(field.name.isSynthetic);
+    expect(field.name.isSynthetic, isTrue);
   }
 
   void test_incompleteField_var() {
-    CompilationUnit unit = ParserTestCase.parseCompilationUnit(EngineTestCase.createSource(["class C {", "  var", "}"]), [
+    CompilationUnit unit = ParserTestCase.parseCompilationUnit(r'''
+class C {
+  var
+}''', [
         ParserErrorCode.MISSING_IDENTIFIER,
         ParserErrorCode.EXPECTED_TOKEN]);
     NodeList<CompilationUnitMember> declarations = unit.declarations;
-    EngineTestCase.assertSizeOfList(1, declarations);
+    expect(declarations, hasLength(1));
     CompilationUnitMember unitMember = declarations[0];
     EngineTestCase.assertInstanceOf((obj) => obj is ClassDeclaration, ClassDeclaration, unitMember);
     NodeList<ClassMember> members = (unitMember as ClassDeclaration).members;
-    EngineTestCase.assertSizeOfList(1, members);
+    expect(members, hasLength(1));
     ClassMember classMember = members[0];
     EngineTestCase.assertInstanceOf((obj) => obj is FieldDeclaration, FieldDeclaration, classMember);
     VariableDeclarationList fieldList = (classMember as FieldDeclaration).fields;
-    JUnitTestCase.assertEquals(Keyword.VAR, (fieldList.keyword as KeywordToken).keyword);
+    expect((fieldList.keyword as KeywordToken).keyword, Keyword.VAR);
     NodeList<VariableDeclaration> fields = fieldList.variables;
-    EngineTestCase.assertSizeOfList(1, fields);
+    expect(fields, hasLength(1));
     VariableDeclaration field = fields[0];
-    JUnitTestCase.assertTrue(field.name.isSynthetic);
+    expect(field.name.isSynthetic, isTrue);
   }
 
   void test_isExpression_noType() {
@@ -2589,19 +2598,19 @@
     BlockFunctionBody body = method.body as BlockFunctionBody;
     IfStatement ifStatement = body.block.statements[1] as IfStatement;
     IsExpression expression = ifStatement.condition as IsExpression;
-    JUnitTestCase.assertNotNull(expression.expression);
-    JUnitTestCase.assertNotNull(expression.isOperator);
-    JUnitTestCase.assertNotNull(expression.notOperator);
+    expect(expression.expression, isNotNull);
+    expect(expression.isOperator, isNotNull);
+    expect(expression.notOperator, isNotNull);
     TypeName type = expression.type;
-    JUnitTestCase.assertNotNull(type);
-    JUnitTestCase.assertTrue(type.name.isSynthetic);
+    expect(type, isNotNull);
+    expect(type.name.isSynthetic, isTrue);
     EngineTestCase.assertInstanceOf((obj) => obj is EmptyStatement, EmptyStatement, ifStatement.thenStatement);
   }
 
   void test_logicalAndExpression_missing_LHS() {
     BinaryExpression expression = ParserTestCase.parseExpression("&& y", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.leftOperand);
-    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
+    expect(expression.leftOperand.isSynthetic, isTrue);
   }
 
   void test_logicalAndExpression_missing_LHS_RHS() {
@@ -2609,15 +2618,15 @@
         ParserErrorCode.MISSING_IDENTIFIER,
         ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.leftOperand);
-    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
+    expect(expression.leftOperand.isSynthetic, isTrue);
     EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+    expect(expression.rightOperand.isSynthetic, isTrue);
   }
 
   void test_logicalAndExpression_missing_RHS() {
     BinaryExpression expression = ParserTestCase.parseExpression("x &&", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+    expect(expression.rightOperand.isSynthetic, isTrue);
   }
 
   void test_logicalAndExpression_precedence_bitwiseOr_left() {
@@ -2639,7 +2648,7 @@
   void test_logicalOrExpression_missing_LHS() {
     BinaryExpression expression = ParserTestCase.parseExpression("|| y", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.leftOperand);
-    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
+    expect(expression.leftOperand.isSynthetic, isTrue);
   }
 
   void test_logicalOrExpression_missing_LHS_RHS() {
@@ -2647,15 +2656,15 @@
         ParserErrorCode.MISSING_IDENTIFIER,
         ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.leftOperand);
-    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
+    expect(expression.leftOperand.isSynthetic, isTrue);
     EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+    expect(expression.rightOperand.isSynthetic, isTrue);
   }
 
   void test_logicalOrExpression_missing_RHS() {
     BinaryExpression expression = ParserTestCase.parseExpression("x ||", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+    expect(expression.rightOperand.isSynthetic, isTrue);
   }
 
   void test_logicalOrExpression_precedence_logicalAnd_left() {
@@ -2675,29 +2684,33 @@
   }
 
   void test_missingGet() {
-    CompilationUnit unit = ParserTestCase.parseCompilationUnit(EngineTestCase.createSource(["class C {", "  int length {}", "  void foo() {}", "}"]), [ParserErrorCode.MISSING_GET]);
-    JUnitTestCase.assertNotNull(unit);
+    CompilationUnit unit = ParserTestCase.parseCompilationUnit(r'''
+class C {
+  int length {}
+  void foo() {}
+}''', [ParserErrorCode.MISSING_GET]);
+    expect(unit, isNotNull);
     ClassDeclaration classDeclaration = unit.declarations[0] as ClassDeclaration;
     NodeList<ClassMember> members = classDeclaration.members;
-    EngineTestCase.assertSizeOfList(2, members);
+    expect(members, hasLength(2));
     EngineTestCase.assertInstanceOf((obj) => obj is MethodDeclaration, MethodDeclaration, members[0]);
     ClassMember member = members[1];
     EngineTestCase.assertInstanceOf((obj) => obj is MethodDeclaration, MethodDeclaration, member);
-    JUnitTestCase.assertEquals("foo", (member as MethodDeclaration).name.name);
+    expect((member as MethodDeclaration).name.name, "foo");
   }
 
   void test_missingIdentifier_afterAnnotation() {
     MethodDeclaration method = ParserTestCase.parse3("parseClassMember", <Object> ["C"], "@override }", [ParserErrorCode.EXPECTED_CLASS_MEMBER]);
-    JUnitTestCase.assertNull(method.documentationComment);
+    expect(method.documentationComment, isNull);
     NodeList<Annotation> metadata = method.metadata;
-    EngineTestCase.assertSizeOfList(1, metadata);
-    JUnitTestCase.assertEquals("override", metadata[0].name.name);
+    expect(metadata, hasLength(1));
+    expect(metadata[0].name.name, "override");
   }
 
   void test_multiplicativeExpression_missing_LHS() {
     BinaryExpression expression = ParserTestCase.parseExpression("* y", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.leftOperand);
-    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
+    expect(expression.leftOperand.isSynthetic, isTrue);
   }
 
   void test_multiplicativeExpression_missing_LHS_RHS() {
@@ -2705,21 +2718,21 @@
         ParserErrorCode.MISSING_IDENTIFIER,
         ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.leftOperand);
-    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
+    expect(expression.leftOperand.isSynthetic, isTrue);
     EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+    expect(expression.rightOperand.isSynthetic, isTrue);
   }
 
   void test_multiplicativeExpression_missing_RHS() {
     BinaryExpression expression = ParserTestCase.parseExpression("x *", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+    expect(expression.rightOperand.isSynthetic, isTrue);
   }
 
   void test_multiplicativeExpression_missing_RHS_super() {
     BinaryExpression expression = ParserTestCase.parseExpression("super *", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+    expect(expression.rightOperand.isSynthetic, isTrue);
   }
 
   void test_multiplicativeExpression_precedence_unary_left() {
@@ -2743,8 +2756,8 @@
   void test_prefixExpression_missing_operand_minus() {
     PrefixExpression expression = ParserTestCase.parseExpression("-", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.operand);
-    JUnitTestCase.assertTrue(expression.operand.isSynthetic);
-    JUnitTestCase.assertEquals(TokenType.MINUS, expression.operator.type);
+    expect(expression.operand.isSynthetic, isTrue);
+    expect(expression.operator.type, TokenType.MINUS);
   }
 
   void test_primaryExpression_argumentDefinitionTest() {
@@ -2755,7 +2768,7 @@
   void test_relationalExpression_missing_LHS() {
     IsExpression expression = ParserTestCase.parseExpression("is y", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.expression);
-    JUnitTestCase.assertTrue(expression.expression.isSynthetic);
+    expect(expression.expression.isSynthetic, isTrue);
   }
 
   void test_relationalExpression_missing_LHS_RHS() {
@@ -2763,15 +2776,15 @@
         ParserErrorCode.EXPECTED_TYPE_NAME,
         ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.expression);
-    JUnitTestCase.assertTrue(expression.expression.isSynthetic);
+    expect(expression.expression.isSynthetic, isTrue);
     EngineTestCase.assertInstanceOf((obj) => obj is TypeName, TypeName, expression.type);
-    JUnitTestCase.assertTrue(expression.type.isSynthetic);
+    expect(expression.type.isSynthetic, isTrue);
   }
 
   void test_relationalExpression_missing_RHS() {
     IsExpression expression = ParserTestCase.parseExpression("x is", [ParserErrorCode.EXPECTED_TYPE_NAME]);
     EngineTestCase.assertInstanceOf((obj) => obj is TypeName, TypeName, expression.type);
-    JUnitTestCase.assertTrue(expression.type.isSynthetic);
+    expect(expression.type.isSynthetic, isTrue);
   }
 
   void test_relationalExpression_precedence_shift_right() {
@@ -2785,7 +2798,7 @@
   void test_shiftExpression_missing_LHS() {
     BinaryExpression expression = ParserTestCase.parseExpression("<< y", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.leftOperand);
-    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
+    expect(expression.leftOperand.isSynthetic, isTrue);
   }
 
   void test_shiftExpression_missing_LHS_RHS() {
@@ -2793,21 +2806,21 @@
         ParserErrorCode.MISSING_IDENTIFIER,
         ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.leftOperand);
-    JUnitTestCase.assertTrue(expression.leftOperand.isSynthetic);
+    expect(expression.leftOperand.isSynthetic, isTrue);
     EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+    expect(expression.rightOperand.isSynthetic, isTrue);
   }
 
   void test_shiftExpression_missing_RHS() {
     BinaryExpression expression = ParserTestCase.parseExpression("x <<", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+    expect(expression.rightOperand.isSynthetic, isTrue);
   }
 
   void test_shiftExpression_missing_RHS_super() {
     BinaryExpression expression = ParserTestCase.parseExpression("super <<", [ParserErrorCode.MISSING_IDENTIFIER]);
     EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.rightOperand);
-    JUnitTestCase.assertTrue(expression.rightOperand.isSynthetic);
+    expect(expression.rightOperand.isSynthetic, isTrue);
   }
 
   void test_shiftExpression_precedence_unary_left() {
@@ -2838,7 +2851,7 @@
         ParserErrorCode.EXPECTED_TOKEN,
         ParserErrorCode.MISSING_TYPEDEF_PARAMETERS]);
     NodeList<CompilationUnitMember> declarations = unit.declarations;
-    EngineTestCase.assertSizeOfList(1, declarations);
+    expect(declarations, hasLength(1));
     CompilationUnitMember member = declarations[0];
     EngineTestCase.assertInstanceOf((obj) => obj is FunctionTypeAlias, FunctionTypeAlias, member);
   }
@@ -2852,7 +2865,7 @@
     fromNode.element = element;
     Annotation toNode = AstFactory.annotation(AstFactory.identifier3(annotationName));
     ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(element, toNode.element);
+    expect(toNode.element, same(element));
   }
 
   void test_visitAsExpression() {
@@ -2863,8 +2876,8 @@
     fromNode.staticType = staticType;
     AsExpression toNode = AstFactory.asExpression(AstFactory.identifier3("x"), AstFactory.typeName4("A", []));
     ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
-    JUnitTestCase.assertSame(staticType, toNode.staticType);
+    expect(toNode.propagatedType, same(propagatedType));
+    expect(toNode.staticType, same(staticType));
   }
 
   void test_visitAssignmentExpression() {
@@ -2879,10 +2892,10 @@
     fromNode.staticType = staticType;
     AssignmentExpression toNode = AstFactory.assignmentExpression(AstFactory.identifier3("a"), TokenType.PLUS_EQ, AstFactory.identifier3("b"));
     ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(propagatedElement, toNode.propagatedElement);
-    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
-    JUnitTestCase.assertSame(staticElement, toNode.staticElement);
-    JUnitTestCase.assertSame(staticType, toNode.staticType);
+    expect(toNode.propagatedElement, same(propagatedElement));
+    expect(toNode.propagatedType, same(propagatedType));
+    expect(toNode.staticElement, same(staticElement));
+    expect(toNode.staticType, same(staticType));
   }
 
   void test_visitBinaryExpression() {
@@ -2897,10 +2910,10 @@
     fromNode.staticType = staticType;
     BinaryExpression toNode = AstFactory.binaryExpression(AstFactory.identifier3("a"), TokenType.PLUS, AstFactory.identifier3("b"));
     ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(propagatedElement, toNode.propagatedElement);
-    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
-    JUnitTestCase.assertSame(staticElement, toNode.staticElement);
-    JUnitTestCase.assertSame(staticType, toNode.staticType);
+    expect(toNode.propagatedElement, same(propagatedElement));
+    expect(toNode.propagatedType, same(propagatedType));
+    expect(toNode.staticElement, same(staticElement));
+    expect(toNode.staticType, same(staticType));
   }
 
   void test_visitBooleanLiteral() {
@@ -2911,8 +2924,8 @@
     fromNode.staticType = staticType;
     BooleanLiteral toNode = AstFactory.booleanLiteral(true);
     ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
-    JUnitTestCase.assertSame(staticType, toNode.staticType);
+    expect(toNode.propagatedType, same(propagatedType));
+    expect(toNode.staticType, same(staticType));
   }
 
   void test_visitCascadeExpression() {
@@ -2923,8 +2936,8 @@
     fromNode.staticType = staticType;
     CascadeExpression toNode = AstFactory.cascadeExpression(AstFactory.identifier3("a"), [AstFactory.identifier3("b")]);
     ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
-    JUnitTestCase.assertSame(staticType, toNode.staticType);
+    expect(toNode.propagatedType, same(propagatedType));
+    expect(toNode.staticType, same(staticType));
   }
 
   void test_visitCompilationUnit() {
@@ -2933,7 +2946,7 @@
     fromNode.element = element;
     CompilationUnit toNode = AstFactory.compilationUnit();
     ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(element, toNode.element);
+    expect(toNode.element, same(element));
   }
 
   void test_visitConditionalExpression() {
@@ -2944,8 +2957,8 @@
     fromNode.staticType = staticType;
     ConditionalExpression toNode = AstFactory.conditionalExpression(AstFactory.identifier3("c"), AstFactory.identifier3("a"), AstFactory.identifier3("b"));
     ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
-    JUnitTestCase.assertSame(staticType, toNode.staticType);
+    expect(toNode.propagatedType, same(propagatedType));
+    expect(toNode.staticType, same(staticType));
   }
 
   void test_visitConstructorDeclaration() {
@@ -2956,7 +2969,7 @@
     fromNode.element = element;
     ConstructorDeclaration toNode = AstFactory.constructorDeclaration(AstFactory.identifier3(className), constructorName, AstFactory.formalParameterList([]), null);
     ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(element, toNode.element);
+    expect(toNode.element, same(element));
   }
 
   void test_visitConstructorName() {
@@ -2965,7 +2978,7 @@
     fromNode.staticElement = staticElement;
     ConstructorName toNode = AstFactory.constructorName(AstFactory.typeName4("A", []), "c");
     ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(staticElement, toNode.staticElement);
+    expect(toNode.staticElement, same(staticElement));
   }
 
   void test_visitDoubleLiteral() {
@@ -2976,8 +2989,8 @@
     fromNode.staticType = staticType;
     DoubleLiteral toNode = AstFactory.doubleLiteral(1.0);
     ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
-    JUnitTestCase.assertSame(staticType, toNode.staticType);
+    expect(toNode.propagatedType, same(propagatedType));
+    expect(toNode.staticType, same(staticType));
   }
 
   void test_visitExportDirective() {
@@ -2986,7 +2999,7 @@
     fromNode.element = element;
     ExportDirective toNode = AstFactory.exportDirective2("dart:uri", []);
     ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(element, toNode.element);
+    expect(toNode.element, same(element));
   }
 
   void test_visitFunctionExpression() {
@@ -2999,9 +3012,9 @@
     fromNode.staticType = staticType;
     FunctionExpression toNode = AstFactory.functionExpression2(AstFactory.formalParameterList([]), AstFactory.emptyFunctionBody());
     ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(element, toNode.element);
-    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
-    JUnitTestCase.assertSame(staticType, toNode.staticType);
+    expect(toNode.element, same(element));
+    expect(toNode.propagatedType, same(propagatedType));
+    expect(toNode.staticType, same(staticType));
   }
 
   void test_visitFunctionExpressionInvocation() {
@@ -3016,10 +3029,10 @@
     fromNode.staticType = staticType;
     FunctionExpressionInvocation toNode = AstFactory.functionExpressionInvocation(AstFactory.identifier3("f"), []);
     ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(propagatedElement, toNode.propagatedElement);
-    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
-    JUnitTestCase.assertSame(staticElement, toNode.staticElement);
-    JUnitTestCase.assertSame(staticType, toNode.staticType);
+    expect(toNode.propagatedElement, same(propagatedElement));
+    expect(toNode.propagatedType, same(propagatedType));
+    expect(toNode.staticElement, same(staticElement));
+    expect(toNode.staticType, same(staticType));
   }
 
   void test_visitImportDirective() {
@@ -3028,7 +3041,7 @@
     fromNode.element = element;
     ImportDirective toNode = AstFactory.importDirective3("dart:uri", null, []);
     ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(element, toNode.element);
+    expect(toNode.element, same(element));
   }
 
   void test_visitIndexExpression() {
@@ -3045,11 +3058,11 @@
     fromNode.staticType = staticType;
     IndexExpression toNode = AstFactory.indexExpression(AstFactory.identifier3("a"), AstFactory.integer(0));
     ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(auxiliaryElements, toNode.auxiliaryElements);
-    JUnitTestCase.assertSame(propagatedElement, toNode.propagatedElement);
-    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
-    JUnitTestCase.assertSame(staticElement, toNode.staticElement);
-    JUnitTestCase.assertSame(staticType, toNode.staticType);
+    expect(toNode.auxiliaryElements, same(auxiliaryElements));
+    expect(toNode.propagatedElement, same(propagatedElement));
+    expect(toNode.propagatedType, same(propagatedType));
+    expect(toNode.staticElement, same(staticElement));
+    expect(toNode.staticType, same(staticType));
   }
 
   void test_visitInstanceCreationExpression() {
@@ -3062,9 +3075,9 @@
     fromNode.staticType = staticType;
     InstanceCreationExpression toNode = AstFactory.instanceCreationExpression2(Keyword.NEW, AstFactory.typeName4("C", []), []);
     ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
-    JUnitTestCase.assertSame(staticElement, toNode.staticElement);
-    JUnitTestCase.assertSame(staticType, toNode.staticType);
+    expect(toNode.propagatedType, same(propagatedType));
+    expect(toNode.staticElement, same(staticElement));
+    expect(toNode.staticType, same(staticType));
   }
 
   void test_visitIntegerLiteral() {
@@ -3075,8 +3088,8 @@
     fromNode.staticType = staticType;
     IntegerLiteral toNode = AstFactory.integer(2);
     ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
-    JUnitTestCase.assertSame(staticType, toNode.staticType);
+    expect(toNode.propagatedType, same(propagatedType));
+    expect(toNode.staticType, same(staticType));
   }
 
   void test_visitIsExpression() {
@@ -3087,8 +3100,8 @@
     fromNode.staticType = staticType;
     IsExpression toNode = AstFactory.isExpression(AstFactory.identifier3("x"), false, AstFactory.typeName4("A", []));
     ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
-    JUnitTestCase.assertSame(staticType, toNode.staticType);
+    expect(toNode.propagatedType, same(propagatedType));
+    expect(toNode.staticType, same(staticType));
   }
 
   void test_visitLibraryIdentifier() {
@@ -3099,8 +3112,8 @@
     fromNode.staticType = staticType;
     LibraryIdentifier toNode = AstFactory.libraryIdentifier([AstFactory.identifier3("lib")]);
     ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
-    JUnitTestCase.assertSame(staticType, toNode.staticType);
+    expect(toNode.propagatedType, same(propagatedType));
+    expect(toNode.staticType, same(staticType));
   }
 
   void test_visitListLiteral() {
@@ -3111,8 +3124,8 @@
     fromNode.staticType = staticType;
     ListLiteral toNode = AstFactory.listLiteral([]);
     ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
-    JUnitTestCase.assertSame(staticType, toNode.staticType);
+    expect(toNode.propagatedType, same(propagatedType));
+    expect(toNode.staticType, same(staticType));
   }
 
   void test_visitMapLiteral() {
@@ -3123,8 +3136,8 @@
     fromNode.staticType = staticType;
     MapLiteral toNode = AstFactory.mapLiteral2([]);
     ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
-    JUnitTestCase.assertSame(staticType, toNode.staticType);
+    expect(toNode.propagatedType, same(propagatedType));
+    expect(toNode.staticType, same(staticType));
   }
 
   void test_visitMethodInvocation() {
@@ -3135,8 +3148,8 @@
     fromNode.staticType = staticType;
     MethodInvocation toNode = AstFactory.methodInvocation2("m", []);
     ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
-    JUnitTestCase.assertSame(staticType, toNode.staticType);
+    expect(toNode.propagatedType, same(propagatedType));
+    expect(toNode.staticType, same(staticType));
   }
 
   void test_visitNamedExpression() {
@@ -3147,8 +3160,8 @@
     fromNode.staticType = staticType;
     NamedExpression toNode = AstFactory.namedExpression2("n", AstFactory.integer(0));
     ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
-    JUnitTestCase.assertSame(staticType, toNode.staticType);
+    expect(toNode.propagatedType, same(propagatedType));
+    expect(toNode.staticType, same(staticType));
   }
 
   void test_visitNullLiteral() {
@@ -3159,8 +3172,8 @@
     fromNode.staticType = staticType;
     NullLiteral toNode = AstFactory.nullLiteral();
     ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
-    JUnitTestCase.assertSame(staticType, toNode.staticType);
+    expect(toNode.propagatedType, same(propagatedType));
+    expect(toNode.staticType, same(staticType));
   }
 
   void test_visitParenthesizedExpression() {
@@ -3171,8 +3184,8 @@
     fromNode.staticType = staticType;
     ParenthesizedExpression toNode = AstFactory.parenthesizedExpression(AstFactory.integer(0));
     ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
-    JUnitTestCase.assertSame(staticType, toNode.staticType);
+    expect(toNode.propagatedType, same(propagatedType));
+    expect(toNode.staticType, same(staticType));
   }
 
   void test_visitPartDirective() {
@@ -3181,7 +3194,7 @@
     fromNode.element = element;
     PartDirective toNode = AstFactory.partDirective2("part.dart");
     ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(element, toNode.element);
+    expect(toNode.element, same(element));
   }
 
   void test_visitPartOfDirective() {
@@ -3190,7 +3203,7 @@
     fromNode.element = element;
     PartOfDirective toNode = AstFactory.partOfDirective(AstFactory.libraryIdentifier2(["lib"]));
     ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(element, toNode.element);
+    expect(toNode.element, same(element));
   }
 
   void test_visitPostfixExpression() {
@@ -3206,10 +3219,10 @@
     fromNode.staticType = staticType;
     PostfixExpression toNode = AstFactory.postfixExpression(AstFactory.identifier3(variableName), TokenType.PLUS_PLUS);
     ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(propagatedElement, toNode.propagatedElement);
-    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
-    JUnitTestCase.assertSame(staticElement, toNode.staticElement);
-    JUnitTestCase.assertSame(staticType, toNode.staticType);
+    expect(toNode.propagatedElement, same(propagatedElement));
+    expect(toNode.propagatedType, same(propagatedType));
+    expect(toNode.staticElement, same(staticElement));
+    expect(toNode.staticType, same(staticType));
   }
 
   void test_visitPrefixedIdentifier() {
@@ -3220,8 +3233,8 @@
     fromNode.staticType = staticType;
     PrefixedIdentifier toNode = AstFactory.identifier5("p", "f");
     ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
-    JUnitTestCase.assertSame(staticType, toNode.staticType);
+    expect(toNode.propagatedType, same(propagatedType));
+    expect(toNode.staticType, same(staticType));
   }
 
   void test_visitPrefixExpression() {
@@ -3236,10 +3249,10 @@
     fromNode.staticType = staticType;
     PrefixExpression toNode = AstFactory.prefixExpression(TokenType.PLUS_PLUS, AstFactory.identifier3("x"));
     ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(propagatedElement, toNode.propagatedElement);
-    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
-    JUnitTestCase.assertSame(staticElement, toNode.staticElement);
-    JUnitTestCase.assertSame(staticType, toNode.staticType);
+    expect(toNode.propagatedElement, same(propagatedElement));
+    expect(toNode.propagatedType, same(propagatedType));
+    expect(toNode.staticElement, same(staticElement));
+    expect(toNode.staticType, same(staticType));
   }
 
   void test_visitPropertyAccess() {
@@ -3250,8 +3263,8 @@
     fromNode.staticType = staticType;
     PropertyAccess toNode = AstFactory.propertyAccess2(AstFactory.identifier3("x"), "y");
     ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
-    JUnitTestCase.assertSame(staticType, toNode.staticType);
+    expect(toNode.propagatedType, same(propagatedType));
+    expect(toNode.staticType, same(staticType));
   }
 
   void test_visitRedirectingConstructorInvocation() {
@@ -3260,7 +3273,7 @@
     fromNode.staticElement = staticElement;
     RedirectingConstructorInvocation toNode = AstFactory.redirectingConstructorInvocation([]);
     ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(staticElement, toNode.staticElement);
+    expect(toNode.staticElement, same(staticElement));
   }
 
   void test_visitRethrowExpression() {
@@ -3271,8 +3284,8 @@
     fromNode.staticType = staticType;
     RethrowExpression toNode = AstFactory.rethrowExpression();
     ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
-    JUnitTestCase.assertSame(staticType, toNode.staticType);
+    expect(toNode.propagatedType, same(propagatedType));
+    expect(toNode.staticType, same(staticType));
   }
 
   void test_visitSimpleIdentifier() {
@@ -3289,11 +3302,11 @@
     fromNode.staticType = staticType;
     SimpleIdentifier toNode = AstFactory.identifier3("x");
     ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(auxiliaryElements, toNode.auxiliaryElements);
-    JUnitTestCase.assertSame(propagatedElement, toNode.propagatedElement);
-    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
-    JUnitTestCase.assertSame(staticElement, toNode.staticElement);
-    JUnitTestCase.assertSame(staticType, toNode.staticType);
+    expect(toNode.auxiliaryElements, same(auxiliaryElements));
+    expect(toNode.propagatedElement, same(propagatedElement));
+    expect(toNode.propagatedType, same(propagatedType));
+    expect(toNode.staticElement, same(staticElement));
+    expect(toNode.staticType, same(staticType));
   }
 
   void test_visitSimpleStringLiteral() {
@@ -3304,8 +3317,8 @@
     fromNode.staticType = staticType;
     SimpleStringLiteral toNode = AstFactory.string2("abc");
     ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
-    JUnitTestCase.assertSame(staticType, toNode.staticType);
+    expect(toNode.propagatedType, same(propagatedType));
+    expect(toNode.staticType, same(staticType));
   }
 
   void test_visitStringInterpolation() {
@@ -3316,8 +3329,8 @@
     fromNode.staticType = staticType;
     StringInterpolation toNode = AstFactory.string([AstFactory.interpolationString("a", "'a'")]);
     ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
-    JUnitTestCase.assertSame(staticType, toNode.staticType);
+    expect(toNode.propagatedType, same(propagatedType));
+    expect(toNode.staticType, same(staticType));
   }
 
   void test_visitSuperConstructorInvocation() {
@@ -3326,7 +3339,7 @@
     fromNode.staticElement = staticElement;
     SuperConstructorInvocation toNode = AstFactory.superConstructorInvocation([]);
     ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(staticElement, toNode.staticElement);
+    expect(toNode.staticElement, same(staticElement));
   }
 
   void test_visitSuperExpression() {
@@ -3337,8 +3350,8 @@
     fromNode.staticType = staticType;
     SuperExpression toNode = AstFactory.superExpression();
     ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
-    JUnitTestCase.assertSame(staticType, toNode.staticType);
+    expect(toNode.propagatedType, same(propagatedType));
+    expect(toNode.staticType, same(staticType));
   }
 
   void test_visitSymbolLiteral() {
@@ -3349,8 +3362,8 @@
     fromNode.staticType = staticType;
     SymbolLiteral toNode = AstFactory.symbolLiteral(["s"]);
     ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
-    JUnitTestCase.assertSame(staticType, toNode.staticType);
+    expect(toNode.propagatedType, same(propagatedType));
+    expect(toNode.staticType, same(staticType));
   }
 
   void test_visitThisExpression() {
@@ -3361,8 +3374,8 @@
     fromNode.staticType = staticType;
     ThisExpression toNode = AstFactory.thisExpression();
     ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
-    JUnitTestCase.assertSame(staticType, toNode.staticType);
+    expect(toNode.propagatedType, same(propagatedType));
+    expect(toNode.staticType, same(staticType));
   }
 
   void test_visitThrowExpression() {
@@ -3373,8 +3386,8 @@
     fromNode.staticType = staticType;
     ThrowExpression toNode = AstFactory.throwExpression();
     ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(propagatedType, toNode.propagatedType);
-    JUnitTestCase.assertSame(staticType, toNode.staticType);
+    expect(toNode.propagatedType, same(propagatedType));
+    expect(toNode.staticType, same(staticType));
   }
 
   void test_visitTypeName() {
@@ -3383,7 +3396,7 @@
     fromNode.type = type;
     TypeName toNode = AstFactory.typeName4("C", []);
     ResolutionCopier.copyResolutionData(fromNode, toNode);
-    JUnitTestCase.assertSame(type, toNode.type);
+    expect(toNode.type, same(type));
   }
 }
 
@@ -3400,89 +3413,89 @@
     // is not null.
     CommentReference reference = ParserTestCase.parse("parseCommentReference", <Object> ["this", 5], "");
     SimpleIdentifier identifier = EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, reference.identifier);
-    JUnitTestCase.assertNotNull(identifier.token);
-    JUnitTestCase.assertEquals("a", identifier.name);
-    JUnitTestCase.assertEquals(5, identifier.offset);
+    expect(identifier.token, isNotNull);
+    expect(identifier.name, "a");
+    expect(identifier.offset, 5);
   }
 
   void test_computeStringValue_emptyInterpolationPrefix() {
-    JUnitTestCase.assertEquals("", _computeStringValue("'''", true, false));
+    expect(_computeStringValue("'''", true, false), "");
   }
 
   void test_computeStringValue_escape_b() {
-    JUnitTestCase.assertEquals("\b", _computeStringValue("'\\b'", true, true));
+    expect(_computeStringValue("'\\b'", true, true), "\b");
   }
 
   void test_computeStringValue_escape_f() {
-    JUnitTestCase.assertEquals("\f", _computeStringValue("'\\f'", true, true));
+    expect(_computeStringValue("'\\f'", true, true), "\f");
   }
 
   void test_computeStringValue_escape_n() {
-    JUnitTestCase.assertEquals("\n", _computeStringValue("'\\n'", true, true));
+    expect(_computeStringValue("'\\n'", true, true), "\n");
   }
 
   void test_computeStringValue_escape_notSpecial() {
-    JUnitTestCase.assertEquals(":", _computeStringValue("'\\:'", true, true));
+    expect(_computeStringValue("'\\:'", true, true), ":");
   }
 
   void test_computeStringValue_escape_r() {
-    JUnitTestCase.assertEquals("\r", _computeStringValue("'\\r'", true, true));
+    expect(_computeStringValue("'\\r'", true, true), "\r");
   }
 
   void test_computeStringValue_escape_t() {
-    JUnitTestCase.assertEquals("\t", _computeStringValue("'\\t'", true, true));
+    expect(_computeStringValue("'\\t'", true, true), "\t");
   }
 
   void test_computeStringValue_escape_u_fixed() {
-    JUnitTestCase.assertEquals("\u4321", _computeStringValue("'\\u4321'", true, true));
+    expect(_computeStringValue("'\\u4321'", true, true), "\u4321");
   }
 
   void test_computeStringValue_escape_u_variable() {
-    JUnitTestCase.assertEquals("\u0123", _computeStringValue("'\\u{123}'", true, true));
+    expect(_computeStringValue("'\\u{123}'", true, true), "\u0123");
   }
 
   void test_computeStringValue_escape_v() {
-    JUnitTestCase.assertEquals("\u000B", _computeStringValue("'\\v'", true, true));
+    expect(_computeStringValue("'\\v'", true, true), "\u000B");
   }
 
   void test_computeStringValue_escape_x() {
-    JUnitTestCase.assertEquals("\u00FF", _computeStringValue("'\\xFF'", true, true));
+    expect(_computeStringValue("'\\xFF'", true, true), "\u00FF");
   }
 
   void test_computeStringValue_noEscape_single() {
-    JUnitTestCase.assertEquals("text", _computeStringValue("'text'", true, true));
+    expect(_computeStringValue("'text'", true, true), "text");
   }
 
   void test_computeStringValue_noEscape_triple() {
-    JUnitTestCase.assertEquals("text", _computeStringValue("'''text'''", true, true));
+    expect(_computeStringValue("'''text'''", true, true), "text");
   }
 
   void test_computeStringValue_raw_single() {
-    JUnitTestCase.assertEquals("text", _computeStringValue("r'text'", true, true));
+    expect(_computeStringValue("r'text'", true, true), "text");
   }
 
   void test_computeStringValue_raw_triple() {
-    JUnitTestCase.assertEquals("text", _computeStringValue("r'''text'''", true, true));
+    expect(_computeStringValue("r'''text'''", true, true), "text");
   }
 
   void test_computeStringValue_raw_withEscape() {
-    JUnitTestCase.assertEquals("two\\nlines", _computeStringValue("r'two\\nlines'", true, true));
+    expect(_computeStringValue("r'two\\nlines'", true, true), "two\\nlines");
   }
 
   void test_computeStringValue_triple_internalQuote_first_empty() {
-    JUnitTestCase.assertEquals("'", _computeStringValue("''''", true, false));
+    expect(_computeStringValue("''''", true, false), "'");
   }
 
   void test_computeStringValue_triple_internalQuote_first_nonEmpty() {
-    JUnitTestCase.assertEquals("'text", _computeStringValue("''''text", true, false));
+    expect(_computeStringValue("''''text", true, false), "'text");
   }
 
   void test_computeStringValue_triple_internalQuote_last_empty() {
-    JUnitTestCase.assertEquals("", _computeStringValue("'''", false, true));
+    expect(_computeStringValue("'''", false, true), "");
   }
 
   void test_computeStringValue_triple_internalQuote_last_nonEmpty() {
-    JUnitTestCase.assertEquals("text", _computeStringValue("text'''", false, true));
+    expect(_computeStringValue("text'''", false, true), "text");
   }
 
   void test_constFactory() {
@@ -3491,12 +3504,12 @@
 
   void test_createSyntheticIdentifier() {
     SimpleIdentifier identifier = _createSyntheticIdentifier();
-    JUnitTestCase.assertTrue(identifier.isSynthetic);
+    expect(identifier.isSynthetic, isTrue);
   }
 
   void test_createSyntheticStringLiteral() {
     SimpleStringLiteral literal = _createSyntheticStringLiteral();
-    JUnitTestCase.assertTrue(literal.isSynthetic);
+    expect(literal.isSynthetic, isTrue);
   }
 
   void test_function_literal_allowed_at_toplevel() {
@@ -3528,394 +3541,394 @@
   }
 
   void test_isFunctionDeclaration_nameButNoReturn_block() {
-    JUnitTestCase.assertTrue(_isFunctionDeclaration("f() {}"));
+    expect(_isFunctionDeclaration("f() {}"), isTrue);
   }
 
   void test_isFunctionDeclaration_nameButNoReturn_expression() {
-    JUnitTestCase.assertTrue(_isFunctionDeclaration("f() => e"));
+    expect(_isFunctionDeclaration("f() => e"), isTrue);
   }
 
   void test_isFunctionDeclaration_normalReturn_block() {
-    JUnitTestCase.assertTrue(_isFunctionDeclaration("C f() {}"));
+    expect(_isFunctionDeclaration("C f() {}"), isTrue);
   }
 
   void test_isFunctionDeclaration_normalReturn_expression() {
-    JUnitTestCase.assertTrue(_isFunctionDeclaration("C f() => e"));
+    expect(_isFunctionDeclaration("C f() => e"), isTrue);
   }
 
   void test_isFunctionDeclaration_voidReturn_block() {
-    JUnitTestCase.assertTrue(_isFunctionDeclaration("void f() {}"));
+    expect(_isFunctionDeclaration("void f() {}"), isTrue);
   }
 
   void test_isFunctionDeclaration_voidReturn_expression() {
-    JUnitTestCase.assertTrue(_isFunctionDeclaration("void f() => e"));
+    expect(_isFunctionDeclaration("void f() => e"), isTrue);
   }
 
   void test_isFunctionExpression_false_noBody() {
-    JUnitTestCase.assertFalse(_isFunctionExpression("f();"));
+    expect(_isFunctionExpression("f();"), isFalse);
   }
 
   void test_isFunctionExpression_false_notParameters() {
-    JUnitTestCase.assertFalse(_isFunctionExpression("(a + b) {"));
+    expect(_isFunctionExpression("(a + b) {"), isFalse);
   }
 
   void test_isFunctionExpression_noName_block() {
-    JUnitTestCase.assertTrue(_isFunctionExpression("() {}"));
+    expect(_isFunctionExpression("() {}"), isTrue);
   }
 
   void test_isFunctionExpression_noName_expression() {
-    JUnitTestCase.assertTrue(_isFunctionExpression("() => e"));
+    expect(_isFunctionExpression("() => e"), isTrue);
   }
 
   void test_isFunctionExpression_parameter_final() {
-    JUnitTestCase.assertTrue(_isFunctionExpression("(final a) {}"));
-    JUnitTestCase.assertTrue(_isFunctionExpression("(final a, b) {}"));
-    JUnitTestCase.assertTrue(_isFunctionExpression("(final a, final b) {}"));
+    expect(_isFunctionExpression("(final a) {}"), isTrue);
+    expect(_isFunctionExpression("(final a, b) {}"), isTrue);
+    expect(_isFunctionExpression("(final a, final b) {}"), isTrue);
   }
 
   void test_isFunctionExpression_parameter_final_typed() {
-    JUnitTestCase.assertTrue(_isFunctionExpression("(final int a) {}"));
-    JUnitTestCase.assertTrue(_isFunctionExpression("(final prefix.List a) {}"));
-    JUnitTestCase.assertTrue(_isFunctionExpression("(final List<int> a) {}"));
-    JUnitTestCase.assertTrue(_isFunctionExpression("(final prefix.List<int> a) {}"));
+    expect(_isFunctionExpression("(final int a) {}"), isTrue);
+    expect(_isFunctionExpression("(final prefix.List a) {}"), isTrue);
+    expect(_isFunctionExpression("(final List<int> a) {}"), isTrue);
+    expect(_isFunctionExpression("(final prefix.List<int> a) {}"), isTrue);
   }
 
   void test_isFunctionExpression_parameter_multiple() {
-    JUnitTestCase.assertTrue(_isFunctionExpression("(a, b) {}"));
+    expect(_isFunctionExpression("(a, b) {}"), isTrue);
   }
 
   void test_isFunctionExpression_parameter_named() {
-    JUnitTestCase.assertTrue(_isFunctionExpression("({a}) {}"));
+    expect(_isFunctionExpression("({a}) {}"), isTrue);
   }
 
   void test_isFunctionExpression_parameter_optional() {
-    JUnitTestCase.assertTrue(_isFunctionExpression("([a]) {}"));
+    expect(_isFunctionExpression("([a]) {}"), isTrue);
   }
 
   void test_isFunctionExpression_parameter_single() {
-    JUnitTestCase.assertTrue(_isFunctionExpression("(a) {}"));
+    expect(_isFunctionExpression("(a) {}"), isTrue);
   }
 
   void test_isFunctionExpression_parameter_typed() {
-    JUnitTestCase.assertTrue(_isFunctionExpression("(int a, int b) {}"));
+    expect(_isFunctionExpression("(int a, int b) {}"), isTrue);
   }
 
   void test_isInitializedVariableDeclaration_assignment() {
-    JUnitTestCase.assertFalse(_isInitializedVariableDeclaration("a = null;"));
+    expect(_isInitializedVariableDeclaration("a = null;"), isFalse);
   }
 
   void test_isInitializedVariableDeclaration_comparison() {
-    JUnitTestCase.assertFalse(_isInitializedVariableDeclaration("a < 0;"));
+    expect(_isInitializedVariableDeclaration("a < 0;"), isFalse);
   }
 
   void test_isInitializedVariableDeclaration_conditional() {
-    JUnitTestCase.assertFalse(_isInitializedVariableDeclaration("a == null ? init() : update();"));
+    expect(_isInitializedVariableDeclaration("a == null ? init() : update();"), isFalse);
   }
 
   void test_isInitializedVariableDeclaration_const_noType_initialized() {
-    JUnitTestCase.assertTrue(_isInitializedVariableDeclaration("const a = 0;"));
+    expect(_isInitializedVariableDeclaration("const a = 0;"), isTrue);
   }
 
   void test_isInitializedVariableDeclaration_const_noType_uninitialized() {
-    JUnitTestCase.assertTrue(_isInitializedVariableDeclaration("const a;"));
+    expect(_isInitializedVariableDeclaration("const a;"), isTrue);
   }
 
   void test_isInitializedVariableDeclaration_const_simpleType_uninitialized() {
-    JUnitTestCase.assertTrue(_isInitializedVariableDeclaration("const A a;"));
+    expect(_isInitializedVariableDeclaration("const A a;"), isTrue);
   }
 
   void test_isInitializedVariableDeclaration_final_noType_initialized() {
-    JUnitTestCase.assertTrue(_isInitializedVariableDeclaration("final a = 0;"));
+    expect(_isInitializedVariableDeclaration("final a = 0;"), isTrue);
   }
 
   void test_isInitializedVariableDeclaration_final_noType_uninitialized() {
-    JUnitTestCase.assertTrue(_isInitializedVariableDeclaration("final a;"));
+    expect(_isInitializedVariableDeclaration("final a;"), isTrue);
   }
 
   void test_isInitializedVariableDeclaration_final_simpleType_initialized() {
-    JUnitTestCase.assertTrue(_isInitializedVariableDeclaration("final A a = 0;"));
+    expect(_isInitializedVariableDeclaration("final A a = 0;"), isTrue);
   }
 
   void test_isInitializedVariableDeclaration_functionDeclaration_typed() {
-    JUnitTestCase.assertFalse(_isInitializedVariableDeclaration("A f() {};"));
+    expect(_isInitializedVariableDeclaration("A f() {};"), isFalse);
   }
 
   void test_isInitializedVariableDeclaration_functionDeclaration_untyped() {
-    JUnitTestCase.assertFalse(_isInitializedVariableDeclaration("f() {};"));
+    expect(_isInitializedVariableDeclaration("f() {};"), isFalse);
   }
 
   void test_isInitializedVariableDeclaration_noType_initialized() {
-    JUnitTestCase.assertTrue(_isInitializedVariableDeclaration("var a = 0;"));
+    expect(_isInitializedVariableDeclaration("var a = 0;"), isTrue);
   }
 
   void test_isInitializedVariableDeclaration_noType_uninitialized() {
-    JUnitTestCase.assertTrue(_isInitializedVariableDeclaration("var a;"));
+    expect(_isInitializedVariableDeclaration("var a;"), isTrue);
   }
 
   void test_isInitializedVariableDeclaration_parameterizedType_initialized() {
-    JUnitTestCase.assertTrue(_isInitializedVariableDeclaration("List<int> a = null;"));
+    expect(_isInitializedVariableDeclaration("List<int> a = null;"), isTrue);
   }
 
   void test_isInitializedVariableDeclaration_parameterizedType_uninitialized() {
-    JUnitTestCase.assertTrue(_isInitializedVariableDeclaration("List<int> a;"));
+    expect(_isInitializedVariableDeclaration("List<int> a;"), isTrue);
   }
 
   void test_isInitializedVariableDeclaration_simpleType_initialized() {
-    JUnitTestCase.assertTrue(_isInitializedVariableDeclaration("A a = 0;"));
+    expect(_isInitializedVariableDeclaration("A a = 0;"), isTrue);
   }
 
   void test_isInitializedVariableDeclaration_simpleType_uninitialized() {
-    JUnitTestCase.assertTrue(_isInitializedVariableDeclaration("A a;"));
+    expect(_isInitializedVariableDeclaration("A a;"), isTrue);
   }
 
   void test_isSwitchMember_case_labeled() {
-    JUnitTestCase.assertTrue(_isSwitchMember("l1: l2: case"));
+    expect(_isSwitchMember("l1: l2: case"), isTrue);
   }
 
   void test_isSwitchMember_case_unlabeled() {
-    JUnitTestCase.assertTrue(_isSwitchMember("case"));
+    expect(_isSwitchMember("case"), isTrue);
   }
 
   void test_isSwitchMember_default_labeled() {
-    JUnitTestCase.assertTrue(_isSwitchMember("l1: l2: default"));
+    expect(_isSwitchMember("l1: l2: default"), isTrue);
   }
 
   void test_isSwitchMember_default_unlabeled() {
-    JUnitTestCase.assertTrue(_isSwitchMember("default"));
+    expect(_isSwitchMember("default"), isTrue);
   }
 
   void test_isSwitchMember_false() {
-    JUnitTestCase.assertFalse(_isSwitchMember("break;"));
+    expect(_isSwitchMember("break;"), isFalse);
   }
 
   void test_parseAdditiveExpression_normal() {
     BinaryExpression expression = ParserTestCase.parse4("parseAdditiveExpression", "x + y", []);
-    JUnitTestCase.assertNotNull(expression.leftOperand);
-    JUnitTestCase.assertNotNull(expression.operator);
-    JUnitTestCase.assertEquals(TokenType.PLUS, expression.operator.type);
-    JUnitTestCase.assertNotNull(expression.rightOperand);
+    expect(expression.leftOperand, isNotNull);
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.PLUS);
+    expect(expression.rightOperand, isNotNull);
   }
 
   void test_parseAdditiveExpression_super() {
     BinaryExpression expression = ParserTestCase.parse4("parseAdditiveExpression", "super + y", []);
     EngineTestCase.assertInstanceOf((obj) => obj is SuperExpression, SuperExpression, expression.leftOperand);
-    JUnitTestCase.assertNotNull(expression.operator);
-    JUnitTestCase.assertEquals(TokenType.PLUS, expression.operator.type);
-    JUnitTestCase.assertNotNull(expression.rightOperand);
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.PLUS);
+    expect(expression.rightOperand, isNotNull);
   }
 
   void test_parseAnnotation_n1() {
     Annotation annotation = ParserTestCase.parse4("parseAnnotation", "@A", []);
-    JUnitTestCase.assertNotNull(annotation.atSign);
-    JUnitTestCase.assertNotNull(annotation.name);
-    JUnitTestCase.assertNull(annotation.period);
-    JUnitTestCase.assertNull(annotation.constructorName);
-    JUnitTestCase.assertNull(annotation.arguments);
+    expect(annotation.atSign, isNotNull);
+    expect(annotation.name, isNotNull);
+    expect(annotation.period, isNull);
+    expect(annotation.constructorName, isNull);
+    expect(annotation.arguments, isNull);
   }
 
   void test_parseAnnotation_n1_a() {
     Annotation annotation = ParserTestCase.parse4("parseAnnotation", "@A(x,y)", []);
-    JUnitTestCase.assertNotNull(annotation.atSign);
-    JUnitTestCase.assertNotNull(annotation.name);
-    JUnitTestCase.assertNull(annotation.period);
-    JUnitTestCase.assertNull(annotation.constructorName);
-    JUnitTestCase.assertNotNull(annotation.arguments);
+    expect(annotation.atSign, isNotNull);
+    expect(annotation.name, isNotNull);
+    expect(annotation.period, isNull);
+    expect(annotation.constructorName, isNull);
+    expect(annotation.arguments, isNotNull);
   }
 
   void test_parseAnnotation_n2() {
     Annotation annotation = ParserTestCase.parse4("parseAnnotation", "@A.B", []);
-    JUnitTestCase.assertNotNull(annotation.atSign);
-    JUnitTestCase.assertNotNull(annotation.name);
-    JUnitTestCase.assertNull(annotation.period);
-    JUnitTestCase.assertNull(annotation.constructorName);
-    JUnitTestCase.assertNull(annotation.arguments);
+    expect(annotation.atSign, isNotNull);
+    expect(annotation.name, isNotNull);
+    expect(annotation.period, isNull);
+    expect(annotation.constructorName, isNull);
+    expect(annotation.arguments, isNull);
   }
 
   void test_parseAnnotation_n2_a() {
     Annotation annotation = ParserTestCase.parse4("parseAnnotation", "@A.B(x,y)", []);
-    JUnitTestCase.assertNotNull(annotation.atSign);
-    JUnitTestCase.assertNotNull(annotation.name);
-    JUnitTestCase.assertNull(annotation.period);
-    JUnitTestCase.assertNull(annotation.constructorName);
-    JUnitTestCase.assertNotNull(annotation.arguments);
+    expect(annotation.atSign, isNotNull);
+    expect(annotation.name, isNotNull);
+    expect(annotation.period, isNull);
+    expect(annotation.constructorName, isNull);
+    expect(annotation.arguments, isNotNull);
   }
 
   void test_parseAnnotation_n3() {
     Annotation annotation = ParserTestCase.parse4("parseAnnotation", "@A.B.C", []);
-    JUnitTestCase.assertNotNull(annotation.atSign);
-    JUnitTestCase.assertNotNull(annotation.name);
-    JUnitTestCase.assertNotNull(annotation.period);
-    JUnitTestCase.assertNotNull(annotation.constructorName);
-    JUnitTestCase.assertNull(annotation.arguments);
+    expect(annotation.atSign, isNotNull);
+    expect(annotation.name, isNotNull);
+    expect(annotation.period, isNotNull);
+    expect(annotation.constructorName, isNotNull);
+    expect(annotation.arguments, isNull);
   }
 
   void test_parseAnnotation_n3_a() {
     Annotation annotation = ParserTestCase.parse4("parseAnnotation", "@A.B.C(x,y)", []);
-    JUnitTestCase.assertNotNull(annotation.atSign);
-    JUnitTestCase.assertNotNull(annotation.name);
-    JUnitTestCase.assertNotNull(annotation.period);
-    JUnitTestCase.assertNotNull(annotation.constructorName);
-    JUnitTestCase.assertNotNull(annotation.arguments);
+    expect(annotation.atSign, isNotNull);
+    expect(annotation.name, isNotNull);
+    expect(annotation.period, isNotNull);
+    expect(annotation.constructorName, isNotNull);
+    expect(annotation.arguments, isNotNull);
   }
 
   void test_parseArgument_named() {
     NamedExpression expression = ParserTestCase.parse4("parseArgument", "n: x", []);
     Label name = expression.name;
-    JUnitTestCase.assertNotNull(name);
-    JUnitTestCase.assertNotNull(name.label);
-    JUnitTestCase.assertNotNull(name.colon);
-    JUnitTestCase.assertNotNull(expression.expression);
+    expect(name, isNotNull);
+    expect(name.label, isNotNull);
+    expect(name.colon, isNotNull);
+    expect(expression.expression, isNotNull);
   }
 
   void test_parseArgument_unnamed() {
     String lexeme = "x";
     SimpleIdentifier identifier = ParserTestCase.parse4("parseArgument", lexeme, []);
-    JUnitTestCase.assertEquals(lexeme, identifier.name);
+    expect(identifier.name, lexeme);
   }
 
   void test_parseArgumentList_empty() {
     ArgumentList argumentList = ParserTestCase.parse4("parseArgumentList", "()", []);
     NodeList<Expression> arguments = argumentList.arguments;
-    EngineTestCase.assertSizeOfList(0, arguments);
+    expect(arguments, hasLength(0));
   }
 
   void test_parseArgumentList_mixed() {
     ArgumentList argumentList = ParserTestCase.parse4("parseArgumentList", "(w, x, y: y, z: z)", []);
     NodeList<Expression> arguments = argumentList.arguments;
-    EngineTestCase.assertSizeOfList(4, arguments);
+    expect(arguments, hasLength(4));
   }
 
   void test_parseArgumentList_noNamed() {
     ArgumentList argumentList = ParserTestCase.parse4("parseArgumentList", "(x, y, z)", []);
     NodeList<Expression> arguments = argumentList.arguments;
-    EngineTestCase.assertSizeOfList(3, arguments);
+    expect(arguments, hasLength(3));
   }
 
   void test_parseArgumentList_onlyNamed() {
     ArgumentList argumentList = ParserTestCase.parse4("parseArgumentList", "(x: x, y: y)", []);
     NodeList<Expression> arguments = argumentList.arguments;
-    EngineTestCase.assertSizeOfList(2, arguments);
+    expect(arguments, hasLength(2));
   }
 
   void test_parseAssertStatement() {
     AssertStatement statement = ParserTestCase.parse4("parseAssertStatement", "assert (x);", []);
-    JUnitTestCase.assertNotNull(statement.keyword);
-    JUnitTestCase.assertNotNull(statement.leftParenthesis);
-    JUnitTestCase.assertNotNull(statement.condition);
-    JUnitTestCase.assertNotNull(statement.rightParenthesis);
-    JUnitTestCase.assertNotNull(statement.semicolon);
+    expect(statement.keyword, isNotNull);
+    expect(statement.leftParenthesis, isNotNull);
+    expect(statement.condition, isNotNull);
+    expect(statement.rightParenthesis, isNotNull);
+    expect(statement.semicolon, isNotNull);
   }
 
   void test_parseAssignableExpression_expression_args_dot() {
     PropertyAccess propertyAccess = ParserTestCase.parse("parseAssignableExpression", <Object> [false], "(x)(y).z");
     FunctionExpressionInvocation invocation = propertyAccess.target as FunctionExpressionInvocation;
-    JUnitTestCase.assertNotNull(invocation.function);
+    expect(invocation.function, isNotNull);
     ArgumentList argumentList = invocation.argumentList;
-    JUnitTestCase.assertNotNull(argumentList);
-    EngineTestCase.assertSizeOfList(1, argumentList.arguments);
-    JUnitTestCase.assertNotNull(propertyAccess.operator);
-    JUnitTestCase.assertNotNull(propertyAccess.propertyName);
+    expect(argumentList, isNotNull);
+    expect(argumentList.arguments, hasLength(1));
+    expect(propertyAccess.operator, isNotNull);
+    expect(propertyAccess.propertyName, isNotNull);
   }
 
   void test_parseAssignableExpression_expression_dot() {
     PropertyAccess propertyAccess = ParserTestCase.parse("parseAssignableExpression", <Object> [false], "(x).y");
-    JUnitTestCase.assertNotNull(propertyAccess.target);
-    JUnitTestCase.assertNotNull(propertyAccess.operator);
-    JUnitTestCase.assertNotNull(propertyAccess.propertyName);
+    expect(propertyAccess.target, isNotNull);
+    expect(propertyAccess.operator, isNotNull);
+    expect(propertyAccess.propertyName, isNotNull);
   }
 
   void test_parseAssignableExpression_expression_index() {
     IndexExpression expression = ParserTestCase.parse("parseAssignableExpression", <Object> [false], "(x)[y]");
-    JUnitTestCase.assertNotNull(expression.target);
-    JUnitTestCase.assertNotNull(expression.leftBracket);
-    JUnitTestCase.assertNotNull(expression.index);
-    JUnitTestCase.assertNotNull(expression.rightBracket);
+    expect(expression.target, isNotNull);
+    expect(expression.leftBracket, isNotNull);
+    expect(expression.index, isNotNull);
+    expect(expression.rightBracket, isNotNull);
   }
 
   void test_parseAssignableExpression_identifier() {
     SimpleIdentifier identifier = ParserTestCase.parse("parseAssignableExpression", <Object> [false], "x");
-    JUnitTestCase.assertNotNull(identifier);
+    expect(identifier, isNotNull);
   }
 
   void test_parseAssignableExpression_identifier_args_dot() {
     PropertyAccess propertyAccess = ParserTestCase.parse("parseAssignableExpression", <Object> [false], "x(y).z");
     MethodInvocation invocation = propertyAccess.target as MethodInvocation;
-    JUnitTestCase.assertEquals("x", invocation.methodName.name);
+    expect(invocation.methodName.name, "x");
     ArgumentList argumentList = invocation.argumentList;
-    JUnitTestCase.assertNotNull(argumentList);
-    EngineTestCase.assertSizeOfList(1, argumentList.arguments);
-    JUnitTestCase.assertNotNull(propertyAccess.operator);
-    JUnitTestCase.assertNotNull(propertyAccess.propertyName);
+    expect(argumentList, isNotNull);
+    expect(argumentList.arguments, hasLength(1));
+    expect(propertyAccess.operator, isNotNull);
+    expect(propertyAccess.propertyName, isNotNull);
   }
 
   void test_parseAssignableExpression_identifier_dot() {
     PropertyAccess propertyAccess = ParserTestCase.parse("parseAssignableExpression", <Object> [false], "x.y");
-    JUnitTestCase.assertNotNull(propertyAccess.target);
-    JUnitTestCase.assertNotNull(propertyAccess.operator);
-    JUnitTestCase.assertNotNull(propertyAccess.propertyName);
+    expect(propertyAccess.target, isNotNull);
+    expect(propertyAccess.operator, isNotNull);
+    expect(propertyAccess.propertyName, isNotNull);
   }
 
   void test_parseAssignableExpression_identifier_index() {
     IndexExpression expression = ParserTestCase.parse("parseAssignableExpression", <Object> [false], "x[y]");
-    JUnitTestCase.assertNotNull(expression.target);
-    JUnitTestCase.assertNotNull(expression.leftBracket);
-    JUnitTestCase.assertNotNull(expression.index);
-    JUnitTestCase.assertNotNull(expression.rightBracket);
+    expect(expression.target, isNotNull);
+    expect(expression.leftBracket, isNotNull);
+    expect(expression.index, isNotNull);
+    expect(expression.rightBracket, isNotNull);
   }
 
   void test_parseAssignableExpression_super_dot() {
     PropertyAccess propertyAccess = ParserTestCase.parse("parseAssignableExpression", <Object> [false], "super.y");
     EngineTestCase.assertInstanceOf((obj) => obj is SuperExpression, SuperExpression, propertyAccess.target);
-    JUnitTestCase.assertNotNull(propertyAccess.operator);
-    JUnitTestCase.assertNotNull(propertyAccess.propertyName);
+    expect(propertyAccess.operator, isNotNull);
+    expect(propertyAccess.propertyName, isNotNull);
   }
 
   void test_parseAssignableExpression_super_index() {
     IndexExpression expression = ParserTestCase.parse("parseAssignableExpression", <Object> [false], "super[y]");
     EngineTestCase.assertInstanceOf((obj) => obj is SuperExpression, SuperExpression, expression.target);
-    JUnitTestCase.assertNotNull(expression.leftBracket);
-    JUnitTestCase.assertNotNull(expression.index);
-    JUnitTestCase.assertNotNull(expression.rightBracket);
+    expect(expression.leftBracket, isNotNull);
+    expect(expression.index, isNotNull);
+    expect(expression.rightBracket, isNotNull);
   }
 
   void test_parseAssignableSelector_dot() {
     PropertyAccess selector = ParserTestCase.parse("parseAssignableSelector", <Object> [null, true], ".x");
-    JUnitTestCase.assertNotNull(selector.operator);
-    JUnitTestCase.assertNotNull(selector.propertyName);
+    expect(selector.operator, isNotNull);
+    expect(selector.propertyName, isNotNull);
   }
 
   void test_parseAssignableSelector_index() {
     IndexExpression selector = ParserTestCase.parse("parseAssignableSelector", <Object> [null, true], "[x]");
-    JUnitTestCase.assertNotNull(selector.leftBracket);
-    JUnitTestCase.assertNotNull(selector.index);
-    JUnitTestCase.assertNotNull(selector.rightBracket);
+    expect(selector.leftBracket, isNotNull);
+    expect(selector.index, isNotNull);
+    expect(selector.rightBracket, isNotNull);
   }
 
   void test_parseAssignableSelector_none() {
     SimpleIdentifier selector = ParserTestCase.parse("parseAssignableSelector", <Object> [new SimpleIdentifier(null), true], ";");
-    JUnitTestCase.assertNotNull(selector);
+    expect(selector, isNotNull);
   }
 
   void test_parseAwaitExpression() {
     AwaitExpression expression = ParserTestCase.parse4("parseAwaitExpression", "await x;", []);
-    JUnitTestCase.assertNotNull(expression.awaitKeyword);
-    JUnitTestCase.assertNotNull(expression.expression);
+    expect(expression.awaitKeyword, isNotNull);
+    expect(expression.expression, isNotNull);
   }
 
   void test_parseAwaitExpression_asStatement_inAsync() {
-    MethodDeclaration method = ParserTestCase.parse("parseClassMember", <Object> ["C"], EngineTestCase.createSource(["m() async { await x; }"]));
+    MethodDeclaration method = ParserTestCase.parse("parseClassMember", <Object> ["C"], "m() async { await x; }");
     FunctionBody body = method.body;
     EngineTestCase.assertInstanceOf((obj) => obj is BlockFunctionBody, BlockFunctionBody, body);
     Statement statement = (body as BlockFunctionBody).block.statements[0];
     EngineTestCase.assertInstanceOf((obj) => obj is ExpressionStatement, ExpressionStatement, statement);
     Expression expression = (statement as ExpressionStatement).expression;
     EngineTestCase.assertInstanceOf((obj) => obj is AwaitExpression, AwaitExpression, expression);
-    JUnitTestCase.assertNotNull((expression as AwaitExpression).awaitKeyword);
-    JUnitTestCase.assertNotNull((expression as AwaitExpression).expression);
+    expect((expression as AwaitExpression).awaitKeyword, isNotNull);
+    expect((expression as AwaitExpression).expression, isNotNull);
   }
 
   void test_parseAwaitExpression_asStatement_inSync() {
-    MethodDeclaration method = ParserTestCase.parse("parseClassMember", <Object> ["C"], EngineTestCase.createSource(["m() { await x; }"]));
+    MethodDeclaration method = ParserTestCase.parse("parseClassMember", <Object> ["C"], "m() { await x; }");
     FunctionBody body = method.body;
     EngineTestCase.assertInstanceOf((obj) => obj is BlockFunctionBody, BlockFunctionBody, body);
     Statement statement = (body as BlockFunctionBody).block.statements[0];
@@ -3923,7 +3936,7 @@
   }
 
   void test_parseAwaitExpression_inSync() {
-    MethodDeclaration method = ParserTestCase.parse("parseClassMember", <Object> ["C"], EngineTestCase.createSource(["m() { return await x + await y; }"]));
+    MethodDeclaration method = ParserTestCase.parse("parseClassMember", <Object> ["C"], "m() { return await x + await y; }");
     FunctionBody body = method.body;
     EngineTestCase.assertInstanceOf((obj) => obj is BlockFunctionBody, BlockFunctionBody, body);
     Statement statement = (body as BlockFunctionBody).block.statements[0];
@@ -3936,870 +3949,873 @@
 
   void test_parseBitwiseAndExpression_normal() {
     BinaryExpression expression = ParserTestCase.parse4("parseBitwiseAndExpression", "x & y", []);
-    JUnitTestCase.assertNotNull(expression.leftOperand);
-    JUnitTestCase.assertNotNull(expression.operator);
-    JUnitTestCase.assertEquals(TokenType.AMPERSAND, expression.operator.type);
-    JUnitTestCase.assertNotNull(expression.rightOperand);
+    expect(expression.leftOperand, isNotNull);
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.AMPERSAND);
+    expect(expression.rightOperand, isNotNull);
   }
 
   void test_parseBitwiseAndExpression_super() {
     BinaryExpression expression = ParserTestCase.parse4("parseBitwiseAndExpression", "super & y", []);
     EngineTestCase.assertInstanceOf((obj) => obj is SuperExpression, SuperExpression, expression.leftOperand);
-    JUnitTestCase.assertNotNull(expression.operator);
-    JUnitTestCase.assertEquals(TokenType.AMPERSAND, expression.operator.type);
-    JUnitTestCase.assertNotNull(expression.rightOperand);
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.AMPERSAND);
+    expect(expression.rightOperand, isNotNull);
   }
 
   void test_parseBitwiseOrExpression_normal() {
     BinaryExpression expression = ParserTestCase.parse4("parseBitwiseOrExpression", "x | y", []);
-    JUnitTestCase.assertNotNull(expression.leftOperand);
-    JUnitTestCase.assertNotNull(expression.operator);
-    JUnitTestCase.assertEquals(TokenType.BAR, expression.operator.type);
-    JUnitTestCase.assertNotNull(expression.rightOperand);
+    expect(expression.leftOperand, isNotNull);
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.BAR);
+    expect(expression.rightOperand, isNotNull);
   }
 
   void test_parseBitwiseOrExpression_super() {
     BinaryExpression expression = ParserTestCase.parse4("parseBitwiseOrExpression", "super | y", []);
     EngineTestCase.assertInstanceOf((obj) => obj is SuperExpression, SuperExpression, expression.leftOperand);
-    JUnitTestCase.assertNotNull(expression.operator);
-    JUnitTestCase.assertEquals(TokenType.BAR, expression.operator.type);
-    JUnitTestCase.assertNotNull(expression.rightOperand);
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.BAR);
+    expect(expression.rightOperand, isNotNull);
   }
 
   void test_parseBitwiseXorExpression_normal() {
     BinaryExpression expression = ParserTestCase.parse4("parseBitwiseXorExpression", "x ^ y", []);
-    JUnitTestCase.assertNotNull(expression.leftOperand);
-    JUnitTestCase.assertNotNull(expression.operator);
-    JUnitTestCase.assertEquals(TokenType.CARET, expression.operator.type);
-    JUnitTestCase.assertNotNull(expression.rightOperand);
+    expect(expression.leftOperand, isNotNull);
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.CARET);
+    expect(expression.rightOperand, isNotNull);
   }
 
   void test_parseBitwiseXorExpression_super() {
     BinaryExpression expression = ParserTestCase.parse4("parseBitwiseXorExpression", "super ^ y", []);
     EngineTestCase.assertInstanceOf((obj) => obj is SuperExpression, SuperExpression, expression.leftOperand);
-    JUnitTestCase.assertNotNull(expression.operator);
-    JUnitTestCase.assertEquals(TokenType.CARET, expression.operator.type);
-    JUnitTestCase.assertNotNull(expression.rightOperand);
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.CARET);
+    expect(expression.rightOperand, isNotNull);
   }
 
   void test_parseBlock_empty() {
     Block block = ParserTestCase.parse4("parseBlock", "{}", []);
-    JUnitTestCase.assertNotNull(block.leftBracket);
-    EngineTestCase.assertSizeOfList(0, block.statements);
-    JUnitTestCase.assertNotNull(block.rightBracket);
+    expect(block.leftBracket, isNotNull);
+    expect(block.statements, hasLength(0));
+    expect(block.rightBracket, isNotNull);
   }
 
   void test_parseBlock_nonEmpty() {
     Block block = ParserTestCase.parse4("parseBlock", "{;}", []);
-    JUnitTestCase.assertNotNull(block.leftBracket);
-    EngineTestCase.assertSizeOfList(1, block.statements);
-    JUnitTestCase.assertNotNull(block.rightBracket);
+    expect(block.leftBracket, isNotNull);
+    expect(block.statements, hasLength(1));
+    expect(block.rightBracket, isNotNull);
   }
 
   void test_parseBreakStatement_label() {
     BreakStatement statement = ParserTestCase.parse4("parseBreakStatement", "break foo;", []);
-    JUnitTestCase.assertNotNull(statement.keyword);
-    JUnitTestCase.assertNotNull(statement.label);
-    JUnitTestCase.assertNotNull(statement.semicolon);
+    expect(statement.keyword, isNotNull);
+    expect(statement.label, isNotNull);
+    expect(statement.semicolon, isNotNull);
   }
 
   void test_parseBreakStatement_noLabel() {
     BreakStatement statement = ParserTestCase.parse4("parseBreakStatement", "break;", [ParserErrorCode.BREAK_OUTSIDE_OF_LOOP]);
-    JUnitTestCase.assertNotNull(statement.keyword);
-    JUnitTestCase.assertNull(statement.label);
-    JUnitTestCase.assertNotNull(statement.semicolon);
+    expect(statement.keyword, isNotNull);
+    expect(statement.label, isNull);
+    expect(statement.semicolon, isNotNull);
   }
 
   void test_parseCascadeSection_i() {
     IndexExpression section = ParserTestCase.parse4("parseCascadeSection", "..[i]", []);
-    JUnitTestCase.assertNull(section.target);
-    JUnitTestCase.assertNotNull(section.leftBracket);
-    JUnitTestCase.assertNotNull(section.index);
-    JUnitTestCase.assertNotNull(section.rightBracket);
+    expect(section.target, isNull);
+    expect(section.leftBracket, isNotNull);
+    expect(section.index, isNotNull);
+    expect(section.rightBracket, isNotNull);
   }
 
   void test_parseCascadeSection_ia() {
     FunctionExpressionInvocation section = ParserTestCase.parse4("parseCascadeSection", "..[i](b)", []);
     EngineTestCase.assertInstanceOf((obj) => obj is IndexExpression, IndexExpression, section.function);
-    JUnitTestCase.assertNotNull(section.argumentList);
+    expect(section.argumentList, isNotNull);
   }
 
   void test_parseCascadeSection_ii() {
     MethodInvocation section = ParserTestCase.parse4("parseCascadeSection", "..a(b).c(d)", []);
     EngineTestCase.assertInstanceOf((obj) => obj is MethodInvocation, MethodInvocation, section.target);
-    JUnitTestCase.assertNotNull(section.period);
-    JUnitTestCase.assertNotNull(section.methodName);
-    JUnitTestCase.assertNotNull(section.argumentList);
-    EngineTestCase.assertSizeOfList(1, section.argumentList.arguments);
+    expect(section.period, isNotNull);
+    expect(section.methodName, isNotNull);
+    expect(section.argumentList, isNotNull);
+    expect(section.argumentList.arguments, hasLength(1));
   }
 
   void test_parseCascadeSection_p() {
     PropertyAccess section = ParserTestCase.parse4("parseCascadeSection", "..a", []);
-    JUnitTestCase.assertNull(section.target);
-    JUnitTestCase.assertNotNull(section.operator);
-    JUnitTestCase.assertNotNull(section.propertyName);
+    expect(section.target, isNull);
+    expect(section.operator, isNotNull);
+    expect(section.propertyName, isNotNull);
   }
 
   void test_parseCascadeSection_p_assign() {
     AssignmentExpression section = ParserTestCase.parse4("parseCascadeSection", "..a = 3", []);
-    JUnitTestCase.assertNotNull(section.leftHandSide);
-    JUnitTestCase.assertNotNull(section.operator);
+    expect(section.leftHandSide, isNotNull);
+    expect(section.operator, isNotNull);
     Expression rhs = section.rightHandSide;
-    JUnitTestCase.assertNotNull(rhs);
+    expect(rhs, isNotNull);
   }
 
   void test_parseCascadeSection_p_assign_withCascade() {
     AssignmentExpression section = ParserTestCase.parse4("parseCascadeSection", "..a = 3..m()", []);
-    JUnitTestCase.assertNotNull(section.leftHandSide);
-    JUnitTestCase.assertNotNull(section.operator);
+    expect(section.leftHandSide, isNotNull);
+    expect(section.operator, isNotNull);
     Expression rhs = section.rightHandSide;
     EngineTestCase.assertInstanceOf((obj) => obj is IntegerLiteral, IntegerLiteral, rhs);
   }
 
   void test_parseCascadeSection_p_builtIn() {
     PropertyAccess section = ParserTestCase.parse4("parseCascadeSection", "..as", []);
-    JUnitTestCase.assertNull(section.target);
-    JUnitTestCase.assertNotNull(section.operator);
-    JUnitTestCase.assertNotNull(section.propertyName);
+    expect(section.target, isNull);
+    expect(section.operator, isNotNull);
+    expect(section.propertyName, isNotNull);
   }
 
   void test_parseCascadeSection_pa() {
     MethodInvocation section = ParserTestCase.parse4("parseCascadeSection", "..a(b)", []);
-    JUnitTestCase.assertNull(section.target);
-    JUnitTestCase.assertNotNull(section.period);
-    JUnitTestCase.assertNotNull(section.methodName);
-    JUnitTestCase.assertNotNull(section.argumentList);
-    EngineTestCase.assertSizeOfList(1, section.argumentList.arguments);
+    expect(section.target, isNull);
+    expect(section.period, isNotNull);
+    expect(section.methodName, isNotNull);
+    expect(section.argumentList, isNotNull);
+    expect(section.argumentList.arguments, hasLength(1));
   }
 
   void test_parseCascadeSection_paa() {
     FunctionExpressionInvocation section = ParserTestCase.parse4("parseCascadeSection", "..a(b)(c)", []);
     EngineTestCase.assertInstanceOf((obj) => obj is MethodInvocation, MethodInvocation, section.function);
-    JUnitTestCase.assertNotNull(section.argumentList);
-    EngineTestCase.assertSizeOfList(1, section.argumentList.arguments);
+    expect(section.argumentList, isNotNull);
+    expect(section.argumentList.arguments, hasLength(1));
   }
 
   void test_parseCascadeSection_paapaa() {
     FunctionExpressionInvocation section = ParserTestCase.parse4("parseCascadeSection", "..a(b)(c).d(e)(f)", []);
     EngineTestCase.assertInstanceOf((obj) => obj is MethodInvocation, MethodInvocation, section.function);
-    JUnitTestCase.assertNotNull(section.argumentList);
-    EngineTestCase.assertSizeOfList(1, section.argumentList.arguments);
+    expect(section.argumentList, isNotNull);
+    expect(section.argumentList.arguments, hasLength(1));
   }
 
   void test_parseCascadeSection_pap() {
     PropertyAccess section = ParserTestCase.parse4("parseCascadeSection", "..a(b).c", []);
-    JUnitTestCase.assertNotNull(section.target);
-    JUnitTestCase.assertNotNull(section.operator);
-    JUnitTestCase.assertNotNull(section.propertyName);
+    expect(section.target, isNotNull);
+    expect(section.operator, isNotNull);
+    expect(section.propertyName, isNotNull);
   }
 
   void test_parseClassDeclaration_abstract() {
     ClassDeclaration declaration = ParserTestCase.parse("parseClassDeclaration", <Object> [
         emptyCommentAndMetadata(),
         TokenFactory.tokenFromKeyword(Keyword.ABSTRACT)], "class A {}");
-    JUnitTestCase.assertNull(declaration.documentationComment);
-    JUnitTestCase.assertNotNull(declaration.abstractKeyword);
-    JUnitTestCase.assertNull(declaration.extendsClause);
-    JUnitTestCase.assertNull(declaration.implementsClause);
-    JUnitTestCase.assertNotNull(declaration.classKeyword);
-    JUnitTestCase.assertNotNull(declaration.leftBracket);
-    JUnitTestCase.assertNotNull(declaration.name);
-    EngineTestCase.assertSizeOfList(0, declaration.members);
-    JUnitTestCase.assertNotNull(declaration.rightBracket);
-    JUnitTestCase.assertNull(declaration.typeParameters);
+    expect(declaration.documentationComment, isNull);
+    expect(declaration.abstractKeyword, isNotNull);
+    expect(declaration.extendsClause, isNull);
+    expect(declaration.implementsClause, isNull);
+    expect(declaration.classKeyword, isNotNull);
+    expect(declaration.leftBracket, isNotNull);
+    expect(declaration.name, isNotNull);
+    expect(declaration.members, hasLength(0));
+    expect(declaration.rightBracket, isNotNull);
+    expect(declaration.typeParameters, isNull);
   }
 
   void test_parseClassDeclaration_empty() {
     ClassDeclaration declaration = ParserTestCase.parse("parseClassDeclaration", <Object> [emptyCommentAndMetadata(), null], "class A {}");
-    JUnitTestCase.assertNull(declaration.documentationComment);
-    JUnitTestCase.assertNull(declaration.abstractKeyword);
-    JUnitTestCase.assertNull(declaration.extendsClause);
-    JUnitTestCase.assertNull(declaration.implementsClause);
-    JUnitTestCase.assertNotNull(declaration.classKeyword);
-    JUnitTestCase.assertNotNull(declaration.leftBracket);
-    JUnitTestCase.assertNotNull(declaration.name);
-    EngineTestCase.assertSizeOfList(0, declaration.members);
-    JUnitTestCase.assertNotNull(declaration.rightBracket);
-    JUnitTestCase.assertNull(declaration.typeParameters);
+    expect(declaration.documentationComment, isNull);
+    expect(declaration.abstractKeyword, isNull);
+    expect(declaration.extendsClause, isNull);
+    expect(declaration.implementsClause, isNull);
+    expect(declaration.classKeyword, isNotNull);
+    expect(declaration.leftBracket, isNotNull);
+    expect(declaration.name, isNotNull);
+    expect(declaration.members, hasLength(0));
+    expect(declaration.rightBracket, isNotNull);
+    expect(declaration.typeParameters, isNull);
   }
 
   void test_parseClassDeclaration_extends() {
     ClassDeclaration declaration = ParserTestCase.parse("parseClassDeclaration", <Object> [emptyCommentAndMetadata(), null], "class A extends B {}");
-    JUnitTestCase.assertNull(declaration.documentationComment);
-    JUnitTestCase.assertNull(declaration.abstractKeyword);
-    JUnitTestCase.assertNotNull(declaration.extendsClause);
-    JUnitTestCase.assertNull(declaration.implementsClause);
-    JUnitTestCase.assertNotNull(declaration.classKeyword);
-    JUnitTestCase.assertNotNull(declaration.leftBracket);
-    JUnitTestCase.assertNotNull(declaration.name);
-    EngineTestCase.assertSizeOfList(0, declaration.members);
-    JUnitTestCase.assertNotNull(declaration.rightBracket);
-    JUnitTestCase.assertNull(declaration.typeParameters);
+    expect(declaration.documentationComment, isNull);
+    expect(declaration.abstractKeyword, isNull);
+    expect(declaration.extendsClause, isNotNull);
+    expect(declaration.implementsClause, isNull);
+    expect(declaration.classKeyword, isNotNull);
+    expect(declaration.leftBracket, isNotNull);
+    expect(declaration.name, isNotNull);
+    expect(declaration.members, hasLength(0));
+    expect(declaration.rightBracket, isNotNull);
+    expect(declaration.typeParameters, isNull);
   }
 
   void test_parseClassDeclaration_extendsAndImplements() {
     ClassDeclaration declaration = ParserTestCase.parse("parseClassDeclaration", <Object> [emptyCommentAndMetadata(), null], "class A extends B implements C {}");
-    JUnitTestCase.assertNull(declaration.documentationComment);
-    JUnitTestCase.assertNull(declaration.abstractKeyword);
-    JUnitTestCase.assertNotNull(declaration.extendsClause);
-    JUnitTestCase.assertNotNull(declaration.implementsClause);
-    JUnitTestCase.assertNotNull(declaration.classKeyword);
-    JUnitTestCase.assertNotNull(declaration.leftBracket);
-    JUnitTestCase.assertNotNull(declaration.name);
-    EngineTestCase.assertSizeOfList(0, declaration.members);
-    JUnitTestCase.assertNotNull(declaration.rightBracket);
-    JUnitTestCase.assertNull(declaration.typeParameters);
+    expect(declaration.documentationComment, isNull);
+    expect(declaration.abstractKeyword, isNull);
+    expect(declaration.extendsClause, isNotNull);
+    expect(declaration.implementsClause, isNotNull);
+    expect(declaration.classKeyword, isNotNull);
+    expect(declaration.leftBracket, isNotNull);
+    expect(declaration.name, isNotNull);
+    expect(declaration.members, hasLength(0));
+    expect(declaration.rightBracket, isNotNull);
+    expect(declaration.typeParameters, isNull);
   }
 
   void test_parseClassDeclaration_extendsAndWith() {
     ClassDeclaration declaration = ParserTestCase.parse("parseClassDeclaration", <Object> [emptyCommentAndMetadata(), null], "class A extends B with C {}");
-    JUnitTestCase.assertNull(declaration.documentationComment);
-    JUnitTestCase.assertNull(declaration.abstractKeyword);
-    JUnitTestCase.assertNotNull(declaration.classKeyword);
-    JUnitTestCase.assertNotNull(declaration.name);
-    JUnitTestCase.assertNull(declaration.typeParameters);
-    JUnitTestCase.assertNotNull(declaration.extendsClause);
-    JUnitTestCase.assertNotNull(declaration.withClause);
-    JUnitTestCase.assertNull(declaration.implementsClause);
-    JUnitTestCase.assertNotNull(declaration.leftBracket);
-    EngineTestCase.assertSizeOfList(0, declaration.members);
-    JUnitTestCase.assertNotNull(declaration.rightBracket);
+    expect(declaration.documentationComment, isNull);
+    expect(declaration.abstractKeyword, isNull);
+    expect(declaration.classKeyword, isNotNull);
+    expect(declaration.name, isNotNull);
+    expect(declaration.typeParameters, isNull);
+    expect(declaration.extendsClause, isNotNull);
+    expect(declaration.withClause, isNotNull);
+    expect(declaration.implementsClause, isNull);
+    expect(declaration.leftBracket, isNotNull);
+    expect(declaration.members, hasLength(0));
+    expect(declaration.rightBracket, isNotNull);
   }
 
   void test_parseClassDeclaration_extendsAndWithAndImplements() {
     ClassDeclaration declaration = ParserTestCase.parse("parseClassDeclaration", <Object> [emptyCommentAndMetadata(), null], "class A extends B with C implements D {}");
-    JUnitTestCase.assertNull(declaration.documentationComment);
-    JUnitTestCase.assertNull(declaration.abstractKeyword);
-    JUnitTestCase.assertNotNull(declaration.classKeyword);
-    JUnitTestCase.assertNotNull(declaration.name);
-    JUnitTestCase.assertNull(declaration.typeParameters);
-    JUnitTestCase.assertNotNull(declaration.extendsClause);
-    JUnitTestCase.assertNotNull(declaration.withClause);
-    JUnitTestCase.assertNotNull(declaration.implementsClause);
-    JUnitTestCase.assertNotNull(declaration.leftBracket);
-    EngineTestCase.assertSizeOfList(0, declaration.members);
-    JUnitTestCase.assertNotNull(declaration.rightBracket);
+    expect(declaration.documentationComment, isNull);
+    expect(declaration.abstractKeyword, isNull);
+    expect(declaration.classKeyword, isNotNull);
+    expect(declaration.name, isNotNull);
+    expect(declaration.typeParameters, isNull);
+    expect(declaration.extendsClause, isNotNull);
+    expect(declaration.withClause, isNotNull);
+    expect(declaration.implementsClause, isNotNull);
+    expect(declaration.leftBracket, isNotNull);
+    expect(declaration.members, hasLength(0));
+    expect(declaration.rightBracket, isNotNull);
   }
 
   void test_parseClassDeclaration_implements() {
     ClassDeclaration declaration = ParserTestCase.parse("parseClassDeclaration", <Object> [emptyCommentAndMetadata(), null], "class A implements C {}");
-    JUnitTestCase.assertNull(declaration.documentationComment);
-    JUnitTestCase.assertNull(declaration.abstractKeyword);
-    JUnitTestCase.assertNull(declaration.extendsClause);
-    JUnitTestCase.assertNotNull(declaration.implementsClause);
-    JUnitTestCase.assertNotNull(declaration.classKeyword);
-    JUnitTestCase.assertNotNull(declaration.leftBracket);
-    JUnitTestCase.assertNotNull(declaration.name);
-    EngineTestCase.assertSizeOfList(0, declaration.members);
-    JUnitTestCase.assertNotNull(declaration.rightBracket);
-    JUnitTestCase.assertNull(declaration.typeParameters);
+    expect(declaration.documentationComment, isNull);
+    expect(declaration.abstractKeyword, isNull);
+    expect(declaration.extendsClause, isNull);
+    expect(declaration.implementsClause, isNotNull);
+    expect(declaration.classKeyword, isNotNull);
+    expect(declaration.leftBracket, isNotNull);
+    expect(declaration.name, isNotNull);
+    expect(declaration.members, hasLength(0));
+    expect(declaration.rightBracket, isNotNull);
+    expect(declaration.typeParameters, isNull);
   }
 
   void test_parseClassDeclaration_native() {
     ClassDeclaration declaration = ParserTestCase.parse("parseClassDeclaration", <Object> [emptyCommentAndMetadata(), null], "class A native 'nativeValue' {}");
     NativeClause nativeClause = declaration.nativeClause;
-    JUnitTestCase.assertNotNull(nativeClause);
-    JUnitTestCase.assertNotNull(nativeClause.keyword);
-    JUnitTestCase.assertEquals("nativeValue", nativeClause.name.stringValue);
-    JUnitTestCase.assertSame(nativeClause.keyword, nativeClause.beginToken);
-    JUnitTestCase.assertSame(nativeClause.name.endToken, nativeClause.endToken);
+    expect(nativeClause, isNotNull);
+    expect(nativeClause.keyword, isNotNull);
+    expect(nativeClause.name.stringValue, "nativeValue");
+    expect(nativeClause.beginToken, same(nativeClause.keyword));
+    expect(nativeClause.endToken, same(nativeClause.name.endToken));
   }
 
   void test_parseClassDeclaration_nonEmpty() {
     ClassDeclaration declaration = ParserTestCase.parse("parseClassDeclaration", <Object> [emptyCommentAndMetadata(), null], "class A {var f;}");
-    JUnitTestCase.assertNull(declaration.documentationComment);
-    JUnitTestCase.assertNull(declaration.abstractKeyword);
-    JUnitTestCase.assertNull(declaration.extendsClause);
-    JUnitTestCase.assertNull(declaration.implementsClause);
-    JUnitTestCase.assertNotNull(declaration.classKeyword);
-    JUnitTestCase.assertNotNull(declaration.leftBracket);
-    JUnitTestCase.assertNotNull(declaration.name);
-    EngineTestCase.assertSizeOfList(1, declaration.members);
-    JUnitTestCase.assertNotNull(declaration.rightBracket);
-    JUnitTestCase.assertNull(declaration.typeParameters);
+    expect(declaration.documentationComment, isNull);
+    expect(declaration.abstractKeyword, isNull);
+    expect(declaration.extendsClause, isNull);
+    expect(declaration.implementsClause, isNull);
+    expect(declaration.classKeyword, isNotNull);
+    expect(declaration.leftBracket, isNotNull);
+    expect(declaration.name, isNotNull);
+    expect(declaration.members, hasLength(1));
+    expect(declaration.rightBracket, isNotNull);
+    expect(declaration.typeParameters, isNull);
   }
 
   void test_parseClassDeclaration_typeAlias_implementsC() {
     ClassTypeAlias typeAlias = ParserTestCase.parse("parseClassDeclaration", <Object> [emptyCommentAndMetadata(), null], "class A = Object with B implements C;");
-    JUnitTestCase.assertNotNull(typeAlias.keyword);
-    JUnitTestCase.assertNotNull(typeAlias.name);
-    JUnitTestCase.assertNull(typeAlias.typeParameters);
-    JUnitTestCase.assertNotNull(typeAlias.withClause);
-    JUnitTestCase.assertNotNull(typeAlias.implementsClause);
-    JUnitTestCase.assertNotNull(typeAlias.implementsClause.keyword);
-    JUnitTestCase.assertEquals(1, typeAlias.implementsClause.interfaces.length);
-    JUnitTestCase.assertNotNull(typeAlias.semicolon);
+    expect(typeAlias.keyword, isNotNull);
+    expect(typeAlias.name, isNotNull);
+    expect(typeAlias.typeParameters, isNull);
+    expect(typeAlias.withClause, isNotNull);
+    expect(typeAlias.implementsClause, isNotNull);
+    expect(typeAlias.implementsClause.keyword, isNotNull);
+    expect(typeAlias.implementsClause.interfaces.length, 1);
+    expect(typeAlias.semicolon, isNotNull);
   }
 
   void test_parseClassDeclaration_typeAlias_withB() {
     ClassTypeAlias typeAlias = ParserTestCase.parse("parseClassDeclaration", <Object> [emptyCommentAndMetadata(), null], "class A = Object with B;");
-    JUnitTestCase.assertNotNull(typeAlias.keyword);
-    JUnitTestCase.assertNotNull(typeAlias.name);
-    JUnitTestCase.assertNull(typeAlias.typeParameters);
-    JUnitTestCase.assertNotNull(typeAlias.withClause);
-    JUnitTestCase.assertNotNull(typeAlias.withClause.withKeyword);
-    JUnitTestCase.assertEquals(1, typeAlias.withClause.mixinTypes.length);
-    JUnitTestCase.assertNull(typeAlias.implementsClause);
-    JUnitTestCase.assertNotNull(typeAlias.semicolon);
+    expect(typeAlias.keyword, isNotNull);
+    expect(typeAlias.name, isNotNull);
+    expect(typeAlias.typeParameters, isNull);
+    expect(typeAlias.withClause, isNotNull);
+    expect(typeAlias.withClause.withKeyword, isNotNull);
+    expect(typeAlias.withClause.mixinTypes.length, 1);
+    expect(typeAlias.implementsClause, isNull);
+    expect(typeAlias.semicolon, isNotNull);
   }
 
   void test_parseClassDeclaration_typeParameters() {
     ClassDeclaration declaration = ParserTestCase.parse("parseClassDeclaration", <Object> [emptyCommentAndMetadata(), null], "class A<B> {}");
-    JUnitTestCase.assertNull(declaration.documentationComment);
-    JUnitTestCase.assertNull(declaration.abstractKeyword);
-    JUnitTestCase.assertNull(declaration.extendsClause);
-    JUnitTestCase.assertNull(declaration.implementsClause);
-    JUnitTestCase.assertNotNull(declaration.classKeyword);
-    JUnitTestCase.assertNotNull(declaration.leftBracket);
-    JUnitTestCase.assertNotNull(declaration.name);
-    EngineTestCase.assertSizeOfList(0, declaration.members);
-    JUnitTestCase.assertNotNull(declaration.rightBracket);
-    JUnitTestCase.assertNotNull(declaration.typeParameters);
-    EngineTestCase.assertSizeOfList(1, declaration.typeParameters.typeParameters);
+    expect(declaration.documentationComment, isNull);
+    expect(declaration.abstractKeyword, isNull);
+    expect(declaration.extendsClause, isNull);
+    expect(declaration.implementsClause, isNull);
+    expect(declaration.classKeyword, isNotNull);
+    expect(declaration.leftBracket, isNotNull);
+    expect(declaration.name, isNotNull);
+    expect(declaration.members, hasLength(0));
+    expect(declaration.rightBracket, isNotNull);
+    expect(declaration.typeParameters, isNotNull);
+    expect(declaration.typeParameters.typeParameters, hasLength(1));
   }
 
   void test_parseClassMember_constructor_withInitializers() {
     // TODO(brianwilkerson) Test other kinds of class members: fields, getters and setters.
     ConstructorDeclaration constructor = ParserTestCase.parse("parseClassMember", <Object> ["C"], "C(_, _\$, this.__) : _a = _ + _\$ {}");
-    JUnitTestCase.assertNotNull(constructor.body);
-    JUnitTestCase.assertNotNull(constructor.separator);
-    JUnitTestCase.assertNull(constructor.externalKeyword);
-    JUnitTestCase.assertNull(constructor.constKeyword);
-    JUnitTestCase.assertNull(constructor.factoryKeyword);
-    JUnitTestCase.assertNull(constructor.name);
-    JUnitTestCase.assertNotNull(constructor.parameters);
-    JUnitTestCase.assertNull(constructor.period);
-    JUnitTestCase.assertNotNull(constructor.returnType);
-    EngineTestCase.assertSizeOfList(1, constructor.initializers);
+    expect(constructor.body, isNotNull);
+    expect(constructor.separator, isNotNull);
+    expect(constructor.externalKeyword, isNull);
+    expect(constructor.constKeyword, isNull);
+    expect(constructor.factoryKeyword, isNull);
+    expect(constructor.name, isNull);
+    expect(constructor.parameters, isNotNull);
+    expect(constructor.period, isNull);
+    expect(constructor.returnType, isNotNull);
+    expect(constructor.initializers, hasLength(1));
   }
 
   void test_parseClassMember_field_instance_prefixedType() {
     FieldDeclaration field = ParserTestCase.parse("parseClassMember", <Object> ["C"], "p.A f;");
-    JUnitTestCase.assertNull(field.documentationComment);
-    EngineTestCase.assertSizeOfList(0, field.metadata);
-    JUnitTestCase.assertNull(field.staticKeyword);
+    expect(field.documentationComment, isNull);
+    expect(field.metadata, hasLength(0));
+    expect(field.staticKeyword, isNull);
     VariableDeclarationList list = field.fields;
-    JUnitTestCase.assertNotNull(list);
+    expect(list, isNotNull);
     NodeList<VariableDeclaration> variables = list.variables;
-    EngineTestCase.assertSizeOfList(1, variables);
+    expect(variables, hasLength(1));
     VariableDeclaration variable = variables[0];
-    JUnitTestCase.assertNotNull(variable.name);
+    expect(variable.name, isNotNull);
   }
 
   void test_parseClassMember_field_namedGet() {
     FieldDeclaration field = ParserTestCase.parse("parseClassMember", <Object> ["C"], "var get;");
-    JUnitTestCase.assertNull(field.documentationComment);
-    EngineTestCase.assertSizeOfList(0, field.metadata);
-    JUnitTestCase.assertNull(field.staticKeyword);
+    expect(field.documentationComment, isNull);
+    expect(field.metadata, hasLength(0));
+    expect(field.staticKeyword, isNull);
     VariableDeclarationList list = field.fields;
-    JUnitTestCase.assertNotNull(list);
+    expect(list, isNotNull);
     NodeList<VariableDeclaration> variables = list.variables;
-    EngineTestCase.assertSizeOfList(1, variables);
+    expect(variables, hasLength(1));
     VariableDeclaration variable = variables[0];
-    JUnitTestCase.assertNotNull(variable.name);
+    expect(variable.name, isNotNull);
   }
 
   void test_parseClassMember_field_namedOperator() {
     FieldDeclaration field = ParserTestCase.parse("parseClassMember", <Object> ["C"], "var operator;");
-    JUnitTestCase.assertNull(field.documentationComment);
-    EngineTestCase.assertSizeOfList(0, field.metadata);
-    JUnitTestCase.assertNull(field.staticKeyword);
+    expect(field.documentationComment, isNull);
+    expect(field.metadata, hasLength(0));
+    expect(field.staticKeyword, isNull);
     VariableDeclarationList list = field.fields;
-    JUnitTestCase.assertNotNull(list);
+    expect(list, isNotNull);
     NodeList<VariableDeclaration> variables = list.variables;
-    EngineTestCase.assertSizeOfList(1, variables);
+    expect(variables, hasLength(1));
     VariableDeclaration variable = variables[0];
-    JUnitTestCase.assertNotNull(variable.name);
+    expect(variable.name, isNotNull);
   }
 
   void test_parseClassMember_field_namedOperator_withAssignment() {
     FieldDeclaration field = ParserTestCase.parse("parseClassMember", <Object> ["C"], "var operator = (5);");
-    JUnitTestCase.assertNull(field.documentationComment);
-    EngineTestCase.assertSizeOfList(0, field.metadata);
-    JUnitTestCase.assertNull(field.staticKeyword);
+    expect(field.documentationComment, isNull);
+    expect(field.metadata, hasLength(0));
+    expect(field.staticKeyword, isNull);
     VariableDeclarationList list = field.fields;
-    JUnitTestCase.assertNotNull(list);
+    expect(list, isNotNull);
     NodeList<VariableDeclaration> variables = list.variables;
-    EngineTestCase.assertSizeOfList(1, variables);
+    expect(variables, hasLength(1));
     VariableDeclaration variable = variables[0];
-    JUnitTestCase.assertNotNull(variable.name);
-    JUnitTestCase.assertNotNull(variable.initializer);
+    expect(variable.name, isNotNull);
+    expect(variable.initializer, isNotNull);
   }
 
   void test_parseClassMember_field_namedSet() {
     FieldDeclaration field = ParserTestCase.parse("parseClassMember", <Object> ["C"], "var set;");
-    JUnitTestCase.assertNull(field.documentationComment);
-    EngineTestCase.assertSizeOfList(0, field.metadata);
-    JUnitTestCase.assertNull(field.staticKeyword);
+    expect(field.documentationComment, isNull);
+    expect(field.metadata, hasLength(0));
+    expect(field.staticKeyword, isNull);
     VariableDeclarationList list = field.fields;
-    JUnitTestCase.assertNotNull(list);
+    expect(list, isNotNull);
     NodeList<VariableDeclaration> variables = list.variables;
-    EngineTestCase.assertSizeOfList(1, variables);
+    expect(variables, hasLength(1));
     VariableDeclaration variable = variables[0];
-    JUnitTestCase.assertNotNull(variable.name);
+    expect(variable.name, isNotNull);
   }
 
   void test_parseClassMember_getter_void() {
     MethodDeclaration method = ParserTestCase.parse("parseClassMember", <Object> ["C"], "void get g {}");
-    JUnitTestCase.assertNull(method.documentationComment);
-    JUnitTestCase.assertNull(method.externalKeyword);
-    JUnitTestCase.assertNull(method.modifierKeyword);
-    JUnitTestCase.assertNotNull(method.propertyKeyword);
-    JUnitTestCase.assertNotNull(method.returnType);
-    JUnitTestCase.assertNotNull(method.name);
-    JUnitTestCase.assertNull(method.operatorKeyword);
-    JUnitTestCase.assertNotNull(method.body);
+    expect(method.documentationComment, isNull);
+    expect(method.externalKeyword, isNull);
+    expect(method.modifierKeyword, isNull);
+    expect(method.propertyKeyword, isNotNull);
+    expect(method.returnType, isNotNull);
+    expect(method.name, isNotNull);
+    expect(method.operatorKeyword, isNull);
+    expect(method.body, isNotNull);
   }
 
   void test_parseClassMember_method_external() {
     MethodDeclaration method = ParserTestCase.parse("parseClassMember", <Object> ["C"], "external m();");
-    JUnitTestCase.assertNotNull(method.body);
-    JUnitTestCase.assertNull(method.documentationComment);
-    JUnitTestCase.assertNotNull(method.externalKeyword);
-    JUnitTestCase.assertNull(method.modifierKeyword);
-    JUnitTestCase.assertNotNull(method.name);
-    JUnitTestCase.assertNull(method.operatorKeyword);
-    JUnitTestCase.assertNotNull(method.parameters);
-    JUnitTestCase.assertNull(method.propertyKeyword);
-    JUnitTestCase.assertNull(method.returnType);
+    expect(method.body, isNotNull);
+    expect(method.documentationComment, isNull);
+    expect(method.externalKeyword, isNotNull);
+    expect(method.modifierKeyword, isNull);
+    expect(method.name, isNotNull);
+    expect(method.operatorKeyword, isNull);
+    expect(method.parameters, isNotNull);
+    expect(method.propertyKeyword, isNull);
+    expect(method.returnType, isNull);
   }
 
   void test_parseClassMember_method_external_withTypeAndArgs() {
     MethodDeclaration method = ParserTestCase.parse("parseClassMember", <Object> ["C"], "external int m(int a);");
-    JUnitTestCase.assertNotNull(method.body);
-    JUnitTestCase.assertNull(method.documentationComment);
-    JUnitTestCase.assertNotNull(method.externalKeyword);
-    JUnitTestCase.assertNull(method.modifierKeyword);
-    JUnitTestCase.assertNotNull(method.name);
-    JUnitTestCase.assertNull(method.operatorKeyword);
-    JUnitTestCase.assertNotNull(method.parameters);
-    JUnitTestCase.assertNull(method.propertyKeyword);
-    JUnitTestCase.assertNotNull(method.returnType);
+    expect(method.body, isNotNull);
+    expect(method.documentationComment, isNull);
+    expect(method.externalKeyword, isNotNull);
+    expect(method.modifierKeyword, isNull);
+    expect(method.name, isNotNull);
+    expect(method.operatorKeyword, isNull);
+    expect(method.parameters, isNotNull);
+    expect(method.propertyKeyword, isNull);
+    expect(method.returnType, isNotNull);
   }
 
   void test_parseClassMember_method_get_noType() {
     MethodDeclaration method = ParserTestCase.parse("parseClassMember", <Object> ["C"], "get() {}");
-    JUnitTestCase.assertNull(method.documentationComment);
-    JUnitTestCase.assertNull(method.externalKeyword);
-    JUnitTestCase.assertNull(method.modifierKeyword);
-    JUnitTestCase.assertNull(method.propertyKeyword);
-    JUnitTestCase.assertNull(method.returnType);
-    JUnitTestCase.assertNotNull(method.name);
-    JUnitTestCase.assertNull(method.operatorKeyword);
-    JUnitTestCase.assertNotNull(method.parameters);
-    JUnitTestCase.assertNotNull(method.body);
+    expect(method.documentationComment, isNull);
+    expect(method.externalKeyword, isNull);
+    expect(method.modifierKeyword, isNull);
+    expect(method.propertyKeyword, isNull);
+    expect(method.returnType, isNull);
+    expect(method.name, isNotNull);
+    expect(method.operatorKeyword, isNull);
+    expect(method.parameters, isNotNull);
+    expect(method.body, isNotNull);
   }
 
   void test_parseClassMember_method_get_type() {
     MethodDeclaration method = ParserTestCase.parse("parseClassMember", <Object> ["C"], "int get() {}");
-    JUnitTestCase.assertNull(method.documentationComment);
-    JUnitTestCase.assertNull(method.externalKeyword);
-    JUnitTestCase.assertNull(method.modifierKeyword);
-    JUnitTestCase.assertNull(method.propertyKeyword);
-    JUnitTestCase.assertNotNull(method.returnType);
-    JUnitTestCase.assertNotNull(method.name);
-    JUnitTestCase.assertNull(method.operatorKeyword);
-    JUnitTestCase.assertNotNull(method.parameters);
-    JUnitTestCase.assertNotNull(method.body);
+    expect(method.documentationComment, isNull);
+    expect(method.externalKeyword, isNull);
+    expect(method.modifierKeyword, isNull);
+    expect(method.propertyKeyword, isNull);
+    expect(method.returnType, isNotNull);
+    expect(method.name, isNotNull);
+    expect(method.operatorKeyword, isNull);
+    expect(method.parameters, isNotNull);
+    expect(method.body, isNotNull);
   }
 
   void test_parseClassMember_method_get_void() {
     MethodDeclaration method = ParserTestCase.parse("parseClassMember", <Object> ["C"], "void get() {}");
-    JUnitTestCase.assertNull(method.documentationComment);
-    JUnitTestCase.assertNull(method.externalKeyword);
-    JUnitTestCase.assertNull(method.modifierKeyword);
-    JUnitTestCase.assertNull(method.propertyKeyword);
-    JUnitTestCase.assertNotNull(method.returnType);
-    JUnitTestCase.assertNotNull(method.name);
-    JUnitTestCase.assertNull(method.operatorKeyword);
-    JUnitTestCase.assertNotNull(method.parameters);
-    JUnitTestCase.assertNotNull(method.body);
+    expect(method.documentationComment, isNull);
+    expect(method.externalKeyword, isNull);
+    expect(method.modifierKeyword, isNull);
+    expect(method.propertyKeyword, isNull);
+    expect(method.returnType, isNotNull);
+    expect(method.name, isNotNull);
+    expect(method.operatorKeyword, isNull);
+    expect(method.parameters, isNotNull);
+    expect(method.body, isNotNull);
   }
 
   void test_parseClassMember_method_operator_noType() {
     MethodDeclaration method = ParserTestCase.parse("parseClassMember", <Object> ["C"], "operator() {}");
-    JUnitTestCase.assertNull(method.documentationComment);
-    JUnitTestCase.assertNull(method.externalKeyword);
-    JUnitTestCase.assertNull(method.modifierKeyword);
-    JUnitTestCase.assertNull(method.propertyKeyword);
-    JUnitTestCase.assertNull(method.returnType);
-    JUnitTestCase.assertNotNull(method.name);
-    JUnitTestCase.assertNull(method.operatorKeyword);
-    JUnitTestCase.assertNotNull(method.parameters);
-    JUnitTestCase.assertNotNull(method.body);
+    expect(method.documentationComment, isNull);
+    expect(method.externalKeyword, isNull);
+    expect(method.modifierKeyword, isNull);
+    expect(method.propertyKeyword, isNull);
+    expect(method.returnType, isNull);
+    expect(method.name, isNotNull);
+    expect(method.operatorKeyword, isNull);
+    expect(method.parameters, isNotNull);
+    expect(method.body, isNotNull);
   }
 
   void test_parseClassMember_method_operator_type() {
     MethodDeclaration method = ParserTestCase.parse("parseClassMember", <Object> ["C"], "int operator() {}");
-    JUnitTestCase.assertNull(method.documentationComment);
-    JUnitTestCase.assertNull(method.externalKeyword);
-    JUnitTestCase.assertNull(method.modifierKeyword);
-    JUnitTestCase.assertNull(method.propertyKeyword);
-    JUnitTestCase.assertNotNull(method.returnType);
-    JUnitTestCase.assertNotNull(method.name);
-    JUnitTestCase.assertNull(method.operatorKeyword);
-    JUnitTestCase.assertNotNull(method.parameters);
-    JUnitTestCase.assertNotNull(method.body);
+    expect(method.documentationComment, isNull);
+    expect(method.externalKeyword, isNull);
+    expect(method.modifierKeyword, isNull);
+    expect(method.propertyKeyword, isNull);
+    expect(method.returnType, isNotNull);
+    expect(method.name, isNotNull);
+    expect(method.operatorKeyword, isNull);
+    expect(method.parameters, isNotNull);
+    expect(method.body, isNotNull);
   }
 
   void test_parseClassMember_method_operator_void() {
     MethodDeclaration method = ParserTestCase.parse("parseClassMember", <Object> ["C"], "void operator() {}");
-    JUnitTestCase.assertNull(method.documentationComment);
-    JUnitTestCase.assertNull(method.externalKeyword);
-    JUnitTestCase.assertNull(method.modifierKeyword);
-    JUnitTestCase.assertNull(method.propertyKeyword);
-    JUnitTestCase.assertNotNull(method.returnType);
-    JUnitTestCase.assertNotNull(method.name);
-    JUnitTestCase.assertNull(method.operatorKeyword);
-    JUnitTestCase.assertNotNull(method.parameters);
-    JUnitTestCase.assertNotNull(method.body);
+    expect(method.documentationComment, isNull);
+    expect(method.externalKeyword, isNull);
+    expect(method.modifierKeyword, isNull);
+    expect(method.propertyKeyword, isNull);
+    expect(method.returnType, isNotNull);
+    expect(method.name, isNotNull);
+    expect(method.operatorKeyword, isNull);
+    expect(method.parameters, isNotNull);
+    expect(method.body, isNotNull);
   }
 
   void test_parseClassMember_method_returnType_parameterized() {
     MethodDeclaration method = ParserTestCase.parse("parseClassMember", <Object> ["C"], "p.A m() {}");
-    JUnitTestCase.assertNull(method.documentationComment);
-    JUnitTestCase.assertNull(method.externalKeyword);
-    JUnitTestCase.assertNull(method.modifierKeyword);
-    JUnitTestCase.assertNull(method.propertyKeyword);
-    JUnitTestCase.assertNotNull(method.returnType);
-    JUnitTestCase.assertNotNull(method.name);
-    JUnitTestCase.assertNull(method.operatorKeyword);
-    JUnitTestCase.assertNotNull(method.parameters);
-    JUnitTestCase.assertNotNull(method.body);
+    expect(method.documentationComment, isNull);
+    expect(method.externalKeyword, isNull);
+    expect(method.modifierKeyword, isNull);
+    expect(method.propertyKeyword, isNull);
+    expect(method.returnType, isNotNull);
+    expect(method.name, isNotNull);
+    expect(method.operatorKeyword, isNull);
+    expect(method.parameters, isNotNull);
+    expect(method.body, isNotNull);
   }
 
   void test_parseClassMember_method_set_noType() {
     MethodDeclaration method = ParserTestCase.parse("parseClassMember", <Object> ["C"], "set() {}");
-    JUnitTestCase.assertNull(method.documentationComment);
-    JUnitTestCase.assertNull(method.externalKeyword);
-    JUnitTestCase.assertNull(method.modifierKeyword);
-    JUnitTestCase.assertNull(method.propertyKeyword);
-    JUnitTestCase.assertNull(method.returnType);
-    JUnitTestCase.assertNotNull(method.name);
-    JUnitTestCase.assertNull(method.operatorKeyword);
-    JUnitTestCase.assertNotNull(method.parameters);
-    JUnitTestCase.assertNotNull(method.body);
+    expect(method.documentationComment, isNull);
+    expect(method.externalKeyword, isNull);
+    expect(method.modifierKeyword, isNull);
+    expect(method.propertyKeyword, isNull);
+    expect(method.returnType, isNull);
+    expect(method.name, isNotNull);
+    expect(method.operatorKeyword, isNull);
+    expect(method.parameters, isNotNull);
+    expect(method.body, isNotNull);
   }
 
   void test_parseClassMember_method_set_type() {
     MethodDeclaration method = ParserTestCase.parse("parseClassMember", <Object> ["C"], "int set() {}");
-    JUnitTestCase.assertNull(method.documentationComment);
-    JUnitTestCase.assertNull(method.externalKeyword);
-    JUnitTestCase.assertNull(method.modifierKeyword);
-    JUnitTestCase.assertNull(method.propertyKeyword);
-    JUnitTestCase.assertNotNull(method.returnType);
-    JUnitTestCase.assertNotNull(method.name);
-    JUnitTestCase.assertNull(method.operatorKeyword);
-    JUnitTestCase.assertNotNull(method.parameters);
-    JUnitTestCase.assertNotNull(method.body);
+    expect(method.documentationComment, isNull);
+    expect(method.externalKeyword, isNull);
+    expect(method.modifierKeyword, isNull);
+    expect(method.propertyKeyword, isNull);
+    expect(method.returnType, isNotNull);
+    expect(method.name, isNotNull);
+    expect(method.operatorKeyword, isNull);
+    expect(method.parameters, isNotNull);
+    expect(method.body, isNotNull);
   }
 
   void test_parseClassMember_method_set_void() {
     MethodDeclaration method = ParserTestCase.parse("parseClassMember", <Object> ["C"], "void set() {}");
-    JUnitTestCase.assertNull(method.documentationComment);
-    JUnitTestCase.assertNull(method.externalKeyword);
-    JUnitTestCase.assertNull(method.modifierKeyword);
-    JUnitTestCase.assertNull(method.propertyKeyword);
-    JUnitTestCase.assertNotNull(method.returnType);
-    JUnitTestCase.assertNotNull(method.name);
-    JUnitTestCase.assertNull(method.operatorKeyword);
-    JUnitTestCase.assertNotNull(method.parameters);
-    JUnitTestCase.assertNotNull(method.body);
+    expect(method.documentationComment, isNull);
+    expect(method.externalKeyword, isNull);
+    expect(method.modifierKeyword, isNull);
+    expect(method.propertyKeyword, isNull);
+    expect(method.returnType, isNotNull);
+    expect(method.name, isNotNull);
+    expect(method.operatorKeyword, isNull);
+    expect(method.parameters, isNotNull);
+    expect(method.body, isNotNull);
   }
 
   void test_parseClassMember_operator_index() {
     MethodDeclaration method = ParserTestCase.parse("parseClassMember", <Object> ["C"], "int operator [](int i) {}");
-    JUnitTestCase.assertNull(method.documentationComment);
-    JUnitTestCase.assertNull(method.externalKeyword);
-    JUnitTestCase.assertNull(method.modifierKeyword);
-    JUnitTestCase.assertNull(method.propertyKeyword);
-    JUnitTestCase.assertNotNull(method.returnType);
-    JUnitTestCase.assertNotNull(method.name);
-    JUnitTestCase.assertNotNull(method.operatorKeyword);
-    JUnitTestCase.assertNotNull(method.parameters);
-    JUnitTestCase.assertNotNull(method.body);
+    expect(method.documentationComment, isNull);
+    expect(method.externalKeyword, isNull);
+    expect(method.modifierKeyword, isNull);
+    expect(method.propertyKeyword, isNull);
+    expect(method.returnType, isNotNull);
+    expect(method.name, isNotNull);
+    expect(method.operatorKeyword, isNotNull);
+    expect(method.parameters, isNotNull);
+    expect(method.body, isNotNull);
   }
 
   void test_parseClassMember_operator_indexAssign() {
     MethodDeclaration method = ParserTestCase.parse("parseClassMember", <Object> ["C"], "int operator []=(int i) {}");
-    JUnitTestCase.assertNull(method.documentationComment);
-    JUnitTestCase.assertNull(method.externalKeyword);
-    JUnitTestCase.assertNull(method.modifierKeyword);
-    JUnitTestCase.assertNull(method.propertyKeyword);
-    JUnitTestCase.assertNotNull(method.returnType);
-    JUnitTestCase.assertNotNull(method.name);
-    JUnitTestCase.assertNotNull(method.operatorKeyword);
-    JUnitTestCase.assertNotNull(method.parameters);
-    JUnitTestCase.assertNotNull(method.body);
+    expect(method.documentationComment, isNull);
+    expect(method.externalKeyword, isNull);
+    expect(method.modifierKeyword, isNull);
+    expect(method.propertyKeyword, isNull);
+    expect(method.returnType, isNotNull);
+    expect(method.name, isNotNull);
+    expect(method.operatorKeyword, isNotNull);
+    expect(method.parameters, isNotNull);
+    expect(method.body, isNotNull);
   }
 
   void test_parseClassMember_redirectingFactory_const() {
     ConstructorDeclaration constructor = ParserTestCase.parse("parseClassMember", <Object> ["C"], "const factory C() = B;");
-    JUnitTestCase.assertNull(constructor.externalKeyword);
-    JUnitTestCase.assertNotNull(constructor.constKeyword);
-    JUnitTestCase.assertNotNull(constructor.factoryKeyword);
-    JUnitTestCase.assertNotNull(constructor.returnType);
-    JUnitTestCase.assertNull(constructor.period);
-    JUnitTestCase.assertNull(constructor.name);
-    JUnitTestCase.assertNotNull(constructor.parameters);
-    JUnitTestCase.assertNotNull(constructor.separator);
-    EngineTestCase.assertSizeOfList(0, constructor.initializers);
-    JUnitTestCase.assertNotNull(constructor.redirectedConstructor);
-    JUnitTestCase.assertNotNull(constructor.body);
+    expect(constructor.externalKeyword, isNull);
+    expect(constructor.constKeyword, isNotNull);
+    expect(constructor.factoryKeyword, isNotNull);
+    expect(constructor.returnType, isNotNull);
+    expect(constructor.period, isNull);
+    expect(constructor.name, isNull);
+    expect(constructor.parameters, isNotNull);
+    expect(constructor.separator, isNotNull);
+    expect(constructor.initializers, hasLength(0));
+    expect(constructor.redirectedConstructor, isNotNull);
+    expect(constructor.body, isNotNull);
   }
 
   void test_parseClassMember_redirectingFactory_nonConst() {
     ConstructorDeclaration constructor = ParserTestCase.parse("parseClassMember", <Object> ["C"], "factory C() = B;");
-    JUnitTestCase.assertNull(constructor.externalKeyword);
-    JUnitTestCase.assertNull(constructor.constKeyword);
-    JUnitTestCase.assertNotNull(constructor.factoryKeyword);
-    JUnitTestCase.assertNotNull(constructor.returnType);
-    JUnitTestCase.assertNull(constructor.period);
-    JUnitTestCase.assertNull(constructor.name);
-    JUnitTestCase.assertNotNull(constructor.parameters);
-    JUnitTestCase.assertNotNull(constructor.separator);
-    EngineTestCase.assertSizeOfList(0, constructor.initializers);
-    JUnitTestCase.assertNotNull(constructor.redirectedConstructor);
-    JUnitTestCase.assertNotNull(constructor.body);
+    expect(constructor.externalKeyword, isNull);
+    expect(constructor.constKeyword, isNull);
+    expect(constructor.factoryKeyword, isNotNull);
+    expect(constructor.returnType, isNotNull);
+    expect(constructor.period, isNull);
+    expect(constructor.name, isNull);
+    expect(constructor.parameters, isNotNull);
+    expect(constructor.separator, isNotNull);
+    expect(constructor.initializers, hasLength(0));
+    expect(constructor.redirectedConstructor, isNotNull);
+    expect(constructor.body, isNotNull);
   }
 
   void test_parseClassTypeAlias_abstract() {
     Token classToken = TokenFactory.tokenFromKeyword(Keyword.CLASS);
     Token abstractToken = TokenFactory.tokenFromKeyword(Keyword.ABSTRACT);
     ClassTypeAlias classTypeAlias = ParserTestCase.parse("parseClassTypeAlias", <Object> [emptyCommentAndMetadata(), abstractToken, classToken], "A = B with C;");
-    JUnitTestCase.assertNotNull(classTypeAlias.keyword);
-    JUnitTestCase.assertEquals("A", classTypeAlias.name.name);
-    JUnitTestCase.assertNotNull(classTypeAlias.equals);
-    JUnitTestCase.assertNotNull(classTypeAlias.abstractKeyword);
-    JUnitTestCase.assertNotNullMsg("B", classTypeAlias.superclass.name.name);
-    JUnitTestCase.assertNotNull(classTypeAlias.withClause);
-    JUnitTestCase.assertNull(classTypeAlias.implementsClause);
-    JUnitTestCase.assertNotNull(classTypeAlias.semicolon);
+    expect(classTypeAlias.keyword, isNotNull);
+    expect(classTypeAlias.name.name, "A");
+    expect(classTypeAlias.equals, isNotNull);
+    expect(classTypeAlias.abstractKeyword, isNotNull);
+    expect(classTypeAlias.superclass.name.name, isNotNull, reason: "B");
+    expect(classTypeAlias.withClause, isNotNull);
+    expect(classTypeAlias.implementsClause, isNull);
+    expect(classTypeAlias.semicolon, isNotNull);
   }
 
   void test_parseClassTypeAlias_implements() {
     Token token = TokenFactory.tokenFromKeyword(Keyword.CLASS);
     ClassTypeAlias classTypeAlias = ParserTestCase.parse("parseClassTypeAlias", <Object> [emptyCommentAndMetadata(), null, token], "A = B with C implements D;");
-    JUnitTestCase.assertNotNull(classTypeAlias.keyword);
-    JUnitTestCase.assertEquals("A", classTypeAlias.name.name);
-    JUnitTestCase.assertNotNull(classTypeAlias.equals);
-    JUnitTestCase.assertNull(classTypeAlias.abstractKeyword);
-    JUnitTestCase.assertNotNullMsg("B", classTypeAlias.superclass.name.name);
-    JUnitTestCase.assertNotNull(classTypeAlias.withClause);
-    JUnitTestCase.assertNotNull(classTypeAlias.implementsClause);
-    JUnitTestCase.assertNotNull(classTypeAlias.semicolon);
+    expect(classTypeAlias.keyword, isNotNull);
+    expect(classTypeAlias.name.name, "A");
+    expect(classTypeAlias.equals, isNotNull);
+    expect(classTypeAlias.abstractKeyword, isNull);
+    expect(classTypeAlias.superclass.name.name, isNotNull, reason: "B");
+    expect(classTypeAlias.withClause, isNotNull);
+    expect(classTypeAlias.implementsClause, isNotNull);
+    expect(classTypeAlias.semicolon, isNotNull);
   }
 
   void test_parseClassTypeAlias_with() {
     Token token = TokenFactory.tokenFromKeyword(Keyword.CLASS);
     ClassTypeAlias classTypeAlias = ParserTestCase.parse("parseClassTypeAlias", <Object> [emptyCommentAndMetadata(), null, token], "A = B with C;");
-    JUnitTestCase.assertNotNull(classTypeAlias.keyword);
-    JUnitTestCase.assertEquals("A", classTypeAlias.name.name);
-    JUnitTestCase.assertNotNull(classTypeAlias.equals);
-    JUnitTestCase.assertNull(classTypeAlias.abstractKeyword);
-    JUnitTestCase.assertNotNullMsg("B", classTypeAlias.superclass.name.name);
-    JUnitTestCase.assertNotNull(classTypeAlias.withClause);
-    JUnitTestCase.assertNull(classTypeAlias.implementsClause);
-    JUnitTestCase.assertNotNull(classTypeAlias.semicolon);
+    expect(classTypeAlias.keyword, isNotNull);
+    expect(classTypeAlias.name.name, "A");
+    expect(classTypeAlias.equals, isNotNull);
+    expect(classTypeAlias.abstractKeyword, isNull);
+    expect(classTypeAlias.superclass.name.name, isNotNull, reason: "B");
+    expect(classTypeAlias.withClause, isNotNull);
+    expect(classTypeAlias.implementsClause, isNull);
+    expect(classTypeAlias.semicolon, isNotNull);
   }
 
   void test_parseClassTypeAlias_with_implements() {
     Token token = TokenFactory.tokenFromKeyword(Keyword.CLASS);
     ClassTypeAlias classTypeAlias = ParserTestCase.parse("parseClassTypeAlias", <Object> [emptyCommentAndMetadata(), null, token], "A = B with C implements D;");
-    JUnitTestCase.assertNotNull(classTypeAlias.keyword);
-    JUnitTestCase.assertEquals("A", classTypeAlias.name.name);
-    JUnitTestCase.assertNotNull(classTypeAlias.equals);
-    JUnitTestCase.assertNull(classTypeAlias.abstractKeyword);
-    JUnitTestCase.assertNotNullMsg("B", classTypeAlias.superclass.name.name);
-    JUnitTestCase.assertNotNull(classTypeAlias.withClause);
-    JUnitTestCase.assertNotNull(classTypeAlias.implementsClause);
-    JUnitTestCase.assertNotNull(classTypeAlias.semicolon);
+    expect(classTypeAlias.keyword, isNotNull);
+    expect(classTypeAlias.name.name, "A");
+    expect(classTypeAlias.equals, isNotNull);
+    expect(classTypeAlias.abstractKeyword, isNull);
+    expect(classTypeAlias.superclass.name.name, isNotNull, reason: "B");
+    expect(classTypeAlias.withClause, isNotNull);
+    expect(classTypeAlias.implementsClause, isNotNull);
+    expect(classTypeAlias.semicolon, isNotNull);
   }
 
   void test_parseCombinators_h() {
     List<Combinator> combinators = ParserTestCase.parse4("parseCombinators", "hide a;", []);
-    EngineTestCase.assertSizeOfList(1, combinators);
+    expect(combinators, hasLength(1));
     HideCombinator combinator = combinators[0] as HideCombinator;
-    JUnitTestCase.assertNotNull(combinator);
-    JUnitTestCase.assertNotNull(combinator.keyword);
-    EngineTestCase.assertSizeOfList(1, combinator.hiddenNames);
+    expect(combinator, isNotNull);
+    expect(combinator.keyword, isNotNull);
+    expect(combinator.hiddenNames, hasLength(1));
   }
 
   void test_parseCombinators_hs() {
     List<Combinator> combinators = ParserTestCase.parse4("parseCombinators", "hide a show b;", []);
-    EngineTestCase.assertSizeOfList(2, combinators);
+    expect(combinators, hasLength(2));
     HideCombinator hideCombinator = combinators[0] as HideCombinator;
-    JUnitTestCase.assertNotNull(hideCombinator);
-    JUnitTestCase.assertNotNull(hideCombinator.keyword);
-    EngineTestCase.assertSizeOfList(1, hideCombinator.hiddenNames);
+    expect(hideCombinator, isNotNull);
+    expect(hideCombinator.keyword, isNotNull);
+    expect(hideCombinator.hiddenNames, hasLength(1));
     ShowCombinator showCombinator = combinators[1] as ShowCombinator;
-    JUnitTestCase.assertNotNull(showCombinator);
-    JUnitTestCase.assertNotNull(showCombinator.keyword);
-    EngineTestCase.assertSizeOfList(1, showCombinator.shownNames);
+    expect(showCombinator, isNotNull);
+    expect(showCombinator.keyword, isNotNull);
+    expect(showCombinator.shownNames, hasLength(1));
   }
 
   void test_parseCombinators_hshs() {
     List<Combinator> combinators = ParserTestCase.parse4("parseCombinators", "hide a show b hide c show d;", []);
-    EngineTestCase.assertSizeOfList(4, combinators);
+    expect(combinators, hasLength(4));
   }
 
   void test_parseCombinators_s() {
     List<Combinator> combinators = ParserTestCase.parse4("parseCombinators", "show a;", []);
-    EngineTestCase.assertSizeOfList(1, combinators);
+    expect(combinators, hasLength(1));
     ShowCombinator combinator = combinators[0] as ShowCombinator;
-    JUnitTestCase.assertNotNull(combinator);
-    JUnitTestCase.assertNotNull(combinator.keyword);
-    EngineTestCase.assertSizeOfList(1, combinator.shownNames);
+    expect(combinator, isNotNull);
+    expect(combinator.keyword, isNotNull);
+    expect(combinator.shownNames, hasLength(1));
   }
 
   void test_parseCommentAndMetadata_c() {
     CommentAndMetadata commentAndMetadata = ParserTestCase.parse4("parseCommentAndMetadata", "/** 1 */ void", []);
-    JUnitTestCase.assertNotNull(commentAndMetadata.comment);
-    EngineTestCase.assertSizeOfList(0, commentAndMetadata.metadata);
+    expect(commentAndMetadata.comment, isNotNull);
+    expect(commentAndMetadata.metadata, hasLength(0));
   }
 
   void test_parseCommentAndMetadata_cmc() {
     CommentAndMetadata commentAndMetadata = ParserTestCase.parse4("parseCommentAndMetadata", "/** 1 */ @A /** 2 */ void", []);
-    JUnitTestCase.assertNotNull(commentAndMetadata.comment);
-    EngineTestCase.assertSizeOfList(1, commentAndMetadata.metadata);
+    expect(commentAndMetadata.comment, isNotNull);
+    expect(commentAndMetadata.metadata, hasLength(1));
   }
 
   void test_parseCommentAndMetadata_cmcm() {
     CommentAndMetadata commentAndMetadata = ParserTestCase.parse4("parseCommentAndMetadata", "/** 1 */ @A /** 2 */ @B void", []);
-    JUnitTestCase.assertNotNull(commentAndMetadata.comment);
-    EngineTestCase.assertSizeOfList(2, commentAndMetadata.metadata);
+    expect(commentAndMetadata.comment, isNotNull);
+    expect(commentAndMetadata.metadata, hasLength(2));
   }
 
   void test_parseCommentAndMetadata_cmm() {
     CommentAndMetadata commentAndMetadata = ParserTestCase.parse4("parseCommentAndMetadata", "/** 1 */ @A @B void", []);
-    JUnitTestCase.assertNotNull(commentAndMetadata.comment);
-    EngineTestCase.assertSizeOfList(2, commentAndMetadata.metadata);
+    expect(commentAndMetadata.comment, isNotNull);
+    expect(commentAndMetadata.metadata, hasLength(2));
   }
 
   void test_parseCommentAndMetadata_m() {
     CommentAndMetadata commentAndMetadata = ParserTestCase.parse4("parseCommentAndMetadata", "@A void", []);
-    JUnitTestCase.assertNull(commentAndMetadata.comment);
-    EngineTestCase.assertSizeOfList(1, commentAndMetadata.metadata);
+    expect(commentAndMetadata.comment, isNull);
+    expect(commentAndMetadata.metadata, hasLength(1));
   }
 
   void test_parseCommentAndMetadata_mcm() {
     CommentAndMetadata commentAndMetadata = ParserTestCase.parse4("parseCommentAndMetadata", "@A /** 1 */ @B void", []);
-    JUnitTestCase.assertNotNull(commentAndMetadata.comment);
-    EngineTestCase.assertSizeOfList(2, commentAndMetadata.metadata);
+    expect(commentAndMetadata.comment, isNotNull);
+    expect(commentAndMetadata.metadata, hasLength(2));
   }
 
   void test_parseCommentAndMetadata_mcmc() {
     CommentAndMetadata commentAndMetadata = ParserTestCase.parse4("parseCommentAndMetadata", "@A /** 1 */ @B /** 2 */ void", []);
-    JUnitTestCase.assertNotNull(commentAndMetadata.comment);
-    EngineTestCase.assertSizeOfList(2, commentAndMetadata.metadata);
+    expect(commentAndMetadata.comment, isNotNull);
+    expect(commentAndMetadata.metadata, hasLength(2));
   }
 
   void test_parseCommentAndMetadata_mm() {
     CommentAndMetadata commentAndMetadata = ParserTestCase.parse4("parseCommentAndMetadata", "@A @B(x) void", []);
-    JUnitTestCase.assertNull(commentAndMetadata.comment);
-    EngineTestCase.assertSizeOfList(2, commentAndMetadata.metadata);
+    expect(commentAndMetadata.comment, isNull);
+    expect(commentAndMetadata.metadata, hasLength(2));
   }
 
   void test_parseCommentAndMetadata_none() {
     CommentAndMetadata commentAndMetadata = ParserTestCase.parse4("parseCommentAndMetadata", "void", []);
-    JUnitTestCase.assertNull(commentAndMetadata.comment);
-    EngineTestCase.assertSizeOfList(0, commentAndMetadata.metadata);
+    expect(commentAndMetadata.comment, isNull);
+    expect(commentAndMetadata.metadata, hasLength(0));
   }
 
   void test_parseCommentAndMetadata_singleLine() {
-    CommentAndMetadata commentAndMetadata = ParserTestCase.parse4("parseCommentAndMetadata", EngineTestCase.createSource(["/// 1", "/// 2", "void"]), []);
-    JUnitTestCase.assertNotNull(commentAndMetadata.comment);
-    EngineTestCase.assertSizeOfList(0, commentAndMetadata.metadata);
+    CommentAndMetadata commentAndMetadata = ParserTestCase.parse4("parseCommentAndMetadata", r'''
+/// 1
+/// 2
+void''', []);
+    expect(commentAndMetadata.comment, isNotNull);
+    expect(commentAndMetadata.metadata, hasLength(0));
   }
 
   void test_parseCommentReference_new_prefixed() {
     CommentReference reference = ParserTestCase.parse("parseCommentReference", <Object> ["new a.b", 7], "");
     PrefixedIdentifier prefixedIdentifier = EngineTestCase.assertInstanceOf((obj) => obj is PrefixedIdentifier, PrefixedIdentifier, reference.identifier);
     SimpleIdentifier prefix = prefixedIdentifier.prefix;
-    JUnitTestCase.assertNotNull(prefix.token);
-    JUnitTestCase.assertEquals("a", prefix.name);
-    JUnitTestCase.assertEquals(11, prefix.offset);
-    JUnitTestCase.assertNotNull(prefixedIdentifier.period);
+    expect(prefix.token, isNotNull);
+    expect(prefix.name, "a");
+    expect(prefix.offset, 11);
+    expect(prefixedIdentifier.period, isNotNull);
     SimpleIdentifier identifier = prefixedIdentifier.identifier;
-    JUnitTestCase.assertNotNull(identifier.token);
-    JUnitTestCase.assertEquals("b", identifier.name);
-    JUnitTestCase.assertEquals(13, identifier.offset);
+    expect(identifier.token, isNotNull);
+    expect(identifier.name, "b");
+    expect(identifier.offset, 13);
   }
 
   void test_parseCommentReference_new_simple() {
     CommentReference reference = ParserTestCase.parse("parseCommentReference", <Object> ["new a", 5], "");
     SimpleIdentifier identifier = EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, reference.identifier);
-    JUnitTestCase.assertNotNull(identifier.token);
-    JUnitTestCase.assertEquals("a", identifier.name);
-    JUnitTestCase.assertEquals(9, identifier.offset);
+    expect(identifier.token, isNotNull);
+    expect(identifier.name, "a");
+    expect(identifier.offset, 9);
   }
 
   void test_parseCommentReference_prefixed() {
     CommentReference reference = ParserTestCase.parse("parseCommentReference", <Object> ["a.b", 7], "");
     PrefixedIdentifier prefixedIdentifier = EngineTestCase.assertInstanceOf((obj) => obj is PrefixedIdentifier, PrefixedIdentifier, reference.identifier);
     SimpleIdentifier prefix = prefixedIdentifier.prefix;
-    JUnitTestCase.assertNotNull(prefix.token);
-    JUnitTestCase.assertEquals("a", prefix.name);
-    JUnitTestCase.assertEquals(7, prefix.offset);
-    JUnitTestCase.assertNotNull(prefixedIdentifier.period);
+    expect(prefix.token, isNotNull);
+    expect(prefix.name, "a");
+    expect(prefix.offset, 7);
+    expect(prefixedIdentifier.period, isNotNull);
     SimpleIdentifier identifier = prefixedIdentifier.identifier;
-    JUnitTestCase.assertNotNull(identifier.token);
-    JUnitTestCase.assertEquals("b", identifier.name);
-    JUnitTestCase.assertEquals(9, identifier.offset);
+    expect(identifier.token, isNotNull);
+    expect(identifier.name, "b");
+    expect(identifier.offset, 9);
   }
 
   void test_parseCommentReference_simple() {
     CommentReference reference = ParserTestCase.parse("parseCommentReference", <Object> ["a", 5], "");
     SimpleIdentifier identifier = EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, reference.identifier);
-    JUnitTestCase.assertNotNull(identifier.token);
-    JUnitTestCase.assertEquals("a", identifier.name);
-    JUnitTestCase.assertEquals(5, identifier.offset);
+    expect(identifier.token, isNotNull);
+    expect(identifier.name, "a");
+    expect(identifier.offset, 5);
   }
 
   void test_parseCommentReference_synthetic() {
     CommentReference reference = ParserTestCase.parse("parseCommentReference", <Object> ["", 5], "");
     SimpleIdentifier identifier = EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier, SimpleIdentifier, reference.identifier);
-    JUnitTestCase.assertNotNull(identifier);
-    JUnitTestCase.assertTrue(identifier.isSynthetic);
-    JUnitTestCase.assertNotNull(identifier.token);
-    JUnitTestCase.assertEquals("", identifier.name);
-    JUnitTestCase.assertEquals(5, identifier.offset);
+    expect(identifier, isNotNull);
+    expect(identifier.isSynthetic, isTrue);
+    expect(identifier.token, isNotNull);
+    expect(identifier.name, "");
+    expect(identifier.offset, 5);
   }
 
   void test_parseCommentReferences_multiLine() {
     List<Token> tokens = <Token> [new StringToken(TokenType.MULTI_LINE_COMMENT, "/** xxx [a] yyy [b] zzz */", 3)];
     List<CommentReference> references = ParserTestCase.parse("parseCommentReferences", <Object> [tokens], "");
-    EngineTestCase.assertSizeOfList(2, references);
+    expect(references, hasLength(2));
     CommentReference reference = references[0];
-    JUnitTestCase.assertNotNull(reference);
-    JUnitTestCase.assertNotNull(reference.identifier);
-    JUnitTestCase.assertEquals(12, reference.offset);
+    expect(reference, isNotNull);
+    expect(reference.identifier, isNotNull);
+    expect(reference.offset, 12);
     reference = references[1];
-    JUnitTestCase.assertNotNull(reference);
-    JUnitTestCase.assertNotNull(reference.identifier);
-    JUnitTestCase.assertEquals(20, reference.offset);
+    expect(reference, isNotNull);
+    expect(reference.identifier, isNotNull);
+    expect(reference.offset, 20);
   }
 
   void test_parseCommentReferences_notClosed_noIdentifier() {
     List<Token> tokens = <Token> [new StringToken(TokenType.MULTI_LINE_COMMENT, "/** [ some text", 5)];
     List<CommentReference> references = ParserTestCase.parse("parseCommentReferences", <Object> [tokens], "");
-    EngineTestCase.assertSizeOfList(1, references);
+    expect(references, hasLength(1));
     CommentReference reference = references[0];
-    JUnitTestCase.assertNotNull(reference);
-    JUnitTestCase.assertNotNull(reference.identifier);
-    JUnitTestCase.assertTrue(reference.identifier.isSynthetic);
-    JUnitTestCase.assertEquals("", reference.identifier.name);
+    expect(reference, isNotNull);
+    expect(reference.identifier, isNotNull);
+    expect(reference.identifier.isSynthetic, isTrue);
+    expect(reference.identifier.name, "");
   }
 
   void test_parseCommentReferences_notClosed_withIdentifier() {
     List<Token> tokens = <Token> [new StringToken(TokenType.MULTI_LINE_COMMENT, "/** [namePrefix some text", 5)];
     List<CommentReference> references = ParserTestCase.parse("parseCommentReferences", <Object> [tokens], "");
-    EngineTestCase.assertSizeOfList(1, references);
+    expect(references, hasLength(1));
     CommentReference reference = references[0];
-    JUnitTestCase.assertNotNull(reference);
-    JUnitTestCase.assertNotNull(reference.identifier);
-    JUnitTestCase.assertFalse(reference.identifier.isSynthetic);
-    JUnitTestCase.assertEquals("namePrefix", reference.identifier.name);
+    expect(reference, isNotNull);
+    expect(reference.identifier, isNotNull);
+    expect(reference.identifier.isSynthetic, isFalse);
+    expect(reference.identifier.name, "namePrefix");
   }
 
   void test_parseCommentReferences_singleLine() {
@@ -4807,76 +4823,76 @@
         new StringToken(TokenType.SINGLE_LINE_COMMENT, "/// xxx [a] yyy [b] zzz", 3),
         new StringToken(TokenType.SINGLE_LINE_COMMENT, "/// x [c]", 28)];
     List<CommentReference> references = ParserTestCase.parse("parseCommentReferences", <Object> [tokens], "");
-    EngineTestCase.assertSizeOfList(3, references);
+    expect(references, hasLength(3));
     CommentReference reference = references[0];
-    JUnitTestCase.assertNotNull(reference);
-    JUnitTestCase.assertNotNull(reference.identifier);
-    JUnitTestCase.assertEquals(12, reference.offset);
+    expect(reference, isNotNull);
+    expect(reference.identifier, isNotNull);
+    expect(reference.offset, 12);
     reference = references[1];
-    JUnitTestCase.assertNotNull(reference);
-    JUnitTestCase.assertNotNull(reference.identifier);
-    JUnitTestCase.assertEquals(20, reference.offset);
+    expect(reference, isNotNull);
+    expect(reference.identifier, isNotNull);
+    expect(reference.offset, 20);
     reference = references[2];
-    JUnitTestCase.assertNotNull(reference);
-    JUnitTestCase.assertNotNull(reference.identifier);
-    JUnitTestCase.assertEquals(35, reference.offset);
+    expect(reference, isNotNull);
+    expect(reference.identifier, isNotNull);
+    expect(reference.offset, 35);
   }
 
   void test_parseCommentReferences_skipCodeBlock_bracketed() {
     List<Token> tokens = <Token> [new StringToken(TokenType.MULTI_LINE_COMMENT, "/** [:xxx [a] yyy:] [b] zzz */", 3)];
     List<CommentReference> references = ParserTestCase.parse("parseCommentReferences", <Object> [tokens], "");
-    EngineTestCase.assertSizeOfList(1, references);
+    expect(references, hasLength(1));
     CommentReference reference = references[0];
-    JUnitTestCase.assertNotNull(reference);
-    JUnitTestCase.assertNotNull(reference.identifier);
-    JUnitTestCase.assertEquals(24, reference.offset);
+    expect(reference, isNotNull);
+    expect(reference.identifier, isNotNull);
+    expect(reference.offset, 24);
   }
 
   void test_parseCommentReferences_skipCodeBlock_spaces() {
     List<Token> tokens = <Token> [new StringToken(TokenType.MULTI_LINE_COMMENT, "/**\n *     a[i]\n * xxx [i] zzz\n */", 3)];
     List<CommentReference> references = ParserTestCase.parse("parseCommentReferences", <Object> [tokens], "");
-    EngineTestCase.assertSizeOfList(1, references);
+    expect(references, hasLength(1));
     CommentReference reference = references[0];
-    JUnitTestCase.assertNotNull(reference);
-    JUnitTestCase.assertNotNull(reference.identifier);
-    JUnitTestCase.assertEquals(27, reference.offset);
+    expect(reference, isNotNull);
+    expect(reference.identifier, isNotNull);
+    expect(reference.offset, 27);
   }
 
   void test_parseCommentReferences_skipLinkDefinition() {
     List<Token> tokens = <Token> [new StringToken(TokenType.MULTI_LINE_COMMENT, "/** [a]: http://www.google.com (Google) [b] zzz */", 3)];
     List<CommentReference> references = ParserTestCase.parse("parseCommentReferences", <Object> [tokens], "");
-    EngineTestCase.assertSizeOfList(1, references);
+    expect(references, hasLength(1));
     CommentReference reference = references[0];
-    JUnitTestCase.assertNotNull(reference);
-    JUnitTestCase.assertNotNull(reference.identifier);
-    JUnitTestCase.assertEquals(44, reference.offset);
+    expect(reference, isNotNull);
+    expect(reference.identifier, isNotNull);
+    expect(reference.offset, 44);
   }
 
   void test_parseCommentReferences_skipLinked() {
     List<Token> tokens = <Token> [new StringToken(TokenType.MULTI_LINE_COMMENT, "/** [a](http://www.google.com) [b] zzz */", 3)];
     List<CommentReference> references = ParserTestCase.parse("parseCommentReferences", <Object> [tokens], "");
-    EngineTestCase.assertSizeOfList(1, references);
+    expect(references, hasLength(1));
     CommentReference reference = references[0];
-    JUnitTestCase.assertNotNull(reference);
-    JUnitTestCase.assertNotNull(reference.identifier);
-    JUnitTestCase.assertEquals(35, reference.offset);
+    expect(reference, isNotNull);
+    expect(reference.identifier, isNotNull);
+    expect(reference.offset, 35);
   }
 
   void test_parseCommentReferences_skipReferenceLink() {
     List<Token> tokens = <Token> [new StringToken(TokenType.MULTI_LINE_COMMENT, "/** [a][c] [b] zzz */", 3)];
     List<CommentReference> references = ParserTestCase.parse("parseCommentReferences", <Object> [tokens], "");
-    EngineTestCase.assertSizeOfList(1, references);
+    expect(references, hasLength(1));
     CommentReference reference = references[0];
-    JUnitTestCase.assertNotNull(reference);
-    JUnitTestCase.assertNotNull(reference.identifier);
-    JUnitTestCase.assertEquals(15, reference.offset);
+    expect(reference, isNotNull);
+    expect(reference.identifier, isNotNull);
+    expect(reference.offset, 15);
   }
 
   void test_parseCompilationUnit_abstractAsPrefix_parameterized() {
     CompilationUnit unit = ParserTestCase.parse4("parseCompilationUnit", "abstract<dynamic> _abstract = new abstract.A();", []);
-    JUnitTestCase.assertNull(unit.scriptTag);
-    EngineTestCase.assertSizeOfList(0, unit.directives);
-    EngineTestCase.assertSizeOfList(1, unit.declarations);
+    expect(unit.scriptTag, isNull);
+    expect(unit.directives, hasLength(0));
+    expect(unit.declarations, hasLength(1));
   }
 
   void test_parseCompilationUnit_builtIn_asFunctionName() {
@@ -4899,316 +4915,316 @@
 
   void test_parseCompilationUnit_directives_multiple() {
     CompilationUnit unit = ParserTestCase.parse4("parseCompilationUnit", "library l;\npart 'a.dart';", []);
-    JUnitTestCase.assertNull(unit.scriptTag);
-    EngineTestCase.assertSizeOfList(2, unit.directives);
-    EngineTestCase.assertSizeOfList(0, unit.declarations);
+    expect(unit.scriptTag, isNull);
+    expect(unit.directives, hasLength(2));
+    expect(unit.declarations, hasLength(0));
   }
 
   void test_parseCompilationUnit_directives_single() {
     CompilationUnit unit = ParserTestCase.parse4("parseCompilationUnit", "library l;", []);
-    JUnitTestCase.assertNull(unit.scriptTag);
-    EngineTestCase.assertSizeOfList(1, unit.directives);
-    EngineTestCase.assertSizeOfList(0, unit.declarations);
+    expect(unit.scriptTag, isNull);
+    expect(unit.directives, hasLength(1));
+    expect(unit.declarations, hasLength(0));
   }
 
   void test_parseCompilationUnit_empty() {
     CompilationUnit unit = ParserTestCase.parse4("parseCompilationUnit", "", []);
-    JUnitTestCase.assertNull(unit.scriptTag);
-    EngineTestCase.assertSizeOfList(0, unit.directives);
-    EngineTestCase.assertSizeOfList(0, unit.declarations);
+    expect(unit.scriptTag, isNull);
+    expect(unit.directives, hasLength(0));
+    expect(unit.declarations, hasLength(0));
   }
 
   void test_parseCompilationUnit_exportAsPrefix() {
     CompilationUnit unit = ParserTestCase.parse4("parseCompilationUnit", "export.A _export = new export.A();", []);
-    JUnitTestCase.assertNull(unit.scriptTag);
-    EngineTestCase.assertSizeOfList(0, unit.directives);
-    EngineTestCase.assertSizeOfList(1, unit.declarations);
+    expect(unit.scriptTag, isNull);
+    expect(unit.directives, hasLength(0));
+    expect(unit.declarations, hasLength(1));
   }
 
   void test_parseCompilationUnit_exportAsPrefix_parameterized() {
     CompilationUnit unit = ParserTestCase.parse4("parseCompilationUnit", "export<dynamic> _export = new export.A();", []);
-    JUnitTestCase.assertNull(unit.scriptTag);
-    EngineTestCase.assertSizeOfList(0, unit.directives);
-    EngineTestCase.assertSizeOfList(1, unit.declarations);
+    expect(unit.scriptTag, isNull);
+    expect(unit.directives, hasLength(0));
+    expect(unit.declarations, hasLength(1));
   }
 
   void test_parseCompilationUnit_operatorAsPrefix_parameterized() {
     CompilationUnit unit = ParserTestCase.parse4("parseCompilationUnit", "operator<dynamic> _operator = new operator.A();", []);
-    JUnitTestCase.assertNull(unit.scriptTag);
-    EngineTestCase.assertSizeOfList(0, unit.directives);
-    EngineTestCase.assertSizeOfList(1, unit.declarations);
+    expect(unit.scriptTag, isNull);
+    expect(unit.directives, hasLength(0));
+    expect(unit.declarations, hasLength(1));
   }
 
   void test_parseCompilationUnit_script() {
     CompilationUnit unit = ParserTestCase.parse4("parseCompilationUnit", "#! /bin/dart", []);
-    JUnitTestCase.assertNotNull(unit.scriptTag);
-    EngineTestCase.assertSizeOfList(0, unit.directives);
-    EngineTestCase.assertSizeOfList(0, unit.declarations);
+    expect(unit.scriptTag, isNotNull);
+    expect(unit.directives, hasLength(0));
+    expect(unit.declarations, hasLength(0));
   }
 
   void test_parseCompilationUnit_skipFunctionBody_withInterpolation() {
     ParserTestCase.parseFunctionBodies = false;
     CompilationUnit unit = ParserTestCase.parse4("parseCompilationUnit", "f() { '\${n}'; }", []);
-    JUnitTestCase.assertNull(unit.scriptTag);
-    EngineTestCase.assertSizeOfList(1, unit.declarations);
+    expect(unit.scriptTag, isNull);
+    expect(unit.declarations, hasLength(1));
   }
 
   void test_parseCompilationUnit_topLevelDeclaration() {
     CompilationUnit unit = ParserTestCase.parse4("parseCompilationUnit", "class A {}", []);
-    JUnitTestCase.assertNull(unit.scriptTag);
-    EngineTestCase.assertSizeOfList(0, unit.directives);
-    EngineTestCase.assertSizeOfList(1, unit.declarations);
+    expect(unit.scriptTag, isNull);
+    expect(unit.directives, hasLength(0));
+    expect(unit.declarations, hasLength(1));
   }
 
   void test_parseCompilationUnit_typedefAsPrefix() {
     CompilationUnit unit = ParserTestCase.parse4("parseCompilationUnit", "typedef.A _typedef = new typedef.A();", []);
-    JUnitTestCase.assertNull(unit.scriptTag);
-    EngineTestCase.assertSizeOfList(0, unit.directives);
-    EngineTestCase.assertSizeOfList(1, unit.declarations);
+    expect(unit.scriptTag, isNull);
+    expect(unit.directives, hasLength(0));
+    expect(unit.declarations, hasLength(1));
   }
 
   void test_parseCompilationUnitMember_abstractAsPrefix() {
     TopLevelVariableDeclaration declaration = ParserTestCase.parse("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "abstract.A _abstract = new abstract.A();");
-    JUnitTestCase.assertNotNull(declaration.semicolon);
-    JUnitTestCase.assertNotNull(declaration.variables);
+    expect(declaration.semicolon, isNotNull);
+    expect(declaration.variables, isNotNull);
   }
 
   void test_parseCompilationUnitMember_class() {
     ClassDeclaration declaration = ParserTestCase.parse("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "class A {}");
-    JUnitTestCase.assertEquals("A", declaration.name.name);
-    EngineTestCase.assertSizeOfList(0, declaration.members);
+    expect(declaration.name.name, "A");
+    expect(declaration.members, hasLength(0));
   }
 
   void test_parseCompilationUnitMember_classTypeAlias() {
     ClassTypeAlias alias = ParserTestCase.parse("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "abstract class A = B with C;");
-    JUnitTestCase.assertEquals("A", alias.name.name);
-    JUnitTestCase.assertNotNull(alias.abstractKeyword);
+    expect(alias.name.name, "A");
+    expect(alias.abstractKeyword, isNotNull);
   }
 
   void test_parseCompilationUnitMember_constVariable() {
     TopLevelVariableDeclaration declaration = ParserTestCase.parse("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "const int x = 0;");
-    JUnitTestCase.assertNotNull(declaration.semicolon);
-    JUnitTestCase.assertNotNull(declaration.variables);
+    expect(declaration.semicolon, isNotNull);
+    expect(declaration.variables, isNotNull);
   }
 
   void test_parseCompilationUnitMember_finalVariable() {
     TopLevelVariableDeclaration declaration = ParserTestCase.parse("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "final x = 0;");
-    JUnitTestCase.assertNotNull(declaration.semicolon);
-    JUnitTestCase.assertNotNull(declaration.variables);
+    expect(declaration.semicolon, isNotNull);
+    expect(declaration.variables, isNotNull);
   }
 
   void test_parseCompilationUnitMember_function_external_noType() {
     FunctionDeclaration declaration = ParserTestCase.parse("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "external f();");
-    JUnitTestCase.assertNotNull(declaration.externalKeyword);
-    JUnitTestCase.assertNotNull(declaration.functionExpression);
-    JUnitTestCase.assertNull(declaration.propertyKeyword);
+    expect(declaration.externalKeyword, isNotNull);
+    expect(declaration.functionExpression, isNotNull);
+    expect(declaration.propertyKeyword, isNull);
   }
 
   void test_parseCompilationUnitMember_function_external_type() {
     FunctionDeclaration declaration = ParserTestCase.parse("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "external int f();");
-    JUnitTestCase.assertNotNull(declaration.externalKeyword);
-    JUnitTestCase.assertNotNull(declaration.functionExpression);
-    JUnitTestCase.assertNull(declaration.propertyKeyword);
+    expect(declaration.externalKeyword, isNotNull);
+    expect(declaration.functionExpression, isNotNull);
+    expect(declaration.propertyKeyword, isNull);
   }
 
   void test_parseCompilationUnitMember_function_noType() {
     FunctionDeclaration declaration = ParserTestCase.parse("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "f() {}");
-    JUnitTestCase.assertNotNull(declaration.functionExpression);
-    JUnitTestCase.assertNull(declaration.propertyKeyword);
+    expect(declaration.functionExpression, isNotNull);
+    expect(declaration.propertyKeyword, isNull);
   }
 
   void test_parseCompilationUnitMember_function_type() {
     FunctionDeclaration declaration = ParserTestCase.parse("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "int f() {}");
-    JUnitTestCase.assertNotNull(declaration.functionExpression);
-    JUnitTestCase.assertNull(declaration.propertyKeyword);
+    expect(declaration.functionExpression, isNotNull);
+    expect(declaration.propertyKeyword, isNull);
   }
 
   void test_parseCompilationUnitMember_function_void() {
     FunctionDeclaration declaration = ParserTestCase.parse("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "void f() {}");
-    JUnitTestCase.assertNotNull(declaration.returnType);
+    expect(declaration.returnType, isNotNull);
   }
 
   void test_parseCompilationUnitMember_getter_external_noType() {
     FunctionDeclaration declaration = ParserTestCase.parse("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "external get p;");
-    JUnitTestCase.assertNotNull(declaration.externalKeyword);
-    JUnitTestCase.assertNotNull(declaration.functionExpression);
-    JUnitTestCase.assertNotNull(declaration.propertyKeyword);
+    expect(declaration.externalKeyword, isNotNull);
+    expect(declaration.functionExpression, isNotNull);
+    expect(declaration.propertyKeyword, isNotNull);
   }
 
   void test_parseCompilationUnitMember_getter_external_type() {
     FunctionDeclaration declaration = ParserTestCase.parse("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "external int get p;");
-    JUnitTestCase.assertNotNull(declaration.externalKeyword);
-    JUnitTestCase.assertNotNull(declaration.functionExpression);
-    JUnitTestCase.assertNotNull(declaration.propertyKeyword);
+    expect(declaration.externalKeyword, isNotNull);
+    expect(declaration.functionExpression, isNotNull);
+    expect(declaration.propertyKeyword, isNotNull);
   }
 
   void test_parseCompilationUnitMember_getter_noType() {
     FunctionDeclaration declaration = ParserTestCase.parse("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "get p => 0;");
-    JUnitTestCase.assertNotNull(declaration.functionExpression);
-    JUnitTestCase.assertNotNull(declaration.propertyKeyword);
+    expect(declaration.functionExpression, isNotNull);
+    expect(declaration.propertyKeyword, isNotNull);
   }
 
   void test_parseCompilationUnitMember_getter_type() {
     FunctionDeclaration declaration = ParserTestCase.parse("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "int get p => 0;");
-    JUnitTestCase.assertNotNull(declaration.functionExpression);
-    JUnitTestCase.assertNotNull(declaration.propertyKeyword);
+    expect(declaration.functionExpression, isNotNull);
+    expect(declaration.propertyKeyword, isNotNull);
   }
 
   void test_parseCompilationUnitMember_setter_external_noType() {
     FunctionDeclaration declaration = ParserTestCase.parse("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "external set p(v);");
-    JUnitTestCase.assertNotNull(declaration.externalKeyword);
-    JUnitTestCase.assertNotNull(declaration.functionExpression);
-    JUnitTestCase.assertNotNull(declaration.propertyKeyword);
+    expect(declaration.externalKeyword, isNotNull);
+    expect(declaration.functionExpression, isNotNull);
+    expect(declaration.propertyKeyword, isNotNull);
   }
 
   void test_parseCompilationUnitMember_setter_external_type() {
     FunctionDeclaration declaration = ParserTestCase.parse("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "external void set p(int v);");
-    JUnitTestCase.assertNotNull(declaration.externalKeyword);
-    JUnitTestCase.assertNotNull(declaration.functionExpression);
-    JUnitTestCase.assertNotNull(declaration.propertyKeyword);
+    expect(declaration.externalKeyword, isNotNull);
+    expect(declaration.functionExpression, isNotNull);
+    expect(declaration.propertyKeyword, isNotNull);
   }
 
   void test_parseCompilationUnitMember_setter_noType() {
     FunctionDeclaration declaration = ParserTestCase.parse("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "set p(v) {}");
-    JUnitTestCase.assertNotNull(declaration.functionExpression);
-    JUnitTestCase.assertNotNull(declaration.propertyKeyword);
+    expect(declaration.functionExpression, isNotNull);
+    expect(declaration.propertyKeyword, isNotNull);
   }
 
   void test_parseCompilationUnitMember_setter_type() {
     FunctionDeclaration declaration = ParserTestCase.parse("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "void set p(int v) {}");
-    JUnitTestCase.assertNotNull(declaration.functionExpression);
-    JUnitTestCase.assertNotNull(declaration.propertyKeyword);
-    JUnitTestCase.assertNotNull(declaration.returnType);
+    expect(declaration.functionExpression, isNotNull);
+    expect(declaration.propertyKeyword, isNotNull);
+    expect(declaration.returnType, isNotNull);
   }
 
   void test_parseCompilationUnitMember_typeAlias_abstract() {
     ClassTypeAlias typeAlias = ParserTestCase.parse("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "abstract class C = S with M;");
-    JUnitTestCase.assertNotNull(typeAlias.keyword);
-    JUnitTestCase.assertEquals("C", typeAlias.name.name);
-    JUnitTestCase.assertNull(typeAlias.typeParameters);
-    JUnitTestCase.assertNotNull(typeAlias.equals);
-    JUnitTestCase.assertNotNull(typeAlias.abstractKeyword);
-    JUnitTestCase.assertEquals("S", typeAlias.superclass.name.name);
-    JUnitTestCase.assertNotNull(typeAlias.withClause);
-    JUnitTestCase.assertNull(typeAlias.implementsClause);
-    JUnitTestCase.assertNotNull(typeAlias.semicolon);
+    expect(typeAlias.keyword, isNotNull);
+    expect(typeAlias.name.name, "C");
+    expect(typeAlias.typeParameters, isNull);
+    expect(typeAlias.equals, isNotNull);
+    expect(typeAlias.abstractKeyword, isNotNull);
+    expect(typeAlias.superclass.name.name, "S");
+    expect(typeAlias.withClause, isNotNull);
+    expect(typeAlias.implementsClause, isNull);
+    expect(typeAlias.semicolon, isNotNull);
   }
 
   void test_parseCompilationUnitMember_typeAlias_generic() {
     ClassTypeAlias typeAlias = ParserTestCase.parse("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "class C<E> = S<E> with M<E> implements I<E>;");
-    JUnitTestCase.assertNotNull(typeAlias.keyword);
-    JUnitTestCase.assertEquals("C", typeAlias.name.name);
-    EngineTestCase.assertSizeOfList(1, typeAlias.typeParameters.typeParameters);
-    JUnitTestCase.assertNotNull(typeAlias.equals);
-    JUnitTestCase.assertNull(typeAlias.abstractKeyword);
-    JUnitTestCase.assertEquals("S", typeAlias.superclass.name.name);
-    JUnitTestCase.assertNotNull(typeAlias.withClause);
-    JUnitTestCase.assertNotNull(typeAlias.implementsClause);
-    JUnitTestCase.assertNotNull(typeAlias.semicolon);
+    expect(typeAlias.keyword, isNotNull);
+    expect(typeAlias.name.name, "C");
+    expect(typeAlias.typeParameters.typeParameters, hasLength(1));
+    expect(typeAlias.equals, isNotNull);
+    expect(typeAlias.abstractKeyword, isNull);
+    expect(typeAlias.superclass.name.name, "S");
+    expect(typeAlias.withClause, isNotNull);
+    expect(typeAlias.implementsClause, isNotNull);
+    expect(typeAlias.semicolon, isNotNull);
   }
 
   void test_parseCompilationUnitMember_typeAlias_implements() {
     ClassTypeAlias typeAlias = ParserTestCase.parse("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "class C = S with M implements I;");
-    JUnitTestCase.assertNotNull(typeAlias.keyword);
-    JUnitTestCase.assertEquals("C", typeAlias.name.name);
-    JUnitTestCase.assertNull(typeAlias.typeParameters);
-    JUnitTestCase.assertNotNull(typeAlias.equals);
-    JUnitTestCase.assertNull(typeAlias.abstractKeyword);
-    JUnitTestCase.assertEquals("S", typeAlias.superclass.name.name);
-    JUnitTestCase.assertNotNull(typeAlias.withClause);
-    JUnitTestCase.assertNotNull(typeAlias.implementsClause);
-    JUnitTestCase.assertNotNull(typeAlias.semicolon);
+    expect(typeAlias.keyword, isNotNull);
+    expect(typeAlias.name.name, "C");
+    expect(typeAlias.typeParameters, isNull);
+    expect(typeAlias.equals, isNotNull);
+    expect(typeAlias.abstractKeyword, isNull);
+    expect(typeAlias.superclass.name.name, "S");
+    expect(typeAlias.withClause, isNotNull);
+    expect(typeAlias.implementsClause, isNotNull);
+    expect(typeAlias.semicolon, isNotNull);
   }
 
   void test_parseCompilationUnitMember_typeAlias_noImplements() {
     ClassTypeAlias typeAlias = ParserTestCase.parse("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "class C = S with M;");
-    JUnitTestCase.assertNotNull(typeAlias.keyword);
-    JUnitTestCase.assertEquals("C", typeAlias.name.name);
-    JUnitTestCase.assertNull(typeAlias.typeParameters);
-    JUnitTestCase.assertNotNull(typeAlias.equals);
-    JUnitTestCase.assertNull(typeAlias.abstractKeyword);
-    JUnitTestCase.assertEquals("S", typeAlias.superclass.name.name);
-    JUnitTestCase.assertNotNull(typeAlias.withClause);
-    JUnitTestCase.assertNull(typeAlias.implementsClause);
-    JUnitTestCase.assertNotNull(typeAlias.semicolon);
+    expect(typeAlias.keyword, isNotNull);
+    expect(typeAlias.name.name, "C");
+    expect(typeAlias.typeParameters, isNull);
+    expect(typeAlias.equals, isNotNull);
+    expect(typeAlias.abstractKeyword, isNull);
+    expect(typeAlias.superclass.name.name, "S");
+    expect(typeAlias.withClause, isNotNull);
+    expect(typeAlias.implementsClause, isNull);
+    expect(typeAlias.semicolon, isNotNull);
   }
 
   void test_parseCompilationUnitMember_typedef() {
     FunctionTypeAlias typeAlias = ParserTestCase.parse("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "typedef F();");
-    JUnitTestCase.assertEquals("F", typeAlias.name.name);
-    EngineTestCase.assertSizeOfList(0, typeAlias.parameters.parameters);
+    expect(typeAlias.name.name, "F");
+    expect(typeAlias.parameters.parameters, hasLength(0));
   }
 
   void test_parseCompilationUnitMember_variable() {
     TopLevelVariableDeclaration declaration = ParserTestCase.parse("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "var x = 0;");
-    JUnitTestCase.assertNotNull(declaration.semicolon);
-    JUnitTestCase.assertNotNull(declaration.variables);
+    expect(declaration.semicolon, isNotNull);
+    expect(declaration.variables, isNotNull);
   }
 
   void test_parseCompilationUnitMember_variableGet() {
     TopLevelVariableDeclaration declaration = ParserTestCase.parse("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "String get = null;");
-    JUnitTestCase.assertNotNull(declaration.semicolon);
-    JUnitTestCase.assertNotNull(declaration.variables);
+    expect(declaration.semicolon, isNotNull);
+    expect(declaration.variables, isNotNull);
   }
 
   void test_parseCompilationUnitMember_variableSet() {
     TopLevelVariableDeclaration declaration = ParserTestCase.parse("parseCompilationUnitMember", <Object> [emptyCommentAndMetadata()], "String set = null;");
-    JUnitTestCase.assertNotNull(declaration.semicolon);
-    JUnitTestCase.assertNotNull(declaration.variables);
+    expect(declaration.semicolon, isNotNull);
+    expect(declaration.variables, isNotNull);
   }
 
   void test_parseConditionalExpression() {
     ConditionalExpression expression = ParserTestCase.parse4("parseConditionalExpression", "x ? y : z", []);
-    JUnitTestCase.assertNotNull(expression.condition);
-    JUnitTestCase.assertNotNull(expression.question);
-    JUnitTestCase.assertNotNull(expression.thenExpression);
-    JUnitTestCase.assertNotNull(expression.colon);
-    JUnitTestCase.assertNotNull(expression.elseExpression);
+    expect(expression.condition, isNotNull);
+    expect(expression.question, isNotNull);
+    expect(expression.thenExpression, isNotNull);
+    expect(expression.colon, isNotNull);
+    expect(expression.elseExpression, isNotNull);
   }
 
   void test_parseConstExpression_instanceCreation() {
     InstanceCreationExpression expression = ParserTestCase.parse4("parseConstExpression", "const A()", []);
-    JUnitTestCase.assertNotNull(expression.keyword);
+    expect(expression.keyword, isNotNull);
     ConstructorName name = expression.constructorName;
-    JUnitTestCase.assertNotNull(name);
-    JUnitTestCase.assertNotNull(name.type);
-    JUnitTestCase.assertNull(name.period);
-    JUnitTestCase.assertNull(name.name);
-    JUnitTestCase.assertNotNull(expression.argumentList);
+    expect(name, isNotNull);
+    expect(name.type, isNotNull);
+    expect(name.period, isNull);
+    expect(name.name, isNull);
+    expect(expression.argumentList, isNotNull);
   }
 
   void test_parseConstExpression_listLiteral_typed() {
     ListLiteral literal = ParserTestCase.parse4("parseConstExpression", "const <A> []", []);
-    JUnitTestCase.assertNotNull(literal.constKeyword);
-    JUnitTestCase.assertNotNull(literal.typeArguments);
-    JUnitTestCase.assertNotNull(literal.leftBracket);
-    EngineTestCase.assertSizeOfList(0, literal.elements);
-    JUnitTestCase.assertNotNull(literal.rightBracket);
+    expect(literal.constKeyword, isNotNull);
+    expect(literal.typeArguments, isNotNull);
+    expect(literal.leftBracket, isNotNull);
+    expect(literal.elements, hasLength(0));
+    expect(literal.rightBracket, isNotNull);
   }
 
   void test_parseConstExpression_listLiteral_untyped() {
     ListLiteral literal = ParserTestCase.parse4("parseConstExpression", "const []", []);
-    JUnitTestCase.assertNotNull(literal.constKeyword);
-    JUnitTestCase.assertNull(literal.typeArguments);
-    JUnitTestCase.assertNotNull(literal.leftBracket);
-    EngineTestCase.assertSizeOfList(0, literal.elements);
-    JUnitTestCase.assertNotNull(literal.rightBracket);
+    expect(literal.constKeyword, isNotNull);
+    expect(literal.typeArguments, isNull);
+    expect(literal.leftBracket, isNotNull);
+    expect(literal.elements, hasLength(0));
+    expect(literal.rightBracket, isNotNull);
   }
 
   void test_parseConstExpression_mapLiteral_typed() {
     MapLiteral literal = ParserTestCase.parse4("parseConstExpression", "const <A, B> {}", []);
-    JUnitTestCase.assertNotNull(literal.leftBracket);
-    EngineTestCase.assertSizeOfList(0, literal.entries);
-    JUnitTestCase.assertNotNull(literal.rightBracket);
-    JUnitTestCase.assertNotNull(literal.typeArguments);
+    expect(literal.leftBracket, isNotNull);
+    expect(literal.entries, hasLength(0));
+    expect(literal.rightBracket, isNotNull);
+    expect(literal.typeArguments, isNotNull);
   }
 
   void test_parseConstExpression_mapLiteral_untyped() {
     MapLiteral literal = ParserTestCase.parse4("parseConstExpression", "const {}", []);
-    JUnitTestCase.assertNotNull(literal.leftBracket);
-    EngineTestCase.assertSizeOfList(0, literal.entries);
-    JUnitTestCase.assertNotNull(literal.rightBracket);
-    JUnitTestCase.assertNull(literal.typeArguments);
+    expect(literal.leftBracket, isNotNull);
+    expect(literal.entries, hasLength(0));
+    expect(literal.rightBracket, isNotNull);
+    expect(literal.typeArguments, isNull);
   }
 
   void test_parseConstructor() {
@@ -5225,7 +5241,7 @@
     EngineTestCase.assertInstanceOf((obj) => obj is ConstructorDeclaration, ConstructorDeclaration, classMember);
     ConstructorDeclaration constructor = classMember as ConstructorDeclaration;
     NodeList<ConstructorInitializer> initializers = constructor.initializers;
-    EngineTestCase.assertSizeOfList(1, initializers);
+    expect(initializers, hasLength(1));
     ConstructorInitializer initializer = initializers[0];
     EngineTestCase.assertInstanceOf((obj) => obj is ConstructorFieldInitializer, ConstructorFieldInitializer, initializer);
     EngineTestCase.assertInstanceOf((obj) => obj is ParenthesizedExpression, ParenthesizedExpression, (initializer as ConstructorFieldInitializer).expression);
@@ -5234,942 +5250,942 @@
 
   void test_parseConstructorFieldInitializer_qualified() {
     ConstructorFieldInitializer invocation = ParserTestCase.parse4("parseConstructorFieldInitializer", "this.a = b", []);
-    JUnitTestCase.assertNotNull(invocation.equals);
-    JUnitTestCase.assertNotNull(invocation.expression);
-    JUnitTestCase.assertNotNull(invocation.fieldName);
-    JUnitTestCase.assertNotNull(invocation.keyword);
-    JUnitTestCase.assertNotNull(invocation.period);
+    expect(invocation.equals, isNotNull);
+    expect(invocation.expression, isNotNull);
+    expect(invocation.fieldName, isNotNull);
+    expect(invocation.keyword, isNotNull);
+    expect(invocation.period, isNotNull);
   }
 
   void test_parseConstructorFieldInitializer_unqualified() {
     ConstructorFieldInitializer invocation = ParserTestCase.parse4("parseConstructorFieldInitializer", "a = b", []);
-    JUnitTestCase.assertNotNull(invocation.equals);
-    JUnitTestCase.assertNotNull(invocation.expression);
-    JUnitTestCase.assertNotNull(invocation.fieldName);
-    JUnitTestCase.assertNull(invocation.keyword);
-    JUnitTestCase.assertNull(invocation.period);
+    expect(invocation.equals, isNotNull);
+    expect(invocation.expression, isNotNull);
+    expect(invocation.fieldName, isNotNull);
+    expect(invocation.keyword, isNull);
+    expect(invocation.period, isNull);
   }
 
   void test_parseConstructorName_named_noPrefix() {
     ConstructorName name = ParserTestCase.parse4("parseConstructorName", "A.n;", []);
-    JUnitTestCase.assertNotNull(name.type);
-    JUnitTestCase.assertNull(name.period);
-    JUnitTestCase.assertNull(name.name);
+    expect(name.type, isNotNull);
+    expect(name.period, isNull);
+    expect(name.name, isNull);
   }
 
   void test_parseConstructorName_named_prefixed() {
     ConstructorName name = ParserTestCase.parse4("parseConstructorName", "p.A.n;", []);
-    JUnitTestCase.assertNotNull(name.type);
-    JUnitTestCase.assertNotNull(name.period);
-    JUnitTestCase.assertNotNull(name.name);
+    expect(name.type, isNotNull);
+    expect(name.period, isNotNull);
+    expect(name.name, isNotNull);
   }
 
   void test_parseConstructorName_unnamed_noPrefix() {
     ConstructorName name = ParserTestCase.parse4("parseConstructorName", "A;", []);
-    JUnitTestCase.assertNotNull(name.type);
-    JUnitTestCase.assertNull(name.period);
-    JUnitTestCase.assertNull(name.name);
+    expect(name.type, isNotNull);
+    expect(name.period, isNull);
+    expect(name.name, isNull);
   }
 
   void test_parseConstructorName_unnamed_prefixed() {
     ConstructorName name = ParserTestCase.parse4("parseConstructorName", "p.A;", []);
-    JUnitTestCase.assertNotNull(name.type);
-    JUnitTestCase.assertNull(name.period);
-    JUnitTestCase.assertNull(name.name);
+    expect(name.type, isNotNull);
+    expect(name.period, isNull);
+    expect(name.name, isNull);
   }
 
   void test_parseContinueStatement_label() {
     ContinueStatement statement = ParserTestCase.parse4("parseContinueStatement", "continue foo;", [ParserErrorCode.CONTINUE_OUTSIDE_OF_LOOP]);
-    JUnitTestCase.assertNotNull(statement.keyword);
-    JUnitTestCase.assertNotNull(statement.label);
-    JUnitTestCase.assertNotNull(statement.semicolon);
+    expect(statement.keyword, isNotNull);
+    expect(statement.label, isNotNull);
+    expect(statement.semicolon, isNotNull);
   }
 
   void test_parseContinueStatement_noLabel() {
     ContinueStatement statement = ParserTestCase.parse4("parseContinueStatement", "continue;", [ParserErrorCode.CONTINUE_OUTSIDE_OF_LOOP]);
-    JUnitTestCase.assertNotNull(statement.keyword);
-    JUnitTestCase.assertNull(statement.label);
-    JUnitTestCase.assertNotNull(statement.semicolon);
+    expect(statement.keyword, isNotNull);
+    expect(statement.label, isNull);
+    expect(statement.semicolon, isNotNull);
   }
 
   void test_parseDirective_export() {
     ExportDirective directive = ParserTestCase.parse("parseDirective", <Object> [emptyCommentAndMetadata()], "export 'lib/lib.dart';");
-    JUnitTestCase.assertNotNull(directive.keyword);
-    JUnitTestCase.assertNotNull(directive.uri);
-    EngineTestCase.assertSizeOfList(0, directive.combinators);
-    JUnitTestCase.assertNotNull(directive.semicolon);
+    expect(directive.keyword, isNotNull);
+    expect(directive.uri, isNotNull);
+    expect(directive.combinators, hasLength(0));
+    expect(directive.semicolon, isNotNull);
   }
 
   void test_parseDirective_import() {
     ImportDirective directive = ParserTestCase.parse("parseDirective", <Object> [emptyCommentAndMetadata()], "import 'lib/lib.dart';");
-    JUnitTestCase.assertNotNull(directive.keyword);
-    JUnitTestCase.assertNotNull(directive.uri);
-    JUnitTestCase.assertNull(directive.asToken);
-    JUnitTestCase.assertNull(directive.prefix);
-    EngineTestCase.assertSizeOfList(0, directive.combinators);
-    JUnitTestCase.assertNotNull(directive.semicolon);
+    expect(directive.keyword, isNotNull);
+    expect(directive.uri, isNotNull);
+    expect(directive.asToken, isNull);
+    expect(directive.prefix, isNull);
+    expect(directive.combinators, hasLength(0));
+    expect(directive.semicolon, isNotNull);
   }
 
   void test_parseDirective_library() {
     LibraryDirective directive = ParserTestCase.parse("parseDirective", <Object> [emptyCommentAndMetadata()], "library l;");
-    JUnitTestCase.assertNotNull(directive.libraryToken);
-    JUnitTestCase.assertNotNull(directive.name);
-    JUnitTestCase.assertNotNull(directive.semicolon);
+    expect(directive.libraryToken, isNotNull);
+    expect(directive.name, isNotNull);
+    expect(directive.semicolon, isNotNull);
   }
 
   void test_parseDirective_part() {
     PartDirective directive = ParserTestCase.parse("parseDirective", <Object> [emptyCommentAndMetadata()], "part 'lib/lib.dart';");
-    JUnitTestCase.assertNotNull(directive.partToken);
-    JUnitTestCase.assertNotNull(directive.uri);
-    JUnitTestCase.assertNotNull(directive.semicolon);
+    expect(directive.partToken, isNotNull);
+    expect(directive.uri, isNotNull);
+    expect(directive.semicolon, isNotNull);
   }
 
   void test_parseDirective_partOf() {
     PartOfDirective directive = ParserTestCase.parse("parseDirective", <Object> [emptyCommentAndMetadata()], "part of l;");
-    JUnitTestCase.assertNotNull(directive.partToken);
-    JUnitTestCase.assertNotNull(directive.ofToken);
-    JUnitTestCase.assertNotNull(directive.libraryName);
-    JUnitTestCase.assertNotNull(directive.semicolon);
+    expect(directive.partToken, isNotNull);
+    expect(directive.ofToken, isNotNull);
+    expect(directive.libraryName, isNotNull);
+    expect(directive.semicolon, isNotNull);
   }
 
   void test_parseDirectives_complete() {
     CompilationUnit unit = _parseDirectives("#! /bin/dart\nlibrary l;\nclass A {}", []);
-    JUnitTestCase.assertNotNull(unit.scriptTag);
-    EngineTestCase.assertSizeOfList(1, unit.directives);
+    expect(unit.scriptTag, isNotNull);
+    expect(unit.directives, hasLength(1));
   }
 
   void test_parseDirectives_empty() {
     CompilationUnit unit = _parseDirectives("", []);
-    JUnitTestCase.assertNull(unit.scriptTag);
-    EngineTestCase.assertSizeOfList(0, unit.directives);
+    expect(unit.scriptTag, isNull);
+    expect(unit.directives, hasLength(0));
   }
 
   void test_parseDirectives_mixed() {
     CompilationUnit unit = _parseDirectives("library l; class A {} part 'foo.dart';", []);
-    JUnitTestCase.assertNull(unit.scriptTag);
-    EngineTestCase.assertSizeOfList(1, unit.directives);
+    expect(unit.scriptTag, isNull);
+    expect(unit.directives, hasLength(1));
   }
 
   void test_parseDirectives_multiple() {
     CompilationUnit unit = _parseDirectives("library l;\npart 'a.dart';", []);
-    JUnitTestCase.assertNull(unit.scriptTag);
-    EngineTestCase.assertSizeOfList(2, unit.directives);
+    expect(unit.scriptTag, isNull);
+    expect(unit.directives, hasLength(2));
   }
 
   void test_parseDirectives_script() {
     CompilationUnit unit = _parseDirectives("#! /bin/dart", []);
-    JUnitTestCase.assertNotNull(unit.scriptTag);
-    EngineTestCase.assertSizeOfList(0, unit.directives);
+    expect(unit.scriptTag, isNotNull);
+    expect(unit.directives, hasLength(0));
   }
 
   void test_parseDirectives_single() {
     CompilationUnit unit = _parseDirectives("library l;", []);
-    JUnitTestCase.assertNull(unit.scriptTag);
-    EngineTestCase.assertSizeOfList(1, unit.directives);
+    expect(unit.scriptTag, isNull);
+    expect(unit.directives, hasLength(1));
   }
 
   void test_parseDirectives_topLevelDeclaration() {
     CompilationUnit unit = _parseDirectives("class A {}", []);
-    JUnitTestCase.assertNull(unit.scriptTag);
-    EngineTestCase.assertSizeOfList(0, unit.directives);
+    expect(unit.scriptTag, isNull);
+    expect(unit.directives, hasLength(0));
   }
 
   void test_parseDocumentationComment_block() {
     Comment comment = ParserTestCase.parse4("parseDocumentationComment", "/** */ class", []);
-    JUnitTestCase.assertFalse(comment.isBlock);
-    JUnitTestCase.assertTrue(comment.isDocumentation);
-    JUnitTestCase.assertFalse(comment.isEndOfLine);
+    expect(comment.isBlock, isFalse);
+    expect(comment.isDocumentation, isTrue);
+    expect(comment.isEndOfLine, isFalse);
   }
 
   void test_parseDocumentationComment_block_withReference() {
     Comment comment = ParserTestCase.parse4("parseDocumentationComment", "/** [a] */ class", []);
-    JUnitTestCase.assertFalse(comment.isBlock);
-    JUnitTestCase.assertTrue(comment.isDocumentation);
-    JUnitTestCase.assertFalse(comment.isEndOfLine);
+    expect(comment.isBlock, isFalse);
+    expect(comment.isDocumentation, isTrue);
+    expect(comment.isEndOfLine, isFalse);
     NodeList<CommentReference> references = comment.references;
-    EngineTestCase.assertSizeOfList(1, references);
+    expect(references, hasLength(1));
     CommentReference reference = references[0];
-    JUnitTestCase.assertNotNull(reference);
-    JUnitTestCase.assertEquals(5, reference.offset);
+    expect(reference, isNotNull);
+    expect(reference.offset, 5);
   }
 
   void test_parseDocumentationComment_endOfLine() {
     Comment comment = ParserTestCase.parse4("parseDocumentationComment", "/// \n/// \n class", []);
-    JUnitTestCase.assertFalse(comment.isBlock);
-    JUnitTestCase.assertTrue(comment.isDocumentation);
-    JUnitTestCase.assertFalse(comment.isEndOfLine);
+    expect(comment.isBlock, isFalse);
+    expect(comment.isDocumentation, isTrue);
+    expect(comment.isEndOfLine, isFalse);
   }
 
   void test_parseDoStatement() {
     DoStatement statement = ParserTestCase.parse4("parseDoStatement", "do {} while (x);", []);
-    JUnitTestCase.assertNotNull(statement.doKeyword);
-    JUnitTestCase.assertNotNull(statement.body);
-    JUnitTestCase.assertNotNull(statement.whileKeyword);
-    JUnitTestCase.assertNotNull(statement.leftParenthesis);
-    JUnitTestCase.assertNotNull(statement.condition);
-    JUnitTestCase.assertNotNull(statement.rightParenthesis);
-    JUnitTestCase.assertNotNull(statement.semicolon);
+    expect(statement.doKeyword, isNotNull);
+    expect(statement.body, isNotNull);
+    expect(statement.whileKeyword, isNotNull);
+    expect(statement.leftParenthesis, isNotNull);
+    expect(statement.condition, isNotNull);
+    expect(statement.rightParenthesis, isNotNull);
+    expect(statement.semicolon, isNotNull);
   }
 
   void test_parseEmptyStatement() {
     EmptyStatement statement = ParserTestCase.parse4("parseEmptyStatement", ";", []);
-    JUnitTestCase.assertNotNull(statement.semicolon);
+    expect(statement.semicolon, isNotNull);
   }
 
   void test_parseEnumDeclaration_one() {
     EnumDeclaration declaration = ParserTestCase.parse("parseEnumDeclaration", <Object> [emptyCommentAndMetadata()], "enum E {ONE}");
-    JUnitTestCase.assertNull(declaration.documentationComment);
-    JUnitTestCase.assertNotNull(declaration.keyword);
-    JUnitTestCase.assertNotNull(declaration.leftBracket);
-    JUnitTestCase.assertNotNull(declaration.name);
-    EngineTestCase.assertSizeOfList(1, declaration.constants);
-    JUnitTestCase.assertNotNull(declaration.rightBracket);
+    expect(declaration.documentationComment, isNull);
+    expect(declaration.keyword, isNotNull);
+    expect(declaration.leftBracket, isNotNull);
+    expect(declaration.name, isNotNull);
+    expect(declaration.constants, hasLength(1));
+    expect(declaration.rightBracket, isNotNull);
   }
 
   void test_parseEnumDeclaration_trailingComma() {
     EnumDeclaration declaration = ParserTestCase.parse("parseEnumDeclaration", <Object> [emptyCommentAndMetadata()], "enum E {ONE,}");
-    JUnitTestCase.assertNull(declaration.documentationComment);
-    JUnitTestCase.assertNotNull(declaration.keyword);
-    JUnitTestCase.assertNotNull(declaration.leftBracket);
-    JUnitTestCase.assertNotNull(declaration.name);
-    EngineTestCase.assertSizeOfList(1, declaration.constants);
-    JUnitTestCase.assertNotNull(declaration.rightBracket);
+    expect(declaration.documentationComment, isNull);
+    expect(declaration.keyword, isNotNull);
+    expect(declaration.leftBracket, isNotNull);
+    expect(declaration.name, isNotNull);
+    expect(declaration.constants, hasLength(1));
+    expect(declaration.rightBracket, isNotNull);
   }
 
   void test_parseEnumDeclaration_two() {
     EnumDeclaration declaration = ParserTestCase.parse("parseEnumDeclaration", <Object> [emptyCommentAndMetadata()], "enum E {ONE, TWO}");
-    JUnitTestCase.assertNull(declaration.documentationComment);
-    JUnitTestCase.assertNotNull(declaration.keyword);
-    JUnitTestCase.assertNotNull(declaration.leftBracket);
-    JUnitTestCase.assertNotNull(declaration.name);
-    EngineTestCase.assertSizeOfList(2, declaration.constants);
-    JUnitTestCase.assertNotNull(declaration.rightBracket);
+    expect(declaration.documentationComment, isNull);
+    expect(declaration.keyword, isNotNull);
+    expect(declaration.leftBracket, isNotNull);
+    expect(declaration.name, isNotNull);
+    expect(declaration.constants, hasLength(2));
+    expect(declaration.rightBracket, isNotNull);
   }
 
   void test_parseEqualityExpression_normal() {
     BinaryExpression expression = ParserTestCase.parse4("parseEqualityExpression", "x == y", []);
-    JUnitTestCase.assertNotNull(expression.leftOperand);
-    JUnitTestCase.assertNotNull(expression.operator);
-    JUnitTestCase.assertEquals(TokenType.EQ_EQ, expression.operator.type);
-    JUnitTestCase.assertNotNull(expression.rightOperand);
+    expect(expression.leftOperand, isNotNull);
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.EQ_EQ);
+    expect(expression.rightOperand, isNotNull);
   }
 
   void test_parseEqualityExpression_super() {
     BinaryExpression expression = ParserTestCase.parse4("parseEqualityExpression", "super == y", []);
     EngineTestCase.assertInstanceOf((obj) => obj is SuperExpression, SuperExpression, expression.leftOperand);
-    JUnitTestCase.assertNotNull(expression.operator);
-    JUnitTestCase.assertEquals(TokenType.EQ_EQ, expression.operator.type);
-    JUnitTestCase.assertNotNull(expression.rightOperand);
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.EQ_EQ);
+    expect(expression.rightOperand, isNotNull);
   }
 
   void test_parseExportDirective_hide() {
     ExportDirective directive = ParserTestCase.parse("parseExportDirective", <Object> [emptyCommentAndMetadata()], "export 'lib/lib.dart' hide A, B;");
-    JUnitTestCase.assertNotNull(directive.keyword);
-    JUnitTestCase.assertNotNull(directive.uri);
-    EngineTestCase.assertSizeOfList(1, directive.combinators);
-    JUnitTestCase.assertNotNull(directive.semicolon);
+    expect(directive.keyword, isNotNull);
+    expect(directive.uri, isNotNull);
+    expect(directive.combinators, hasLength(1));
+    expect(directive.semicolon, isNotNull);
   }
 
   void test_parseExportDirective_hide_show() {
     ExportDirective directive = ParserTestCase.parse("parseExportDirective", <Object> [emptyCommentAndMetadata()], "export 'lib/lib.dart' hide A show B;");
-    JUnitTestCase.assertNotNull(directive.keyword);
-    JUnitTestCase.assertNotNull(directive.uri);
-    EngineTestCase.assertSizeOfList(2, directive.combinators);
-    JUnitTestCase.assertNotNull(directive.semicolon);
+    expect(directive.keyword, isNotNull);
+    expect(directive.uri, isNotNull);
+    expect(directive.combinators, hasLength(2));
+    expect(directive.semicolon, isNotNull);
   }
 
   void test_parseExportDirective_noCombinator() {
     ExportDirective directive = ParserTestCase.parse("parseExportDirective", <Object> [emptyCommentAndMetadata()], "export 'lib/lib.dart';");
-    JUnitTestCase.assertNotNull(directive.keyword);
-    JUnitTestCase.assertNotNull(directive.uri);
-    EngineTestCase.assertSizeOfList(0, directive.combinators);
-    JUnitTestCase.assertNotNull(directive.semicolon);
+    expect(directive.keyword, isNotNull);
+    expect(directive.uri, isNotNull);
+    expect(directive.combinators, hasLength(0));
+    expect(directive.semicolon, isNotNull);
   }
 
   void test_parseExportDirective_show() {
     ExportDirective directive = ParserTestCase.parse("parseExportDirective", <Object> [emptyCommentAndMetadata()], "export 'lib/lib.dart' show A, B;");
-    JUnitTestCase.assertNotNull(directive.keyword);
-    JUnitTestCase.assertNotNull(directive.uri);
-    EngineTestCase.assertSizeOfList(1, directive.combinators);
-    JUnitTestCase.assertNotNull(directive.semicolon);
+    expect(directive.keyword, isNotNull);
+    expect(directive.uri, isNotNull);
+    expect(directive.combinators, hasLength(1));
+    expect(directive.semicolon, isNotNull);
   }
 
   void test_parseExportDirective_show_hide() {
     ExportDirective directive = ParserTestCase.parse("parseExportDirective", <Object> [emptyCommentAndMetadata()], "export 'lib/lib.dart' show B hide A;");
-    JUnitTestCase.assertNotNull(directive.keyword);
-    JUnitTestCase.assertNotNull(directive.uri);
-    EngineTestCase.assertSizeOfList(2, directive.combinators);
-    JUnitTestCase.assertNotNull(directive.semicolon);
+    expect(directive.keyword, isNotNull);
+    expect(directive.uri, isNotNull);
+    expect(directive.combinators, hasLength(2));
+    expect(directive.semicolon, isNotNull);
   }
 
   void test_parseExpression_assign() {
     // TODO(brianwilkerson) Implement more tests for this method.
     AssignmentExpression expression = ParserTestCase.parse4("parseExpression", "x = y", []);
-    JUnitTestCase.assertNotNull(expression.leftHandSide);
-    JUnitTestCase.assertNotNull(expression.operator);
-    JUnitTestCase.assertEquals(TokenType.EQ, expression.operator.type);
-    JUnitTestCase.assertNotNull(expression.rightHandSide);
+    expect(expression.leftHandSide, isNotNull);
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.EQ);
+    expect(expression.rightHandSide, isNotNull);
   }
 
   void test_parseExpression_comparison() {
     BinaryExpression expression = ParserTestCase.parse4("parseExpression", "--a.b == c", []);
-    JUnitTestCase.assertNotNull(expression.leftOperand);
-    JUnitTestCase.assertNotNull(expression.operator);
-    JUnitTestCase.assertEquals(TokenType.EQ_EQ, expression.operator.type);
-    JUnitTestCase.assertNotNull(expression.rightOperand);
+    expect(expression.leftOperand, isNotNull);
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.EQ_EQ);
+    expect(expression.rightOperand, isNotNull);
   }
 
   void test_parseExpression_function_async() {
     FunctionExpression expression = ParserTestCase.parseExpression("() async {}", []);
-    JUnitTestCase.assertNotNull(expression.body);
-    JUnitTestCase.assertTrue(expression.body.isAsynchronous);
-    JUnitTestCase.assertFalse(expression.body.isGenerator);
-    JUnitTestCase.assertNotNull(expression.parameters);
+    expect(expression.body, isNotNull);
+    expect(expression.body.isAsynchronous, isTrue);
+    expect(expression.body.isGenerator, isFalse);
+    expect(expression.parameters, isNotNull);
   }
 
   void test_parseExpression_function_asyncStar() {
     FunctionExpression expression = ParserTestCase.parseExpression("() async* {}", []);
-    JUnitTestCase.assertNotNull(expression.body);
-    JUnitTestCase.assertTrue(expression.body.isAsynchronous);
-    JUnitTestCase.assertTrue(expression.body.isGenerator);
-    JUnitTestCase.assertNotNull(expression.parameters);
+    expect(expression.body, isNotNull);
+    expect(expression.body.isAsynchronous, isTrue);
+    expect(expression.body.isGenerator, isTrue);
+    expect(expression.parameters, isNotNull);
   }
 
   void test_parseExpression_function_sync() {
     FunctionExpression expression = ParserTestCase.parseExpression("() {}", []);
-    JUnitTestCase.assertNotNull(expression.body);
-    JUnitTestCase.assertFalse(expression.body.isAsynchronous);
-    JUnitTestCase.assertFalse(expression.body.isGenerator);
-    JUnitTestCase.assertNotNull(expression.parameters);
+    expect(expression.body, isNotNull);
+    expect(expression.body.isAsynchronous, isFalse);
+    expect(expression.body.isGenerator, isFalse);
+    expect(expression.parameters, isNotNull);
   }
 
   void test_parseExpression_function_syncStar() {
     FunctionExpression expression = ParserTestCase.parseExpression("() sync* {}", []);
-    JUnitTestCase.assertNotNull(expression.body);
-    JUnitTestCase.assertFalse(expression.body.isAsynchronous);
-    JUnitTestCase.assertTrue(expression.body.isGenerator);
-    JUnitTestCase.assertNotNull(expression.parameters);
+    expect(expression.body, isNotNull);
+    expect(expression.body.isAsynchronous, isFalse);
+    expect(expression.body.isGenerator, isTrue);
+    expect(expression.parameters, isNotNull);
   }
 
   void test_parseExpression_invokeFunctionExpression() {
     FunctionExpressionInvocation invocation = ParserTestCase.parse4("parseExpression", "(a) {return a + a;} (3)", []);
     EngineTestCase.assertInstanceOf((obj) => obj is FunctionExpression, FunctionExpression, invocation.function);
     FunctionExpression expression = invocation.function as FunctionExpression;
-    JUnitTestCase.assertNotNull(expression.parameters);
-    JUnitTestCase.assertNotNull(expression.body);
+    expect(expression.parameters, isNotNull);
+    expect(expression.body, isNotNull);
     ArgumentList list = invocation.argumentList;
-    JUnitTestCase.assertNotNull(list);
-    EngineTestCase.assertSizeOfList(1, list.arguments);
+    expect(list, isNotNull);
+    expect(list.arguments, hasLength(1));
   }
 
   void test_parseExpression_superMethodInvocation() {
     MethodInvocation invocation = ParserTestCase.parse4("parseExpression", "super.m()", []);
-    JUnitTestCase.assertNotNull(invocation.target);
-    JUnitTestCase.assertNotNull(invocation.methodName);
-    JUnitTestCase.assertNotNull(invocation.argumentList);
+    expect(invocation.target, isNotNull);
+    expect(invocation.methodName, isNotNull);
+    expect(invocation.argumentList, isNotNull);
   }
 
   void test_parseExpressionList_multiple() {
     List<Expression> result = ParserTestCase.parse4("parseExpressionList", "1, 2, 3", []);
-    EngineTestCase.assertSizeOfList(3, result);
+    expect(result, hasLength(3));
   }
 
   void test_parseExpressionList_single() {
     List<Expression> result = ParserTestCase.parse4("parseExpressionList", "1", []);
-    EngineTestCase.assertSizeOfList(1, result);
+    expect(result, hasLength(1));
   }
 
   void test_parseExpressionWithoutCascade_assign() {
     // TODO(brianwilkerson) Implement more tests for this method.
     AssignmentExpression expression = ParserTestCase.parse4("parseExpressionWithoutCascade", "x = y", []);
-    JUnitTestCase.assertNotNull(expression.leftHandSide);
-    JUnitTestCase.assertNotNull(expression.operator);
-    JUnitTestCase.assertEquals(TokenType.EQ, expression.operator.type);
-    JUnitTestCase.assertNotNull(expression.rightHandSide);
+    expect(expression.leftHandSide, isNotNull);
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.EQ);
+    expect(expression.rightHandSide, isNotNull);
   }
 
   void test_parseExpressionWithoutCascade_comparison() {
     BinaryExpression expression = ParserTestCase.parse4("parseExpressionWithoutCascade", "--a.b == c", []);
-    JUnitTestCase.assertNotNull(expression.leftOperand);
-    JUnitTestCase.assertNotNull(expression.operator);
-    JUnitTestCase.assertEquals(TokenType.EQ_EQ, expression.operator.type);
-    JUnitTestCase.assertNotNull(expression.rightOperand);
+    expect(expression.leftOperand, isNotNull);
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.EQ_EQ);
+    expect(expression.rightOperand, isNotNull);
   }
 
   void test_parseExpressionWithoutCascade_superMethodInvocation() {
     MethodInvocation invocation = ParserTestCase.parse4("parseExpressionWithoutCascade", "super.m()", []);
-    JUnitTestCase.assertNotNull(invocation.target);
-    JUnitTestCase.assertNotNull(invocation.methodName);
-    JUnitTestCase.assertNotNull(invocation.argumentList);
+    expect(invocation.target, isNotNull);
+    expect(invocation.methodName, isNotNull);
+    expect(invocation.argumentList, isNotNull);
   }
 
   void test_parseExtendsClause() {
     ExtendsClause clause = ParserTestCase.parse4("parseExtendsClause", "extends B", []);
-    JUnitTestCase.assertNotNull(clause.keyword);
-    JUnitTestCase.assertNotNull(clause.superclass);
+    expect(clause.keyword, isNotNull);
+    expect(clause.superclass, isNotNull);
     EngineTestCase.assertInstanceOf((obj) => obj is TypeName, TypeName, clause.superclass);
   }
 
   void test_parseFinalConstVarOrType_const_noType() {
     FinalConstVarOrType result = ParserTestCase.parse("parseFinalConstVarOrType", <Object> [false], "const");
     Token keyword = result.keyword;
-    JUnitTestCase.assertNotNull(keyword);
-    JUnitTestCase.assertEquals(TokenType.KEYWORD, keyword.type);
-    JUnitTestCase.assertEquals(Keyword.CONST, (keyword as KeywordToken).keyword);
-    JUnitTestCase.assertNull(result.type);
+    expect(keyword, isNotNull);
+    expect(keyword.type, TokenType.KEYWORD);
+    expect((keyword as KeywordToken).keyword, Keyword.CONST);
+    expect(result.type, isNull);
   }
 
   void test_parseFinalConstVarOrType_const_type() {
     FinalConstVarOrType result = ParserTestCase.parse("parseFinalConstVarOrType", <Object> [false], "const A a");
     Token keyword = result.keyword;
-    JUnitTestCase.assertNotNull(keyword);
-    JUnitTestCase.assertEquals(TokenType.KEYWORD, keyword.type);
-    JUnitTestCase.assertEquals(Keyword.CONST, (keyword as KeywordToken).keyword);
-    JUnitTestCase.assertNotNull(result.type);
+    expect(keyword, isNotNull);
+    expect(keyword.type, TokenType.KEYWORD);
+    expect((keyword as KeywordToken).keyword, Keyword.CONST);
+    expect(result.type, isNotNull);
   }
 
   void test_parseFinalConstVarOrType_final_noType() {
     FinalConstVarOrType result = ParserTestCase.parse("parseFinalConstVarOrType", <Object> [false], "final");
     Token keyword = result.keyword;
-    JUnitTestCase.assertNotNull(keyword);
-    JUnitTestCase.assertEquals(TokenType.KEYWORD, keyword.type);
-    JUnitTestCase.assertEquals(Keyword.FINAL, (keyword as KeywordToken).keyword);
-    JUnitTestCase.assertNull(result.type);
+    expect(keyword, isNotNull);
+    expect(keyword.type, TokenType.KEYWORD);
+    expect((keyword as KeywordToken).keyword, Keyword.FINAL);
+    expect(result.type, isNull);
   }
 
   void test_parseFinalConstVarOrType_final_prefixedType() {
     FinalConstVarOrType result = ParserTestCase.parse("parseFinalConstVarOrType", <Object> [false], "final p.A a");
     Token keyword = result.keyword;
-    JUnitTestCase.assertNotNull(keyword);
-    JUnitTestCase.assertEquals(TokenType.KEYWORD, keyword.type);
-    JUnitTestCase.assertEquals(Keyword.FINAL, (keyword as KeywordToken).keyword);
-    JUnitTestCase.assertNotNull(result.type);
+    expect(keyword, isNotNull);
+    expect(keyword.type, TokenType.KEYWORD);
+    expect((keyword as KeywordToken).keyword, Keyword.FINAL);
+    expect(result.type, isNotNull);
   }
 
   void test_parseFinalConstVarOrType_final_type() {
     FinalConstVarOrType result = ParserTestCase.parse("parseFinalConstVarOrType", <Object> [false], "final A a");
     Token keyword = result.keyword;
-    JUnitTestCase.assertNotNull(keyword);
-    JUnitTestCase.assertEquals(TokenType.KEYWORD, keyword.type);
-    JUnitTestCase.assertEquals(Keyword.FINAL, (keyword as KeywordToken).keyword);
-    JUnitTestCase.assertNotNull(result.type);
+    expect(keyword, isNotNull);
+    expect(keyword.type, TokenType.KEYWORD);
+    expect((keyword as KeywordToken).keyword, Keyword.FINAL);
+    expect(result.type, isNotNull);
   }
 
   void test_parseFinalConstVarOrType_type_parameterized() {
     FinalConstVarOrType result = ParserTestCase.parse("parseFinalConstVarOrType", <Object> [false], "A<B> a");
-    JUnitTestCase.assertNull(result.keyword);
-    JUnitTestCase.assertNotNull(result.type);
+    expect(result.keyword, isNull);
+    expect(result.type, isNotNull);
   }
 
   void test_parseFinalConstVarOrType_type_prefixed() {
     FinalConstVarOrType result = ParserTestCase.parse("parseFinalConstVarOrType", <Object> [false], "p.A a");
-    JUnitTestCase.assertNull(result.keyword);
-    JUnitTestCase.assertNotNull(result.type);
+    expect(result.keyword, isNull);
+    expect(result.type, isNotNull);
   }
 
   void test_parseFinalConstVarOrType_type_prefixedAndParameterized() {
     FinalConstVarOrType result = ParserTestCase.parse("parseFinalConstVarOrType", <Object> [false], "p.A<B> a");
-    JUnitTestCase.assertNull(result.keyword);
-    JUnitTestCase.assertNotNull(result.type);
+    expect(result.keyword, isNull);
+    expect(result.type, isNotNull);
   }
 
   void test_parseFinalConstVarOrType_type_simple() {
     FinalConstVarOrType result = ParserTestCase.parse("parseFinalConstVarOrType", <Object> [false], "A a");
-    JUnitTestCase.assertNull(result.keyword);
-    JUnitTestCase.assertNotNull(result.type);
+    expect(result.keyword, isNull);
+    expect(result.type, isNotNull);
   }
 
   void test_parseFinalConstVarOrType_var() {
     FinalConstVarOrType result = ParserTestCase.parse("parseFinalConstVarOrType", <Object> [false], "var");
     Token keyword = result.keyword;
-    JUnitTestCase.assertNotNull(keyword);
-    JUnitTestCase.assertEquals(TokenType.KEYWORD, keyword.type);
-    JUnitTestCase.assertEquals(Keyword.VAR, (keyword as KeywordToken).keyword);
-    JUnitTestCase.assertNull(result.type);
+    expect(keyword, isNotNull);
+    expect(keyword.type, TokenType.KEYWORD);
+    expect((keyword as KeywordToken).keyword, Keyword.VAR);
+    expect(result.type, isNull);
   }
 
   void test_parseFormalParameter_final_withType_named() {
     ParameterKind kind = ParameterKind.NAMED;
     DefaultFormalParameter parameter = ParserTestCase.parse("parseFormalParameter", <Object> [kind], "final A a : null");
     SimpleFormalParameter simpleParameter = parameter.parameter as SimpleFormalParameter;
-    JUnitTestCase.assertNotNull(simpleParameter.identifier);
-    JUnitTestCase.assertNotNull(simpleParameter.keyword);
-    JUnitTestCase.assertNotNull(simpleParameter.type);
-    JUnitTestCase.assertEquals(kind, simpleParameter.kind);
-    JUnitTestCase.assertNotNull(parameter.separator);
-    JUnitTestCase.assertNotNull(parameter.defaultValue);
-    JUnitTestCase.assertEquals(kind, parameter.kind);
+    expect(simpleParameter.identifier, isNotNull);
+    expect(simpleParameter.keyword, isNotNull);
+    expect(simpleParameter.type, isNotNull);
+    expect(simpleParameter.kind, kind);
+    expect(parameter.separator, isNotNull);
+    expect(parameter.defaultValue, isNotNull);
+    expect(parameter.kind, kind);
   }
 
   void test_parseFormalParameter_final_withType_normal() {
     ParameterKind kind = ParameterKind.REQUIRED;
     SimpleFormalParameter parameter = ParserTestCase.parse("parseFormalParameter", <Object> [kind], "final A a");
-    JUnitTestCase.assertNotNull(parameter.identifier);
-    JUnitTestCase.assertNotNull(parameter.keyword);
-    JUnitTestCase.assertNotNull(parameter.type);
-    JUnitTestCase.assertEquals(kind, parameter.kind);
+    expect(parameter.identifier, isNotNull);
+    expect(parameter.keyword, isNotNull);
+    expect(parameter.type, isNotNull);
+    expect(parameter.kind, kind);
   }
 
   void test_parseFormalParameter_final_withType_positional() {
     ParameterKind kind = ParameterKind.POSITIONAL;
     DefaultFormalParameter parameter = ParserTestCase.parse("parseFormalParameter", <Object> [kind], "final A a = null");
     SimpleFormalParameter simpleParameter = parameter.parameter as SimpleFormalParameter;
-    JUnitTestCase.assertNotNull(simpleParameter.identifier);
-    JUnitTestCase.assertNotNull(simpleParameter.keyword);
-    JUnitTestCase.assertNotNull(simpleParameter.type);
-    JUnitTestCase.assertEquals(kind, simpleParameter.kind);
-    JUnitTestCase.assertNotNull(parameter.separator);
-    JUnitTestCase.assertNotNull(parameter.defaultValue);
-    JUnitTestCase.assertEquals(kind, parameter.kind);
+    expect(simpleParameter.identifier, isNotNull);
+    expect(simpleParameter.keyword, isNotNull);
+    expect(simpleParameter.type, isNotNull);
+    expect(simpleParameter.kind, kind);
+    expect(parameter.separator, isNotNull);
+    expect(parameter.defaultValue, isNotNull);
+    expect(parameter.kind, kind);
   }
 
   void test_parseFormalParameter_nonFinal_withType_named() {
     ParameterKind kind = ParameterKind.NAMED;
     DefaultFormalParameter parameter = ParserTestCase.parse("parseFormalParameter", <Object> [kind], "A a : null");
     SimpleFormalParameter simpleParameter = parameter.parameter as SimpleFormalParameter;
-    JUnitTestCase.assertNotNull(simpleParameter.identifier);
-    JUnitTestCase.assertNull(simpleParameter.keyword);
-    JUnitTestCase.assertNotNull(simpleParameter.type);
-    JUnitTestCase.assertEquals(kind, simpleParameter.kind);
-    JUnitTestCase.assertNotNull(parameter.separator);
-    JUnitTestCase.assertNotNull(parameter.defaultValue);
-    JUnitTestCase.assertEquals(kind, parameter.kind);
+    expect(simpleParameter.identifier, isNotNull);
+    expect(simpleParameter.keyword, isNull);
+    expect(simpleParameter.type, isNotNull);
+    expect(simpleParameter.kind, kind);
+    expect(parameter.separator, isNotNull);
+    expect(parameter.defaultValue, isNotNull);
+    expect(parameter.kind, kind);
   }
 
   void test_parseFormalParameter_nonFinal_withType_normal() {
     ParameterKind kind = ParameterKind.REQUIRED;
     SimpleFormalParameter parameter = ParserTestCase.parse("parseFormalParameter", <Object> [kind], "A a");
-    JUnitTestCase.assertNotNull(parameter.identifier);
-    JUnitTestCase.assertNull(parameter.keyword);
-    JUnitTestCase.assertNotNull(parameter.type);
-    JUnitTestCase.assertEquals(kind, parameter.kind);
+    expect(parameter.identifier, isNotNull);
+    expect(parameter.keyword, isNull);
+    expect(parameter.type, isNotNull);
+    expect(parameter.kind, kind);
   }
 
   void test_parseFormalParameter_nonFinal_withType_positional() {
     ParameterKind kind = ParameterKind.POSITIONAL;
     DefaultFormalParameter parameter = ParserTestCase.parse("parseFormalParameter", <Object> [kind], "A a = null");
     SimpleFormalParameter simpleParameter = parameter.parameter as SimpleFormalParameter;
-    JUnitTestCase.assertNotNull(simpleParameter.identifier);
-    JUnitTestCase.assertNull(simpleParameter.keyword);
-    JUnitTestCase.assertNotNull(simpleParameter.type);
-    JUnitTestCase.assertEquals(kind, simpleParameter.kind);
-    JUnitTestCase.assertNotNull(parameter.separator);
-    JUnitTestCase.assertNotNull(parameter.defaultValue);
-    JUnitTestCase.assertEquals(kind, parameter.kind);
+    expect(simpleParameter.identifier, isNotNull);
+    expect(simpleParameter.keyword, isNull);
+    expect(simpleParameter.type, isNotNull);
+    expect(simpleParameter.kind, kind);
+    expect(parameter.separator, isNotNull);
+    expect(parameter.defaultValue, isNotNull);
+    expect(parameter.kind, kind);
   }
 
   void test_parseFormalParameter_var() {
     ParameterKind kind = ParameterKind.REQUIRED;
     SimpleFormalParameter parameter = ParserTestCase.parse("parseFormalParameter", <Object> [kind], "var a");
-    JUnitTestCase.assertNotNull(parameter.identifier);
-    JUnitTestCase.assertNotNull(parameter.keyword);
-    JUnitTestCase.assertNull(parameter.type);
-    JUnitTestCase.assertEquals(kind, parameter.kind);
+    expect(parameter.identifier, isNotNull);
+    expect(parameter.keyword, isNotNull);
+    expect(parameter.type, isNull);
+    expect(parameter.kind, kind);
   }
 
   void test_parseFormalParameter_var_named() {
     ParameterKind kind = ParameterKind.NAMED;
     DefaultFormalParameter parameter = ParserTestCase.parse("parseFormalParameter", <Object> [kind], "var a : null");
     SimpleFormalParameter simpleParameter = parameter.parameter as SimpleFormalParameter;
-    JUnitTestCase.assertNotNull(simpleParameter.identifier);
-    JUnitTestCase.assertNotNull(simpleParameter.keyword);
-    JUnitTestCase.assertNull(simpleParameter.type);
-    JUnitTestCase.assertEquals(kind, simpleParameter.kind);
-    JUnitTestCase.assertNotNull(parameter.separator);
-    JUnitTestCase.assertNotNull(parameter.defaultValue);
-    JUnitTestCase.assertEquals(kind, parameter.kind);
+    expect(simpleParameter.identifier, isNotNull);
+    expect(simpleParameter.keyword, isNotNull);
+    expect(simpleParameter.type, isNull);
+    expect(simpleParameter.kind, kind);
+    expect(parameter.separator, isNotNull);
+    expect(parameter.defaultValue, isNotNull);
+    expect(parameter.kind, kind);
   }
 
   void test_parseFormalParameter_var_positional() {
     ParameterKind kind = ParameterKind.POSITIONAL;
     DefaultFormalParameter parameter = ParserTestCase.parse("parseFormalParameter", <Object> [kind], "var a = null");
     SimpleFormalParameter simpleParameter = parameter.parameter as SimpleFormalParameter;
-    JUnitTestCase.assertNotNull(simpleParameter.identifier);
-    JUnitTestCase.assertNotNull(simpleParameter.keyword);
-    JUnitTestCase.assertNull(simpleParameter.type);
-    JUnitTestCase.assertEquals(kind, simpleParameter.kind);
-    JUnitTestCase.assertNotNull(parameter.separator);
-    JUnitTestCase.assertNotNull(parameter.defaultValue);
-    JUnitTestCase.assertEquals(kind, parameter.kind);
+    expect(simpleParameter.identifier, isNotNull);
+    expect(simpleParameter.keyword, isNotNull);
+    expect(simpleParameter.type, isNull);
+    expect(simpleParameter.kind, kind);
+    expect(parameter.separator, isNotNull);
+    expect(parameter.defaultValue, isNotNull);
+    expect(parameter.kind, kind);
   }
 
   void test_parseFormalParameterList_empty() {
     FormalParameterList parameterList = ParserTestCase.parse4("parseFormalParameterList", "()", []);
-    JUnitTestCase.assertNotNull(parameterList.leftParenthesis);
-    JUnitTestCase.assertNull(parameterList.leftDelimiter);
-    EngineTestCase.assertSizeOfList(0, parameterList.parameters);
-    JUnitTestCase.assertNull(parameterList.rightDelimiter);
-    JUnitTestCase.assertNotNull(parameterList.rightParenthesis);
+    expect(parameterList.leftParenthesis, isNotNull);
+    expect(parameterList.leftDelimiter, isNull);
+    expect(parameterList.parameters, hasLength(0));
+    expect(parameterList.rightDelimiter, isNull);
+    expect(parameterList.rightParenthesis, isNotNull);
   }
 
   void test_parseFormalParameterList_named_multiple() {
     FormalParameterList parameterList = ParserTestCase.parse4("parseFormalParameterList", "({A a : 1, B b, C c : 3})", []);
-    JUnitTestCase.assertNotNull(parameterList.leftParenthesis);
-    JUnitTestCase.assertNotNull(parameterList.leftDelimiter);
-    EngineTestCase.assertSizeOfList(3, parameterList.parameters);
-    JUnitTestCase.assertNotNull(parameterList.rightDelimiter);
-    JUnitTestCase.assertNotNull(parameterList.rightParenthesis);
+    expect(parameterList.leftParenthesis, isNotNull);
+    expect(parameterList.leftDelimiter, isNotNull);
+    expect(parameterList.parameters, hasLength(3));
+    expect(parameterList.rightDelimiter, isNotNull);
+    expect(parameterList.rightParenthesis, isNotNull);
   }
 
   void test_parseFormalParameterList_named_single() {
     FormalParameterList parameterList = ParserTestCase.parse4("parseFormalParameterList", "({A a})", []);
-    JUnitTestCase.assertNotNull(parameterList.leftParenthesis);
-    JUnitTestCase.assertNotNull(parameterList.leftDelimiter);
-    EngineTestCase.assertSizeOfList(1, parameterList.parameters);
-    JUnitTestCase.assertNotNull(parameterList.rightDelimiter);
-    JUnitTestCase.assertNotNull(parameterList.rightParenthesis);
+    expect(parameterList.leftParenthesis, isNotNull);
+    expect(parameterList.leftDelimiter, isNotNull);
+    expect(parameterList.parameters, hasLength(1));
+    expect(parameterList.rightDelimiter, isNotNull);
+    expect(parameterList.rightParenthesis, isNotNull);
   }
 
   void test_parseFormalParameterList_normal_multiple() {
     FormalParameterList parameterList = ParserTestCase.parse4("parseFormalParameterList", "(A a, B b, C c)", []);
-    JUnitTestCase.assertNotNull(parameterList.leftParenthesis);
-    JUnitTestCase.assertNull(parameterList.leftDelimiter);
-    EngineTestCase.assertSizeOfList(3, parameterList.parameters);
-    JUnitTestCase.assertNull(parameterList.rightDelimiter);
-    JUnitTestCase.assertNotNull(parameterList.rightParenthesis);
+    expect(parameterList.leftParenthesis, isNotNull);
+    expect(parameterList.leftDelimiter, isNull);
+    expect(parameterList.parameters, hasLength(3));
+    expect(parameterList.rightDelimiter, isNull);
+    expect(parameterList.rightParenthesis, isNotNull);
   }
 
   void test_parseFormalParameterList_normal_named() {
     FormalParameterList parameterList = ParserTestCase.parse4("parseFormalParameterList", "(A a, {B b})", []);
-    JUnitTestCase.assertNotNull(parameterList.leftParenthesis);
-    JUnitTestCase.assertNotNull(parameterList.leftDelimiter);
-    EngineTestCase.assertSizeOfList(2, parameterList.parameters);
-    JUnitTestCase.assertNotNull(parameterList.rightDelimiter);
-    JUnitTestCase.assertNotNull(parameterList.rightParenthesis);
+    expect(parameterList.leftParenthesis, isNotNull);
+    expect(parameterList.leftDelimiter, isNotNull);
+    expect(parameterList.parameters, hasLength(2));
+    expect(parameterList.rightDelimiter, isNotNull);
+    expect(parameterList.rightParenthesis, isNotNull);
   }
 
   void test_parseFormalParameterList_normal_positional() {
     FormalParameterList parameterList = ParserTestCase.parse4("parseFormalParameterList", "(A a, [B b])", []);
-    JUnitTestCase.assertNotNull(parameterList.leftParenthesis);
-    JUnitTestCase.assertNotNull(parameterList.leftDelimiter);
-    EngineTestCase.assertSizeOfList(2, parameterList.parameters);
-    JUnitTestCase.assertNotNull(parameterList.rightDelimiter);
-    JUnitTestCase.assertNotNull(parameterList.rightParenthesis);
+    expect(parameterList.leftParenthesis, isNotNull);
+    expect(parameterList.leftDelimiter, isNotNull);
+    expect(parameterList.parameters, hasLength(2));
+    expect(parameterList.rightDelimiter, isNotNull);
+    expect(parameterList.rightParenthesis, isNotNull);
   }
 
   void test_parseFormalParameterList_normal_single() {
     FormalParameterList parameterList = ParserTestCase.parse4("parseFormalParameterList", "(A a)", []);
-    JUnitTestCase.assertNotNull(parameterList.leftParenthesis);
-    JUnitTestCase.assertNull(parameterList.leftDelimiter);
-    EngineTestCase.assertSizeOfList(1, parameterList.parameters);
-    JUnitTestCase.assertNull(parameterList.rightDelimiter);
-    JUnitTestCase.assertNotNull(parameterList.rightParenthesis);
+    expect(parameterList.leftParenthesis, isNotNull);
+    expect(parameterList.leftDelimiter, isNull);
+    expect(parameterList.parameters, hasLength(1));
+    expect(parameterList.rightDelimiter, isNull);
+    expect(parameterList.rightParenthesis, isNotNull);
   }
 
   void test_parseFormalParameterList_positional_multiple() {
     FormalParameterList parameterList = ParserTestCase.parse4("parseFormalParameterList", "([A a = null, B b, C c = null])", []);
-    JUnitTestCase.assertNotNull(parameterList.leftParenthesis);
-    JUnitTestCase.assertNotNull(parameterList.leftDelimiter);
-    EngineTestCase.assertSizeOfList(3, parameterList.parameters);
-    JUnitTestCase.assertNotNull(parameterList.rightDelimiter);
-    JUnitTestCase.assertNotNull(parameterList.rightParenthesis);
+    expect(parameterList.leftParenthesis, isNotNull);
+    expect(parameterList.leftDelimiter, isNotNull);
+    expect(parameterList.parameters, hasLength(3));
+    expect(parameterList.rightDelimiter, isNotNull);
+    expect(parameterList.rightParenthesis, isNotNull);
   }
 
   void test_parseFormalParameterList_positional_single() {
     FormalParameterList parameterList = ParserTestCase.parse4("parseFormalParameterList", "([A a = null])", []);
-    JUnitTestCase.assertNotNull(parameterList.leftParenthesis);
-    JUnitTestCase.assertNotNull(parameterList.leftDelimiter);
-    EngineTestCase.assertSizeOfList(1, parameterList.parameters);
-    JUnitTestCase.assertNotNull(parameterList.rightDelimiter);
-    JUnitTestCase.assertNotNull(parameterList.rightParenthesis);
+    expect(parameterList.leftParenthesis, isNotNull);
+    expect(parameterList.leftDelimiter, isNotNull);
+    expect(parameterList.parameters, hasLength(1));
+    expect(parameterList.rightDelimiter, isNotNull);
+    expect(parameterList.rightParenthesis, isNotNull);
   }
 
   void test_parseForStatement_each_await() {
     ForEachStatement statement = ParserTestCase.parse4("parseForStatement", "await for (element in list) {}", []);
-    JUnitTestCase.assertNotNull(statement.awaitKeyword);
-    JUnitTestCase.assertNotNull(statement.forKeyword);
-    JUnitTestCase.assertNotNull(statement.leftParenthesis);
-    JUnitTestCase.assertNull(statement.loopVariable);
-    JUnitTestCase.assertNotNull(statement.identifier);
-    JUnitTestCase.assertNotNull(statement.inKeyword);
-    JUnitTestCase.assertNotNull(statement.iterator);
-    JUnitTestCase.assertNotNull(statement.rightParenthesis);
-    JUnitTestCase.assertNotNull(statement.body);
+    expect(statement.awaitKeyword, isNotNull);
+    expect(statement.forKeyword, isNotNull);
+    expect(statement.leftParenthesis, isNotNull);
+    expect(statement.loopVariable, isNull);
+    expect(statement.identifier, isNotNull);
+    expect(statement.inKeyword, isNotNull);
+    expect(statement.iterator, isNotNull);
+    expect(statement.rightParenthesis, isNotNull);
+    expect(statement.body, isNotNull);
   }
 
   void test_parseForStatement_each_identifier() {
     ForEachStatement statement = ParserTestCase.parse4("parseForStatement", "for (element in list) {}", []);
-    JUnitTestCase.assertNull(statement.awaitKeyword);
-    JUnitTestCase.assertNotNull(statement.forKeyword);
-    JUnitTestCase.assertNotNull(statement.leftParenthesis);
-    JUnitTestCase.assertNull(statement.loopVariable);
-    JUnitTestCase.assertNotNull(statement.identifier);
-    JUnitTestCase.assertNotNull(statement.inKeyword);
-    JUnitTestCase.assertNotNull(statement.iterator);
-    JUnitTestCase.assertNotNull(statement.rightParenthesis);
-    JUnitTestCase.assertNotNull(statement.body);
+    expect(statement.awaitKeyword, isNull);
+    expect(statement.forKeyword, isNotNull);
+    expect(statement.leftParenthesis, isNotNull);
+    expect(statement.loopVariable, isNull);
+    expect(statement.identifier, isNotNull);
+    expect(statement.inKeyword, isNotNull);
+    expect(statement.iterator, isNotNull);
+    expect(statement.rightParenthesis, isNotNull);
+    expect(statement.body, isNotNull);
   }
 
   void test_parseForStatement_each_noType_metadata() {
     ForEachStatement statement = ParserTestCase.parse4("parseForStatement", "for (@A var element in list) {}", []);
-    JUnitTestCase.assertNull(statement.awaitKeyword);
-    JUnitTestCase.assertNotNull(statement.forKeyword);
-    JUnitTestCase.assertNotNull(statement.leftParenthesis);
-    JUnitTestCase.assertNotNull(statement.loopVariable);
-    EngineTestCase.assertSizeOfList(1, statement.loopVariable.metadata);
-    JUnitTestCase.assertNull(statement.identifier);
-    JUnitTestCase.assertNotNull(statement.inKeyword);
-    JUnitTestCase.assertNotNull(statement.iterator);
-    JUnitTestCase.assertNotNull(statement.rightParenthesis);
-    JUnitTestCase.assertNotNull(statement.body);
+    expect(statement.awaitKeyword, isNull);
+    expect(statement.forKeyword, isNotNull);
+    expect(statement.leftParenthesis, isNotNull);
+    expect(statement.loopVariable, isNotNull);
+    expect(statement.loopVariable.metadata, hasLength(1));
+    expect(statement.identifier, isNull);
+    expect(statement.inKeyword, isNotNull);
+    expect(statement.iterator, isNotNull);
+    expect(statement.rightParenthesis, isNotNull);
+    expect(statement.body, isNotNull);
   }
 
   void test_parseForStatement_each_type() {
     ForEachStatement statement = ParserTestCase.parse4("parseForStatement", "for (A element in list) {}", []);
-    JUnitTestCase.assertNull(statement.awaitKeyword);
-    JUnitTestCase.assertNotNull(statement.forKeyword);
-    JUnitTestCase.assertNotNull(statement.leftParenthesis);
-    JUnitTestCase.assertNotNull(statement.loopVariable);
-    JUnitTestCase.assertNull(statement.identifier);
-    JUnitTestCase.assertNotNull(statement.inKeyword);
-    JUnitTestCase.assertNotNull(statement.iterator);
-    JUnitTestCase.assertNotNull(statement.rightParenthesis);
-    JUnitTestCase.assertNotNull(statement.body);
+    expect(statement.awaitKeyword, isNull);
+    expect(statement.forKeyword, isNotNull);
+    expect(statement.leftParenthesis, isNotNull);
+    expect(statement.loopVariable, isNotNull);
+    expect(statement.identifier, isNull);
+    expect(statement.inKeyword, isNotNull);
+    expect(statement.iterator, isNotNull);
+    expect(statement.rightParenthesis, isNotNull);
+    expect(statement.body, isNotNull);
   }
 
   void test_parseForStatement_each_var() {
     ForEachStatement statement = ParserTestCase.parse4("parseForStatement", "for (var element in list) {}", []);
-    JUnitTestCase.assertNull(statement.awaitKeyword);
-    JUnitTestCase.assertNotNull(statement.forKeyword);
-    JUnitTestCase.assertNotNull(statement.leftParenthesis);
-    JUnitTestCase.assertNotNull(statement.loopVariable);
-    JUnitTestCase.assertNull(statement.identifier);
-    JUnitTestCase.assertNotNull(statement.inKeyword);
-    JUnitTestCase.assertNotNull(statement.iterator);
-    JUnitTestCase.assertNotNull(statement.rightParenthesis);
-    JUnitTestCase.assertNotNull(statement.body);
+    expect(statement.awaitKeyword, isNull);
+    expect(statement.forKeyword, isNotNull);
+    expect(statement.leftParenthesis, isNotNull);
+    expect(statement.loopVariable, isNotNull);
+    expect(statement.identifier, isNull);
+    expect(statement.inKeyword, isNotNull);
+    expect(statement.iterator, isNotNull);
+    expect(statement.rightParenthesis, isNotNull);
+    expect(statement.body, isNotNull);
   }
 
   void test_parseForStatement_loop_c() {
     ForStatement statement = ParserTestCase.parse4("parseForStatement", "for (; i < count;) {}", []);
-    JUnitTestCase.assertNotNull(statement.forKeyword);
-    JUnitTestCase.assertNotNull(statement.leftParenthesis);
-    JUnitTestCase.assertNull(statement.variables);
-    JUnitTestCase.assertNull(statement.initialization);
-    JUnitTestCase.assertNotNull(statement.leftSeparator);
-    JUnitTestCase.assertNotNull(statement.condition);
-    JUnitTestCase.assertNotNull(statement.rightSeparator);
-    EngineTestCase.assertSizeOfList(0, statement.updaters);
-    JUnitTestCase.assertNotNull(statement.rightParenthesis);
-    JUnitTestCase.assertNotNull(statement.body);
+    expect(statement.forKeyword, isNotNull);
+    expect(statement.leftParenthesis, isNotNull);
+    expect(statement.variables, isNull);
+    expect(statement.initialization, isNull);
+    expect(statement.leftSeparator, isNotNull);
+    expect(statement.condition, isNotNull);
+    expect(statement.rightSeparator, isNotNull);
+    expect(statement.updaters, hasLength(0));
+    expect(statement.rightParenthesis, isNotNull);
+    expect(statement.body, isNotNull);
   }
 
   void test_parseForStatement_loop_cu() {
     ForStatement statement = ParserTestCase.parse4("parseForStatement", "for (; i < count; i++) {}", []);
-    JUnitTestCase.assertNotNull(statement.forKeyword);
-    JUnitTestCase.assertNotNull(statement.leftParenthesis);
-    JUnitTestCase.assertNull(statement.variables);
-    JUnitTestCase.assertNull(statement.initialization);
-    JUnitTestCase.assertNotNull(statement.leftSeparator);
-    JUnitTestCase.assertNotNull(statement.condition);
-    JUnitTestCase.assertNotNull(statement.rightSeparator);
-    EngineTestCase.assertSizeOfList(1, statement.updaters);
-    JUnitTestCase.assertNotNull(statement.rightParenthesis);
-    JUnitTestCase.assertNotNull(statement.body);
+    expect(statement.forKeyword, isNotNull);
+    expect(statement.leftParenthesis, isNotNull);
+    expect(statement.variables, isNull);
+    expect(statement.initialization, isNull);
+    expect(statement.leftSeparator, isNotNull);
+    expect(statement.condition, isNotNull);
+    expect(statement.rightSeparator, isNotNull);
+    expect(statement.updaters, hasLength(1));
+    expect(statement.rightParenthesis, isNotNull);
+    expect(statement.body, isNotNull);
   }
 
   void test_parseForStatement_loop_ecu() {
     ForStatement statement = ParserTestCase.parse4("parseForStatement", "for (i--; i < count; i++) {}", []);
-    JUnitTestCase.assertNotNull(statement.forKeyword);
-    JUnitTestCase.assertNotNull(statement.leftParenthesis);
-    JUnitTestCase.assertNull(statement.variables);
-    JUnitTestCase.assertNotNull(statement.initialization);
-    JUnitTestCase.assertNotNull(statement.leftSeparator);
-    JUnitTestCase.assertNotNull(statement.condition);
-    JUnitTestCase.assertNotNull(statement.rightSeparator);
-    EngineTestCase.assertSizeOfList(1, statement.updaters);
-    JUnitTestCase.assertNotNull(statement.rightParenthesis);
-    JUnitTestCase.assertNotNull(statement.body);
+    expect(statement.forKeyword, isNotNull);
+    expect(statement.leftParenthesis, isNotNull);
+    expect(statement.variables, isNull);
+    expect(statement.initialization, isNotNull);
+    expect(statement.leftSeparator, isNotNull);
+    expect(statement.condition, isNotNull);
+    expect(statement.rightSeparator, isNotNull);
+    expect(statement.updaters, hasLength(1));
+    expect(statement.rightParenthesis, isNotNull);
+    expect(statement.body, isNotNull);
   }
 
   void test_parseForStatement_loop_i() {
     ForStatement statement = ParserTestCase.parse4("parseForStatement", "for (var i = 0;;) {}", []);
-    JUnitTestCase.assertNotNull(statement.forKeyword);
-    JUnitTestCase.assertNotNull(statement.leftParenthesis);
+    expect(statement.forKeyword, isNotNull);
+    expect(statement.leftParenthesis, isNotNull);
     VariableDeclarationList variables = statement.variables;
-    JUnitTestCase.assertNotNull(variables);
-    EngineTestCase.assertSizeOfList(0, variables.metadata);
-    EngineTestCase.assertSizeOfList(1, variables.variables);
-    JUnitTestCase.assertNull(statement.initialization);
-    JUnitTestCase.assertNotNull(statement.leftSeparator);
-    JUnitTestCase.assertNull(statement.condition);
-    JUnitTestCase.assertNotNull(statement.rightSeparator);
-    EngineTestCase.assertSizeOfList(0, statement.updaters);
-    JUnitTestCase.assertNotNull(statement.rightParenthesis);
-    JUnitTestCase.assertNotNull(statement.body);
+    expect(variables, isNotNull);
+    expect(variables.metadata, hasLength(0));
+    expect(variables.variables, hasLength(1));
+    expect(statement.initialization, isNull);
+    expect(statement.leftSeparator, isNotNull);
+    expect(statement.condition, isNull);
+    expect(statement.rightSeparator, isNotNull);
+    expect(statement.updaters, hasLength(0));
+    expect(statement.rightParenthesis, isNotNull);
+    expect(statement.body, isNotNull);
   }
 
   void test_parseForStatement_loop_i_withMetadata() {
     ForStatement statement = ParserTestCase.parse4("parseForStatement", "for (@A var i = 0;;) {}", []);
-    JUnitTestCase.assertNotNull(statement.forKeyword);
-    JUnitTestCase.assertNotNull(statement.leftParenthesis);
+    expect(statement.forKeyword, isNotNull);
+    expect(statement.leftParenthesis, isNotNull);
     VariableDeclarationList variables = statement.variables;
-    JUnitTestCase.assertNotNull(variables);
-    EngineTestCase.assertSizeOfList(1, variables.metadata);
-    EngineTestCase.assertSizeOfList(1, variables.variables);
-    JUnitTestCase.assertNull(statement.initialization);
-    JUnitTestCase.assertNotNull(statement.leftSeparator);
-    JUnitTestCase.assertNull(statement.condition);
-    JUnitTestCase.assertNotNull(statement.rightSeparator);
-    EngineTestCase.assertSizeOfList(0, statement.updaters);
-    JUnitTestCase.assertNotNull(statement.rightParenthesis);
-    JUnitTestCase.assertNotNull(statement.body);
+    expect(variables, isNotNull);
+    expect(variables.metadata, hasLength(1));
+    expect(variables.variables, hasLength(1));
+    expect(statement.initialization, isNull);
+    expect(statement.leftSeparator, isNotNull);
+    expect(statement.condition, isNull);
+    expect(statement.rightSeparator, isNotNull);
+    expect(statement.updaters, hasLength(0));
+    expect(statement.rightParenthesis, isNotNull);
+    expect(statement.body, isNotNull);
   }
 
   void test_parseForStatement_loop_ic() {
     ForStatement statement = ParserTestCase.parse4("parseForStatement", "for (var i = 0; i < count;) {}", []);
-    JUnitTestCase.assertNotNull(statement.forKeyword);
-    JUnitTestCase.assertNotNull(statement.leftParenthesis);
+    expect(statement.forKeyword, isNotNull);
+    expect(statement.leftParenthesis, isNotNull);
     VariableDeclarationList variables = statement.variables;
-    JUnitTestCase.assertNotNull(variables);
-    EngineTestCase.assertSizeOfList(1, variables.variables);
-    JUnitTestCase.assertNull(statement.initialization);
-    JUnitTestCase.assertNotNull(statement.leftSeparator);
-    JUnitTestCase.assertNotNull(statement.condition);
-    JUnitTestCase.assertNotNull(statement.rightSeparator);
-    EngineTestCase.assertSizeOfList(0, statement.updaters);
-    JUnitTestCase.assertNotNull(statement.rightParenthesis);
-    JUnitTestCase.assertNotNull(statement.body);
+    expect(variables, isNotNull);
+    expect(variables.variables, hasLength(1));
+    expect(statement.initialization, isNull);
+    expect(statement.leftSeparator, isNotNull);
+    expect(statement.condition, isNotNull);
+    expect(statement.rightSeparator, isNotNull);
+    expect(statement.updaters, hasLength(0));
+    expect(statement.rightParenthesis, isNotNull);
+    expect(statement.body, isNotNull);
   }
 
   void test_parseForStatement_loop_icu() {
     ForStatement statement = ParserTestCase.parse4("parseForStatement", "for (var i = 0; i < count; i++) {}", []);
-    JUnitTestCase.assertNotNull(statement.forKeyword);
-    JUnitTestCase.assertNotNull(statement.leftParenthesis);
+    expect(statement.forKeyword, isNotNull);
+    expect(statement.leftParenthesis, isNotNull);
     VariableDeclarationList variables = statement.variables;
-    JUnitTestCase.assertNotNull(variables);
-    EngineTestCase.assertSizeOfList(1, variables.variables);
-    JUnitTestCase.assertNull(statement.initialization);
-    JUnitTestCase.assertNotNull(statement.leftSeparator);
-    JUnitTestCase.assertNotNull(statement.condition);
-    JUnitTestCase.assertNotNull(statement.rightSeparator);
-    EngineTestCase.assertSizeOfList(1, statement.updaters);
-    JUnitTestCase.assertNotNull(statement.rightParenthesis);
-    JUnitTestCase.assertNotNull(statement.body);
+    expect(variables, isNotNull);
+    expect(variables.variables, hasLength(1));
+    expect(statement.initialization, isNull);
+    expect(statement.leftSeparator, isNotNull);
+    expect(statement.condition, isNotNull);
+    expect(statement.rightSeparator, isNotNull);
+    expect(statement.updaters, hasLength(1));
+    expect(statement.rightParenthesis, isNotNull);
+    expect(statement.body, isNotNull);
   }
 
   void test_parseForStatement_loop_iicuu() {
     ForStatement statement = ParserTestCase.parse4("parseForStatement", "for (int i = 0, j = count; i < j; i++, j--) {}", []);
-    JUnitTestCase.assertNotNull(statement.forKeyword);
-    JUnitTestCase.assertNotNull(statement.leftParenthesis);
+    expect(statement.forKeyword, isNotNull);
+    expect(statement.leftParenthesis, isNotNull);
     VariableDeclarationList variables = statement.variables;
-    JUnitTestCase.assertNotNull(variables);
-    EngineTestCase.assertSizeOfList(2, variables.variables);
-    JUnitTestCase.assertNull(statement.initialization);
-    JUnitTestCase.assertNotNull(statement.leftSeparator);
-    JUnitTestCase.assertNotNull(statement.condition);
-    JUnitTestCase.assertNotNull(statement.rightSeparator);
-    EngineTestCase.assertSizeOfList(2, statement.updaters);
-    JUnitTestCase.assertNotNull(statement.rightParenthesis);
-    JUnitTestCase.assertNotNull(statement.body);
+    expect(variables, isNotNull);
+    expect(variables.variables, hasLength(2));
+    expect(statement.initialization, isNull);
+    expect(statement.leftSeparator, isNotNull);
+    expect(statement.condition, isNotNull);
+    expect(statement.rightSeparator, isNotNull);
+    expect(statement.updaters, hasLength(2));
+    expect(statement.rightParenthesis, isNotNull);
+    expect(statement.body, isNotNull);
   }
 
   void test_parseForStatement_loop_iu() {
     ForStatement statement = ParserTestCase.parse4("parseForStatement", "for (var i = 0;; i++) {}", []);
-    JUnitTestCase.assertNotNull(statement.forKeyword);
-    JUnitTestCase.assertNotNull(statement.leftParenthesis);
+    expect(statement.forKeyword, isNotNull);
+    expect(statement.leftParenthesis, isNotNull);
     VariableDeclarationList variables = statement.variables;
-    JUnitTestCase.assertNotNull(variables);
-    EngineTestCase.assertSizeOfList(1, variables.variables);
-    JUnitTestCase.assertNull(statement.initialization);
-    JUnitTestCase.assertNotNull(statement.leftSeparator);
-    JUnitTestCase.assertNull(statement.condition);
-    JUnitTestCase.assertNotNull(statement.rightSeparator);
-    EngineTestCase.assertSizeOfList(1, statement.updaters);
-    JUnitTestCase.assertNotNull(statement.rightParenthesis);
-    JUnitTestCase.assertNotNull(statement.body);
+    expect(variables, isNotNull);
+    expect(variables.variables, hasLength(1));
+    expect(statement.initialization, isNull);
+    expect(statement.leftSeparator, isNotNull);
+    expect(statement.condition, isNull);
+    expect(statement.rightSeparator, isNotNull);
+    expect(statement.updaters, hasLength(1));
+    expect(statement.rightParenthesis, isNotNull);
+    expect(statement.body, isNotNull);
   }
 
   void test_parseForStatement_loop_u() {
     ForStatement statement = ParserTestCase.parse4("parseForStatement", "for (;; i++) {}", []);
-    JUnitTestCase.assertNotNull(statement.forKeyword);
-    JUnitTestCase.assertNotNull(statement.leftParenthesis);
-    JUnitTestCase.assertNull(statement.variables);
-    JUnitTestCase.assertNull(statement.initialization);
-    JUnitTestCase.assertNotNull(statement.leftSeparator);
-    JUnitTestCase.assertNull(statement.condition);
-    JUnitTestCase.assertNotNull(statement.rightSeparator);
-    EngineTestCase.assertSizeOfList(1, statement.updaters);
-    JUnitTestCase.assertNotNull(statement.rightParenthesis);
-    JUnitTestCase.assertNotNull(statement.body);
+    expect(statement.forKeyword, isNotNull);
+    expect(statement.leftParenthesis, isNotNull);
+    expect(statement.variables, isNull);
+    expect(statement.initialization, isNull);
+    expect(statement.leftSeparator, isNotNull);
+    expect(statement.condition, isNull);
+    expect(statement.rightSeparator, isNotNull);
+    expect(statement.updaters, hasLength(1));
+    expect(statement.rightParenthesis, isNotNull);
+    expect(statement.body, isNotNull);
   }
 
   void test_parseFunctionBody_block() {
     BlockFunctionBody functionBody = ParserTestCase.parse("parseFunctionBody", <Object> [false, null, false], "{}");
-    JUnitTestCase.assertNull(functionBody.keyword);
-    JUnitTestCase.assertNull(functionBody.star);
-    JUnitTestCase.assertNotNull(functionBody.block);
-    JUnitTestCase.assertFalse(functionBody.isAsynchronous);
-    JUnitTestCase.assertFalse(functionBody.isGenerator);
-    JUnitTestCase.assertTrue(functionBody.isSynchronous);
+    expect(functionBody.keyword, isNull);
+    expect(functionBody.star, isNull);
+    expect(functionBody.block, isNotNull);
+    expect(functionBody.isAsynchronous, isFalse);
+    expect(functionBody.isGenerator, isFalse);
+    expect(functionBody.isSynchronous, isTrue);
   }
 
   void test_parseFunctionBody_block_async() {
     BlockFunctionBody functionBody = ParserTestCase.parse("parseFunctionBody", <Object> [false, null, false], "async {}");
-    JUnitTestCase.assertNotNull(functionBody.keyword);
-    JUnitTestCase.assertEquals(Parser.ASYNC, functionBody.keyword.lexeme);
-    JUnitTestCase.assertNull(functionBody.star);
-    JUnitTestCase.assertNotNull(functionBody.block);
-    JUnitTestCase.assertTrue(functionBody.isAsynchronous);
-    JUnitTestCase.assertFalse(functionBody.isGenerator);
-    JUnitTestCase.assertFalse(functionBody.isSynchronous);
+    expect(functionBody.keyword, isNotNull);
+    expect(functionBody.keyword.lexeme, Parser.ASYNC);
+    expect(functionBody.star, isNull);
+    expect(functionBody.block, isNotNull);
+    expect(functionBody.isAsynchronous, isTrue);
+    expect(functionBody.isGenerator, isFalse);
+    expect(functionBody.isSynchronous, isFalse);
   }
 
   void test_parseFunctionBody_block_asyncGenerator() {
     BlockFunctionBody functionBody = ParserTestCase.parse("parseFunctionBody", <Object> [false, null, false], "async* {}");
-    JUnitTestCase.assertNotNull(functionBody.keyword);
-    JUnitTestCase.assertEquals(Parser.ASYNC, functionBody.keyword.lexeme);
-    JUnitTestCase.assertNotNull(functionBody.star);
-    JUnitTestCase.assertNotNull(functionBody.block);
-    JUnitTestCase.assertTrue(functionBody.isAsynchronous);
-    JUnitTestCase.assertTrue(functionBody.isGenerator);
-    JUnitTestCase.assertFalse(functionBody.isSynchronous);
+    expect(functionBody.keyword, isNotNull);
+    expect(functionBody.keyword.lexeme, Parser.ASYNC);
+    expect(functionBody.star, isNotNull);
+    expect(functionBody.block, isNotNull);
+    expect(functionBody.isAsynchronous, isTrue);
+    expect(functionBody.isGenerator, isTrue);
+    expect(functionBody.isSynchronous, isFalse);
   }
 
   void test_parseFunctionBody_block_syncGenerator() {
     BlockFunctionBody functionBody = ParserTestCase.parse("parseFunctionBody", <Object> [false, null, false], "sync* {}");
-    JUnitTestCase.assertNotNull(functionBody.keyword);
-    JUnitTestCase.assertEquals(Parser.SYNC, functionBody.keyword.lexeme);
-    JUnitTestCase.assertNotNull(functionBody.star);
-    JUnitTestCase.assertNotNull(functionBody.block);
-    JUnitTestCase.assertFalse(functionBody.isAsynchronous);
-    JUnitTestCase.assertTrue(functionBody.isGenerator);
-    JUnitTestCase.assertTrue(functionBody.isSynchronous);
+    expect(functionBody.keyword, isNotNull);
+    expect(functionBody.keyword.lexeme, Parser.SYNC);
+    expect(functionBody.star, isNotNull);
+    expect(functionBody.block, isNotNull);
+    expect(functionBody.isAsynchronous, isFalse);
+    expect(functionBody.isGenerator, isTrue);
+    expect(functionBody.isSynchronous, isTrue);
   }
 
   void test_parseFunctionBody_empty() {
     EmptyFunctionBody functionBody = ParserTestCase.parse("parseFunctionBody", <Object> [true, null, false], ";");
-    JUnitTestCase.assertNotNull(functionBody.semicolon);
+    expect(functionBody.semicolon, isNotNull);
   }
 
   void test_parseFunctionBody_expression() {
     ExpressionFunctionBody functionBody = ParserTestCase.parse("parseFunctionBody", <Object> [false, null, false], "=> y;");
-    JUnitTestCase.assertNull(functionBody.keyword);
-    JUnitTestCase.assertNotNull(functionBody.functionDefinition);
-    JUnitTestCase.assertNotNull(functionBody.expression);
-    JUnitTestCase.assertNotNull(functionBody.semicolon);
-    JUnitTestCase.assertFalse(functionBody.isAsynchronous);
-    JUnitTestCase.assertFalse(functionBody.isGenerator);
-    JUnitTestCase.assertTrue(functionBody.isSynchronous);
+    expect(functionBody.keyword, isNull);
+    expect(functionBody.functionDefinition, isNotNull);
+    expect(functionBody.expression, isNotNull);
+    expect(functionBody.semicolon, isNotNull);
+    expect(functionBody.isAsynchronous, isFalse);
+    expect(functionBody.isGenerator, isFalse);
+    expect(functionBody.isSynchronous, isTrue);
   }
 
   void test_parseFunctionBody_expression_async() {
     ExpressionFunctionBody functionBody = ParserTestCase.parse("parseFunctionBody", <Object> [false, null, false], "async => y;");
-    JUnitTestCase.assertNotNull(functionBody.keyword);
-    JUnitTestCase.assertEquals(Parser.ASYNC, functionBody.keyword.lexeme);
-    JUnitTestCase.assertNotNull(functionBody.functionDefinition);
-    JUnitTestCase.assertNotNull(functionBody.expression);
-    JUnitTestCase.assertNotNull(functionBody.semicolon);
-    JUnitTestCase.assertTrue(functionBody.isAsynchronous);
-    JUnitTestCase.assertFalse(functionBody.isGenerator);
-    JUnitTestCase.assertFalse(functionBody.isSynchronous);
+    expect(functionBody.keyword, isNotNull);
+    expect(functionBody.keyword.lexeme, Parser.ASYNC);
+    expect(functionBody.functionDefinition, isNotNull);
+    expect(functionBody.expression, isNotNull);
+    expect(functionBody.semicolon, isNotNull);
+    expect(functionBody.isAsynchronous, isTrue);
+    expect(functionBody.isGenerator, isFalse);
+    expect(functionBody.isSynchronous, isFalse);
   }
 
   void test_parseFunctionBody_nativeFunctionBody() {
     NativeFunctionBody functionBody = ParserTestCase.parse("parseFunctionBody", <Object> [false, null, false], "native 'str';");
-    JUnitTestCase.assertNotNull(functionBody.nativeToken);
-    JUnitTestCase.assertNotNull(functionBody.stringLiteral);
-    JUnitTestCase.assertNotNull(functionBody.semicolon);
+    expect(functionBody.nativeToken, isNotNull);
+    expect(functionBody.stringLiteral, isNotNull);
+    expect(functionBody.semicolon, isNotNull);
   }
 
   void test_parseFunctionBody_skip_block() {
@@ -6200,69 +6216,69 @@
     Comment comment = Comment.createDocumentationComment(new List<Token>(0));
     TypeName returnType = new TypeName(new SimpleIdentifier(null), null);
     FunctionDeclaration declaration = ParserTestCase.parse("parseFunctionDeclaration", <Object> [commentAndMetadata(comment, []), null, returnType], "f() {}");
-    JUnitTestCase.assertEquals(comment, declaration.documentationComment);
-    JUnitTestCase.assertEquals(returnType, declaration.returnType);
-    JUnitTestCase.assertNotNull(declaration.name);
+    expect(declaration.documentationComment, comment);
+    expect(declaration.returnType, returnType);
+    expect(declaration.name, isNotNull);
     FunctionExpression expression = declaration.functionExpression;
-    JUnitTestCase.assertNotNull(expression);
-    JUnitTestCase.assertNotNull(expression.body);
-    JUnitTestCase.assertNotNull(expression.parameters);
-    JUnitTestCase.assertNull(declaration.propertyKeyword);
+    expect(expression, isNotNull);
+    expect(expression.body, isNotNull);
+    expect(expression.parameters, isNotNull);
+    expect(declaration.propertyKeyword, isNull);
   }
 
   void test_parseFunctionDeclaration_getter() {
     Comment comment = Comment.createDocumentationComment(new List<Token>(0));
     TypeName returnType = new TypeName(new SimpleIdentifier(null), null);
     FunctionDeclaration declaration = ParserTestCase.parse("parseFunctionDeclaration", <Object> [commentAndMetadata(comment, []), null, returnType], "get p => 0;");
-    JUnitTestCase.assertEquals(comment, declaration.documentationComment);
-    JUnitTestCase.assertEquals(returnType, declaration.returnType);
-    JUnitTestCase.assertNotNull(declaration.name);
+    expect(declaration.documentationComment, comment);
+    expect(declaration.returnType, returnType);
+    expect(declaration.name, isNotNull);
     FunctionExpression expression = declaration.functionExpression;
-    JUnitTestCase.assertNotNull(expression);
-    JUnitTestCase.assertNotNull(expression.body);
-    JUnitTestCase.assertNull(expression.parameters);
-    JUnitTestCase.assertNotNull(declaration.propertyKeyword);
+    expect(expression, isNotNull);
+    expect(expression.body, isNotNull);
+    expect(expression.parameters, isNull);
+    expect(declaration.propertyKeyword, isNotNull);
   }
 
   void test_parseFunctionDeclaration_setter() {
     Comment comment = Comment.createDocumentationComment(new List<Token>(0));
     TypeName returnType = new TypeName(new SimpleIdentifier(null), null);
     FunctionDeclaration declaration = ParserTestCase.parse("parseFunctionDeclaration", <Object> [commentAndMetadata(comment, []), null, returnType], "set p(v) {}");
-    JUnitTestCase.assertEquals(comment, declaration.documentationComment);
-    JUnitTestCase.assertEquals(returnType, declaration.returnType);
-    JUnitTestCase.assertNotNull(declaration.name);
+    expect(declaration.documentationComment, comment);
+    expect(declaration.returnType, returnType);
+    expect(declaration.name, isNotNull);
     FunctionExpression expression = declaration.functionExpression;
-    JUnitTestCase.assertNotNull(expression);
-    JUnitTestCase.assertNotNull(expression.body);
-    JUnitTestCase.assertNotNull(expression.parameters);
-    JUnitTestCase.assertNotNull(declaration.propertyKeyword);
+    expect(expression, isNotNull);
+    expect(expression.body, isNotNull);
+    expect(expression.parameters, isNotNull);
+    expect(declaration.propertyKeyword, isNotNull);
   }
 
   void test_parseFunctionDeclarationStatement() {
     FunctionDeclarationStatement statement = ParserTestCase.parse4("parseFunctionDeclarationStatement", "void f(int p) => p * 2;", []);
-    JUnitTestCase.assertNotNull(statement.functionDeclaration);
+    expect(statement.functionDeclaration, isNotNull);
   }
 
   void test_parseFunctionExpression_body_inExpression() {
     FunctionExpression expression = ParserTestCase.parse4("parseFunctionExpression", "(int i) => i++", []);
-    JUnitTestCase.assertNotNull(expression.body);
-    JUnitTestCase.assertNotNull(expression.parameters);
-    JUnitTestCase.assertNull((expression.body as ExpressionFunctionBody).semicolon);
+    expect(expression.body, isNotNull);
+    expect(expression.parameters, isNotNull);
+    expect((expression.body as ExpressionFunctionBody).semicolon, isNull);
   }
 
   void test_parseGetter_nonStatic() {
     Comment comment = Comment.createDocumentationComment(new List<Token>(0));
     TypeName returnType = new TypeName(new SimpleIdentifier(null), null);
     MethodDeclaration method = ParserTestCase.parse("parseGetter", <Object> [commentAndMetadata(comment, []), null, null, returnType], "get a;");
-    JUnitTestCase.assertNotNull(method.body);
-    JUnitTestCase.assertEquals(comment, method.documentationComment);
-    JUnitTestCase.assertNull(method.externalKeyword);
-    JUnitTestCase.assertNull(method.modifierKeyword);
-    JUnitTestCase.assertNotNull(method.name);
-    JUnitTestCase.assertNull(method.operatorKeyword);
-    JUnitTestCase.assertNull(method.parameters);
-    JUnitTestCase.assertNotNull(method.propertyKeyword);
-    JUnitTestCase.assertEquals(returnType, method.returnType);
+    expect(method.body, isNotNull);
+    expect(method.documentationComment, comment);
+    expect(method.externalKeyword, isNull);
+    expect(method.modifierKeyword, isNull);
+    expect(method.name, isNotNull);
+    expect(method.operatorKeyword, isNull);
+    expect(method.parameters, isNull);
+    expect(method.propertyKeyword, isNotNull);
+    expect(method.returnType, returnType);
   }
 
   void test_parseGetter_static() {
@@ -6274,158 +6290,158 @@
         null,
         staticKeyword,
         returnType], "get a => 42;");
-    JUnitTestCase.assertNotNull(method.body);
-    JUnitTestCase.assertEquals(comment, method.documentationComment);
-    JUnitTestCase.assertNull(method.externalKeyword);
-    JUnitTestCase.assertEquals(staticKeyword, method.modifierKeyword);
-    JUnitTestCase.assertNotNull(method.name);
-    JUnitTestCase.assertNull(method.operatorKeyword);
-    JUnitTestCase.assertNull(method.parameters);
-    JUnitTestCase.assertNotNull(method.propertyKeyword);
-    JUnitTestCase.assertEquals(returnType, method.returnType);
+    expect(method.body, isNotNull);
+    expect(method.documentationComment, comment);
+    expect(method.externalKeyword, isNull);
+    expect(method.modifierKeyword, staticKeyword);
+    expect(method.name, isNotNull);
+    expect(method.operatorKeyword, isNull);
+    expect(method.parameters, isNull);
+    expect(method.propertyKeyword, isNotNull);
+    expect(method.returnType, returnType);
   }
 
   void test_parseIdentifierList_multiple() {
     List<SimpleIdentifier> list = ParserTestCase.parse4("parseIdentifierList", "a, b, c", []);
-    EngineTestCase.assertSizeOfList(3, list);
+    expect(list, hasLength(3));
   }
 
   void test_parseIdentifierList_single() {
     List<SimpleIdentifier> list = ParserTestCase.parse4("parseIdentifierList", "a", []);
-    EngineTestCase.assertSizeOfList(1, list);
+    expect(list, hasLength(1));
   }
 
   void test_parseIfStatement_else_block() {
     IfStatement statement = ParserTestCase.parse4("parseIfStatement", "if (x) {} else {}", []);
-    JUnitTestCase.assertNotNull(statement.ifKeyword);
-    JUnitTestCase.assertNotNull(statement.leftParenthesis);
-    JUnitTestCase.assertNotNull(statement.condition);
-    JUnitTestCase.assertNotNull(statement.rightParenthesis);
-    JUnitTestCase.assertNotNull(statement.thenStatement);
-    JUnitTestCase.assertNotNull(statement.elseKeyword);
-    JUnitTestCase.assertNotNull(statement.elseStatement);
+    expect(statement.ifKeyword, isNotNull);
+    expect(statement.leftParenthesis, isNotNull);
+    expect(statement.condition, isNotNull);
+    expect(statement.rightParenthesis, isNotNull);
+    expect(statement.thenStatement, isNotNull);
+    expect(statement.elseKeyword, isNotNull);
+    expect(statement.elseStatement, isNotNull);
   }
 
   void test_parseIfStatement_else_statement() {
     IfStatement statement = ParserTestCase.parse4("parseIfStatement", "if (x) f(x); else f(y);", []);
-    JUnitTestCase.assertNotNull(statement.ifKeyword);
-    JUnitTestCase.assertNotNull(statement.leftParenthesis);
-    JUnitTestCase.assertNotNull(statement.condition);
-    JUnitTestCase.assertNotNull(statement.rightParenthesis);
-    JUnitTestCase.assertNotNull(statement.thenStatement);
-    JUnitTestCase.assertNotNull(statement.elseKeyword);
-    JUnitTestCase.assertNotNull(statement.elseStatement);
+    expect(statement.ifKeyword, isNotNull);
+    expect(statement.leftParenthesis, isNotNull);
+    expect(statement.condition, isNotNull);
+    expect(statement.rightParenthesis, isNotNull);
+    expect(statement.thenStatement, isNotNull);
+    expect(statement.elseKeyword, isNotNull);
+    expect(statement.elseStatement, isNotNull);
   }
 
   void test_parseIfStatement_noElse_block() {
     IfStatement statement = ParserTestCase.parse4("parseIfStatement", "if (x) {}", []);
-    JUnitTestCase.assertNotNull(statement.ifKeyword);
-    JUnitTestCase.assertNotNull(statement.leftParenthesis);
-    JUnitTestCase.assertNotNull(statement.condition);
-    JUnitTestCase.assertNotNull(statement.rightParenthesis);
-    JUnitTestCase.assertNotNull(statement.thenStatement);
-    JUnitTestCase.assertNull(statement.elseKeyword);
-    JUnitTestCase.assertNull(statement.elseStatement);
+    expect(statement.ifKeyword, isNotNull);
+    expect(statement.leftParenthesis, isNotNull);
+    expect(statement.condition, isNotNull);
+    expect(statement.rightParenthesis, isNotNull);
+    expect(statement.thenStatement, isNotNull);
+    expect(statement.elseKeyword, isNull);
+    expect(statement.elseStatement, isNull);
   }
 
   void test_parseIfStatement_noElse_statement() {
     IfStatement statement = ParserTestCase.parse4("parseIfStatement", "if (x) f(x);", []);
-    JUnitTestCase.assertNotNull(statement.ifKeyword);
-    JUnitTestCase.assertNotNull(statement.leftParenthesis);
-    JUnitTestCase.assertNotNull(statement.condition);
-    JUnitTestCase.assertNotNull(statement.rightParenthesis);
-    JUnitTestCase.assertNotNull(statement.thenStatement);
-    JUnitTestCase.assertNull(statement.elseKeyword);
-    JUnitTestCase.assertNull(statement.elseStatement);
+    expect(statement.ifKeyword, isNotNull);
+    expect(statement.leftParenthesis, isNotNull);
+    expect(statement.condition, isNotNull);
+    expect(statement.rightParenthesis, isNotNull);
+    expect(statement.thenStatement, isNotNull);
+    expect(statement.elseKeyword, isNull);
+    expect(statement.elseStatement, isNull);
   }
 
   void test_parseImplementsClause_multiple() {
     ImplementsClause clause = ParserTestCase.parse4("parseImplementsClause", "implements A, B, C", []);
-    EngineTestCase.assertSizeOfList(3, clause.interfaces);
-    JUnitTestCase.assertNotNull(clause.keyword);
+    expect(clause.interfaces, hasLength(3));
+    expect(clause.keyword, isNotNull);
   }
 
   void test_parseImplementsClause_single() {
     ImplementsClause clause = ParserTestCase.parse4("parseImplementsClause", "implements A", []);
-    EngineTestCase.assertSizeOfList(1, clause.interfaces);
-    JUnitTestCase.assertNotNull(clause.keyword);
+    expect(clause.interfaces, hasLength(1));
+    expect(clause.keyword, isNotNull);
   }
 
   void test_parseImportDirective_deferred() {
     ImportDirective directive = ParserTestCase.parse("parseImportDirective", <Object> [emptyCommentAndMetadata()], "import 'lib/lib.dart' deferred as a;");
-    JUnitTestCase.assertNotNull(directive.keyword);
-    JUnitTestCase.assertNotNull(directive.uri);
-    JUnitTestCase.assertNotNull(directive.deferredToken);
-    JUnitTestCase.assertNotNull(directive.asToken);
-    JUnitTestCase.assertNotNull(directive.prefix);
-    EngineTestCase.assertSizeOfList(0, directive.combinators);
-    JUnitTestCase.assertNotNull(directive.semicolon);
+    expect(directive.keyword, isNotNull);
+    expect(directive.uri, isNotNull);
+    expect(directive.deferredToken, isNotNull);
+    expect(directive.asToken, isNotNull);
+    expect(directive.prefix, isNotNull);
+    expect(directive.combinators, hasLength(0));
+    expect(directive.semicolon, isNotNull);
   }
 
   void test_parseImportDirective_hide() {
     ImportDirective directive = ParserTestCase.parse("parseImportDirective", <Object> [emptyCommentAndMetadata()], "import 'lib/lib.dart' hide A, B;");
-    JUnitTestCase.assertNotNull(directive.keyword);
-    JUnitTestCase.assertNotNull(directive.uri);
-    JUnitTestCase.assertNull(directive.deferredToken);
-    JUnitTestCase.assertNull(directive.asToken);
-    JUnitTestCase.assertNull(directive.prefix);
-    EngineTestCase.assertSizeOfList(1, directive.combinators);
-    JUnitTestCase.assertNotNull(directive.semicolon);
+    expect(directive.keyword, isNotNull);
+    expect(directive.uri, isNotNull);
+    expect(directive.deferredToken, isNull);
+    expect(directive.asToken, isNull);
+    expect(directive.prefix, isNull);
+    expect(directive.combinators, hasLength(1));
+    expect(directive.semicolon, isNotNull);
   }
 
   void test_parseImportDirective_noCombinator() {
     ImportDirective directive = ParserTestCase.parse("parseImportDirective", <Object> [emptyCommentAndMetadata()], "import 'lib/lib.dart';");
-    JUnitTestCase.assertNotNull(directive.keyword);
-    JUnitTestCase.assertNotNull(directive.uri);
-    JUnitTestCase.assertNull(directive.deferredToken);
-    JUnitTestCase.assertNull(directive.asToken);
-    JUnitTestCase.assertNull(directive.prefix);
-    EngineTestCase.assertSizeOfList(0, directive.combinators);
-    JUnitTestCase.assertNotNull(directive.semicolon);
+    expect(directive.keyword, isNotNull);
+    expect(directive.uri, isNotNull);
+    expect(directive.deferredToken, isNull);
+    expect(directive.asToken, isNull);
+    expect(directive.prefix, isNull);
+    expect(directive.combinators, hasLength(0));
+    expect(directive.semicolon, isNotNull);
   }
 
   void test_parseImportDirective_prefix() {
     ImportDirective directive = ParserTestCase.parse("parseImportDirective", <Object> [emptyCommentAndMetadata()], "import 'lib/lib.dart' as a;");
-    JUnitTestCase.assertNotNull(directive.keyword);
-    JUnitTestCase.assertNotNull(directive.uri);
-    JUnitTestCase.assertNull(directive.deferredToken);
-    JUnitTestCase.assertNotNull(directive.asToken);
-    JUnitTestCase.assertNotNull(directive.prefix);
-    EngineTestCase.assertSizeOfList(0, directive.combinators);
-    JUnitTestCase.assertNotNull(directive.semicolon);
+    expect(directive.keyword, isNotNull);
+    expect(directive.uri, isNotNull);
+    expect(directive.deferredToken, isNull);
+    expect(directive.asToken, isNotNull);
+    expect(directive.prefix, isNotNull);
+    expect(directive.combinators, hasLength(0));
+    expect(directive.semicolon, isNotNull);
   }
 
   void test_parseImportDirective_prefix_hide_show() {
     ImportDirective directive = ParserTestCase.parse("parseImportDirective", <Object> [emptyCommentAndMetadata()], "import 'lib/lib.dart' as a hide A show B;");
-    JUnitTestCase.assertNotNull(directive.keyword);
-    JUnitTestCase.assertNotNull(directive.uri);
-    JUnitTestCase.assertNull(directive.deferredToken);
-    JUnitTestCase.assertNotNull(directive.asToken);
-    JUnitTestCase.assertNotNull(directive.prefix);
-    EngineTestCase.assertSizeOfList(2, directive.combinators);
-    JUnitTestCase.assertNotNull(directive.semicolon);
+    expect(directive.keyword, isNotNull);
+    expect(directive.uri, isNotNull);
+    expect(directive.deferredToken, isNull);
+    expect(directive.asToken, isNotNull);
+    expect(directive.prefix, isNotNull);
+    expect(directive.combinators, hasLength(2));
+    expect(directive.semicolon, isNotNull);
   }
 
   void test_parseImportDirective_prefix_show_hide() {
     ImportDirective directive = ParserTestCase.parse("parseImportDirective", <Object> [emptyCommentAndMetadata()], "import 'lib/lib.dart' as a show B hide A;");
-    JUnitTestCase.assertNotNull(directive.keyword);
-    JUnitTestCase.assertNotNull(directive.uri);
-    JUnitTestCase.assertNull(directive.deferredToken);
-    JUnitTestCase.assertNotNull(directive.asToken);
-    JUnitTestCase.assertNotNull(directive.prefix);
-    EngineTestCase.assertSizeOfList(2, directive.combinators);
-    JUnitTestCase.assertNotNull(directive.semicolon);
+    expect(directive.keyword, isNotNull);
+    expect(directive.uri, isNotNull);
+    expect(directive.deferredToken, isNull);
+    expect(directive.asToken, isNotNull);
+    expect(directive.prefix, isNotNull);
+    expect(directive.combinators, hasLength(2));
+    expect(directive.semicolon, isNotNull);
   }
 
   void test_parseImportDirective_show() {
     ImportDirective directive = ParserTestCase.parse("parseImportDirective", <Object> [emptyCommentAndMetadata()], "import 'lib/lib.dart' show A, B;");
-    JUnitTestCase.assertNotNull(directive.keyword);
-    JUnitTestCase.assertNotNull(directive.uri);
-    JUnitTestCase.assertNull(directive.deferredToken);
-    JUnitTestCase.assertNull(directive.asToken);
-    JUnitTestCase.assertNull(directive.prefix);
-    EngineTestCase.assertSizeOfList(1, directive.combinators);
-    JUnitTestCase.assertNotNull(directive.semicolon);
+    expect(directive.keyword, isNotNull);
+    expect(directive.uri, isNotNull);
+    expect(directive.deferredToken, isNull);
+    expect(directive.asToken, isNull);
+    expect(directive.prefix, isNull);
+    expect(directive.combinators, hasLength(1));
+    expect(directive.semicolon, isNotNull);
   }
 
   void test_parseInitializedIdentifierList_type() {
@@ -6437,14 +6453,14 @@
         staticKeyword,
         null,
         type], "a = 1, b, c = 3;");
-    JUnitTestCase.assertEquals(comment, declaration.documentationComment);
+    expect(declaration.documentationComment, comment);
     VariableDeclarationList fields = declaration.fields;
-    JUnitTestCase.assertNotNull(fields);
-    JUnitTestCase.assertNull(fields.keyword);
-    JUnitTestCase.assertEquals(type, fields.type);
-    EngineTestCase.assertSizeOfList(3, fields.variables);
-    JUnitTestCase.assertEquals(staticKeyword, declaration.staticKeyword);
-    JUnitTestCase.assertNotNull(declaration.semicolon);
+    expect(fields, isNotNull);
+    expect(fields.keyword, isNull);
+    expect(fields.type, type);
+    expect(fields.variables, hasLength(3));
+    expect(declaration.staticKeyword, staticKeyword);
+    expect(declaration.semicolon, isNotNull);
   }
 
   void test_parseInitializedIdentifierList_var() {
@@ -6456,173 +6472,173 @@
         staticKeyword,
         varKeyword,
         null], "a = 1, b, c = 3;");
-    JUnitTestCase.assertEquals(comment, declaration.documentationComment);
+    expect(declaration.documentationComment, comment);
     VariableDeclarationList fields = declaration.fields;
-    JUnitTestCase.assertNotNull(fields);
-    JUnitTestCase.assertEquals(varKeyword, fields.keyword);
-    JUnitTestCase.assertNull(fields.type);
-    EngineTestCase.assertSizeOfList(3, fields.variables);
-    JUnitTestCase.assertEquals(staticKeyword, declaration.staticKeyword);
-    JUnitTestCase.assertNotNull(declaration.semicolon);
+    expect(fields, isNotNull);
+    expect(fields.keyword, varKeyword);
+    expect(fields.type, isNull);
+    expect(fields.variables, hasLength(3));
+    expect(declaration.staticKeyword, staticKeyword);
+    expect(declaration.semicolon, isNotNull);
   }
 
   void test_parseInstanceCreationExpression_qualifiedType() {
     Token token = TokenFactory.tokenFromKeyword(Keyword.NEW);
     InstanceCreationExpression expression = ParserTestCase.parse("parseInstanceCreationExpression", <Object> [token], "A.B()");
-    JUnitTestCase.assertEquals(token, expression.keyword);
+    expect(expression.keyword, token);
     ConstructorName name = expression.constructorName;
-    JUnitTestCase.assertNotNull(name);
-    JUnitTestCase.assertNotNull(name.type);
-    JUnitTestCase.assertNull(name.period);
-    JUnitTestCase.assertNull(name.name);
-    JUnitTestCase.assertNotNull(expression.argumentList);
+    expect(name, isNotNull);
+    expect(name.type, isNotNull);
+    expect(name.period, isNull);
+    expect(name.name, isNull);
+    expect(expression.argumentList, isNotNull);
   }
 
   void test_parseInstanceCreationExpression_qualifiedType_named() {
     Token token = TokenFactory.tokenFromKeyword(Keyword.NEW);
     InstanceCreationExpression expression = ParserTestCase.parse("parseInstanceCreationExpression", <Object> [token], "A.B.c()");
-    JUnitTestCase.assertEquals(token, expression.keyword);
+    expect(expression.keyword, token);
     ConstructorName name = expression.constructorName;
-    JUnitTestCase.assertNotNull(name);
-    JUnitTestCase.assertNotNull(name.type);
-    JUnitTestCase.assertNotNull(name.period);
-    JUnitTestCase.assertNotNull(name.name);
-    JUnitTestCase.assertNotNull(expression.argumentList);
+    expect(name, isNotNull);
+    expect(name.type, isNotNull);
+    expect(name.period, isNotNull);
+    expect(name.name, isNotNull);
+    expect(expression.argumentList, isNotNull);
   }
 
   void test_parseInstanceCreationExpression_type() {
     Token token = TokenFactory.tokenFromKeyword(Keyword.NEW);
     InstanceCreationExpression expression = ParserTestCase.parse("parseInstanceCreationExpression", <Object> [token], "A()");
-    JUnitTestCase.assertEquals(token, expression.keyword);
+    expect(expression.keyword, token);
     ConstructorName name = expression.constructorName;
-    JUnitTestCase.assertNotNull(name);
-    JUnitTestCase.assertNotNull(name.type);
-    JUnitTestCase.assertNull(name.period);
-    JUnitTestCase.assertNull(name.name);
-    JUnitTestCase.assertNotNull(expression.argumentList);
+    expect(name, isNotNull);
+    expect(name.type, isNotNull);
+    expect(name.period, isNull);
+    expect(name.name, isNull);
+    expect(expression.argumentList, isNotNull);
   }
 
   void test_parseInstanceCreationExpression_type_named() {
     Token token = TokenFactory.tokenFromKeyword(Keyword.NEW);
     InstanceCreationExpression expression = ParserTestCase.parse("parseInstanceCreationExpression", <Object> [token], "A<B>.c()");
-    JUnitTestCase.assertEquals(token, expression.keyword);
+    expect(expression.keyword, token);
     ConstructorName name = expression.constructorName;
-    JUnitTestCase.assertNotNull(name);
-    JUnitTestCase.assertNotNull(name.type);
-    JUnitTestCase.assertNotNull(name.period);
-    JUnitTestCase.assertNotNull(name.name);
-    JUnitTestCase.assertNotNull(expression.argumentList);
+    expect(name, isNotNull);
+    expect(name.type, isNotNull);
+    expect(name.period, isNotNull);
+    expect(name.name, isNotNull);
+    expect(expression.argumentList, isNotNull);
   }
 
   void test_parseLibraryDirective() {
     LibraryDirective directive = ParserTestCase.parse("parseLibraryDirective", <Object> [emptyCommentAndMetadata()], "library l;");
-    JUnitTestCase.assertNotNull(directive.libraryToken);
-    JUnitTestCase.assertNotNull(directive.name);
-    JUnitTestCase.assertNotNull(directive.semicolon);
+    expect(directive.libraryToken, isNotNull);
+    expect(directive.name, isNotNull);
+    expect(directive.semicolon, isNotNull);
   }
 
   void test_parseLibraryIdentifier_multiple() {
     String name = "a.b.c";
     LibraryIdentifier identifier = ParserTestCase.parse4("parseLibraryIdentifier", name, []);
-    JUnitTestCase.assertEquals(name, identifier.name);
+    expect(identifier.name, name);
   }
 
   void test_parseLibraryIdentifier_single() {
     String name = "a";
     LibraryIdentifier identifier = ParserTestCase.parse4("parseLibraryIdentifier", name, []);
-    JUnitTestCase.assertEquals(name, identifier.name);
+    expect(identifier.name, name);
   }
 
   void test_parseListLiteral_empty_oneToken() {
     Token token = TokenFactory.tokenFromKeyword(Keyword.CONST);
     TypeArgumentList typeArguments = null;
     ListLiteral literal = ParserTestCase.parse("parseListLiteral", <Object> [token, typeArguments], "[]");
-    JUnitTestCase.assertEquals(token, literal.constKeyword);
-    JUnitTestCase.assertEquals(typeArguments, literal.typeArguments);
-    JUnitTestCase.assertNotNull(literal.leftBracket);
-    EngineTestCase.assertSizeOfList(0, literal.elements);
-    JUnitTestCase.assertNotNull(literal.rightBracket);
+    expect(literal.constKeyword, token);
+    expect(literal.typeArguments, typeArguments);
+    expect(literal.leftBracket, isNotNull);
+    expect(literal.elements, hasLength(0));
+    expect(literal.rightBracket, isNotNull);
   }
 
   void test_parseListLiteral_empty_twoTokens() {
     Token token = TokenFactory.tokenFromKeyword(Keyword.CONST);
     TypeArgumentList typeArguments = null;
     ListLiteral literal = ParserTestCase.parse("parseListLiteral", <Object> [token, typeArguments], "[ ]");
-    JUnitTestCase.assertEquals(token, literal.constKeyword);
-    JUnitTestCase.assertEquals(typeArguments, literal.typeArguments);
-    JUnitTestCase.assertNotNull(literal.leftBracket);
-    EngineTestCase.assertSizeOfList(0, literal.elements);
-    JUnitTestCase.assertNotNull(literal.rightBracket);
+    expect(literal.constKeyword, token);
+    expect(literal.typeArguments, typeArguments);
+    expect(literal.leftBracket, isNotNull);
+    expect(literal.elements, hasLength(0));
+    expect(literal.rightBracket, isNotNull);
   }
 
   void test_parseListLiteral_multiple() {
     ListLiteral literal = ParserTestCase.parse("parseListLiteral", <Object> [null, null], "[1, 2, 3]");
-    JUnitTestCase.assertNull(literal.constKeyword);
-    JUnitTestCase.assertNull(literal.typeArguments);
-    JUnitTestCase.assertNotNull(literal.leftBracket);
-    EngineTestCase.assertSizeOfList(3, literal.elements);
-    JUnitTestCase.assertNotNull(literal.rightBracket);
+    expect(literal.constKeyword, isNull);
+    expect(literal.typeArguments, isNull);
+    expect(literal.leftBracket, isNotNull);
+    expect(literal.elements, hasLength(3));
+    expect(literal.rightBracket, isNotNull);
   }
 
   void test_parseListLiteral_single() {
     ListLiteral literal = ParserTestCase.parse("parseListLiteral", <Object> [null, null], "[1]");
-    JUnitTestCase.assertNull(literal.constKeyword);
-    JUnitTestCase.assertNull(literal.typeArguments);
-    JUnitTestCase.assertNotNull(literal.leftBracket);
-    EngineTestCase.assertSizeOfList(1, literal.elements);
-    JUnitTestCase.assertNotNull(literal.rightBracket);
+    expect(literal.constKeyword, isNull);
+    expect(literal.typeArguments, isNull);
+    expect(literal.leftBracket, isNotNull);
+    expect(literal.elements, hasLength(1));
+    expect(literal.rightBracket, isNotNull);
   }
 
   void test_parseListOrMapLiteral_list_noType() {
     ListLiteral literal = ParserTestCase.parse("parseListOrMapLiteral", <Object> [null], "[1]");
-    JUnitTestCase.assertNull(literal.constKeyword);
-    JUnitTestCase.assertNull(literal.typeArguments);
-    JUnitTestCase.assertNotNull(literal.leftBracket);
-    EngineTestCase.assertSizeOfList(1, literal.elements);
-    JUnitTestCase.assertNotNull(literal.rightBracket);
+    expect(literal.constKeyword, isNull);
+    expect(literal.typeArguments, isNull);
+    expect(literal.leftBracket, isNotNull);
+    expect(literal.elements, hasLength(1));
+    expect(literal.rightBracket, isNotNull);
   }
 
   void test_parseListOrMapLiteral_list_type() {
     ListLiteral literal = ParserTestCase.parse("parseListOrMapLiteral", <Object> [null], "<int> [1]");
-    JUnitTestCase.assertNull(literal.constKeyword);
-    JUnitTestCase.assertNotNull(literal.typeArguments);
-    JUnitTestCase.assertNotNull(literal.leftBracket);
-    EngineTestCase.assertSizeOfList(1, literal.elements);
-    JUnitTestCase.assertNotNull(literal.rightBracket);
+    expect(literal.constKeyword, isNull);
+    expect(literal.typeArguments, isNotNull);
+    expect(literal.leftBracket, isNotNull);
+    expect(literal.elements, hasLength(1));
+    expect(literal.rightBracket, isNotNull);
   }
 
   void test_parseListOrMapLiteral_map_noType() {
     MapLiteral literal = ParserTestCase.parse("parseListOrMapLiteral", <Object> [null], "{'1' : 1}");
-    JUnitTestCase.assertNull(literal.constKeyword);
-    JUnitTestCase.assertNull(literal.typeArguments);
-    JUnitTestCase.assertNotNull(literal.leftBracket);
-    EngineTestCase.assertSizeOfList(1, literal.entries);
-    JUnitTestCase.assertNotNull(literal.rightBracket);
+    expect(literal.constKeyword, isNull);
+    expect(literal.typeArguments, isNull);
+    expect(literal.leftBracket, isNotNull);
+    expect(literal.entries, hasLength(1));
+    expect(literal.rightBracket, isNotNull);
   }
 
   void test_parseListOrMapLiteral_map_type() {
     MapLiteral literal = ParserTestCase.parse("parseListOrMapLiteral", <Object> [null], "<String, int> {'1' : 1}");
-    JUnitTestCase.assertNull(literal.constKeyword);
-    JUnitTestCase.assertNotNull(literal.typeArguments);
-    JUnitTestCase.assertNotNull(literal.leftBracket);
-    EngineTestCase.assertSizeOfList(1, literal.entries);
-    JUnitTestCase.assertNotNull(literal.rightBracket);
+    expect(literal.constKeyword, isNull);
+    expect(literal.typeArguments, isNotNull);
+    expect(literal.leftBracket, isNotNull);
+    expect(literal.entries, hasLength(1));
+    expect(literal.rightBracket, isNotNull);
   }
 
   void test_parseLogicalAndExpression() {
     BinaryExpression expression = ParserTestCase.parse4("parseLogicalAndExpression", "x && y", []);
-    JUnitTestCase.assertNotNull(expression.leftOperand);
-    JUnitTestCase.assertNotNull(expression.operator);
-    JUnitTestCase.assertEquals(TokenType.AMPERSAND_AMPERSAND, expression.operator.type);
-    JUnitTestCase.assertNotNull(expression.rightOperand);
+    expect(expression.leftOperand, isNotNull);
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.AMPERSAND_AMPERSAND);
+    expect(expression.rightOperand, isNotNull);
   }
 
   void test_parseLogicalOrExpression() {
     BinaryExpression expression = ParserTestCase.parse4("parseLogicalOrExpression", "x || y", []);
-    JUnitTestCase.assertNotNull(expression.leftOperand);
-    JUnitTestCase.assertNotNull(expression.operator);
-    JUnitTestCase.assertEquals(TokenType.BAR_BAR, expression.operator.type);
-    JUnitTestCase.assertNotNull(expression.rightOperand);
+    expect(expression.leftOperand, isNotNull);
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.BAR_BAR);
+    expect(expression.rightOperand, isNotNull);
   }
 
   void test_parseMapLiteral_empty() {
@@ -6631,149 +6647,149 @@
         AstFactory.typeName4("String", []),
         AstFactory.typeName4("int", [])]);
     MapLiteral literal = ParserTestCase.parse("parseMapLiteral", <Object> [token, typeArguments], "{}");
-    JUnitTestCase.assertEquals(token, literal.constKeyword);
-    JUnitTestCase.assertEquals(typeArguments, literal.typeArguments);
-    JUnitTestCase.assertNotNull(literal.leftBracket);
-    EngineTestCase.assertSizeOfList(0, literal.entries);
-    JUnitTestCase.assertNotNull(literal.rightBracket);
+    expect(literal.constKeyword, token);
+    expect(literal.typeArguments, typeArguments);
+    expect(literal.leftBracket, isNotNull);
+    expect(literal.entries, hasLength(0));
+    expect(literal.rightBracket, isNotNull);
   }
 
   void test_parseMapLiteral_multiple() {
     MapLiteral literal = ParserTestCase.parse("parseMapLiteral", <Object> [null, null], "{'a' : b, 'x' : y}");
-    JUnitTestCase.assertNotNull(literal.leftBracket);
-    EngineTestCase.assertSizeOfList(2, literal.entries);
-    JUnitTestCase.assertNotNull(literal.rightBracket);
+    expect(literal.leftBracket, isNotNull);
+    expect(literal.entries, hasLength(2));
+    expect(literal.rightBracket, isNotNull);
   }
 
   void test_parseMapLiteral_single() {
     MapLiteral literal = ParserTestCase.parse("parseMapLiteral", <Object> [null, null], "{'x' : y}");
-    JUnitTestCase.assertNotNull(literal.leftBracket);
-    EngineTestCase.assertSizeOfList(1, literal.entries);
-    JUnitTestCase.assertNotNull(literal.rightBracket);
+    expect(literal.leftBracket, isNotNull);
+    expect(literal.entries, hasLength(1));
+    expect(literal.rightBracket, isNotNull);
   }
 
   void test_parseMapLiteralEntry_complex() {
     MapLiteralEntry entry = ParserTestCase.parse4("parseMapLiteralEntry", "2 + 2 : y", []);
-    JUnitTestCase.assertNotNull(entry.key);
-    JUnitTestCase.assertNotNull(entry.separator);
-    JUnitTestCase.assertNotNull(entry.value);
+    expect(entry.key, isNotNull);
+    expect(entry.separator, isNotNull);
+    expect(entry.value, isNotNull);
   }
 
   void test_parseMapLiteralEntry_int() {
     MapLiteralEntry entry = ParserTestCase.parse4("parseMapLiteralEntry", "0 : y", []);
-    JUnitTestCase.assertNotNull(entry.key);
-    JUnitTestCase.assertNotNull(entry.separator);
-    JUnitTestCase.assertNotNull(entry.value);
+    expect(entry.key, isNotNull);
+    expect(entry.separator, isNotNull);
+    expect(entry.value, isNotNull);
   }
 
   void test_parseMapLiteralEntry_string() {
     MapLiteralEntry entry = ParserTestCase.parse4("parseMapLiteralEntry", "'x' : y", []);
-    JUnitTestCase.assertNotNull(entry.key);
-    JUnitTestCase.assertNotNull(entry.separator);
-    JUnitTestCase.assertNotNull(entry.value);
+    expect(entry.key, isNotNull);
+    expect(entry.separator, isNotNull);
+    expect(entry.value, isNotNull);
   }
 
   void test_parseModifiers_abstract() {
     Modifiers modifiers = ParserTestCase.parse4("parseModifiers", "abstract A", []);
-    JUnitTestCase.assertNotNull(modifiers.abstractKeyword);
+    expect(modifiers.abstractKeyword, isNotNull);
   }
 
   void test_parseModifiers_const() {
     Modifiers modifiers = ParserTestCase.parse4("parseModifiers", "const A", []);
-    JUnitTestCase.assertNotNull(modifiers.constKeyword);
+    expect(modifiers.constKeyword, isNotNull);
   }
 
   void test_parseModifiers_external() {
     Modifiers modifiers = ParserTestCase.parse4("parseModifiers", "external A", []);
-    JUnitTestCase.assertNotNull(modifiers.externalKeyword);
+    expect(modifiers.externalKeyword, isNotNull);
   }
 
   void test_parseModifiers_factory() {
     Modifiers modifiers = ParserTestCase.parse4("parseModifiers", "factory A", []);
-    JUnitTestCase.assertNotNull(modifiers.factoryKeyword);
+    expect(modifiers.factoryKeyword, isNotNull);
   }
 
   void test_parseModifiers_final() {
     Modifiers modifiers = ParserTestCase.parse4("parseModifiers", "final A", []);
-    JUnitTestCase.assertNotNull(modifiers.finalKeyword);
+    expect(modifiers.finalKeyword, isNotNull);
   }
 
   void test_parseModifiers_static() {
     Modifiers modifiers = ParserTestCase.parse4("parseModifiers", "static A", []);
-    JUnitTestCase.assertNotNull(modifiers.staticKeyword);
+    expect(modifiers.staticKeyword, isNotNull);
   }
 
   void test_parseModifiers_var() {
     Modifiers modifiers = ParserTestCase.parse4("parseModifiers", "var A", []);
-    JUnitTestCase.assertNotNull(modifiers.varKeyword);
+    expect(modifiers.varKeyword, isNotNull);
   }
 
   void test_parseMultiplicativeExpression_normal() {
     BinaryExpression expression = ParserTestCase.parse4("parseMultiplicativeExpression", "x * y", []);
-    JUnitTestCase.assertNotNull(expression.leftOperand);
-    JUnitTestCase.assertNotNull(expression.operator);
-    JUnitTestCase.assertEquals(TokenType.STAR, expression.operator.type);
-    JUnitTestCase.assertNotNull(expression.rightOperand);
+    expect(expression.leftOperand, isNotNull);
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.STAR);
+    expect(expression.rightOperand, isNotNull);
   }
 
   void test_parseMultiplicativeExpression_super() {
     BinaryExpression expression = ParserTestCase.parse4("parseMultiplicativeExpression", "super * y", []);
     EngineTestCase.assertInstanceOf((obj) => obj is SuperExpression, SuperExpression, expression.leftOperand);
-    JUnitTestCase.assertNotNull(expression.operator);
-    JUnitTestCase.assertEquals(TokenType.STAR, expression.operator.type);
-    JUnitTestCase.assertNotNull(expression.rightOperand);
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.STAR);
+    expect(expression.rightOperand, isNotNull);
   }
 
   void test_parseNewExpression() {
     InstanceCreationExpression expression = ParserTestCase.parse4("parseNewExpression", "new A()", []);
-    JUnitTestCase.assertNotNull(expression.keyword);
+    expect(expression.keyword, isNotNull);
     ConstructorName name = expression.constructorName;
-    JUnitTestCase.assertNotNull(name);
-    JUnitTestCase.assertNotNull(name.type);
-    JUnitTestCase.assertNull(name.period);
-    JUnitTestCase.assertNull(name.name);
-    JUnitTestCase.assertNotNull(expression.argumentList);
+    expect(name, isNotNull);
+    expect(name.type, isNotNull);
+    expect(name.period, isNull);
+    expect(name.name, isNull);
+    expect(expression.argumentList, isNotNull);
   }
 
   void test_parseNonLabeledStatement_const_list_empty() {
     ExpressionStatement statement = ParserTestCase.parse4("parseNonLabeledStatement", "const [];", []);
-    JUnitTestCase.assertNotNull(statement.expression);
+    expect(statement.expression, isNotNull);
   }
 
   void test_parseNonLabeledStatement_const_list_nonEmpty() {
     ExpressionStatement statement = ParserTestCase.parse4("parseNonLabeledStatement", "const [1, 2];", []);
-    JUnitTestCase.assertNotNull(statement.expression);
+    expect(statement.expression, isNotNull);
   }
 
   void test_parseNonLabeledStatement_const_map_empty() {
     ExpressionStatement statement = ParserTestCase.parse4("parseNonLabeledStatement", "const {};", []);
-    JUnitTestCase.assertNotNull(statement.expression);
+    expect(statement.expression, isNotNull);
   }
 
   void test_parseNonLabeledStatement_const_map_nonEmpty() {
     // TODO(brianwilkerson) Implement more tests for this method.
     ExpressionStatement statement = ParserTestCase.parse4("parseNonLabeledStatement", "const {'a' : 1};", []);
-    JUnitTestCase.assertNotNull(statement.expression);
+    expect(statement.expression, isNotNull);
   }
 
   void test_parseNonLabeledStatement_const_object() {
     ExpressionStatement statement = ParserTestCase.parse4("parseNonLabeledStatement", "const A();", []);
-    JUnitTestCase.assertNotNull(statement.expression);
+    expect(statement.expression, isNotNull);
   }
 
   void test_parseNonLabeledStatement_const_object_named_typeParameters() {
     ExpressionStatement statement = ParserTestCase.parse4("parseNonLabeledStatement", "const A<B>.c();", []);
-    JUnitTestCase.assertNotNull(statement.expression);
+    expect(statement.expression, isNotNull);
   }
 
   void test_parseNonLabeledStatement_constructorInvocation() {
     ExpressionStatement statement = ParserTestCase.parse4("parseNonLabeledStatement", "new C().m();", []);
-    JUnitTestCase.assertNotNull(statement.expression);
+    expect(statement.expression, isNotNull);
   }
 
   void test_parseNonLabeledStatement_false() {
     ExpressionStatement statement = ParserTestCase.parse4("parseNonLabeledStatement", "false;", []);
-    JUnitTestCase.assertNotNull(statement.expression);
+    expect(statement.expression, isNotNull);
   }
 
   void test_parseNonLabeledStatement_functionDeclaration() {
@@ -6790,7 +6806,7 @@
 
   void test_parseNonLabeledStatement_functionInvocation() {
     ExpressionStatement statement = ParserTestCase.parse4("parseNonLabeledStatement", "f();", []);
-    JUnitTestCase.assertNotNull(statement.expression);
+    expect(statement.expression, isNotNull);
   }
 
   void test_parseNonLabeledStatement_invokeFunctionExpression() {
@@ -6799,185 +6815,185 @@
     FunctionExpressionInvocation invocation = statement.expression as FunctionExpressionInvocation;
     EngineTestCase.assertInstanceOf((obj) => obj is FunctionExpression, FunctionExpression, invocation.function);
     FunctionExpression expression = invocation.function as FunctionExpression;
-    JUnitTestCase.assertNotNull(expression.parameters);
-    JUnitTestCase.assertNotNull(expression.body);
+    expect(expression.parameters, isNotNull);
+    expect(expression.body, isNotNull);
     ArgumentList list = invocation.argumentList;
-    JUnitTestCase.assertNotNull(list);
-    EngineTestCase.assertSizeOfList(1, list.arguments);
+    expect(list, isNotNull);
+    expect(list.arguments, hasLength(1));
   }
 
   void test_parseNonLabeledStatement_null() {
     ExpressionStatement statement = ParserTestCase.parse4("parseNonLabeledStatement", "null;", []);
-    JUnitTestCase.assertNotNull(statement.expression);
+    expect(statement.expression, isNotNull);
   }
 
   void test_parseNonLabeledStatement_startingWithBuiltInIdentifier() {
     ExpressionStatement statement = ParserTestCase.parse4("parseNonLabeledStatement", "library.getName();", []);
-    JUnitTestCase.assertNotNull(statement.expression);
+    expect(statement.expression, isNotNull);
   }
 
   void test_parseNonLabeledStatement_true() {
     ExpressionStatement statement = ParserTestCase.parse4("parseNonLabeledStatement", "true;", []);
-    JUnitTestCase.assertNotNull(statement.expression);
+    expect(statement.expression, isNotNull);
   }
 
   void test_parseNonLabeledStatement_typeCast() {
     ExpressionStatement statement = ParserTestCase.parse4("parseNonLabeledStatement", "double.NAN as num;", []);
-    JUnitTestCase.assertNotNull(statement.expression);
+    expect(statement.expression, isNotNull);
   }
 
   void test_parseNormalFormalParameter_field_const_noType() {
     FieldFormalParameter parameter = ParserTestCase.parse4("parseNormalFormalParameter", "const this.a)", []);
-    JUnitTestCase.assertNotNull(parameter.keyword);
-    JUnitTestCase.assertNull(parameter.type);
-    JUnitTestCase.assertNotNull(parameter.identifier);
-    JUnitTestCase.assertNull(parameter.parameters);
+    expect(parameter.keyword, isNotNull);
+    expect(parameter.type, isNull);
+    expect(parameter.identifier, isNotNull);
+    expect(parameter.parameters, isNull);
   }
 
   void test_parseNormalFormalParameter_field_const_type() {
     FieldFormalParameter parameter = ParserTestCase.parse4("parseNormalFormalParameter", "const A this.a)", []);
-    JUnitTestCase.assertNotNull(parameter.keyword);
-    JUnitTestCase.assertNotNull(parameter.type);
-    JUnitTestCase.assertNotNull(parameter.identifier);
-    JUnitTestCase.assertNull(parameter.parameters);
+    expect(parameter.keyword, isNotNull);
+    expect(parameter.type, isNotNull);
+    expect(parameter.identifier, isNotNull);
+    expect(parameter.parameters, isNull);
   }
 
   void test_parseNormalFormalParameter_field_final_noType() {
     FieldFormalParameter parameter = ParserTestCase.parse4("parseNormalFormalParameter", "final this.a)", []);
-    JUnitTestCase.assertNotNull(parameter.keyword);
-    JUnitTestCase.assertNull(parameter.type);
-    JUnitTestCase.assertNotNull(parameter.identifier);
-    JUnitTestCase.assertNull(parameter.parameters);
+    expect(parameter.keyword, isNotNull);
+    expect(parameter.type, isNull);
+    expect(parameter.identifier, isNotNull);
+    expect(parameter.parameters, isNull);
   }
 
   void test_parseNormalFormalParameter_field_final_type() {
     FieldFormalParameter parameter = ParserTestCase.parse4("parseNormalFormalParameter", "final A this.a)", []);
-    JUnitTestCase.assertNotNull(parameter.keyword);
-    JUnitTestCase.assertNotNull(parameter.type);
-    JUnitTestCase.assertNotNull(parameter.identifier);
-    JUnitTestCase.assertNull(parameter.parameters);
+    expect(parameter.keyword, isNotNull);
+    expect(parameter.type, isNotNull);
+    expect(parameter.identifier, isNotNull);
+    expect(parameter.parameters, isNull);
   }
 
   void test_parseNormalFormalParameter_field_function_nested() {
     FieldFormalParameter parameter = ParserTestCase.parse4("parseNormalFormalParameter", "this.a(B b))", []);
-    JUnitTestCase.assertNull(parameter.keyword);
-    JUnitTestCase.assertNull(parameter.type);
-    JUnitTestCase.assertNotNull(parameter.identifier);
+    expect(parameter.keyword, isNull);
+    expect(parameter.type, isNull);
+    expect(parameter.identifier, isNotNull);
     FormalParameterList parameterList = parameter.parameters;
-    JUnitTestCase.assertNotNull(parameterList);
-    EngineTestCase.assertSizeOfList(1, parameterList.parameters);
+    expect(parameterList, isNotNull);
+    expect(parameterList.parameters, hasLength(1));
   }
 
   void test_parseNormalFormalParameter_field_function_noNested() {
     FieldFormalParameter parameter = ParserTestCase.parse4("parseNormalFormalParameter", "this.a())", []);
-    JUnitTestCase.assertNull(parameter.keyword);
-    JUnitTestCase.assertNull(parameter.type);
-    JUnitTestCase.assertNotNull(parameter.identifier);
+    expect(parameter.keyword, isNull);
+    expect(parameter.type, isNull);
+    expect(parameter.identifier, isNotNull);
     FormalParameterList parameterList = parameter.parameters;
-    JUnitTestCase.assertNotNull(parameterList);
-    EngineTestCase.assertSizeOfList(0, parameterList.parameters);
+    expect(parameterList, isNotNull);
+    expect(parameterList.parameters, hasLength(0));
   }
 
   void test_parseNormalFormalParameter_field_noType() {
     FieldFormalParameter parameter = ParserTestCase.parse4("parseNormalFormalParameter", "this.a)", []);
-    JUnitTestCase.assertNull(parameter.keyword);
-    JUnitTestCase.assertNull(parameter.type);
-    JUnitTestCase.assertNotNull(parameter.identifier);
-    JUnitTestCase.assertNull(parameter.parameters);
+    expect(parameter.keyword, isNull);
+    expect(parameter.type, isNull);
+    expect(parameter.identifier, isNotNull);
+    expect(parameter.parameters, isNull);
   }
 
   void test_parseNormalFormalParameter_field_type() {
     FieldFormalParameter parameter = ParserTestCase.parse4("parseNormalFormalParameter", "A this.a)", []);
-    JUnitTestCase.assertNull(parameter.keyword);
-    JUnitTestCase.assertNotNull(parameter.type);
-    JUnitTestCase.assertNotNull(parameter.identifier);
-    JUnitTestCase.assertNull(parameter.parameters);
+    expect(parameter.keyword, isNull);
+    expect(parameter.type, isNotNull);
+    expect(parameter.identifier, isNotNull);
+    expect(parameter.parameters, isNull);
   }
 
   void test_parseNormalFormalParameter_field_var() {
     FieldFormalParameter parameter = ParserTestCase.parse4("parseNormalFormalParameter", "var this.a)", []);
-    JUnitTestCase.assertNotNull(parameter.keyword);
-    JUnitTestCase.assertNull(parameter.type);
-    JUnitTestCase.assertNotNull(parameter.identifier);
-    JUnitTestCase.assertNull(parameter.parameters);
+    expect(parameter.keyword, isNotNull);
+    expect(parameter.type, isNull);
+    expect(parameter.identifier, isNotNull);
+    expect(parameter.parameters, isNull);
   }
 
   void test_parseNormalFormalParameter_function_noType() {
     FunctionTypedFormalParameter parameter = ParserTestCase.parse4("parseNormalFormalParameter", "a())", []);
-    JUnitTestCase.assertNull(parameter.returnType);
-    JUnitTestCase.assertNotNull(parameter.identifier);
-    JUnitTestCase.assertNotNull(parameter.parameters);
+    expect(parameter.returnType, isNull);
+    expect(parameter.identifier, isNotNull);
+    expect(parameter.parameters, isNotNull);
   }
 
   void test_parseNormalFormalParameter_function_type() {
     FunctionTypedFormalParameter parameter = ParserTestCase.parse4("parseNormalFormalParameter", "A a())", []);
-    JUnitTestCase.assertNotNull(parameter.returnType);
-    JUnitTestCase.assertNotNull(parameter.identifier);
-    JUnitTestCase.assertNotNull(parameter.parameters);
+    expect(parameter.returnType, isNotNull);
+    expect(parameter.identifier, isNotNull);
+    expect(parameter.parameters, isNotNull);
   }
 
   void test_parseNormalFormalParameter_function_void() {
     FunctionTypedFormalParameter parameter = ParserTestCase.parse4("parseNormalFormalParameter", "void a())", []);
-    JUnitTestCase.assertNotNull(parameter.returnType);
-    JUnitTestCase.assertNotNull(parameter.identifier);
-    JUnitTestCase.assertNotNull(parameter.parameters);
+    expect(parameter.returnType, isNotNull);
+    expect(parameter.identifier, isNotNull);
+    expect(parameter.parameters, isNotNull);
   }
 
   void test_parseNormalFormalParameter_simple_const_noType() {
     SimpleFormalParameter parameter = ParserTestCase.parse4("parseNormalFormalParameter", "const a)", []);
-    JUnitTestCase.assertNotNull(parameter.keyword);
-    JUnitTestCase.assertNull(parameter.type);
-    JUnitTestCase.assertNotNull(parameter.identifier);
+    expect(parameter.keyword, isNotNull);
+    expect(parameter.type, isNull);
+    expect(parameter.identifier, isNotNull);
   }
 
   void test_parseNormalFormalParameter_simple_const_type() {
     SimpleFormalParameter parameter = ParserTestCase.parse4("parseNormalFormalParameter", "const A a)", []);
-    JUnitTestCase.assertNotNull(parameter.keyword);
-    JUnitTestCase.assertNotNull(parameter.type);
-    JUnitTestCase.assertNotNull(parameter.identifier);
+    expect(parameter.keyword, isNotNull);
+    expect(parameter.type, isNotNull);
+    expect(parameter.identifier, isNotNull);
   }
 
   void test_parseNormalFormalParameter_simple_final_noType() {
     SimpleFormalParameter parameter = ParserTestCase.parse4("parseNormalFormalParameter", "final a)", []);
-    JUnitTestCase.assertNotNull(parameter.keyword);
-    JUnitTestCase.assertNull(parameter.type);
-    JUnitTestCase.assertNotNull(parameter.identifier);
+    expect(parameter.keyword, isNotNull);
+    expect(parameter.type, isNull);
+    expect(parameter.identifier, isNotNull);
   }
 
   void test_parseNormalFormalParameter_simple_final_type() {
     SimpleFormalParameter parameter = ParserTestCase.parse4("parseNormalFormalParameter", "final A a)", []);
-    JUnitTestCase.assertNotNull(parameter.keyword);
-    JUnitTestCase.assertNotNull(parameter.type);
-    JUnitTestCase.assertNotNull(parameter.identifier);
+    expect(parameter.keyword, isNotNull);
+    expect(parameter.type, isNotNull);
+    expect(parameter.identifier, isNotNull);
   }
 
   void test_parseNormalFormalParameter_simple_noType() {
     SimpleFormalParameter parameter = ParserTestCase.parse4("parseNormalFormalParameter", "a)", []);
-    JUnitTestCase.assertNull(parameter.keyword);
-    JUnitTestCase.assertNull(parameter.type);
-    JUnitTestCase.assertNotNull(parameter.identifier);
+    expect(parameter.keyword, isNull);
+    expect(parameter.type, isNull);
+    expect(parameter.identifier, isNotNull);
   }
 
   void test_parseNormalFormalParameter_simple_type() {
     SimpleFormalParameter parameter = ParserTestCase.parse4("parseNormalFormalParameter", "A a)", []);
-    JUnitTestCase.assertNull(parameter.keyword);
-    JUnitTestCase.assertNotNull(parameter.type);
-    JUnitTestCase.assertNotNull(parameter.identifier);
+    expect(parameter.keyword, isNull);
+    expect(parameter.type, isNotNull);
+    expect(parameter.identifier, isNotNull);
   }
 
   void test_parseOperator() {
     Comment comment = Comment.createDocumentationComment(new List<Token>(0));
     TypeName returnType = new TypeName(new SimpleIdentifier(null), null);
     MethodDeclaration method = ParserTestCase.parse("parseOperator", <Object> [commentAndMetadata(comment, []), null, returnType], "operator +(A a);");
-    JUnitTestCase.assertNotNull(method.body);
-    JUnitTestCase.assertEquals(comment, method.documentationComment);
-    JUnitTestCase.assertNull(method.externalKeyword);
-    JUnitTestCase.assertNull(method.modifierKeyword);
-    JUnitTestCase.assertNotNull(method.name);
-    JUnitTestCase.assertNotNull(method.operatorKeyword);
-    JUnitTestCase.assertNotNull(method.parameters);
-    JUnitTestCase.assertNull(method.propertyKeyword);
-    JUnitTestCase.assertEquals(returnType, method.returnType);
+    expect(method.body, isNotNull);
+    expect(method.documentationComment, comment);
+    expect(method.externalKeyword, isNull);
+    expect(method.modifierKeyword, isNull);
+    expect(method.name, isNotNull);
+    expect(method.operatorKeyword, isNotNull);
+    expect(method.parameters, isNotNull);
+    expect(method.propertyKeyword, isNull);
+    expect(method.returnType, returnType);
   }
 
   void test_parseOptionalReturnType() {
@@ -6986,301 +7002,301 @@
 
   void test_parsePartDirective_part() {
     PartDirective directive = ParserTestCase.parse("parsePartDirective", <Object> [emptyCommentAndMetadata()], "part 'lib/lib.dart';");
-    JUnitTestCase.assertNotNull(directive.partToken);
-    JUnitTestCase.assertNotNull(directive.uri);
-    JUnitTestCase.assertNotNull(directive.semicolon);
+    expect(directive.partToken, isNotNull);
+    expect(directive.uri, isNotNull);
+    expect(directive.semicolon, isNotNull);
   }
 
   void test_parsePartDirective_partOf() {
     PartOfDirective directive = ParserTestCase.parse("parsePartDirective", <Object> [emptyCommentAndMetadata()], "part of l;");
-    JUnitTestCase.assertNotNull(directive.partToken);
-    JUnitTestCase.assertNotNull(directive.ofToken);
-    JUnitTestCase.assertNotNull(directive.libraryName);
-    JUnitTestCase.assertNotNull(directive.semicolon);
+    expect(directive.partToken, isNotNull);
+    expect(directive.ofToken, isNotNull);
+    expect(directive.libraryName, isNotNull);
+    expect(directive.semicolon, isNotNull);
   }
 
   void test_parsePostfixExpression_decrement() {
     PostfixExpression expression = ParserTestCase.parse4("parsePostfixExpression", "i--", []);
-    JUnitTestCase.assertNotNull(expression.operand);
-    JUnitTestCase.assertNotNull(expression.operator);
-    JUnitTestCase.assertEquals(TokenType.MINUS_MINUS, expression.operator.type);
+    expect(expression.operand, isNotNull);
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.MINUS_MINUS);
   }
 
   void test_parsePostfixExpression_increment() {
     PostfixExpression expression = ParserTestCase.parse4("parsePostfixExpression", "i++", []);
-    JUnitTestCase.assertNotNull(expression.operand);
-    JUnitTestCase.assertNotNull(expression.operator);
-    JUnitTestCase.assertEquals(TokenType.PLUS_PLUS, expression.operator.type);
+    expect(expression.operand, isNotNull);
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.PLUS_PLUS);
   }
 
   void test_parsePostfixExpression_none_indexExpression() {
     IndexExpression expression = ParserTestCase.parse4("parsePostfixExpression", "a[0]", []);
-    JUnitTestCase.assertNotNull(expression.target);
-    JUnitTestCase.assertNotNull(expression.index);
+    expect(expression.target, isNotNull);
+    expect(expression.index, isNotNull);
   }
 
   void test_parsePostfixExpression_none_methodInvocation() {
     MethodInvocation expression = ParserTestCase.parse4("parsePostfixExpression", "a.m()", []);
-    JUnitTestCase.assertNotNull(expression.target);
-    JUnitTestCase.assertNotNull(expression.methodName);
-    JUnitTestCase.assertNotNull(expression.argumentList);
+    expect(expression.target, isNotNull);
+    expect(expression.methodName, isNotNull);
+    expect(expression.argumentList, isNotNull);
   }
 
   void test_parsePostfixExpression_none_propertyAccess() {
     PrefixedIdentifier expression = ParserTestCase.parse4("parsePostfixExpression", "a.b", []);
-    JUnitTestCase.assertNotNull(expression.prefix);
-    JUnitTestCase.assertNotNull(expression.identifier);
+    expect(expression.prefix, isNotNull);
+    expect(expression.identifier, isNotNull);
   }
 
   void test_parsePrefixedIdentifier_noPrefix() {
     String lexeme = "bar";
     SimpleIdentifier identifier = ParserTestCase.parse4("parsePrefixedIdentifier", lexeme, []);
-    JUnitTestCase.assertNotNull(identifier.token);
-    JUnitTestCase.assertEquals(lexeme, identifier.name);
+    expect(identifier.token, isNotNull);
+    expect(identifier.name, lexeme);
   }
 
   void test_parsePrefixedIdentifier_prefix() {
     String lexeme = "foo.bar";
     PrefixedIdentifier identifier = ParserTestCase.parse4("parsePrefixedIdentifier", lexeme, []);
-    JUnitTestCase.assertEquals("foo", identifier.prefix.name);
-    JUnitTestCase.assertNotNull(identifier.period);
-    JUnitTestCase.assertEquals("bar", identifier.identifier.name);
+    expect(identifier.prefix.name, "foo");
+    expect(identifier.period, isNotNull);
+    expect(identifier.identifier.name, "bar");
   }
 
   void test_parsePrimaryExpression_const() {
     InstanceCreationExpression expression = ParserTestCase.parse4("parsePrimaryExpression", "const A()", []);
-    JUnitTestCase.assertNotNull(expression);
+    expect(expression, isNotNull);
   }
 
   void test_parsePrimaryExpression_double() {
     String doubleLiteral = "3.2e4";
     DoubleLiteral literal = ParserTestCase.parse4("parsePrimaryExpression", doubleLiteral, []);
-    JUnitTestCase.assertNotNull(literal.literal);
-    JUnitTestCase.assertEquals(double.parse(doubleLiteral), literal.value);
+    expect(literal.literal, isNotNull);
+    expect(literal.value, double.parse(doubleLiteral));
   }
 
   void test_parsePrimaryExpression_false() {
     BooleanLiteral literal = ParserTestCase.parse4("parsePrimaryExpression", "false", []);
-    JUnitTestCase.assertNotNull(literal.literal);
-    JUnitTestCase.assertFalse(literal.value);
+    expect(literal.literal, isNotNull);
+    expect(literal.value, isFalse);
   }
 
   void test_parsePrimaryExpression_function_arguments() {
     FunctionExpression expression = ParserTestCase.parse4("parsePrimaryExpression", "(int i) => i + 1", []);
-    JUnitTestCase.assertNotNull(expression.parameters);
-    JUnitTestCase.assertNotNull(expression.body);
+    expect(expression.parameters, isNotNull);
+    expect(expression.body, isNotNull);
   }
 
   void test_parsePrimaryExpression_function_noArguments() {
     FunctionExpression expression = ParserTestCase.parse4("parsePrimaryExpression", "() => 42", []);
-    JUnitTestCase.assertNotNull(expression.parameters);
-    JUnitTestCase.assertNotNull(expression.body);
+    expect(expression.parameters, isNotNull);
+    expect(expression.body, isNotNull);
   }
 
   void test_parsePrimaryExpression_hex() {
     String hexLiteral = "3F";
-    IntegerLiteral literal = ParserTestCase.parse4("parsePrimaryExpression", "0x${hexLiteral}", []);
-    JUnitTestCase.assertNotNull(literal.literal);
-    JUnitTestCase.assertEquals(int.parse(hexLiteral, radix: 16), literal.value);
+    IntegerLiteral literal = ParserTestCase.parse4("parsePrimaryExpression", "0x$hexLiteral", []);
+    expect(literal.literal, isNotNull);
+    expect(literal.value, int.parse(hexLiteral, radix: 16));
   }
 
   void test_parsePrimaryExpression_identifier() {
     SimpleIdentifier identifier = ParserTestCase.parse4("parsePrimaryExpression", "a", []);
-    JUnitTestCase.assertNotNull(identifier);
+    expect(identifier, isNotNull);
   }
 
   void test_parsePrimaryExpression_int() {
     String intLiteral = "472";
     IntegerLiteral literal = ParserTestCase.parse4("parsePrimaryExpression", intLiteral, []);
-    JUnitTestCase.assertNotNull(literal.literal);
-    JUnitTestCase.assertEquals(int.parse(intLiteral), literal.value);
+    expect(literal.literal, isNotNull);
+    expect(literal.value, int.parse(intLiteral));
   }
 
   void test_parsePrimaryExpression_listLiteral() {
     ListLiteral literal = ParserTestCase.parse4("parsePrimaryExpression", "[ ]", []);
-    JUnitTestCase.assertNotNull(literal);
+    expect(literal, isNotNull);
   }
 
   void test_parsePrimaryExpression_listLiteral_index() {
     ListLiteral literal = ParserTestCase.parse4("parsePrimaryExpression", "[]", []);
-    JUnitTestCase.assertNotNull(literal);
+    expect(literal, isNotNull);
   }
 
   void test_parsePrimaryExpression_listLiteral_typed() {
     ListLiteral literal = ParserTestCase.parse4("parsePrimaryExpression", "<A>[ ]", []);
-    JUnitTestCase.assertNotNull(literal.typeArguments);
-    EngineTestCase.assertSizeOfList(1, literal.typeArguments.arguments);
+    expect(literal.typeArguments, isNotNull);
+    expect(literal.typeArguments.arguments, hasLength(1));
   }
 
   void test_parsePrimaryExpression_mapLiteral() {
     MapLiteral literal = ParserTestCase.parse4("parsePrimaryExpression", "{}", []);
-    JUnitTestCase.assertNotNull(literal);
+    expect(literal, isNotNull);
   }
 
   void test_parsePrimaryExpression_mapLiteral_typed() {
     MapLiteral literal = ParserTestCase.parse4("parsePrimaryExpression", "<A, B>{}", []);
-    JUnitTestCase.assertNotNull(literal.typeArguments);
-    EngineTestCase.assertSizeOfList(2, literal.typeArguments.arguments);
+    expect(literal.typeArguments, isNotNull);
+    expect(literal.typeArguments.arguments, hasLength(2));
   }
 
   void test_parsePrimaryExpression_new() {
     InstanceCreationExpression expression = ParserTestCase.parse4("parsePrimaryExpression", "new A()", []);
-    JUnitTestCase.assertNotNull(expression);
+    expect(expression, isNotNull);
   }
 
   void test_parsePrimaryExpression_null() {
     NullLiteral literal = ParserTestCase.parse4("parsePrimaryExpression", "null", []);
-    JUnitTestCase.assertNotNull(literal.literal);
+    expect(literal.literal, isNotNull);
   }
 
   void test_parsePrimaryExpression_parenthesized() {
     ParenthesizedExpression expression = ParserTestCase.parse4("parsePrimaryExpression", "(x)", []);
-    JUnitTestCase.assertNotNull(expression);
+    expect(expression, isNotNull);
   }
 
   void test_parsePrimaryExpression_string() {
     SimpleStringLiteral literal = ParserTestCase.parse4("parsePrimaryExpression", "\"string\"", []);
-    JUnitTestCase.assertFalse(literal.isMultiline);
-    JUnitTestCase.assertFalse(literal.isRaw);
-    JUnitTestCase.assertEquals("string", literal.value);
+    expect(literal.isMultiline, isFalse);
+    expect(literal.isRaw, isFalse);
+    expect(literal.value, "string");
   }
 
   void test_parsePrimaryExpression_string_multiline() {
     SimpleStringLiteral literal = ParserTestCase.parse4("parsePrimaryExpression", "'''string'''", []);
-    JUnitTestCase.assertTrue(literal.isMultiline);
-    JUnitTestCase.assertFalse(literal.isRaw);
-    JUnitTestCase.assertEquals("string", literal.value);
+    expect(literal.isMultiline, isTrue);
+    expect(literal.isRaw, isFalse);
+    expect(literal.value, "string");
   }
 
   void test_parsePrimaryExpression_string_raw() {
     SimpleStringLiteral literal = ParserTestCase.parse4("parsePrimaryExpression", "r'string'", []);
-    JUnitTestCase.assertFalse(literal.isMultiline);
-    JUnitTestCase.assertTrue(literal.isRaw);
-    JUnitTestCase.assertEquals("string", literal.value);
+    expect(literal.isMultiline, isFalse);
+    expect(literal.isRaw, isTrue);
+    expect(literal.value, "string");
   }
 
   void test_parsePrimaryExpression_super() {
     PropertyAccess propertyAccess = ParserTestCase.parse4("parsePrimaryExpression", "super.x", []);
-    JUnitTestCase.assertTrue(propertyAccess.target is SuperExpression);
-    JUnitTestCase.assertNotNull(propertyAccess.operator);
-    JUnitTestCase.assertEquals(TokenType.PERIOD, propertyAccess.operator.type);
-    JUnitTestCase.assertNotNull(propertyAccess.propertyName);
+    expect(propertyAccess.target is SuperExpression, isTrue);
+    expect(propertyAccess.operator, isNotNull);
+    expect(propertyAccess.operator.type, TokenType.PERIOD);
+    expect(propertyAccess.propertyName, isNotNull);
   }
 
   void test_parsePrimaryExpression_this() {
     ThisExpression expression = ParserTestCase.parse4("parsePrimaryExpression", "this", []);
-    JUnitTestCase.assertNotNull(expression.keyword);
+    expect(expression.keyword, isNotNull);
   }
 
   void test_parsePrimaryExpression_true() {
     BooleanLiteral literal = ParserTestCase.parse4("parsePrimaryExpression", "true", []);
-    JUnitTestCase.assertNotNull(literal.literal);
-    JUnitTestCase.assertTrue(literal.value);
+    expect(literal.literal, isNotNull);
+    expect(literal.value, isTrue);
   }
 
   void test_Parser() {
-    JUnitTestCase.assertNotNull(new Parser(null, null));
+    expect(new Parser(null, null), isNotNull);
   }
 
   void test_parseRedirectingConstructorInvocation_named() {
     RedirectingConstructorInvocation invocation = ParserTestCase.parse4("parseRedirectingConstructorInvocation", "this.a()", []);
-    JUnitTestCase.assertNotNull(invocation.argumentList);
-    JUnitTestCase.assertNotNull(invocation.constructorName);
-    JUnitTestCase.assertNotNull(invocation.keyword);
-    JUnitTestCase.assertNotNull(invocation.period);
+    expect(invocation.argumentList, isNotNull);
+    expect(invocation.constructorName, isNotNull);
+    expect(invocation.keyword, isNotNull);
+    expect(invocation.period, isNotNull);
   }
 
   void test_parseRedirectingConstructorInvocation_unnamed() {
     RedirectingConstructorInvocation invocation = ParserTestCase.parse4("parseRedirectingConstructorInvocation", "this()", []);
-    JUnitTestCase.assertNotNull(invocation.argumentList);
-    JUnitTestCase.assertNull(invocation.constructorName);
-    JUnitTestCase.assertNotNull(invocation.keyword);
-    JUnitTestCase.assertNull(invocation.period);
+    expect(invocation.argumentList, isNotNull);
+    expect(invocation.constructorName, isNull);
+    expect(invocation.keyword, isNotNull);
+    expect(invocation.period, isNull);
   }
 
   void test_parseRelationalExpression_as() {
     AsExpression expression = ParserTestCase.parse4("parseRelationalExpression", "x as Y", []);
-    JUnitTestCase.assertNotNull(expression.expression);
-    JUnitTestCase.assertNotNull(expression.asOperator);
-    JUnitTestCase.assertNotNull(expression.type);
+    expect(expression.expression, isNotNull);
+    expect(expression.asOperator, isNotNull);
+    expect(expression.type, isNotNull);
   }
 
   void test_parseRelationalExpression_is() {
     IsExpression expression = ParserTestCase.parse4("parseRelationalExpression", "x is y", []);
-    JUnitTestCase.assertNotNull(expression.expression);
-    JUnitTestCase.assertNotNull(expression.isOperator);
-    JUnitTestCase.assertNull(expression.notOperator);
-    JUnitTestCase.assertNotNull(expression.type);
+    expect(expression.expression, isNotNull);
+    expect(expression.isOperator, isNotNull);
+    expect(expression.notOperator, isNull);
+    expect(expression.type, isNotNull);
   }
 
   void test_parseRelationalExpression_isNot() {
     IsExpression expression = ParserTestCase.parse4("parseRelationalExpression", "x is! y", []);
-    JUnitTestCase.assertNotNull(expression.expression);
-    JUnitTestCase.assertNotNull(expression.isOperator);
-    JUnitTestCase.assertNotNull(expression.notOperator);
-    JUnitTestCase.assertNotNull(expression.type);
+    expect(expression.expression, isNotNull);
+    expect(expression.isOperator, isNotNull);
+    expect(expression.notOperator, isNotNull);
+    expect(expression.type, isNotNull);
   }
 
   void test_parseRelationalExpression_normal() {
     BinaryExpression expression = ParserTestCase.parse4("parseRelationalExpression", "x < y", []);
-    JUnitTestCase.assertNotNull(expression.leftOperand);
-    JUnitTestCase.assertNotNull(expression.operator);
-    JUnitTestCase.assertEquals(TokenType.LT, expression.operator.type);
-    JUnitTestCase.assertNotNull(expression.rightOperand);
+    expect(expression.leftOperand, isNotNull);
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.LT);
+    expect(expression.rightOperand, isNotNull);
   }
 
   void test_parseRelationalExpression_super() {
     BinaryExpression expression = ParserTestCase.parse4("parseRelationalExpression", "super < y", []);
-    JUnitTestCase.assertNotNull(expression.leftOperand);
-    JUnitTestCase.assertNotNull(expression.operator);
-    JUnitTestCase.assertEquals(TokenType.LT, expression.operator.type);
-    JUnitTestCase.assertNotNull(expression.rightOperand);
+    expect(expression.leftOperand, isNotNull);
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.LT);
+    expect(expression.rightOperand, isNotNull);
   }
 
   void test_parseRethrowExpression() {
     RethrowExpression expression = ParserTestCase.parse4("parseRethrowExpression", "rethrow;", []);
-    JUnitTestCase.assertNotNull(expression.keyword);
+    expect(expression.keyword, isNotNull);
   }
 
   void test_parseReturnStatement_noValue() {
     ReturnStatement statement = ParserTestCase.parse4("parseReturnStatement", "return;", []);
-    JUnitTestCase.assertNotNull(statement.keyword);
-    JUnitTestCase.assertNull(statement.expression);
-    JUnitTestCase.assertNotNull(statement.semicolon);
+    expect(statement.keyword, isNotNull);
+    expect(statement.expression, isNull);
+    expect(statement.semicolon, isNotNull);
   }
 
   void test_parseReturnStatement_value() {
     ReturnStatement statement = ParserTestCase.parse4("parseReturnStatement", "return x;", []);
-    JUnitTestCase.assertNotNull(statement.keyword);
-    JUnitTestCase.assertNotNull(statement.expression);
-    JUnitTestCase.assertNotNull(statement.semicolon);
+    expect(statement.keyword, isNotNull);
+    expect(statement.expression, isNotNull);
+    expect(statement.semicolon, isNotNull);
   }
 
   void test_parseReturnType_nonVoid() {
     TypeName typeName = ParserTestCase.parse4("parseReturnType", "A<B>", []);
-    JUnitTestCase.assertNotNull(typeName.name);
-    JUnitTestCase.assertNotNull(typeName.typeArguments);
+    expect(typeName.name, isNotNull);
+    expect(typeName.typeArguments, isNotNull);
   }
 
   void test_parseReturnType_void() {
     TypeName typeName = ParserTestCase.parse4("parseReturnType", "void", []);
-    JUnitTestCase.assertNotNull(typeName.name);
-    JUnitTestCase.assertNull(typeName.typeArguments);
+    expect(typeName.name, isNotNull);
+    expect(typeName.typeArguments, isNull);
   }
 
   void test_parseSetter_nonStatic() {
     Comment comment = Comment.createDocumentationComment(new List<Token>(0));
     TypeName returnType = new TypeName(new SimpleIdentifier(null), null);
     MethodDeclaration method = ParserTestCase.parse("parseSetter", <Object> [commentAndMetadata(comment, []), null, null, returnType], "set a(var x);");
-    JUnitTestCase.assertNotNull(method.body);
-    JUnitTestCase.assertEquals(comment, method.documentationComment);
-    JUnitTestCase.assertNull(method.externalKeyword);
-    JUnitTestCase.assertNull(method.modifierKeyword);
-    JUnitTestCase.assertNotNull(method.name);
-    JUnitTestCase.assertNull(method.operatorKeyword);
-    JUnitTestCase.assertNotNull(method.parameters);
-    JUnitTestCase.assertNotNull(method.propertyKeyword);
-    JUnitTestCase.assertEquals(returnType, method.returnType);
+    expect(method.body, isNotNull);
+    expect(method.documentationComment, comment);
+    expect(method.externalKeyword, isNull);
+    expect(method.modifierKeyword, isNull);
+    expect(method.name, isNotNull);
+    expect(method.operatorKeyword, isNull);
+    expect(method.parameters, isNotNull);
+    expect(method.propertyKeyword, isNotNull);
+    expect(method.returnType, returnType);
   }
 
   void test_parseSetter_static() {
@@ -7292,45 +7308,45 @@
         null,
         staticKeyword,
         returnType], "set a(var x) {}");
-    JUnitTestCase.assertNotNull(method.body);
-    JUnitTestCase.assertEquals(comment, method.documentationComment);
-    JUnitTestCase.assertNull(method.externalKeyword);
-    JUnitTestCase.assertEquals(staticKeyword, method.modifierKeyword);
-    JUnitTestCase.assertNotNull(method.name);
-    JUnitTestCase.assertNull(method.operatorKeyword);
-    JUnitTestCase.assertNotNull(method.parameters);
-    JUnitTestCase.assertNotNull(method.propertyKeyword);
-    JUnitTestCase.assertEquals(returnType, method.returnType);
+    expect(method.body, isNotNull);
+    expect(method.documentationComment, comment);
+    expect(method.externalKeyword, isNull);
+    expect(method.modifierKeyword, staticKeyword);
+    expect(method.name, isNotNull);
+    expect(method.operatorKeyword, isNull);
+    expect(method.parameters, isNotNull);
+    expect(method.propertyKeyword, isNotNull);
+    expect(method.returnType, returnType);
   }
 
   void test_parseShiftExpression_normal() {
     BinaryExpression expression = ParserTestCase.parse4("parseShiftExpression", "x << y", []);
-    JUnitTestCase.assertNotNull(expression.leftOperand);
-    JUnitTestCase.assertNotNull(expression.operator);
-    JUnitTestCase.assertEquals(TokenType.LT_LT, expression.operator.type);
-    JUnitTestCase.assertNotNull(expression.rightOperand);
+    expect(expression.leftOperand, isNotNull);
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.LT_LT);
+    expect(expression.rightOperand, isNotNull);
   }
 
   void test_parseShiftExpression_super() {
     BinaryExpression expression = ParserTestCase.parse4("parseShiftExpression", "super << y", []);
-    JUnitTestCase.assertNotNull(expression.leftOperand);
-    JUnitTestCase.assertNotNull(expression.operator);
-    JUnitTestCase.assertEquals(TokenType.LT_LT, expression.operator.type);
-    JUnitTestCase.assertNotNull(expression.rightOperand);
+    expect(expression.leftOperand, isNotNull);
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.LT_LT);
+    expect(expression.rightOperand, isNotNull);
   }
 
   void test_parseSimpleIdentifier_builtInIdentifier() {
     String lexeme = "as";
     SimpleIdentifier identifier = ParserTestCase.parse4("parseSimpleIdentifier", lexeme, []);
-    JUnitTestCase.assertNotNull(identifier.token);
-    JUnitTestCase.assertEquals(lexeme, identifier.name);
+    expect(identifier.token, isNotNull);
+    expect(identifier.name, lexeme);
   }
 
   void test_parseSimpleIdentifier_normalIdentifier() {
     String lexeme = "foo";
     SimpleIdentifier identifier = ParserTestCase.parse4("parseSimpleIdentifier", lexeme, []);
-    JUnitTestCase.assertNotNull(identifier.token);
-    JUnitTestCase.assertEquals(lexeme, identifier.name);
+    expect(identifier.token, isNotNull);
+    expect(identifier.name, lexeme);
   }
 
   void test_parseSimpleIdentifier1_normalIdentifier() {
@@ -7340,13 +7356,13 @@
   void test_parseStatement_functionDeclaration() {
     // TODO(brianwilkerson) Implement more tests for this method.
     FunctionDeclarationStatement statement = ParserTestCase.parse4("parseStatement", "int f(a, b) {};", []);
-    JUnitTestCase.assertNotNull(statement.functionDeclaration);
+    expect(statement.functionDeclaration, isNotNull);
   }
 
   void test_parseStatement_mulipleLabels() {
     LabeledStatement statement = ParserTestCase.parse4("parseStatement", "l: m: return x;", []);
-    EngineTestCase.assertSizeOfList(2, statement.labels);
-    JUnitTestCase.assertNotNull(statement.statement);
+    expect(statement.labels, hasLength(2));
+    expect(statement.statement, isNotNull);
   }
 
   void test_parseStatement_noLabels() {
@@ -7355,757 +7371,757 @@
 
   void test_parseStatement_singleLabel() {
     LabeledStatement statement = ParserTestCase.parse4("parseStatement", "l: return x;", []);
-    EngineTestCase.assertSizeOfList(1, statement.labels);
-    JUnitTestCase.assertNotNull(statement.statement);
+    expect(statement.labels, hasLength(1));
+    expect(statement.statement, isNotNull);
   }
 
   void test_parseStatements_multiple() {
     List<Statement> statements = ParserTestCase.parseStatements("return; return;", 2, []);
-    EngineTestCase.assertSizeOfList(2, statements);
+    expect(statements, hasLength(2));
   }
 
   void test_parseStatements_single() {
     List<Statement> statements = ParserTestCase.parseStatements("return;", 1, []);
-    EngineTestCase.assertSizeOfList(1, statements);
+    expect(statements, hasLength(1));
   }
 
   void test_parseStringLiteral_adjacent() {
     AdjacentStrings literal = ParserTestCase.parse4("parseStringLiteral", "'a' 'b'", []);
     NodeList<StringLiteral> strings = literal.strings;
-    EngineTestCase.assertSizeOfList(2, strings);
+    expect(strings, hasLength(2));
     StringLiteral firstString = strings[0];
     StringLiteral secondString = strings[1];
-    JUnitTestCase.assertEquals("a", (firstString as SimpleStringLiteral).value);
-    JUnitTestCase.assertEquals("b", (secondString as SimpleStringLiteral).value);
+    expect((firstString as SimpleStringLiteral).value, "a");
+    expect((secondString as SimpleStringLiteral).value, "b");
   }
 
   void test_parseStringLiteral_interpolated() {
     StringInterpolation literal = ParserTestCase.parse4("parseStringLiteral", "'a \${b} c \$this d'", []);
     NodeList<InterpolationElement> elements = literal.elements;
-    EngineTestCase.assertSizeOfList(5, elements);
-    JUnitTestCase.assertTrue(elements[0] is InterpolationString);
-    JUnitTestCase.assertTrue(elements[1] is InterpolationExpression);
-    JUnitTestCase.assertTrue(elements[2] is InterpolationString);
-    JUnitTestCase.assertTrue(elements[3] is InterpolationExpression);
-    JUnitTestCase.assertTrue(elements[4] is InterpolationString);
+    expect(elements, hasLength(5));
+    expect(elements[0] is InterpolationString, isTrue);
+    expect(elements[1] is InterpolationExpression, isTrue);
+    expect(elements[2] is InterpolationString, isTrue);
+    expect(elements[3] is InterpolationExpression, isTrue);
+    expect(elements[4] is InterpolationString, isTrue);
   }
 
   void test_parseStringLiteral_single() {
     SimpleStringLiteral literal = ParserTestCase.parse4("parseStringLiteral", "'a'", []);
-    JUnitTestCase.assertNotNull(literal.literal);
-    JUnitTestCase.assertEquals("a", literal.value);
+    expect(literal.literal, isNotNull);
+    expect(literal.value, "a");
   }
 
   void test_parseSuperConstructorInvocation_named() {
     SuperConstructorInvocation invocation = ParserTestCase.parse4("parseSuperConstructorInvocation", "super.a()", []);
-    JUnitTestCase.assertNotNull(invocation.argumentList);
-    JUnitTestCase.assertNotNull(invocation.constructorName);
-    JUnitTestCase.assertNotNull(invocation.keyword);
-    JUnitTestCase.assertNotNull(invocation.period);
+    expect(invocation.argumentList, isNotNull);
+    expect(invocation.constructorName, isNotNull);
+    expect(invocation.keyword, isNotNull);
+    expect(invocation.period, isNotNull);
   }
 
   void test_parseSuperConstructorInvocation_unnamed() {
     SuperConstructorInvocation invocation = ParserTestCase.parse4("parseSuperConstructorInvocation", "super()", []);
-    JUnitTestCase.assertNotNull(invocation.argumentList);
-    JUnitTestCase.assertNull(invocation.constructorName);
-    JUnitTestCase.assertNotNull(invocation.keyword);
-    JUnitTestCase.assertNull(invocation.period);
+    expect(invocation.argumentList, isNotNull);
+    expect(invocation.constructorName, isNull);
+    expect(invocation.keyword, isNotNull);
+    expect(invocation.period, isNull);
   }
 
   void test_parseSwitchStatement_case() {
     SwitchStatement statement = ParserTestCase.parse4("parseSwitchStatement", "switch (a) {case 1: return 'I';}", []);
-    JUnitTestCase.assertNotNull(statement.keyword);
-    JUnitTestCase.assertNotNull(statement.leftParenthesis);
-    JUnitTestCase.assertNotNull(statement.expression);
-    JUnitTestCase.assertNotNull(statement.rightParenthesis);
-    JUnitTestCase.assertNotNull(statement.leftBracket);
-    EngineTestCase.assertSizeOfList(1, statement.members);
-    JUnitTestCase.assertNotNull(statement.rightBracket);
+    expect(statement.keyword, isNotNull);
+    expect(statement.leftParenthesis, isNotNull);
+    expect(statement.expression, isNotNull);
+    expect(statement.rightParenthesis, isNotNull);
+    expect(statement.leftBracket, isNotNull);
+    expect(statement.members, hasLength(1));
+    expect(statement.rightBracket, isNotNull);
   }
 
   void test_parseSwitchStatement_empty() {
     SwitchStatement statement = ParserTestCase.parse4("parseSwitchStatement", "switch (a) {}", []);
-    JUnitTestCase.assertNotNull(statement.keyword);
-    JUnitTestCase.assertNotNull(statement.leftParenthesis);
-    JUnitTestCase.assertNotNull(statement.expression);
-    JUnitTestCase.assertNotNull(statement.rightParenthesis);
-    JUnitTestCase.assertNotNull(statement.leftBracket);
-    EngineTestCase.assertSizeOfList(0, statement.members);
-    JUnitTestCase.assertNotNull(statement.rightBracket);
+    expect(statement.keyword, isNotNull);
+    expect(statement.leftParenthesis, isNotNull);
+    expect(statement.expression, isNotNull);
+    expect(statement.rightParenthesis, isNotNull);
+    expect(statement.leftBracket, isNotNull);
+    expect(statement.members, hasLength(0));
+    expect(statement.rightBracket, isNotNull);
   }
 
   void test_parseSwitchStatement_labeledCase() {
     SwitchStatement statement = ParserTestCase.parse4("parseSwitchStatement", "switch (a) {l1: l2: l3: case(1):}", []);
-    JUnitTestCase.assertNotNull(statement.keyword);
-    JUnitTestCase.assertNotNull(statement.leftParenthesis);
-    JUnitTestCase.assertNotNull(statement.expression);
-    JUnitTestCase.assertNotNull(statement.rightParenthesis);
-    JUnitTestCase.assertNotNull(statement.leftBracket);
-    EngineTestCase.assertSizeOfList(1, statement.members);
-    EngineTestCase.assertSizeOfList(3, statement.members[0].labels);
-    JUnitTestCase.assertNotNull(statement.rightBracket);
+    expect(statement.keyword, isNotNull);
+    expect(statement.leftParenthesis, isNotNull);
+    expect(statement.expression, isNotNull);
+    expect(statement.rightParenthesis, isNotNull);
+    expect(statement.leftBracket, isNotNull);
+    expect(statement.members, hasLength(1));
+    expect(statement.members[0].labels, hasLength(3));
+    expect(statement.rightBracket, isNotNull);
   }
 
   void test_parseSwitchStatement_labeledStatementInCase() {
     SwitchStatement statement = ParserTestCase.parse4("parseSwitchStatement", "switch (a) {case 0: f(); l1: g(); break;}", []);
-    JUnitTestCase.assertNotNull(statement.keyword);
-    JUnitTestCase.assertNotNull(statement.leftParenthesis);
-    JUnitTestCase.assertNotNull(statement.expression);
-    JUnitTestCase.assertNotNull(statement.rightParenthesis);
-    JUnitTestCase.assertNotNull(statement.leftBracket);
-    EngineTestCase.assertSizeOfList(1, statement.members);
-    EngineTestCase.assertSizeOfList(3, statement.members[0].statements);
-    JUnitTestCase.assertNotNull(statement.rightBracket);
+    expect(statement.keyword, isNotNull);
+    expect(statement.leftParenthesis, isNotNull);
+    expect(statement.expression, isNotNull);
+    expect(statement.rightParenthesis, isNotNull);
+    expect(statement.leftBracket, isNotNull);
+    expect(statement.members, hasLength(1));
+    expect(statement.members[0].statements, hasLength(3));
+    expect(statement.rightBracket, isNotNull);
   }
 
   void test_parseSymbolLiteral_builtInIdentifier() {
     SymbolLiteral literal = ParserTestCase.parse4("parseSymbolLiteral", "#dynamic.static.abstract", []);
-    JUnitTestCase.assertNotNull(literal.poundSign);
+    expect(literal.poundSign, isNotNull);
     List<Token> components = literal.components;
-    EngineTestCase.assertLength(3, components);
-    JUnitTestCase.assertEquals("dynamic", components[0].lexeme);
-    JUnitTestCase.assertEquals("static", components[1].lexeme);
-    JUnitTestCase.assertEquals("abstract", components[2].lexeme);
+    expect(components, hasLength(3));
+    expect(components[0].lexeme, "dynamic");
+    expect(components[1].lexeme, "static");
+    expect(components[2].lexeme, "abstract");
   }
 
   void test_parseSymbolLiteral_multiple() {
     SymbolLiteral literal = ParserTestCase.parse4("parseSymbolLiteral", "#a.b.c", []);
-    JUnitTestCase.assertNotNull(literal.poundSign);
+    expect(literal.poundSign, isNotNull);
     List<Token> components = literal.components;
-    EngineTestCase.assertLength(3, components);
-    JUnitTestCase.assertEquals("a", components[0].lexeme);
-    JUnitTestCase.assertEquals("b", components[1].lexeme);
-    JUnitTestCase.assertEquals("c", components[2].lexeme);
+    expect(components, hasLength(3));
+    expect(components[0].lexeme, "a");
+    expect(components[1].lexeme, "b");
+    expect(components[2].lexeme, "c");
   }
 
   void test_parseSymbolLiteral_operator() {
     SymbolLiteral literal = ParserTestCase.parse4("parseSymbolLiteral", "#==", []);
-    JUnitTestCase.assertNotNull(literal.poundSign);
+    expect(literal.poundSign, isNotNull);
     List<Token> components = literal.components;
-    EngineTestCase.assertLength(1, components);
-    JUnitTestCase.assertEquals("==", components[0].lexeme);
+    expect(components, hasLength(1));
+    expect(components[0].lexeme, "==");
   }
 
   void test_parseSymbolLiteral_single() {
     SymbolLiteral literal = ParserTestCase.parse4("parseSymbolLiteral", "#a", []);
-    JUnitTestCase.assertNotNull(literal.poundSign);
+    expect(literal.poundSign, isNotNull);
     List<Token> components = literal.components;
-    EngineTestCase.assertLength(1, components);
-    JUnitTestCase.assertEquals("a", components[0].lexeme);
+    expect(components, hasLength(1));
+    expect(components[0].lexeme, "a");
   }
 
   void test_parseSymbolLiteral_void() {
     SymbolLiteral literal = ParserTestCase.parse4("parseSymbolLiteral", "#void", []);
-    JUnitTestCase.assertNotNull(literal.poundSign);
+    expect(literal.poundSign, isNotNull);
     List<Token> components = literal.components;
-    EngineTestCase.assertLength(1, components);
-    JUnitTestCase.assertEquals("void", components[0].lexeme);
+    expect(components, hasLength(1));
+    expect(components[0].lexeme, "void");
   }
 
   void test_parseThrowExpression() {
     ThrowExpression expression = ParserTestCase.parse4("parseThrowExpression", "throw x;", []);
-    JUnitTestCase.assertNotNull(expression.keyword);
-    JUnitTestCase.assertNotNull(expression.expression);
+    expect(expression.keyword, isNotNull);
+    expect(expression.expression, isNotNull);
   }
 
   void test_parseThrowExpressionWithoutCascade() {
     ThrowExpression expression = ParserTestCase.parse4("parseThrowExpressionWithoutCascade", "throw x;", []);
-    JUnitTestCase.assertNotNull(expression.keyword);
-    JUnitTestCase.assertNotNull(expression.expression);
+    expect(expression.keyword, isNotNull);
+    expect(expression.expression, isNotNull);
   }
 
   void test_parseTryStatement_catch() {
     TryStatement statement = ParserTestCase.parse4("parseTryStatement", "try {} catch (e) {}", []);
-    JUnitTestCase.assertNotNull(statement.tryKeyword);
-    JUnitTestCase.assertNotNull(statement.body);
+    expect(statement.tryKeyword, isNotNull);
+    expect(statement.body, isNotNull);
     NodeList<CatchClause> catchClauses = statement.catchClauses;
-    EngineTestCase.assertSizeOfList(1, catchClauses);
+    expect(catchClauses, hasLength(1));
     CatchClause clause = catchClauses[0];
-    JUnitTestCase.assertNull(clause.onKeyword);
-    JUnitTestCase.assertNull(clause.exceptionType);
-    JUnitTestCase.assertNotNull(clause.catchKeyword);
-    JUnitTestCase.assertNotNull(clause.exceptionParameter);
-    JUnitTestCase.assertNull(clause.comma);
-    JUnitTestCase.assertNull(clause.stackTraceParameter);
-    JUnitTestCase.assertNotNull(clause.body);
-    JUnitTestCase.assertNull(statement.finallyKeyword);
-    JUnitTestCase.assertNull(statement.finallyBlock);
+    expect(clause.onKeyword, isNull);
+    expect(clause.exceptionType, isNull);
+    expect(clause.catchKeyword, isNotNull);
+    expect(clause.exceptionParameter, isNotNull);
+    expect(clause.comma, isNull);
+    expect(clause.stackTraceParameter, isNull);
+    expect(clause.body, isNotNull);
+    expect(statement.finallyKeyword, isNull);
+    expect(statement.finallyBlock, isNull);
   }
 
   void test_parseTryStatement_catch_finally() {
     TryStatement statement = ParserTestCase.parse4("parseTryStatement", "try {} catch (e, s) {} finally {}", []);
-    JUnitTestCase.assertNotNull(statement.tryKeyword);
-    JUnitTestCase.assertNotNull(statement.body);
+    expect(statement.tryKeyword, isNotNull);
+    expect(statement.body, isNotNull);
     NodeList<CatchClause> catchClauses = statement.catchClauses;
-    EngineTestCase.assertSizeOfList(1, catchClauses);
+    expect(catchClauses, hasLength(1));
     CatchClause clause = catchClauses[0];
-    JUnitTestCase.assertNull(clause.onKeyword);
-    JUnitTestCase.assertNull(clause.exceptionType);
-    JUnitTestCase.assertNotNull(clause.catchKeyword);
-    JUnitTestCase.assertNotNull(clause.exceptionParameter);
-    JUnitTestCase.assertNotNull(clause.comma);
-    JUnitTestCase.assertNotNull(clause.stackTraceParameter);
-    JUnitTestCase.assertNotNull(clause.body);
-    JUnitTestCase.assertNotNull(statement.finallyKeyword);
-    JUnitTestCase.assertNotNull(statement.finallyBlock);
+    expect(clause.onKeyword, isNull);
+    expect(clause.exceptionType, isNull);
+    expect(clause.catchKeyword, isNotNull);
+    expect(clause.exceptionParameter, isNotNull);
+    expect(clause.comma, isNotNull);
+    expect(clause.stackTraceParameter, isNotNull);
+    expect(clause.body, isNotNull);
+    expect(statement.finallyKeyword, isNotNull);
+    expect(statement.finallyBlock, isNotNull);
   }
 
   void test_parseTryStatement_finally() {
     TryStatement statement = ParserTestCase.parse4("parseTryStatement", "try {} finally {}", []);
-    JUnitTestCase.assertNotNull(statement.tryKeyword);
-    JUnitTestCase.assertNotNull(statement.body);
-    EngineTestCase.assertSizeOfList(0, statement.catchClauses);
-    JUnitTestCase.assertNotNull(statement.finallyKeyword);
-    JUnitTestCase.assertNotNull(statement.finallyBlock);
+    expect(statement.tryKeyword, isNotNull);
+    expect(statement.body, isNotNull);
+    expect(statement.catchClauses, hasLength(0));
+    expect(statement.finallyKeyword, isNotNull);
+    expect(statement.finallyBlock, isNotNull);
   }
 
   void test_parseTryStatement_multiple() {
     TryStatement statement = ParserTestCase.parse4("parseTryStatement", "try {} on NPE catch (e) {} on Error {} catch (e) {}", []);
-    JUnitTestCase.assertNotNull(statement.tryKeyword);
-    JUnitTestCase.assertNotNull(statement.body);
-    EngineTestCase.assertSizeOfList(3, statement.catchClauses);
-    JUnitTestCase.assertNull(statement.finallyKeyword);
-    JUnitTestCase.assertNull(statement.finallyBlock);
+    expect(statement.tryKeyword, isNotNull);
+    expect(statement.body, isNotNull);
+    expect(statement.catchClauses, hasLength(3));
+    expect(statement.finallyKeyword, isNull);
+    expect(statement.finallyBlock, isNull);
   }
 
   void test_parseTryStatement_on() {
     TryStatement statement = ParserTestCase.parse4("parseTryStatement", "try {} on Error {}", []);
-    JUnitTestCase.assertNotNull(statement.tryKeyword);
-    JUnitTestCase.assertNotNull(statement.body);
+    expect(statement.tryKeyword, isNotNull);
+    expect(statement.body, isNotNull);
     NodeList<CatchClause> catchClauses = statement.catchClauses;
-    EngineTestCase.assertSizeOfList(1, catchClauses);
+    expect(catchClauses, hasLength(1));
     CatchClause clause = catchClauses[0];
-    JUnitTestCase.assertNotNull(clause.onKeyword);
-    JUnitTestCase.assertNotNull(clause.exceptionType);
-    JUnitTestCase.assertNull(clause.catchKeyword);
-    JUnitTestCase.assertNull(clause.exceptionParameter);
-    JUnitTestCase.assertNull(clause.comma);
-    JUnitTestCase.assertNull(clause.stackTraceParameter);
-    JUnitTestCase.assertNotNull(clause.body);
-    JUnitTestCase.assertNull(statement.finallyKeyword);
-    JUnitTestCase.assertNull(statement.finallyBlock);
+    expect(clause.onKeyword, isNotNull);
+    expect(clause.exceptionType, isNotNull);
+    expect(clause.catchKeyword, isNull);
+    expect(clause.exceptionParameter, isNull);
+    expect(clause.comma, isNull);
+    expect(clause.stackTraceParameter, isNull);
+    expect(clause.body, isNotNull);
+    expect(statement.finallyKeyword, isNull);
+    expect(statement.finallyBlock, isNull);
   }
 
   void test_parseTryStatement_on_catch() {
     TryStatement statement = ParserTestCase.parse4("parseTryStatement", "try {} on Error catch (e, s) {}", []);
-    JUnitTestCase.assertNotNull(statement.tryKeyword);
-    JUnitTestCase.assertNotNull(statement.body);
+    expect(statement.tryKeyword, isNotNull);
+    expect(statement.body, isNotNull);
     NodeList<CatchClause> catchClauses = statement.catchClauses;
-    EngineTestCase.assertSizeOfList(1, catchClauses);
+    expect(catchClauses, hasLength(1));
     CatchClause clause = catchClauses[0];
-    JUnitTestCase.assertNotNull(clause.onKeyword);
-    JUnitTestCase.assertNotNull(clause.exceptionType);
-    JUnitTestCase.assertNotNull(clause.catchKeyword);
-    JUnitTestCase.assertNotNull(clause.exceptionParameter);
-    JUnitTestCase.assertNotNull(clause.comma);
-    JUnitTestCase.assertNotNull(clause.stackTraceParameter);
-    JUnitTestCase.assertNotNull(clause.body);
-    JUnitTestCase.assertNull(statement.finallyKeyword);
-    JUnitTestCase.assertNull(statement.finallyBlock);
+    expect(clause.onKeyword, isNotNull);
+    expect(clause.exceptionType, isNotNull);
+    expect(clause.catchKeyword, isNotNull);
+    expect(clause.exceptionParameter, isNotNull);
+    expect(clause.comma, isNotNull);
+    expect(clause.stackTraceParameter, isNotNull);
+    expect(clause.body, isNotNull);
+    expect(statement.finallyKeyword, isNull);
+    expect(statement.finallyBlock, isNull);
   }
 
   void test_parseTryStatement_on_catch_finally() {
     TryStatement statement = ParserTestCase.parse4("parseTryStatement", "try {} on Error catch (e, s) {} finally {}", []);
-    JUnitTestCase.assertNotNull(statement.tryKeyword);
-    JUnitTestCase.assertNotNull(statement.body);
+    expect(statement.tryKeyword, isNotNull);
+    expect(statement.body, isNotNull);
     NodeList<CatchClause> catchClauses = statement.catchClauses;
-    EngineTestCase.assertSizeOfList(1, catchClauses);
+    expect(catchClauses, hasLength(1));
     CatchClause clause = catchClauses[0];
-    JUnitTestCase.assertNotNull(clause.onKeyword);
-    JUnitTestCase.assertNotNull(clause.exceptionType);
-    JUnitTestCase.assertNotNull(clause.catchKeyword);
-    JUnitTestCase.assertNotNull(clause.exceptionParameter);
-    JUnitTestCase.assertNotNull(clause.comma);
-    JUnitTestCase.assertNotNull(clause.stackTraceParameter);
-    JUnitTestCase.assertNotNull(clause.body);
-    JUnitTestCase.assertNotNull(statement.finallyKeyword);
-    JUnitTestCase.assertNotNull(statement.finallyBlock);
+    expect(clause.onKeyword, isNotNull);
+    expect(clause.exceptionType, isNotNull);
+    expect(clause.catchKeyword, isNotNull);
+    expect(clause.exceptionParameter, isNotNull);
+    expect(clause.comma, isNotNull);
+    expect(clause.stackTraceParameter, isNotNull);
+    expect(clause.body, isNotNull);
+    expect(statement.finallyKeyword, isNotNull);
+    expect(statement.finallyBlock, isNotNull);
   }
 
   void test_parseTypeAlias_function_noParameters() {
     FunctionTypeAlias typeAlias = ParserTestCase.parse("parseTypeAlias", <Object> [emptyCommentAndMetadata()], "typedef bool F();");
-    JUnitTestCase.assertNotNull(typeAlias.keyword);
-    JUnitTestCase.assertNotNull(typeAlias.name);
-    JUnitTestCase.assertNotNull(typeAlias.parameters);
-    JUnitTestCase.assertNotNull(typeAlias.returnType);
-    JUnitTestCase.assertNotNull(typeAlias.semicolon);
-    JUnitTestCase.assertNull(typeAlias.typeParameters);
+    expect(typeAlias.keyword, isNotNull);
+    expect(typeAlias.name, isNotNull);
+    expect(typeAlias.parameters, isNotNull);
+    expect(typeAlias.returnType, isNotNull);
+    expect(typeAlias.semicolon, isNotNull);
+    expect(typeAlias.typeParameters, isNull);
   }
 
   void test_parseTypeAlias_function_noReturnType() {
     FunctionTypeAlias typeAlias = ParserTestCase.parse("parseTypeAlias", <Object> [emptyCommentAndMetadata()], "typedef F();");
-    JUnitTestCase.assertNotNull(typeAlias.keyword);
-    JUnitTestCase.assertNotNull(typeAlias.name);
-    JUnitTestCase.assertNotNull(typeAlias.parameters);
-    JUnitTestCase.assertNull(typeAlias.returnType);
-    JUnitTestCase.assertNotNull(typeAlias.semicolon);
-    JUnitTestCase.assertNull(typeAlias.typeParameters);
+    expect(typeAlias.keyword, isNotNull);
+    expect(typeAlias.name, isNotNull);
+    expect(typeAlias.parameters, isNotNull);
+    expect(typeAlias.returnType, isNull);
+    expect(typeAlias.semicolon, isNotNull);
+    expect(typeAlias.typeParameters, isNull);
   }
 
   void test_parseTypeAlias_function_parameterizedReturnType() {
     FunctionTypeAlias typeAlias = ParserTestCase.parse("parseTypeAlias", <Object> [emptyCommentAndMetadata()], "typedef A<B> F();");
-    JUnitTestCase.assertNotNull(typeAlias.keyword);
-    JUnitTestCase.assertNotNull(typeAlias.name);
-    JUnitTestCase.assertNotNull(typeAlias.parameters);
-    JUnitTestCase.assertNotNull(typeAlias.returnType);
-    JUnitTestCase.assertNotNull(typeAlias.semicolon);
-    JUnitTestCase.assertNull(typeAlias.typeParameters);
+    expect(typeAlias.keyword, isNotNull);
+    expect(typeAlias.name, isNotNull);
+    expect(typeAlias.parameters, isNotNull);
+    expect(typeAlias.returnType, isNotNull);
+    expect(typeAlias.semicolon, isNotNull);
+    expect(typeAlias.typeParameters, isNull);
   }
 
   void test_parseTypeAlias_function_parameters() {
     FunctionTypeAlias typeAlias = ParserTestCase.parse("parseTypeAlias", <Object> [emptyCommentAndMetadata()], "typedef bool F(Object value);");
-    JUnitTestCase.assertNotNull(typeAlias.keyword);
-    JUnitTestCase.assertNotNull(typeAlias.name);
-    JUnitTestCase.assertNotNull(typeAlias.parameters);
-    JUnitTestCase.assertNotNull(typeAlias.returnType);
-    JUnitTestCase.assertNotNull(typeAlias.semicolon);
-    JUnitTestCase.assertNull(typeAlias.typeParameters);
+    expect(typeAlias.keyword, isNotNull);
+    expect(typeAlias.name, isNotNull);
+    expect(typeAlias.parameters, isNotNull);
+    expect(typeAlias.returnType, isNotNull);
+    expect(typeAlias.semicolon, isNotNull);
+    expect(typeAlias.typeParameters, isNull);
   }
 
   void test_parseTypeAlias_function_typeParameters() {
     FunctionTypeAlias typeAlias = ParserTestCase.parse("parseTypeAlias", <Object> [emptyCommentAndMetadata()], "typedef bool F<E>();");
-    JUnitTestCase.assertNotNull(typeAlias.keyword);
-    JUnitTestCase.assertNotNull(typeAlias.name);
-    JUnitTestCase.assertNotNull(typeAlias.parameters);
-    JUnitTestCase.assertNotNull(typeAlias.returnType);
-    JUnitTestCase.assertNotNull(typeAlias.semicolon);
-    JUnitTestCase.assertNotNull(typeAlias.typeParameters);
+    expect(typeAlias.keyword, isNotNull);
+    expect(typeAlias.name, isNotNull);
+    expect(typeAlias.parameters, isNotNull);
+    expect(typeAlias.returnType, isNotNull);
+    expect(typeAlias.semicolon, isNotNull);
+    expect(typeAlias.typeParameters, isNotNull);
   }
 
   void test_parseTypeAlias_function_voidReturnType() {
     FunctionTypeAlias typeAlias = ParserTestCase.parse("parseTypeAlias", <Object> [emptyCommentAndMetadata()], "typedef void F();");
-    JUnitTestCase.assertNotNull(typeAlias.keyword);
-    JUnitTestCase.assertNotNull(typeAlias.name);
-    JUnitTestCase.assertNotNull(typeAlias.parameters);
-    JUnitTestCase.assertNotNull(typeAlias.returnType);
-    JUnitTestCase.assertNotNull(typeAlias.semicolon);
-    JUnitTestCase.assertNull(typeAlias.typeParameters);
+    expect(typeAlias.keyword, isNotNull);
+    expect(typeAlias.name, isNotNull);
+    expect(typeAlias.parameters, isNotNull);
+    expect(typeAlias.returnType, isNotNull);
+    expect(typeAlias.semicolon, isNotNull);
+    expect(typeAlias.typeParameters, isNull);
   }
 
   void test_parseTypeArgumentList_multiple() {
     TypeArgumentList argumentList = ParserTestCase.parse4("parseTypeArgumentList", "<int, int, int>", []);
-    JUnitTestCase.assertNotNull(argumentList.leftBracket);
-    EngineTestCase.assertSizeOfList(3, argumentList.arguments);
-    JUnitTestCase.assertNotNull(argumentList.rightBracket);
+    expect(argumentList.leftBracket, isNotNull);
+    expect(argumentList.arguments, hasLength(3));
+    expect(argumentList.rightBracket, isNotNull);
   }
 
   void test_parseTypeArgumentList_nested() {
     TypeArgumentList argumentList = ParserTestCase.parse4("parseTypeArgumentList", "<A<B>>", []);
-    JUnitTestCase.assertNotNull(argumentList.leftBracket);
-    EngineTestCase.assertSizeOfList(1, argumentList.arguments);
+    expect(argumentList.leftBracket, isNotNull);
+    expect(argumentList.arguments, hasLength(1));
     TypeName argument = argumentList.arguments[0];
-    JUnitTestCase.assertNotNull(argument);
+    expect(argument, isNotNull);
     TypeArgumentList innerList = argument.typeArguments;
-    JUnitTestCase.assertNotNull(innerList);
-    EngineTestCase.assertSizeOfList(1, innerList.arguments);
-    JUnitTestCase.assertNotNull(argumentList.rightBracket);
+    expect(innerList, isNotNull);
+    expect(innerList.arguments, hasLength(1));
+    expect(argumentList.rightBracket, isNotNull);
   }
 
   void test_parseTypeArgumentList_single() {
     TypeArgumentList argumentList = ParserTestCase.parse4("parseTypeArgumentList", "<int>", []);
-    JUnitTestCase.assertNotNull(argumentList.leftBracket);
-    EngineTestCase.assertSizeOfList(1, argumentList.arguments);
-    JUnitTestCase.assertNotNull(argumentList.rightBracket);
+    expect(argumentList.leftBracket, isNotNull);
+    expect(argumentList.arguments, hasLength(1));
+    expect(argumentList.rightBracket, isNotNull);
   }
 
   void test_parseTypeName_parameterized() {
     TypeName typeName = ParserTestCase.parse4("parseTypeName", "List<int>", []);
-    JUnitTestCase.assertNotNull(typeName.name);
-    JUnitTestCase.assertNotNull(typeName.typeArguments);
+    expect(typeName.name, isNotNull);
+    expect(typeName.typeArguments, isNotNull);
   }
 
   void test_parseTypeName_simple() {
     TypeName typeName = ParserTestCase.parse4("parseTypeName", "int", []);
-    JUnitTestCase.assertNotNull(typeName.name);
-    JUnitTestCase.assertNull(typeName.typeArguments);
+    expect(typeName.name, isNotNull);
+    expect(typeName.typeArguments, isNull);
   }
 
   void test_parseTypeParameter_bounded() {
     TypeParameter parameter = ParserTestCase.parse4("parseTypeParameter", "A extends B", []);
-    JUnitTestCase.assertNotNull(parameter.bound);
-    JUnitTestCase.assertNotNull(parameter.keyword);
-    JUnitTestCase.assertNotNull(parameter.name);
+    expect(parameter.bound, isNotNull);
+    expect(parameter.keyword, isNotNull);
+    expect(parameter.name, isNotNull);
   }
 
   void test_parseTypeParameter_simple() {
     TypeParameter parameter = ParserTestCase.parse4("parseTypeParameter", "A", []);
-    JUnitTestCase.assertNull(parameter.bound);
-    JUnitTestCase.assertNull(parameter.keyword);
-    JUnitTestCase.assertNotNull(parameter.name);
+    expect(parameter.bound, isNull);
+    expect(parameter.keyword, isNull);
+    expect(parameter.name, isNotNull);
   }
 
   void test_parseTypeParameterList_multiple() {
     TypeParameterList parameterList = ParserTestCase.parse4("parseTypeParameterList", "<A, B extends C, D>", []);
-    JUnitTestCase.assertNotNull(parameterList.leftBracket);
-    JUnitTestCase.assertNotNull(parameterList.rightBracket);
-    EngineTestCase.assertSizeOfList(3, parameterList.typeParameters);
+    expect(parameterList.leftBracket, isNotNull);
+    expect(parameterList.rightBracket, isNotNull);
+    expect(parameterList.typeParameters, hasLength(3));
   }
 
   void test_parseTypeParameterList_parameterizedWithTrailingEquals() {
     TypeParameterList parameterList = ParserTestCase.parse4("parseTypeParameterList", "<A extends B<E>>=", []);
-    JUnitTestCase.assertNotNull(parameterList.leftBracket);
-    JUnitTestCase.assertNotNull(parameterList.rightBracket);
-    EngineTestCase.assertSizeOfList(1, parameterList.typeParameters);
+    expect(parameterList.leftBracket, isNotNull);
+    expect(parameterList.rightBracket, isNotNull);
+    expect(parameterList.typeParameters, hasLength(1));
   }
 
   void test_parseTypeParameterList_single() {
     TypeParameterList parameterList = ParserTestCase.parse4("parseTypeParameterList", "<A>", []);
-    JUnitTestCase.assertNotNull(parameterList.leftBracket);
-    JUnitTestCase.assertNotNull(parameterList.rightBracket);
-    EngineTestCase.assertSizeOfList(1, parameterList.typeParameters);
+    expect(parameterList.leftBracket, isNotNull);
+    expect(parameterList.rightBracket, isNotNull);
+    expect(parameterList.typeParameters, hasLength(1));
   }
 
   void test_parseTypeParameterList_withTrailingEquals() {
     TypeParameterList parameterList = ParserTestCase.parse4("parseTypeParameterList", "<A>=", []);
-    JUnitTestCase.assertNotNull(parameterList.leftBracket);
-    JUnitTestCase.assertNotNull(parameterList.rightBracket);
-    EngineTestCase.assertSizeOfList(1, parameterList.typeParameters);
+    expect(parameterList.leftBracket, isNotNull);
+    expect(parameterList.rightBracket, isNotNull);
+    expect(parameterList.typeParameters, hasLength(1));
   }
 
   void test_parseUnaryExpression_decrement_normal() {
     PrefixExpression expression = ParserTestCase.parse4("parseUnaryExpression", "--x", []);
-    JUnitTestCase.assertNotNull(expression.operator);
-    JUnitTestCase.assertEquals(TokenType.MINUS_MINUS, expression.operator.type);
-    JUnitTestCase.assertNotNull(expression.operand);
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.MINUS_MINUS);
+    expect(expression.operand, isNotNull);
   }
 
   void test_parseUnaryExpression_decrement_super() {
     PrefixExpression expression = ParserTestCase.parse4("parseUnaryExpression", "--super", []);
-    JUnitTestCase.assertNotNull(expression.operator);
-    JUnitTestCase.assertEquals(TokenType.MINUS, expression.operator.type);
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.MINUS);
     Expression innerExpression = expression.operand;
-    JUnitTestCase.assertNotNull(innerExpression);
-    JUnitTestCase.assertTrue(innerExpression is PrefixExpression);
+    expect(innerExpression, isNotNull);
+    expect(innerExpression is PrefixExpression, isTrue);
     PrefixExpression operand = innerExpression as PrefixExpression;
-    JUnitTestCase.assertNotNull(operand.operator);
-    JUnitTestCase.assertEquals(TokenType.MINUS, operand.operator.type);
-    JUnitTestCase.assertNotNull(operand.operand);
+    expect(operand.operator, isNotNull);
+    expect(operand.operator.type, TokenType.MINUS);
+    expect(operand.operand, isNotNull);
   }
 
   void test_parseUnaryExpression_decrement_super_propertyAccess() {
     PrefixExpression expression = ParserTestCase.parse4("parseUnaryExpression", "--super.x", []);
-    JUnitTestCase.assertNotNull(expression.operator);
-    JUnitTestCase.assertEquals(TokenType.MINUS_MINUS, expression.operator.type);
-    JUnitTestCase.assertNotNull(expression.operand);
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.MINUS_MINUS);
+    expect(expression.operand, isNotNull);
     PropertyAccess operand = expression.operand as PropertyAccess;
-    JUnitTestCase.assertTrue(operand.target is SuperExpression);
-    JUnitTestCase.assertEquals("x", operand.propertyName.name);
+    expect(operand.target is SuperExpression, isTrue);
+    expect(operand.propertyName.name, "x");
   }
 
   void test_parseUnaryExpression_increment_normal() {
     PrefixExpression expression = ParserTestCase.parse4("parseUnaryExpression", "++x", []);
-    JUnitTestCase.assertNotNull(expression.operator);
-    JUnitTestCase.assertEquals(TokenType.PLUS_PLUS, expression.operator.type);
-    JUnitTestCase.assertNotNull(expression.operand);
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.PLUS_PLUS);
+    expect(expression.operand, isNotNull);
   }
 
   void test_parseUnaryExpression_increment_super_index() {
     PrefixExpression expression = ParserTestCase.parse4("parseUnaryExpression", "++super[0]", []);
-    JUnitTestCase.assertNotNull(expression.operator);
-    JUnitTestCase.assertEquals(TokenType.PLUS_PLUS, expression.operator.type);
-    JUnitTestCase.assertNotNull(expression.operand);
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.PLUS_PLUS);
+    expect(expression.operand, isNotNull);
     IndexExpression operand = expression.operand as IndexExpression;
-    JUnitTestCase.assertTrue(operand.realTarget is SuperExpression);
-    JUnitTestCase.assertTrue(operand.index is IntegerLiteral);
+    expect(operand.realTarget is SuperExpression, isTrue);
+    expect(operand.index is IntegerLiteral, isTrue);
   }
 
   void test_parseUnaryExpression_increment_super_propertyAccess() {
     PrefixExpression expression = ParserTestCase.parse4("parseUnaryExpression", "++super.x", []);
-    JUnitTestCase.assertNotNull(expression.operator);
-    JUnitTestCase.assertEquals(TokenType.PLUS_PLUS, expression.operator.type);
-    JUnitTestCase.assertNotNull(expression.operand);
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.PLUS_PLUS);
+    expect(expression.operand, isNotNull);
     PropertyAccess operand = expression.operand as PropertyAccess;
-    JUnitTestCase.assertTrue(operand.target is SuperExpression);
-    JUnitTestCase.assertEquals("x", operand.propertyName.name);
+    expect(operand.target is SuperExpression, isTrue);
+    expect(operand.propertyName.name, "x");
   }
 
   void test_parseUnaryExpression_minus_normal() {
     PrefixExpression expression = ParserTestCase.parse4("parseUnaryExpression", "-x", []);
-    JUnitTestCase.assertNotNull(expression.operator);
-    JUnitTestCase.assertEquals(TokenType.MINUS, expression.operator.type);
-    JUnitTestCase.assertNotNull(expression.operand);
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.MINUS);
+    expect(expression.operand, isNotNull);
   }
 
   void test_parseUnaryExpression_minus_super() {
     PrefixExpression expression = ParserTestCase.parse4("parseUnaryExpression", "-super", []);
-    JUnitTestCase.assertNotNull(expression.operator);
-    JUnitTestCase.assertEquals(TokenType.MINUS, expression.operator.type);
-    JUnitTestCase.assertNotNull(expression.operand);
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.MINUS);
+    expect(expression.operand, isNotNull);
   }
 
   void test_parseUnaryExpression_not_normal() {
     PrefixExpression expression = ParserTestCase.parse4("parseUnaryExpression", "!x", []);
-    JUnitTestCase.assertNotNull(expression.operator);
-    JUnitTestCase.assertEquals(TokenType.BANG, expression.operator.type);
-    JUnitTestCase.assertNotNull(expression.operand);
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.BANG);
+    expect(expression.operand, isNotNull);
   }
 
   void test_parseUnaryExpression_not_super() {
     PrefixExpression expression = ParserTestCase.parse4("parseUnaryExpression", "!super", []);
-    JUnitTestCase.assertNotNull(expression.operator);
-    JUnitTestCase.assertEquals(TokenType.BANG, expression.operator.type);
-    JUnitTestCase.assertNotNull(expression.operand);
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.BANG);
+    expect(expression.operand, isNotNull);
   }
 
   void test_parseUnaryExpression_tilda_normal() {
     PrefixExpression expression = ParserTestCase.parse4("parseUnaryExpression", "~x", []);
-    JUnitTestCase.assertNotNull(expression.operator);
-    JUnitTestCase.assertEquals(TokenType.TILDE, expression.operator.type);
-    JUnitTestCase.assertNotNull(expression.operand);
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.TILDE);
+    expect(expression.operand, isNotNull);
   }
 
   void test_parseUnaryExpression_tilda_super() {
     PrefixExpression expression = ParserTestCase.parse4("parseUnaryExpression", "~super", []);
-    JUnitTestCase.assertNotNull(expression.operator);
-    JUnitTestCase.assertEquals(TokenType.TILDE, expression.operator.type);
-    JUnitTestCase.assertNotNull(expression.operand);
+    expect(expression.operator, isNotNull);
+    expect(expression.operator.type, TokenType.TILDE);
+    expect(expression.operand, isNotNull);
   }
 
   void test_parseVariableDeclaration_equals() {
     VariableDeclaration declaration = ParserTestCase.parse4("parseVariableDeclaration", "a = b", []);
-    JUnitTestCase.assertNotNull(declaration.name);
-    JUnitTestCase.assertNotNull(declaration.equals);
-    JUnitTestCase.assertNotNull(declaration.initializer);
+    expect(declaration.name, isNotNull);
+    expect(declaration.equals, isNotNull);
+    expect(declaration.initializer, isNotNull);
   }
 
   void test_parseVariableDeclaration_noEquals() {
     VariableDeclaration declaration = ParserTestCase.parse4("parseVariableDeclaration", "a", []);
-    JUnitTestCase.assertNotNull(declaration.name);
-    JUnitTestCase.assertNull(declaration.equals);
-    JUnitTestCase.assertNull(declaration.initializer);
+    expect(declaration.name, isNotNull);
+    expect(declaration.equals, isNull);
+    expect(declaration.initializer, isNull);
   }
 
   void test_parseVariableDeclarationListAfterMetadata_const_noType() {
     VariableDeclarationList declarationList = ParserTestCase.parse("parseVariableDeclarationListAfterMetadata", <Object> [emptyCommentAndMetadata()], "const a");
-    JUnitTestCase.assertNotNull(declarationList.keyword);
-    JUnitTestCase.assertNull(declarationList.type);
-    EngineTestCase.assertSizeOfList(1, declarationList.variables);
+    expect(declarationList.keyword, isNotNull);
+    expect(declarationList.type, isNull);
+    expect(declarationList.variables, hasLength(1));
   }
 
   void test_parseVariableDeclarationListAfterMetadata_const_type() {
     VariableDeclarationList declarationList = ParserTestCase.parse("parseVariableDeclarationListAfterMetadata", <Object> [emptyCommentAndMetadata()], "const A a");
-    JUnitTestCase.assertNotNull(declarationList.keyword);
-    JUnitTestCase.assertNotNull(declarationList.type);
-    EngineTestCase.assertSizeOfList(1, declarationList.variables);
+    expect(declarationList.keyword, isNotNull);
+    expect(declarationList.type, isNotNull);
+    expect(declarationList.variables, hasLength(1));
   }
 
   void test_parseVariableDeclarationListAfterMetadata_final_noType() {
     VariableDeclarationList declarationList = ParserTestCase.parse("parseVariableDeclarationListAfterMetadata", <Object> [emptyCommentAndMetadata()], "final a");
-    JUnitTestCase.assertNotNull(declarationList.keyword);
-    JUnitTestCase.assertNull(declarationList.type);
-    EngineTestCase.assertSizeOfList(1, declarationList.variables);
+    expect(declarationList.keyword, isNotNull);
+    expect(declarationList.type, isNull);
+    expect(declarationList.variables, hasLength(1));
   }
 
   void test_parseVariableDeclarationListAfterMetadata_final_type() {
     VariableDeclarationList declarationList = ParserTestCase.parse("parseVariableDeclarationListAfterMetadata", <Object> [emptyCommentAndMetadata()], "final A a");
-    JUnitTestCase.assertNotNull(declarationList.keyword);
-    JUnitTestCase.assertNotNull(declarationList.type);
-    EngineTestCase.assertSizeOfList(1, declarationList.variables);
+    expect(declarationList.keyword, isNotNull);
+    expect(declarationList.type, isNotNull);
+    expect(declarationList.variables, hasLength(1));
   }
 
   void test_parseVariableDeclarationListAfterMetadata_type_multiple() {
     VariableDeclarationList declarationList = ParserTestCase.parse("parseVariableDeclarationListAfterMetadata", <Object> [emptyCommentAndMetadata()], "A a, b, c");
-    JUnitTestCase.assertNull(declarationList.keyword);
-    JUnitTestCase.assertNotNull(declarationList.type);
-    EngineTestCase.assertSizeOfList(3, declarationList.variables);
+    expect(declarationList.keyword, isNull);
+    expect(declarationList.type, isNotNull);
+    expect(declarationList.variables, hasLength(3));
   }
 
   void test_parseVariableDeclarationListAfterMetadata_type_single() {
     VariableDeclarationList declarationList = ParserTestCase.parse("parseVariableDeclarationListAfterMetadata", <Object> [emptyCommentAndMetadata()], "A a");
-    JUnitTestCase.assertNull(declarationList.keyword);
-    JUnitTestCase.assertNotNull(declarationList.type);
-    EngineTestCase.assertSizeOfList(1, declarationList.variables);
+    expect(declarationList.keyword, isNull);
+    expect(declarationList.type, isNotNull);
+    expect(declarationList.variables, hasLength(1));
   }
 
   void test_parseVariableDeclarationListAfterMetadata_var_multiple() {
     VariableDeclarationList declarationList = ParserTestCase.parse("parseVariableDeclarationListAfterMetadata", <Object> [emptyCommentAndMetadata()], "var a, b, c");
-    JUnitTestCase.assertNotNull(declarationList.keyword);
-    JUnitTestCase.assertNull(declarationList.type);
-    EngineTestCase.assertSizeOfList(3, declarationList.variables);
+    expect(declarationList.keyword, isNotNull);
+    expect(declarationList.type, isNull);
+    expect(declarationList.variables, hasLength(3));
   }
 
   void test_parseVariableDeclarationListAfterMetadata_var_single() {
     VariableDeclarationList declarationList = ParserTestCase.parse("parseVariableDeclarationListAfterMetadata", <Object> [emptyCommentAndMetadata()], "var a");
-    JUnitTestCase.assertNotNull(declarationList.keyword);
-    JUnitTestCase.assertNull(declarationList.type);
-    EngineTestCase.assertSizeOfList(1, declarationList.variables);
+    expect(declarationList.keyword, isNotNull);
+    expect(declarationList.type, isNull);
+    expect(declarationList.variables, hasLength(1));
   }
 
   void test_parseVariableDeclarationListAfterType_type() {
     TypeName type = new TypeName(new SimpleIdentifier(null), null);
     VariableDeclarationList declarationList = ParserTestCase.parse("parseVariableDeclarationListAfterType", <Object> [emptyCommentAndMetadata(), null, type], "a");
-    JUnitTestCase.assertNull(declarationList.keyword);
-    JUnitTestCase.assertEquals(type, declarationList.type);
-    EngineTestCase.assertSizeOfList(1, declarationList.variables);
+    expect(declarationList.keyword, isNull);
+    expect(declarationList.type, type);
+    expect(declarationList.variables, hasLength(1));
   }
 
   void test_parseVariableDeclarationListAfterType_var() {
     Token keyword = TokenFactory.tokenFromKeyword(Keyword.VAR);
     VariableDeclarationList declarationList = ParserTestCase.parse("parseVariableDeclarationListAfterType", <Object> [emptyCommentAndMetadata(), keyword, null], "a, b, c");
-    JUnitTestCase.assertEquals(keyword, declarationList.keyword);
-    JUnitTestCase.assertNull(declarationList.type);
-    EngineTestCase.assertSizeOfList(3, declarationList.variables);
+    expect(declarationList.keyword, keyword);
+    expect(declarationList.type, isNull);
+    expect(declarationList.variables, hasLength(3));
   }
 
   void test_parseVariableDeclarationStatementAfterMetadata_multiple() {
     VariableDeclarationStatement statement = ParserTestCase.parse("parseVariableDeclarationStatementAfterMetadata", <Object> [emptyCommentAndMetadata()], "var x, y, z;");
-    JUnitTestCase.assertNotNull(statement.semicolon);
+    expect(statement.semicolon, isNotNull);
     VariableDeclarationList variableList = statement.variables;
-    JUnitTestCase.assertNotNull(variableList);
-    EngineTestCase.assertSizeOfList(3, variableList.variables);
+    expect(variableList, isNotNull);
+    expect(variableList.variables, hasLength(3));
   }
 
   void test_parseVariableDeclarationStatementAfterMetadata_single() {
     VariableDeclarationStatement statement = ParserTestCase.parse("parseVariableDeclarationStatementAfterMetadata", <Object> [emptyCommentAndMetadata()], "var x;");
-    JUnitTestCase.assertNotNull(statement.semicolon);
+    expect(statement.semicolon, isNotNull);
     VariableDeclarationList variableList = statement.variables;
-    JUnitTestCase.assertNotNull(variableList);
-    EngineTestCase.assertSizeOfList(1, variableList.variables);
+    expect(variableList, isNotNull);
+    expect(variableList.variables, hasLength(1));
   }
 
   void test_parseWhileStatement() {
     WhileStatement statement = ParserTestCase.parse4("parseWhileStatement", "while (x) {}", []);
-    JUnitTestCase.assertNotNull(statement.keyword);
-    JUnitTestCase.assertNotNull(statement.leftParenthesis);
-    JUnitTestCase.assertNotNull(statement.condition);
-    JUnitTestCase.assertNotNull(statement.rightParenthesis);
-    JUnitTestCase.assertNotNull(statement.body);
+    expect(statement.keyword, isNotNull);
+    expect(statement.leftParenthesis, isNotNull);
+    expect(statement.condition, isNotNull);
+    expect(statement.rightParenthesis, isNotNull);
+    expect(statement.body, isNotNull);
   }
 
   void test_parseWithClause_multiple() {
     WithClause clause = ParserTestCase.parse4("parseWithClause", "with A, B, C", []);
-    JUnitTestCase.assertNotNull(clause.withKeyword);
-    EngineTestCase.assertSizeOfList(3, clause.mixinTypes);
+    expect(clause.withKeyword, isNotNull);
+    expect(clause.mixinTypes, hasLength(3));
   }
 
   void test_parseWithClause_single() {
     WithClause clause = ParserTestCase.parse4("parseWithClause", "with M", []);
-    JUnitTestCase.assertNotNull(clause.withKeyword);
-    EngineTestCase.assertSizeOfList(1, clause.mixinTypes);
+    expect(clause.withKeyword, isNotNull);
+    expect(clause.mixinTypes, hasLength(1));
   }
 
   void test_parseYieldStatement_each() {
     YieldStatement statement = ParserTestCase.parse4("parseYieldStatement", "yield* x;", []);
-    JUnitTestCase.assertNotNull(statement.yieldKeyword);
-    JUnitTestCase.assertNotNull(statement.star);
-    JUnitTestCase.assertNotNull(statement.expression);
-    JUnitTestCase.assertNotNull(statement.semicolon);
+    expect(statement.yieldKeyword, isNotNull);
+    expect(statement.star, isNotNull);
+    expect(statement.expression, isNotNull);
+    expect(statement.semicolon, isNotNull);
   }
 
   void test_parseYieldStatement_normal() {
     YieldStatement statement = ParserTestCase.parse4("parseYieldStatement", "yield x;", []);
-    JUnitTestCase.assertNotNull(statement.yieldKeyword);
-    JUnitTestCase.assertNull(statement.star);
-    JUnitTestCase.assertNotNull(statement.expression);
-    JUnitTestCase.assertNotNull(statement.semicolon);
+    expect(statement.yieldKeyword, isNotNull);
+    expect(statement.star, isNull);
+    expect(statement.expression, isNotNull);
+    expect(statement.semicolon, isNotNull);
   }
 
   void test_skipPrefixedIdentifier_invalid() {
     Token following = _skip("skipPrefixedIdentifier", "+");
-    JUnitTestCase.assertNull(following);
+    expect(following, isNull);
   }
 
   void test_skipPrefixedIdentifier_notPrefixed() {
     Token following = _skip("skipPrefixedIdentifier", "a +");
-    JUnitTestCase.assertNotNull(following);
-    JUnitTestCase.assertEquals(TokenType.PLUS, following.type);
+    expect(following, isNotNull);
+    expect(following.type, TokenType.PLUS);
   }
 
   void test_skipPrefixedIdentifier_prefixed() {
     Token following = _skip("skipPrefixedIdentifier", "a.b +");
-    JUnitTestCase.assertNotNull(following);
-    JUnitTestCase.assertEquals(TokenType.PLUS, following.type);
+    expect(following, isNotNull);
+    expect(following.type, TokenType.PLUS);
   }
 
   void test_skipReturnType_invalid() {
     Token following = _skip("skipReturnType", "+");
-    JUnitTestCase.assertNull(following);
+    expect(following, isNull);
   }
 
   void test_skipReturnType_type() {
     Token following = _skip("skipReturnType", "C +");
-    JUnitTestCase.assertNotNull(following);
-    JUnitTestCase.assertEquals(TokenType.PLUS, following.type);
+    expect(following, isNotNull);
+    expect(following.type, TokenType.PLUS);
   }
 
   void test_skipReturnType_void() {
     Token following = _skip("skipReturnType", "void +");
-    JUnitTestCase.assertNotNull(following);
-    JUnitTestCase.assertEquals(TokenType.PLUS, following.type);
+    expect(following, isNotNull);
+    expect(following.type, TokenType.PLUS);
   }
 
   void test_skipSimpleIdentifier_identifier() {
     Token following = _skip("skipSimpleIdentifier", "i +");
-    JUnitTestCase.assertNotNull(following);
-    JUnitTestCase.assertEquals(TokenType.PLUS, following.type);
+    expect(following, isNotNull);
+    expect(following.type, TokenType.PLUS);
   }
 
   void test_skipSimpleIdentifier_invalid() {
     Token following = _skip("skipSimpleIdentifier", "9 +");
-    JUnitTestCase.assertNull(following);
+    expect(following, isNull);
   }
 
   void test_skipSimpleIdentifier_pseudoKeyword() {
     Token following = _skip("skipSimpleIdentifier", "as +");
-    JUnitTestCase.assertNotNull(following);
-    JUnitTestCase.assertEquals(TokenType.PLUS, following.type);
+    expect(following, isNotNull);
+    expect(following.type, TokenType.PLUS);
   }
 
   void test_skipStringLiteral_adjacent() {
     Token following = _skip("skipStringLiteral", "'a' 'b' +");
-    JUnitTestCase.assertNotNull(following);
-    JUnitTestCase.assertEquals(TokenType.PLUS, following.type);
+    expect(following, isNotNull);
+    expect(following.type, TokenType.PLUS);
   }
 
   void test_skipStringLiteral_interpolated() {
     Token following = _skip("skipStringLiteral", "'a\${b}c' +");
-    JUnitTestCase.assertNotNull(following);
-    JUnitTestCase.assertEquals(TokenType.PLUS, following.type);
+    expect(following, isNotNull);
+    expect(following.type, TokenType.PLUS);
   }
 
   void test_skipStringLiteral_invalid() {
     Token following = _skip("skipStringLiteral", "a");
-    JUnitTestCase.assertNull(following);
+    expect(following, isNull);
   }
 
   void test_skipStringLiteral_single() {
     Token following = _skip("skipStringLiteral", "'a' +");
-    JUnitTestCase.assertNotNull(following);
-    JUnitTestCase.assertEquals(TokenType.PLUS, following.type);
+    expect(following, isNotNull);
+    expect(following.type, TokenType.PLUS);
   }
 
   void test_skipTypeArgumentList_invalid() {
     Token following = _skip("skipTypeArgumentList", "+");
-    JUnitTestCase.assertNull(following);
+    expect(following, isNull);
   }
 
   void test_skipTypeArgumentList_multiple() {
     Token following = _skip("skipTypeArgumentList", "<E, F, G> +");
-    JUnitTestCase.assertNotNull(following);
-    JUnitTestCase.assertEquals(TokenType.PLUS, following.type);
+    expect(following, isNotNull);
+    expect(following.type, TokenType.PLUS);
   }
 
   void test_skipTypeArgumentList_single() {
     Token following = _skip("skipTypeArgumentList", "<E> +");
-    JUnitTestCase.assertNotNull(following);
-    JUnitTestCase.assertEquals(TokenType.PLUS, following.type);
+    expect(following, isNotNull);
+    expect(following.type, TokenType.PLUS);
   }
 
   void test_skipTypeName_invalid() {
     Token following = _skip("skipTypeName", "+");
-    JUnitTestCase.assertNull(following);
+    expect(following, isNull);
   }
 
   void test_skipTypeName_parameterized() {
     Token following = _skip("skipTypeName", "C<E<F<G>>> +");
-    JUnitTestCase.assertNotNull(following);
-    JUnitTestCase.assertEquals(TokenType.PLUS, following.type);
+    expect(following, isNotNull);
+    expect(following.type, TokenType.PLUS);
   }
 
   void test_skipTypeName_simple() {
     Token following = _skip("skipTypeName", "C +");
-    JUnitTestCase.assertNotNull(following);
-    JUnitTestCase.assertEquals(TokenType.PLUS, following.type);
+    expect(following, isNotNull);
+    expect(following.type, TokenType.PLUS);
   }
 
   /**
@@ -8226,8 +8242,8 @@
     Token token = scanner.tokenize();
     Parser parser = new Parser(null, listener);
     CompilationUnit unit = parser.parseDirectives(token);
-    JUnitTestCase.assertNotNull(unit);
-    EngineTestCase.assertSizeOfList(0, unit.declarations);
+    expect(unit, isNotNull);
+    expect(unit.declarations, hasLength(0));
     listener.assertErrorsWithCodes(errorCodes);
     return unit;
   }
@@ -8258,7 +8274,7 @@
 }
 
 main() {
-  _ut.groupSep = ' | ';
+  groupSep = ' | ';
   runReflectiveTests(ComplexParserTest);
   runReflectiveTests(ErrorParserTest);
   runReflectiveTests(IncrementalParserTest);
diff --git a/pkg/analyzer/test/generated/resolver_test.dart b/pkg/analyzer/test/generated/resolver_test.dart
index a11bf52..f8089e9 100644
--- a/pkg/analyzer/test/generated/resolver_test.dart
+++ b/pkg/analyzer/test/generated/resolver_test.dart
@@ -6,7 +6,6 @@
 
 import 'dart:collection';
 import 'package:analyzer/src/generated/java_core.dart';
-import 'package:analyzer/src/generated/java_junit.dart';
 import 'package:analyzer/src/generated/java_engine.dart';
 import 'package:analyzer/src/generated/java_engine_io.dart';
 import 'package:analyzer/src/generated/source_io.dart';
@@ -20,7 +19,7 @@
 import 'package:analyzer/src/generated/utilities_dart.dart';
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/generated/sdk_io.dart' show DirectoryBasedDartSdk;
-import 'package:unittest/unittest.dart' as _ut;
+import 'package:unittest/unittest.dart';
 import 'test_support.dart';
 import 'package:analyzer/src/generated/testing/ast_factory.dart';
 import 'package:analyzer/src/generated/testing/element_factory.dart';
@@ -267,7 +266,7 @@
     AnalysisOptions currentOptions = analysisOptions;
     bool needsRecompute = currentOptions.analyzeFunctionBodies != options.analyzeFunctionBodies || currentOptions.generateSdkErrors != options.generateSdkErrors || currentOptions.enableAsync != options.enableAsync || currentOptions.enableDeferredLoading != options.enableDeferredLoading || currentOptions.enableEnum != options.enableEnum || currentOptions.dart2jsHint != options.dart2jsHint || (currentOptions.hint && !options.hint) || currentOptions.preserveComments != options.preserveComments;
     if (needsRecompute) {
-      JUnitTestCase.fail("Cannot set options that cause the sources to be reanalyzed in a test context");
+      fail("Cannot set options that cause the sources to be reanalyzed in a test context");
     }
     super.analysisOptions = options;
   }
@@ -336,13 +335,13 @@
     delta.setAnalysisLevel(source2, AnalysisLevel.ERRORS);
     delta.setAnalysisLevel(source3, AnalysisLevel.NONE);
     List<Source> addedSources = delta.addedSources;
-    EngineTestCase.assertLength(2, addedSources);
-    EngineTestCase.assertContains(addedSources, [source1, source2]);
+    expect(addedSources, hasLength(2));
+    expect(addedSources, unorderedEquals([source1, source2]));
   }
 
   void test_getAnalysisLevels() {
     AnalysisDelta delta = new AnalysisDelta();
-    JUnitTestCase.assertEquals(0, delta.analysisLevels.length);
+    expect(delta.analysisLevels.length, 0);
   }
 
   void test_setAnalysisLevel() {
@@ -350,17 +349,17 @@
     delta.setAnalysisLevel(source1, AnalysisLevel.ALL);
     delta.setAnalysisLevel(source2, AnalysisLevel.ERRORS);
     Map<Source, AnalysisLevel> levels = delta.analysisLevels;
-    JUnitTestCase.assertEquals(2, levels.length);
-    JUnitTestCase.assertEquals(AnalysisLevel.ALL, levels[source1]);
-    JUnitTestCase.assertEquals(AnalysisLevel.ERRORS, levels[source2]);
+    expect(levels.length, 2);
+    expect(levels[source1], AnalysisLevel.ALL);
+    expect(levels[source2], AnalysisLevel.ERRORS);
   }
 
   void test_toString() {
     AnalysisDelta delta = new AnalysisDelta();
     delta.setAnalysisLevel(new TestSource(), AnalysisLevel.ALL);
     String result = delta.toString();
-    JUnitTestCase.assertNotNull(result);
-    JUnitTestCase.assertTrue(result.length > 0);
+    expect(result, isNotNull);
+    expect(result.length > 0, isTrue);
   }
 }
 
@@ -370,15 +369,15 @@
     String content = "";
     ChangeSet changeSet = new ChangeSet();
     changeSet.changedContent(source, content);
-    EngineTestCase.assertSizeOfList(0, changeSet.addedSources);
-    EngineTestCase.assertSizeOfList(0, changeSet.changedSources);
+    expect(changeSet.addedSources, hasLength(0));
+    expect(changeSet.changedSources, hasLength(0));
     Map<Source, String> map = changeSet.changedContents;
-    EngineTestCase.assertSizeOfMap(1, map);
-    JUnitTestCase.assertSame(content, map[source]);
-    EngineTestCase.assertSizeOfMap(0, changeSet.changedRanges);
-    EngineTestCase.assertSizeOfList(0, changeSet.deletedSources);
-    EngineTestCase.assertSizeOfList(0, changeSet.removedSources);
-    EngineTestCase.assertSizeOfList(0, changeSet.removedContainers);
+    expect(map, hasLength(1));
+    expect(map[source], same(content));
+    expect(changeSet.changedRanges, hasLength(0));
+    expect(changeSet.deletedSources, hasLength(0));
+    expect(changeSet.removedSources, hasLength(0));
+    expect(changeSet.removedContainers, hasLength(0));
   }
 
   void test_changedRange() {
@@ -386,20 +385,20 @@
     String content = "";
     ChangeSet changeSet = new ChangeSet();
     changeSet.changedRange(source, content, 1, 2, 3);
-    EngineTestCase.assertSizeOfList(0, changeSet.addedSources);
-    EngineTestCase.assertSizeOfList(0, changeSet.changedSources);
-    EngineTestCase.assertSizeOfMap(0, changeSet.changedContents);
+    expect(changeSet.addedSources, hasLength(0));
+    expect(changeSet.changedSources, hasLength(0));
+    expect(changeSet.changedContents, hasLength(0));
     Map<Source, ChangeSet_ContentChange> map = changeSet.changedRanges;
-    EngineTestCase.assertSizeOfMap(1, map);
+    expect(map, hasLength(1));
     ChangeSet_ContentChange change = map[source];
-    JUnitTestCase.assertNotNull(change);
-    JUnitTestCase.assertEquals(content, change.contents);
-    JUnitTestCase.assertEquals(1, change.offset);
-    JUnitTestCase.assertEquals(2, change.oldLength);
-    JUnitTestCase.assertEquals(3, change.newLength);
-    EngineTestCase.assertSizeOfList(0, changeSet.deletedSources);
-    EngineTestCase.assertSizeOfList(0, changeSet.removedSources);
-    EngineTestCase.assertSizeOfList(0, changeSet.removedContainers);
+    expect(change, isNotNull);
+    expect(change.contents, content);
+    expect(change.offset, 1);
+    expect(change.oldLength, 2);
+    expect(change.newLength, 3);
+    expect(changeSet.deletedSources, hasLength(0));
+    expect(changeSet.removedSources, hasLength(0));
+    expect(changeSet.removedContainers, hasLength(0));
   }
 
   void test_toString() {
@@ -411,7 +410,7 @@
     changeSet.deletedSource(new TestSource());
     changeSet.removedSource(new TestSource());
     changeSet.removedContainer(new SourceContainer_ChangeSetTest_test_toString());
-    JUnitTestCase.assertNotNull(changeSet.toString());
+    expect(changeSet.toString(), isNotNull);
   }
 }
 
@@ -420,18 +419,18 @@
     // According to checked-mode type checking rules, a value of type B is
     // assignable to a field of type A, because B extends A (and hence is a
     // subtype of A).
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  const A();",
-        "}",
-        "class B extends A {",
-        "  const B();",
-        "}",
-        "class C {",
-        "  final A a;",
-        "  const C(this.a);",
-        "}",
-        "var v = const C(const B());"]));
+    Source source = addSource(r'''
+class A {
+  const A();
+}
+class B extends A {
+  const B();
+}
+class C {
+  final A a;
+  const C(this.a);
+}
+var v = const C(const B());''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -440,12 +439,12 @@
   void test_fieldFormalParameterAssignableToField_fieldType_unresolved_null() {
     // Null always passes runtime type checks, even when the type is
     // unresolved.
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  final Unresolved x;",
-        "  const A(String this.x);",
-        "}",
-        "var v = const A(null);"]));
+    Source source = addSource(r'''
+class A {
+  final Unresolved x;
+  const A(String this.x);
+}
+var v = const A(null);''');
     resolve(source);
     assertErrors(source, [
         StaticWarningCode.UNDEFINED_CLASS]);
@@ -456,16 +455,16 @@
     // According to checked-mode type checking rules, a value of type B is
     // assignable to a field of type A, because B implements A (and hence is a
     // subtype of A).
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B implements A {",
-        "  const B();",
-        "}",
-        "class C {",
-        "  final A a;",
-        "  const C(this.a);",
-        "}",
-        "var v = const C(const B());"]));
+    Source source = addSource(r'''
+class A {}
+class B implements A {
+  const B();
+}
+class C {
+  final A a;
+  const C(this.a);
+}
+var v = const C(const B());''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -473,11 +472,11 @@
 
   void test_fieldFormalParameterAssignableToField_list_dynamic() {
     // [1, 2, 3] has type List<dynamic>, which is a subtype of List<int>.
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  const A(List<int> x);",
-        "}",
-        "var x = const A(const [1, 2, 3]);"]));
+    Source source = addSource(r'''
+class A {
+  const A(List<int> x);
+}
+var x = const A(const [1, 2, 3]);''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -485,11 +484,11 @@
 
   void test_fieldFormalParameterAssignableToField_list_nonDynamic() {
     // <int>[1, 2, 3] has type List<int>, which is a subtype of List<num>.
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  const A(List<num> x);",
-        "}",
-        "var x = const A(const <int>[1, 2, 3]);"]));
+    Source source = addSource(r'''
+class A {
+  const A(List<num> x);
+}
+var x = const A(const <int>[1, 2, 3]);''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -498,11 +497,11 @@
   void test_fieldFormalParameterAssignableToField_map_dynamic() {
     // {1: 2} has type Map<dynamic, dynamic>, which is a subtype of
     // Map<int, int>.
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  const A(Map<int, int> x);",
-        "}",
-        "var x = const A(const {1: 2});"]));
+    Source source = addSource(r'''
+class A {
+  const A(Map<int, int> x);
+}
+var x = const A(const {1: 2});''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -511,11 +510,11 @@
   void test_fieldFormalParameterAssignableToField_map_keyDifferent() {
     // <int, int>{1: 2} has type Map<int, int>, which is a subtype of
     // Map<num, int>.
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  const A(Map<num, int> x);",
-        "}",
-        "var x = const A(const <int, int>{1: 2});"]));
+    Source source = addSource(r'''
+class A {
+  const A(Map<num, int> x);
+}
+var x = const A(const <int, int>{1: 2});''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -524,11 +523,11 @@
   void test_fieldFormalParameterAssignableToField_map_valueDifferent() {
     // <int, int>{1: 2} has type Map<int, int>, which is a subtype of
     // Map<int, num>.
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  const A(Map<int, num> x);",
-        "}",
-        "var x = const A(const <int, int>{1: 2});"]));
+    Source source = addSource(r'''
+class A {
+  const A(Map<int, num> x);
+}
+var x = const A(const <int, int>{1: 2});''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -537,12 +536,12 @@
   void test_fieldFormalParameterAssignableToField_notype() {
     // If a field is declared without a type, then any value may be assigned to
     // it.
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  final x;",
-        "  const A(this.x);",
-        "}",
-        "var v = const A(5);"]));
+    Source source = addSource(r'''
+class A {
+  final x;
+  const A(this.x);
+}
+var v = const A(5);''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -550,12 +549,12 @@
 
   void test_fieldFormalParameterAssignableToField_null() {
     // Null is assignable to anything.
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  final int x;",
-        "  const A(this.x);",
-        "}",
-        "var v = const A(null);"]));
+    Source source = addSource(r'''
+class A {
+  final int x;
+  const A(this.x);
+}
+var v = const A(null);''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -564,12 +563,12 @@
   void test_fieldFormalParameterAssignableToField_typeSubstitution() {
     // foo has the runtime type dynamic -> dynamic, so it should be assignable
     // to A.f.
-    Source source = addSource(EngineTestCase.createSource([
-        "class A<T> {",
-        "  final T x;",
-        "  const A(this.x);",
-        "}",
-        "var v = const A<int>(3);"]));
+    Source source = addSource(r'''
+class A<T> {
+  final T x;
+  const A(this.x);
+}
+var v = const A<int>(3);''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -578,26 +577,26 @@
   void test_fieldFormalParameterAssignableToField_typedef() {
     // foo has the runtime type dynamic -> dynamic, so it should be assignable
     // to A.f.
-    Source source = addSource(EngineTestCase.createSource([
-        "typedef String Int2String(int x);",
-        "class A {",
-        "  final Int2String f;",
-        "  const A(this.f);",
-        "}",
-        "foo(x) => 1;"
-        "var v = const A(foo);"]));
+    Source source = addSource(r'''
+typedef String Int2String(int x);
+class A {
+  final Int2String f;
+  const A(this.f);
+}
+foo(x) => 1;
+var v = const A(foo);''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_fieldFormalParameterNotAssignableToField() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  final int x;",
-        "  const A(this.x);",
-        "}",
-        "var v = const A('foo');"]));
+    Source source = addSource(r'''
+class A {
+  final int x;
+  const A(this.x);
+}
+var v = const A('foo');''');
     resolve(source);
     assertErrors(source, [
         CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH,
@@ -606,12 +605,12 @@
   }
 
   void test_fieldFormalParameterNotAssignableToField_fieldType() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  final int x;",
-        "  const A(String this.x);",
-        "}",
-        "var v = const A('foo');"]));
+    Source source = addSource(r'''
+class A {
+  final int x;
+  const A(String this.x);
+}
+var v = const A('foo');''');
     resolve(source);
     assertErrors(source, [
         CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH,
@@ -620,12 +619,12 @@
   }
 
   void test_fieldFormalParameterNotAssignableToField_fieldType_unresolved() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  final Unresolved x;",
-        "  const A(String this.x);",
-        "}",
-        "var v = const A('foo');"]));
+    Source source = addSource(r'''
+class A {
+  final Unresolved x;
+  const A(String this.x);
+}
+var v = const A('foo');''');
     resolve(source);
     assertErrors(source, [
         CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH,
@@ -637,18 +636,18 @@
     // According to checked-mode type checking rules, a value of type A is not
     // assignable to a field of type B, because B extends A (the subtyping
     // relationship is in the wrong direction).
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  const A();",
-        "}",
-        "class B extends A {",
-        "  const B();",
-        "}",
-        "class C {",
-        "  final B b;",
-        "  const C(this.b);",
-        "}",
-        "var v = const C(const A());"]));
+    Source source = addSource(r'''
+class A {
+  const A();
+}
+class B extends A {
+  const B();
+}
+class C {
+  final B b;
+  const C(this.b);
+}
+var v = const C(const A());''');
     resolve(source);
     assertErrors(source, [
         CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH]);
@@ -659,16 +658,16 @@
     // According to checked-mode type checking rules, a value of type A is not
     // assignable to a field of type B, because B implements A (the subtyping
     // relationship is in the wrong direction).
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  const A();",
-        "}",
-        "class B implements A {}",
-        "class C {",
-        "  final B b;",
-        "  const C(this.b);",
-        "}",
-        "var v = const C(const A());"]));
+    Source source = addSource(r'''
+class A {
+  const A();
+}
+class B implements A {}
+class C {
+  final B b;
+  const C(this.b);
+}
+var v = const C(const A());''');
     resolve(source);
     assertErrors(source, [
         CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH]);
@@ -677,11 +676,11 @@
 
   void test_fieldFormalParameterNotAssignableToField_list() {
     // <num>[1, 2, 3] has type List<num>, which is not a subtype of List<int>.
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  const A(List<int> x);",
-        "}",
-        "var x = const A(const <num>[1, 2, 3]);"]));
+    Source source = addSource(r'''
+class A {
+  const A(List<int> x);
+}
+var x = const A(const <num>[1, 2, 3]);''');
     resolve(source);
     assertErrors(source, [
         CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH]);
@@ -691,11 +690,11 @@
   void test_fieldFormalParameterNotAssignableToField_map_keyMismatch() {
     // <num, int>{1: 2} has type Map<num, int>, which is not a subtype of
     // Map<int, int>.
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  const A(Map<int, int> x);",
-        "}",
-        "var x = const A(const <num, int>{1: 2});"]));
+    Source source = addSource(r'''
+class A {
+  const A(Map<int, int> x);
+}
+var x = const A(const <num, int>{1: 2});''');
     resolve(source);
     assertErrors(source, [
         CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH]);
@@ -705,11 +704,11 @@
   void test_fieldFormalParameterNotAssignableToField_map_valueMismatch() {
     // <int, num>{1: 2} has type Map<int, num>, which is not a subtype of
     // Map<int, int>.
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  const A(Map<int, int> x);",
-        "}",
-        "var x = const A(const <int, num>{1: 2});"]));
+    Source source = addSource(r'''
+class A {
+  const A(Map<int, int> x);
+}
+var x = const A(const <int, num>{1: 2});''');
     resolve(source);
     assertErrors(source, [
         CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH]);
@@ -717,12 +716,12 @@
   }
 
   void test_fieldFormalParameterNotAssignableToField_optional() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  final int x;",
-        "  const A([this.x = 'foo']);",
-        "}",
-        "var v = const A();"]));
+    Source source = addSource(r'''
+class A {
+  final int x;
+  const A([this.x = 'foo']);
+}
+var v = const A();''');
     resolve(source);
     assertErrors(source, [
         CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH,
@@ -733,14 +732,14 @@
   void test_fieldFormalParameterNotAssignableToField_typedef() {
     // foo has the runtime type String -> int, so it should not be assignable
     // to A.f (A.f requires it to be int -> String).
-    Source source = addSource(EngineTestCase.createSource([
-        "typedef String Int2String(int x);",
-        "class A {",
-        "  final Int2String f;",
-        "  const A(this.f);",
-        "}",
-        "int foo(String x) => 1;"
-        "var v = const A(foo);"]));
+    Source source = addSource(r'''
+typedef String Int2String(int x);
+class A {
+  final Int2String f;
+  const A(this.f);
+}
+int foo(String x) => 1;
+var v = const A(foo);''');
     resolve(source);
     assertErrors(source, [
         CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH,
@@ -749,11 +748,11 @@
   }
 
   void test_fieldInitializerNotAssignable() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  final int x;",
-        "  const A() : x = '';",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  final int x;
+  const A() : x = '';
+}''');
     resolve(source);
     assertErrors(source, [
         CheckedModeCompileTimeErrorCode.CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE,
@@ -762,12 +761,12 @@
   }
 
   void test_fieldTypeMismatch() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  const A(x) : y = x;",
-        "  final int y;",
-        "}",
-        "var v = const A('foo');"]));
+    Source source = addSource(r'''
+class A {
+  const A(x) : y = x;
+  final int y;
+}
+var v = const A('foo');''');
     resolve(source);
     assertErrors(source, [
         CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_FIELD_TYPE_MISMATCH]);
@@ -775,12 +774,12 @@
   }
 
   void test_fieldTypeMismatch_unresolved() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  const A(x) : y = x;",
-        "  final Unresolved y;",
-        "}",
-        "var v = const A('foo');"]));
+    Source source = addSource(r'''
+class A {
+  const A(x) : y = x;
+  final Unresolved y;
+}
+var v = const A('foo');''');
     resolve(source);
     assertErrors(source, [
         CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_FIELD_TYPE_MISMATCH,
@@ -789,12 +788,12 @@
   }
 
   void test_fieldTypeOk_null() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  const A(x) : y = x;",
-        "  final int y;",
-        "}",
-        "var v = const A(null);"]));
+    Source source = addSource(r'''
+class A {
+  const A(x) : y = x;
+  final int y;
+}
+var v = const A(null);''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -803,12 +802,12 @@
   void test_fieldTypeOk_unresolved_null() {
     // Null always passes runtime type checks, even when the type is
     // unresolved.
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  const A(x) : y = x;",
-        "  final Unresolved y;",
-        "}",
-        "var v = const A(null);"]));
+    Source source = addSource(r'''
+class A {
+  const A(x) : y = x;
+  final Unresolved y;
+}
+var v = const A(null);''');
     resolve(source);
     assertErrors(source, [
         StaticWarningCode.UNDEFINED_CLASS]);
@@ -816,7 +815,7 @@
   }
 
   void test_listElementTypeNotAssignable() {
-    Source source = addSource(EngineTestCase.createSource(["var v = const <String> [42];"]));
+    Source source = addSource("var v = const <String> [42];");
     resolve(source);
     assertErrors(source, [
         CheckedModeCompileTimeErrorCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,
@@ -825,7 +824,7 @@
   }
 
   void test_mapKeyTypeNotAssignable() {
-    Source source = addSource(EngineTestCase.createSource(["var v = const <String, int > {1 : 2};"]));
+    Source source = addSource("var v = const <String, int > {1 : 2};");
     resolve(source);
     assertErrors(source, [
         CheckedModeCompileTimeErrorCode.MAP_KEY_TYPE_NOT_ASSIGNABLE,
@@ -834,7 +833,7 @@
   }
 
   void test_mapValueTypeNotAssignable() {
-    Source source = addSource(EngineTestCase.createSource(["var v = const <String, String> {'a' : 2};"]));
+    Source source = addSource("var v = const <String, String> {'a' : 2};");
     resolve(source);
     assertErrors(source, [
         CheckedModeCompileTimeErrorCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE,
@@ -843,12 +842,12 @@
   }
 
   void test_redirectingConstructor_paramTypeMismatch() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  const A.a1(x) : this.a2(x);",
-        "  const A.a2(String x);",
-        "}",
-        "var v = const A.a1(0);"]));
+    Source source = addSource(r'''
+class A {
+  const A.a1(x) : this.a2(x);
+  const A.a2(String x);
+}
+var v = const A.a1(0);''');
     resolve(source);
     assertErrors(source, [
         CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH]);
@@ -857,11 +856,11 @@
 
   void test_parameterAssignable_null() {
     // Null is assignable to anything.
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  const A(int x);",
-        "}",
-        "var v = const A(null);"]));
+    Source source = addSource(r'''
+class A {
+  const A(int x);
+}
+var v = const A(null);''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -870,11 +869,11 @@
   void test_parameterAssignable_undefined_null() {
     // Null always passes runtime type checks, even when the type is
     // unresolved.
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  const A(Unresolved x);",
-        "}",
-        "var v = const A(null);"]));
+    Source source = addSource(r'''
+class A {
+  const A(Unresolved x);
+}
+var v = const A(null);''');
     resolve(source);
     assertErrors(source, [
         StaticWarningCode.UNDEFINED_CLASS]);
@@ -882,22 +881,22 @@
   }
 
   void test_parameterAssignable_typeSubstitution() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A<T> {",
-        "  const A(T x);",
-        "}",
-        "var v = const A<int>(3);"]));
+    Source source = addSource(r'''
+class A<T> {
+  const A(T x);
+}
+var v = const A<int>(3);''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_parameterNotAssignable() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  const A(int x);",
-        "}",
-        "var v = const A('foo');"]));
+    Source source = addSource(r'''
+class A {
+  const A(int x);
+}
+var v = const A('foo');''');
     resolve(source);
     assertErrors(source, [
         CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH,
@@ -906,11 +905,11 @@
   }
 
   void test_parameterNotAssignable_undefined() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  const A(Unresolved x);",
-        "}",
-        "var v = const A('foo');"]));
+    Source source = addSource(r'''
+class A {
+  const A(Unresolved x);
+}
+var v = const A('foo');''');
     resolve(source);
     assertErrors(source, [
         CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH,
@@ -919,11 +918,11 @@
   }
 
   void test_parameterNotAssignable_typeSubstitution() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A<T> {",
-        "  const A(T x);",
-        "}",
-        "var v = const A<int>('foo');"]));
+    Source source = addSource(r'''
+class A<T> {
+  const A(T x);
+}
+var v = const A<int>('foo');''');
     resolve(source);
     assertErrors(source, [
         CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH,
@@ -932,8 +931,7 @@
   }
 
   void test_topLevelVarAssignable_null() {
-    Source source = addSource(EngineTestCase.createSource([
-        "const int x = null;"]));
+    Source source = addSource("const int x = null;");
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -942,8 +940,7 @@
   void test_topLevelVarAssignable_undefined_null() {
     // Null always passes runtime type checks, even when the type is
     // unresolved.
-    Source source = addSource(EngineTestCase.createSource([
-        "const Unresolved x = null;"]));
+    Source source = addSource("const Unresolved x = null;");
     resolve(source);
     assertErrors(source, [
         StaticWarningCode.UNDEFINED_CLASS]);
@@ -951,8 +948,7 @@
   }
 
   void test_topLevelVarNotAssignable() {
-    Source source = addSource(EngineTestCase.createSource([
-        "const int x = 'foo';"]));
+    Source source = addSource("const int x = 'foo';");
     resolve(source);
     assertErrors(source, [
         CheckedModeCompileTimeErrorCode.VARIABLE_TYPE_MISMATCH,
@@ -961,8 +957,7 @@
   }
 
   void test_topLevelVarNotAssignable_undefined() {
-    Source source = addSource(EngineTestCase.createSource([
-        "const Unresolved x = 'foo';"]));
+    Source source = addSource("const Unresolved x = 'foo';");
     resolve(source);
     assertErrors(source, [
         CheckedModeCompileTimeErrorCode.VARIABLE_TYPE_MISMATCH,
@@ -973,94 +968,94 @@
 
 class DeclarationMatcherTest extends ResolverTestCase {
   void test_compilationUnitMatches_false_topLevelVariable() {
-    _assertCompilationUnitMatches(false, EngineTestCase.createSource([
-        "class C {",
-        "  int m(int p) {",
-        "    return p + p;",
-        "  }",
-        "}"]), EngineTestCase.createSource([
-        "const int ZERO = 0;",
-        "class C {",
-        "  int m(int p) {",
-        "    return (p * p) + (p * p) + ZERO;",
-        "  }",
-        "}"]));
+    _assertCompilationUnitMatches(false, r'''
+class C {
+  int m(int p) {
+    return p + p;
+  }
+}''', r'''
+const int ZERO = 0;
+class C {
+  int m(int p) {
+    return (p * p) + (p * p) + ZERO;
+  }
+}''');
   }
 
   void test_compilationUnitMatches_true_different() {
-    _assertCompilationUnitMatches(true, EngineTestCase.createSource([
-        "class C {",
-        "  int m(int p) {",
-        "    return p + p;",
-        "  }",
-        "}"]), EngineTestCase.createSource([
-        "class C {",
-        "  int m(int p) {",
-        "    return (p * p) + (p * p);",
-        "  }",
-        "}"]));
+    _assertCompilationUnitMatches(true, r'''
+class C {
+  int m(int p) {
+    return p + p;
+  }
+}''', r'''
+class C {
+  int m(int p) {
+    return (p * p) + (p * p);
+  }
+}''');
   }
 
   void test_compilationUnitMatches_true_same() {
-    String content = EngineTestCase.createSource([
-        "class C {",
-        "  int m(int p) {",
-        "    return p + p;",
-        "  }",
-        "}"]);
+    String content = r'''
+class C {
+  int m(int p) {
+    return p + p;
+  }
+}''';
     _assertCompilationUnitMatches(true, content, content);
   }
 
   void test_methodDeclarationMatches_false_localVariable() {
-    _assertMethodMatches(false, EngineTestCase.createSource([
-        "class C {",
-        "  int m(int p) {",
-        "    return p + p;",
-        "  }",
-        "}"]), EngineTestCase.createSource([
-        "class C {",
-        "  int m(int p) {",
-        "    int product = p * p;",
-        "    return product + product;",
-        "  }",
-        "}"]));
+    _assertMethodMatches(false, r'''
+class C {
+  int m(int p) {
+    return p + p;
+  }
+}''', r'''
+class C {
+  int m(int p) {
+    int product = p * p;
+    return product + product;
+  }
+}''');
   }
 
   void test_methodDeclarationMatches_false_parameter() {
-    _assertMethodMatches(false, EngineTestCase.createSource([
-        "class C {",
-        "  int m(int p) {",
-        "    return p + p;",
-        "  }",
-        "}"]), EngineTestCase.createSource([
-        "class C {",
-        "  int m(int p, int q) {",
-        "    return (p * q) + (q * p);",
-        "  }",
-        "}"]));
+    _assertMethodMatches(false, r'''
+class C {
+  int m(int p) {
+    return p + p;
+  }
+}''', r'''
+class C {
+  int m(int p, int q) {
+    return (p * q) + (q * p);
+  }
+}''');
   }
 
   void test_methodDeclarationMatches_true_different() {
-    _assertMethodMatches(true, EngineTestCase.createSource([
-        "class C {",
-        "  int m(int p) {",
-        "    return p + p;",
-        "  }",
-        "}"]), EngineTestCase.createSource([
-        "class C {",
-        "  int m(int p) {",
-        "    return (p * p) + (p * p);",
-        "  }",
-        "}"]));
+    _assertMethodMatches(true, r'''
+class C {
+  int m(int p) {
+    return p + p;
+  }
+}''', r'''
+class C {
+  int m(int p) {
+    return (p * p) + (p * p);
+  }
+}''');
   }
 
   void test_methodDeclarationMatches_true_same() {
-    String content = EngineTestCase.createSource([
-        "class C {",
-        "  int m(int p) {",
-        "    return p + p;",
-        "  }",
-        "}"]);
+    String content = r'''
+class C {
+  int m(int p) {
+    return p + p;
+  }
+}''';
     _assertMethodMatches(true, content, content);
   }
 
@@ -1072,7 +1067,7 @@
     context.setContents(source, newContent);
     CompilationUnit newUnit = context.parseCompilationUnit(source);
     DeclarationMatcher matcher = new DeclarationMatcher();
-    JUnitTestCase.assertEquals(expectMatch, matcher.matches(newUnit, oldUnit.element));
+    expect(matcher.matches(newUnit, oldUnit.element), expectMatch);
   }
 
   void _assertMethodMatches(bool expectMatch, String oldContent, String newContent) {
@@ -1085,7 +1080,7 @@
     CompilationUnit newUnit = context.parseCompilationUnit(source);
     MethodDeclaration newMethod = _getFirstMethod(newUnit);
     DeclarationMatcher matcher = new DeclarationMatcher();
-    JUnitTestCase.assertEquals(expectMatch, matcher.matches(newMethod, element));
+    expect(matcher.matches(newMethod, element), expectMatch);
   }
 
   MethodDeclaration _getFirstMethod(CompilationUnit unit) {
@@ -1146,7 +1141,7 @@
   ElementResolver _resolver;
 
   void fail_visitExportDirective_combinators() {
-    JUnitTestCase.fail("Not yet tested");
+    fail("Not yet tested");
     // Need to set up the exported library so that the identifier can be resolved
     ExportDirective directive = AstFactory.exportDirective2(null, [AstFactory.hideCombinator2(["A"])]);
     _resolveNode(directive, []);
@@ -1154,12 +1149,12 @@
   }
 
   void fail_visitFunctionExpressionInvocation() {
-    JUnitTestCase.fail("Not yet tested");
+    fail("Not yet tested");
     _listener.assertNoErrors();
   }
 
   void fail_visitImportDirective_combinators_noPrefix() {
-    JUnitTestCase.fail("Not yet tested");
+    fail("Not yet tested");
     // Need to set up the imported library so that the identifier can be resolved
     ImportDirective directive = AstFactory.importDirective3(null, null, [AstFactory.showCombinator2(["A"])]);
     _resolveNode(directive, []);
@@ -1167,7 +1162,7 @@
   }
 
   void fail_visitImportDirective_combinators_prefix() {
-    JUnitTestCase.fail("Not yet tested");
+    fail("Not yet tested");
     // Need to set up the imported library so that the identifiers can be resolved
     String prefixName = "p";
     _definingLibrary.imports = <ImportElement> [ElementFactory.importFor(null, ElementFactory.prefix(prefixName), [])];
@@ -1179,7 +1174,7 @@
   }
 
   void fail_visitRedirectingConstructorInvocation() {
-    JUnitTestCase.fail("Not yet tested");
+    fail("Not yet tested");
     _listener.assertNoErrors();
   }
 
@@ -1219,7 +1214,7 @@
     SimpleIdentifier array = AstFactory.identifier3("a");
     array.staticType = classD.type;
     IndexExpression expression = AstFactory.indexExpression(array, AstFactory.identifier3("i"));
-    JUnitTestCase.assertSame(operator, _resolveIndexExpression(expression, []));
+    expect(_resolveIndexExpression(expression, []), same(operator));
     _listener.assertNoErrors();
   }
 
@@ -1229,14 +1224,14 @@
     leftHandSide.staticType = intType;
     AssignmentExpression assignment = AstFactory.assignmentExpression(leftHandSide, TokenType.PLUS_EQ, AstFactory.integer(1));
     _resolveNode(assignment, []);
-    JUnitTestCase.assertSame(getMethod(_typeProvider.numType, "+"), assignment.staticElement);
+    expect(assignment.staticElement, same(getMethod(_typeProvider.numType, "+")));
     _listener.assertNoErrors();
   }
 
   void test_visitAssignmentExpression_simple() {
     AssignmentExpression expression = AstFactory.assignmentExpression(AstFactory.identifier3("x"), TokenType.EQ, AstFactory.integer(0));
     _resolveNode(expression, []);
-    JUnitTestCase.assertNull(expression.staticElement);
+    expect(expression.staticElement, isNull);
     _listener.assertNoErrors();
   }
 
@@ -1249,8 +1244,8 @@
     left.staticType = numType;
     BinaryExpression expression = AstFactory.binaryExpression(left, TokenType.PLUS, AstFactory.identifier3("j"));
     _resolveNode(expression, []);
-    JUnitTestCase.assertEquals(getMethod(numType, "+"), expression.staticElement);
-    JUnitTestCase.assertNull(expression.propagatedElement);
+    expect(expression.staticElement, getMethod(numType, "+"));
+    expect(expression.propagatedElement, isNull);
     _listener.assertNoErrors();
   }
 
@@ -1263,8 +1258,8 @@
     left.propagatedType = numType;
     BinaryExpression expression = AstFactory.binaryExpression(left, TokenType.PLUS, AstFactory.identifier3("j"));
     _resolveNode(expression, []);
-    JUnitTestCase.assertNull(expression.staticElement);
-    JUnitTestCase.assertEquals(getMethod(numType, "+"), expression.propagatedElement);
+    expect(expression.staticElement, isNull);
+    expect(expression.propagatedElement, getMethod(numType, "+"));
     _listener.assertNoErrors();
   }
 
@@ -1272,7 +1267,7 @@
     String label = "loop";
     LabelElementImpl labelElement = new LabelElementImpl(AstFactory.identifier3(label), false, false);
     BreakStatement statement = AstFactory.breakStatement2(label);
-    JUnitTestCase.assertSame(labelElement, _resolveBreak(statement, labelElement));
+    expect(_resolveBreak(statement, labelElement), same(labelElement));
     _listener.assertNoErrors();
   }
 
@@ -1289,7 +1284,7 @@
     classA.constructors = <ConstructorElement> [constructor];
     ConstructorName name = AstFactory.constructorName(AstFactory.typeName(classA, []), constructorName);
     _resolveNode(name, []);
-    JUnitTestCase.assertSame(constructor, name.staticElement);
+    expect(name.staticElement, same(constructor));
     _listener.assertNoErrors();
   }
 
@@ -1300,7 +1295,7 @@
     classA.constructors = <ConstructorElement> [constructor];
     ConstructorName name = AstFactory.constructorName(AstFactory.typeName(classA, []), constructorName);
     _resolveNode(name, []);
-    JUnitTestCase.assertSame(constructor, name.staticElement);
+    expect(name.staticElement, same(constructor));
     _listener.assertNoErrors();
   }
 
@@ -1308,7 +1303,7 @@
     String label = "loop";
     LabelElementImpl labelElement = new LabelElementImpl(AstFactory.identifier3(label), false, false);
     ContinueStatement statement = AstFactory.continueStatement(label);
-    JUnitTestCase.assertSame(labelElement, _resolveContinue(statement, labelElement));
+    expect(_resolveContinue(statement, labelElement), same(labelElement));
     _listener.assertNoErrors();
   }
 
@@ -1337,7 +1332,7 @@
     parameterElement.type = intType;
     parameter.identifier.staticElement = parameterElement;
     _resolveInClass(parameter, classA);
-    JUnitTestCase.assertSame(intType, parameter.element.type);
+    expect(parameter.element.type, same(intType));
   }
 
   void test_visitImportDirective_noCombinators_noPrefix() {
@@ -1369,9 +1364,9 @@
     unit.topLevelVariables = <TopLevelVariableElement> [varA, varB, varC];
     directive.element = ElementFactory.importFor(library, null, []);
     _resolveNode(directive, []);
-    JUnitTestCase.assertSame(varA, combinator.shownNames[0].staticElement);
-    JUnitTestCase.assertSame(varB, combinator.shownNames[1].staticElement);
-    JUnitTestCase.assertSame(varC, combinator.shownNames[2].staticElement);
+    expect(combinator.shownNames[0].staticElement, same(varA));
+    expect(combinator.shownNames[1].staticElement, same(varB));
+    expect(combinator.shownNames[2].staticElement, same(varC));
     _listener.assertNoErrors();
   }
 
@@ -1383,7 +1378,7 @@
     SimpleIdentifier array = AstFactory.identifier3("a");
     array.staticType = classA.type;
     IndexExpression expression = AstFactory.indexExpression(array, AstFactory.identifier3("i"));
-    JUnitTestCase.assertSame(getter, _resolveIndexExpression(expression, []));
+    expect(_resolveIndexExpression(expression, []), same(getter));
     _listener.assertNoErrors();
   }
 
@@ -1396,7 +1391,7 @@
     array.staticType = classA.type;
     IndexExpression expression = AstFactory.indexExpression(array, AstFactory.identifier3("i"));
     AstFactory.assignmentExpression(expression, TokenType.EQ, AstFactory.integer(0));
-    JUnitTestCase.assertSame(setter, _resolveIndexExpression(expression, []));
+    expect(_resolveIndexExpression(expression, []), same(setter));
     _listener.assertNoErrors();
   }
 
@@ -1409,7 +1404,7 @@
     name.staticElement = constructor;
     InstanceCreationExpression creation = AstFactory.instanceCreationExpression(Keyword.NEW, name, []);
     _resolveNode(creation, []);
-    JUnitTestCase.assertSame(constructor, creation.staticElement);
+    expect(creation.staticElement, same(constructor));
     _listener.assertNoErrors();
   }
 
@@ -1422,7 +1417,7 @@
     name.staticElement = constructor;
     InstanceCreationExpression creation = AstFactory.instanceCreationExpression(Keyword.NEW, name, []);
     _resolveNode(creation, []);
-    JUnitTestCase.assertSame(constructor, creation.staticElement);
+    expect(creation.staticElement, same(constructor));
     _listener.assertNoErrors();
   }
 
@@ -1438,8 +1433,8 @@
     name.staticElement = constructor;
     InstanceCreationExpression creation = AstFactory.instanceCreationExpression(Keyword.NEW, name, [AstFactory.namedExpression2(parameterName, AstFactory.integer(0))]);
     _resolveNode(creation, []);
-    JUnitTestCase.assertSame(constructor, creation.staticElement);
-    JUnitTestCase.assertSame(parameter, (creation.argumentList.arguments[0] as NamedExpression).name.label.staticElement);
+    expect(creation.staticElement, same(constructor));
+    expect((creation.argumentList.arguments[0] as NamedExpression).name.label.staticElement, same(parameter));
     _listener.assertNoErrors();
   }
 
@@ -1450,7 +1445,7 @@
     String methodName = "abs";
     MethodInvocation invocation = AstFactory.methodInvocation(left, methodName, []);
     _resolveNode(invocation, []);
-    JUnitTestCase.assertSame(getMethod(numType, methodName), invocation.methodName.staticElement);
+    expect(invocation.methodName.staticElement, same(getMethod(numType, methodName)));
     _listener.assertNoErrors();
   }
 
@@ -1466,8 +1461,8 @@
     left.staticType = classA.type;
     MethodInvocation invocation = AstFactory.methodInvocation(left, methodName, [AstFactory.namedExpression2(parameterName, AstFactory.integer(0))]);
     _resolveNode(invocation, []);
-    JUnitTestCase.assertSame(method, invocation.methodName.staticElement);
-    JUnitTestCase.assertSame(parameter, (invocation.argumentList.arguments[0] as NamedExpression).name.label.staticElement);
+    expect(invocation.methodName.staticElement, same(method));
+    expect((invocation.argumentList.arguments[0] as NamedExpression).name.label.staticElement, same(parameter));
     _listener.assertNoErrors();
   }
 
@@ -1477,7 +1472,7 @@
     operand.staticType = numType;
     PostfixExpression expression = AstFactory.postfixExpression(operand, TokenType.PLUS_PLUS);
     _resolveNode(expression, []);
-    JUnitTestCase.assertEquals(getMethod(numType, "+"), expression.staticElement);
+    expect(expression.staticElement, getMethod(numType, "+"));
     _listener.assertNoErrors();
   }
 
@@ -1490,8 +1485,8 @@
     target.staticType = dynamicType;
     PrefixedIdentifier identifier = AstFactory.identifier(target, AstFactory.identifier3("b"));
     _resolveNode(identifier, []);
-    JUnitTestCase.assertNull(identifier.staticElement);
-    JUnitTestCase.assertNull(identifier.identifier.staticElement);
+    expect(identifier.staticElement, isNull);
+    expect(identifier.identifier.staticElement, isNull);
     _listener.assertNoErrors();
   }
 
@@ -1507,8 +1502,8 @@
     target.staticType = classA.type;
     PrefixedIdentifier identifier = AstFactory.identifier(target, AstFactory.identifier3(getterName));
     _resolveNode(identifier, []);
-    JUnitTestCase.assertSame(getter, identifier.staticElement);
-    JUnitTestCase.assertSame(getter, identifier.identifier.staticElement);
+    expect(identifier.staticElement, same(getter));
+    expect(identifier.identifier.staticElement, same(getter));
     _listener.assertNoErrors();
   }
 
@@ -1526,8 +1521,8 @@
     PrefixedIdentifier identifier = AstFactory.identifier(target, AstFactory.identifier3(propName));
     // resolve
     _resolveNode(identifier, []);
-    JUnitTestCase.assertSame(getter, identifier.staticElement);
-    JUnitTestCase.assertSame(getter, identifier.identifier.staticElement);
+    expect(identifier.staticElement, same(getter));
+    expect(identifier.identifier.staticElement, same(getter));
     _listener.assertNoErrors();
   }
 
@@ -1548,8 +1543,8 @@
     AstFactory.assignmentExpression(identifier, TokenType.EQ, AstFactory.nullLiteral());
     // resolve
     _resolveNode(identifier, []);
-    JUnitTestCase.assertSame(method, identifier.staticElement);
-    JUnitTestCase.assertSame(method, identifier.identifier.staticElement);
+    expect(identifier.staticElement, same(method));
+    expect(identifier.identifier.staticElement, same(method));
     _listener.assertNoErrors();
   }
 
@@ -1568,8 +1563,8 @@
     AstFactory.assignmentExpression(identifier, TokenType.EQ, AstFactory.nullLiteral());
     // resolve
     _resolveNode(identifier, []);
-    JUnitTestCase.assertSame(setter, identifier.staticElement);
-    JUnitTestCase.assertSame(setter, identifier.identifier.staticElement);
+    expect(identifier.staticElement, same(setter));
+    expect(identifier.identifier.staticElement, same(setter));
     _listener.assertNoErrors();
   }
 
@@ -1579,7 +1574,7 @@
     operand.staticType = numType;
     PrefixExpression expression = AstFactory.prefixExpression(TokenType.PLUS_PLUS, operand);
     _resolveNode(expression, []);
-    JUnitTestCase.assertEquals(getMethod(numType, "+"), expression.staticElement);
+    expect(expression.staticElement, getMethod(numType, "+"));
     _listener.assertNoErrors();
   }
 
@@ -1592,7 +1587,7 @@
     target.staticType = classA.type;
     PropertyAccess access = AstFactory.propertyAccess2(target, getterName);
     _resolveNode(access, []);
-    JUnitTestCase.assertSame(getter, access.propertyName.staticElement);
+    expect(access.propertyName.staticElement, same(getter));
     _listener.assertNoErrors();
   }
 
@@ -1614,7 +1609,7 @@
     PropertyAccess access = AstFactory.propertyAccess2(target, getterName);
     AstFactory.methodDeclaration2(null, null, null, null, AstFactory.identifier3("m"), AstFactory.formalParameterList([]), AstFactory.expressionFunctionBody(access));
     _resolveNode(access, []);
-    JUnitTestCase.assertSame(getter, access.propertyName.staticElement);
+    expect(access.propertyName.staticElement, same(getter));
     _listener.assertNoErrors();
   }
 
@@ -1628,7 +1623,7 @@
     PropertyAccess access = AstFactory.propertyAccess2(target, setterName);
     AstFactory.assignmentExpression(access, TokenType.EQ, AstFactory.integer(0));
     _resolveNode(access, []);
-    JUnitTestCase.assertSame(setter, access.propertyName.staticElement);
+    expect(access.propertyName.staticElement, same(setter));
     _listener.assertNoErrors();
   }
 
@@ -1637,22 +1632,22 @@
     String fieldName = "NAN";
     SimpleIdentifier node = AstFactory.identifier3(fieldName);
     _resolveInClass(node, doubleType.element);
-    JUnitTestCase.assertEquals(getGetter(doubleType, fieldName), node.staticElement);
+    expect(node.staticElement, getGetter(doubleType, fieldName));
     _listener.assertNoErrors();
   }
 
   void test_visitSimpleIdentifier_dynamic() {
     SimpleIdentifier node = AstFactory.identifier3("dynamic");
     _resolveIdentifier(node, []);
-    JUnitTestCase.assertSame(_typeProvider.dynamicType.element, node.staticElement);
-    JUnitTestCase.assertSame(_typeProvider.typeType, node.staticType);
+    expect(node.staticElement, same(_typeProvider.dynamicType.element));
+    expect(node.staticType, same(_typeProvider.typeType));
     _listener.assertNoErrors();
   }
 
   void test_visitSimpleIdentifier_lexicalScope() {
     SimpleIdentifier node = AstFactory.identifier3("i");
     VariableElementImpl element = ElementFactory.localVariableElement(node);
-    JUnitTestCase.assertSame(element, _resolveIdentifier(node, [element]));
+    expect(_resolveIdentifier(node, [element]), same(element));
     _listener.assertNoErrors();
   }
 
@@ -1668,7 +1663,7 @@
     _resolveInClass(node, classA);
     Element element = node.staticElement;
     EngineTestCase.assertInstanceOf((obj) => obj is PropertyAccessorElement, PropertyAccessorElement, element);
-    JUnitTestCase.assertTrue((element as PropertyAccessorElement).isSetter);
+    expect((element as PropertyAccessorElement).isSetter, isTrue);
     _listener.assertNoErrors();
   }
 
@@ -1681,7 +1676,7 @@
     subclass.constructors = <ConstructorElement> [subConstructor];
     SuperConstructorInvocation invocation = AstFactory.superConstructorInvocation([]);
     _resolveInClass(invocation, subclass);
-    JUnitTestCase.assertEquals(superConstructor, invocation.staticElement);
+    expect(invocation.staticElement, superConstructor);
     _listener.assertNoErrors();
   }
 
@@ -1697,8 +1692,8 @@
     subclass.constructors = <ConstructorElement> [subConstructor];
     SuperConstructorInvocation invocation = AstFactory.superConstructorInvocation([AstFactory.namedExpression2(parameterName, AstFactory.integer(0))]);
     _resolveInClass(invocation, subclass);
-    JUnitTestCase.assertEquals(superConstructor, invocation.staticElement);
-    JUnitTestCase.assertSame(parameter, (invocation.argumentList.arguments[0] as NamedExpression).name.label.staticElement);
+    expect(invocation.staticElement, superConstructor);
+    expect((invocation.argumentList.arguments[0] as NamedExpression).name.label.staticElement, same(parameter));
     _listener.assertNoErrors();
   }
 
@@ -1888,110 +1883,113 @@
 
 class ErrorResolverTest extends ResolverTestCase {
   void test_breakLabelOnSwitchMember() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  void m(int i) {",
-        "    switch (i) {",
-        "      l: case 0:",
-        "        break;",
-        "      case 1:",
-        "        break l;",
-        "    }",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  void m(int i) {
+    switch (i) {
+      l: case 0:
+        break;
+      case 1:
+        break l;
+    }
+  }
+}''');
     resolve(source);
     assertErrors(source, [ResolverErrorCode.BREAK_LABEL_ON_SWITCH_MEMBER]);
     verify([source]);
   }
 
   void test_continueLabelOnSwitch() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  void m(int i) {",
-        "    l: switch (i) {",
-        "      case 0:",
-        "        continue l;",
-        "    }",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  void m(int i) {
+    l: switch (i) {
+      case 0:
+        continue l;
+    }
+  }
+}''');
     resolve(source);
     assertErrors(source, [ResolverErrorCode.CONTINUE_LABEL_ON_SWITCH]);
     verify([source]);
   }
 
   void test_enclosingElement_invalidLocalFunction() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class C {",
-        "  C() {",
-        "    int get x => 0;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class C {
+  C() {
+    int get x => 0;
+  }
+}''');
     LibraryElement library = resolve(source);
-    JUnitTestCase.assertNotNull(library);
+    expect(library, isNotNull);
     var unit = library.definingCompilationUnit;
-    JUnitTestCase.assertNotNull(unit);
+    expect(unit, isNotNull);
     var types = unit.types;
-    JUnitTestCase.assertNotNull(types);
-    EngineTestCase.assertSizeOfList(1, types);
+    expect(types, isNotNull);
+    expect(types, hasLength(1));
     var type = types[0];
-    JUnitTestCase.assertNotNull(type);
+    expect(type, isNotNull);
     var constructors = type.constructors;
-    JUnitTestCase.assertNotNull(constructors);
-    EngineTestCase.assertSizeOfList(1, constructors);
+    expect(constructors, isNotNull);
+    expect(constructors, hasLength(1));
     ConstructorElement constructor = constructors[0];
-    JUnitTestCase.assertNotNull(constructor);
+    expect(constructor, isNotNull);
     List<FunctionElement> functions = constructor.functions;
-    JUnitTestCase.assertNotNull(functions);
-    EngineTestCase.assertSizeOfList(1, functions);
-    JUnitTestCase.assertEquals(constructor, functions[0].enclosingElement);
+    expect(functions, isNotNull);
+    expect(functions, hasLength(1));
+    expect(functions[0].enclosingElement, constructor);
     assertErrors(source, [ParserErrorCode.GETTER_IN_FUNCTION]);
   }
 }
 
 class HintCodeTest extends ResolverTestCase {
   void fail_deadCode_statementAfterRehrow() {
-    Source source = addSource(EngineTestCase.createSource([
-        "f() {",
-        "  try {",
-        "    var one = 1;",
-        "  } catch (e) {",
-        "    rethrow;",
-        "    var two = 2;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+f() {
+  try {
+    var one = 1;
+  } catch (e) {
+    rethrow;
+    var two = 2;
+  }
+}''');
     resolve(source);
     assertErrors(source, [HintCode.DEAD_CODE]);
     verify([source]);
   }
 
   void fail_deadCode_statementAfterThrow() {
-    Source source = addSource(EngineTestCase.createSource([
-        "f() {",
-        "  var one = 1;",
-        "  throw 'Stop here';",
-        "  var two = 2;",
-        "}"]));
+    Source source = addSource(r'''
+f() {
+  var one = 1;
+  throw 'Stop here';
+  var two = 2;
+}''');
     resolve(source);
     assertErrors(source, [HintCode.DEAD_CODE]);
     verify([source]);
   }
 
   void fail_isInt() {
-    Source source = addSource(EngineTestCase.createSource(["var v = 1 is int;"]));
+    Source source = addSource("var v = 1 is int;");
     resolve(source);
     assertErrors(source, [HintCode.IS_INT]);
     verify([source]);
   }
 
   void fail_isNotInt() {
-    Source source = addSource(EngineTestCase.createSource(["var v = 1 is! int;"]));
+    Source source = addSource("var v = 1 is! int;");
     resolve(source);
     assertErrors(source, [HintCode.IS_NOT_INT]);
     verify([source]);
   }
 
   void fail_overrideEqualsButNotHashCode() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  bool operator ==(x) {}", "}"]));
+    Source source = addSource(r'''
+class A {
+  bool operator ==(x) {}
+}''');
     resolve(source);
     assertErrors(source, [HintCode.OVERRIDE_EQUALS_BUT_NOT_HASH_CODE]);
     verify([source]);
@@ -1999,13 +1997,17 @@
 
   void fail_unusedImport_as_equalPrefixes() {
     // See todo at ImportsVerifier.prefixElementMap.
-    Source source = addSource(EngineTestCase.createSource([
-        "library L;",
-        "import 'lib1.dart' as one;",
-        "import 'lib2.dart' as one;",
-        "one.A a;"]));
-    Source source2 = addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
-    Source source3 = addNamedSource("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class B {}"]));
+    Source source = addSource(r'''
+library L;
+import 'lib1.dart' as one;
+import 'lib2.dart' as one;
+one.A a;''');
+    Source source2 = addNamedSource("/lib1.dart", r'''
+library lib1;
+class A {}''');
+    Source source3 = addNamedSource("/lib2.dart", r'''
+library lib2;
+class B {}''');
     resolve(source);
     assertErrors(source, [HintCode.UNUSED_IMPORT]);
     assertNoErrors(source2);
@@ -2014,14 +2016,14 @@
   }
 
   void test_argumentTypeNotAssignable_functionType() {
-    Source source = addSource(EngineTestCase.createSource([
-        "m() {",
-        "  var a = new A();",
-        "  a.n(() => 0);",
-        "}",
-        "class A {",
-        "  n(void f(int i)) {}",
-        "}"]));
+    Source source = addSource(r'''
+m() {
+  var a = new A();
+  a.n(() => 0);
+}
+class A {
+  n(void f(int i)) {}
+}''');
     resolve(source);
     assertErrors(source, [HintCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
     verify([source]);
@@ -2030,11 +2032,16 @@
   void test_argumentTypeNotAssignable_message() {
     // The implementation of HintCode.ARGUMENT_TYPE_NOT_ASSIGNABLE assumes that
     // StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE has the same message.
-    JUnitTestCase.assertEquals(HintCode.ARGUMENT_TYPE_NOT_ASSIGNABLE.message, StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE.message);
+    expect(StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE.message, HintCode.ARGUMENT_TYPE_NOT_ASSIGNABLE.message);
   }
 
   void test_argumentTypeNotAssignable_type() {
-    Source source = addSource(EngineTestCase.createSource(["m() {", "  var i = '';", "  n(i);", "}", "n(int i) {}"]));
+    Source source = addSource(r'''
+m() {
+  var i = '';
+  n(i);
+}
+n(int i) {}''');
     resolve(source);
     assertErrors(source, [HintCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
     verify([source]);
@@ -2042,29 +2049,32 @@
 
   void test_argumentTypeNotAssignable_unionTypeMethodMerge() {
     enableUnionTypes(false);
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  int m(int x) => 0;",
-        "}",
-        "class B {",
-        "  String m(String x) => '0';",
-        "}",
-        "f(A a, B b) {",
-        "  var ab;",
-        "  if (0 < 1) {",
-        "    ab = a;",
-        "  } else {",
-        "    ab = b;",
-        "  }",
-        "  ab.m(0.5);",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  int m(int x) => 0;
+}
+class B {
+  String m(String x) => '0';
+}
+f(A a, B b) {
+  var ab;
+  if (0 < 1) {
+    ab = a;
+  } else {
+    ab = b;
+  }
+  ab.m(0.5);
+}''');
     resolve(source);
     assertErrors(source, [HintCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
     verify([source]);
   }
 
   void test_deadCode_deadBlock_conditionalElse() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  true ? 1 : 2;", "}"]));
+    Source source = addSource(r'''
+f() {
+  true ? 1 : 2;
+}''');
     resolve(source);
     assertErrors(source, [HintCode.DEAD_CODE]);
     verify([source]);
@@ -2072,14 +2082,20 @@
 
   void test_deadCode_deadBlock_conditionalElse_nested() {
     // test that a dead else-statement can't generate additional violations
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  true ? true : false && false;", "}"]));
+    Source source = addSource(r'''
+f() {
+  true ? true : false && false;
+}''');
     resolve(source);
     assertErrors(source, [HintCode.DEAD_CODE]);
     verify([source]);
   }
 
   void test_deadCode_deadBlock_conditionalIf() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  false ? 1 : 2;", "}"]));
+    Source source = addSource(r'''
+f() {
+  false ? 1 : 2;
+}''');
     resolve(source);
     assertErrors(source, [HintCode.DEAD_CODE]);
     verify([source]);
@@ -2087,14 +2103,20 @@
 
   void test_deadCode_deadBlock_conditionalIf_nested() {
     // test that a dead then-statement can't generate additional violations
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  false ? false && false : true;", "}"]));
+    Source source = addSource(r'''
+f() {
+  false ? false && false : true;
+}''');
     resolve(source);
     assertErrors(source, [HintCode.DEAD_CODE]);
     verify([source]);
   }
 
   void test_deadCode_deadBlock_else() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  if(true) {} else {}", "}"]));
+    Source source = addSource(r'''
+f() {
+  if(true) {} else {}
+}''');
     resolve(source);
     assertErrors(source, [HintCode.DEAD_CODE]);
     verify([source]);
@@ -2102,14 +2124,20 @@
 
   void test_deadCode_deadBlock_else_nested() {
     // test that a dead else-statement can't generate additional violations
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  if(true) {} else {if (false) {}}", "}"]));
+    Source source = addSource(r'''
+f() {
+  if(true) {} else {if (false) {}}
+}''');
     resolve(source);
     assertErrors(source, [HintCode.DEAD_CODE]);
     verify([source]);
   }
 
   void test_deadCode_deadBlock_if() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  if(false) {}", "}"]));
+    Source source = addSource(r'''
+f() {
+  if(false) {}
+}''');
     resolve(source);
     assertErrors(source, [HintCode.DEAD_CODE]);
     verify([source]);
@@ -2117,14 +2145,20 @@
 
   void test_deadCode_deadBlock_if_nested() {
     // test that a dead then-statement can't generate additional violations
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  if(false) {if(false) {}}", "}"]));
+    Source source = addSource(r'''
+f() {
+  if(false) {if(false) {}}
+}''');
     resolve(source);
     assertErrors(source, [HintCode.DEAD_CODE]);
     verify([source]);
   }
 
   void test_deadCode_deadBlock_while() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  while(false) {}", "}"]));
+    Source source = addSource(r'''
+f() {
+  while(false) {}
+}''');
     resolve(source);
     assertErrors(source, [HintCode.DEAD_CODE]);
     verify([source]);
@@ -2132,18 +2166,21 @@
 
   void test_deadCode_deadBlock_while_nested() {
     // test that a dead while body can't generate additional violations
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  while(false) {if(false) {}}", "}"]));
+    Source source = addSource(r'''
+f() {
+  while(false) {if(false) {}}
+}''');
     resolve(source);
     assertErrors(source, [HintCode.DEAD_CODE]);
     verify([source]);
   }
 
   void test_deadCode_deadCatch_catchFollowingCatch() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "f() {",
-        "  try {} catch (e) {} catch (e) {}",
-        "}"]));
+    Source source = addSource(r'''
+class A {}
+f() {
+  try {} catch (e) {} catch (e) {}
+}''');
     resolve(source);
     assertErrors(source, [HintCode.DEAD_CODE_CATCH_FOLLOWING_CATCH]);
     verify([source]);
@@ -2151,21 +2188,21 @@
 
   void test_deadCode_deadCatch_catchFollowingCatch_nested() {
     // test that a dead catch clause can't generate additional violations
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "f() {",
-        "  try {} catch (e) {} catch (e) {if(false) {}}",
-        "}"]));
+    Source source = addSource(r'''
+class A {}
+f() {
+  try {} catch (e) {} catch (e) {if(false) {}}
+}''');
     resolve(source);
     assertErrors(source, [HintCode.DEAD_CODE_CATCH_FOLLOWING_CATCH]);
     verify([source]);
   }
 
   void test_deadCode_deadCatch_catchFollowingCatch_object() {
-    Source source = addSource(EngineTestCase.createSource([
-        "f() {",
-        "  try {} on Object catch (e) {} catch (e) {}",
-        "}"]));
+    Source source = addSource(r'''
+f() {
+  try {} on Object catch (e) {} catch (e) {}
+}''');
     resolve(source);
     assertErrors(source, [HintCode.DEAD_CODE_CATCH_FOLLOWING_CATCH]);
     verify([source]);
@@ -2173,22 +2210,22 @@
 
   void test_deadCode_deadCatch_catchFollowingCatch_object_nested() {
     // test that a dead catch clause can't generate additional violations
-    Source source = addSource(EngineTestCase.createSource([
-        "f() {",
-        "  try {} on Object catch (e) {} catch (e) {if(false) {}}",
-        "}"]));
+    Source source = addSource(r'''
+f() {
+  try {} on Object catch (e) {} catch (e) {if(false) {}}
+}''');
     resolve(source);
     assertErrors(source, [HintCode.DEAD_CODE_CATCH_FOLLOWING_CATCH]);
     verify([source]);
   }
 
   void test_deadCode_deadCatch_onCatchSubtype() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B extends A {}",
-        "f() {",
-        "  try {} on A catch (e) {} on B catch (e) {}",
-        "}"]));
+    Source source = addSource(r'''
+class A {}
+class B extends A {}
+f() {
+  try {} on A catch (e) {} on B catch (e) {}
+}''');
     resolve(source);
     assertErrors(source, [HintCode.DEAD_CODE_ON_CATCH_SUBTYPE]);
     verify([source]);
@@ -2196,254 +2233,266 @@
 
   void test_deadCode_deadCatch_onCatchSubtype_nested() {
     // test that a dead catch clause can't generate additional violations
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B extends A {}",
-        "f() {",
-        "  try {} on A catch (e) {} on B catch (e) {if(false) {}}",
-        "}"]));
+    Source source = addSource(r'''
+class A {}
+class B extends A {}
+f() {
+  try {} on A catch (e) {} on B catch (e) {if(false) {}}
+}''');
     resolve(source);
     assertErrors(source, [HintCode.DEAD_CODE_ON_CATCH_SUBTYPE]);
     verify([source]);
   }
 
   void test_deadCode_deadOperandLHS_and() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  bool b = false && false;", "}"]));
+    Source source = addSource(r'''
+f() {
+  bool b = false && false;
+}''');
     resolve(source);
     assertErrors(source, [HintCode.DEAD_CODE]);
     verify([source]);
   }
 
   void test_deadCode_deadOperandLHS_and_nested() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  bool b = false && (false && false);", "}"]));
+    Source source = addSource(r'''
+f() {
+  bool b = false && (false && false);
+}''');
     resolve(source);
     assertErrors(source, [HintCode.DEAD_CODE]);
     verify([source]);
   }
 
   void test_deadCode_deadOperandLHS_or() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  bool b = true || true;", "}"]));
+    Source source = addSource(r'''
+f() {
+  bool b = true || true;
+}''');
     resolve(source);
     assertErrors(source, [HintCode.DEAD_CODE]);
     verify([source]);
   }
 
   void test_deadCode_deadOperandLHS_or_nested() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  bool b = true || (false && false);", "}"]));
+    Source source = addSource(r'''
+f() {
+  bool b = true || (false && false);
+}''');
     resolve(source);
     assertErrors(source, [HintCode.DEAD_CODE]);
     verify([source]);
   }
 
   void test_deadCode_statementAfterBreak_inDefaultCase() {
-    Source source = addSource(EngineTestCase.createSource([
-        "f(v) {",
-        "  switch(v) {",
-        "    case 1:",
-        "    default:",
-        "      break;",
-        "      var a;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+f(v) {
+  switch(v) {
+    case 1:
+    default:
+      break;
+      var a;
+  }
+}''');
     resolve(source);
     assertErrors(source, [HintCode.DEAD_CODE]);
     verify([source]);
   }
 
   void test_deadCode_statementAfterBreak_inForEachStatement() {
-    Source source = addSource(EngineTestCase.createSource([
-        "f() {",
-        "  var list;",
-        "  for(var l in list) {",
-        "    break;",
-        "    var a;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+f() {
+  var list;
+  for(var l in list) {
+    break;
+    var a;
+  }
+}''');
     resolve(source);
     assertErrors(source, [HintCode.DEAD_CODE]);
     verify([source]);
   }
 
   void test_deadCode_statementAfterBreak_inForStatement() {
-    Source source = addSource(EngineTestCase.createSource([
-        "f() {",
-        "  for(;;) {",
-        "    break;",
-        "    var a;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+f() {
+  for(;;) {
+    break;
+    var a;
+  }
+}''');
     resolve(source);
     assertErrors(source, [HintCode.DEAD_CODE]);
     verify([source]);
   }
 
   void test_deadCode_statementAfterBreak_inSwitchCase() {
-    Source source = addSource(EngineTestCase.createSource([
-        "f(v) {",
-        "  switch(v) {",
-        "    case 1:",
-        "      break;",
-        "      var a;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+f(v) {
+  switch(v) {
+    case 1:
+      break;
+      var a;
+  }
+}''');
     resolve(source);
     assertErrors(source, [HintCode.DEAD_CODE]);
     verify([source]);
   }
 
   void test_deadCode_statementAfterBreak_inWhileStatement() {
-    Source source = addSource(EngineTestCase.createSource([
-        "f(v) {",
-        "  while(v) {",
-        "    break;",
-        "    var a;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+f(v) {
+  while(v) {
+    break;
+    var a;
+  }
+}''');
     resolve(source);
     assertErrors(source, [HintCode.DEAD_CODE]);
     verify([source]);
   }
 
   void test_deadCode_statementAfterContinue_inForEachStatement() {
-    Source source = addSource(EngineTestCase.createSource([
-        "f() {",
-        "  var list;",
-        "  for(var l in list) {",
-        "    continue;",
-        "    var a;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+f() {
+  var list;
+  for(var l in list) {
+    continue;
+    var a;
+  }
+}''');
     resolve(source);
     assertErrors(source, [HintCode.DEAD_CODE]);
     verify([source]);
   }
 
   void test_deadCode_statementAfterContinue_inForStatement() {
-    Source source = addSource(EngineTestCase.createSource([
-        "f() {",
-        "  for(;;) {",
-        "    continue;",
-        "    var a;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+f() {
+  for(;;) {
+    continue;
+    var a;
+  }
+}''');
     resolve(source);
     assertErrors(source, [HintCode.DEAD_CODE]);
     verify([source]);
   }
 
   void test_deadCode_statementAfterContinue_inWhileStatement() {
-    Source source = addSource(EngineTestCase.createSource([
-        "f(v) {",
-        "  while(v) {",
-        "    continue;",
-        "    var a;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+f(v) {
+  while(v) {
+    continue;
+    var a;
+  }
+}''');
     resolve(source);
     assertErrors(source, [HintCode.DEAD_CODE]);
     verify([source]);
   }
 
   void test_deadCode_statementAfterReturn_function() {
-    Source source = addSource(EngineTestCase.createSource([
-        "f() {",
-        "  var one = 1;",
-        "  return;",
-        "  var two = 2;",
-        "}"]));
+    Source source = addSource(r'''
+f() {
+  var one = 1;
+  return;
+  var two = 2;
+}''');
     resolve(source);
     assertErrors(source, [HintCode.DEAD_CODE]);
     verify([source]);
   }
 
   void test_deadCode_statementAfterReturn_ifStatement() {
-    Source source = addSource(EngineTestCase.createSource([
-        "f(bool b) {",
-        "  if(b) {",
-        "    var one = 1;",
-        "    return;",
-        "    var two = 2;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+f(bool b) {
+  if(b) {
+    var one = 1;
+    return;
+    var two = 2;
+  }
+}''');
     resolve(source);
     assertErrors(source, [HintCode.DEAD_CODE]);
     verify([source]);
   }
 
   void test_deadCode_statementAfterReturn_method() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  m() {",
-        "    var one = 1;",
-        "    return;",
-        "    var two = 2;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  m() {
+    var one = 1;
+    return;
+    var two = 2;
+  }
+}''');
     resolve(source);
     assertErrors(source, [HintCode.DEAD_CODE]);
     verify([source]);
   }
 
   void test_deadCode_statementAfterReturn_nested() {
-    Source source = addSource(EngineTestCase.createSource([
-        "f() {",
-        "  var one = 1;",
-        "  return;",
-        "  if(false) {}",
-        "}"]));
+    Source source = addSource(r'''
+f() {
+  var one = 1;
+  return;
+  if(false) {}
+}''');
     resolve(source);
     assertErrors(source, [HintCode.DEAD_CODE]);
     verify([source]);
   }
 
   void test_deadCode_statementAfterReturn_twoReturns() {
-    Source source = addSource(EngineTestCase.createSource([
-        "f() {",
-        "  var one = 1;",
-        "  return;",
-        "  var two = 2;",
-        "  return;",
-        "  var three = 3;",
-        "}"]));
+    Source source = addSource(r'''
+f() {
+  var one = 1;
+  return;
+  var two = 2;
+  return;
+  var three = 3;
+}''');
     resolve(source);
     assertErrors(source, [HintCode.DEAD_CODE]);
     verify([source]);
   }
 
   void test_deprecatedAnnotationUse_assignment() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  @deprecated",
-        "  A operator+(A a) { return a; }",
-        "}",
-        "f(A a) {",
-        "  A b;",
-        "  a += b;",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  @deprecated
+  A operator+(A a) { return a; }
+}
+f(A a) {
+  A b;
+  a += b;
+}''');
     resolve(source);
     assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
     verify([source]);
   }
 
   void test_deprecatedAnnotationUse_deprecated() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  @deprecated",
-        "  m() {}",
-        "  n() {m();}",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  @deprecated
+  m() {}
+  n() {m();}
+}''');
     resolve(source);
     assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
     verify([source]);
   }
 
   void test_deprecatedAnnotationUse_Deprecated() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  @Deprecated('0.9')",
-        "  m() {}",
-        "  n() {m();}",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  @Deprecated('0.9')
+  m() {}
+  n() {m();}
+}''');
     resolve(source);
     assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
     verify([source]);
@@ -2451,172 +2500,177 @@
 
   void test_deprecatedAnnotationUse_deprecatedMethodCalledOnUnionType() {
     enableUnionTypes(false);
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  @deprecated f() => 0;",
-        "}",
-        "class B extends A {}",
-        "main(A a, B b) {",
-        "  var x;",
-        "  if (0 < 1) {",
-        "    x = a;",
-        "  } else {",
-        "    x = b;",
-        "  }",
-        "  x.f(); // Here [x] has type [{A,B}] but we still want the deprecation warning.",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  @deprecated f() => 0;
+}
+class B extends A {}
+main(A a, B b) {
+  var x;
+  if (0 < 1) {
+    x = a;
+  } else {
+    x = b;
+  }
+  x.f(); // Here [x] has type [{A,B}] but we still want the deprecation warning.
+}''');
     resolve(source);
     assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
     verify([source]);
   }
 
   void test_deprecatedAnnotationUse_export() {
-    Source source = addSource(EngineTestCase.createSource(["export 'deprecated_library.dart';"]));
-    addNamedSource("/deprecated_library.dart", EngineTestCase.createSource([
-        "@deprecated",
-        "library deprecated_library;",
-        "class A {}"]));
+    Source source = addSource("export 'deprecated_library.dart';");
+    addNamedSource("/deprecated_library.dart", r'''
+@deprecated
+library deprecated_library;
+class A {}''');
     resolve(source);
     assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
     verify([source]);
   }
 
   void test_deprecatedAnnotationUse_getter() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  @deprecated",
-        "  get m => 1;",
-        "}",
-        "f(A a) {",
-        "  return a.m;",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  @deprecated
+  get m => 1;
+}
+f(A a) {
+  return a.m;
+}''');
     resolve(source);
     assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
     verify([source]);
   }
 
   void test_deprecatedAnnotationUse_import() {
-    Source source = addSource(EngineTestCase.createSource(["import 'deprecated_library.dart';", "f(A a) {}"]));
-    addNamedSource("/deprecated_library.dart", EngineTestCase.createSource([
-        "@deprecated",
-        "library deprecated_library;",
-        "class A {}"]));
+    Source source = addSource(r'''
+import 'deprecated_library.dart';
+f(A a) {}''');
+    addNamedSource("/deprecated_library.dart", r'''
+@deprecated
+library deprecated_library;
+class A {}''');
     resolve(source);
     assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
     verify([source]);
   }
 
   void test_deprecatedAnnotationUse_indexExpression() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  @deprecated",
-        "  operator[](int i) {}",
-        "}",
-        "f(A a) {",
-        "  return a[1];",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  @deprecated
+  operator[](int i) {}
+}
+f(A a) {
+  return a[1];
+}''');
     resolve(source);
     assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
     verify([source]);
   }
 
   void test_deprecatedAnnotationUse_instanceCreation() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  @deprecated",
-        "  A(int i) {}",
-        "}",
-        "f() {",
-        "  A a = new A(1);",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  @deprecated
+  A(int i) {}
+}
+f() {
+  A a = new A(1);
+}''');
     resolve(source);
     assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
     verify([source]);
   }
 
   void test_deprecatedAnnotationUse_instanceCreation_namedConstructor() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  @deprecated",
-        "  A.named(int i) {}",
-        "}",
-        "f() {",
-        "  A a = new A.named(1);",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  @deprecated
+  A.named(int i) {}
+}
+f() {
+  A a = new A.named(1);
+}''');
     resolve(source);
     assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
     verify([source]);
   }
 
   void test_deprecatedAnnotationUse_operator() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  @deprecated",
-        "  operator+(A a) {}",
-        "}",
-        "f(A a) {",
-        "  A b;",
-        "  return a + b;",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  @deprecated
+  operator+(A a) {}
+}
+f(A a) {
+  A b;
+  return a + b;
+}''');
     resolve(source);
     assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
     verify([source]);
   }
 
   void test_deprecatedAnnotationUse_setter() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  @deprecated",
-        "  set s(v) {}",
-        "}",
-        "f(A a) {",
-        "  return a.s = 1;",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  @deprecated
+  set s(v) {}
+}
+f(A a) {
+  return a.s = 1;
+}''');
     resolve(source);
     assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
     verify([source]);
   }
 
   void test_deprecatedAnnotationUse_superConstructor() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  @deprecated",
-        "  A() {}",
-        "}",
-        "class B extends A {",
-        "  B() : super() {}",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  @deprecated
+  A() {}
+}
+class B extends A {
+  B() : super() {}
+}''');
     resolve(source);
     assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
     verify([source]);
   }
 
   void test_deprecatedAnnotationUse_superConstructor_namedConstructor() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  @deprecated",
-        "  A.named() {}",
-        "}",
-        "class B extends A {",
-        "  B() : super.named() {}",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  @deprecated
+  A.named() {}
+}
+class B extends A {
+  B() : super.named() {}
+}''');
     resolve(source);
     assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
     verify([source]);
   }
 
   void test_divisionOptimization_double() {
-    Source source = addSource(EngineTestCase.createSource([
-        "f(double x, double y) {",
-        "  var v = (x / y).toInt();",
-        "}"]));
+    Source source = addSource(r'''
+f(double x, double y) {
+  var v = (x / y).toInt();
+}''');
     resolve(source);
     assertErrors(source, [HintCode.DIVISION_OPTIMIZATION]);
     verify([source]);
   }
 
   void test_divisionOptimization_int() {
-    Source source = addSource(EngineTestCase.createSource(["f(int x, int y) {", "  var v = (x / y).toInt();", "}"]));
+    Source source = addSource(r'''
+f(int x, int y) {
+  var v = (x / y).toInt();
+}''');
     resolve(source);
     assertErrors(source, [HintCode.DIVISION_OPTIMIZATION]);
     verify([source]);
@@ -2624,59 +2678,66 @@
 
   void test_divisionOptimization_propagatedType() {
     // Tests the propagated type information of the '/' method
-    Source source = addSource(EngineTestCase.createSource([
-        "f(x, y) {",
-        "  x = 1;",
-        "  y = 1;",
-        "  var v = (x / y).toInt();",
-        "}"]));
+    Source source = addSource(r'''
+f(x, y) {
+  x = 1;
+  y = 1;
+  var v = (x / y).toInt();
+}''');
     resolve(source);
     assertErrors(source, [HintCode.DIVISION_OPTIMIZATION]);
     verify([source]);
   }
 
   void test_divisionOptimization_wrappedBinaryExpression() {
-    Source source = addSource(EngineTestCase.createSource([
-        "f(int x, int y) {",
-        "  var v = (((x / y))).toInt();",
-        "}"]));
+    Source source = addSource(r'''
+f(int x, int y) {
+  var v = (((x / y))).toInt();
+}''');
     resolve(source);
     assertErrors(source, [HintCode.DIVISION_OPTIMIZATION]);
     verify([source]);
   }
 
   void test_duplicateImport() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library L;",
-        "import 'lib1.dart';",
-        "import 'lib1.dart';",
-        "A a;"]));
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
+    Source source = addSource(r'''
+library L;
+import 'lib1.dart';
+import 'lib1.dart';
+A a;''');
+    addNamedSource("/lib1.dart", r'''
+library lib1;
+class A {}''');
     resolve(source);
     assertErrors(source, [HintCode.DUPLICATE_IMPORT]);
     verify([source]);
   }
 
   void test_duplicateImport2() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library L;",
-        "import 'lib1.dart';",
-        "import 'lib1.dart';",
-        "import 'lib1.dart';",
-        "A a;"]));
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
+    Source source = addSource(r'''
+library L;
+import 'lib1.dart';
+import 'lib1.dart';
+import 'lib1.dart';
+A a;''');
+    addNamedSource("/lib1.dart", r'''
+library lib1;
+class A {}''');
     resolve(source);
     assertErrors(source, [HintCode.DUPLICATE_IMPORT, HintCode.DUPLICATE_IMPORT]);
     verify([source]);
   }
 
   void test_duplicateImport3() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library L;",
-        "import 'lib1.dart' as M show A hide B;",
-        "import 'lib1.dart' as M show A hide B;",
-        "M.A a;"]));
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}", "class B {}"]));
+    Source source = addSource(r'''
+library L;
+import 'lib1.dart' as M show A hide B;
+import 'lib1.dart' as M show A hide B;
+M.A a;''');
+    addNamedSource("/lib1.dart", r'''
+library lib1;
+class A {}
+class B {}''');
     resolve(source);
     assertErrors(source, [HintCode.DUPLICATE_IMPORT]);
     verify([source]);
@@ -2684,36 +2745,39 @@
 
   void test_importDeferredLibraryWithLoadFunction() {
     resolveWithAndWithoutExperimental(<String> [
-        EngineTestCase.createSource(["library lib1;", "loadLibrary() {}", "f() {}"]),
-        EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as lib1;",
-        "main() { lib1.f(); }"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [HintCode.IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION]);
+        r'''
+library lib1;
+loadLibrary() {}
+f() {}''',
+        r'''
+library root;
+import 'lib1.dart' deferred as lib1;
+main() { lib1.f(); }'''], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [HintCode.IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION]);
   }
 
   void test_invalidAssignment_instanceVariable() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  int x;",
-        "}",
-        "f(var y) {",
-        "  A a;",
-        "  if(y is String) {",
-        "    a.x = y;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  int x;
+}
+f(var y) {
+  A a;
+  if(y is String) {
+    a.x = y;
+  }
+}''');
     resolve(source);
     assertErrors(source, [HintCode.INVALID_ASSIGNMENT]);
     verify([source]);
   }
 
   void test_invalidAssignment_localVariable() {
-    Source source = addSource(EngineTestCase.createSource([
-        "f(var y) {",
-        "  if(y is String) {",
-        "    int x = y;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+f(var y) {
+  if(y is String) {
+    int x = y;
+  }
+}''');
     resolve(source);
     assertErrors(source, [HintCode.INVALID_ASSIGNMENT]);
     verify([source]);
@@ -2722,19 +2786,19 @@
   void test_invalidAssignment_message() {
     // The implementation of HintCode.INVALID_ASSIGNMENT assumes that
     // StaticTypeWarningCode.INVALID_ASSIGNMENT has the same message.
-    JUnitTestCase.assertEquals(HintCode.INVALID_ASSIGNMENT.message, StaticTypeWarningCode.INVALID_ASSIGNMENT.message);
+    expect(StaticTypeWarningCode.INVALID_ASSIGNMENT.message, HintCode.INVALID_ASSIGNMENT.message);
   }
 
   void test_invalidAssignment_staticVariable() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  static int x;",
-        "}",
-        "f(var y) {",
-        "  if(y is String) {",
-        "    A.x = y;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  static int x;
+}
+f(var y) {
+  if(y is String) {
+    A.x = y;
+  }
+}''');
     resolve(source);
     assertErrors(source, [HintCode.INVALID_ASSIGNMENT]);
     verify([source]);
@@ -2742,119 +2806,128 @@
 
   void test_invalidAssignment_variableDeclaration() {
     // 17971
-    Source source = addSource(EngineTestCase.createSource([
-        "class Point {",
-        "  final num x, y;",
-        "  Point(this.x, this.y);",
-        "  Point operator +(Point other) {",
-        "    return new Point(x+other.x, y+other.y);",
-        "  }",
-        "}",
-        "main() {",
-        "  var p1 = new Point(0, 0);",
-        "  var p2 = new Point(10, 10);",
-        "  int n = p1 + p2;",
-        "}"]));
+    Source source = addSource(r'''
+class Point {
+  final num x, y;
+  Point(this.x, this.y);
+  Point operator +(Point other) {
+    return new Point(x+other.x, y+other.y);
+  }
+}
+main() {
+  var p1 = new Point(0, 0);
+  var p2 = new Point(10, 10);
+  int n = p1 + p2;
+}''');
     resolve(source);
     assertErrors(source, [HintCode.INVALID_ASSIGNMENT]);
     verify([source]);
   }
 
   void test_isDouble() {
-    Source source = addSource(EngineTestCase.createSource(["var v = 1 is double;"]));
+    Source source = addSource("var v = 1 is double;");
     resolve(source);
     assertErrors(source, [HintCode.IS_DOUBLE]);
     verify([source]);
   }
 
   void test_isNotDouble() {
-    Source source = addSource(EngineTestCase.createSource(["var v = 1 is! double;"]));
+    Source source = addSource("var v = 1 is! double;");
     resolve(source);
     assertErrors(source, [HintCode.IS_NOT_DOUBLE]);
     verify([source]);
   }
 
   void test_missingReturn_function() {
-    Source source = addSource(EngineTestCase.createSource(["int f() {}"]));
+    Source source = addSource("int f() {}");
     resolve(source);
     assertErrors(source, [HintCode.MISSING_RETURN]);
     verify([source]);
   }
 
   void test_missingReturn_method() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  int m() {}", "}"]));
+    Source source = addSource(r'''
+class A {
+  int m() {}
+}''');
     resolve(source);
     assertErrors(source, [HintCode.MISSING_RETURN]);
     verify([source]);
   }
 
   void test_overrideOnNonOverridingGetter_invalid() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library dart.core;",
-        "const override = null;",
-        "class A {",
-        "}",
-        "class B extends A {",
-        "  @override",
-        "  int get m => 1;",
-        "}"]));
+    Source source = addSource(r'''
+library dart.core;
+const override = null;
+class A {
+}
+class B extends A {
+  @override
+  int get m => 1;
+}''');
     resolve(source);
     assertErrors(source, [HintCode.OVERRIDE_ON_NON_OVERRIDING_GETTER]);
     verify([source]);
   }
 
   void test_overrideOnNonOverridingMethod_invalid() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library dart.core;",
-        "const override = null;",
-        "class A {",
-        "}",
-        "class B extends A {",
-        "  @override",
-        "  int m() => 1;",
-        "}"]));
+    Source source = addSource(r'''
+library dart.core;
+const override = null;
+class A {
+}
+class B extends A {
+  @override
+  int m() => 1;
+}''');
     resolve(source);
     assertErrors(source, [HintCode.OVERRIDE_ON_NON_OVERRIDING_METHOD]);
     verify([source]);
   }
 
   void test_overrideOnNonOverridingSetter_invalid() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library dart.core;",
-        "const override = null;",
-        "class A {",
-        "}",
-        "class B extends A {",
-        "  @override",
-        "  set m(int x) {}",
-        "}"]));
+    Source source = addSource(r'''
+library dart.core;
+const override = null;
+class A {
+}
+class B extends A {
+  @override
+  set m(int x) {}
+}''');
     resolve(source);
     assertErrors(source, [HintCode.OVERRIDE_ON_NON_OVERRIDING_SETTER]);
     verify([source]);
   }
 
   void test_typeCheck_type_is_Null() {
-    Source source = addSource(EngineTestCase.createSource(["m(i) {", "  bool b = i is Null;", "}"]));
+    Source source = addSource(r'''
+m(i) {
+  bool b = i is Null;
+}''');
     resolve(source);
     assertErrors(source, [HintCode.TYPE_CHECK_IS_NULL]);
     verify([source]);
   }
 
   void test_typeCheck_type_not_Null() {
-    Source source = addSource(EngineTestCase.createSource(["m(i) {", "  bool b = i is! Null;", "}"]));
+    Source source = addSource(r'''
+m(i) {
+  bool b = i is! Null;
+}''');
     resolve(source);
     assertErrors(source, [HintCode.TYPE_CHECK_IS_NOT_NULL]);
     verify([source]);
   }
 
   void test_undefinedGetter() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "f(var a) {",
-        "  if(a is A) {",
-        "    return a.m;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A {}
+f(var a) {
+  if(a is A) {
+    return a.m;
+  }
+}''');
     resolve(source);
     assertErrors(source, [HintCode.UNDEFINED_GETTER]);
   }
@@ -2862,135 +2935,135 @@
   void test_undefinedGetter_message() {
     // The implementation of HintCode.UNDEFINED_SETTER assumes that UNDEFINED_SETTER in
     // StaticTypeWarningCode and StaticWarningCode are the same, this verifies that assumption.
-    JUnitTestCase.assertEquals(StaticTypeWarningCode.UNDEFINED_GETTER.message, StaticWarningCode.UNDEFINED_GETTER.message);
+    expect(StaticWarningCode.UNDEFINED_GETTER.message, StaticTypeWarningCode.UNDEFINED_GETTER.message);
   }
 
   void test_undefinedMethod() {
-    Source source = addSource(EngineTestCase.createSource([
-        "f() {",
-        "  var a = 'str';",
-        "  a.notAMethodOnString();",
-        "}"]));
+    Source source = addSource(r'''
+f() {
+  var a = 'str';
+  a.notAMethodOnString();
+}''');
     resolve(source);
     assertErrors(source, [HintCode.UNDEFINED_METHOD]);
   }
 
   void test_undefinedMethod_assignmentExpression() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B {",
-        "  f(var a, var a2) {",
-        "    a = new A();",
-        "    a2 = new A();",
-        "    a += a2;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A {}
+class B {
+  f(var a, var a2) {
+    a = new A();
+    a2 = new A();
+    a += a2;
+  }
+}''');
     resolve(source);
     assertErrors(source, [HintCode.UNDEFINED_METHOD]);
   }
 
   void test_undefinedMethod_unionType_noSuchMethod() {
     enableUnionTypes(false);
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  int m(int x) => 0;",
-        "}",
-        "class B {",
-        "  String m() => '0';",
-        "}",
-        "f(A a, B b) {",
-        "  var ab;",
-        "  if (0 < 1) {",
-        "    ab = a;",
-        "  } else {",
-        "    ab = b;",
-        "  }",
-        "  ab.n();",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  int m(int x) => 0;
+}
+class B {
+  String m() => '0';
+}
+f(A a, B b) {
+  var ab;
+  if (0 < 1) {
+    ab = a;
+  } else {
+    ab = b;
+  }
+  ab.n();
+}''');
     resolve(source);
     assertErrors(source, [HintCode.UNDEFINED_METHOD]);
   }
 
   void test_undefinedOperator_binaryExpression() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "f(var a) {",
-        "  if(a is A) {",
-        "    a + 1;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A {}
+f(var a) {
+  if(a is A) {
+    a + 1;
+  }
+}''');
     resolve(source);
     assertErrors(source, [HintCode.UNDEFINED_OPERATOR]);
   }
 
   void test_undefinedOperator_indexBoth() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "f(var a) {",
-        "  if(a is A) {",
-        "    a[0]++;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A {}
+f(var a) {
+  if(a is A) {
+    a[0]++;
+  }
+}''');
     resolve(source);
     assertErrors(source, [HintCode.UNDEFINED_OPERATOR]);
   }
 
   void test_undefinedOperator_indexGetter() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "f(var a) {",
-        "  if(a is A) {",
-        "    a[0];",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A {}
+f(var a) {
+  if(a is A) {
+    a[0];
+  }
+}''');
     resolve(source);
     assertErrors(source, [HintCode.UNDEFINED_OPERATOR]);
   }
 
   void test_undefinedOperator_indexSetter() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "f(var a) {",
-        "  if(a is A) {",
-        "    a[0] = 1;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A {}
+f(var a) {
+  if(a is A) {
+    a[0] = 1;
+  }
+}''');
     resolve(source);
     assertErrors(source, [HintCode.UNDEFINED_OPERATOR]);
   }
 
   void test_undefinedOperator_postfixExpression() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "f(var a) {",
-        "  if(a is A) {",
-        "    a++;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A {}
+f(var a) {
+  if(a is A) {
+    a++;
+  }
+}''');
     resolve(source);
     assertErrors(source, [HintCode.UNDEFINED_OPERATOR]);
   }
 
   void test_undefinedOperator_prefixExpression() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "f(var a) {",
-        "  if(a is A) {",
-        "    ++a;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A {}
+f(var a) {
+  if(a is A) {
+    ++a;
+  }
+}''');
     resolve(source);
     assertErrors(source, [HintCode.UNDEFINED_OPERATOR]);
   }
 
   void test_undefinedSetter() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "f(var a) {",
-        "  if(a is A) {",
-        "    a.m = 0;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A {}
+f(var a) {
+  if(a is A) {
+    a.m = 0;
+  }
+}''');
     resolve(source);
     assertErrors(source, [HintCode.UNDEFINED_SETTER]);
   }
@@ -2998,68 +3071,88 @@
   void test_undefinedSetter_message() {
     // The implementation of HintCode.UNDEFINED_SETTER assumes that UNDEFINED_SETTER in
     // StaticTypeWarningCode and StaticWarningCode are the same, this verifies that assumption.
-    JUnitTestCase.assertEquals(StaticTypeWarningCode.UNDEFINED_SETTER.message, StaticWarningCode.UNDEFINED_SETTER.message);
+    expect(StaticWarningCode.UNDEFINED_SETTER.message, StaticTypeWarningCode.UNDEFINED_SETTER.message);
   }
 
   void test_unnecessaryCast_type_supertype() {
-    Source source = addSource(EngineTestCase.createSource(["m(int i) {", "  var b = i as Object;", "}"]));
+    Source source = addSource(r'''
+m(int i) {
+  var b = i as Object;
+}''');
     resolve(source);
     assertErrors(source, [HintCode.UNNECESSARY_CAST]);
     verify([source]);
   }
 
   void test_unnecessaryCast_type_type() {
-    Source source = addSource(EngineTestCase.createSource(["m(num i) {", "  var b = i as num;", "}"]));
+    Source source = addSource(r'''
+m(num i) {
+  var b = i as num;
+}''');
     resolve(source);
     assertErrors(source, [HintCode.UNNECESSARY_CAST]);
     verify([source]);
   }
 
   void test_unnecessaryTypeCheck_null_is_Null() {
-    Source source = addSource(EngineTestCase.createSource(["bool b = null is Null;"]));
+    Source source = addSource("bool b = null is Null;");
     resolve(source);
     assertErrors(source, [HintCode.UNNECESSARY_TYPE_CHECK_TRUE]);
     verify([source]);
   }
 
   void test_unnecessaryTypeCheck_null_not_Null() {
-    Source source = addSource(EngineTestCase.createSource(["bool b = null is! Null;"]));
+    Source source = addSource("bool b = null is! Null;");
     resolve(source);
     assertErrors(source, [HintCode.UNNECESSARY_TYPE_CHECK_FALSE]);
     verify([source]);
   }
 
   void test_unnecessaryTypeCheck_type_is_dynamic() {
-    Source source = addSource(EngineTestCase.createSource(["m(i) {", "  bool b = i is dynamic;", "}"]));
+    Source source = addSource(r'''
+m(i) {
+  bool b = i is dynamic;
+}''');
     resolve(source);
     assertErrors(source, [HintCode.UNNECESSARY_TYPE_CHECK_TRUE]);
     verify([source]);
   }
 
   void test_unnecessaryTypeCheck_type_is_object() {
-    Source source = addSource(EngineTestCase.createSource(["m(i) {", "  bool b = i is Object;", "}"]));
+    Source source = addSource(r'''
+m(i) {
+  bool b = i is Object;
+}''');
     resolve(source);
     assertErrors(source, [HintCode.UNNECESSARY_TYPE_CHECK_TRUE]);
     verify([source]);
   }
 
   void test_unnecessaryTypeCheck_type_not_dynamic() {
-    Source source = addSource(EngineTestCase.createSource(["m(i) {", "  bool b = i is! dynamic;", "}"]));
+    Source source = addSource(r'''
+m(i) {
+  bool b = i is! dynamic;
+}''');
     resolve(source);
     assertErrors(source, [HintCode.UNNECESSARY_TYPE_CHECK_FALSE]);
     verify([source]);
   }
 
   void test_unnecessaryTypeCheck_type_not_object() {
-    Source source = addSource(EngineTestCase.createSource(["m(i) {", "  bool b = i is! Object;", "}"]));
+    Source source = addSource(r'''
+m(i) {
+  bool b = i is! Object;
+}''');
     resolve(source);
     assertErrors(source, [HintCode.UNNECESSARY_TYPE_CHECK_FALSE]);
     verify([source]);
   }
 
   void test_unusedImport() {
-    Source source = addSource(EngineTestCase.createSource(["library L;", "import 'lib1.dart';"]));
-    Source source2 = addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;"]));
+    Source source = addSource(r'''
+library L;
+import 'lib1.dart';''');
+    Source source2 = addNamedSource("/lib1.dart", "library lib1;");
     resolve(source);
     assertErrors(source, [HintCode.UNUSED_IMPORT]);
     assertNoErrors(source2);
@@ -3067,12 +3160,14 @@
   }
 
   void test_unusedImport_as() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library L;",
-        "import 'lib1.dart';",
-        "import 'lib1.dart' as one;",
-        "one.A a;"]));
-    Source source2 = addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
+    Source source = addSource(r'''
+library L;
+import 'lib1.dart';
+import 'lib1.dart' as one;
+one.A a;''');
+    Source source2 = addNamedSource("/lib1.dart", r'''
+library lib1;
+class A {}''');
     resolve(source);
     assertErrors(source, [HintCode.UNUSED_IMPORT]);
     assertNoErrors(source2);
@@ -3080,12 +3175,14 @@
   }
 
   void test_unusedImport_hide() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library L;",
-        "import 'lib1.dart';",
-        "import 'lib1.dart' hide A;",
-        "A a;"]));
-    Source source2 = addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
+    Source source = addSource(r'''
+library L;
+import 'lib1.dart';
+import 'lib1.dart' hide A;
+A a;''');
+    Source source2 = addNamedSource("/lib1.dart", r'''
+library lib1;
+class A {}''');
     resolve(source);
     assertErrors(source, [HintCode.UNUSED_IMPORT]);
     assertNoErrors(source2);
@@ -3093,12 +3190,15 @@
   }
 
   void test_unusedImport_show() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library L;",
-        "import 'lib1.dart' show A;",
-        "import 'lib1.dart' show B;",
-        "A a;"]));
-    Source source2 = addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}", "class B {}"]));
+    Source source = addSource(r'''
+library L;
+import 'lib1.dart' show A;
+import 'lib1.dart' show B;
+A a;''');
+    Source source2 = addNamedSource("/lib1.dart", r'''
+library lib1;
+class A {}
+class B {}''');
     resolve(source);
     assertErrors(source, [HintCode.UNUSED_IMPORT]);
     assertNoErrors(source2);
@@ -3106,80 +3206,80 @@
   }
 
   void test_useOfVoidResult_assignmentExpression_function() {
-    Source source = addSource(EngineTestCase.createSource([
-        "void f() {}",
-        "class A {",
-        "  n() {",
-        "    var a;",
-        "    a = f();",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+void f() {}
+class A {
+  n() {
+    var a;
+    a = f();
+  }
+}''');
     resolve(source);
     assertErrors(source, [HintCode.USE_OF_VOID_RESULT]);
     verify([source]);
   }
 
   void test_useOfVoidResult_assignmentExpression_method() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  void m() {}",
-        "  n() {",
-        "    var a;",
-        "    a = m();",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  void m() {}
+  n() {
+    var a;
+    a = m();
+  }
+}''');
     resolve(source);
     assertErrors(source, [HintCode.USE_OF_VOID_RESULT]);
     verify([source]);
   }
 
   void test_useOfVoidResult_inForLoop() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  void m() {}",
-        "  n() {",
-        "    for(var a = m();;) {}",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  void m() {}
+  n() {
+    for(var a = m();;) {}
+  }
+}''');
     resolve(source);
     assertErrors(source, [HintCode.USE_OF_VOID_RESULT]);
     verify([source]);
   }
 
   void test_useOfVoidResult_variableDeclaration_function() {
-    Source source = addSource(EngineTestCase.createSource([
-        "void f() {}",
-        "class A {",
-        "  n() {",
-        "    var a = f();",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+void f() {}
+class A {
+  n() {
+    var a = f();
+  }
+}''');
     resolve(source);
     assertErrors(source, [HintCode.USE_OF_VOID_RESULT]);
     verify([source]);
   }
 
   void test_useOfVoidResult_variableDeclaration_method() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  void m() {}",
-        "  n() {",
-        "    var a = m();",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  void m() {}
+  n() {
+    var a = m();
+  }
+}''');
     resolve(source);
     assertErrors(source, [HintCode.USE_OF_VOID_RESULT]);
     verify([source]);
   }
 
   void test_useOfVoidResult_variableDeclaration_method2() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  void m() {}",
-        "  n() {",
-        "    var a = m(), b = m();",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  void m() {}
+  n() {
+    var a = m(), b = m();
+  }
+}''');
     resolve(source);
     assertErrors(source, [HintCode.USE_OF_VOID_RESULT, HintCode.USE_OF_VOID_RESULT]);
     verify([source]);
@@ -3188,12 +3288,12 @@
 
 class IncrementalResolverTest extends ResolverTestCase {
   void test_resolve() {
-    MethodDeclaration method = _resolveMethod(EngineTestCase.createSource([
-        "class C {",
-        "  int m(int a) {",
-        "    return a + a;",
-        "  }",
-        "}"]));
+    MethodDeclaration method = _resolveMethod(r'''
+class C {
+  int m(int a) {
+    return a + a;
+  }
+}''');
     BlockFunctionBody body = method.body as BlockFunctionBody;
     ReturnStatement statement = body.block.statements[0] as ReturnStatement;
     BinaryExpression expression = statement.expression as BinaryExpression;
@@ -3201,8 +3301,8 @@
     Element leftElement = left.staticElement;
     SimpleIdentifier right = expression.rightOperand as SimpleIdentifier;
     Element rightElement = right.staticElement;
-    JUnitTestCase.assertNotNull(leftElement);
-    JUnitTestCase.assertSame(leftElement, rightElement);
+    expect(leftElement, isNotNull);
+    expect(rightElement, same(leftElement));
   }
 
   MethodDeclaration _resolveMethod(String content) {
@@ -3258,9 +3358,9 @@
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
     MemberMap mapB = _inheritanceManager.getMapOfMembersInheritedFromClasses(classB);
     MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromClasses(classA);
-    JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
-    JUnitTestCase.assertEquals(_numOfMembersInObject + 1, mapB.size);
-    JUnitTestCase.assertSame(getterG, mapB.get(getterName));
+    expect(mapA.size, _numOfMembersInObject);
+    expect(mapB.size, _numOfMembersInObject + 1);
+    expect(mapB.get(getterName), same(getterG));
     _assertNoErrors(classA);
     _assertNoErrors(classB);
   }
@@ -3276,9 +3376,9 @@
     classB.interfaces = <InterfaceType> [classA.type];
     MemberMap mapB = _inheritanceManager.getMapOfMembersInheritedFromClasses(classB);
     MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromClasses(classA);
-    JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
-    JUnitTestCase.assertEquals(_numOfMembersInObject, mapB.size);
-    JUnitTestCase.assertNull(mapB.get(getterName));
+    expect(mapA.size, _numOfMembersInObject);
+    expect(mapB.size, _numOfMembersInObject);
+    expect(mapB.get(getterName), isNull);
     _assertNoErrors(classA);
     _assertNoErrors(classB);
   }
@@ -3294,9 +3394,9 @@
     classB.mixins = <InterfaceType> [classA.type];
     MemberMap mapB = _inheritanceManager.getMapOfMembersInheritedFromClasses(classB);
     MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromClasses(classA);
-    JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
-    JUnitTestCase.assertEquals(_numOfMembersInObject + 1, mapB.size);
-    JUnitTestCase.assertSame(getterG, mapB.get(getterName));
+    expect(mapA.size, _numOfMembersInObject);
+    expect(mapB.size, _numOfMembersInObject + 1);
+    expect(mapB.get(getterName), same(getterG));
     _assertNoErrors(classA);
     _assertNoErrors(classB);
   }
@@ -3305,7 +3405,7 @@
     // class A {}
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromClasses(classA);
-    JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
+    expect(mapA.size, _numOfMembersInObject);
     _assertNoErrors(classA);
   }
 
@@ -3320,9 +3420,9 @@
     classB.supertype = classA.type;
     MemberMap mapB = _inheritanceManager.getMapOfMembersInheritedFromClasses(classB);
     MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromClasses(classA);
-    JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
-    JUnitTestCase.assertEquals(_numOfMembersInObject + 1, mapB.size);
-    JUnitTestCase.assertSame(methodM, mapB.get(methodName));
+    expect(mapA.size, _numOfMembersInObject);
+    expect(mapB.size, _numOfMembersInObject + 1);
+    expect(mapB.get(methodName), same(methodM));
     _assertNoErrors(classA);
     _assertNoErrors(classB);
   }
@@ -3338,9 +3438,9 @@
     classB.interfaces = <InterfaceType> [classA.type];
     MemberMap mapB = _inheritanceManager.getMapOfMembersInheritedFromClasses(classB);
     MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromClasses(classA);
-    JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
-    JUnitTestCase.assertEquals(_numOfMembersInObject, mapB.size);
-    JUnitTestCase.assertNull(mapB.get(methodName));
+    expect(mapA.size, _numOfMembersInObject);
+    expect(mapB.size, _numOfMembersInObject);
+    expect(mapB.get(methodName), isNull);
     _assertNoErrors(classA);
     _assertNoErrors(classB);
   }
@@ -3356,9 +3456,9 @@
     classB.mixins = <InterfaceType> [classA.type];
     MemberMap mapB = _inheritanceManager.getMapOfMembersInheritedFromClasses(classB);
     MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromClasses(classA);
-    JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
-    JUnitTestCase.assertEquals(_numOfMembersInObject + 1, mapB.size);
-    JUnitTestCase.assertSame(methodM, mapB.get(methodName));
+    expect(mapA.size, _numOfMembersInObject);
+    expect(mapB.size, _numOfMembersInObject + 1);
+    expect(mapB.get(methodName), same(methodM));
     _assertNoErrors(classA);
     _assertNoErrors(classB);
   }
@@ -3373,9 +3473,9 @@
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
     MemberMap mapB = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classB);
     MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
-    JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
-    JUnitTestCase.assertEquals(_numOfMembersInObject + 1, mapB.size);
-    JUnitTestCase.assertSame(getterG, mapB.get(getterName));
+    expect(mapA.size, _numOfMembersInObject);
+    expect(mapB.size, _numOfMembersInObject + 1);
+    expect(mapB.get(getterName), same(getterG));
     _assertNoErrors(classA);
     _assertNoErrors(classB);
   }
@@ -3391,9 +3491,9 @@
     classB.interfaces = <InterfaceType> [classA.type];
     MemberMap mapB = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classB);
     MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
-    JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
-    JUnitTestCase.assertEquals(_numOfMembersInObject + 1, mapB.size);
-    JUnitTestCase.assertSame(getterG, mapB.get(getterName));
+    expect(mapA.size, _numOfMembersInObject);
+    expect(mapB.size, _numOfMembersInObject + 1);
+    expect(mapB.get(getterName), same(getterG));
     _assertNoErrors(classA);
     _assertNoErrors(classB);
   }
@@ -3409,9 +3509,9 @@
     classB.mixins = <InterfaceType> [classA.type];
     MemberMap mapB = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classB);
     MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
-    JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
-    JUnitTestCase.assertEquals(_numOfMembersInObject + 1, mapB.size);
-    JUnitTestCase.assertSame(getterG, mapB.get(getterName));
+    expect(mapA.size, _numOfMembersInObject);
+    expect(mapB.size, _numOfMembersInObject + 1);
+    expect(mapB.get(getterName), same(getterG));
     _assertNoErrors(classA);
     _assertNoErrors(classB);
   }
@@ -3420,7 +3520,7 @@
     // class A {}
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
-    JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
+    expect(mapA.size, _numOfMembersInObject);
     _assertNoErrors(classA);
   }
 
@@ -3438,8 +3538,8 @@
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     classA.interfaces = <InterfaceType> [classI2.type, classI1.type];
     MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
-    JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
-    JUnitTestCase.assertNull(mapA.get(methodName));
+    expect(mapA.size, _numOfMembersInObject);
+    expect(mapA.get(methodName), isNull);
     _assertErrors(classA, [StaticWarningCode.INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD]);
   }
 
@@ -3457,8 +3557,8 @@
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     classA.interfaces = <InterfaceType> [classI1.type, classI2.type];
     MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
-    JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
-    JUnitTestCase.assertNull(mapA.get(methodName));
+    expect(mapA.size, _numOfMembersInObject);
+    expect(mapA.get(methodName), isNull);
     _assertErrors(classA, [StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE]);
   }
 
@@ -3476,8 +3576,8 @@
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     classA.interfaces = <InterfaceType> [classI1.type, classI2.type];
     MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
-    JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
-    JUnitTestCase.assertNull(mapA.get(methodName));
+    expect(mapA.size, _numOfMembersInObject);
+    expect(mapA.get(methodName), isNull);
     _assertErrors(classA, [StaticWarningCode.INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD]);
   }
 
@@ -3512,8 +3612,8 @@
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     classA.interfaces = <InterfaceType> [classI1.type, classI2.type];
     MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
-    JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
-    JUnitTestCase.assertNull(mapA.get(methodName));
+    expect(mapA.size, _numOfMembersInObject);
+    expect(mapA.get(methodName), isNull);
     _assertErrors(classA, [StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE]);
   }
 
@@ -3531,8 +3631,8 @@
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     classA.interfaces = <InterfaceType> [classI2.type, classI1.type];
     MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
-    JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
-    JUnitTestCase.assertNull(mapA.get(methodName));
+    expect(mapA.size, _numOfMembersInObject);
+    expect(mapA.get(methodName), isNull);
     _assertErrors(classA, [StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE]);
   }
 
@@ -3546,9 +3646,9 @@
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
     MemberMap mapB = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classB);
     MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
-    JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
-    JUnitTestCase.assertEquals(_numOfMembersInObject + 1, mapB.size);
-    JUnitTestCase.assertSame(methodM, mapB.get(methodName));
+    expect(mapA.size, _numOfMembersInObject);
+    expect(mapB.size, _numOfMembersInObject + 1);
+    expect(mapB.get(methodName), same(methodM));
     _assertNoErrors(classA);
     _assertNoErrors(classB);
   }
@@ -3564,9 +3664,9 @@
     classB.interfaces = <InterfaceType> [classA.type];
     MemberMap mapB = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classB);
     MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
-    JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
-    JUnitTestCase.assertEquals(_numOfMembersInObject + 1, mapB.size);
-    JUnitTestCase.assertSame(methodM, mapB.get(methodName));
+    expect(mapA.size, _numOfMembersInObject);
+    expect(mapB.size, _numOfMembersInObject + 1);
+    expect(mapB.get(methodName), same(methodM));
     _assertNoErrors(classA);
     _assertNoErrors(classB);
   }
@@ -3582,9 +3682,9 @@
     classB.mixins = <InterfaceType> [classA.type];
     MemberMap mapB = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classB);
     MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
-    JUnitTestCase.assertEquals(_numOfMembersInObject, mapA.size);
-    JUnitTestCase.assertEquals(_numOfMembersInObject + 1, mapB.size);
-    JUnitTestCase.assertSame(methodM, mapB.get(methodName));
+    expect(mapA.size, _numOfMembersInObject);
+    expect(mapB.size, _numOfMembersInObject + 1);
+    expect(mapB.get(methodName), same(methodM));
     _assertNoErrors(classA);
     _assertNoErrors(classB);
   }
@@ -3604,9 +3704,9 @@
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     classA.interfaces = <InterfaceType> [classI1.type, classI2.type];
     MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
-    JUnitTestCase.assertEquals(_numOfMembersInObject + 2, mapA.size);
-    JUnitTestCase.assertSame(methodM1, mapA.get(methodName1));
-    JUnitTestCase.assertSame(methodM2, mapA.get(methodName2));
+    expect(mapA.size, _numOfMembersInObject + 2);
+    expect(mapA.get(methodName1), same(methodM1));
+    expect(mapA.get(methodName2), same(methodM2));
     _assertNoErrors(classA);
   }
 
@@ -3624,9 +3724,9 @@
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     classA.interfaces = <InterfaceType> [classI1.type, classI2.type];
     MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
-    JUnitTestCase.assertEquals(_numOfMembersInObject + 1, mapA.size);
+    expect(mapA.size, _numOfMembersInObject + 1);
     PropertyAccessorElement syntheticAccessor = ElementFactory.getterElement(accessorName, false, _typeProvider.dynamicType);
-    JUnitTestCase.assertEquals(syntheticAccessor.type, mapA.get(accessorName).type);
+    expect(mapA.get(accessorName).type, syntheticAccessor.type);
     _assertNoErrors(classA);
   }
 
@@ -3652,9 +3752,9 @@
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     classA.interfaces = <InterfaceType> [classI1.type, classI2.type];
     MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
-    JUnitTestCase.assertEquals(_numOfMembersInObject + 1, mapA.size);
+    expect(mapA.size, _numOfMembersInObject + 1);
     MethodElement syntheticMethod = ElementFactory.methodElement(methodName, _typeProvider.dynamicType, [_typeProvider.dynamicType]);
-    JUnitTestCase.assertEquals(syntheticMethod.type, mapA.get(methodName).type);
+    expect(mapA.get(methodName).type, syntheticMethod.type);
     _assertNoErrors(classA);
   }
 
@@ -3672,10 +3772,10 @@
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     classA.interfaces = <InterfaceType> [classI1.type, classI2.type];
     MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
-    JUnitTestCase.assertEquals(_numOfMembersInObject + 1, mapA.size);
+    expect(mapA.size, _numOfMembersInObject + 1);
     PropertyAccessorElementImpl syntheticAccessor = ElementFactory.setterElement(accessorName, false, _typeProvider.dynamicType);
     syntheticAccessor.returnType = _typeProvider.dynamicType;
-    JUnitTestCase.assertEquals(syntheticAccessor.type, mapA.get("${accessorName}=").type);
+    expect(mapA.get("$accessorName=").type, syntheticAccessor.type);
     _assertNoErrors(classA);
   }
 
@@ -3703,9 +3803,9 @@
     ClassElementImpl classD = ElementFactory.classElement2("D", []);
     classD.interfaces = <InterfaceType> [classI1.type, classI2.type, classI3.type];
     MemberMap mapD = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classD);
-    JUnitTestCase.assertEquals(_numOfMembersInObject + 1, mapD.size);
+    expect(mapD.size, _numOfMembersInObject + 1);
     PropertyAccessorElement syntheticAccessor = ElementFactory.getterElement(accessorName, false, _typeProvider.dynamicType);
-    JUnitTestCase.assertEquals(syntheticAccessor.type, mapD.get(accessorName).type);
+    expect(mapD.get(accessorName).type, syntheticAccessor.type);
     _assertNoErrors(classD);
   }
 
@@ -3745,9 +3845,9 @@
     ClassElementImpl classD = ElementFactory.classElement2("D", []);
     classD.interfaces = <InterfaceType> [classI1.type, classI2.type, classI3.type];
     MemberMap mapD = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classD);
-    JUnitTestCase.assertEquals(_numOfMembersInObject + 1, mapD.size);
+    expect(mapD.size, _numOfMembersInObject + 1);
     MethodElement syntheticMethod = ElementFactory.methodElement(methodName, _typeProvider.dynamicType, [_typeProvider.dynamicType]);
-    JUnitTestCase.assertEquals(syntheticMethod.type, mapD.get(methodName).type);
+    expect(mapD.get(methodName).type, syntheticMethod.type);
     _assertNoErrors(classD);
   }
 
@@ -3775,10 +3875,10 @@
     ClassElementImpl classD = ElementFactory.classElement2("D", []);
     classD.interfaces = <InterfaceType> [classI1.type, classI2.type, classI3.type];
     MemberMap mapD = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classD);
-    JUnitTestCase.assertEquals(_numOfMembersInObject + 1, mapD.size);
+    expect(mapD.size, _numOfMembersInObject + 1);
     PropertyAccessorElementImpl syntheticAccessor = ElementFactory.setterElement(accessorName, false, _typeProvider.dynamicType);
     syntheticAccessor.returnType = _typeProvider.dynamicType;
-    JUnitTestCase.assertEquals(syntheticAccessor.type, mapD.get("${accessorName}=").type);
+    expect(mapD.get("$accessorName=").type, syntheticAccessor.type);
     _assertNoErrors(classD);
   }
 
@@ -3800,8 +3900,8 @@
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     classA.interfaces = <InterfaceType> [classI1.type, classI2.type];
     MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
-    JUnitTestCase.assertEquals(_numOfMembersInObject + 1, mapA.size);
-    JUnitTestCase.assertSame(methodM2, mapA.get(methodName));
+    expect(mapA.size, _numOfMembersInObject + 1);
+    expect(mapA.get(methodName), same(methodM2));
     _assertNoErrors(classA);
   }
 
@@ -3834,8 +3934,8 @@
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     classA.interfaces = <InterfaceType> [classI1.type, classI2.type, classI3.type];
     MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
-    JUnitTestCase.assertEquals(_numOfMembersInObject + 1, mapA.size);
-    JUnitTestCase.assertSame(methodM3, mapA.get(methodName));
+    expect(mapA.size, _numOfMembersInObject + 1);
+    expect(mapA.get(methodName), same(methodM3));
     _assertNoErrors(classA);
   }
 
@@ -3872,8 +3972,8 @@
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     classA.interfaces = <InterfaceType> [classI1.type, classI2.type, classI3.type, classI4.type];
     MemberMap mapA = _inheritanceManager.getMapOfMembersInheritedFromInterfaces(classA);
-    JUnitTestCase.assertEquals(_numOfMembersInObject + 1, mapA.size);
-    JUnitTestCase.assertSame(methodM4, mapA.get(methodName));
+    expect(mapA.size, _numOfMembersInObject + 1);
+    expect(mapA.get(methodName), same(methodM4));
     _assertNoErrors(classA);
   }
 
@@ -3884,7 +3984,7 @@
     classA.accessors = <PropertyAccessorElement> [getterG];
     ClassElementImpl classB = ElementFactory.classElement2("B", []);
     classB.interfaces = <InterfaceType> [classA.type];
-    JUnitTestCase.assertSame(getterG, _inheritanceManager.lookupInheritance(classB, getterName));
+    expect(_inheritanceManager.lookupInheritance(classB, getterName), same(getterG));
     _assertNoErrors(classA);
     _assertNoErrors(classB);
   }
@@ -3896,7 +3996,7 @@
     classA.methods = <MethodElement> [methodM];
     ClassElementImpl classB = ElementFactory.classElement2("B", []);
     classB.interfaces = <InterfaceType> [classA.type];
-    JUnitTestCase.assertSame(methodM, _inheritanceManager.lookupInheritance(classB, methodName));
+    expect(_inheritanceManager.lookupInheritance(classB, methodName), same(methodM));
     _assertNoErrors(classA);
     _assertNoErrors(classB);
   }
@@ -3908,7 +4008,7 @@
     classA.accessors = <PropertyAccessorElement> [setterS];
     ClassElementImpl classB = ElementFactory.classElement2("B", []);
     classB.interfaces = <InterfaceType> [classA.type];
-    JUnitTestCase.assertSame(setterS, _inheritanceManager.lookupInheritance(classB, "${setterName}="));
+    expect(_inheritanceManager.lookupInheritance(classB, "$setterName="), same(setterS));
     _assertNoErrors(classA);
     _assertNoErrors(classB);
   }
@@ -3921,7 +4021,7 @@
     classA.methods = <MethodElement> [methodM];
     ClassElementImpl classB = ElementFactory.classElement2("B", []);
     classB.interfaces = <InterfaceType> [classA.type];
-    JUnitTestCase.assertNull(_inheritanceManager.lookupInheritance(classB, methodName));
+    expect(_inheritanceManager.lookupInheritance(classB, methodName), isNull);
     _assertNoErrors(classA);
     _assertNoErrors(classB);
   }
@@ -3929,7 +4029,7 @@
   void test_lookupInheritance_interfaces_infiniteLoop() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     classA.interfaces = <InterfaceType> [classA.type];
-    JUnitTestCase.assertNull(_inheritanceManager.lookupInheritance(classA, "name"));
+    expect(_inheritanceManager.lookupInheritance(classA, "name"), isNull);
     _assertNoErrors(classA);
   }
 
@@ -3938,7 +4038,7 @@
     ClassElementImpl classB = ElementFactory.classElement2("B", []);
     classA.interfaces = <InterfaceType> [classB.type];
     classB.interfaces = <InterfaceType> [classA.type];
-    JUnitTestCase.assertNull(_inheritanceManager.lookupInheritance(classA, "name"));
+    expect(_inheritanceManager.lookupInheritance(classA, "name"), isNull);
     _assertNoErrors(classA);
     _assertNoErrors(classB);
   }
@@ -3955,8 +4055,8 @@
     classI2.interfaces = <InterfaceType> [classI1.type];
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     classA.interfaces = <InterfaceType> [classI2.type];
-    JUnitTestCase.assertSame(methodM1, _inheritanceManager.lookupInheritance(classA, methodName1));
-    JUnitTestCase.assertSame(methodM2, _inheritanceManager.lookupInheritance(classA, methodName2));
+    expect(_inheritanceManager.lookupInheritance(classA, methodName1), same(methodM1));
+    expect(_inheritanceManager.lookupInheritance(classA, methodName2), same(methodM2));
     _assertNoErrors(classI1);
     _assertNoErrors(classI2);
     _assertNoErrors(classA);
@@ -3969,7 +4069,7 @@
     classA.accessors = <PropertyAccessorElement> [getterG];
     ClassElementImpl classB = ElementFactory.classElement2("B", []);
     classB.mixins = <InterfaceType> [classA.type];
-    JUnitTestCase.assertSame(getterG, _inheritanceManager.lookupInheritance(classB, getterName));
+    expect(_inheritanceManager.lookupInheritance(classB, getterName), same(getterG));
     _assertNoErrors(classA);
     _assertNoErrors(classB);
   }
@@ -3981,7 +4081,7 @@
     classA.methods = <MethodElement> [methodM];
     ClassElementImpl classB = ElementFactory.classElement2("B", []);
     classB.mixins = <InterfaceType> [classA.type];
-    JUnitTestCase.assertSame(methodM, _inheritanceManager.lookupInheritance(classB, methodName));
+    expect(_inheritanceManager.lookupInheritance(classB, methodName), same(methodM));
     _assertNoErrors(classA);
     _assertNoErrors(classB);
   }
@@ -3993,7 +4093,7 @@
     classA.accessors = <PropertyAccessorElement> [setterS];
     ClassElementImpl classB = ElementFactory.classElement2("B", []);
     classB.mixins = <InterfaceType> [classA.type];
-    JUnitTestCase.assertSame(setterS, _inheritanceManager.lookupInheritance(classB, "${setterName}="));
+    expect(_inheritanceManager.lookupInheritance(classB, "$setterName="), same(setterS));
     _assertNoErrors(classA);
     _assertNoErrors(classB);
   }
@@ -4006,14 +4106,14 @@
     classA.methods = <MethodElement> [methodM];
     ClassElementImpl classB = ElementFactory.classElement2("B", []);
     classB.mixins = <InterfaceType> [classA.type];
-    JUnitTestCase.assertNull(_inheritanceManager.lookupInheritance(classB, methodName));
+    expect(_inheritanceManager.lookupInheritance(classB, methodName), isNull);
     _assertNoErrors(classA);
     _assertNoErrors(classB);
   }
 
   void test_lookupInheritance_noMember() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    JUnitTestCase.assertNull(_inheritanceManager.lookupInheritance(classA, "a"));
+    expect(_inheritanceManager.lookupInheritance(classA, "a"), isNull);
     _assertNoErrors(classA);
   }
 
@@ -4023,7 +4123,7 @@
     PropertyAccessorElement getterG = ElementFactory.getterElement(getterName, false, _typeProvider.intType);
     classA.accessors = <PropertyAccessorElement> [getterG];
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
-    JUnitTestCase.assertSame(getterG, _inheritanceManager.lookupInheritance(classB, getterName));
+    expect(_inheritanceManager.lookupInheritance(classB, getterName), same(getterG));
     _assertNoErrors(classA);
     _assertNoErrors(classB);
   }
@@ -4031,7 +4131,7 @@
   void test_lookupInheritance_superclass_infiniteLoop() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     classA.supertype = classA.type;
-    JUnitTestCase.assertNull(_inheritanceManager.lookupInheritance(classA, "name"));
+    expect(_inheritanceManager.lookupInheritance(classA, "name"), isNull);
     _assertNoErrors(classA);
   }
 
@@ -4040,7 +4140,7 @@
     ClassElementImpl classB = ElementFactory.classElement2("B", []);
     classA.supertype = classB.type;
     classB.supertype = classA.type;
-    JUnitTestCase.assertNull(_inheritanceManager.lookupInheritance(classA, "name"));
+    expect(_inheritanceManager.lookupInheritance(classA, "name"), isNull);
     _assertNoErrors(classA);
     _assertNoErrors(classB);
   }
@@ -4051,7 +4151,7 @@
     MethodElement methodM = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
     classA.methods = <MethodElement> [methodM];
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
-    JUnitTestCase.assertSame(methodM, _inheritanceManager.lookupInheritance(classB, methodName));
+    expect(_inheritanceManager.lookupInheritance(classB, methodName), same(methodM));
     _assertNoErrors(classA);
     _assertNoErrors(classB);
   }
@@ -4062,7 +4162,7 @@
     PropertyAccessorElement setterS = ElementFactory.setterElement(setterName, false, _typeProvider.intType);
     classA.accessors = <PropertyAccessorElement> [setterS];
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
-    JUnitTestCase.assertSame(setterS, _inheritanceManager.lookupInheritance(classB, "${setterName}="));
+    expect(_inheritanceManager.lookupInheritance(classB, "$setterName="), same(setterS));
     _assertNoErrors(classA);
     _assertNoErrors(classB);
   }
@@ -4074,7 +4174,7 @@
     (methodM as MethodElementImpl).static = true;
     classA.methods = <MethodElement> [methodM];
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
-    JUnitTestCase.assertNull(_inheritanceManager.lookupInheritance(classB, methodName));
+    expect(_inheritanceManager.lookupInheritance(classB, methodName), isNull);
     _assertNoErrors(classA);
     _assertNoErrors(classB);
   }
@@ -4084,7 +4184,7 @@
     String getterName = "g";
     PropertyAccessorElement getterG = ElementFactory.getterElement(getterName, false, _typeProvider.intType);
     classA.accessors = <PropertyAccessorElement> [getterG];
-    JUnitTestCase.assertSame(getterG, _inheritanceManager.lookupMember(classA, getterName));
+    expect(_inheritanceManager.lookupMember(classA, getterName), same(getterG));
     _assertNoErrors(classA);
   }
 
@@ -4093,7 +4193,7 @@
     String getterName = "g";
     PropertyAccessorElement getterG = ElementFactory.getterElement(getterName, true, _typeProvider.intType);
     classA.accessors = <PropertyAccessorElement> [getterG];
-    JUnitTestCase.assertNull(_inheritanceManager.lookupMember(classA, getterName));
+    expect(_inheritanceManager.lookupMember(classA, getterName), isNull);
     _assertNoErrors(classA);
   }
 
@@ -4102,7 +4202,7 @@
     String methodName = "m";
     MethodElement methodM = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
     classA.methods = <MethodElement> [methodM];
-    JUnitTestCase.assertSame(methodM, _inheritanceManager.lookupMember(classA, methodName));
+    expect(_inheritanceManager.lookupMember(classA, methodName), same(methodM));
     _assertNoErrors(classA);
   }
 
@@ -4112,13 +4212,13 @@
     MethodElement methodM = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
     (methodM as MethodElementImpl).static = true;
     classA.methods = <MethodElement> [methodM];
-    JUnitTestCase.assertNull(_inheritanceManager.lookupMember(classA, methodName));
+    expect(_inheritanceManager.lookupMember(classA, methodName), isNull);
     _assertNoErrors(classA);
   }
 
   void test_lookupMember_noMember() {
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
-    JUnitTestCase.assertNull(_inheritanceManager.lookupMember(classA, "a"));
+    expect(_inheritanceManager.lookupMember(classA, "a"), isNull);
     _assertNoErrors(classA);
   }
 
@@ -4127,7 +4227,7 @@
     String setterName = "s";
     PropertyAccessorElement setterS = ElementFactory.setterElement(setterName, false, _typeProvider.intType);
     classA.accessors = <PropertyAccessorElement> [setterS];
-    JUnitTestCase.assertSame(setterS, _inheritanceManager.lookupMember(classA, "${setterName}="));
+    expect(_inheritanceManager.lookupMember(classA, "$setterName="), same(setterS));
     _assertNoErrors(classA);
   }
 
@@ -4136,7 +4236,7 @@
     String setterName = "s";
     PropertyAccessorElement setterS = ElementFactory.setterElement(setterName, true, _typeProvider.intType);
     classA.accessors = <PropertyAccessorElement> [setterS];
-    JUnitTestCase.assertNull(_inheritanceManager.lookupMember(classA, setterName));
+    expect(_inheritanceManager.lookupMember(classA, setterName), isNull);
     _assertNoErrors(classA);
   }
 
@@ -4145,7 +4245,7 @@
     String methodName = "m";
     MethodElementImpl methodM = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
     classA.methods = <MethodElement> [methodM];
-    EngineTestCase.assertSizeOfList(0, _inheritanceManager.lookupOverrides(classA, methodName));
+    expect(_inheritanceManager.lookupOverrides(classA, methodName), hasLength(0));
     _assertNoErrors(classA);
   }
 
@@ -4158,7 +4258,7 @@
     MethodElementImpl methodMinB = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
     classB.methods = <MethodElement> [methodMinB];
     List<ExecutableElement> overrides = _inheritanceManager.lookupOverrides(classB, methodName);
-    EngineTestCase.assertEqualsIgnoreOrder(<Object> [methodMinA], new List.from(overrides));
+    expect(overrides, unorderedEquals([methodMinA]));
     _assertNoErrors(classA);
     _assertNoErrors(classB);
   }
@@ -4173,7 +4273,7 @@
     MethodElementImpl methodMinB = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
     classB.methods = <MethodElement> [methodMinB];
     List<ExecutableElement> overrides = _inheritanceManager.lookupOverrides(classB, methodName);
-    EngineTestCase.assertEqualsIgnoreOrder(<Object> [methodMinA], new List.from(overrides));
+    expect(overrides, unorderedEquals([methodMinA]));
     _assertNoErrors(classA);
     _assertNoErrors(classB);
   }
@@ -4191,7 +4291,7 @@
     MethodElementImpl methodMinC = ElementFactory.methodElement(methodName, _typeProvider.numType, []);
     classC.methods = <MethodElement> [methodMinC];
     List<ExecutableElement> overrides = _inheritanceManager.lookupOverrides(classC, methodName);
-    EngineTestCase.assertEqualsIgnoreOrder(<Object> [methodMinA, methodMinB], new List.from(overrides));
+    expect(overrides, unorderedEquals([methodMinA, methodMinB]));
     _assertNoErrors(classA);
     _assertNoErrors(classB);
     _assertNoErrors(classC);
@@ -4244,72 +4344,83 @@
   }
 
   void test_accessorsAcrossFiles() {
-    Source librarySource = addSource("/lib.dart", EngineTestCase.createSource([
-        "library lib;",
-        "part 'first.dart';",
-        "part 'second.dart';"]));
-    addSource("/first.dart", EngineTestCase.createSource(["part of lib;", "int get V => 0;"]));
-    addSource("/second.dart", EngineTestCase.createSource(["part of lib;", "void set V(int v) {}"]));
+    Source librarySource = addSource("/lib.dart", r'''
+library lib;
+part 'first.dart';
+part 'second.dart';''');
+    addSource("/first.dart", r'''
+part of lib;
+int get V => 0;''');
+    addSource("/second.dart", r'''
+part of lib;
+void set V(int v) {}''');
     LibraryElement element = _buildLibrary(librarySource, []);
-    JUnitTestCase.assertNotNull(element);
+    expect(element, isNotNull);
     List<CompilationUnitElement> sourcedUnits = element.parts;
-    EngineTestCase.assertLength(2, sourcedUnits);
+    expect(sourcedUnits, hasLength(2));
     List<PropertyAccessorElement> firstAccessors = sourcedUnits[0].accessors;
-    EngineTestCase.assertLength(1, firstAccessors);
+    expect(firstAccessors, hasLength(1));
     List<PropertyAccessorElement> secondAccessors = sourcedUnits[1].accessors;
-    EngineTestCase.assertLength(1, secondAccessors);
-    JUnitTestCase.assertSame(firstAccessors[0].variable, secondAccessors[0].variable);
+    expect(secondAccessors, hasLength(1));
+    expect(secondAccessors[0].variable, same(firstAccessors[0].variable));
   }
 
   void test_empty() {
     Source librarySource = addSource("/lib.dart", "library lib;");
     LibraryElement element = _buildLibrary(librarySource, []);
-    JUnitTestCase.assertNotNull(element);
-    JUnitTestCase.assertEquals("lib", element.name);
-    JUnitTestCase.assertNull(element.entryPoint);
-    EngineTestCase.assertLength(0, element.importedLibraries);
-    EngineTestCase.assertLength(0, element.imports);
-    JUnitTestCase.assertSame(element, element.library);
-    EngineTestCase.assertLength(0, element.prefixes);
-    EngineTestCase.assertLength(0, element.parts);
+    expect(element, isNotNull);
+    expect(element.name, "lib");
+    expect(element.entryPoint, isNull);
+    expect(element.importedLibraries, hasLength(0));
+    expect(element.imports, hasLength(0));
+    expect(element.library, same(element));
+    expect(element.prefixes, hasLength(0));
+    expect(element.parts, hasLength(0));
     CompilationUnitElement unit = element.definingCompilationUnit;
-    JUnitTestCase.assertNotNull(unit);
-    JUnitTestCase.assertEquals("lib.dart", unit.name);
-    JUnitTestCase.assertEquals(element, unit.library);
-    EngineTestCase.assertLength(0, unit.accessors);
-    EngineTestCase.assertLength(0, unit.functions);
-    EngineTestCase.assertLength(0, unit.functionTypeAliases);
-    EngineTestCase.assertLength(0, unit.types);
-    EngineTestCase.assertLength(0, unit.topLevelVariables);
+    expect(unit, isNotNull);
+    expect(unit.name, "lib.dart");
+    expect(unit.library, element);
+    expect(unit.accessors, hasLength(0));
+    expect(unit.functions, hasLength(0));
+    expect(unit.functionTypeAliases, hasLength(0));
+    expect(unit.types, hasLength(0));
+    expect(unit.topLevelVariables, hasLength(0));
   }
 
   void test_missingLibraryDirectiveWithPart() {
-    addSource("/a.dart", EngineTestCase.createSource(["part of lib;"]));
-    Source librarySource = addSource("/lib.dart", EngineTestCase.createSource(["part 'a.dart';"]));
+    addSource("/a.dart", "part of lib;");
+    Source librarySource = addSource("/lib.dart", "part 'a.dart';");
     LibraryElement element = _buildLibrary(librarySource, [ResolverErrorCode.MISSING_LIBRARY_DIRECTIVE_WITH_PART]);
-    JUnitTestCase.assertNotNull(element);
+    expect(element, isNotNull);
   }
 
   void test_missingPartOfDirective() {
     addSource("/a.dart", "class A {}");
-    Source librarySource = addSource("/lib.dart", EngineTestCase.createSource(["library lib;", "", "part 'a.dart';"]));
+    Source librarySource = addSource("/lib.dart", r'''
+library lib;
+
+part 'a.dart';''');
     LibraryElement element = _buildLibrary(librarySource, [CompileTimeErrorCode.PART_OF_NON_PART]);
-    JUnitTestCase.assertNotNull(element);
+    expect(element, isNotNull);
   }
 
   void test_multipleFiles() {
-    Source librarySource = addSource("/lib.dart", EngineTestCase.createSource([
-        "library lib;",
-        "part 'first.dart';",
-        "part 'second.dart';",
-        "",
-        "class A {}"]));
-    addSource("/first.dart", EngineTestCase.createSource(["part of lib;", "class B {}"]));
-    addSource("/second.dart", EngineTestCase.createSource(["part of lib;", "class C {}"]));
+    Source librarySource = addSource("/lib.dart", r'''
+library lib;
+part 'first.dart';
+part 'second.dart';
+
+class A {}''');
+    addSource("/first.dart", r'''
+part of lib;
+class B {}''');
+    addSource("/second.dart", r'''
+part of lib;
+class C {}''');
     LibraryElement element = _buildLibrary(librarySource, []);
-    JUnitTestCase.assertNotNull(element);
+    expect(element, isNotNull);
     List<CompilationUnitElement> sourcedUnits = element.parts;
-    EngineTestCase.assertLength(2, sourcedUnits);
+    expect(sourcedUnits, hasLength(2));
     _assertTypes(element.definingCompilationUnit, ["A"]);
     if (sourcedUnits[0].name == "first.dart") {
       _assertTypes(sourcedUnits[0], ["B"]);
@@ -4321,9 +4432,12 @@
   }
 
   void test_singleFile() {
-    Source librarySource = addSource("/lib.dart", EngineTestCase.createSource(["library lib;", "", "class A {}"]));
+    Source librarySource = addSource("/lib.dart", r'''
+library lib;
+
+class A {}''');
     LibraryElement element = _buildLibrary(librarySource, []);
-    JUnitTestCase.assertNotNull(element);
+    expect(element, isNotNull);
     _assertTypes(element.definingCompilationUnit, ["A"]);
   }
 
@@ -4353,11 +4467,11 @@
    * @param typeNames the names of the types that should be found
    */
   void _assertTypes(CompilationUnitElement unit, List<String> typeNames) {
-    JUnitTestCase.assertNotNull(unit);
+    expect(unit, isNotNull);
     List<ClassElement> types = unit.types;
-    EngineTestCase.assertLength(typeNames.length, types);
+    expect(types, hasLength(typeNames.length));
     for (ClassElement type in types) {
-      JUnitTestCase.assertNotNull(type);
+      expect(type, isNotNull);
       String actualTypeName = type.displayName;
       bool wasExpected = false;
       for (String expectedTypeName in typeNames) {
@@ -4366,7 +4480,7 @@
         }
       }
       if (!wasExpected) {
-        JUnitTestCase.fail("Found unexpected type ${actualTypeName}");
+        fail("Found unexpected type $actualTypeName");
       }
     }
   }
@@ -4414,21 +4528,21 @@
     {
       GatheringErrorListener errorListener = new GatheringErrorListener();
       Scope scope = new LibraryImportScope(importingLibrary, errorListener);
-      JUnitTestCase.assertEquals(typeA, scope.lookup(AstFactory.identifier3(typeNameA), importingLibrary));
+      expect(scope.lookup(AstFactory.identifier3(typeNameA), importingLibrary), typeA);
       errorListener.assertNoErrors();
-      JUnitTestCase.assertEquals(typeC, scope.lookup(AstFactory.identifier3(typeNameC), importingLibrary));
+      expect(scope.lookup(AstFactory.identifier3(typeNameC), importingLibrary), typeC);
       errorListener.assertNoErrors();
       Element element = scope.lookup(AstFactory.identifier3(typeNameB), importingLibrary);
       errorListener.assertErrorsWithCodes([StaticWarningCode.AMBIGUOUS_IMPORT]);
       EngineTestCase.assertInstanceOf((obj) => obj is MultiplyDefinedElement, MultiplyDefinedElement, element);
       List<Element> conflictingElements = (element as MultiplyDefinedElement).conflictingElements;
-      EngineTestCase.assertLength(2, conflictingElements);
+      expect(conflictingElements, hasLength(2));
       if (identical(conflictingElements[0], typeB1)) {
-        JUnitTestCase.assertSame(typeB2, conflictingElements[1]);
+        expect(conflictingElements[1], same(typeB2));
       } else if (identical(conflictingElements[0], typeB2)) {
-        JUnitTestCase.assertSame(typeB1, conflictingElements[1]);
+        expect(conflictingElements[1], same(typeB1));
       } else {
-        JUnitTestCase.assertSame(typeB1, conflictingElements[0]);
+        expect(conflictingElements[0], same(typeB1));
       }
     }
     {
@@ -4461,14 +4575,14 @@
     definingLibrary.imports = <ImportElement> [importElement];
     GatheringErrorListener errorListener = new GatheringErrorListener();
     Scope scope = new LibraryImportScope(definingLibrary, errorListener);
-    JUnitTestCase.assertEquals(importedType, scope.lookup(AstFactory.identifier3(importedTypeName), definingLibrary));
+    expect(scope.lookup(AstFactory.identifier3(importedTypeName), definingLibrary), importedType);
   }
 
   void test_getErrorListener() {
     LibraryElement definingLibrary = createDefaultTestLibrary();
     GatheringErrorListener errorListener = new GatheringErrorListener();
     LibraryImportScope scope = new LibraryImportScope(definingLibrary, errorListener);
-    JUnitTestCase.assertEquals(errorListener, scope.errorListener);
+    expect(scope.errorListener, errorListener);
   }
 
   void test_nonConflictingImports_fromSdk() {
@@ -4483,7 +4597,7 @@
     importingLibrary.imports = <ImportElement> [importCore, importLib];
     GatheringErrorListener errorListener = new GatheringErrorListener();
     Scope scope = new LibraryImportScope(importingLibrary, errorListener);
-    JUnitTestCase.assertEquals(type, scope.lookup(AstFactory.identifier3(typeName), importingLibrary));
+    expect(scope.lookup(AstFactory.identifier3(typeName), importingLibrary), type);
     errorListener.assertErrorsWithCodes([StaticWarningCode.CONFLICTING_DART_IMPORT]);
   }
 
@@ -4502,9 +4616,9 @@
     importingLibrary.imports = <ImportElement> [import1, import2];
     GatheringErrorListener errorListener = new GatheringErrorListener();
     Scope scope = new LibraryImportScope(importingLibrary, errorListener);
-    JUnitTestCase.assertEquals(typeA, scope.lookup(AstFactory.identifier3(typeNameA), importingLibrary));
+    expect(scope.lookup(AstFactory.identifier3(typeNameA), importingLibrary), typeA);
     errorListener.assertNoErrors();
-    JUnitTestCase.assertEquals(typeB, scope.lookup(AstFactory.identifier3(typeNameB), importingLibrary));
+    expect(scope.lookup(AstFactory.identifier3(typeNameB), importingLibrary), typeB);
     errorListener.assertNoErrors();
   }
 
@@ -4527,10 +4641,10 @@
     Scope scope = new LibraryImportScope(importingLibrary, errorListener);
     Element prefixedElement = scope.lookup(AstFactory.identifier5(prefixName, typeName), importingLibrary);
     errorListener.assertNoErrors();
-    JUnitTestCase.assertSame(prefixedType, prefixedElement);
+    expect(prefixedElement, same(prefixedType));
     Element nonPrefixedElement = scope.lookup(AstFactory.identifier3(typeName), importingLibrary);
     errorListener.assertNoErrors();
-    JUnitTestCase.assertSame(nonPrefixedType, nonPrefixedElement);
+    expect(nonPrefixedElement, same(nonPrefixedType));
   }
 }
 
@@ -4547,8 +4661,14 @@
   }
 
   void test_imports_relative() {
-    Source sourceA = addSource(EngineTestCase.createSource(["library libA;", "import 'libB.dart';", "class A {}"]));
-    Source sourceB = addNamedSource("/libB.dart", EngineTestCase.createSource(["library libB;", "import 'test.dart", "class B {}"]));
+    Source sourceA = addSource(r'''
+library libA;
+import 'libB.dart';
+class A {}''');
+    Source sourceB = addNamedSource("/libB.dart", r'''
+library libB;
+import 'test.dart
+class B {}''');
     List<ResolvableLibrary> cycle = new List<ResolvableLibrary>();
     ResolvableLibrary coreLib = _createResolvableLibrary(_coreLibrarySource);
     coreLib.libraryElement = analysisContext2.computeLibraryElement(_coreLibrarySource) as LibraryElementImpl;
@@ -4583,14 +4703,19 @@
   }
 
   void test_imports_dart_html() {
-    Source source = addSource(EngineTestCase.createSource(["library libA;", "import 'dart:html';", "class A {}"]));
+    Source source = addSource(r'''
+library libA;
+import 'dart:html';
+class A {}''');
     LibraryElement library = _resolver.resolveLibrary(source, true);
     List<LibraryElement> importedLibraries = library.importedLibraries;
     assertNamedElements(importedLibraries, ["dart.core", "dart.dom.html"]);
   }
 
   void test_imports_none() {
-    Source source = addSource(EngineTestCase.createSource(["library libA;", "class A {}"]));
+    Source source = addSource(r'''
+library libA;
+class A {}''');
     LibraryElement library = _resolver.resolveLibrary(source, true);
     List<LibraryElement> importedLibraries = library.importedLibraries;
     assertNamedElements(importedLibraries, ["dart.core"]);
@@ -4598,7 +4723,10 @@
 
   void test_imports_relative() {
     addNamedSource("/libB.dart", "library libB;");
-    Source source = addSource(EngineTestCase.createSource(["library libA;", "import 'libB.dart';", "class A {}"]));
+    Source source = addSource(r'''
+library libA;
+import 'libB.dart';
+class A {}''');
     LibraryElement library = _resolver.resolveLibrary(source, true);
     List<LibraryElement> importedLibraries = library.importedLibraries;
     assertNamedElements(importedLibraries, ["dart.core", "libB"]);
@@ -4625,14 +4753,14 @@
     definingLibrary.imports = <ImportElement> [importElement];
     GatheringErrorListener errorListener = new GatheringErrorListener();
     Scope scope = new LibraryScope(definingLibrary, errorListener);
-    JUnitTestCase.assertEquals(importedType, scope.lookup(AstFactory.identifier3(importedTypeName), definingLibrary));
+    expect(scope.lookup(AstFactory.identifier3(importedTypeName), definingLibrary), importedType);
   }
 
   void test_getErrorListener() {
     LibraryElement definingLibrary = createDefaultTestLibrary();
     GatheringErrorListener errorListener = new GatheringErrorListener();
     LibraryScope scope = new LibraryScope(definingLibrary, errorListener);
-    JUnitTestCase.assertEquals(errorListener, scope.errorListener);
+    expect(scope.errorListener, errorListener);
   }
 }
 
@@ -4667,24 +4795,24 @@
   }
 
   void test_getExplicitlyImportsCore() {
-    JUnitTestCase.assertFalse(_library.explicitlyImportsCore);
+    expect(_library.explicitlyImportsCore, isFalse);
     _errorListener.assertNoErrors();
   }
 
   void test_getExports() {
-    EngineTestCase.assertLength(0, _library.exports);
+    expect(_library.exports, hasLength(0));
     _errorListener.assertNoErrors();
   }
 
   void test_getImports() {
-    EngineTestCase.assertLength(0, _library.imports);
+    expect(_library.imports, hasLength(0));
     _errorListener.assertNoErrors();
   }
 
   void test_getImportsAndExports() {
     _library.importedLibraries = <Library> [_createLibrary("/imported.dart")];
     _library.exportedLibraries = <Library> [_createLibrary("/exported.dart")];
-    EngineTestCase.assertLength(2, _library.importsAndExports);
+    expect(_library.importsAndExports, hasLength(2));
     _errorListener.assertNoErrors();
   }
 
@@ -4692,17 +4820,17 @@
     LibraryElementImpl element = new LibraryElementImpl.forNode(_analysisContext, AstFactory.libraryIdentifier2(["lib"]));
     element.definingCompilationUnit = new CompilationUnitElementImpl("lib.dart");
     _library.libraryElement = element;
-    JUnitTestCase.assertNotNull(_library.libraryScope);
+    expect(_library.libraryScope, isNotNull);
     _errorListener.assertNoErrors();
   }
 
   void test_getLibrarySource() {
-    JUnitTestCase.assertNotNull(_library.librarySource);
+    expect(_library.librarySource, isNotNull);
   }
 
   void test_setExplicitlyImportsCore() {
     _library.explicitlyImportsCore = true;
-    JUnitTestCase.assertTrue(_library.explicitlyImportsCore);
+    expect(_library.explicitlyImportsCore, isTrue);
     _errorListener.assertNoErrors();
   }
 
@@ -4710,8 +4838,8 @@
     Library exportLibrary = _createLibrary("/exported.dart");
     _library.exportedLibraries = <Library> [exportLibrary];
     List<Library> exports = _library.exports;
-    EngineTestCase.assertLength(1, exports);
-    JUnitTestCase.assertSame(exportLibrary, exports[0]);
+    expect(exports, hasLength(1));
+    expect(exports[0], same(exportLibrary));
     _errorListener.assertNoErrors();
   }
 
@@ -4719,15 +4847,15 @@
     Library importLibrary = _createLibrary("/imported.dart");
     _library.importedLibraries = <Library> [importLibrary];
     List<Library> imports = _library.imports;
-    EngineTestCase.assertLength(1, imports);
-    JUnitTestCase.assertSame(importLibrary, imports[0]);
+    expect(imports, hasLength(1));
+    expect(imports[0], same(importLibrary));
     _errorListener.assertNoErrors();
   }
 
   void test_setLibraryElement() {
     LibraryElementImpl element = new LibraryElementImpl.forNode(_analysisContext, AstFactory.libraryIdentifier2(["lib"]));
     _library.libraryElement = element;
-    JUnitTestCase.assertSame(element, _library.libraryElement);
+    expect(_library.libraryElement, same(element));
   }
 
   @override
@@ -4742,13 +4870,12 @@
   Library _createLibrary(String definingCompilationUnitPath) => new Library(_analysisContext, _errorListener, new FileBasedSource.con1(FileUtilities2.createFile(definingCompilationUnitPath)));
 }
 
-class MemberMapTest extends JUnitTestCase {
+class MemberMapTest {
   /**
    * The null type.
    */
   InterfaceType _nullType;
 
-  @override
   void setUp() {
     _nullType = new TestTypeProvider().nullType;
   }
@@ -4762,10 +4889,10 @@
     map.put(m2.name, m2);
     map.put(m3.name, m3);
     MemberMap copy = new MemberMap.con2(map);
-    JUnitTestCase.assertEquals(map.size, copy.size);
-    JUnitTestCase.assertEquals(m1, copy.get(m1.name));
-    JUnitTestCase.assertEquals(m2, copy.get(m2.name));
-    JUnitTestCase.assertEquals(m3, copy.get(m3.name));
+    expect(copy.size, map.size);
+    expect(copy.get(m1.name), m1);
+    expect(copy.get(m2.name), m2);
+    expect(copy.get(m3.name), m3);
   }
 
   void test_MemberMap_override() {
@@ -4774,218 +4901,232 @@
     MemberMap map = new MemberMap();
     map.put(m1.name, m1);
     map.put(m2.name, m2);
-    JUnitTestCase.assertEquals(1, map.size);
-    JUnitTestCase.assertEquals(m2, map.get("m"));
+    expect(map.size, 1);
+    expect(map.get("m"), m2);
   }
 
   void test_MemberMap_put() {
     MethodElement m1 = ElementFactory.methodElement("m1", _nullType, []);
     MemberMap map = new MemberMap();
-    JUnitTestCase.assertEquals(0, map.size);
+    expect(map.size, 0);
     map.put(m1.name, m1);
-    JUnitTestCase.assertEquals(1, map.size);
-    JUnitTestCase.assertEquals(m1, map.get("m1"));
+    expect(map.size, 1);
+    expect(map.get("m1"), m1);
   }
 }
 
 class NonHintCodeTest extends ResolverTestCase {
   void test_deadCode_deadBlock_conditionalElse_debugConst() {
-    Source source = addSource(EngineTestCase.createSource([
-        "const bool DEBUG = true;",
-        "f() {",
-        "  DEBUG ? 1 : 2;",
-        "}"]));
+    Source source = addSource(r'''
+const bool DEBUG = true;
+f() {
+  DEBUG ? 1 : 2;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_deadCode_deadBlock_conditionalIf_debugConst() {
-    Source source = addSource(EngineTestCase.createSource([
-        "const bool DEBUG = false;",
-        "f() {",
-        "  DEBUG ? 1 : 2;",
-        "}"]));
+    Source source = addSource(r'''
+const bool DEBUG = false;
+f() {
+  DEBUG ? 1 : 2;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_deadCode_deadBlock_else() {
-    Source source = addSource(EngineTestCase.createSource([
-        "const bool DEBUG = true;",
-        "f() {",
-        "  if(DEBUG) {} else {}",
-        "}"]));
+    Source source = addSource(r'''
+const bool DEBUG = true;
+f() {
+  if(DEBUG) {} else {}
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_deadCode_deadBlock_if_debugConst_prefixedIdentifier() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  static const bool DEBUG = false;",
-        "}",
-        "f() {",
-        "  if(A.DEBUG) {}",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  static const bool DEBUG = false;
+}
+f() {
+  if(A.DEBUG) {}
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_deadCode_deadBlock_if_debugConst_prefixedIdentifier2() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library L;",
-        "import 'lib2.dart';",
-        "f() {",
-        "  if(A.DEBUG) {}",
-        "}"]));
-    addNamedSource("/lib2.dart", EngineTestCase.createSource([
-        "library lib2;",
-        "class A {",
-        "  static const bool DEBUG = false;",
-        "}"]));
+    Source source = addSource(r'''
+library L;
+import 'lib2.dart';
+f() {
+  if(A.DEBUG) {}
+}''');
+    addNamedSource("/lib2.dart", r'''
+library lib2;
+class A {
+  static const bool DEBUG = false;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_deadCode_deadBlock_if_debugConst_propertyAccessor() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library L;",
-        "import 'lib2.dart' as LIB;",
-        "f() {",
-        "  if(LIB.A.DEBUG) {}",
-        "}"]));
-    addNamedSource("/lib2.dart", EngineTestCase.createSource([
-        "library lib2;",
-        "class A {",
-        "  static const bool DEBUG = false;",
-        "}"]));
+    Source source = addSource(r'''
+library L;
+import 'lib2.dart' as LIB;
+f() {
+  if(LIB.A.DEBUG) {}
+}''');
+    addNamedSource("/lib2.dart", r'''
+library lib2;
+class A {
+  static const bool DEBUG = false;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_deadCode_deadBlock_if_debugConst_simpleIdentifier() {
-    Source source = addSource(EngineTestCase.createSource([
-        "const bool DEBUG = false;",
-        "f() {",
-        "  if(DEBUG) {}",
-        "}"]));
+    Source source = addSource(r'''
+const bool DEBUG = false;
+f() {
+  if(DEBUG) {}
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_deadCode_deadBlock_while_debugConst() {
-    Source source = addSource(EngineTestCase.createSource([
-        "const bool DEBUG = false;",
-        "f() {",
-        "  while(DEBUG) {}",
-        "}"]));
+    Source source = addSource(r'''
+const bool DEBUG = false;
+f() {
+  while(DEBUG) {}
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_deadCode_deadCatch_onCatchSubtype() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B extends A {}",
-        "f() {",
-        "  try {} on B catch (e) {} on A catch (e) {} catch (e) {}",
-        "}"]));
+    Source source = addSource(r'''
+class A {}
+class B extends A {}
+f() {
+  try {} on B catch (e) {} on A catch (e) {} catch (e) {}
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_deadCode_deadOperandLHS_and_debugConst() {
-    Source source = addSource(EngineTestCase.createSource([
-        "const bool DEBUG = false;",
-        "f() {",
-        "  bool b = DEBUG && false;",
-        "}"]));
+    Source source = addSource(r'''
+const bool DEBUG = false;
+f() {
+  bool b = DEBUG && false;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_deadCode_deadOperandLHS_or_debugConst() {
-    Source source = addSource(EngineTestCase.createSource([
-        "const bool DEBUG = true;",
-        "f() {",
-        "  bool b = DEBUG || true;",
-        "}"]));
+    Source source = addSource(r'''
+const bool DEBUG = true;
+f() {
+  bool b = DEBUG || true;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_divisionOptimization() {
-    Source source = addSource(EngineTestCase.createSource(["f(int x, int y) {", "  var v = x / y.toInt();", "}"]));
+    Source source = addSource(r'''
+f(int x, int y) {
+  var v = x / y.toInt();
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_divisionOptimization_supressIfDivisionNotDefinedInCore() {
-    Source source = addSource(EngineTestCase.createSource(["f(x, y) {", "  var v = (x / y).toInt();", "}"]));
+    Source source = addSource(r'''
+f(x, y) {
+  var v = (x / y).toInt();
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_divisionOptimization_supressIfDivisionOverridden() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  num operator /(x) { return x; }",
-        "}",
-        "f(A x, A y) {",
-        "  var v = (x / y).toInt();",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  num operator /(x) { return x; }
+}
+f(A x, A y) {
+  var v = (x / y).toInt();
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_duplicateImport_as() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library L;",
-        "import 'lib1.dart';",
-        "import 'lib1.dart' as one;",
-        "A a;",
-        "one.A a2;"]));
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
+    Source source = addSource(r'''
+library L;
+import 'lib1.dart';
+import 'lib1.dart' as one;
+A a;
+one.A a2;''');
+    addNamedSource("/lib1.dart", r'''
+library lib1;
+class A {}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_duplicateImport_hide() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library L;",
-        "import 'lib1.dart';",
-        "import 'lib1.dart' hide A;",
-        "A a;",
-        "B b;"]));
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}", "class B {}"]));
+    Source source = addSource(r'''
+library L;
+import 'lib1.dart';
+import 'lib1.dart' hide A;
+A a;
+B b;''');
+    addNamedSource("/lib1.dart", r'''
+library lib1;
+class A {}
+class B {}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_duplicateImport_show() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library L;",
-        "import 'lib1.dart';",
-        "import 'lib1.dart' show A;",
-        "A a;",
-        "B b;"]));
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}", "class B {}"]));
+    Source source = addSource(r'''
+library L;
+import 'lib1.dart';
+import 'lib1.dart' show A;
+A a;
+B b;''');
+    addNamedSource("/lib1.dart", r'''
+library lib1;
+class A {}
+class B {}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -4993,22 +5134,24 @@
 
   void test_importDeferredLibraryWithLoadFunction() {
     resolveWithAndWithoutExperimental(<String> [
-        EngineTestCase.createSource(["library lib1;", "f() {}"]),
-        EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as lib1;",
-        "main() { lib1.f(); }"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> []);
+        r'''
+library lib1;
+f() {}''',
+        r'''
+library root;
+import 'lib1.dart' deferred as lib1;
+main() { lib1.f(); }'''], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> []);
   }
 
   void test_issue20904BuggyTypePromotionAtIfJoin_1() {
     // https://code.google.com/p/dart/issues/detail?id=20904
-    Source source = addSource(EngineTestCase.createSource([
-        "f(var message, var dynamic_) {",
-        "  if (message is Function) {",
-        "    message = dynamic_;",
-        "  }",
-        "  int s = message;",
-        "}"]));
+    Source source = addSource(r'''
+f(var message, var dynamic_) {
+  if (message is Function) {
+    message = dynamic_;
+  }
+  int s = message;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -5017,13 +5160,13 @@
   void test_issue20904BuggyTypePromotionAtIfJoin_2() {
     // https://code.google.com/p/dart/issues/detail?id=20904
     enableUnionTypes(false);
-    Source source = addSource(EngineTestCase.createSource([
-        "f(var message) {",
-        "  if (message is Function) {",
-        "    message = '';",
-        "  }",
-        "  int s = message;",
-        "}"]));
+    Source source = addSource(r'''
+f(var message) {
+  if (message is Function) {
+    message = '';
+  }
+  int s = message;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -5031,16 +5174,16 @@
 
   void test_issue20904BuggyTypePromotionAtIfJoin_3() {
     // https://code.google.com/p/dart/issues/detail?id=20904
-    Source source = addSource(EngineTestCase.createSource([
-        "f(var message) {",
-        "  var dynamic_;",
-        "  if (message is Function) {",
-        "    message = dynamic_;",
-        "  } else {",
-        "    return;",
-        "  }",
-        "  int s = message;",
-        "}"]));
+    Source source = addSource(r'''
+f(var message) {
+  var dynamic_;
+  if (message is Function) {
+    message = dynamic_;
+  } else {
+    return;
+  }
+  int s = message;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -5048,150 +5191,153 @@
 
   void test_issue20904BuggyTypePromotionAtIfJoin_4() {
     // https://code.google.com/p/dart/issues/detail?id=20904
-    Source source = addSource(EngineTestCase.createSource([
-        "f(var message) {",
-        "  if (message is Function) {",
-        "    message = '';",
-        "  } else {",
-        "    return;",
-        "  }",
-        "  String s = message;",
-        "}"]));
+    Source source = addSource(r'''
+f(var message) {
+  if (message is Function) {
+    message = '';
+  } else {
+    return;
+  }
+  String s = message;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_missingReturn_emptyFunctionBody() {
-    Source source = addSource(EngineTestCase.createSource(["abstract class A {", "  int m();", "}"]));
+    Source source = addSource(r'''
+abstract class A {
+  int m();
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_missingReturn_expressionFunctionBody() {
-    Source source = addSource(EngineTestCase.createSource(["int f() => 0;"]));
+    Source source = addSource("int f() => 0;");
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_missingReturn_noReturnType() {
-    Source source = addSource(EngineTestCase.createSource(["f() {}"]));
+    Source source = addSource("f() {}");
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_missingReturn_voidReturnType() {
-    Source source = addSource(EngineTestCase.createSource(["void f() {}"]));
+    Source source = addSource("void f() {}");
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_overrideEqualsButNotHashCode() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  bool operator ==(x) { return x; }",
-        "  get hashCode => 0;",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  bool operator ==(x) { return x; }
+  get hashCode => 0;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_overrideOnNonOverridingGetter_inInterface() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library dart.core;",
-        "const override = null;",
-        "class A {",
-        "  int get m => 0;",
-        "}",
-        "class B implements A {",
-        "  @override",
-        "  int get m => 1;",
-        "}"]));
+    Source source = addSource(r'''
+library dart.core;
+const override = null;
+class A {
+  int get m => 0;
+}
+class B implements A {
+  @override
+  int get m => 1;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_overrideOnNonOverridingGetter_inSuperclass() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library dart.core;",
-        "const override = null;",
-        "class A {",
-        "  int get m => 0;",
-        "}",
-        "class B extends A {",
-        "  @override",
-        "  int get m => 1;",
-        "}"]));
+    Source source = addSource(r'''
+library dart.core;
+const override = null;
+class A {
+  int get m => 0;
+}
+class B extends A {
+  @override
+  int get m => 1;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_overrideOnNonOverridingMethod_inInterface() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library dart.core;",
-        "const override = null;",
-        "class A {",
-        "  int m() => 0;",
-        "}",
-        "class B implements A {",
-        "  @override",
-        "  int m() => 1;",
-        "}"]));
+    Source source = addSource(r'''
+library dart.core;
+const override = null;
+class A {
+  int m() => 0;
+}
+class B implements A {
+  @override
+  int m() => 1;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_overrideOnNonOverridingMethod_inSuperclass() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library dart.core;",
-        "const override = null;",
-        "class A {",
-        "  int m() => 0;",
-        "}",
-        "class B extends A {",
-        "  @override",
-        "  int m() => 1;",
-        "}"]));
+    Source source = addSource(r'''
+library dart.core;
+const override = null;
+class A {
+  int m() => 0;
+}
+class B extends A {
+  @override
+  int m() => 1;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_overrideOnNonOverridingSetter_inInterface() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library dart.core;",
-        "const override = null;",
-        "class A {",
-        "  set m(int x) {}",
-        "}",
-        "class B implements A {",
-        "  @override",
-        "  set m(int x) {}",
-        "}"]));
+    Source source = addSource(r'''
+library dart.core;
+const override = null;
+class A {
+  set m(int x) {}
+}
+class B implements A {
+  @override
+  set m(int x) {}
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_overrideOnNonOverridingSetter_inSuperclass() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library dart.core;",
-        "const override = null;",
-        "class A {",
-        "  set m(int x) {}",
-        "}",
-        "class B extends A {",
-        "  @override",
-        "  set m(int x) {}",
-        "}"]));
+    Source source = addSource(r'''
+library dart.core;
+const override = null;
+class A {
+  set m(int x) {}
+}
+class B extends A {
+  @override
+  set m(int x) {}
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -5199,288 +5345,291 @@
 
   void test_propagatedFieldType() {
     // From dartbug.com/20019
-    Source source = addSource(EngineTestCase.createSource([
-        "class A { }",
-        "class X<T> {",
-        "  final x = new List<T>();",
-        "}",
-        "class Z {",
-        "  final X<A> y = new X<A>();",
-        "  foo() {",
-        "    y.x.add(new A());",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A { }
+class X<T> {
+  final x = new List<T>();
+}
+class Z {
+  final X<A> y = new X<A>();
+  foo() {
+    y.x.add(new A());
+  }
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_proxy_annotation_prefixed() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library L;",
-        "@proxy",
-        "class A {}",
-        "f(var a) {",
-        "  a = new A();",
-        "  a.m();",
-        "  var x = a.g;",
-        "  a.s = 1;",
-        "  var y = a + a;",
-        "  a++;",
-        "  ++a;",
-        "}"]));
+    Source source = addSource(r'''
+library L;
+@proxy
+class A {}
+f(var a) {
+  a = new A();
+  a.m();
+  var x = a.g;
+  a.s = 1;
+  var y = a + a;
+  a++;
+  ++a;
+}''');
     resolve(source);
     assertNoErrors(source);
   }
 
   void test_proxy_annotation_prefixed2() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library L;",
-        "@proxy",
-        "class A {}",
-        "class B {",
-        "  f(var a) {",
-        "    a = new A();",
-        "    a.m();",
-        "    var x = a.g;",
-        "    a.s = 1;",
-        "    var y = a + a;",
-        "    a++;",
-        "    ++a;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+library L;
+@proxy
+class A {}
+class B {
+  f(var a) {
+    a = new A();
+    a.m();
+    var x = a.g;
+    a.s = 1;
+    var y = a + a;
+    a++;
+    ++a;
+  }
+}''');
     resolve(source);
     assertNoErrors(source);
   }
 
   void test_proxy_annotation_prefixed3() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library L;",
-        "class B {",
-        "  f(var a) {",
-        "    a = new A();",
-        "    a.m();",
-        "    var x = a.g;",
-        "    a.s = 1;",
-        "    var y = a + a;",
-        "    a++;",
-        "    ++a;",
-        "  }",
-        "}",
-        "@proxy",
-        "class A {}"]));
+    Source source = addSource(r'''
+library L;
+class B {
+  f(var a) {
+    a = new A();
+    a.m();
+    var x = a.g;
+    a.s = 1;
+    var y = a + a;
+    a++;
+    ++a;
+  }
+}
+@proxy
+class A {}''');
     resolve(source);
     assertNoErrors(source);
   }
 
   void test_undefinedGetter_inSubtype() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B extends A {",
-        "  get b => 0;",
-        "}",
-        "f(var a) {",
-        "  if(a is A) {",
-        "    return a.b;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A {}
+class B extends A {
+  get b => 0;
+}
+f(var a) {
+  if(a is A) {
+    return a.b;
+  }
+}''');
     resolve(source);
     assertNoErrors(source);
   }
 
   void test_undefinedMethod_assignmentExpression_inSubtype() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B extends A {",
-        "  operator +(B b) {return new B();}",
-        "}",
-        "f(var a, var a2) {",
-        "  a = new A();",
-        "  a2 = new A();",
-        "  a += a2;",
-        "}"]));
+    Source source = addSource(r'''
+class A {}
+class B extends A {
+  operator +(B b) {return new B();}
+}
+f(var a, var a2) {
+  a = new A();
+  a2 = new A();
+  a += a2;
+}''');
     resolve(source);
     assertNoErrors(source);
   }
 
   void test_undefinedMethod_inSubtype() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B extends A {",
-        "  b() {}",
-        "}",
-        "f() {",
-        "  var a = new A();",
-        "  a.b();",
-        "}"]));
+    Source source = addSource(r'''
+class A {}
+class B extends A {
+  b() {}
+}
+f() {
+  var a = new A();
+  a.b();
+}''');
     resolve(source);
     assertNoErrors(source);
   }
 
   void test_undefinedMethod_unionType_all() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  int m(int x) => 0;",
-        "}",
-        "class B {",
-        "  String m() => '0';",
-        "}",
-        "f(A a, B b) {",
-        "  var ab;",
-        "  if (0 < 1) {",
-        "    ab = a;",
-        "  } else {",
-        "    ab = b;",
-        "  }",
-        "  ab.m();",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  int m(int x) => 0;
+}
+class B {
+  String m() => '0';
+}
+f(A a, B b) {
+  var ab;
+  if (0 < 1) {
+    ab = a;
+  } else {
+    ab = b;
+  }
+  ab.m();
+}''');
     resolve(source);
     assertNoErrors(source);
   }
 
   void test_undefinedMethod_unionType_some() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  int m(int x) => 0;",
-        "}",
-        "class B {}",
-        "f(A a, B b) {",
-        "  var ab;",
-        "  if (0 < 1) {",
-        "    ab = a;",
-        "  } else {",
-        "    ab = b;",
-        "  }",
-        "  ab.m(0);",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  int m(int x) => 0;
+}
+class B {}
+f(A a, B b) {
+  var ab;
+  if (0 < 1) {
+    ab = a;
+  } else {
+    ab = b;
+  }
+  ab.m(0);
+}''');
     resolve(source);
     assertNoErrors(source);
   }
 
   void test_undefinedOperator_binaryExpression_inSubtype() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B extends A {",
-        "  operator +(B b) {}",
-        "}",
-        "f(var a) {",
-        "  if(a is A) {",
-        "    a + 1;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A {}
+class B extends A {
+  operator +(B b) {}
+}
+f(var a) {
+  if(a is A) {
+    a + 1;
+  }
+}''');
     resolve(source);
     assertNoErrors(source);
   }
 
   void test_undefinedOperator_indexBoth_inSubtype() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B extends A {",
-        "  operator [](int index) {}",
-        "}",
-        "f(var a) {",
-        "  if(a is A) {",
-        "    a[0]++;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A {}
+class B extends A {
+  operator [](int index) {}
+}
+f(var a) {
+  if(a is A) {
+    a[0]++;
+  }
+}''');
     resolve(source);
     assertNoErrors(source);
   }
 
   void test_undefinedOperator_indexGetter_inSubtype() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B extends A {",
-        "  operator [](int index) {}",
-        "}",
-        "f(var a) {",
-        "  if(a is A) {",
-        "    a[0];",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A {}
+class B extends A {
+  operator [](int index) {}
+}
+f(var a) {
+  if(a is A) {
+    a[0];
+  }
+}''');
     resolve(source);
     assertNoErrors(source);
   }
 
   void test_undefinedOperator_indexSetter_inSubtype() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B extends A {",
-        "  operator []=(i, v) {}",
-        "}",
-        "f(var a) {",
-        "  if(a is A) {",
-        "    a[0] = 1;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A {}
+class B extends A {
+  operator []=(i, v) {}
+}
+f(var a) {
+  if(a is A) {
+    a[0] = 1;
+  }
+}''');
     resolve(source);
     assertNoErrors(source);
   }
 
   void test_undefinedOperator_postfixExpression() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B extends A {",
-        "  operator +(B b) {return new B();}",
-        "}",
-        "f(var a) {",
-        "  if(a is A) {",
-        "    a++;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A {}
+class B extends A {
+  operator +(B b) {return new B();}
+}
+f(var a) {
+  if(a is A) {
+    a++;
+  }
+}''');
     resolve(source);
     assertNoErrors(source);
   }
 
   void test_undefinedOperator_prefixExpression() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B extends A {",
-        "  operator +(B b) {return new B();}",
-        "}",
-        "f(var a) {",
-        "  if(a is A) {",
-        "    ++a;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A {}
+class B extends A {
+  operator +(B b) {return new B();}
+}
+f(var a) {
+  if(a is A) {
+    ++a;
+  }
+}''');
     resolve(source);
     assertNoErrors(source);
   }
 
   void test_undefinedSetter_inSubtype() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B extends A {",
-        "  set b(x) {}",
-        "}",
-        "f(var a) {",
-        "  if(a is A) {",
-        "    a.b = 0;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A {}
+class B extends A {
+  set b(x) {}
+}
+f(var a) {
+  if(a is A) {
+    a.b = 0;
+  }
+}''');
     resolve(source);
     assertNoErrors(source);
   }
 
   void test_unnecessaryCast_13855_parameter_A() {
     // dartbug.com/13855, dartbug.com/13732
-    Source source = addSource(EngineTestCase.createSource([
-        "class A{",
-        "  a() {}",
-        "}",
-        "class B<E> {",
-        "  E e;",
-        "  m() {",
-        "    (e as A).a();",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A{
+  a() {}
+}
+class B<E> {
+  E e;
+  m() {
+    (e as A).a();
+  }
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_unnecessaryCast_dynamic_type() {
-    Source source = addSource(EngineTestCase.createSource(["m(v) {", "  var b = v as Object;", "}"]));
+    Source source = addSource(r'''
+m(v) {
+  var b = v as Object;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -5488,27 +5637,37 @@
 
   void test_unnecessaryCast_generics() {
     // dartbug.com/18953
-    Source source = addSource(EngineTestCase.createSource([
-        "import 'dart:async';",
-        "Future<int> f() => new Future.value(0);",
-        "void g(bool c) {",
-        "  (c ? f(): new Future.value(0) as Future<int>).then((int value) {});",
-        "}"]));
+    Source source = addSource(r'''
+import 'dart:async';
+Future<int> f() => new Future.value(0);
+void g(bool c) {
+  (c ? f(): new Future.value(0) as Future<int>).then((int value) {});
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_unnecessaryCast_type_dynamic() {
-    Source source = addSource(EngineTestCase.createSource(["m(v) {", "  var b = Object as dynamic;", "}"]));
+    Source source = addSource(r'''
+m(v) {
+  var b = Object as dynamic;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_unusedImport_annotationOnDirective() {
-    Source source = addSource(EngineTestCase.createSource(["library L;", "@A()", "import 'lib1.dart';"]));
-    Source source2 = addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {", "  const A() {}", "}"]));
+    Source source = addSource(r'''
+library L;
+@A()
+import 'lib1.dart';''');
+    Source source2 = addNamedSource("/lib1.dart", r'''
+library lib1;
+class A {
+  const A() {}
+}''');
     resolve(source);
     assertErrors(source, []);
     verify([source, source2]);
@@ -5516,14 +5675,18 @@
 
   void test_unusedImport_as_equalPrefixes() {
     // 18818
-    Source source = addSource(EngineTestCase.createSource([
-        "library L;",
-        "import 'lib1.dart' as one;",
-        "import 'lib2.dart' as one;",
-        "one.A a;",
-        "one.B b;"]));
-    Source source2 = addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
-    Source source3 = addNamedSource("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class B {}"]));
+    Source source = addSource(r'''
+library L;
+import 'lib1.dart' as one;
+import 'lib2.dart' as one;
+one.A a;
+one.B b;''');
+    Source source2 = addNamedSource("/lib1.dart", r'''
+library lib1;
+class A {}''');
+    Source source3 = addNamedSource("/lib2.dart", r'''
+library lib2;
+class B {}''');
     resolve(source);
     assertErrors(source, []);
     assertNoErrors(source2);
@@ -5532,88 +5695,130 @@
   }
 
   void test_unusedImport_core_library() {
-    Source source = addSource(EngineTestCase.createSource(["library L;", "import 'dart:core';"]));
+    Source source = addSource(r'''
+library L;
+import 'dart:core';''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_unusedImport_export() {
-    Source source = addSource(EngineTestCase.createSource(["library L;", "import 'lib1.dart';", "Two two;"]));
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "export 'lib2.dart';", "class One {}"]));
-    addNamedSource("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class Two {}"]));
+    Source source = addSource(r'''
+library L;
+import 'lib1.dart';
+Two two;''');
+    addNamedSource("/lib1.dart", r'''
+library lib1;
+export 'lib2.dart';
+class One {}''');
+    addNamedSource("/lib2.dart", r'''
+library lib2;
+class Two {}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_unusedImport_export_infiniteLoop() {
-    Source source = addSource(EngineTestCase.createSource(["library L;", "import 'lib1.dart';", "Two two;"]));
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "export 'lib2.dart';", "class One {}"]));
-    addNamedSource("/lib2.dart", EngineTestCase.createSource(["library lib2;", "export 'lib3.dart';", "class Two {}"]));
-    addNamedSource("/lib3.dart", EngineTestCase.createSource(["library lib3;", "export 'lib2.dart';", "class Three {}"]));
+    Source source = addSource(r'''
+library L;
+import 'lib1.dart';
+Two two;''');
+    addNamedSource("/lib1.dart", r'''
+library lib1;
+export 'lib2.dart';
+class One {}''');
+    addNamedSource("/lib2.dart", r'''
+library lib2;
+export 'lib3.dart';
+class Two {}''');
+    addNamedSource("/lib3.dart", r'''
+library lib3;
+export 'lib2.dart';
+class Three {}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_unusedImport_export2() {
-    Source source = addSource(EngineTestCase.createSource(["library L;", "import 'lib1.dart';", "Three three;"]));
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "export 'lib2.dart';", "class One {}"]));
-    addNamedSource("/lib2.dart", EngineTestCase.createSource(["library lib2;", "export 'lib3.dart';", "class Two {}"]));
-    addNamedSource("/lib3.dart", EngineTestCase.createSource(["library lib3;", "class Three {}"]));
+    Source source = addSource(r'''
+library L;
+import 'lib1.dart';
+Three three;''');
+    addNamedSource("/lib1.dart", r'''
+library lib1;
+export 'lib2.dart';
+class One {}''');
+    addNamedSource("/lib2.dart", r'''
+library lib2;
+export 'lib3.dart';
+class Two {}''');
+    addNamedSource("/lib3.dart", r'''
+library lib3;
+class Three {}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_unusedImport_metadata() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library L;",
-        "@A(x)",
-        "import 'lib1.dart';",
-        "class A {",
-        "  final int value;",
-        "  const A(this.value);",
-        "}"]));
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "const x = 0;"]));
+    Source source = addSource(r'''
+library L;
+@A(x)
+import 'lib1.dart';
+class A {
+  final int value;
+  const A(this.value);
+}''');
+    addNamedSource("/lib1.dart", r'''
+library lib1;
+const x = 0;''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_unusedImport_prefix_topLevelFunction() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library L;",
-        "import 'lib1.dart' hide topLevelFunction;",
-        "import 'lib1.dart' as one show topLevelFunction;",
-        "class A {",
-        "  static void x() {",
-        "    One o;",
-        "    one.topLevelFunction();",
-        "  }",
-        "}"]));
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class One {}", "topLevelFunction() {}"]));
+    Source source = addSource(r'''
+library L;
+import 'lib1.dart' hide topLevelFunction;
+import 'lib1.dart' as one show topLevelFunction;
+class A {
+  static void x() {
+    One o;
+    one.topLevelFunction();
+  }
+}''');
+    addNamedSource("/lib1.dart", r'''
+library lib1;
+class One {}
+topLevelFunction() {}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_useOfVoidResult_implicitReturnValue() {
-    Source source = addSource(EngineTestCase.createSource([
-        "f() {}",
-        "class A {",
-        "  n() {",
-        "    var a = f();",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+f() {}
+class A {
+  n() {
+    var a = f();
+  }
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_useOfVoidResult_nonVoidReturnValue() {
-    Source source = addSource(EngineTestCase.createSource(["int f() => 1;", "g() {", "  var a = f();", "}"]));
+    Source source = addSource(r'''
+int f() => 1;
+g() {
+  var a = f();
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -5622,13 +5827,13 @@
 
 class PubSuggestionCodeTest extends ResolverTestCase {
   void test_import_package() {
-    Source source = addSource(EngineTestCase.createSource(["import 'package:somepackage/other.dart';"]));
+    Source source = addSource("import 'package:somepackage/other.dart';");
     resolve(source);
     assertErrors(source, [CompileTimeErrorCode.URI_DOES_NOT_EXIST]);
   }
 
   void test_import_packageWithDotDot() {
-    Source source = addSource(EngineTestCase.createSource(["import 'package:somepackage/../other.dart';"]));
+    Source source = addSource("import 'package:somepackage/../other.dart';");
     resolve(source);
     assertErrors(source, [
         CompileTimeErrorCode.URI_DOES_NOT_EXIST,
@@ -5636,7 +5841,7 @@
   }
 
   void test_import_packageWithLeadingDotDot() {
-    Source source = addSource(EngineTestCase.createSource(["import 'package:../other.dart';"]));
+    Source source = addSource("import 'package:../other.dart';");
     resolve(source);
     assertErrors(source, [
         CompileTimeErrorCode.URI_DOES_NOT_EXIST,
@@ -5646,14 +5851,14 @@
   void test_import_referenceIntoLibDirectory() {
     cacheSource("/myproj/pubspec.yaml", "");
     cacheSource("/myproj/lib/other.dart", "");
-    Source source = addNamedSource("/myproj/web/test.dart", EngineTestCase.createSource(["import '../lib/other.dart';"]));
+    Source source = addNamedSource("/myproj/web/test.dart", "import '../lib/other.dart';");
     resolve(source);
     assertErrors(source, [HintCode.FILE_IMPORT_OUTSIDE_LIB_REFERENCES_FILE_INSIDE]);
   }
 
   void test_import_referenceIntoLibDirectory_no_pubspec() {
     cacheSource("/myproj/lib/other.dart", "");
-    Source source = addNamedSource("/myproj/web/test.dart", EngineTestCase.createSource(["import '../lib/other.dart';"]));
+    Source source = addNamedSource("/myproj/web/test.dart", "import '../lib/other.dart';");
     resolve(source);
     assertNoErrors(source);
   }
@@ -5661,14 +5866,14 @@
   void test_import_referenceOutOfLibDirectory() {
     cacheSource("/myproj/pubspec.yaml", "");
     cacheSource("/myproj/web/other.dart", "");
-    Source source = addNamedSource("/myproj/lib/test.dart", EngineTestCase.createSource(["import '../web/other.dart';"]));
+    Source source = addNamedSource("/myproj/lib/test.dart", "import '../web/other.dart';");
     resolve(source);
     assertErrors(source, [HintCode.FILE_IMPORT_INSIDE_LIB_REFERENCES_FILE_OUTSIDE]);
   }
 
   void test_import_referenceOutOfLibDirectory_no_pubspec() {
     cacheSource("/myproj/web/other.dart", "");
-    Source source = addNamedSource("/myproj/lib/test.dart", EngineTestCase.createSource(["import '../web/other.dart';"]));
+    Source source = addNamedSource("/myproj/lib/test.dart", "import '../web/other.dart';");
     resolve(source);
     assertNoErrors(source);
   }
@@ -5676,7 +5881,7 @@
   void test_import_valid_inside_lib1() {
     cacheSource("/myproj/pubspec.yaml", "");
     cacheSource("/myproj/lib/other.dart", "");
-    Source source = addNamedSource("/myproj/lib/test.dart", EngineTestCase.createSource(["import 'other.dart';"]));
+    Source source = addNamedSource("/myproj/lib/test.dart", "import 'other.dart';");
     resolve(source);
     assertNoErrors(source);
   }
@@ -5684,7 +5889,7 @@
   void test_import_valid_inside_lib2() {
     cacheSource("/myproj/pubspec.yaml", "");
     cacheSource("/myproj/lib/bar/other.dart", "");
-    Source source = addNamedSource("/myproj/lib/foo/test.dart", EngineTestCase.createSource(["import '../bar/other.dart';"]));
+    Source source = addNamedSource("/myproj/lib/foo/test.dart", "import '../bar/other.dart';");
     resolve(source);
     assertNoErrors(source);
   }
@@ -5692,7 +5897,7 @@
   void test_import_valid_outside_lib() {
     cacheSource("/myproj/pubspec.yaml", "");
     cacheSource("/myproj/web/other.dart", "");
-    Source source = addNamedSource("/myproj/lib2/test.dart", EngineTestCase.createSource(["import '../web/other.dart';"]));
+    Source source = addNamedSource("/myproj/lib2/test.dart", "import '../web/other.dart';");
     resolve(source);
     assertNoErrors(source);
   }
@@ -5714,10 +5919,10 @@
         found[0] = true;
         // check static type
         DartType staticType = node.staticType;
-        JUnitTestCase.assertSame(SimpleResolverTest_this.typeProvider.dynamicType, staticType);
+        expect(staticType, same(SimpleResolverTest_this.typeProvider.dynamicType));
         // check propagated type
         FunctionType propagatedType = node.propagatedType as FunctionType;
-        JUnitTestCase.assertEquals(SimpleResolverTest_this.typeProvider.stringType, propagatedType.returnType);
+        expect(propagatedType.returnType, SimpleResolverTest_this.typeProvider.stringType);
       } on AnalysisException catch (e, stackTrace) {
         thrownException[0] = new CaughtException(e, stackTrace);
       }
@@ -5769,20 +5974,20 @@
    */
   void assertResolved() {
     if (!_unresolvedNodes.isEmpty || !_wrongTypedNodes.isEmpty) {
-      PrintStringWriter writer = new PrintStringWriter();
+      StringBuffer buffer = new StringBuffer();
       if (!_unresolvedNodes.isEmpty) {
-        writer.print("Failed to resolve ");
-        writer.print(_unresolvedNodes.length);
-        writer.println(" nodes:");
-        _printNodes(writer, _unresolvedNodes);
+        buffer.write("Failed to resolve ");
+        buffer.write(_unresolvedNodes.length);
+        buffer.writeln(" nodes:");
+        _printNodes(buffer, _unresolvedNodes);
       }
       if (!_wrongTypedNodes.isEmpty) {
-        writer.print("Resolved ");
-        writer.print(_wrongTypedNodes.length);
-        writer.println(" to the wrong type of element:");
-        _printNodes(writer, _wrongTypedNodes);
+        buffer.write("Resolved ");
+        buffer.write(_wrongTypedNodes.length);
+        buffer.writeln(" to the wrong type of element:");
+        _printNodes(buffer, _wrongTypedNodes);
       }
-      JUnitTestCase.fail(writer.toString());
+      fail(buffer.toString());
     }
   }
 
@@ -5975,15 +6180,15 @@
     return "<unknown file- ASTNode is null>";
   }
 
-  void _printNodes(PrintStringWriter writer, List<AstNode> nodes) {
+  void _printNodes(StringBuffer buffer, List<AstNode> nodes) {
     for (AstNode identifier in nodes) {
-      writer.print("  ");
-      writer.print(identifier.toString());
-      writer.print(" (");
-      writer.print(_getFileName(identifier));
-      writer.print(" : ");
-      writer.print(identifier.offset);
-      writer.println(")");
+      buffer.write("  ");
+      buffer.write(identifier.toString());
+      buffer.write(" (");
+      buffer.write(_getFileName(identifier));
+      buffer.write(" : ");
+      buffer.write(identifier.offset);
+      buffer.writeln(")");
     }
   }
 }
@@ -6087,13 +6292,13 @@
     for (int i = 0; i < count; i++) {
       String typeName = typeNames[i];
       ClassElementImpl type = new ClassElementImpl.forNode(AstFactory.identifier3(typeName));
-      String fileName = "${typeName}.dart";
+      String fileName = "$typeName.dart";
       CompilationUnitElementImpl compilationUnit = new CompilationUnitElementImpl(fileName);
       compilationUnit.source = _createNamedSource(fileName);
       compilationUnit.types = <ClassElement> [type];
       sourcedCompilationUnits[i] = compilationUnit;
     }
-    String fileName = "${libraryName}.dart";
+    String fileName = "$libraryName.dart";
     CompilationUnitElementImpl compilationUnit = new CompilationUnitElementImpl(fileName);
     compilationUnit.source = _createNamedSource(fileName);
     LibraryElementImpl library = new LibraryElementImpl.forNode(context, AstFactory.libraryIdentifier2([libraryName]));
@@ -6199,7 +6404,7 @@
 
   Source resolveSources(List<String> sourceTexts) {
     for (int i = 0; i < sourceTexts.length; i++) {
-      CompilationUnit unit = resolveSource2("/lib${(i + 1)}.dart", sourceTexts[i]);
+      CompilationUnit unit = resolveSource2("/lib${i + 1}.dart", sourceTexts[i]);
       // reference the source if this is the last source
       if (i + 1 == sourceTexts.length) {
         return unit.element.source;
@@ -6332,7 +6537,7 @@
     GatheringErrorListener listener = new GatheringErrorListener();
     try {
       ScopeBuilder.scopeFor(AstFactory.identifier3("x"), listener);
-      JUnitTestCase.fail("Expected AnalysisException");
+      fail("Expected AnalysisException");
     } on AnalysisException catch (exception) {
       // Expected
     }
@@ -6342,7 +6547,7 @@
     GatheringErrorListener listener = new GatheringErrorListener();
     try {
       ScopeBuilder.scopeFor(null, listener);
-      JUnitTestCase.fail("Expected AnalysisException");
+      fail("Expected AnalysisException");
     } on AnalysisException catch (exception) {
       // Expected
     }
@@ -6352,7 +6557,7 @@
     GatheringErrorListener listener = new GatheringErrorListener();
     try {
       ScopeBuilder.scopeFor(AstFactory.compilationUnit(), listener);
-      JUnitTestCase.fail("Expected AnalysisException");
+      fail("Expected AnalysisException");
     } on AnalysisException catch (exception) {
       // Expected
     }
@@ -6456,15 +6661,15 @@
   void test_getErrorListener() {
     GatheringErrorListener errorListener = new GatheringErrorListener();
     ScopeTest_TestScope scope = new ScopeTest_TestScope(errorListener);
-    JUnitTestCase.assertEquals(errorListener, scope.errorListener);
+    expect(scope.errorListener, errorListener);
   }
 
   void test_isPrivateName_nonPrivate() {
-    JUnitTestCase.assertFalse(Scope.isPrivateName("Public"));
+    expect(Scope.isPrivateName("Public"), isFalse);
   }
 
   void test_isPrivateName_private() {
-    JUnitTestCase.assertTrue(Scope.isPrivateName("_Private"));
+    expect(Scope.isPrivateName("_Private"), isTrue);
   }
 }
 
@@ -6509,128 +6714,128 @@
 
 class SimpleResolverTest extends ResolverTestCase {
   void fail_staticInvocation() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  static int get g => (a,b) => 0;",
-        "}",
-        "class B {",
-        "  f() {",
-        "    A.g(1,0);",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  static int get g => (a,b) => 0;
+}
+class B {
+  f() {
+    A.g(1,0);
+  }
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_argumentResolution_required_matching() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  void f() {",
-        "    g(1, 2, 3);",
-        "  }",
-        "  void g(a, b, c) {}",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  void f() {
+    g(1, 2, 3);
+  }
+  void g(a, b, c) {}
+}''');
     _validateArgumentResolution(source, [0, 1, 2]);
   }
 
   void test_argumentResolution_required_tooFew() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  void f() {",
-        "    g(1, 2);",
-        "  }",
-        "  void g(a, b, c) {}",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  void f() {
+    g(1, 2);
+  }
+  void g(a, b, c) {}
+}''');
     _validateArgumentResolution(source, [0, 1]);
   }
 
   void test_argumentResolution_required_tooMany() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  void f() {",
-        "    g(1, 2, 3);",
-        "  }",
-        "  void g(a, b) {}",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  void f() {
+    g(1, 2, 3);
+  }
+  void g(a, b) {}
+}''');
     _validateArgumentResolution(source, [0, 1, -1]);
   }
 
   void test_argumentResolution_requiredAndNamed_extra() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  void f() {",
-        "    g(1, 2, c: 3, d: 4);",
-        "  }",
-        "  void g(a, b, {c}) {}",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  void f() {
+    g(1, 2, c: 3, d: 4);
+  }
+  void g(a, b, {c}) {}
+}''');
     _validateArgumentResolution(source, [0, 1, 2, -1]);
   }
 
   void test_argumentResolution_requiredAndNamed_matching() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  void f() {",
-        "    g(1, 2, c: 3);",
-        "  }",
-        "  void g(a, b, {c}) {}",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  void f() {
+    g(1, 2, c: 3);
+  }
+  void g(a, b, {c}) {}
+}''');
     _validateArgumentResolution(source, [0, 1, 2]);
   }
 
   void test_argumentResolution_requiredAndNamed_missing() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  void f() {",
-        "    g(1, 2, d: 3);",
-        "  }",
-        "  void g(a, b, {c, d}) {}",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  void f() {
+    g(1, 2, d: 3);
+  }
+  void g(a, b, {c, d}) {}
+}''');
     _validateArgumentResolution(source, [0, 1, 3]);
   }
 
   void test_argumentResolution_requiredAndPositional_fewer() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  void f() {",
-        "    g(1, 2, 3);",
-        "  }",
-        "  void g(a, b, [c, d]) {}",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  void f() {
+    g(1, 2, 3);
+  }
+  void g(a, b, [c, d]) {}
+}''');
     _validateArgumentResolution(source, [0, 1, 2]);
   }
 
   void test_argumentResolution_requiredAndPositional_matching() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  void f() {",
-        "    g(1, 2, 3, 4);",
-        "  }",
-        "  void g(a, b, [c, d]) {}",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  void f() {
+    g(1, 2, 3, 4);
+  }
+  void g(a, b, [c, d]) {}
+}''');
     _validateArgumentResolution(source, [0, 1, 2, 3]);
   }
 
   void test_argumentResolution_requiredAndPositional_more() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  void f() {",
-        "    g(1, 2, 3, 4);",
-        "  }",
-        "  void g(a, b, [c]) {}",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  void f() {
+    g(1, 2, 3, 4);
+  }
+  void g(a, b, [c]) {}
+}''');
     _validateArgumentResolution(source, [0, 1, 2, -1]);
   }
 
   void test_argumentResolution_setter_propagated() {
-    Source source = addSource(EngineTestCase.createSource([
-        "main() {",
-        "  var a = new A();",
-        "  a.sss = 0;",
-        "}",
-        "class A {",
-        "  set sss(x) {}",
-        "}"]));
+    Source source = addSource(r'''
+main() {
+  var a = new A();
+  a.sss = 0;
+}
+class A {
+  set sss(x) {}
+}''');
     LibraryElement library = resolve(source);
     CompilationUnitElement unit = library.definingCompilationUnit;
     // find "a.sss = 0"
@@ -6644,28 +6849,28 @@
     }
     // get parameter
     Expression rhs = assignment.rightHandSide;
-    JUnitTestCase.assertNull(rhs.staticParameterElement);
+    expect(rhs.staticParameterElement, isNull);
     ParameterElement parameter = rhs.propagatedParameterElement;
-    JUnitTestCase.assertNotNull(parameter);
-    JUnitTestCase.assertEquals("x", parameter.displayName);
+    expect(parameter, isNotNull);
+    expect(parameter.displayName, "x");
     // validate
     ClassElement classA = unit.types[0];
     PropertyAccessorElement setter = classA.accessors[0];
-    JUnitTestCase.assertSame(parameter, setter.parameters[0]);
+    expect(setter.parameters[0], same(parameter));
   }
 
   void test_argumentResolution_setter_propagated_propertyAccess() {
-    Source source = addSource(EngineTestCase.createSource([
-        "main() {",
-        "  var a = new A();",
-        "  a.b.sss = 0;",
-        "}",
-        "class A {",
-        "  B b = new B();",
-        "}",
-        "class B {",
-        "  set sss(x) {}",
-        "}"]));
+    Source source = addSource(r'''
+main() {
+  var a = new A();
+  a.b.sss = 0;
+}
+class A {
+  B b = new B();
+}
+class B {
+  set sss(x) {}
+}''');
     LibraryElement library = resolve(source);
     CompilationUnitElement unit = library.definingCompilationUnit;
     // find "a.b.sss = 0"
@@ -6679,25 +6884,25 @@
     }
     // get parameter
     Expression rhs = assignment.rightHandSide;
-    JUnitTestCase.assertNull(rhs.staticParameterElement);
+    expect(rhs.staticParameterElement, isNull);
     ParameterElement parameter = rhs.propagatedParameterElement;
-    JUnitTestCase.assertNotNull(parameter);
-    JUnitTestCase.assertEquals("x", parameter.displayName);
+    expect(parameter, isNotNull);
+    expect(parameter.displayName, "x");
     // validate
     ClassElement classB = unit.types[1];
     PropertyAccessorElement setter = classB.accessors[0];
-    JUnitTestCase.assertSame(parameter, setter.parameters[0]);
+    expect(setter.parameters[0], same(parameter));
   }
 
   void test_argumentResolution_setter_static() {
-    Source source = addSource(EngineTestCase.createSource([
-        "main() {",
-        "  A a = new A();",
-        "  a.sss = 0;",
-        "}",
-        "class A {",
-        "  set sss(x) {}",
-        "}"]));
+    Source source = addSource(r'''
+main() {
+  A a = new A();
+  a.sss = 0;
+}
+class A {
+  set sss(x) {}
+}''');
     LibraryElement library = resolve(source);
     CompilationUnitElement unit = library.definingCompilationUnit;
     // find "a.sss = 0"
@@ -6712,26 +6917,26 @@
     // get parameter
     Expression rhs = assignment.rightHandSide;
     ParameterElement parameter = rhs.staticParameterElement;
-    JUnitTestCase.assertNotNull(parameter);
-    JUnitTestCase.assertEquals("x", parameter.displayName);
+    expect(parameter, isNotNull);
+    expect(parameter.displayName, "x");
     // validate
     ClassElement classA = unit.types[0];
     PropertyAccessorElement setter = classA.accessors[0];
-    JUnitTestCase.assertSame(parameter, setter.parameters[0]);
+    expect(setter.parameters[0], same(parameter));
   }
 
   void test_argumentResolution_setter_static_propertyAccess() {
-    Source source = addSource(EngineTestCase.createSource([
-        "main() {",
-        "  A a = new A();",
-        "  a.b.sss = 0;",
-        "}",
-        "class A {",
-        "  B b = new B();",
-        "}",
-        "class B {",
-        "  set sss(x) {}",
-        "}"]));
+    Source source = addSource(r'''
+main() {
+  A a = new A();
+  a.b.sss = 0;
+}
+class A {
+  B b = new B();
+}
+class B {
+  set sss(x) {}
+}''');
     LibraryElement library = resolve(source);
     CompilationUnitElement unit = library.definingCompilationUnit;
     // find "a.b.sss = 0"
@@ -6746,66 +6951,68 @@
     // get parameter
     Expression rhs = assignment.rightHandSide;
     ParameterElement parameter = rhs.staticParameterElement;
-    JUnitTestCase.assertNotNull(parameter);
-    JUnitTestCase.assertEquals("x", parameter.displayName);
+    expect(parameter, isNotNull);
+    expect(parameter.displayName, "x");
     // validate
     ClassElement classB = unit.types[1];
     PropertyAccessorElement setter = classB.accessors[0];
-    JUnitTestCase.assertSame(parameter, setter.parameters[0]);
+    expect(setter.parameters[0], same(parameter));
   }
 
   void test_class_definesCall() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  int call(int x) { return x; }",
-        "}",
-        "int f(A a) {",
-        "  return a(0);",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  int call(int x) { return x; }
+}
+int f(A a) {
+  return a(0);
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_class_extends_implements() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A extends B implements C {}",
-        "class B {}",
-        "class C {}"]));
+    Source source = addSource(r'''
+class A extends B implements C {}
+class B {}
+class C {}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_commentReference_class() {
-    Source source = addSource(EngineTestCase.createSource([
-        "f() {}",
-        "/** [A] [new A] [A.n] [new A.n] [m] [f] */",
-        "class A {",
-        "  A() {}",
-        "  A.n() {}",
-        "  m() {}",
-        "}"]));
+    Source source = addSource(r'''
+f() {}
+/** [A] [new A] [A.n] [new A.n] [m] [f] */
+class A {
+  A() {}
+  A.n() {}
+  m() {}
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_commentReference_parameter() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  A() {}",
-        "  A.n() {}",
-        "  /** [e] [f] */",
-        "  m(e, f()) {}",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  A() {}
+  A.n() {}
+  /** [e] [f] */
+  m(e, f()) {}
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_commentReference_singleLine() {
-    Source source = addSource(EngineTestCase.createSource(["/// [A]", "class A {}"]));
+    Source source = addSource(r'''
+/// [A]
+class A {}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -6819,570 +7026,626 @@
   }
 
   void test_entryPoint_exported() {
-    addNamedSource("/two.dart", EngineTestCase.createSource(["library two;", "main() {}"]));
-    Source source = addNamedSource("/one.dart", EngineTestCase.createSource(["library one;", "export 'two.dart';"]));
+    addNamedSource("/two.dart", r'''
+library two;
+main() {}''');
+    Source source = addNamedSource("/one.dart", r'''
+library one;
+export 'two.dart';''');
     LibraryElement library = resolve(source);
-    JUnitTestCase.assertNotNull(library);
+    expect(library, isNotNull);
     FunctionElement main = library.entryPoint;
-    JUnitTestCase.assertNotNull(main);
-    JUnitTestCase.assertNotSame(library, main.library);
+    expect(main, isNotNull);
+    expect(main.library, isNot(same(library)));
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_entryPoint_local() {
-    Source source = addNamedSource("/one.dart", EngineTestCase.createSource(["library one;", "main() {}"]));
+    Source source = addNamedSource("/one.dart", r'''
+library one;
+main() {}''');
     LibraryElement library = resolve(source);
-    JUnitTestCase.assertNotNull(library);
+    expect(library, isNotNull);
     FunctionElement main = library.entryPoint;
-    JUnitTestCase.assertNotNull(main);
-    JUnitTestCase.assertSame(library, main.library);
+    expect(main, isNotNull);
+    expect(main.library, same(library));
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_entryPoint_none() {
-    Source source = addNamedSource("/one.dart", EngineTestCase.createSource(["library one;"]));
+    Source source = addNamedSource("/one.dart", "library one;");
     LibraryElement library = resolve(source);
-    JUnitTestCase.assertNotNull(library);
-    JUnitTestCase.assertNull(library.entryPoint);
+    expect(library, isNotNull);
+    expect(library.entryPoint, isNull);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_extractedMethodAsConstant() {
-    Source source = addSource(EngineTestCase.createSource([
-        "abstract class Comparable<T> {",
-        "  int compareTo(T other);",
-        "  static int compare(Comparable a, Comparable b) => a.compareTo(b);",
-        "}",
-        "class A {",
-        "  void sort([compare = Comparable.compare]) {}",
-        "}"]));
+    Source source = addSource(r'''
+abstract class Comparable<T> {
+  int compareTo(T other);
+  static int compare(Comparable a, Comparable b) => a.compareTo(b);
+}
+class A {
+  void sort([compare = Comparable.compare]) {}
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_fieldFormalParameter() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  int x;", "  A(this.x) {}", "}"]));
+    Source source = addSource(r'''
+class A {
+  int x;
+  A(this.x) {}
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_forEachLoops_nonConflicting() {
-    Source source = addSource(EngineTestCase.createSource([
-        "f() {",
-        "  List list = [1,2,3];",
-        "  for (int x in list) {}",
-        "  for (int x in list) {}",
-        "}"]));
+    Source source = addSource(r'''
+f() {
+  List list = [1,2,3];
+  for (int x in list) {}
+  for (int x in list) {}
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_forLoops_nonConflicting() {
-    Source source = addSource(EngineTestCase.createSource([
-        "f() {",
-        "  for (int i = 0; i < 3; i++) {",
-        "  }",
-        "  for (int i = 0; i < 3; i++) {",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+f() {
+  for (int i = 0; i < 3; i++) {
+  }
+  for (int i = 0; i < 3; i++) {
+  }
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_functionTypeAlias() {
-    Source source = addSource(EngineTestCase.createSource([
-        "typedef bool P(e);",
-        "class A {",
-        "  P p;",
-        "  m(e) {",
-        "    if (p(e)) {}",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+typedef bool P(e);
+class A {
+  P p;
+  m(e) {
+    if (p(e)) {}
+  }
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_getterAndSetterWithDifferentTypes() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  int get f => 0;",
-        "  void set f(String s) {}",
-        "}",
-        "g (A a) {",
-        "  a.f = a.f.toString();",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  int get f => 0;
+  void set f(String s) {}
+}
+g (A a) {
+  a.f = a.f.toString();
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES]);
     verify([source]);
   }
 
   void test_hasReferenceToSuper() {
-    Source source = addSource(EngineTestCase.createSource(["class A {}", "class B {toString() => super.toString();}"]));
+    Source source = addSource(r'''
+class A {}
+class B {toString() => super.toString();}''');
     LibraryElement library = resolve(source);
-    JUnitTestCase.assertNotNull(library);
+    expect(library, isNotNull);
     CompilationUnitElement unit = library.definingCompilationUnit;
-    JUnitTestCase.assertNotNull(unit);
+    expect(unit, isNotNull);
     List<ClassElement> classes = unit.types;
-    EngineTestCase.assertLength(2, classes);
-    JUnitTestCase.assertFalse(classes[0].hasReferenceToSuper);
-    JUnitTestCase.assertTrue(classes[1].hasReferenceToSuper);
+    expect(classes, hasLength(2));
+    expect(classes[0].hasReferenceToSuper, isFalse);
+    expect(classes[1].hasReferenceToSuper, isTrue);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_import_hide() {
-    addNamedSource("lib1.dart", EngineTestCase.createSource(["library lib1;", "set foo(value) {}", "class A {}"]));
-    addNamedSource("lib2.dart", EngineTestCase.createSource(["library lib2;", "set foo(value) {}"]));
-    Source source = addNamedSource("lib3.dart", EngineTestCase.createSource([
-        "import 'lib1.dart' hide foo;",
-        "import 'lib2.dart';",
-        "",
-        "main() {",
-        "  foo = 0;",
-        "}",
-        "A a;"]));
+    addNamedSource("lib1.dart", r'''
+library lib1;
+set foo(value) {}
+class A {}''');
+    addNamedSource("lib2.dart", r'''
+library lib2;
+set foo(value) {}''');
+    Source source = addNamedSource("lib3.dart", r'''
+import 'lib1.dart' hide foo;
+import 'lib2.dart';
+
+main() {
+  foo = 0;
+}
+A a;''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_import_prefix() {
-    addNamedSource("/two.dart", EngineTestCase.createSource(["library two;", "f(int x) {", "  return x * x;", "}"]));
-    Source source = addNamedSource("/one.dart", EngineTestCase.createSource([
-        "library one;",
-        "import 'two.dart' as _two;",
-        "main() {",
-        "  _two.f(0);",
-        "}"]));
+    addNamedSource("/two.dart", r'''
+library two;
+f(int x) {
+  return x * x;
+}''');
+    Source source = addNamedSource("/one.dart", r'''
+library one;
+import 'two.dart' as _two;
+main() {
+  _two.f(0);
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_import_spaceInUri() {
-    addNamedSource("sub folder/lib.dart", EngineTestCase.createSource(["library lib;", "foo() {}"]));
-    Source source = addNamedSource("app.dart", EngineTestCase.createSource([
-        "import 'sub folder/lib.dart';",
-        "",
-        "main() {",
-        "  foo();",
-        "}"]));
+    addNamedSource("sub folder/lib.dart", r'''
+library lib;
+foo() {}''');
+    Source source = addNamedSource("app.dart", r'''
+import 'sub folder/lib.dart';
+
+main() {
+  foo();
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_indexExpression_typeParameters() {
-    Source source = addSource(EngineTestCase.createSource([
-        "f() {",
-        "  List<int> a;",
-        "  a[0];",
-        "  List<List<int>> b;",
-        "  b[0][0];",
-        "  List<List<List<int>>> c;",
-        "  c[0][0][0];",
-        "}"]));
+    Source source = addSource(r'''
+f() {
+  List<int> a;
+  a[0];
+  List<List<int>> b;
+  b[0][0];
+  List<List<List<int>>> c;
+  c[0][0][0];
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_indexExpression_typeParameters_invalidAssignmentWarning() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  List<List<int>> b;", "  b[0][0] = 'hi';", "}"]));
+    Source source = addSource(r'''
+f() {
+  List<List<int>> b;
+  b[0][0] = 'hi';
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
     verify([source]);
   }
 
   void test_indirectOperatorThroughCall() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  B call() { return new B(); }",
-        "}",
-        "",
-        "class B {",
-        "  int operator [](int i) { return i; }",
-        "}",
-        "",
-        "A f = new A();",
-        "",
-        "g(int x) {}",
-        "",
-        "main() {",
-        "  g(f()[0]);",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  B call() { return new B(); }
+}
+
+class B {
+  int operator [](int i) { return i; }
+}
+
+A f = new A();
+
+g(int x) {}
+
+main() {
+  g(f()[0]);
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_invoke_dynamicThroughGetter() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  List get X => [() => 0];",
-        "  m(A a) {",
-        "    X.last;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  List get X => [() => 0];
+  m(A a) {
+    X.last;
+  }
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_isValidMixin_badSuperclass() {
-    Source source = addSource(EngineTestCase.createSource(["class A extends B {}", "class B {}"]));
+    Source source = addSource(r'''
+class A extends B {}
+class B {}''');
     LibraryElement library = resolve(source);
-    JUnitTestCase.assertNotNull(library);
+    expect(library, isNotNull);
     CompilationUnitElement unit = library.definingCompilationUnit;
-    JUnitTestCase.assertNotNull(unit);
+    expect(unit, isNotNull);
     List<ClassElement> classes = unit.types;
-    EngineTestCase.assertLength(2, classes);
-    JUnitTestCase.assertFalse(classes[0].isValidMixin);
+    expect(classes, hasLength(2));
+    expect(classes[0].isValidMixin, isFalse);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_isValidMixin_constructor() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  A() {}", "}"]));
+    Source source = addSource(r'''
+class A {
+  A() {}
+}''');
     LibraryElement library = resolve(source);
-    JUnitTestCase.assertNotNull(library);
+    expect(library, isNotNull);
     CompilationUnitElement unit = library.definingCompilationUnit;
-    JUnitTestCase.assertNotNull(unit);
+    expect(unit, isNotNull);
     List<ClassElement> classes = unit.types;
-    EngineTestCase.assertLength(1, classes);
-    JUnitTestCase.assertFalse(classes[0].isValidMixin);
+    expect(classes, hasLength(1));
+    expect(classes[0].isValidMixin, isFalse);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_isValidMixin_super() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  toString() {",
-        "    return super.toString();",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  toString() {
+    return super.toString();
+  }
+}''');
     LibraryElement library = resolve(source);
-    JUnitTestCase.assertNotNull(library);
+    expect(library, isNotNull);
     CompilationUnitElement unit = library.definingCompilationUnit;
-    JUnitTestCase.assertNotNull(unit);
+    expect(unit, isNotNull);
     List<ClassElement> classes = unit.types;
-    EngineTestCase.assertLength(1, classes);
-    JUnitTestCase.assertFalse(classes[0].isValidMixin);
+    expect(classes, hasLength(1));
+    expect(classes[0].isValidMixin, isFalse);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_isValidMixin_valid() {
-    Source source = addSource(EngineTestCase.createSource(["class A {}"]));
+    Source source = addSource("class A {}");
     LibraryElement library = resolve(source);
-    JUnitTestCase.assertNotNull(library);
+    expect(library, isNotNull);
     CompilationUnitElement unit = library.definingCompilationUnit;
-    JUnitTestCase.assertNotNull(unit);
+    expect(unit, isNotNull);
     List<ClassElement> classes = unit.types;
-    EngineTestCase.assertLength(1, classes);
-    JUnitTestCase.assertTrue(classes[0].isValidMixin);
+    expect(classes, hasLength(1));
+    expect(classes[0].isValidMixin, isTrue);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_labels_switch() {
-    Source source = addSource(EngineTestCase.createSource([
-        "void doSwitch(int target) {",
-        "  switch (target) {",
-        "    l0: case 0:",
-        "      continue l1;",
-        "    l1: case 1:",
-        "      continue l0;",
-        "    default:",
-        "      continue l1;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+void doSwitch(int target) {
+  switch (target) {
+    l0: case 0:
+      continue l1;
+    l1: case 1:
+      continue l0;
+    default:
+      continue l1;
+  }
+}''');
     LibraryElement library = resolve(source);
-    JUnitTestCase.assertNotNull(library);
+    expect(library, isNotNull);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_localVariable_types_invoked() {
-    Source source = addSource(EngineTestCase.createSource([
-        "const A = null;",
-        "main() {",
-        "  var myVar = (int p) => 'foo';",
-        "  myVar(42);",
-        "}"]));
+    Source source = addSource(r'''
+const A = null;
+main() {
+  var myVar = (int p) => 'foo';
+  myVar(42);
+}''');
     LibraryElement library = resolve(source);
-    JUnitTestCase.assertNotNull(library);
+    expect(library, isNotNull);
     CompilationUnit unit = analysisContext.getResolvedCompilationUnit(source, library);
-    JUnitTestCase.assertNotNull(unit);
+    expect(unit, isNotNull);
     List<bool> found = [false];
     List<CaughtException> thrownException = new List<CaughtException>(1);
     unit.accept(new RecursiveAstVisitor_SimpleResolverTest_test_localVariable_types_invoked(this, found, thrownException));
     if (thrownException[0] != null) {
       throw new AnalysisException("Exception", new CaughtException(thrownException[0], null));
     }
-    JUnitTestCase.assertTrue(found[0]);
+    expect(found[0], isTrue);
   }
 
   void test_metadata_class() {
-    Source source = addSource(EngineTestCase.createSource(["const A = null;", "@A class C<A> {}"]));
+    Source source = addSource(r'''
+const A = null;
+@A class C<A> {}''');
     LibraryElement library = resolve(source);
-    JUnitTestCase.assertNotNull(library);
+    expect(library, isNotNull);
     CompilationUnitElement unitElement = library.definingCompilationUnit;
-    JUnitTestCase.assertNotNull(unitElement);
+    expect(unitElement, isNotNull);
     List<ClassElement> classes = unitElement.types;
-    EngineTestCase.assertLength(1, classes);
+    expect(classes, hasLength(1));
     List<ElementAnnotation> annotations = classes[0].metadata;
-    EngineTestCase.assertLength(1, annotations);
+    expect(annotations, hasLength(1));
     assertNoErrors(source);
     verify([source]);
     CompilationUnit unit = resolveCompilationUnit(source, library);
     NodeList<CompilationUnitMember> declarations = unit.declarations;
-    EngineTestCase.assertSizeOfList(2, declarations);
+    expect(declarations, hasLength(2));
     Element expectedElement = (declarations[0] as TopLevelVariableDeclaration).variables.variables[0].name.staticElement;
     EngineTestCase.assertInstanceOf((obj) => obj is PropertyInducingElement, PropertyInducingElement, expectedElement);
     expectedElement = (expectedElement as PropertyInducingElement).getter;
     Element actualElement = (declarations[1] as ClassDeclaration).metadata[0].name.staticElement;
-    JUnitTestCase.assertSame(expectedElement, actualElement);
+    expect(actualElement, same(expectedElement));
   }
 
   void test_metadata_field() {
-    Source source = addSource(EngineTestCase.createSource(["const A = null;", "class C {", "  @A int f;", "}"]));
+    Source source = addSource(r'''
+const A = null;
+class C {
+  @A int f;
+}''');
     LibraryElement library = resolve(source);
-    JUnitTestCase.assertNotNull(library);
+    expect(library, isNotNull);
     CompilationUnitElement unit = library.definingCompilationUnit;
-    JUnitTestCase.assertNotNull(unit);
+    expect(unit, isNotNull);
     List<ClassElement> classes = unit.types;
-    EngineTestCase.assertLength(1, classes);
+    expect(classes, hasLength(1));
     FieldElement field = classes[0].fields[0];
     List<ElementAnnotation> annotations = field.metadata;
-    EngineTestCase.assertLength(1, annotations);
+    expect(annotations, hasLength(1));
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_metadata_fieldFormalParameter() {
-    Source source = addSource(EngineTestCase.createSource([
-        "const A = null;",
-        "class C {",
-        "  int f;",
-        "  C(@A this.f);",
-        "}"]));
+    Source source = addSource(r'''
+const A = null;
+class C {
+  int f;
+  C(@A this.f);
+}''');
     LibraryElement library = resolve(source);
-    JUnitTestCase.assertNotNull(library);
+    expect(library, isNotNull);
     CompilationUnitElement unit = library.definingCompilationUnit;
-    JUnitTestCase.assertNotNull(unit);
+    expect(unit, isNotNull);
     List<ClassElement> classes = unit.types;
-    EngineTestCase.assertLength(1, classes);
+    expect(classes, hasLength(1));
     List<ConstructorElement> constructors = classes[0].constructors;
-    EngineTestCase.assertLength(1, constructors);
+    expect(constructors, hasLength(1));
     List<ParameterElement> parameters = constructors[0].parameters;
-    EngineTestCase.assertLength(1, parameters);
+    expect(parameters, hasLength(1));
     List<ElementAnnotation> annotations = parameters[0].metadata;
-    EngineTestCase.assertLength(1, annotations);
+    expect(annotations, hasLength(1));
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_metadata_function() {
-    Source source = addSource(EngineTestCase.createSource(["const A = null;", "@A f() {}"]));
+    Source source = addSource(r'''
+const A = null;
+@A f() {}''');
     LibraryElement library = resolve(source);
-    JUnitTestCase.assertNotNull(library);
+    expect(library, isNotNull);
     CompilationUnitElement unit = library.definingCompilationUnit;
-    JUnitTestCase.assertNotNull(unit);
+    expect(unit, isNotNull);
     List<FunctionElement> functions = unit.functions;
-    EngineTestCase.assertLength(1, functions);
+    expect(functions, hasLength(1));
     List<ElementAnnotation> annotations = functions[0].metadata;
-    EngineTestCase.assertLength(1, annotations);
+    expect(annotations, hasLength(1));
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_metadata_functionTypedParameter() {
-    Source source = addSource(EngineTestCase.createSource(["const A = null;", "f(@A int p(int x)) {}"]));
+    Source source = addSource(r'''
+const A = null;
+f(@A int p(int x)) {}''');
     LibraryElement library = resolve(source);
-    JUnitTestCase.assertNotNull(library);
+    expect(library, isNotNull);
     CompilationUnitElement unit = library.definingCompilationUnit;
-    JUnitTestCase.assertNotNull(unit);
+    expect(unit, isNotNull);
     List<FunctionElement> functions = unit.functions;
-    EngineTestCase.assertLength(1, functions);
+    expect(functions, hasLength(1));
     List<ParameterElement> parameters = functions[0].parameters;
-    EngineTestCase.assertLength(1, parameters);
+    expect(parameters, hasLength(1));
     List<ElementAnnotation> annotations1 = parameters[0].metadata;
-    EngineTestCase.assertLength(1, annotations1);
+    expect(annotations1, hasLength(1));
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_metadata_libraryDirective() {
-    Source source = addSource(EngineTestCase.createSource(["@A library lib;", "const A = null;"]));
+    Source source = addSource(r'''
+@A library lib;
+const A = null;''');
     LibraryElement library = resolve(source);
-    JUnitTestCase.assertNotNull(library);
+    expect(library, isNotNull);
     List<ElementAnnotation> annotations = library.metadata;
-    EngineTestCase.assertLength(1, annotations);
+    expect(annotations, hasLength(1));
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_metadata_method() {
-    Source source = addSource(EngineTestCase.createSource(["const A = null;", "class C {", "  @A void m() {}", "}"]));
+    Source source = addSource(r'''
+const A = null;
+class C {
+  @A void m() {}
+}''');
     LibraryElement library = resolve(source);
-    JUnitTestCase.assertNotNull(library);
+    expect(library, isNotNull);
     CompilationUnitElement unit = library.definingCompilationUnit;
-    JUnitTestCase.assertNotNull(unit);
+    expect(unit, isNotNull);
     List<ClassElement> classes = unit.types;
-    EngineTestCase.assertLength(1, classes);
+    expect(classes, hasLength(1));
     MethodElement method = classes[0].methods[0];
     List<ElementAnnotation> annotations = method.metadata;
-    EngineTestCase.assertLength(1, annotations);
+    expect(annotations, hasLength(1));
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_metadata_namedParameter() {
-    Source source = addSource(EngineTestCase.createSource(["const A = null;", "f({@A int p : 0}) {}"]));
+    Source source = addSource(r'''
+const A = null;
+f({@A int p : 0}) {}''');
     LibraryElement library = resolve(source);
-    JUnitTestCase.assertNotNull(library);
+    expect(library, isNotNull);
     CompilationUnitElement unit = library.definingCompilationUnit;
-    JUnitTestCase.assertNotNull(unit);
+    expect(unit, isNotNull);
     List<FunctionElement> functions = unit.functions;
-    EngineTestCase.assertLength(1, functions);
+    expect(functions, hasLength(1));
     List<ParameterElement> parameters = functions[0].parameters;
-    EngineTestCase.assertLength(1, parameters);
+    expect(parameters, hasLength(1));
     List<ElementAnnotation> annotations1 = parameters[0].metadata;
-    EngineTestCase.assertLength(1, annotations1);
+    expect(annotations1, hasLength(1));
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_metadata_positionalParameter() {
-    Source source = addSource(EngineTestCase.createSource(["const A = null;", "f([@A int p = 0]) {}"]));
+    Source source = addSource(r'''
+const A = null;
+f([@A int p = 0]) {}''');
     LibraryElement library = resolve(source);
-    JUnitTestCase.assertNotNull(library);
+    expect(library, isNotNull);
     CompilationUnitElement unit = library.definingCompilationUnit;
-    JUnitTestCase.assertNotNull(unit);
+    expect(unit, isNotNull);
     List<FunctionElement> functions = unit.functions;
-    EngineTestCase.assertLength(1, functions);
+    expect(functions, hasLength(1));
     List<ParameterElement> parameters = functions[0].parameters;
-    EngineTestCase.assertLength(1, parameters);
+    expect(parameters, hasLength(1));
     List<ElementAnnotation> annotations1 = parameters[0].metadata;
-    EngineTestCase.assertLength(1, annotations1);
+    expect(annotations1, hasLength(1));
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_metadata_simpleParameter() {
-    Source source = addSource(EngineTestCase.createSource(["const A = null;", "f(@A p1, @A int p2) {}"]));
+    Source source = addSource(r'''
+const A = null;
+f(@A p1, @A int p2) {}''');
     LibraryElement library = resolve(source);
-    JUnitTestCase.assertNotNull(library);
+    expect(library, isNotNull);
     CompilationUnitElement unit = library.definingCompilationUnit;
-    JUnitTestCase.assertNotNull(unit);
+    expect(unit, isNotNull);
     List<FunctionElement> functions = unit.functions;
-    EngineTestCase.assertLength(1, functions);
+    expect(functions, hasLength(1));
     List<ParameterElement> parameters = functions[0].parameters;
-    EngineTestCase.assertLength(2, parameters);
+    expect(parameters, hasLength(2));
     List<ElementAnnotation> annotations1 = parameters[0].metadata;
-    EngineTestCase.assertLength(1, annotations1);
+    expect(annotations1, hasLength(1));
     List<ElementAnnotation> annotations2 = parameters[1].metadata;
-    EngineTestCase.assertLength(1, annotations2);
+    expect(annotations2, hasLength(1));
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_metadata_typedef() {
-    Source source = addSource(EngineTestCase.createSource(["const A = null;", "@A typedef F<A>();"]));
+    Source source = addSource(r'''
+const A = null;
+@A typedef F<A>();''');
     LibraryElement library = resolve(source);
-    JUnitTestCase.assertNotNull(library);
+    expect(library, isNotNull);
     CompilationUnitElement unitElement = library.definingCompilationUnit;
-    JUnitTestCase.assertNotNull(unitElement);
+    expect(unitElement, isNotNull);
     List<FunctionTypeAliasElement> aliases = unitElement.functionTypeAliases;
-    EngineTestCase.assertLength(1, aliases);
+    expect(aliases, hasLength(1));
     List<ElementAnnotation> annotations = aliases[0].metadata;
-    EngineTestCase.assertLength(1, annotations);
+    expect(annotations, hasLength(1));
     assertNoErrors(source);
     verify([source]);
     CompilationUnit unit = resolveCompilationUnit(source, library);
     NodeList<CompilationUnitMember> declarations = unit.declarations;
-    EngineTestCase.assertSizeOfList(2, declarations);
+    expect(declarations, hasLength(2));
     Element expectedElement = (declarations[0] as TopLevelVariableDeclaration).variables.variables[0].name.staticElement;
     EngineTestCase.assertInstanceOf((obj) => obj is PropertyInducingElement, PropertyInducingElement, expectedElement);
     expectedElement = (expectedElement as PropertyInducingElement).getter;
     Element actualElement = (declarations[1] as FunctionTypeAlias).metadata[0].name.staticElement;
-    JUnitTestCase.assertSame(expectedElement, actualElement);
+    expect(actualElement, same(expectedElement));
   }
 
   void test_method_fromMixin() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class B {",
-        "  bar() => 1;",
-        "}",
-        "class A {",
-        "  foo() => 2;",
-        "}",
-        "",
-        "class C extends B with A {",
-        "  bar() => super.bar();",
-        "  foo() => super.foo();",
-        "}"]));
+    Source source = addSource(r'''
+class B {
+  bar() => 1;
+}
+class A {
+  foo() => 2;
+}
+
+class C extends B with A {
+  bar() => super.bar();
+  foo() => super.foo();
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_method_fromSuperclassMixin() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  void m1() {}",
-        "}",
-        "class B extends Object with A {",
-        "}",
-        "class C extends B {",
-        "}",
-        "f(C c) {",
-        "  c.m1();",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  void m1() {}
+}
+class B extends Object with A {
+}
+class C extends B {
+}
+f(C c) {
+  c.m1();
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_methodCascades() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  void m1() {}",
-        "  void m2() {}",
-        "  void m() {",
-        "    A a = new A();",
-        "    a..m1()",
-        "     ..m2();",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  void m1() {}
+  void m2() {}
+  void m() {
+    A a = new A();
+    a..m1()
+     ..m2();
+  }
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_methodCascades_withSetter() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  String name;",
-        "  void m1() {}",
-        "  void m2() {}",
-        "  void m() {",
-        "    A a = new A();",
-        "    a..m1()",
-        "     ..name = 'name'",
-        "     ..m2();",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  String name;
+  void m1() {}
+  void m2() {}
+  void m() {
+    A a = new A();
+    a..m1()
+     ..name = 'name'
+     ..m2();
+  }
+}''');
     resolve(source);
     // failing with error code: INVOCATION_OF_NON_FUNCTION
     assertNoErrors(source);
@@ -7390,28 +7653,37 @@
   }
 
   void test_resolveAgainstNull() {
-    Source source = addSource(EngineTestCase.createSource(["f(var p) {", "  return null == p;", "}"]));
+    Source source = addSource(r'''
+f(var p) {
+  return null == p;
+}''');
     resolve(source);
     assertNoErrors(source);
   }
 
   void test_setter_inherited() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  int get x => 0;",
-        "  set x(int p) {}",
-        "}",
-        "class B extends A {",
-        "  int get x => super.x == null ? 0 : super.x;",
-        "  int f() => x = 1;",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  int get x => 0;
+  set x(int p) {}
+}
+class B extends A {
+  int get x => super.x == null ? 0 : super.x;
+  int f() => x = 1;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_setter_static() {
-    Source source = addSource(EngineTestCase.createSource(["set s(x) {", "}", "", "main() {", "  s = 123;", "}"]));
+    Source source = addSource(r'''
+set s(x) {
+}
+
+main() {
+  s = 123;
+}''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -7440,11 +7712,11 @@
    */
   void _validateArgumentResolution(Source source, List<int> indices) {
     LibraryElement library = resolve(source);
-    JUnitTestCase.assertNotNull(library);
+    expect(library, isNotNull);
     ClassElement classElement = library.definingCompilationUnit.types[0];
     List<ParameterElement> parameters = classElement.methods[1].parameters;
     CompilationUnit unit = resolveCompilationUnit(source, library);
-    JUnitTestCase.assertNotNull(unit);
+    expect(unit, isNotNull);
     ClassDeclaration classDeclaration = unit.declarations[0] as ClassDeclaration;
     MethodDeclaration methodDeclaration = classDeclaration.members[0] as MethodDeclaration;
     Block block = (methodDeclaration.body as BlockFunctionBody).block;
@@ -7452,15 +7724,15 @@
     MethodInvocation invocation = statement.expression as MethodInvocation;
     NodeList<Expression> arguments = invocation.argumentList.arguments;
     int argumentCount = arguments.length;
-    JUnitTestCase.assertEquals(indices.length, argumentCount);
+    expect(argumentCount, indices.length);
     for (int i = 0; i < argumentCount; i++) {
       Expression argument = arguments[i];
       ParameterElement element = argument.staticParameterElement;
       int index = indices[i];
       if (index < 0) {
-        JUnitTestCase.assertNull(element);
+        expect(element, isNull);
       } else {
-        JUnitTestCase.assertSame(parameters[index], element);
+        expect(element, same(parameters[index]));
       }
     }
   }
@@ -7493,17 +7765,17 @@
   TestTypeProvider _typeProvider;
 
   void fail_visitFunctionExpressionInvocation() {
-    JUnitTestCase.fail("Not yet tested");
+    fail("Not yet tested");
     _listener.assertNoErrors();
   }
 
   void fail_visitMethodInvocation() {
-    JUnitTestCase.fail("Not yet tested");
+    fail("Not yet tested");
     _listener.assertNoErrors();
   }
 
   void fail_visitSimpleIdentifier() {
-    JUnitTestCase.fail("Not yet tested");
+    fail("Not yet tested");
     _listener.assertNoErrors();
   }
 
@@ -7517,7 +7789,7 @@
   void test_visitAdjacentStrings() {
     // "a" "b"
     Expression node = AstFactory.adjacentStrings([_resolvedString("a"), _resolvedString("b")]);
-    JUnitTestCase.assertSame(_typeProvider.stringType, _analyze(node));
+    expect(_analyze(node), same(_typeProvider.stringType));
     _listener.assertNoErrors();
   }
 
@@ -7528,7 +7800,7 @@
     InterfaceType superclassType = superclass.type;
     ClassElement subclass = ElementFactory.classElement("B", superclassType, []);
     Expression node = AstFactory.asExpression(AstFactory.thisExpression(), AstFactory.typeName(subclass, []));
-    JUnitTestCase.assertSame(subclass.type, _analyze3(node, superclassType));
+    expect(_analyze3(node, superclassType), same(subclass.type));
     _listener.assertNoErrors();
   }
 
@@ -7539,7 +7811,7 @@
     AssignmentExpression node = AstFactory.assignmentExpression(identifier, TokenType.PLUS_EQ, _resolvedInteger(1));
     MethodElement plusMethod = getMethod(numType, "+");
     node.staticElement = plusMethod;
-    JUnitTestCase.assertSame(numType, _analyze(node));
+    expect(_analyze(node), same(numType));
     _listener.assertNoErrors();
   }
 
@@ -7547,35 +7819,35 @@
     // i = 0
     InterfaceType intType = _typeProvider.intType;
     Expression node = AstFactory.assignmentExpression(_resolvedVariable(intType, "i"), TokenType.EQ, _resolvedInteger(0));
-    JUnitTestCase.assertSame(intType, _analyze(node));
+    expect(_analyze(node), same(intType));
     _listener.assertNoErrors();
   }
 
   void test_visitBinaryExpression_equals() {
     // 2 == 3
     Expression node = AstFactory.binaryExpression(_resolvedInteger(2), TokenType.EQ_EQ, _resolvedInteger(3));
-    JUnitTestCase.assertSame(_typeProvider.boolType, _analyze(node));
+    expect(_analyze(node), same(_typeProvider.boolType));
     _listener.assertNoErrors();
   }
 
   void test_visitBinaryExpression_logicalAnd() {
     // false && true
     Expression node = AstFactory.binaryExpression(AstFactory.booleanLiteral(false), TokenType.AMPERSAND_AMPERSAND, AstFactory.booleanLiteral(true));
-    JUnitTestCase.assertSame(_typeProvider.boolType, _analyze(node));
+    expect(_analyze(node), same(_typeProvider.boolType));
     _listener.assertNoErrors();
   }
 
   void test_visitBinaryExpression_logicalOr() {
     // false || true
     Expression node = AstFactory.binaryExpression(AstFactory.booleanLiteral(false), TokenType.BAR_BAR, AstFactory.booleanLiteral(true));
-    JUnitTestCase.assertSame(_typeProvider.boolType, _analyze(node));
+    expect(_analyze(node), same(_typeProvider.boolType));
     _listener.assertNoErrors();
   }
 
   void test_visitBinaryExpression_notEquals() {
     // 2 != 3
     Expression node = AstFactory.binaryExpression(_resolvedInteger(2), TokenType.BANG_EQ, _resolvedInteger(3));
-    JUnitTestCase.assertSame(_typeProvider.boolType, _analyze(node));
+    expect(_analyze(node), same(_typeProvider.boolType));
     _listener.assertNoErrors();
   }
 
@@ -7583,7 +7855,7 @@
     // 1 + 2.0
     BinaryExpression node = AstFactory.binaryExpression(_resolvedInteger(1), TokenType.PLUS, _resolvedDouble(2.0));
     node.staticElement = getMethod(_typeProvider.numType, "+");
-    JUnitTestCase.assertSame(_typeProvider.doubleType, _analyze(node));
+    expect(_analyze(node), same(_typeProvider.doubleType));
     _listener.assertNoErrors();
   }
 
@@ -7591,7 +7863,7 @@
     // 1 + 2
     BinaryExpression node = AstFactory.binaryExpression(_resolvedInteger(1), TokenType.PLUS, _resolvedInteger(2));
     node.staticElement = getMethod(_typeProvider.numType, "+");
-    JUnitTestCase.assertSame(_typeProvider.intType, _analyze(node));
+    expect(_analyze(node), same(_typeProvider.intType));
     _listener.assertNoErrors();
   }
 
@@ -7599,7 +7871,7 @@
     // 2 / 2
     BinaryExpression node = AstFactory.binaryExpression(_resolvedInteger(2), TokenType.SLASH, _resolvedInteger(2));
     node.staticElement = getMethod(_typeProvider.numType, "/");
-    JUnitTestCase.assertSame(_typeProvider.doubleType, _analyze(node));
+    expect(_analyze(node), same(_typeProvider.doubleType));
     _listener.assertNoErrors();
   }
 
@@ -7614,7 +7886,7 @@
     classA.methods = <MethodElement> [operator];
     BinaryExpression node = AstFactory.binaryExpression(AstFactory.asExpression(AstFactory.identifier3("a"), AstFactory.typeName(classA, [])), TokenType.PLUS, _resolvedDouble(2.0));
     node.staticElement = operator;
-    JUnitTestCase.assertSame(typeA, _analyze(node));
+    expect(_analyze(node), same(typeA));
     _listener.assertNoErrors();
   }
 
@@ -7622,49 +7894,49 @@
     // 1 * 2.0
     BinaryExpression node = AstFactory.binaryExpression(_resolvedInteger(1), TokenType.PLUS, _resolvedDouble(2.0));
     node.staticElement = getMethod(_typeProvider.numType, "*");
-    JUnitTestCase.assertSame(_typeProvider.doubleType, _analyze(node));
+    expect(_analyze(node), same(_typeProvider.doubleType));
     _listener.assertNoErrors();
   }
 
   void test_visitBooleanLiteral_false() {
     // false
     Expression node = AstFactory.booleanLiteral(false);
-    JUnitTestCase.assertSame(_typeProvider.boolType, _analyze(node));
+    expect(_analyze(node), same(_typeProvider.boolType));
     _listener.assertNoErrors();
   }
 
   void test_visitBooleanLiteral_true() {
     // true
     Expression node = AstFactory.booleanLiteral(true);
-    JUnitTestCase.assertSame(_typeProvider.boolType, _analyze(node));
+    expect(_analyze(node), same(_typeProvider.boolType));
     _listener.assertNoErrors();
   }
 
   void test_visitCascadeExpression() {
     // a..length
     Expression node = AstFactory.cascadeExpression(_resolvedString("a"), [AstFactory.propertyAccess2(null, "length")]);
-    JUnitTestCase.assertSame(_typeProvider.stringType, _analyze(node));
+    expect(_analyze(node), same(_typeProvider.stringType));
     _listener.assertNoErrors();
   }
 
   void test_visitConditionalExpression_differentTypes() {
     // true ? 1.0 : 0
     Expression node = AstFactory.conditionalExpression(AstFactory.booleanLiteral(true), _resolvedDouble(1.0), _resolvedInteger(0));
-    JUnitTestCase.assertSame(_typeProvider.numType, _analyze(node));
+    expect(_analyze(node), same(_typeProvider.numType));
     _listener.assertNoErrors();
   }
 
   void test_visitConditionalExpression_sameTypes() {
     // true ? 1 : 0
     Expression node = AstFactory.conditionalExpression(AstFactory.booleanLiteral(true), _resolvedInteger(1), _resolvedInteger(0));
-    JUnitTestCase.assertSame(_typeProvider.intType, _analyze(node));
+    expect(_analyze(node), same(_typeProvider.intType));
     _listener.assertNoErrors();
   }
 
   void test_visitDoubleLiteral() {
     // 4.33
     Expression node = AstFactory.doubleLiteral(4.33);
-    JUnitTestCase.assertSame(_typeProvider.doubleType, _analyze(node));
+    expect(_analyze(node), same(_typeProvider.doubleType));
     _listener.assertNoErrors();
   }
 
@@ -7824,7 +8096,7 @@
     IndexExpression node = AstFactory.indexExpression(identifier, _resolvedInteger(2));
     MethodElement indexMethod = listType.element.methods[0];
     node.staticElement = indexMethod;
-    JUnitTestCase.assertSame(listType.typeArguments[0], _analyze(node));
+    expect(_analyze(node), same(listType.typeArguments[0]));
     _listener.assertNoErrors();
   }
 
@@ -7837,7 +8109,7 @@
     MethodElement indexMethod = listType.element.methods[1];
     node.staticElement = indexMethod;
     AstFactory.assignmentExpression(node, TokenType.EQ, AstFactory.integer(0));
-    JUnitTestCase.assertSame(listType.typeArguments[0], _analyze(node));
+    expect(_analyze(node), same(listType.typeArguments[0]));
     _listener.assertNoErrors();
   }
 
@@ -7857,7 +8129,7 @@
     MethodElement indexMethod = MethodMember.from(methodElement, listOfIntType);
     indexExpression.staticElement = indexMethod;
     // analyze and assert result of the index expression
-    JUnitTestCase.assertSame(intType, _analyze(indexExpression));
+    expect(_analyze(indexExpression), same(intType));
     _listener.assertNoErrors();
   }
 
@@ -7879,7 +8151,7 @@
     // list[0] should be in a setter context
     AstFactory.assignmentExpression(indexExpression, TokenType.EQ, AstFactory.integer(0));
     // analyze and assert result of the index expression
-    JUnitTestCase.assertSame(intType, _analyze(indexExpression));
+    expect(_analyze(indexExpression), same(intType));
     _listener.assertNoErrors();
   }
 
@@ -7894,7 +8166,7 @@
     classElement.constructors = <ConstructorElement> [constructor];
     InstanceCreationExpression node = AstFactory.instanceCreationExpression2(null, AstFactory.typeName(classElement, []), [AstFactory.identifier3(constructorName)]);
     node.staticElement = constructor;
-    JUnitTestCase.assertSame(classElement.type, _analyze(node));
+    expect(_analyze(node), same(classElement.type));
     _listener.assertNoErrors();
   }
 
@@ -7913,8 +8185,8 @@
     node.staticElement = constructor;
     InterfaceType interfaceType = _analyze(node) as InterfaceType;
     List<DartType> typeArgs = interfaceType.typeArguments;
-    JUnitTestCase.assertEquals(1, typeArgs.length);
-    JUnitTestCase.assertEquals(elementI.type, typeArgs[0]);
+    expect(typeArgs.length, 1);
+    expect(typeArgs[0], elementI.type);
     _listener.assertNoErrors();
   }
 
@@ -7928,28 +8200,28 @@
     classElement.constructors = <ConstructorElement> [constructor];
     InstanceCreationExpression node = AstFactory.instanceCreationExpression2(null, AstFactory.typeName(classElement, []), []);
     node.staticElement = constructor;
-    JUnitTestCase.assertSame(classElement.type, _analyze(node));
+    expect(_analyze(node), same(classElement.type));
     _listener.assertNoErrors();
   }
 
   void test_visitIntegerLiteral() {
     // 42
     Expression node = _resolvedInteger(42);
-    JUnitTestCase.assertSame(_typeProvider.intType, _analyze(node));
+    expect(_analyze(node), same(_typeProvider.intType));
     _listener.assertNoErrors();
   }
 
   void test_visitIsExpression_negated() {
     // a is! String
     Expression node = AstFactory.isExpression(_resolvedString("a"), true, AstFactory.typeName4("String", []));
-    JUnitTestCase.assertSame(_typeProvider.boolType, _analyze(node));
+    expect(_analyze(node), same(_typeProvider.boolType));
     _listener.assertNoErrors();
   }
 
   void test_visitIsExpression_notNegated() {
     // a is String
     Expression node = AstFactory.isExpression(_resolvedString("a"), false, AstFactory.typeName4("String", []));
-    JUnitTestCase.assertSame(_typeProvider.boolType, _analyze(node));
+    expect(_analyze(node), same(_typeProvider.boolType));
     _listener.assertNoErrors();
   }
 
@@ -7995,35 +8267,35 @@
   void test_visitNamedExpression() {
     // n: a
     Expression node = AstFactory.namedExpression2("n", _resolvedString("a"));
-    JUnitTestCase.assertSame(_typeProvider.stringType, _analyze(node));
+    expect(_analyze(node), same(_typeProvider.stringType));
     _listener.assertNoErrors();
   }
 
   void test_visitNullLiteral() {
     // null
     Expression node = AstFactory.nullLiteral();
-    JUnitTestCase.assertSame(_typeProvider.bottomType, _analyze(node));
+    expect(_analyze(node), same(_typeProvider.bottomType));
     _listener.assertNoErrors();
   }
 
   void test_visitParenthesizedExpression() {
     // (0)
     Expression node = AstFactory.parenthesizedExpression(_resolvedInteger(0));
-    JUnitTestCase.assertSame(_typeProvider.intType, _analyze(node));
+    expect(_analyze(node), same(_typeProvider.intType));
     _listener.assertNoErrors();
   }
 
   void test_visitPostfixExpression_minusMinus() {
     // 0--
     PostfixExpression node = AstFactory.postfixExpression(_resolvedInteger(0), TokenType.MINUS_MINUS);
-    JUnitTestCase.assertSame(_typeProvider.intType, _analyze(node));
+    expect(_analyze(node), same(_typeProvider.intType));
     _listener.assertNoErrors();
   }
 
   void test_visitPostfixExpression_plusPlus() {
     // 0++
     PostfixExpression node = AstFactory.postfixExpression(_resolvedInteger(0), TokenType.PLUS_PLUS);
-    JUnitTestCase.assertSame(_typeProvider.intType, _analyze(node));
+    expect(_analyze(node), same(_typeProvider.intType));
     _listener.assertNoErrors();
   }
 
@@ -8032,7 +8304,7 @@
     PropertyAccessorElementImpl getter = ElementFactory.getterElement("b", false, boolType);
     PrefixedIdentifier node = AstFactory.identifier5("a", "b");
     node.identifier.staticElement = getter;
-    JUnitTestCase.assertSame(boolType, _analyze(node));
+    expect(_analyze(node), same(boolType));
     _listener.assertNoErrors();
   }
 
@@ -8042,7 +8314,7 @@
     PropertyAccessorElement setter = field.setter;
     PrefixedIdentifier node = AstFactory.identifier5("a", "b");
     node.identifier.staticElement = setter;
-    JUnitTestCase.assertSame(boolType, _analyze(node));
+    expect(_analyze(node), same(boolType));
     _listener.assertNoErrors();
   }
 
@@ -8051,14 +8323,14 @@
     variable.type = _typeProvider.boolType;
     PrefixedIdentifier node = AstFactory.identifier5("a", "b");
     node.identifier.staticElement = variable;
-    JUnitTestCase.assertSame(_typeProvider.boolType, _analyze(node));
+    expect(_analyze(node), same(_typeProvider.boolType));
     _listener.assertNoErrors();
   }
 
   void test_visitPrefixExpression_bang() {
     // !0
     PrefixExpression node = AstFactory.prefixExpression(TokenType.BANG, _resolvedInteger(0));
-    JUnitTestCase.assertSame(_typeProvider.boolType, _analyze(node));
+    expect(_analyze(node), same(_typeProvider.boolType));
     _listener.assertNoErrors();
   }
 
@@ -8067,7 +8339,7 @@
     PrefixExpression node = AstFactory.prefixExpression(TokenType.MINUS, _resolvedInteger(0));
     MethodElement minusMethod = getMethod(_typeProvider.numType, "-");
     node.staticElement = minusMethod;
-    JUnitTestCase.assertSame(_typeProvider.numType, _analyze(node));
+    expect(_analyze(node), same(_typeProvider.numType));
     _listener.assertNoErrors();
   }
 
@@ -8076,14 +8348,14 @@
     PrefixExpression node = AstFactory.prefixExpression(TokenType.MINUS_MINUS, _resolvedInteger(0));
     MethodElement minusMethod = getMethod(_typeProvider.numType, "-");
     node.staticElement = minusMethod;
-    JUnitTestCase.assertSame(_typeProvider.intType, _analyze(node));
+    expect(_analyze(node), same(_typeProvider.intType));
     _listener.assertNoErrors();
   }
 
   void test_visitPrefixExpression_not() {
     // !true
     Expression node = AstFactory.prefixExpression(TokenType.BANG, AstFactory.booleanLiteral(true));
-    JUnitTestCase.assertSame(_typeProvider.boolType, _analyze(node));
+    expect(_analyze(node), same(_typeProvider.boolType));
     _listener.assertNoErrors();
   }
 
@@ -8092,7 +8364,7 @@
     PrefixExpression node = AstFactory.prefixExpression(TokenType.PLUS_PLUS, _resolvedInteger(0));
     MethodElement plusMethod = getMethod(_typeProvider.numType, "+");
     node.staticElement = plusMethod;
-    JUnitTestCase.assertSame(_typeProvider.intType, _analyze(node));
+    expect(_analyze(node), same(_typeProvider.intType));
     _listener.assertNoErrors();
   }
 
@@ -8101,7 +8373,7 @@
     PrefixExpression node = AstFactory.prefixExpression(TokenType.TILDE, _resolvedInteger(0));
     MethodElement tildeMethod = getMethod(_typeProvider.intType, "~");
     node.staticElement = tildeMethod;
-    JUnitTestCase.assertSame(_typeProvider.intType, _analyze(node));
+    expect(_analyze(node), same(_typeProvider.intType));
     _listener.assertNoErrors();
   }
 
@@ -8110,7 +8382,7 @@
     PropertyAccessorElementImpl getter = ElementFactory.getterElement("b", false, boolType);
     PropertyAccess node = AstFactory.propertyAccess2(AstFactory.identifier3("a"), "b");
     node.propertyName.propagatedElement = getter;
-    JUnitTestCase.assertSame(boolType, _analyze2(node, false));
+    expect(_analyze2(node, false), same(boolType));
     _listener.assertNoErrors();
   }
 
@@ -8120,7 +8392,7 @@
     PropertyAccessorElement setter = field.setter;
     PropertyAccess node = AstFactory.propertyAccess2(AstFactory.identifier3("a"), "b");
     node.propertyName.propagatedElement = setter;
-    JUnitTestCase.assertSame(boolType, _analyze2(node, false));
+    expect(_analyze2(node, false), same(boolType));
     _listener.assertNoErrors();
   }
 
@@ -8129,7 +8401,7 @@
     PropertyAccessorElementImpl getter = ElementFactory.getterElement("b", false, boolType);
     PropertyAccess node = AstFactory.propertyAccess2(AstFactory.identifier3("a"), "b");
     node.propertyName.staticElement = getter;
-    JUnitTestCase.assertSame(boolType, _analyze(node));
+    expect(_analyze(node), same(boolType));
     _listener.assertNoErrors();
   }
 
@@ -8139,14 +8411,14 @@
     PropertyAccessorElement setter = field.setter;
     PropertyAccess node = AstFactory.propertyAccess2(AstFactory.identifier3("a"), "b");
     node.propertyName.staticElement = setter;
-    JUnitTestCase.assertSame(boolType, _analyze(node));
+    expect(_analyze(node), same(boolType));
     _listener.assertNoErrors();
   }
 
   void test_visitSimpleStringLiteral() {
     // "a"
     Expression node = _resolvedString("a");
-    JUnitTestCase.assertSame(_typeProvider.stringType, _analyze(node));
+    expect(_analyze(node), same(_typeProvider.stringType));
     _listener.assertNoErrors();
   }
 
@@ -8156,7 +8428,7 @@
         AstFactory.interpolationString("a", "a"),
         AstFactory.interpolationExpression(_resolvedString("b")),
         AstFactory.interpolationString("c", "c")]);
-    JUnitTestCase.assertSame(_typeProvider.stringType, _analyze(node));
+    expect(_analyze(node), same(_typeProvider.stringType));
     _listener.assertNoErrors();
   }
 
@@ -8165,33 +8437,33 @@
     InterfaceType superType = ElementFactory.classElement2("A", []).type;
     InterfaceType thisType = ElementFactory.classElement("B", superType, []).type;
     Expression node = AstFactory.superExpression();
-    JUnitTestCase.assertSame(thisType, _analyze3(node, thisType));
+    expect(_analyze3(node, thisType), same(thisType));
     _listener.assertNoErrors();
   }
 
   void test_visitSymbolLiteral() {
-    JUnitTestCase.assertSame(_typeProvider.symbolType, _analyze(AstFactory.symbolLiteral(["a"])));
+    expect(_analyze(AstFactory.symbolLiteral(["a"])), same(_typeProvider.symbolType));
   }
 
   void test_visitThisExpression() {
     // this
     InterfaceType thisType = ElementFactory.classElement("B", ElementFactory.classElement2("A", []).type, []).type;
     Expression node = AstFactory.thisExpression();
-    JUnitTestCase.assertSame(thisType, _analyze3(node, thisType));
+    expect(_analyze3(node, thisType), same(thisType));
     _listener.assertNoErrors();
   }
 
   void test_visitThrowExpression_withoutValue() {
     // throw
     Expression node = AstFactory.throwExpression();
-    JUnitTestCase.assertSame(_typeProvider.bottomType, _analyze(node));
+    expect(_analyze(node), same(_typeProvider.bottomType));
     _listener.assertNoErrors();
   }
 
   void test_visitThrowExpression_withValue() {
     // throw 0
     Expression node = AstFactory.throwExpression2(_resolvedInteger(0));
-    JUnitTestCase.assertSame(_typeProvider.bottomType, _analyze(node));
+    expect(_analyze(node), same(_typeProvider.bottomType));
     _listener.assertNoErrors();
   }
 
@@ -8275,43 +8547,43 @@
     FunctionType functionType = actualType as FunctionType;
     List<DartType> normalTypes = functionType.normalParameterTypes;
     if (expectedNormalTypes == null) {
-      EngineTestCase.assertLength(0, normalTypes);
+      expect(normalTypes, hasLength(0));
     } else {
       int expectedCount = expectedNormalTypes.length;
-      EngineTestCase.assertLength(expectedCount, normalTypes);
+      expect(normalTypes, hasLength(expectedCount));
       for (int i = 0; i < expectedCount; i++) {
-        JUnitTestCase.assertSame(expectedNormalTypes[i], normalTypes[i]);
+        expect(normalTypes[i], same(expectedNormalTypes[i]));
       }
     }
     List<DartType> optionalTypes = functionType.optionalParameterTypes;
     if (expectedOptionalTypes == null) {
-      EngineTestCase.assertLength(0, optionalTypes);
+      expect(optionalTypes, hasLength(0));
     } else {
       int expectedCount = expectedOptionalTypes.length;
-      EngineTestCase.assertLength(expectedCount, optionalTypes);
+      expect(optionalTypes, hasLength(expectedCount));
       for (int i = 0; i < expectedCount; i++) {
-        JUnitTestCase.assertSame(expectedOptionalTypes[i], optionalTypes[i]);
+        expect(optionalTypes[i], same(expectedOptionalTypes[i]));
       }
     }
     Map<String, DartType> namedTypes = functionType.namedParameterTypes;
     if (expectedNamedTypes == null) {
-      EngineTestCase.assertSizeOfMap(0, namedTypes);
+      expect(namedTypes, hasLength(0));
     } else {
-      EngineTestCase.assertSizeOfMap(expectedNamedTypes.length, namedTypes);
-      for (MapEntry<String, DartType> entry in getMapEntrySet(expectedNamedTypes)) {
-        JUnitTestCase.assertSame(entry.getValue(), namedTypes[entry.getKey()]);
-      }
+      expect(namedTypes, hasLength(expectedNamedTypes.length));
+      expectedNamedTypes.forEach((String name, DartType type) {
+        expect(namedTypes[name], same(type));
+      });
     }
-    JUnitTestCase.assertSame(expectedReturnType, functionType.returnType);
+    expect(functionType.returnType, same(expectedReturnType));
   }
 
   void _assertType(InterfaceTypeImpl expectedType, InterfaceTypeImpl actualType) {
-    JUnitTestCase.assertEquals(expectedType.displayName, actualType.displayName);
-    JUnitTestCase.assertEquals(expectedType.element, actualType.element);
+    expect(actualType.displayName, expectedType.displayName);
+    expect(actualType.element, expectedType.element);
     List<DartType> expectedArguments = expectedType.typeArguments;
     int length = expectedArguments.length;
     List<DartType> actualArguments = actualType.typeArguments;
-    EngineTestCase.assertLength(length, actualArguments);
+    expect(actualArguments, hasLength(length));
     for (int i = 0; i < length; i++) {
       _assertType2(expectedArguments[i], actualArguments[i]);
     }
@@ -8383,7 +8655,7 @@
     }
     FunctionExpression node = AstFactory.functionExpression2(parameters, body);
     FunctionElementImpl element = new FunctionElementImpl.forNode(null);
-    element.parameters = new List.from(parameterElements);
+    element.parameters = parameterElements;
     element.type = new FunctionTypeImpl.con1(element);
     node.element = element;
     return node;
@@ -8467,7 +8739,7 @@
     // "foo" should be resolved to the "Foo" type
     SimpleIdentifier identifier = _findIdentifier("foo();");
     DartType type = identifier.staticType;
-    _ut.expect(type, new _ut.isInstanceOf<FunctionType>());
+    expect(type, new isInstanceOf<FunctionType>());
   }
 
   void test_MethodInvocation_nameType_parameter_FunctionTypeAlias() {
@@ -8481,7 +8753,7 @@
     // "foo" should be resolved to the "Foo" type
     SimpleIdentifier identifier = _findIdentifier("foo();");
     DartType type = identifier.staticType;
-    _ut.expect(type, new _ut.isInstanceOf<FunctionType>());
+    expect(type, new isInstanceOf<FunctionType>());
   }
 
   void test_MethodInvocation_nameType_parameter_propagatedType() {
@@ -8495,11 +8767,11 @@
 """;
     _resolveTestUnit(code);
     SimpleIdentifier identifier = _findIdentifier("p()");
-    _ut.expect(identifier.staticType, DynamicTypeImpl.instance);
+    expect(identifier.staticType, DynamicTypeImpl.instance);
     {
       FunctionType type = identifier.propagatedType;
-      _ut.expect(type, _ut.isNotNull);
-      _ut.expect(type.name, 'Foo');
+      expect(type, isNotNull);
+      expect(type.name, 'Foo');
     }
   }
 
@@ -8563,64 +8835,64 @@
    */
   void assertResolved() {
     if (!_unresolvedExpressions.isEmpty || !_unresolvedTypes.isEmpty) {
-      PrintStringWriter writer = new PrintStringWriter();
+      StringBuffer buffer = new StringBuffer();
       int unresolvedTypeCount = _unresolvedTypes.length;
       if (unresolvedTypeCount > 0) {
-        writer.print("Failed to resolve ");
-        writer.print(unresolvedTypeCount);
-        writer.print(" of ");
-        writer.print(_resolvedTypeCount + unresolvedTypeCount);
-        writer.println(" type names:");
+        buffer.write("Failed to resolve ");
+        buffer.write(unresolvedTypeCount);
+        buffer.write(" of ");
+        buffer.write(_resolvedTypeCount + unresolvedTypeCount);
+        buffer.writeln(" type names:");
         for (TypeName identifier in _unresolvedTypes) {
-          writer.print("  ");
-          writer.print(identifier.toString());
-          writer.print(" (");
-          writer.print(_getFileName(identifier));
-          writer.print(" : ");
-          writer.print(identifier.offset);
-          writer.println(")");
+          buffer.write("  ");
+          buffer.write(identifier.toString());
+          buffer.write(" (");
+          buffer.write(_getFileName(identifier));
+          buffer.write(" : ");
+          buffer.write(identifier.offset);
+          buffer.writeln(")");
         }
       }
       int unresolvedExpressionCount = _unresolvedExpressions.length;
       if (unresolvedExpressionCount > 0) {
-        writer.println("Failed to resolve ");
-        writer.print(unresolvedExpressionCount);
-        writer.print(" of ");
-        writer.print(_resolvedExpressionCount + unresolvedExpressionCount);
-        writer.println(" expressions:");
+        buffer.writeln("Failed to resolve ");
+        buffer.write(unresolvedExpressionCount);
+        buffer.write(" of ");
+        buffer.write(_resolvedExpressionCount + unresolvedExpressionCount);
+        buffer.writeln(" expressions:");
         for (Expression expression in _unresolvedExpressions) {
-          writer.print("  ");
-          writer.print(expression.toString());
-          writer.print(" (");
-          writer.print(_getFileName(expression));
-          writer.print(" : ");
-          writer.print(expression.offset);
-          writer.println(")");
+          buffer.write("  ");
+          buffer.write(expression.toString());
+          buffer.write(" (");
+          buffer.write(_getFileName(expression));
+          buffer.write(" : ");
+          buffer.write(expression.offset);
+          buffer.writeln(")");
         }
       }
       int invalidlyPropagatedExpressionCount = _invalidlyPropagatedExpressions.length;
       if (invalidlyPropagatedExpressionCount > 0) {
-        writer.println("Incorrectly propagated ");
-        writer.print(invalidlyPropagatedExpressionCount);
-        writer.print(" of ");
-        writer.print(_propagatedExpressionCount);
-        writer.println(" expressions:");
+        buffer.writeln("Incorrectly propagated ");
+        buffer.write(invalidlyPropagatedExpressionCount);
+        buffer.write(" of ");
+        buffer.write(_propagatedExpressionCount);
+        buffer.writeln(" expressions:");
         for (Expression expression in _invalidlyPropagatedExpressions) {
-          writer.print("  ");
-          writer.print(expression.toString());
-          writer.print(" [");
-          writer.print(expression.staticType.displayName);
-          writer.print(", ");
-          writer.print(expression.propagatedType.displayName);
-          writer.println("]");
-          writer.print("    ");
-          writer.print(_getFileName(expression));
-          writer.print(" : ");
-          writer.print(expression.offset);
-          writer.println(")");
+          buffer.write("  ");
+          buffer.write(expression.toString());
+          buffer.write(" [");
+          buffer.write(expression.staticType.displayName);
+          buffer.write(", ");
+          buffer.write(expression.propagatedType.displayName);
+          buffer.writeln("]");
+          buffer.write("    ");
+          buffer.write(_getFileName(expression));
+          buffer.write(" : ");
+          buffer.write(expression.offset);
+          buffer.writeln(")");
         }
       }
-      JUnitTestCase.fail(writer.toString());
+      fail(buffer.toString());
     }
   }
 
@@ -8734,13 +9006,13 @@
  */
 class StrictModeTest extends ResolverTestCase {
   void fail_for() {
-    Source source = addSource(EngineTestCase.createSource([
-        "int f(List<int> list) {",
-        "  num sum = 0;",
-        "  for (num i = 0; i < list.length; i++) {",
-        "    sum += list[i];",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+int f(List<int> list) {
+  num sum = 0;
+  for (num i = 0; i < list.length; i++) {
+    sum += list[i];
+  }
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
   }
@@ -8753,127 +9025,131 @@
   }
 
   void test_assert_is() {
-    Source source = addSource(EngineTestCase.createSource([
-        "int f(num n) {",
-        "  assert (n is int);",
-        "  return n & 0x0F;",
-        "}"]));
+    Source source = addSource(r'''
+int f(num n) {
+  assert (n is int);
+  return n & 0x0F;
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
   }
 
   void test_conditional_and_is() {
-    Source source = addSource(EngineTestCase.createSource([
-        "int f(num n) {",
-        "  return (n is int && n > 0) ? n & 0x0F : 0;",
-        "}"]));
+    Source source = addSource(r'''
+int f(num n) {
+  return (n is int && n > 0) ? n & 0x0F : 0;
+}''');
     resolve(source);
     assertNoErrors(source);
   }
 
   void test_conditional_is() {
-    Source source = addSource(EngineTestCase.createSource([
-        "int f(num n) {",
-        "  return (n is int) ? n & 0x0F : 0;",
-        "}"]));
+    Source source = addSource(r'''
+int f(num n) {
+  return (n is int) ? n & 0x0F : 0;
+}''');
     resolve(source);
     assertNoErrors(source);
   }
 
   void test_conditional_isNot() {
-    Source source = addSource(EngineTestCase.createSource([
-        "int f(num n) {",
-        "  return (n is! int) ? 0 : n & 0x0F;",
-        "}"]));
+    Source source = addSource(r'''
+int f(num n) {
+  return (n is! int) ? 0 : n & 0x0F;
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
   }
 
   void test_conditional_or_is() {
-    Source source = addSource(EngineTestCase.createSource([
-        "int f(num n) {",
-        "  return (n is! int || n < 0) ? 0 : n & 0x0F;",
-        "}"]));
+    Source source = addSource(r'''
+int f(num n) {
+  return (n is! int || n < 0) ? 0 : n & 0x0F;
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
   }
 
   void test_forEach() {
-    Source source = addSource(EngineTestCase.createSource([
-        "int f(List<int> list) {",
-        "  num sum = 0;",
-        "  for (num n in list) {",
-        "    sum += n & 0x0F;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+int f(List<int> list) {
+  num sum = 0;
+  for (num n in list) {
+    sum += n & 0x0F;
+  }
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
   }
 
   void test_if_and_is() {
-    Source source = addSource(EngineTestCase.createSource([
-        "int f(num n) {",
-        "  if (n is int && n > 0) {",
-        "    return n & 0x0F;",
-        "  }",
-        "  return 0;",
-        "}"]));
+    Source source = addSource(r'''
+int f(num n) {
+  if (n is int && n > 0) {
+    return n & 0x0F;
+  }
+  return 0;
+}''');
     resolve(source);
     assertNoErrors(source);
   }
 
   void test_if_is() {
-    Source source = addSource(EngineTestCase.createSource([
-        "int f(num n) {",
-        "  if (n is int) {",
-        "    return n & 0x0F;",
-        "  }",
-        "  return 0;",
-        "}"]));
+    Source source = addSource(r'''
+int f(num n) {
+  if (n is int) {
+    return n & 0x0F;
+  }
+  return 0;
+}''');
     resolve(source);
     assertNoErrors(source);
   }
 
   void test_if_isNot() {
-    Source source = addSource(EngineTestCase.createSource([
-        "int f(num n) {",
-        "  if (n is! int) {",
-        "    return 0;",
-        "  } else {",
-        "    return n & 0x0F;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+int f(num n) {
+  if (n is! int) {
+    return 0;
+  } else {
+    return n & 0x0F;
+  }
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
   }
 
   void test_if_isNot_abrupt() {
-    Source source = addSource(EngineTestCase.createSource([
-        "int f(num n) {",
-        "  if (n is! int) {",
-        "    return 0;",
-        "  }",
-        "  return n & 0x0F;",
-        "}"]));
+    Source source = addSource(r'''
+int f(num n) {
+  if (n is! int) {
+    return 0;
+  }
+  return n & 0x0F;
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
   }
 
   void test_if_or_is() {
-    Source source = addSource(EngineTestCase.createSource([
-        "int f(num n) {",
-        "  if (n is! int || n < 0) {",
-        "    return 0;",
-        "  } else {",
-        "    return n & 0x0F;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+int f(num n) {
+  if (n is! int || n < 0) {
+    return 0;
+  } else {
+    return n & 0x0F;
+  }
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
   }
 
   void test_localVar() {
-    Source source = addSource(EngineTestCase.createSource(["int f() {", "  num n = 1234;", "  return n & 0x0F;", "}"]));
+    Source source = addSource(r'''
+int f() {
+  num n = 1234;
+  return n & 0x0F;
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
   }
@@ -8901,8 +9177,8 @@
     _definingCompilationUnit.types = <ClassElement> [classA, classB];
     HashSet<ClassElement> subtypesOfA = _subtypeManager.computeAllSubtypes(classA);
     List<ClassElement> arraySubtypesOfA = new List.from(subtypesOfA);
-    EngineTestCase.assertSizeOfSet(2, subtypesOfA);
-    EngineTestCase.assertContains(arraySubtypesOfA, [classA, classB]);
+    expect(subtypesOfA, hasLength(2));
+    expect(arraySubtypesOfA, unorderedEquals([classA, classB]));
   }
 
   void test_computeAllSubtypes_manyRecursiveSubtypes() {
@@ -8923,10 +9199,10 @@
     List<ClassElement> arraySubtypesOfA = new List.from(subtypesOfA);
     HashSet<ClassElement> subtypesOfB = _subtypeManager.computeAllSubtypes(classB);
     List<ClassElement> arraySubtypesOfB = new List.from(subtypesOfB);
-    EngineTestCase.assertSizeOfSet(4, subtypesOfA);
-    EngineTestCase.assertContains(arraySubtypesOfA, [classB, classC, classD, classE]);
-    EngineTestCase.assertSizeOfSet(3, subtypesOfB);
-    EngineTestCase.assertContains(arraySubtypesOfB, [classC, classD, classE]);
+    expect(subtypesOfA, hasLength(4));
+    expect(arraySubtypesOfA, unorderedEquals([classB, classC, classD, classE]));
+    expect(subtypesOfB, hasLength(3));
+    expect(arraySubtypesOfB, unorderedEquals([classC, classD, classE]));
   }
 
   void test_computeAllSubtypes_noSubtypes() {
@@ -8936,7 +9212,7 @@
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     _definingCompilationUnit.types = <ClassElement> [classA];
     HashSet<ClassElement> subtypesOfA = _subtypeManager.computeAllSubtypes(classA);
-    EngineTestCase.assertSizeOfSet(0, subtypesOfA);
+    expect(subtypesOfA, hasLength(0));
   }
 
   void test_computeAllSubtypes_oneSubtype() {
@@ -8949,8 +9225,8 @@
     _definingCompilationUnit.types = <ClassElement> [classA, classB];
     HashSet<ClassElement> subtypesOfA = _subtypeManager.computeAllSubtypes(classA);
     List<ClassElement> arraySubtypesOfA = new List.from(subtypesOfA);
-    EngineTestCase.assertSizeOfSet(1, subtypesOfA);
-    EngineTestCase.assertContains(arraySubtypesOfA, [classB]);
+    expect(subtypesOfA, hasLength(1));
+    expect(arraySubtypesOfA, unorderedEquals([classB]));
   }
 
   @override
@@ -9411,7 +9687,7 @@
     TypeOverrideManager manager = new TypeOverrideManager();
     try {
       manager.exitScope();
-      JUnitTestCase.fail("Expected IllegalStateException");
+      fail("Expected IllegalStateException");
     } on IllegalStateException catch (exception) {
       // Expected
     }
@@ -9423,7 +9699,7 @@
     manager.exitScope();
     try {
       manager.exitScope();
-      JUnitTestCase.fail("Expected IllegalStateException");
+      fail("Expected IllegalStateException");
     } on IllegalStateException catch (exception) {
       // Expected
     }
@@ -9437,7 +9713,7 @@
     manager.exitScope();
     try {
       manager.exitScope();
-      JUnitTestCase.fail("Expected IllegalStateException");
+      fail("Expected IllegalStateException");
     } on IllegalStateException catch (exception) {
       // Expected
     }
@@ -9450,7 +9726,7 @@
     manager.enterScope();
     manager.setType(element, type);
     manager.enterScope();
-    JUnitTestCase.assertSame(type, manager.getType(element));
+    expect(manager.getType(element), same(type));
   }
 
   void test_getType_immediateOverride() {
@@ -9459,18 +9735,18 @@
     InterfaceType type = ElementFactory.classElement2("C", []).type;
     manager.enterScope();
     manager.setType(element, type);
-    JUnitTestCase.assertSame(type, manager.getType(element));
+    expect(manager.getType(element), same(type));
   }
 
   void test_getType_noOverride() {
     TypeOverrideManager manager = new TypeOverrideManager();
     manager.enterScope();
-    JUnitTestCase.assertNull(manager.getType(ElementFactory.localVariableElement2("v")));
+    expect(manager.getType(ElementFactory.localVariableElement2("v")), isNull);
   }
 
   void test_getType_noScope() {
     TypeOverrideManager manager = new TypeOverrideManager();
-    JUnitTestCase.assertNull(manager.getType(ElementFactory.localVariableElement2("v")));
+    expect(manager.getType(ElementFactory.localVariableElement2("v")), isNull);
   }
 }
 
@@ -9478,65 +9754,65 @@
 class TypePropagationTest extends ResolverTestCase {
   void fail_mergePropagatedTypesAtJoinPoint_1() {
     // https://code.google.com/p/dart/issues/detail?id=19929
-    _assertTypeOfMarkedExpression(EngineTestCase.createSource([
-        "f1(x) {",
-        "  var y = [];",
-        "  if (x) {",
-        "    y = 0;",
-        "  } else {",
-        "    y = '';",
-        "  }",
-        "  // Propagated type is [List] here: incorrect.",
-        "  // Best we can do is [Object]?",
-        "  return y; // marker",
-        "}"]), null, typeProvider.dynamicType);
+    _assertTypeOfMarkedExpression(r'''
+f1(x) {
+  var y = [];
+  if (x) {
+    y = 0;
+  } else {
+    y = '';
+  }
+  // Propagated type is [List] here: incorrect.
+  // Best we can do is [Object]?
+  return y; // marker
+}''', null, typeProvider.dynamicType);
   }
 
   void fail_mergePropagatedTypesAtJoinPoint_2() {
     // https://code.google.com/p/dart/issues/detail?id=19929
-    _assertTypeOfMarkedExpression(EngineTestCase.createSource([
-        "f2(x) {",
-        "  var y = [];",
-        "  if (x) {",
-        "    y = 0;",
-        "  } else {",
-        "  }",
-        "  // Propagated type is [List] here: incorrect.",
-        "  // Best we can do is [Object]?",
-        "  return y; // marker",
-        "}"]), null, typeProvider.dynamicType);
+    _assertTypeOfMarkedExpression(r'''
+f2(x) {
+  var y = [];
+  if (x) {
+    y = 0;
+  } else {
+  }
+  // Propagated type is [List] here: incorrect.
+  // Best we can do is [Object]?
+  return y; // marker
+}''', null, typeProvider.dynamicType);
   }
 
   void fail_mergePropagatedTypesAtJoinPoint_3() {
     // https://code.google.com/p/dart/issues/detail?id=19929
-    _assertTypeOfMarkedExpression(EngineTestCase.createSource([
-        "f4(x) {",
-        "  var y = [];",
-        "  if (x) {",
-        "    y = 0;",
-        "  } else {",
-        "    y = 1.5;",
-        "  }",
-        "  // Propagated type is [List] here: incorrect.",
-        "  // A correct answer is the least upper bound of [int] and [double],",
-        "  // i.e. [num].",
-        "  return y; // marker",
-        "}"]), null, typeProvider.numType);
+    _assertTypeOfMarkedExpression(r'''
+f4(x) {
+  var y = [];
+  if (x) {
+    y = 0;
+  } else {
+    y = 1.5;
+  }
+  // Propagated type is [List] here: incorrect.
+  // A correct answer is the least upper bound of [int] and [double],
+  // i.e. [num].
+  return y; // marker
+}''', null, typeProvider.numType);
   }
 
   void fail_mergePropagatedTypesAtJoinPoint_5() {
     // https://code.google.com/p/dart/issues/detail?id=19929
-    _assertTypeOfMarkedExpression(EngineTestCase.createSource([
-        "f6(x,y) {",
-        "  var z = [];",
-        "  if (x || (z = y) < 0) {",
-        "  } else {",
-        "    z = 0;",
-        "  }",
-        "  // Propagated type is [List] here: incorrect.",
-        "  // Best we can do is [Object]?",
-        "  return z; // marker",
-        "}"]), null, typeProvider.dynamicType);
+    _assertTypeOfMarkedExpression(r'''
+f6(x,y) {
+  var z = [];
+  if (x || (z = y) < 0) {
+  } else {
+    z = 0;
+  }
+  // Propagated type is [List] here: incorrect.
+  // Best we can do is [Object]?
+  return z; // marker
+}''', null, typeProvider.dynamicType);
   }
 
   void fail_mergePropagatedTypesAtJoinPoint_7() {
@@ -9546,25 +9822,25 @@
     //
     // This is like example 6, but less tricky: the code in the branch that
     // [continue]s is in effect after the [if].
-    String code = EngineTestCase.createSource([
-        "f() {",
-        "  var x = 0;",
-        "  var c = false;",
-        "  var d = true;",
-        "  while (d) {",
-        "    if (c) {",
-        "      d = false;",
-        "    } else {",
-        "      x = '';",
-        "      c = true;",
-        "      continue;",
-        "    }",
-        "    x; // marker",
-        "  }",
-        "}"]);
+    String code = r'''
+f() {
+  var x = 0;
+  var c = false;
+  var d = true;
+  while (d) {
+    if (c) {
+      d = false;
+    } else {
+      x = '';
+      c = true;
+      continue;
+    }
+    x; // marker
+  }
+}''';
     DartType t = _findMarkedIdentifier(code, "; // marker").propagatedType;
-    JUnitTestCase.assertTrue(typeProvider.intType.isSubtypeOf(t));
-    JUnitTestCase.assertTrue(typeProvider.stringType.isSubtypeOf(t));
+    expect(typeProvider.intType.isSubtypeOf(t), isTrue);
+    expect(typeProvider.stringType.isSubtypeOf(t), isTrue);
   }
 
   void fail_mergePropagatedTypesAtJoinPoint_8() {
@@ -9575,47 +9851,50 @@
     // This is a combination of 6 and 7: we use an unlabeled [break]
     // like a continue for the outer loop / like a labeled [break] to
     // jump just above the [if].
-    String code = EngineTestCase.createSource([
-        "f() {",
-        "  var x = 0;",
-        "  var c = false;",
-        "  var d = true;",
-        "  while (d) {",
-        "    while (d) {",
-        "      if (c) {",
-        "        d = false;",
-        "      } else {",
-        "        x = '';",
-        "        c = true;",
-        "        break;",
-        "      }",
-        "      x; // marker",
-        "    }",
-        "  }",
-        "}"]);
+    String code = r'''
+f() {
+  var x = 0;
+  var c = false;
+  var d = true;
+  while (d) {
+    while (d) {
+      if (c) {
+        d = false;
+      } else {
+        x = '';
+        c = true;
+        break;
+      }
+      x; // marker
+    }
+  }
+}''';
     DartType t = _findMarkedIdentifier(code, "; // marker").propagatedType;
-    JUnitTestCase.assertTrue(typeProvider.intType.isSubtypeOf(t));
-    JUnitTestCase.assertTrue(typeProvider.stringType.isSubtypeOf(t));
+    expect(typeProvider.intType.isSubtypeOf(t), isTrue);
+    expect(typeProvider.stringType.isSubtypeOf(t), isTrue);
   }
 
   void fail_propagatedReturnType_functionExpression() {
     // TODO(scheglov) disabled because we don't resolve function expression
-    String code = EngineTestCase.createSource(["main() {", "  var v = (() {return 42;})();", "}"]);
+    String code = r'''
+main() {
+  var v = (() {return 42;})();
+}''';
     _assertPropagatedReturnType(code, typeProvider.dynamicType, typeProvider.intType);
   }
 
   void test_as() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  bool get g => true;",
-        "}",
-        "A f(var p) {",
-        "  if ((p as A).g) {",
-        "    return p;",
-        "  } else {",
-        "    return null;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  bool get g => true;
+}
+A f(var p) {
+  if ((p as A).g) {
+    return p;
+  } else {
+    return null;
+  }
+}''');
     LibraryElement library = resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -9627,16 +9906,16 @@
     IfStatement ifStatement = body.block.statements[0] as IfStatement;
     ReturnStatement statement = (ifStatement.thenStatement as Block).statements[0] as ReturnStatement;
     SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
-    JUnitTestCase.assertSame(typeA, variableName.propagatedType);
+    expect(variableName.propagatedType, same(typeA));
   }
 
   void test_assert() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "A f(var p) {",
-        "  assert (p is A);",
-        "  return p;",
-        "}"]));
+    Source source = addSource(r'''
+class A {}
+A f(var p) {
+  assert (p is A);
+  return p;
+}''');
     LibraryElement library = resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -9647,11 +9926,16 @@
     BlockFunctionBody body = function.functionExpression.body as BlockFunctionBody;
     ReturnStatement statement = body.block.statements[1] as ReturnStatement;
     SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
-    JUnitTestCase.assertSame(typeA, variableName.propagatedType);
+    expect(variableName.propagatedType, same(typeA));
   }
 
   void test_assignment() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  var v;", "  v = 0;", "  return v;", "}"]));
+    Source source = addSource(r'''
+f() {
+  var v;
+  v = 0;
+  return v;
+}''');
     LibraryElement library = resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -9660,11 +9944,16 @@
     BlockFunctionBody body = function.functionExpression.body as BlockFunctionBody;
     ReturnStatement statement = body.block.statements[2] as ReturnStatement;
     SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
-    JUnitTestCase.assertSame(typeProvider.intType, variableName.propagatedType);
+    expect(variableName.propagatedType, same(typeProvider.intType));
   }
 
   void test_assignment_afterInitializer() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  var v = 0;", "  v = 1.0;", "  return v;", "}"]));
+    Source source = addSource(r'''
+f() {
+  var v = 0;
+  v = 1.0;
+  return v;
+}''');
     LibraryElement library = resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -9673,16 +9962,16 @@
     BlockFunctionBody body = function.functionExpression.body as BlockFunctionBody;
     ReturnStatement statement = body.block.statements[2] as ReturnStatement;
     SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
-    JUnitTestCase.assertSame(typeProvider.doubleType, variableName.propagatedType);
+    expect(variableName.propagatedType, same(typeProvider.doubleType));
   }
 
   void test_assignment_null() {
-    String code = EngineTestCase.createSource([
-        "main() {",
-        "  int v; // declare",
-        "  v = null;",
-        "  return v; // return",
-        "}"]);
+    String code = r'''
+main() {
+  int v; // declare
+  v = null;
+  return v; // return
+}''';
     CompilationUnit unit;
     {
       Source source = addSource(code);
@@ -9693,108 +9982,120 @@
     }
     {
       SimpleIdentifier identifier = EngineTestCase.findNode(unit, code, "v; // declare", (node) => node is SimpleIdentifier);
-      JUnitTestCase.assertSame(typeProvider.intType, identifier.staticType);
-      JUnitTestCase.assertSame(null, identifier.propagatedType);
+      expect(identifier.staticType, same(typeProvider.intType));
+      expect(identifier.propagatedType, same(null));
     }
     {
       SimpleIdentifier identifier = EngineTestCase.findNode(unit, code, "v = null;", (node) => node is SimpleIdentifier);
-      JUnitTestCase.assertSame(typeProvider.intType, identifier.staticType);
-      JUnitTestCase.assertSame(null, identifier.propagatedType);
+      expect(identifier.staticType, same(typeProvider.intType));
+      expect(identifier.propagatedType, same(null));
     }
     {
       SimpleIdentifier identifier = EngineTestCase.findNode(unit, code, "v; // return", (node) => node is SimpleIdentifier);
-      JUnitTestCase.assertSame(typeProvider.intType, identifier.staticType);
-      JUnitTestCase.assertSame(null, identifier.propagatedType);
+      expect(identifier.staticType, same(typeProvider.intType));
+      expect(identifier.propagatedType, same(null));
     }
   }
 
   void test_CanvasElement_getContext() {
-    String code = EngineTestCase.createSource([
-        "import 'dart:html';",
-        "main(CanvasElement canvas) {",
-        "  var context = canvas.getContext('2d');",
-        "}"]);
+    String code = r'''
+import 'dart:html';
+main(CanvasElement canvas) {
+  var context = canvas.getContext('2d');
+}''';
     Source source = addSource(code);
     LibraryElement library = resolve(source);
     assertNoErrors(source);
     verify([source]);
     CompilationUnit unit = resolveCompilationUnit(source, library);
     SimpleIdentifier identifier = EngineTestCase.findNode(unit, code, "context", (node) => node is SimpleIdentifier);
-    JUnitTestCase.assertEquals("CanvasRenderingContext2D", identifier.propagatedType.name);
+    expect(identifier.propagatedType.name, "CanvasRenderingContext2D");
   }
 
   void test_finalPropertyInducingVariable_classMember_instance() {
-    addNamedSource("/lib.dart", EngineTestCase.createSource(["class A {", "  final v = 0;", "}"]));
-    String code = EngineTestCase.createSource([
-        "import 'lib.dart';",
-        "f(A a) {",
-        "  return a.v; // marker",
-        "}"]);
+    addNamedSource("/lib.dart", r'''
+class A {
+  final v = 0;
+}''');
+    String code = r'''
+import 'lib.dart';
+f(A a) {
+  return a.v; // marker
+}''';
     _assertTypeOfMarkedExpression(code, typeProvider.dynamicType, typeProvider.intType);
   }
 
   void test_finalPropertyInducingVariable_classMember_instance_inherited() {
-    addNamedSource("/lib.dart", EngineTestCase.createSource(["class A {", "  final v = 0;", "}"]));
-    String code = EngineTestCase.createSource([
-        "import 'lib.dart';",
-        "class B extends A {",
-        "  m() {",
-        "    return v; // marker",
-        "  }",
-        "}"]);
+    addNamedSource("/lib.dart", r'''
+class A {
+  final v = 0;
+}''');
+    String code = r'''
+import 'lib.dart';
+class B extends A {
+  m() {
+    return v; // marker
+  }
+}''';
     _assertTypeOfMarkedExpression(code, typeProvider.dynamicType, typeProvider.intType);
   }
 
   void test_finalPropertyInducingVariable_classMember_instance_propagatedTarget() {
-    addNamedSource("/lib.dart", EngineTestCase.createSource(["class A {", "  final v = 0;", "}"]));
-    String code = EngineTestCase.createSource([
-        "import 'lib.dart';",
-        "f(p) {",
-        "  if (p is A) {",
-        "    return p.v; // marker",
-        "  }",
-        "}"]);
+    addNamedSource("/lib.dart", r'''
+class A {
+  final v = 0;
+}''');
+    String code = r'''
+import 'lib.dart';
+f(p) {
+  if (p is A) {
+    return p.v; // marker
+  }
+}''';
     _assertTypeOfMarkedExpression(code, typeProvider.dynamicType, typeProvider.intType);
   }
 
   void test_finalPropertyInducingVariable_classMember_static() {
-    addNamedSource("/lib.dart", EngineTestCase.createSource(["class A {", "  static final V = 0;", "}"]));
-    String code = EngineTestCase.createSource([
-        "import 'lib.dart';",
-        "f() {",
-        "  return A.V; // marker",
-        "}"]);
+    addNamedSource("/lib.dart", r'''
+class A {
+  static final V = 0;
+}''');
+    String code = r'''
+import 'lib.dart';
+f() {
+  return A.V; // marker
+}''';
     _assertTypeOfMarkedExpression(code, typeProvider.dynamicType, typeProvider.intType);
   }
 
   void test_finalPropertyInducingVariable_topLevelVaraible_prefixed() {
     addNamedSource("/lib.dart", "final V = 0;");
-    String code = EngineTestCase.createSource([
-        "import 'lib.dart' as p;",
-        "f() {",
-        "  var v2 = p.V; // marker prefixed",
-        "}"]);
+    String code = r'''
+import 'lib.dart' as p;
+f() {
+  var v2 = p.V; // marker prefixed
+}''';
     _assertTypeOfMarkedExpression(code, typeProvider.dynamicType, typeProvider.intType);
   }
 
   void test_finalPropertyInducingVariable_topLevelVaraible_simple() {
     addNamedSource("/lib.dart", "final V = 0;");
-    String code = EngineTestCase.createSource([
-        "import 'lib.dart';",
-        "f() {",
-        "  return V; // marker simple",
-        "}"]);
+    String code = r'''
+import 'lib.dart';
+f() {
+  return V; // marker simple
+}''';
     _assertTypeOfMarkedExpression(code, typeProvider.dynamicType, typeProvider.intType);
   }
 
   void test_forEach() {
-    String code = EngineTestCase.createSource([
-        "main() {",
-        "  var list = <String> [];",
-        "  for (var e in list) {",
-        "    e;",
-        "  }",
-        "}"]);
+    String code = r'''
+main() {
+  var list = <String> [];
+  for (var e in list) {
+    e;
+  }
+}''';
     Source source = addSource(code);
     LibraryElement library = resolve(source);
     assertNoErrors(source);
@@ -9804,26 +10105,26 @@
     // in the declaration
     {
       SimpleIdentifier identifier = EngineTestCase.findNode(unit, code, "e in", (node) => node is SimpleIdentifier);
-      JUnitTestCase.assertSame(stringType, identifier.propagatedType);
+      expect(identifier.propagatedType, same(stringType));
     }
     // in the loop body
     {
       SimpleIdentifier identifier = EngineTestCase.findNode(unit, code, "e;", (node) => node is SimpleIdentifier);
-      JUnitTestCase.assertSame(stringType, identifier.propagatedType);
+      expect(identifier.propagatedType, same(stringType));
     }
   }
 
   void test_functionExpression_asInvocationArgument() {
-    String code = EngineTestCase.createSource([
-        "class MyMap<K, V> {",
-        "  forEach(f(K key, V value)) {}",
-        "}",
-        "f(MyMap<int, String> m) {",
-        "  m.forEach((k, v) {",
-        "    k;",
-        "    v;",
-        "  });",
-        "}"]);
+    String code = r'''
+class MyMap<K, V> {
+  forEach(f(K key, V value)) {}
+}
+f(MyMap<int, String> m) {
+  m.forEach((k, v) {
+    k;
+    v;
+  });
+}''';
     Source source = addSource(code);
     LibraryElement library = resolve(source);
     assertNoErrors(source);
@@ -9832,28 +10133,28 @@
     // k
     DartType intType = typeProvider.intType;
     FormalParameter kParameter = EngineTestCase.findNode(unit, code, "k, ", (node) => node is SimpleFormalParameter);
-    JUnitTestCase.assertSame(intType, kParameter.identifier.propagatedType);
+    expect(kParameter.identifier.propagatedType, same(intType));
     SimpleIdentifier kIdentifier = EngineTestCase.findNode(unit, code, "k;", (node) => node is SimpleIdentifier);
-    JUnitTestCase.assertSame(intType, kIdentifier.propagatedType);
-    JUnitTestCase.assertSame(typeProvider.dynamicType, kIdentifier.staticType);
+    expect(kIdentifier.propagatedType, same(intType));
+    expect(kIdentifier.staticType, same(typeProvider.dynamicType));
     // v
     DartType stringType = typeProvider.stringType;
     FormalParameter vParameter = EngineTestCase.findNode(unit, code, "v)", (node) => node is SimpleFormalParameter);
-    JUnitTestCase.assertSame(stringType, vParameter.identifier.propagatedType);
+    expect(vParameter.identifier.propagatedType, same(stringType));
     SimpleIdentifier vIdentifier = EngineTestCase.findNode(unit, code, "v;", (node) => node is SimpleIdentifier);
-    JUnitTestCase.assertSame(stringType, vIdentifier.propagatedType);
-    JUnitTestCase.assertSame(typeProvider.dynamicType, vIdentifier.staticType);
+    expect(vIdentifier.propagatedType, same(stringType));
+    expect(vIdentifier.staticType, same(typeProvider.dynamicType));
   }
 
   void test_functionExpression_asInvocationArgument_fromInferredInvocation() {
-    String code = EngineTestCase.createSource([
-        "class MyMap<K, V> {",
-        "  forEach(f(K key, V value)) {}",
-        "}",
-        "f(MyMap<int, String> m) {",
-        "  var m2 = m;",
-        "  m2.forEach((k, v) {});",
-        "}"]);
+    String code = r'''
+class MyMap<K, V> {
+  forEach(f(K key, V value)) {}
+}
+f(MyMap<int, String> m) {
+  var m2 = m;
+  m2.forEach((k, v) {});
+}''';
     Source source = addSource(code);
     LibraryElement library = resolve(source);
     assertNoErrors(source);
@@ -9862,20 +10163,20 @@
     // k
     DartType intType = typeProvider.intType;
     FormalParameter kParameter = EngineTestCase.findNode(unit, code, "k, ", (node) => node is SimpleFormalParameter);
-    JUnitTestCase.assertSame(intType, kParameter.identifier.propagatedType);
+    expect(kParameter.identifier.propagatedType, same(intType));
     // v
     DartType stringType = typeProvider.stringType;
     FormalParameter vParameter = EngineTestCase.findNode(unit, code, "v)", (node) => node is SimpleFormalParameter);
-    JUnitTestCase.assertSame(stringType, vParameter.identifier.propagatedType);
+    expect(vParameter.identifier.propagatedType, same(stringType));
   }
 
   void test_functionExpression_asInvocationArgument_functionExpressionInvocation() {
-    String code = EngineTestCase.createSource([
-        "main() {",
-        "  (f(String value)) {} ((v) {",
-        "    v;",
-        "  });",
-        "}"]);
+    String code = r'''
+main() {
+  (f(String value)) {} ((v) {
+    v;
+  });
+}''';
     Source source = addSource(code);
     LibraryElement library = resolve(source);
     assertNoErrors(source);
@@ -9885,23 +10186,23 @@
     DartType dynamicType = typeProvider.dynamicType;
     DartType stringType = typeProvider.stringType;
     FormalParameter vParameter = EngineTestCase.findNode(unit, code, "v)", (node) => node is FormalParameter);
-    JUnitTestCase.assertSame(stringType, vParameter.identifier.propagatedType);
-    JUnitTestCase.assertSame(dynamicType, vParameter.identifier.staticType);
+    expect(vParameter.identifier.propagatedType, same(stringType));
+    expect(vParameter.identifier.staticType, same(dynamicType));
     SimpleIdentifier vIdentifier = EngineTestCase.findNode(unit, code, "v;", (node) => node is SimpleIdentifier);
-    JUnitTestCase.assertSame(stringType, vIdentifier.propagatedType);
-    JUnitTestCase.assertSame(dynamicType, vIdentifier.staticType);
+    expect(vIdentifier.propagatedType, same(stringType));
+    expect(vIdentifier.staticType, same(dynamicType));
   }
 
   void test_functionExpression_asInvocationArgument_keepIfLessSpecific() {
-    String code = EngineTestCase.createSource([
-        "class MyList {",
-        "  forEach(f(Object value)) {}",
-        "}",
-        "f(MyList list) {",
-        "  list.forEach((int v) {",
-        "    v;",
-        "  });",
-        "}"]);
+    String code = r'''
+class MyList {
+  forEach(f(Object value)) {}
+}
+f(MyList list) {
+  list.forEach((int v) {
+    v;
+  });
+}''';
     Source source = addSource(code);
     LibraryElement library = resolve(source);
     assertNoErrors(source);
@@ -9910,22 +10211,22 @@
     // v
     DartType intType = typeProvider.intType;
     FormalParameter vParameter = EngineTestCase.findNode(unit, code, "v)", (node) => node is SimpleFormalParameter);
-    JUnitTestCase.assertSame(null, vParameter.identifier.propagatedType);
-    JUnitTestCase.assertSame(intType, vParameter.identifier.staticType);
+    expect(vParameter.identifier.propagatedType, same(null));
+    expect(vParameter.identifier.staticType, same(intType));
     SimpleIdentifier vIdentifier = EngineTestCase.findNode(unit, code, "v;", (node) => node is SimpleIdentifier);
-    JUnitTestCase.assertSame(intType, vIdentifier.staticType);
-    JUnitTestCase.assertSame(null, vIdentifier.propagatedType);
+    expect(vIdentifier.staticType, same(intType));
+    expect(vIdentifier.propagatedType, same(null));
   }
 
   void test_functionExpression_asInvocationArgument_notSubtypeOfStaticType() {
-    String code = EngineTestCase.createSource([
-        "class A {",
-        "  m(void f(int i)) {}",
-        "}",
-        "x() {",
-        "  A a = new A();",
-        "  a.m(() => 0);",
-        "}"]);
+    String code = r'''
+class A {
+  m(void f(int i)) {}
+}
+x() {
+  A a = new A();
+  a.m(() => 0);
+}''';
     Source source = addSource(code);
     LibraryElement library = resolve(source);
     assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
@@ -9933,20 +10234,20 @@
     CompilationUnit unit = resolveCompilationUnit(source, library);
     // () => 0
     FunctionExpression functionExpression = EngineTestCase.findNode(unit, code, "() => 0)", (node) => node is FunctionExpression);
-    JUnitTestCase.assertSame(0, (functionExpression.staticType as FunctionType).parameters.length);
-    JUnitTestCase.assertSame(null, functionExpression.propagatedType);
+    expect((functionExpression.staticType as FunctionType).parameters.length, same(0));
+    expect(functionExpression.propagatedType, same(null));
   }
 
   void test_functionExpression_asInvocationArgument_replaceIfMoreSpecific() {
-    String code = EngineTestCase.createSource([
-        "class MyList<E> {",
-        "  forEach(f(E value)) {}",
-        "}",
-        "f(MyList<String> list) {",
-        "  list.forEach((Object v) {",
-        "    v;",
-        "  });",
-        "}"]);
+    String code = r'''
+class MyList<E> {
+  forEach(f(E value)) {}
+}
+f(MyList<String> list) {
+  list.forEach((Object v) {
+    v;
+  });
+}''';
     Source source = addSource(code);
     LibraryElement library = resolve(source);
     assertNoErrors(source);
@@ -9955,23 +10256,23 @@
     // v
     DartType stringType = typeProvider.stringType;
     FormalParameter vParameter = EngineTestCase.findNode(unit, code, "v)", (node) => node is SimpleFormalParameter);
-    JUnitTestCase.assertSame(stringType, vParameter.identifier.propagatedType);
-    JUnitTestCase.assertSame(typeProvider.objectType, vParameter.identifier.staticType);
+    expect(vParameter.identifier.propagatedType, same(stringType));
+    expect(vParameter.identifier.staticType, same(typeProvider.objectType));
     SimpleIdentifier vIdentifier = EngineTestCase.findNode(unit, code, "v;", (node) => node is SimpleIdentifier);
-    JUnitTestCase.assertSame(stringType, vIdentifier.propagatedType);
+    expect(vIdentifier.propagatedType, same(stringType));
   }
 
   void test_Future_then() {
-    String code = EngineTestCase.createSource([
-        "import 'dart:async';",
-        "main(Future<int> firstFuture) {",
-        "  firstFuture.then((p1) {",
-        "    return 1.0;",
-        "  }).then((p2) {",
-        "    return new Future<String>.value('str');",
-        "  }).then((p3) {",
-        "  });",
-        "}"]);
+    String code = r'''
+import 'dart:async';
+main(Future<int> firstFuture) {
+  firstFuture.then((p1) {
+    return 1.0;
+  }).then((p2) {
+    return new Future<String>.value('str');
+  }).then((p3) {
+  });
+}''';
     Source source = addSource(code);
     LibraryElement library = resolve(source);
     assertNoErrors(source);
@@ -9979,17 +10280,21 @@
     CompilationUnit unit = resolveCompilationUnit(source, library);
     // p1
     FormalParameter p1 = EngineTestCase.findNode(unit, code, "p1) {", (node) => node is SimpleFormalParameter);
-    JUnitTestCase.assertSame(typeProvider.intType, p1.identifier.propagatedType);
+    expect(p1.identifier.propagatedType, same(typeProvider.intType));
     // p2
     FormalParameter p2 = EngineTestCase.findNode(unit, code, "p2) {", (node) => node is SimpleFormalParameter);
-    JUnitTestCase.assertSame(typeProvider.doubleType, p2.identifier.propagatedType);
+    expect(p2.identifier.propagatedType, same(typeProvider.doubleType));
     // p3
     FormalParameter p3 = EngineTestCase.findNode(unit, code, "p3) {", (node) => node is SimpleFormalParameter);
-    JUnitTestCase.assertSame(typeProvider.stringType, p3.identifier.propagatedType);
+    expect(p3.identifier.propagatedType, same(typeProvider.stringType));
   }
 
   void test_initializer() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  var v = 0;", "  return v;", "}"]));
+    Source source = addSource(r'''
+f() {
+  var v = 0;
+  return v;
+}''');
     LibraryElement library = resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -10001,19 +10306,23 @@
     {
       VariableDeclarationStatement statement = statements[0] as VariableDeclarationStatement;
       SimpleIdentifier variableName = statement.variables.variables[0].name;
-      JUnitTestCase.assertSame(typeProvider.dynamicType, variableName.staticType);
-      JUnitTestCase.assertSame(typeProvider.intType, variableName.propagatedType);
+      expect(variableName.staticType, same(typeProvider.dynamicType));
+      expect(variableName.propagatedType, same(typeProvider.intType));
     }
     // Type of 'v' in reference.
     {
       ReturnStatement statement = statements[1] as ReturnStatement;
       SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
-      JUnitTestCase.assertSame(typeProvider.intType, variableName.propagatedType);
+      expect(variableName.propagatedType, same(typeProvider.intType));
     }
   }
 
   void test_initializer_dereference() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  var v = 'String';", "  v.", "}"]));
+    Source source = addSource(r'''
+f() {
+  var v = 'String';
+  v.
+}''');
     LibraryElement library = resolve(source);
     CompilationUnit unit = resolveCompilationUnit(source, library);
     FunctionDeclaration function = unit.declarations[0] as FunctionDeclaration;
@@ -10021,15 +10330,15 @@
     ExpressionStatement statement = body.block.statements[1] as ExpressionStatement;
     PrefixedIdentifier invocation = statement.expression as PrefixedIdentifier;
     SimpleIdentifier variableName = invocation.prefix;
-    JUnitTestCase.assertSame(typeProvider.stringType, variableName.propagatedType);
+    expect(variableName.propagatedType, same(typeProvider.stringType));
   }
 
   void test_initializer_null() {
-    String code = EngineTestCase.createSource([
-        "main() {",
-        "  int v = null;",
-        "  return v; // marker",
-        "}"]);
+    String code = r'''
+main() {
+  int v = null;
+  return v; // marker
+}''';
     CompilationUnit unit;
     {
       Source source = addSource(code);
@@ -10040,22 +10349,22 @@
     }
     {
       SimpleIdentifier identifier = EngineTestCase.findNode(unit, code, "v = null;", (node) => node is SimpleIdentifier);
-      JUnitTestCase.assertSame(typeProvider.intType, identifier.staticType);
-      JUnitTestCase.assertSame(null, identifier.propagatedType);
+      expect(identifier.staticType, same(typeProvider.intType));
+      expect(identifier.propagatedType, same(null));
     }
     {
       SimpleIdentifier identifier = EngineTestCase.findNode(unit, code, "v; // marker", (node) => node is SimpleIdentifier);
-      JUnitTestCase.assertSame(typeProvider.intType, identifier.staticType);
-      JUnitTestCase.assertSame(null, identifier.propagatedType);
+      expect(identifier.staticType, same(typeProvider.intType));
+      expect(identifier.propagatedType, same(null));
     }
   }
 
   void test_is_conditional() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "A f(var p) {",
-        "  return (p is A) ? p : null;",
-        "}"]));
+    Source source = addSource(r'''
+class A {}
+A f(var p) {
+  return (p is A) ? p : null;
+}''');
     LibraryElement library = resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -10067,19 +10376,19 @@
     ReturnStatement statement = body.block.statements[0] as ReturnStatement;
     ConditionalExpression conditional = statement.expression as ConditionalExpression;
     SimpleIdentifier variableName = conditional.thenExpression as SimpleIdentifier;
-    JUnitTestCase.assertSame(typeA, variableName.propagatedType);
+    expect(variableName.propagatedType, same(typeA));
   }
 
   void test_is_if() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "A f(var p) {",
-        "  if (p is A) {",
-        "    return p;",
-        "  } else {",
-        "    return null;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A {}
+A f(var p) {
+  if (p is A) {
+    return p;
+  } else {
+    return null;
+  }
+}''');
     LibraryElement library = resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -10091,19 +10400,19 @@
     IfStatement ifStatement = body.block.statements[0] as IfStatement;
     ReturnStatement statement = (ifStatement.thenStatement as Block).statements[0] as ReturnStatement;
     SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
-    JUnitTestCase.assertSame(typeA, variableName.propagatedType);
+    expect(variableName.propagatedType, same(typeA));
   }
 
   void test_is_if_lessSpecific() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "A f(A p) {",
-        "  if (p is String) {",
-        "    return p;",
-        "  } else {",
-        "    return null;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A {}
+A f(A p) {
+  if (p is String) {
+    return p;
+  } else {
+    return null;
+  }
+}''');
     LibraryElement library = resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -10115,19 +10424,19 @@
     IfStatement ifStatement = body.block.statements[0] as IfStatement;
     ReturnStatement statement = (ifStatement.thenStatement as Block).statements[0] as ReturnStatement;
     SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
-    JUnitTestCase.assertSame(null, variableName.propagatedType);
+    expect(variableName.propagatedType, same(null));
   }
 
   void test_is_if_logicalAnd() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "A f(var p) {",
-        "  if (p is A && p != null) {",
-        "    return p;",
-        "  } else {",
-        "    return null;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A {}
+A f(var p) {
+  if (p is A && p != null) {
+    return p;
+  } else {
+    return null;
+  }
+}''');
     LibraryElement library = resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -10139,16 +10448,16 @@
     IfStatement ifStatement = body.block.statements[0] as IfStatement;
     ReturnStatement statement = (ifStatement.thenStatement as Block).statements[0] as ReturnStatement;
     SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
-    JUnitTestCase.assertSame(typeA, variableName.propagatedType);
+    expect(variableName.propagatedType, same(typeA));
   }
 
   void test_is_postConditional() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "A f(var p) {",
-        "  A a = (p is A) ? p : throw null;",
-        "  return p;",
-        "}"]));
+    Source source = addSource(r'''
+class A {}
+A f(var p) {
+  A a = (p is A) ? p : throw null;
+  return p;
+}''');
     LibraryElement library = resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -10159,20 +10468,20 @@
     BlockFunctionBody body = function.functionExpression.body as BlockFunctionBody;
     ReturnStatement statement = body.block.statements[1] as ReturnStatement;
     SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
-    JUnitTestCase.assertSame(typeA, variableName.propagatedType);
+    expect(variableName.propagatedType, same(typeA));
   }
 
   void test_is_postIf() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "A f(var p) {",
-        "  if (p is A) {",
-        "    A a = p;",
-        "  } else {",
-        "    return null;",
-        "  }",
-        "  return p;",
-        "}"]));
+    Source source = addSource(r'''
+class A {}
+A f(var p) {
+  if (p is A) {
+    A a = p;
+  } else {
+    return null;
+  }
+  return p;
+}''');
     LibraryElement library = resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -10183,21 +10492,21 @@
     BlockFunctionBody body = function.functionExpression.body as BlockFunctionBody;
     ReturnStatement statement = body.block.statements[1] as ReturnStatement;
     SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
-    JUnitTestCase.assertSame(typeA, variableName.propagatedType);
+    expect(variableName.propagatedType, same(typeA));
   }
 
   void test_is_subclass() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B extends A {",
-        "  B m() => this;",
-        "}",
-        "A f(A p) {",
-        "  if (p is B) {",
-        "    return p.m();",
-        "  }",
-        "  return p;",
-        "}"]));
+    Source source = addSource(r'''
+class A {}
+class B extends A {
+  B m() => this;
+}
+A f(A p) {
+  if (p is B) {
+    return p.m();
+  }
+  return p;
+}''');
     LibraryElement library = resolve(source);
     assertNoErrors(source);
     CompilationUnit unit = resolveCompilationUnit(source, library);
@@ -10206,18 +10515,18 @@
     IfStatement ifStatement = body.block.statements[0] as IfStatement;
     ReturnStatement statement = (ifStatement.thenStatement as Block).statements[0] as ReturnStatement;
     MethodInvocation invocation = statement.expression as MethodInvocation;
-    JUnitTestCase.assertNotNull(invocation.methodName.propagatedElement);
+    expect(invocation.methodName.propagatedElement, isNotNull);
   }
 
   void test_is_while() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "A f(var p) {",
-        "  while (p is A) {",
-        "    return p;",
-        "  }",
-        "  return p;",
-        "}"]));
+    Source source = addSource(r'''
+class A {}
+A f(var p) {
+  while (p is A) {
+    return p;
+  }
+  return p;
+}''');
     LibraryElement library = resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -10229,15 +10538,15 @@
     WhileStatement whileStatement = body.block.statements[0] as WhileStatement;
     ReturnStatement statement = (whileStatement.body as Block).statements[0] as ReturnStatement;
     SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
-    JUnitTestCase.assertSame(typeA, variableName.propagatedType);
+    expect(variableName.propagatedType, same(typeA));
   }
 
   void test_isNot_conditional() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "A f(var p) {",
-        "  return (p is! A) ? null : p;",
-        "}"]));
+    Source source = addSource(r'''
+class A {}
+A f(var p) {
+  return (p is! A) ? null : p;
+}''');
     LibraryElement library = resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -10249,19 +10558,19 @@
     ReturnStatement statement = body.block.statements[0] as ReturnStatement;
     ConditionalExpression conditional = statement.expression as ConditionalExpression;
     SimpleIdentifier variableName = conditional.elseExpression as SimpleIdentifier;
-    JUnitTestCase.assertSame(typeA, variableName.propagatedType);
+    expect(variableName.propagatedType, same(typeA));
   }
 
   void test_isNot_if() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "A f(var p) {",
-        "  if (p is! A) {",
-        "    return null;",
-        "  } else {",
-        "    return p;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A {}
+A f(var p) {
+  if (p is! A) {
+    return null;
+  } else {
+    return p;
+  }
+}''');
     LibraryElement library = resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -10273,19 +10582,19 @@
     IfStatement ifStatement = body.block.statements[0] as IfStatement;
     ReturnStatement statement = (ifStatement.elseStatement as Block).statements[0] as ReturnStatement;
     SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
-    JUnitTestCase.assertSame(typeA, variableName.propagatedType);
+    expect(variableName.propagatedType, same(typeA));
   }
 
   void test_isNot_if_logicalOr() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "A f(var p) {",
-        "  if (p is! A || null == p) {",
-        "    return null;",
-        "  } else {",
-        "    return p;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A {}
+A f(var p) {
+  if (p is! A || null == p) {
+    return null;
+  } else {
+    return p;
+  }
+}''');
     LibraryElement library = resolve(source);
     assertNoErrors(source);
     CompilationUnit unit = resolveCompilationUnit(source, library);
@@ -10296,16 +10605,16 @@
     IfStatement ifStatement = body.block.statements[0] as IfStatement;
     ReturnStatement statement = (ifStatement.elseStatement as Block).statements[0] as ReturnStatement;
     SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
-    JUnitTestCase.assertSame(typeA, variableName.propagatedType);
+    expect(variableName.propagatedType, same(typeA));
   }
 
   void test_isNot_postConditional() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "A f(var p) {",
-        "  A a = (p is! A) ? throw null : p;",
-        "  return p;",
-        "}"]));
+    Source source = addSource(r'''
+class A {}
+A f(var p) {
+  A a = (p is! A) ? throw null : p;
+  return p;
+}''');
     LibraryElement library = resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -10316,18 +10625,18 @@
     BlockFunctionBody body = function.functionExpression.body as BlockFunctionBody;
     ReturnStatement statement = body.block.statements[1] as ReturnStatement;
     SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
-    JUnitTestCase.assertSame(typeA, variableName.propagatedType);
+    expect(variableName.propagatedType, same(typeA));
   }
 
   void test_isNot_postIf() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "A f(var p) {",
-        "  if (p is! A) {",
-        "    return null;",
-        "  }",
-        "  return p;",
-        "}"]));
+    Source source = addSource(r'''
+class A {}
+A f(var p) {
+  if (p is! A) {
+    return null;
+  }
+  return p;
+}''');
     LibraryElement library = resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -10338,22 +10647,22 @@
     BlockFunctionBody body = function.functionExpression.body as BlockFunctionBody;
     ReturnStatement statement = body.block.statements[1] as ReturnStatement;
     SimpleIdentifier variableName = statement.expression as SimpleIdentifier;
-    JUnitTestCase.assertSame(typeA, variableName.propagatedType);
+    expect(variableName.propagatedType, same(typeA));
   }
 
   void test_issue20904BuggyTypePromotionAtIfJoin_2() {
     // https://code.google.com/p/dart/issues/detail?id=20904
     enableUnionTypes(false);
-    String code = EngineTestCase.createSource([
-        "f(var message) {",
-        "  if (message is Function) {",
-        "    message = '';",
-        "  }",
-        "  message; // marker",
-        "}"]);
+    String code = r'''
+f(var message) {
+  if (message is Function) {
+    message = '';
+  }
+  message; // marker
+}''';
     DartType t = _findMarkedIdentifier(code, "; // marker").propagatedType;
-    JUnitTestCase.assertFalse(typeProvider.stringType == t);
-    JUnitTestCase.assertFalse(typeProvider.functionType == t);
+    expect(typeProvider.stringType == t, isFalse);
+    expect(typeProvider.functionType == t, isFalse);
   }
 
   void test_issue20904BuggyTypePromotionAtIfJoin_5() {
@@ -10374,17 +10683,17 @@
     // I can only imagine strange code would make use of this feature.
     //
     // Here the is-check improves precision, so we use it.
-    String code = EngineTestCase.createSource([
-        "class A {}",
-        "class B extends A {}",
-        "f() {",
-        "  var a = new A();",
-        "  var b = new B();",
-        "  b; // B",
-        "  if (a is B) {",
-        "    return a; // marker",
-        "  }",
-        "}"]);
+    String code = r'''
+class A {}
+class B extends A {}
+f() {
+  var a = new A();
+  var b = new B();
+  b; // B
+  if (a is B) {
+    return a; // marker
+  }
+}''';
     DartType tB = _findMarkedIdentifier(code, "; // B").propagatedType;
     _assertTypeOfMarkedExpression(code, null, tB);
   }
@@ -10395,22 +10704,26 @@
     // The other half of the *_5() test.
     //
     // Here the is-check loses precision, so we don't use it.
-    String code = EngineTestCase.createSource([
-        "class A {}",
-        "class B extends A {}",
-        "f() {",
-        "  var b = new B();",
-        "  b; // B",
-        "  if (b is A) {",
-        "    return b; // marker",
-        "  }",
-        "}"]);
+    String code = r'''
+class A {}
+class B extends A {}
+f() {
+  var b = new B();
+  b; // B
+  if (b is A) {
+    return b; // marker
+  }
+}''';
     DartType tB = _findMarkedIdentifier(code, "; // B").propagatedType;
     _assertTypeOfMarkedExpression(code, null, tB);
   }
 
   void test_listLiteral_different() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  var v = [0, '1', 2];", "  return v[2];", "}"]));
+    Source source = addSource(r'''
+f() {
+  var v = [0, '1', 2];
+  return v[2];
+}''');
     LibraryElement library = resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -10419,11 +10732,15 @@
     BlockFunctionBody body = function.functionExpression.body as BlockFunctionBody;
     ReturnStatement statement = body.block.statements[1] as ReturnStatement;
     IndexExpression indexExpression = statement.expression as IndexExpression;
-    JUnitTestCase.assertNull(indexExpression.propagatedType);
+    expect(indexExpression.propagatedType, isNull);
   }
 
   void test_listLiteral_same() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  var v = [0, 1, 2];", "  return v[2];", "}"]));
+    Source source = addSource(r'''
+f() {
+  var v = [0, 1, 2];
+  return v[2];
+}''');
     LibraryElement library = resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -10432,21 +10749,21 @@
     BlockFunctionBody body = function.functionExpression.body as BlockFunctionBody;
     ReturnStatement statement = body.block.statements[1] as ReturnStatement;
     IndexExpression indexExpression = statement.expression as IndexExpression;
-    JUnitTestCase.assertNull(indexExpression.propagatedType);
+    expect(indexExpression.propagatedType, isNull);
     Expression v = indexExpression.target;
     InterfaceType propagatedType = v.propagatedType as InterfaceType;
-    JUnitTestCase.assertSame(typeProvider.listType.element, propagatedType.element);
+    expect(propagatedType.element, same(typeProvider.listType.element));
     List<DartType> typeArguments = propagatedType.typeArguments;
-    EngineTestCase.assertLength(1, typeArguments);
-    JUnitTestCase.assertSame(typeProvider.dynamicType, typeArguments[0]);
+    expect(typeArguments, hasLength(1));
+    expect(typeArguments[0], same(typeProvider.dynamicType));
   }
 
   void test_mapLiteral_different() {
-    Source source = addSource(EngineTestCase.createSource([
-        "f() {",
-        "  var v = {'0' : 0, 1 : '1', '2' : 2};",
-        "  return v;",
-        "}"]));
+    Source source = addSource(r'''
+f() {
+  var v = {'0' : 0, 1 : '1', '2' : 2};
+  return v;
+}''');
     LibraryElement library = resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -10456,19 +10773,19 @@
     ReturnStatement statement = body.block.statements[1] as ReturnStatement;
     SimpleIdentifier identifier = statement.expression as SimpleIdentifier;
     InterfaceType propagatedType = identifier.propagatedType as InterfaceType;
-    JUnitTestCase.assertSame(typeProvider.mapType.element, propagatedType.element);
+    expect(propagatedType.element, same(typeProvider.mapType.element));
     List<DartType> typeArguments = propagatedType.typeArguments;
-    EngineTestCase.assertLength(2, typeArguments);
-    JUnitTestCase.assertSame(typeProvider.dynamicType, typeArguments[0]);
-    JUnitTestCase.assertSame(typeProvider.dynamicType, typeArguments[1]);
+    expect(typeArguments, hasLength(2));
+    expect(typeArguments[0], same(typeProvider.dynamicType));
+    expect(typeArguments[1], same(typeProvider.dynamicType));
   }
 
   void test_mapLiteral_same() {
-    Source source = addSource(EngineTestCase.createSource([
-        "f() {",
-        "  var v = {'a' : 0, 'b' : 1, 'c' : 2};",
-        "  return v;",
-        "}"]));
+    Source source = addSource(r'''
+f() {
+  var v = {'a' : 0, 'b' : 1, 'c' : 2};
+  return v;
+}''');
     LibraryElement library = resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -10478,26 +10795,26 @@
     ReturnStatement statement = body.block.statements[1] as ReturnStatement;
     SimpleIdentifier identifier = statement.expression as SimpleIdentifier;
     InterfaceType propagatedType = identifier.propagatedType as InterfaceType;
-    JUnitTestCase.assertSame(typeProvider.mapType.element, propagatedType.element);
+    expect(propagatedType.element, same(typeProvider.mapType.element));
     List<DartType> typeArguments = propagatedType.typeArguments;
-    EngineTestCase.assertLength(2, typeArguments);
-    JUnitTestCase.assertSame(typeProvider.dynamicType, typeArguments[0]);
-    JUnitTestCase.assertSame(typeProvider.dynamicType, typeArguments[1]);
+    expect(typeArguments, hasLength(2));
+    expect(typeArguments[0], same(typeProvider.dynamicType));
+    expect(typeArguments[1], same(typeProvider.dynamicType));
   }
 
   void test_mergePropagatedTypesAtJoinPoint_4() {
     // https://code.google.com/p/dart/issues/detail?id=19929
-    _assertTypeOfMarkedExpression(EngineTestCase.createSource([
-        "f5(x) {",
-        "  var y = [];",
-        "  if (x) {",
-        "    y = 0;",
-        "  } else {",
-        "    return y;",
-        "  }",
-        "  // Propagated type is [int] here: correct.",
-        "  return y; // marker",
-        "}"]), null, typeProvider.intType);
+    _assertTypeOfMarkedExpression(r'''
+f5(x) {
+  var y = [];
+  if (x) {
+    y = 0;
+  } else {
+    return y;
+  }
+  // Propagated type is [int] here: correct.
+  return y; // marker
+}''', null, typeProvider.intType);
   }
 
   void test_mergePropagatedTypesAtJoinPoint_6() {
@@ -10509,22 +10826,22 @@
     // it into a loop of sorts. The [if] type-propagation code assumes
     // that [break] does not introduce a loop.
     enableUnionTypes(false);
-    String code = EngineTestCase.createSource([
-        "f() {",
-        "  var x = 0;",
-        "  var c = false;",
-        "  L: ",
-        "  if (c) {",
-        "  } else {",
-        "    x = '';",
-        "    c = true;",
-        "    break L;",
-        "  }",
-        "  x; // marker",
-        "}"]);
+    String code = r'''
+f() {
+  var x = 0;
+  var c = false;
+  L: 
+  if (c) {
+  } else {
+    x = '';
+    c = true;
+    break L;
+  }
+  x; // marker
+}''';
     DartType t = _findMarkedIdentifier(code, "; // marker").propagatedType;
-    JUnitTestCase.assertTrue(typeProvider.intType.isSubtypeOf(t));
-    JUnitTestCase.assertTrue(typeProvider.stringType.isSubtypeOf(t));
+    expect(typeProvider.intType.isSubtypeOf(t), isTrue);
+    expect(typeProvider.stringType.isSubtypeOf(t), isTrue);
   }
 
   void test_objectMethodOnDynamicExpression_doubleEquals() {
@@ -10534,113 +10851,129 @@
     // static type of [bool] for [==] comparison and the implementation
     // was already consistent with the spec there. But, it's another
     // [Object] method, so it's included here.
-    _assertTypeOfMarkedExpression(EngineTestCase.createSource([
-        "f1(x) {",
-        "  var v = (x == x);",
-        "  return v; // marker",
-        "}"]), null, typeProvider.boolType);
+    _assertTypeOfMarkedExpression(r'''
+f1(x) {
+  var v = (x == x);
+  return v; // marker
+}''', null, typeProvider.boolType);
   }
 
   void test_objectMethodOnDynamicExpression_hashCode() {
     // https://code.google.com/p/dart/issues/detail?id=20342
-    _assertTypeOfMarkedExpression(EngineTestCase.createSource([
-        "f1(x) {",
-        "  var v = x.hashCode;",
-        "  return v; // marker",
-        "}"]), null, typeProvider.intType);
+    _assertTypeOfMarkedExpression(r'''
+f1(x) {
+  var v = x.hashCode;
+  return v; // marker
+}''', null, typeProvider.intType);
   }
 
   void test_objectMethodOnDynamicExpression_runtimeType() {
     // https://code.google.com/p/dart/issues/detail?id=20342
-    _assertTypeOfMarkedExpression(EngineTestCase.createSource([
-        "f1(x) {",
-        "  var v = x.runtimeType;",
-        "  return v; // marker",
-        "}"]), null, typeProvider.typeType);
+    _assertTypeOfMarkedExpression(r'''
+f1(x) {
+  var v = x.runtimeType;
+  return v; // marker
+}''', null, typeProvider.typeType);
   }
 
   void test_objectMethodOnDynamicExpression_toString() {
     // https://code.google.com/p/dart/issues/detail?id=20342
-    _assertTypeOfMarkedExpression(EngineTestCase.createSource([
-        "f1(x) {",
-        "  var v = x.toString();",
-        "  return v; // marker",
-        "}"]), null, typeProvider.stringType);
+    _assertTypeOfMarkedExpression(r'''
+f1(x) {
+  var v = x.toString();
+  return v; // marker
+}''', null, typeProvider.stringType);
   }
 
   void test_propagatedReturnType_function_hasReturnType_returnsNull() {
-    String code = EngineTestCase.createSource(["String f() => null;", "main() {", "  var v = f();", "}"]);
+    String code = r'''
+String f() => null;
+main() {
+  var v = f();
+}''';
     _assertPropagatedReturnType(code, typeProvider.dynamicType, typeProvider.stringType);
   }
 
   void test_propagatedReturnType_function_lessSpecificStaticReturnType() {
-    String code = EngineTestCase.createSource(["Object f() => 42;", "main() {", "  var v = f();", "}"]);
+    String code = r'''
+Object f() => 42;
+main() {
+  var v = f();
+}''';
     _assertPropagatedReturnType(code, typeProvider.dynamicType, typeProvider.intType);
   }
 
   void test_propagatedReturnType_function_moreSpecificStaticReturnType() {
-    String code = EngineTestCase.createSource([
-        "int f(v) => (v as num);",
-        "main() {",
-        "  var v = f(3);",
-        "}"]);
+    String code = r'''
+int f(v) => (v as num);
+main() {
+  var v = f(3);
+}''';
     _assertPropagatedReturnType(code, typeProvider.dynamicType, typeProvider.intType);
   }
 
   void test_propagatedReturnType_function_noReturnTypeName_blockBody_multipleReturns() {
-    String code = EngineTestCase.createSource([
-        "f() {",
-        "  if (true) return 0;",
-        "  return 1.0;",
-        "}",
-        "main() {",
-        "  var v = f();",
-        "}"]);
+    String code = r'''
+f() {
+  if (true) return 0;
+  return 1.0;
+}
+main() {
+  var v = f();
+}''';
     _assertPropagatedReturnType(code, typeProvider.dynamicType, typeProvider.numType);
   }
 
   void test_propagatedReturnType_function_noReturnTypeName_blockBody_oneReturn() {
-    String code = EngineTestCase.createSource([
-        "f() {",
-        "  var z = 42;",
-        "  return z;",
-        "}",
-        "main() {",
-        "  var v = f();",
-        "}"]);
+    String code = r'''
+f() {
+  var z = 42;
+  return z;
+}
+main() {
+  var v = f();
+}''';
     _assertPropagatedReturnType(code, typeProvider.dynamicType, typeProvider.intType);
   }
 
   void test_propagatedReturnType_function_noReturnTypeName_expressionBody() {
-    String code = EngineTestCase.createSource(["f() => 42;", "main() {", "  var v = f();", "}"]);
+    String code = r'''
+f() => 42;
+main() {
+  var v = f();
+}''';
     _assertPropagatedReturnType(code, typeProvider.dynamicType, typeProvider.intType);
   }
 
   void test_propagatedReturnType_localFunction() {
-    String code = EngineTestCase.createSource(["main() {", "  f() => 42;", "  var v = f();", "}"]);
+    String code = r'''
+main() {
+  f() => 42;
+  var v = f();
+}''';
     _assertPropagatedReturnType(code, typeProvider.dynamicType, typeProvider.intType);
   }
 
   void test_query() {
-    Source source = addSource(EngineTestCase.createSource([
-        "import 'dart:html';",
-        "",
-        "main() {",
-        "  var v1 = query('a');",
-        "  var v2 = query('A');",
-        "  var v3 = query('body:active');",
-        "  var v4 = query('button[foo=\"bar\"]');",
-        "  var v5 = query('div.class');",
-        "  var v6 = query('input#id');",
-        "  var v7 = query('select#id');",
-        "  // invocation of method",
-        "  var m1 = document.query('div');",
-        " // unsupported currently",
-        "  var b1 = query('noSuchTag');",
-        "  var b2 = query('DART_EDITOR_NO_SUCH_TYPE');",
-        "  var b3 = query('body div');",
-        "  return [v1, v2, v3, v4, v5, v6, v7, m1, b1, b2, b3];",
-        "}"]));
+    Source source = addSource(r'''
+import 'dart:html';
+
+main() {
+  var v1 = query('a');
+  var v2 = query('A');
+  var v3 = query('body:active');
+  var v4 = query('button[foo="bar"]');
+  var v5 = query('div.class');
+  var v6 = query('input#id');
+  var v7 = query('select#id');
+  // invocation of method
+  var m1 = document.query('div');
+ // unsupported currently
+  var b1 = query('noSuchTag');
+  var b2 = query('DART_EDITOR_NO_SUCH_TYPE');
+  var b3 = query('body div');
+  return [v1, v2, v3, v4, v5, v6, v7, m1, b1, b2, b3];
+}''');
     LibraryElement library = resolve(source);
     assertNoErrors(source);
     verify([source]);
@@ -10649,17 +10982,17 @@
     BlockFunctionBody body = main.functionExpression.body as BlockFunctionBody;
     ReturnStatement statement = body.block.statements[11] as ReturnStatement;
     NodeList<Expression> elements = (statement.expression as ListLiteral).elements;
-    JUnitTestCase.assertEquals("AnchorElement", elements[0].propagatedType.name);
-    JUnitTestCase.assertEquals("AnchorElement", elements[1].propagatedType.name);
-    JUnitTestCase.assertEquals("BodyElement", elements[2].propagatedType.name);
-    JUnitTestCase.assertEquals("ButtonElement", elements[3].propagatedType.name);
-    JUnitTestCase.assertEquals("DivElement", elements[4].propagatedType.name);
-    JUnitTestCase.assertEquals("InputElement", elements[5].propagatedType.name);
-    JUnitTestCase.assertEquals("SelectElement", elements[6].propagatedType.name);
-    JUnitTestCase.assertEquals("DivElement", elements[7].propagatedType.name);
-    JUnitTestCase.assertEquals("Element", elements[8].propagatedType.name);
-    JUnitTestCase.assertEquals("Element", elements[9].propagatedType.name);
-    JUnitTestCase.assertEquals("Element", elements[10].propagatedType.name);
+    expect(elements[0].propagatedType.name, "AnchorElement");
+    expect(elements[1].propagatedType.name, "AnchorElement");
+    expect(elements[2].propagatedType.name, "BodyElement");
+    expect(elements[3].propagatedType.name, "ButtonElement");
+    expect(elements[4].propagatedType.name, "DivElement");
+    expect(elements[5].propagatedType.name, "InputElement");
+    expect(elements[6].propagatedType.name, "SelectElement");
+    expect(elements[7].propagatedType.name, "DivElement");
+    expect(elements[8].propagatedType.name, "Element");
+    expect(elements[9].propagatedType.name, "Element");
+    expect(elements[10].propagatedType.name, "Element");
   }
 
   /**
@@ -10668,8 +11001,8 @@
    */
   void _assertPropagatedReturnType(String code, DartType expectedStaticType, DartType expectedPropagatedType) {
     SimpleIdentifier identifier = _findMarkedIdentifier(code, "v = ");
-    JUnitTestCase.assertSame(expectedStaticType, identifier.staticType);
-    JUnitTestCase.assertSame(expectedPropagatedType, identifier.propagatedType);
+    expect(identifier.staticType, same(expectedStaticType));
+    expect(identifier.propagatedType, same(expectedPropagatedType));
   }
 
   /**
@@ -10683,10 +11016,10 @@
   void _assertTypeOfMarkedExpression(String code, DartType expectedStaticType, DartType expectedPropagatedType) {
     SimpleIdentifier identifier = _findMarkedIdentifier(code, "; // marker");
     if (expectedStaticType != null) {
-      JUnitTestCase.assertEquals(expectedStaticType, identifier.staticType);
+      expect(identifier.staticType, expectedStaticType);
     }
     if (expectedPropagatedType != null) {
-      JUnitTestCase.assertEquals(expectedPropagatedType, identifier.propagatedType);
+      expect(identifier.propagatedType, expectedPropagatedType);
     }
   }
 
@@ -10713,7 +11046,7 @@
       // here should be a failure, in both "test_*" and "fail_*" tests.
       // However, an assertion failure is success for the purpose of "fail_*" tests, so
       // without catching them here "fail_*" tests can succeed by failing for the wrong reason.
-      throw new JavaException("Unexexpected assertion failure: ${exception}");
+      throw new JavaException("Unexexpected assertion failure: $exception");
     }
   }
 }
@@ -10756,19 +11089,19 @@
     // Create a type provider and ensure that it can return the expected types.
     //
     TypeProviderImpl provider = new TypeProviderImpl(coreLibrary);
-    JUnitTestCase.assertSame(boolType, provider.boolType);
-    JUnitTestCase.assertNotNull(provider.bottomType);
-    JUnitTestCase.assertSame(doubleType, provider.doubleType);
-    JUnitTestCase.assertNotNull(provider.dynamicType);
-    JUnitTestCase.assertSame(functionType, provider.functionType);
-    JUnitTestCase.assertSame(intType, provider.intType);
-    JUnitTestCase.assertSame(listType, provider.listType);
-    JUnitTestCase.assertSame(mapType, provider.mapType);
-    JUnitTestCase.assertSame(objectType, provider.objectType);
-    JUnitTestCase.assertSame(stackTraceType, provider.stackTraceType);
-    JUnitTestCase.assertSame(stringType, provider.stringType);
-    JUnitTestCase.assertSame(symbolType, provider.symbolType);
-    JUnitTestCase.assertSame(typeType, provider.typeType);
+    expect(provider.boolType, same(boolType));
+    expect(provider.bottomType, isNotNull);
+    expect(provider.doubleType, same(doubleType));
+    expect(provider.dynamicType, isNotNull);
+    expect(provider.functionType, same(functionType));
+    expect(provider.intType, same(intType));
+    expect(provider.listType, same(listType));
+    expect(provider.mapType, same(mapType));
+    expect(provider.objectType, same(objectType));
+    expect(provider.stackTraceType, same(stackTraceType));
+    expect(provider.stringType, same(stringType));
+    expect(provider.symbolType, same(symbolType));
+    expect(provider.typeType, same(typeType));
   }
 
   ClassElement _classElement(String typeName, InterfaceType superclassType, List<String> parameterNames) {
@@ -10821,37 +11154,37 @@
   ImplicitConstructorBuilder _implicitConstructorBuilder;
 
   void fail_visitConstructorDeclaration() {
-    JUnitTestCase.fail("Not yet tested");
+    fail("Not yet tested");
     _listener.assertNoErrors();
   }
 
   void fail_visitFunctionDeclaration() {
-    JUnitTestCase.fail("Not yet tested");
+    fail("Not yet tested");
     _listener.assertNoErrors();
   }
 
   void fail_visitFunctionTypeAlias() {
-    JUnitTestCase.fail("Not yet tested");
+    fail("Not yet tested");
     _listener.assertNoErrors();
   }
 
   void fail_visitFunctionTypedFormalParameter() {
-    JUnitTestCase.fail("Not yet tested");
+    fail("Not yet tested");
     _listener.assertNoErrors();
   }
 
   void fail_visitMethodDeclaration() {
-    JUnitTestCase.fail("Not yet tested");
+    fail("Not yet tested");
     _listener.assertNoErrors();
   }
 
   void fail_visitVariableDeclaration() {
-    JUnitTestCase.fail("Not yet tested");
+    fail("Not yet tested");
     ClassElement type = ElementFactory.classElement2("A", []);
     VariableDeclaration node = AstFactory.variableDeclaration("a");
     AstFactory.variableDeclarationList(null, AstFactory.typeName(type, []), [node]);
     //resolve(node);
-    JUnitTestCase.assertSame(type.type, node.name.staticType);
+    expect(node.name.staticType, same(type.type));
     _listener.assertNoErrors();
   }
 
@@ -10931,13 +11264,13 @@
     ClassDeclaration declaration = AstFactory.classDeclaration(null, "A", null, extendsClause, withClause, implementsClause, []);
     declaration.name.staticElement = elementA;
     _resolveNode(declaration, [elementA, elementB, elementC, elementD]);
-    JUnitTestCase.assertSame(elementB.type, elementA.supertype);
+    expect(elementA.supertype, same(elementB.type));
     List<InterfaceType> mixins = elementA.mixins;
-    EngineTestCase.assertLength(1, mixins);
-    JUnitTestCase.assertSame(elementC.type, mixins[0]);
+    expect(mixins, hasLength(1));
+    expect(mixins[0], same(elementC.type));
     List<InterfaceType> interfaces = elementA.interfaces;
-    EngineTestCase.assertLength(1, interfaces);
-    JUnitTestCase.assertSame(elementD.type, interfaces[0]);
+    expect(interfaces, hasLength(1));
+    expect(interfaces[0], same(elementD.type));
     _listener.assertNoErrors();
   }
 
@@ -10953,7 +11286,7 @@
     ClassDeclaration declaration = AstFactory.classDeclaration(null, "B", null, extendsClause, null, null, []);
     declaration.name.staticElement = elementB;
     _resolveNode(declaration, [elementA, elementB]);
-    JUnitTestCase.assertSame(elementA.type, elementB.supertype);
+    expect(elementB.supertype, same(elementA.type));
     _listener.assertNoErrors();
   }
 
@@ -10968,13 +11301,13 @@
     ClassTypeAlias alias = AstFactory.classTypeAlias("A", null, null, AstFactory.typeName(elementB, []), withClause, implementsClause);
     alias.name.staticElement = elementA;
     _resolveNode(alias, [elementA, elementB, elementC, elementD]);
-    JUnitTestCase.assertSame(elementB.type, elementA.supertype);
+    expect(elementA.supertype, same(elementB.type));
     List<InterfaceType> mixins = elementA.mixins;
-    EngineTestCase.assertLength(1, mixins);
-    JUnitTestCase.assertSame(elementC.type, mixins[0]);
+    expect(mixins, hasLength(1));
+    expect(mixins[0], same(elementC.type));
     List<InterfaceType> interfaces = elementA.interfaces;
-    EngineTestCase.assertLength(1, interfaces);
-    JUnitTestCase.assertSame(elementD.type, interfaces[0]);
+    expect(interfaces, hasLength(1));
+    expect(interfaces[0], same(elementD.type));
     _listener.assertNoErrors();
   }
 
@@ -10990,8 +11323,8 @@
     DartType parameterType = _resolveFormalParameter(node, [intType.element]);
     EngineTestCase.assertInstanceOf((obj) => obj is FunctionType, FunctionType, parameterType);
     FunctionType functionType = parameterType as FunctionType;
-    JUnitTestCase.assertSame(intType, functionType.returnType);
-    EngineTestCase.assertLength(1, functionType.parameters);
+    expect(functionType.returnType, same(intType));
+    expect(functionType.parameters, hasLength(1));
     _listener.assertNoErrors();
   }
 
@@ -10999,7 +11332,7 @@
     String parameterName = "p";
     FormalParameter node = AstFactory.fieldFormalParameter(Keyword.VAR, null, parameterName);
     node.identifier.staticElement = ElementFactory.requiredParameter(parameterName);
-    JUnitTestCase.assertSame(_typeProvider.dynamicType, _resolveFormalParameter(node, []));
+    expect(_resolveFormalParameter(node, []), same(_typeProvider.dynamicType));
     _listener.assertNoErrors();
   }
 
@@ -11009,7 +11342,7 @@
     String parameterName = "p";
     FormalParameter node = AstFactory.fieldFormalParameter(null, intTypeName, parameterName);
     node.identifier.staticElement = ElementFactory.requiredParameter(parameterName);
-    JUnitTestCase.assertSame(intType, _resolveFormalParameter(node, [intType.element]));
+    expect(_resolveFormalParameter(node, [intType.element]), same(intType));
     _listener.assertNoErrors();
   }
 
@@ -11017,7 +11350,7 @@
     // p
     FormalParameter node = AstFactory.simpleFormalParameter3("p");
     node.identifier.staticElement = new ParameterElementImpl.forNode(AstFactory.identifier3("p"));
-    JUnitTestCase.assertSame(_typeProvider.dynamicType, _resolveFormalParameter(node, []));
+    expect(_resolveFormalParameter(node, []), same(_typeProvider.dynamicType));
     _listener.assertNoErrors();
   }
 
@@ -11029,7 +11362,7 @@
     SimpleIdentifier identifier = node.identifier;
     ParameterElementImpl element = new ParameterElementImpl.forNode(identifier);
     identifier.staticElement = element;
-    JUnitTestCase.assertSame(intType, _resolveFormalParameter(node, [intElement]));
+    expect(_resolveFormalParameter(node, [intElement]), same(intType));
     _listener.assertNoErrors();
   }
 
@@ -11038,7 +11371,7 @@
     TypeName typeName = AstFactory.typeName(classA, []);
     typeName.type = null;
     _resolveNode(typeName, [classA]);
-    JUnitTestCase.assertSame(classA.type, typeName.type);
+    expect(typeName.type, same(classA.type));
     _listener.assertNoErrors();
   }
 
@@ -11049,10 +11382,10 @@
     typeName.type = null;
     _resolveNode(typeName, [classA, classB]);
     InterfaceType resultType = typeName.type as InterfaceType;
-    JUnitTestCase.assertSame(classA, resultType.element);
+    expect(resultType.element, same(classA));
     List<DartType> resultArguments = resultType.typeArguments;
-    EngineTestCase.assertLength(1, resultArguments);
-    JUnitTestCase.assertSame(classB.type, resultArguments[0]);
+    expect(resultArguments, hasLength(1));
+    expect(resultArguments[0], same(classB.type));
     _listener.assertNoErrors();
   }
 
@@ -11062,10 +11395,10 @@
     typeName.type = null;
     _resolveNode(typeName, [classA]);
     InterfaceType resultType = typeName.type as InterfaceType;
-    JUnitTestCase.assertSame(classA, resultType.element);
+    expect(resultType.element, same(classA));
     List<DartType> resultArguments = resultType.typeArguments;
-    EngineTestCase.assertLength(1, resultArguments);
-    JUnitTestCase.assertSame(DynamicTypeImpl.instance, resultArguments[0]);
+    expect(resultArguments, hasLength(1));
+    expect(resultArguments[0], same(DynamicTypeImpl.instance));
     _listener.assertNoErrors();
   }
 
@@ -11073,7 +11406,7 @@
     ClassElement classA = ElementFactory.classElement2("A", []);
     TypeName typeName = AstFactory.typeName4("void", []);
     _resolveNode(typeName, [classA]);
-    JUnitTestCase.assertSame(VoidTypeImpl.instance, typeName.type);
+    expect(typeName.type, same(VoidTypeImpl.instance));
     _listener.assertNoErrors();
   }
 
@@ -11092,11 +11425,11 @@
     _resolveNode(node, definedElements);
     SimpleIdentifier exceptionParameter = node.exceptionParameter;
     if (exceptionParameter != null) {
-      JUnitTestCase.assertSame(exceptionType, exceptionParameter.staticType);
+      expect(exceptionParameter.staticType, same(exceptionType));
     }
     SimpleIdentifier stackTraceParameter = node.stackTraceParameter;
     if (stackTraceParameter != null) {
-      JUnitTestCase.assertSame(stackTraceType, stackTraceParameter.staticType);
+      expect(stackTraceParameter.staticType, same(stackTraceType));
     }
   }
 
@@ -11133,7 +11466,7 @@
 }
 
 main() {
-  _ut.groupSep = ' | ';
+  groupSep = ' | ';
   runReflectiveTests(AnalysisDeltaTest);
   runReflectiveTests(ChangeSetTest);
   runReflectiveTests(EnclosedScopeTest);
diff --git a/pkg/analyzer/test/generated/scanner_test.dart b/pkg/analyzer/test/generated/scanner_test.dart
index 1135292..de61b98 100644
--- a/pkg/analyzer/test/generated/scanner_test.dart
+++ b/pkg/analyzer/test/generated/scanner_test.dart
@@ -7,89 +7,98 @@
 
 library engine.scanner_test;
 
-import 'package:analyzer/src/generated/java_core.dart';
-import 'package:analyzer/src/generated/java_junit.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/error.dart';
 import 'package:analyzer/src/generated/scanner.dart';
 import 'package:analyzer/src/generated/utilities_collection.dart' show TokenMap;
-import 'package:unittest/unittest.dart' as _ut;
+import 'package:unittest/unittest.dart';
 import 'test_support.dart';
 import '../reflective_tests.dart';
 
 
-class CharSequenceReaderTest extends JUnitTestCase {
+class CharSequenceReaderTest {
   void test_advance() {
     CharSequenceReader reader = new CharSequenceReader("x");
-    JUnitTestCase.assertEquals(0x78, reader.advance());
-    JUnitTestCase.assertEquals(-1, reader.advance());
-    JUnitTestCase.assertEquals(-1, reader.advance());
+    expect(reader.advance(), 0x78);
+    expect(reader.advance(), -1);
+    expect(reader.advance(), -1);
   }
 
   void test_creation() {
-    JUnitTestCase.assertNotNull(new CharSequenceReader("x"));
+    expect(new CharSequenceReader("x"), isNotNull);
   }
 
   void test_getOffset() {
     CharSequenceReader reader = new CharSequenceReader("x");
-    JUnitTestCase.assertEquals(-1, reader.offset);
+    expect(reader.offset, -1);
     reader.advance();
-    JUnitTestCase.assertEquals(0, reader.offset);
+    expect(reader.offset, 0);
     reader.advance();
-    JUnitTestCase.assertEquals(0, reader.offset);
+    expect(reader.offset, 0);
   }
 
   void test_getString() {
     CharSequenceReader reader = new CharSequenceReader("xyzzy");
     reader.offset = 3;
-    JUnitTestCase.assertEquals("yzz", reader.getString(1, 0));
-    JUnitTestCase.assertEquals("zzy", reader.getString(2, 1));
+    expect(reader.getString(1, 0), "yzz");
+    expect(reader.getString(2, 1), "zzy");
   }
 
   void test_peek() {
     CharSequenceReader reader = new CharSequenceReader("xy");
-    JUnitTestCase.assertEquals(0x78, reader.peek());
-    JUnitTestCase.assertEquals(0x78, reader.peek());
+    expect(reader.peek(), 0x78);
+    expect(reader.peek(), 0x78);
     reader.advance();
-    JUnitTestCase.assertEquals(0x79, reader.peek());
-    JUnitTestCase.assertEquals(0x79, reader.peek());
+    expect(reader.peek(), 0x79);
+    expect(reader.peek(), 0x79);
     reader.advance();
-    JUnitTestCase.assertEquals(-1, reader.peek());
-    JUnitTestCase.assertEquals(-1, reader.peek());
+    expect(reader.peek(), -1);
+    expect(reader.peek(), -1);
   }
 
   void test_setOffset() {
     CharSequenceReader reader = new CharSequenceReader("xyz");
     reader.offset = 2;
-    JUnitTestCase.assertEquals(2, reader.offset);
+    expect(reader.offset, 2);
   }
 }
 
 class IncrementalScannerTest extends EngineTestCase {
   /**
-   * The first token from the token stream resulting from parsing the original source, or
-   * `null` if [scan] has not been invoked.
+   * The first token from the token stream resulting from parsing the original
+   * source, or `null` if [scan] has not been invoked.
    */
   Token _originalTokens;
 
   /**
-   * The scanner used to perform incremental scanning, or `null` if [scan] has not been
-   * invoked.
+   * The scanner used to perform incremental scanning, or `null` if [scan] has
+   * not been invoked.
    */
   IncrementalScanner _incrementalScanner;
 
   /**
-   * The first token from the token stream resulting from performing an incremental scan, or
-   * `null` if [scan] has not been invoked.
+   * The first token from the token stream resulting from performing an
+   * incremental scan, or `null` if [scan] has not been invoked.
    */
   Token _incrementalTokens;
 
+  void fail_insert_beginning() {
+    // This is currently reporting the changed range as being from 0 to 5, but
+    // that would force us to re-parse both classes, which is clearly sub-optimal.
+    //
+    // "class B {}"
+    // "class A {} class B {}"
+    _scan("", "", "class A {} ", "class B {}");
+    _assertTokens(-1, 4, ["class", "A", "{", "}", "class", "B", "{", "}"]);
+    expect(_incrementalScanner.hasNonWhitespaceChange, isTrue);
+  }
+
   void test_delete_identifier_beginning() {
     // "abs + b;"
     // "s + b;")
     _scan("", "ab", "", "s + b;");
     _assertTokens(-1, 1, ["s", "+", "b", ";"]);
-    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
+    expect(_incrementalScanner.hasNonWhitespaceChange, isTrue);
   }
 
   void test_delete_identifier_end() {
@@ -97,7 +106,7 @@
     // "a + b;")
     _scan("a", "bs", "", " + b;");
     _assertTokens(-1, 1, ["a", "+", "b", ";"]);
-    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
+    expect(_incrementalScanner.hasNonWhitespaceChange, isTrue);
   }
 
   void test_delete_identifier_middle() {
@@ -105,7 +114,7 @@
     // "as + b;")
     _scan("a", "b", "", "s + b;");
     _assertTokens(-1, 1, ["as", "+", "b", ";"]);
-    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
+    expect(_incrementalScanner.hasNonWhitespaceChange, isTrue);
   }
 
   void test_delete_mergeTokens() {
@@ -113,24 +122,40 @@
     // "ac;")
     _scan("a", " + b + ", "", "c;");
     _assertTokens(-1, 1, ["ac", ";"]);
-    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
+    expect(_incrementalScanner.hasNonWhitespaceChange, isTrue);
   }
 
-  void test_insert_afterIdentifier1() {
+  void test_delete_whitespace() {
+    // "a + b + c;"
+    // "a+ b + c;")
+    _scan("a", " ", "", "+ b + c;");
+    _assertTokens(1, 2, ["a", "+", "b", "+", "c", ";"]);
+    expect(_incrementalScanner.hasNonWhitespaceChange, isFalse);
+  }
+
+  void test_insert_afterIdentifier_firstToken() {
     // "a + b;"
     // "abs + b;"
     _scan("a", "", "bs", " + b;");
     _assertTokens(-1, 1, ["abs", "+", "b", ";"]);
     _assertReplaced(1, "+");
-    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
+    expect(_incrementalScanner.hasNonWhitespaceChange, isTrue);
   }
 
-  void test_insert_afterIdentifier2() {
+  void test_insert_afterIdentifier_lastToken() {
+    // "a + b"
+    // "a + bc")
+    _scan("a + b", "", "c", "");
+    _assertTokens(1, 3, ["a", "+", "bc"]);
+    expect(_incrementalScanner.hasNonWhitespaceChange, isTrue);
+  }
+
+  void test_insert_afterIdentifier_middleToken() {
     // "a + b;"
     // "a + by;"
     _scan("a + b", "", "y", ";");
     _assertTokens(1, 3, ["a", "+", "by", ";"]);
-    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
+    expect(_incrementalScanner.hasNonWhitespaceChange, isTrue);
   }
 
   void test_insert_beforeIdentifier() {
@@ -138,7 +163,7 @@
     // "a + xb;")
     _scan("a + ", "", "x", "b;");
     _assertTokens(1, 3, ["a", "+", "xb", ";"]);
-    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
+    expect(_incrementalScanner.hasNonWhitespaceChange, isTrue);
   }
 
   void test_insert_beforeIdentifier_firstToken() {
@@ -146,7 +171,7 @@
     // "xa + b;"
     _scan("", "", "x", "a + b;");
     _assertTokens(-1, 1, ["xa", "+", "b", ";"]);
-    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
+    expect(_incrementalScanner.hasNonWhitespaceChange, isTrue);
   }
 
   void test_insert_convertOneFunctionToTwo() {
@@ -154,7 +179,15 @@
     // "f() => 0; g() {}"
     _scan("f()", "", " => 0; g()", " {}");
     _assertTokens(2, 9, ["f", "(", ")", "=>", "0", ";", "g", "(", ")", "{", "}"]);
-    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
+    expect(_incrementalScanner.hasNonWhitespaceChange, isTrue);
+  }
+
+  void test_insert_convertOneFunctionToTwo_overlap() {
+    // "f() {}"
+    // "f() {} g() {}"
+    _scan("f() {", "", "} g() {", "}");
+    _assertTokens(4, 10, ["f", "(", ")", "{", "}", "g", "(", ")", "{", "}"]);
+    expect(_incrementalScanner.hasNonWhitespaceChange, isTrue);
   }
 
   void test_insert_end() {
@@ -162,7 +195,7 @@
     // "class A {} class B {}"
     _scan("class A {}", "", " class B {}", "");
     _assertTokens(3, 8, ["class", "A", "{", "}", "class", "B", "{", "}"]);
-    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
+    expect(_incrementalScanner.hasNonWhitespaceChange, isTrue);
   }
 
   void test_insert_insideIdentifier() {
@@ -170,24 +203,24 @@
     // "cow.b;"
     _scan("co", "", "w.", "b;");
     _assertTokens(-1, 3, ["cow", ".", "b", ";"]);
-    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
+    expect(_incrementalScanner.hasNonWhitespaceChange, isTrue);
   }
 
-  void test_insert_newIdentifier1() {
-    // "a;  c;"
-    // "a; b c;"
-    _scan("a; ", "", "b", " c;");
-    _assertTokens(1, 3, ["a", ";", "b", "c", ";"]);
-    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
-  }
-
-  void test_insert_newIdentifier2() {
-    // "a;  c;"
-    // "a;b  c;"
-    _scan("a;", "", "b", "  c;");
+  void test_insert_newIdentifier_noSpaceBefore() {
+    // "a; c;"
+    // "a;b c;"
+    _scan("a;", "", "b", " c;");
     _assertTokens(1, 3, ["a", ";", "b", "c", ";"]);
     _assertReplaced(1, ";");
-    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
+    expect(_incrementalScanner.hasNonWhitespaceChange, isTrue);
+  }
+
+  void test_insert_newIdentifier_spaceBefore() {
+    // "a; c;"
+    // "a; b c;"
+    _scan("a; ", "", "b ", "c;");
+    _assertTokens(1, 3, ["a", ";", "b", "c", ";"]);
+    expect(_incrementalScanner.hasNonWhitespaceChange, isTrue);
   }
 
   void test_insert_period() {
@@ -197,27 +230,27 @@
     _assertTokens(2, 4, ["a", "+", "b", ".", ";"]);
   }
 
-  void test_insert_period_betweenIdentifiers1() {
+  void test_insert_period_betweenIdentifiers_left() {
     // "a b;"
     // "a. b;"
     _scan("a", "", ".", " b;");
     _assertTokens(0, 2, ["a", ".", "b", ";"]);
-    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
+    expect(_incrementalScanner.hasNonWhitespaceChange, isTrue);
   }
 
-  void test_insert_period_betweenIdentifiers2() {
-    // "a b;"
-    // "a .b;"
-    _scan("a ", "", ".", "b;");
-    _assertTokens(0, 2, ["a", ".", "b", ";"]);
-  }
-
-  void test_insert_period_betweenIdentifiers3() {
+  void test_insert_period_betweenIdentifiers_middle() {
     // "a  b;"
     // "a . b;"
     _scan("a ", "", ".", " b;");
     _assertTokens(0, 2, ["a", ".", "b", ";"]);
-    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
+    expect(_incrementalScanner.hasNonWhitespaceChange, isTrue);
+  }
+
+  void test_insert_period_betweenIdentifiers_right() {
+    // "a b;"
+    // "a .b;"
+    _scan("a ", "", ".", "b;");
+    _assertTokens(0, 2, ["a", ".", "b", ";"]);
   }
 
   void test_insert_period_insideExistingIdentifier() {
@@ -225,7 +258,7 @@
     // "a.b;"
     _scan("a", "", ".", "b;");
     _assertTokens(-1, 3, ["a", ".", "b", ";"]);
-    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
+    expect(_incrementalScanner.hasNonWhitespaceChange, isTrue);
   }
 
   void test_insert_periodAndIdentifier() {
@@ -240,7 +273,7 @@
     // " a + b;"
     _scan("", "", " ", "a + b;");
     _assertTokens(0, 1, ["a", "+", "b", ";"]);
-    JUnitTestCase.assertFalse(_incrementalScanner.hasNonWhitespaceChange);
+    expect(_incrementalScanner.hasNonWhitespaceChange, isFalse);
   }
 
   void test_insert_whitespace_betweenTokens() {
@@ -248,7 +281,7 @@
     // "a  + b;"
     _scan("a ", "", " ", "+ b;");
     _assertTokens(1, 2, ["a", "+", "b", ";"]);
-    JUnitTestCase.assertFalse(_incrementalScanner.hasNonWhitespaceChange);
+    expect(_incrementalScanner.hasNonWhitespaceChange, isFalse);
   }
 
   void test_insert_whitespace_end_afterToken() {
@@ -256,7 +289,7 @@
     // "a + b; "
     _scan("a + b;", "", " ", "");
     _assertTokens(3, 4, ["a", "+", "b", ";"]);
-    JUnitTestCase.assertFalse(_incrementalScanner.hasNonWhitespaceChange);
+    expect(_incrementalScanner.hasNonWhitespaceChange, isFalse);
   }
 
   void test_insert_whitespace_end_afterWhitespace() {
@@ -264,15 +297,18 @@
     // "a + b;  "
     _scan("a + b; ", "", " ", "");
     _assertTokens(3, 4, ["a", "+", "b", ";"]);
-    JUnitTestCase.assertFalse(_incrementalScanner.hasNonWhitespaceChange);
+    expect(_incrementalScanner.hasNonWhitespaceChange, isFalse);
   }
 
   void test_insert_whitespace_withMultipleComments() {
     // "//comment", "//comment2", "a + b;"
     // "//comment", "//comment2", "a  + b;"
-    _scan(EngineTestCase.createSource(["//comment", "//comment2", "a"]), "", " ", " + b;");
+    _scan(r'''
+//comment
+//comment2
+a''', "", " ", " + b;");
     _assertTokens(1, 2, ["a", "+", "b", ";"]);
-    JUnitTestCase.assertFalse(_incrementalScanner.hasNonWhitespaceChange);
+    expect(_incrementalScanner.hasNonWhitespaceChange, isFalse);
   }
 
   void test_replace_identifier_beginning() {
@@ -280,7 +316,7 @@
     // "fell + b;")
     _scan("", "b", "f", "ell + b;");
     _assertTokens(-1, 1, ["fell", "+", "b", ";"]);
-    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
+    expect(_incrementalScanner.hasNonWhitespaceChange, isTrue);
   }
 
   void test_replace_identifier_end() {
@@ -288,7 +324,7 @@
     // "belt + b;")
     _scan("bel", "l", "t", " + b;");
     _assertTokens(-1, 1, ["belt", "+", "b", ";"]);
-    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
+    expect(_incrementalScanner.hasNonWhitespaceChange, isTrue);
   }
 
   void test_replace_identifier_middle() {
@@ -296,7 +332,7 @@
     // "frost + b;")
     _scan("f", "ir", "ro", "st + b;");
     _assertTokens(-1, 1, ["frost", "+", "b", ";"]);
-    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
+    expect(_incrementalScanner.hasNonWhitespaceChange, isTrue);
   }
 
   void test_replace_multiple_partialFirstAndLast() {
@@ -304,7 +340,7 @@
     // "ab * ab;")
     _scan("a", "a + b", "b * a", "b;");
     _assertTokens(-1, 3, ["ab", "*", "ab", ";"]);
-    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
+    expect(_incrementalScanner.hasNonWhitespaceChange, isTrue);
   }
 
   void test_replace_operator_oneForMany() {
@@ -312,7 +348,7 @@
     // "a * c - b;")
     _scan("a ", "+", "* c -", " b;");
     _assertTokens(0, 4, ["a", "*", "c", "-", "b", ";"]);
-    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
+    expect(_incrementalScanner.hasNonWhitespaceChange, isTrue);
   }
 
   void test_replace_operator_oneForOne() {
@@ -320,7 +356,7 @@
     // "a * b;")
     _scan("a ", "+", "*", " b;");
     _assertTokens(0, 2, ["a", "*", "b", ";"]);
-    JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
+    expect(_incrementalScanner.hasNonWhitespaceChange, isTrue);
   }
 
   void test_tokenMap() {
@@ -331,45 +367,45 @@
     Token oldToken = _originalTokens;
     while (oldToken.type != TokenType.EOF) {
       Token newToken = tokenMap.get(oldToken);
-      JUnitTestCase.assertNotSame(oldToken, newToken);
-      JUnitTestCase.assertSame(oldToken.type, newToken.type);
-      JUnitTestCase.assertEquals(oldToken.lexeme, newToken.lexeme);
+      expect(newToken, isNot(same(oldToken)));
+      expect(newToken.type, same(oldToken.type));
+      expect(newToken.lexeme, oldToken.lexeme);
       oldToken = oldToken.next;
     }
-    JUnitTestCase.assertFalse(_incrementalScanner.hasNonWhitespaceChange);
+    expect(_incrementalScanner.hasNonWhitespaceChange, isFalse);
   }
 
   /**
-   * Assert that the token at the given offset was replaced with a new token having the given
-   * lexeme.
-   *
-   * @param tokenOffset the offset of the token being tested
-   * @param lexeme the expected lexeme of the new token
+   * Assert that the token at the given [offset] was replaced with a new token
+   * having the given [lexeme].
    */
-  void _assertReplaced(int tokenOffset, String lexeme) {
+  void _assertReplaced(int offset, String lexeme) {
     Token oldToken = _originalTokens;
-    for (int i = 0; i < tokenOffset; i++) {
+    for (int i = 0; i < offset; i++) {
       oldToken = oldToken.next;
     }
-    JUnitTestCase.assertEquals(lexeme, oldToken.lexeme);
+    expect(oldToken.lexeme, lexeme);
     Token newToken = _incrementalScanner.tokenMap.get(oldToken);
-    JUnitTestCase.assertNotNull(newToken);
-    JUnitTestCase.assertEquals(lexeme, newToken.lexeme);
-    JUnitTestCase.assertNotSame(oldToken, newToken);
+    expect(newToken, isNotNull);
+    expect(newToken.lexeme, lexeme);
+    expect(newToken, isNot(same(oldToken)));
   }
 
   /**
-   * Assert that the result of the incremental scan matches the given list of lexemes and that the
-   * left and right tokens correspond to the tokens at the given indices.
-   *
-   * @param leftIndex the expected index of the left token
-   * @param rightIndex the expected index of the right token
-   * @param lexemes the expected lexemes of the resulting tokens
+   * Assert that the result of the incremental scan matches the given list of
+   * [lexemes] and that the left and right tokens correspond to the tokens at
+   * the [leftIndex] and [rightIndex].
    */
   void _assertTokens(int leftIndex, int rightIndex, List<String> lexemes) {
     int count = lexemes.length;
-    JUnitTestCase.assertTrueMsg("Invalid left index", leftIndex >= -1 && leftIndex < count);
-    JUnitTestCase.assertTrueMsg("Invalid right index", rightIndex >= 0 && rightIndex <= count);
+    expect(
+        leftIndex >= -1 && leftIndex < count,
+        isTrue,
+        reason: "Invalid left index");
+    expect(
+        rightIndex >= 0 && rightIndex <= count,
+        isTrue,
+        reason: "Invalid right index");
     Token leftToken = null;
     Token rightToken = null;
     Token token = _incrementalTokens;
@@ -377,7 +413,7 @@
       leftToken = token.previous;
     }
     for (int i = 0; i < count; i++) {
-      JUnitTestCase.assertEquals(lexemes[i], token.lexeme);
+      expect(token.lexeme, lexemes[i]);
       if (i == leftIndex) {
         leftToken = token;
       }
@@ -389,76 +425,114 @@
     if (rightIndex >= count) {
       rightToken = token;
     }
-    JUnitTestCase.assertSameMsg("Too many tokens", TokenType.EOF, token.type);
+    expect(token.type, same(TokenType.EOF), reason: "Too many tokens");
     if (leftIndex >= 0) {
-      JUnitTestCase.assertNotNull(leftToken);
+      expect(leftToken, isNotNull);
     }
-    JUnitTestCase.assertSameMsg("Invalid left token", leftToken, _incrementalScanner.leftToken);
+    expect(
+        _incrementalScanner.leftToken,
+        same(leftToken),
+        reason: "Invalid left token");
     if (rightIndex >= 0) {
-      JUnitTestCase.assertNotNull(rightToken);
+      expect(rightToken, isNotNull);
     }
-    JUnitTestCase.assertSameMsg("Invalid right token", rightToken, _incrementalScanner.rightToken);
+    expect(
+        _incrementalScanner.rightToken,
+        same(rightToken),
+        reason: "Invalid right token");
   }
 
   /**
-   * Given a description of the original and modified contents, perform an incremental scan of the
-   * two pieces of text. Verify that the incremental scan produced the same tokens as those that
-   * would be produced by a full scan of the new contents.
+   * Given a description of the original and modified contents, perform an
+   * incremental scan of the two pieces of text. Verify that the incremental
+   * scan produced the same tokens as those that would be produced by a full
+   * scan of the new contents.
    *
-   * @param prefix the unchanged text before the edit region
-   * @param removed the text that was removed from the original contents
-   * @param added the text that was added to the modified contents
-   * @param suffix the unchanged text after the edit region
+   * The original content is the concatenation of the [prefix], [removed] and
+   * [suffix] fragments. The modeified content is the concatenation of the
+   * [prefix], [added] and [suffix] fragments.
    */
   void _scan(String prefix, String removed, String added, String suffix) {
     //
     // Compute the information needed to perform the test.
     //
-    String originalContents = "${prefix}${removed}${suffix}";
-    String modifiedContents = "${prefix}${added}${suffix}";
+    String originalContents = "$prefix$removed$suffix";
+    String modifiedContents = "$prefix$added$suffix";
     int replaceStart = prefix.length;
     Source source = new TestSource();
     //
     // Scan the original contents.
     //
     GatheringErrorListener originalListener = new GatheringErrorListener();
-    Scanner originalScanner = new Scanner(source, new CharSequenceReader(originalContents), originalListener);
+    Scanner originalScanner = new Scanner(
+        source,
+        new CharSequenceReader(originalContents),
+        originalListener);
     _originalTokens = originalScanner.tokenize();
-    JUnitTestCase.assertNotNull(_originalTokens);
+    expect(_originalTokens, isNotNull);
     //
     // Scan the modified contents.
     //
     GatheringErrorListener modifiedListener = new GatheringErrorListener();
-    Scanner modifiedScanner = new Scanner(source, new CharSequenceReader(modifiedContents), modifiedListener);
+    Scanner modifiedScanner = new Scanner(
+        source,
+        new CharSequenceReader(modifiedContents),
+        modifiedListener);
     Token modifiedTokens = modifiedScanner.tokenize();
-    JUnitTestCase.assertNotNull(modifiedTokens);
+    expect(modifiedTokens, isNotNull);
     //
     // Incrementally scan the modified contents.
     //
     GatheringErrorListener incrementalListener = new GatheringErrorListener();
-    _incrementalScanner = new IncrementalScanner(source, new CharSequenceReader(modifiedContents), incrementalListener);
-    _incrementalTokens = _incrementalScanner.rescan(_originalTokens, replaceStart, removed.length, added.length);
+    _incrementalScanner = new IncrementalScanner(
+        source,
+        new CharSequenceReader(modifiedContents),
+        incrementalListener);
+    _incrementalTokens = _incrementalScanner.rescan(
+        _originalTokens,
+        replaceStart,
+        removed.length,
+        added.length);
     //
-    // Validate that the results of the incremental scan are the same as the full scan of the
-    // modified source.
+    // Validate that the results of the incremental scan are the same as the
+    // full scan of the modified source.
     //
     Token incrementalToken = _incrementalTokens;
-    JUnitTestCase.assertNotNull(incrementalToken);
-    while (incrementalToken.type != TokenType.EOF && modifiedTokens.type != TokenType.EOF) {
-      JUnitTestCase.assertSameMsg("Wrong type for token", modifiedTokens.type, incrementalToken.type);
-      JUnitTestCase.assertEqualsMsg("Wrong offset for token", modifiedTokens.offset, incrementalToken.offset);
-      JUnitTestCase.assertEqualsMsg("Wrong length for token", modifiedTokens.length, incrementalToken.length);
-      JUnitTestCase.assertEqualsMsg("Wrong lexeme for token", modifiedTokens.lexeme, incrementalToken.lexeme);
+    expect(incrementalToken, isNotNull);
+    while (incrementalToken.type != TokenType.EOF
+        && modifiedTokens.type != TokenType.EOF) {
+      expect(
+          incrementalToken.type,
+          same(modifiedTokens.type),
+          reason: "Wrong type for token");
+      expect(
+          incrementalToken.offset,
+              modifiedTokens.offset,
+              reason: "Wrong offset for token");
+      expect(
+          incrementalToken.length,
+              modifiedTokens.length,
+              reason: "Wrong length for token");
+      expect(
+          incrementalToken.lexeme,
+              modifiedTokens.lexeme,
+              reason: "Wrong lexeme for token");
       incrementalToken = incrementalToken.next;
       modifiedTokens = modifiedTokens.next;
     }
-    JUnitTestCase.assertSameMsg("Too many tokens", TokenType.EOF, incrementalToken.type);
-    JUnitTestCase.assertSameMsg("Not enough tokens", TokenType.EOF, modifiedTokens.type);
+    expect(
+        incrementalToken.type,
+        same(TokenType.EOF),
+        reason: "Too many tokens");
+    expect(
+        modifiedTokens.type,
+        same(TokenType.EOF),
+        reason: "Not enough tokens");
     // TODO(brianwilkerson) Verify that the errors are correct?
   }
 }
 
-class KeywordStateTest extends JUnitTestCase {
+class KeywordStateTest {
   void test_KeywordState() {
     //
     // Generate the test data to be scanned.
@@ -487,21 +561,21 @@
       }
       if (i < keywordCount) {
         // keyword
-        JUnitTestCase.assertNotNull(state);
-        JUnitTestCase.assertNotNull(state.keyword());
-        JUnitTestCase.assertEquals(keywords[i], state.keyword());
+        expect(state, isNotNull);
+        expect(state.keyword(), isNotNull);
+        expect(state.keyword(), keywords[i]);
       } else if (i < keywordCount * 2) {
         // keyword + "x"
-        JUnitTestCase.assertNull(state);
+        expect(state, isNull);
       } else {
         // keyword.substring(0, keyword.length() - 1)
-        JUnitTestCase.assertNotNull(state);
+        expect(state, isNotNull);
       }
     }
   }
 }
 
-class ScannerTest extends JUnitTestCase {
+class ScannerTest {
   void fail_incomplete_string_interpolation() {
     // https://code.google.com/p/dart/issues/detail?id=18073
     _assertErrorAndTokens(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 9, "\"foo \${bar", [
@@ -586,8 +660,8 @@
     Scanner scanner = new Scanner(null, new CharSequenceReader("/* comment */ "), AnalysisErrorListener.NULL_LISTENER);
     scanner.preserveComments = false;
     Token token = scanner.tokenize();
-    JUnitTestCase.assertNotNull(token);
-    JUnitTestCase.assertNull(token.precedingComments);
+    expect(token, isNotNull);
+    expect(token.precedingComments, isNull);
   }
 
   void test_comment_multi() {
@@ -1054,9 +1128,9 @@
     scanner.setSourceStart(3, 9);
     scanner.tokenize();
     List<int> lineStarts = scanner.lineStarts;
-    JUnitTestCase.assertNotNull(lineStarts);
-    JUnitTestCase.assertEquals(3, lineStarts.length);
-    JUnitTestCase.assertEquals(33, lineStarts[2]);
+    expect(lineStarts, isNotNull);
+    expect(lineStarts.length, 3);
+    expect(lineStarts[2], 33);
   }
 
   void test_slash() {
@@ -1078,11 +1152,11 @@
   void test_startAndEnd() {
     Token token = _scan("a");
     Token previous = token.previous;
-    JUnitTestCase.assertEquals(token, previous.next);
-    JUnitTestCase.assertEquals(previous, previous.previous);
+    expect(previous.next, token);
+    expect(previous.previous, previous);
     Token next = token.next;
-    JUnitTestCase.assertEquals(next, next.next);
-    JUnitTestCase.assertEquals(token, next.previous);
+    expect(next.next, next);
+    expect(next.previous, token);
   }
 
   void test_string_multi_double() {
@@ -1170,7 +1244,7 @@
 
   void test_string_raw_simple_unterminated_eol() {
     String source = "r'string";
-    _assertErrorAndTokens(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 8, "${source}\n", [new StringToken(TokenType.STRING, source, 0)]);
+    _assertErrorAndTokens(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 8, "$source\n", [new StringToken(TokenType.STRING, source, 0)]);
   }
 
   void test_string_simple_double() {
@@ -1264,7 +1338,7 @@
 
   void test_string_simple_unterminated_eol() {
     String source = "'string";
-    _assertErrorAndTokens(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 7, "${source}\r", [new StringToken(TokenType.STRING, source, 0)]);
+    _assertErrorAndTokens(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 7, "$source\r", [new StringToken(TokenType.STRING, source, 0)]);
   }
 
   void test_string_simple_unterminated_interpolation_block() {
@@ -1305,26 +1379,26 @@
     // Test without a trailing end-of-line marker
     //
     Token token = _scan(source);
-    JUnitTestCase.assertNotNull(token);
-    JUnitTestCase.assertEquals(TokenType.EOF, token.type);
+    expect(token, isNotNull);
+    expect(token.type, TokenType.EOF);
     Token comment = token.precedingComments;
-    JUnitTestCase.assertNotNull(comment);
-    JUnitTestCase.assertEquals(commentType, comment.type);
-    JUnitTestCase.assertEquals(0, comment.offset);
-    JUnitTestCase.assertEquals(source.length, comment.length);
-    JUnitTestCase.assertEquals(source, comment.lexeme);
+    expect(comment, isNotNull);
+    expect(comment.type, commentType);
+    expect(comment.offset, 0);
+    expect(comment.length, source.length);
+    expect(comment.lexeme, source);
     //
     // Test with a trailing end-of-line marker
     //
-    token = _scan("${source}\n");
-    JUnitTestCase.assertNotNull(token);
-    JUnitTestCase.assertEquals(TokenType.EOF, token.type);
+    token = _scan("$source\n");
+    expect(token, isNotNull);
+    expect(token.type, TokenType.EOF);
     comment = token.precedingComments;
-    JUnitTestCase.assertNotNull(comment);
-    JUnitTestCase.assertEquals(commentType, comment.type);
-    JUnitTestCase.assertEquals(0, comment.offset);
-    JUnitTestCase.assertEquals(source.length, comment.length);
-    JUnitTestCase.assertEquals(source, comment.lexeme);
+    expect(comment, isNotNull);
+    expect(comment.type, commentType);
+    expect(comment.offset, 0);
+    expect(comment.length, source.length);
+    expect(comment.lexeme, source);
   }
 
   /**
@@ -1364,24 +1438,24 @@
    */
   void _assertKeywordToken(String source) {
     Token token = _scan(source);
-    JUnitTestCase.assertNotNull(token);
-    JUnitTestCase.assertEquals(TokenType.KEYWORD, token.type);
-    JUnitTestCase.assertEquals(0, token.offset);
-    JUnitTestCase.assertEquals(source.length, token.length);
-    JUnitTestCase.assertEquals(source, token.lexeme);
+    expect(token, isNotNull);
+    expect(token.type, TokenType.KEYWORD);
+    expect(token.offset, 0);
+    expect(token.length, source.length);
+    expect(token.lexeme, source);
     Object value = token.value();
-    JUnitTestCase.assertTrue(value is Keyword);
-    JUnitTestCase.assertEquals(source, (value as Keyword).syntax);
-    token = _scan(" ${source} ");
-    JUnitTestCase.assertNotNull(token);
-    JUnitTestCase.assertEquals(TokenType.KEYWORD, token.type);
-    JUnitTestCase.assertEquals(1, token.offset);
-    JUnitTestCase.assertEquals(source.length, token.length);
-    JUnitTestCase.assertEquals(source, token.lexeme);
+    expect(value is Keyword, isTrue);
+    expect((value as Keyword).syntax, source);
+    token = _scan(" $source ");
+    expect(token, isNotNull);
+    expect(token.type, TokenType.KEYWORD);
+    expect(token.offset, 1);
+    expect(token.length, source.length);
+    expect(token.lexeme, source);
     value = token.value();
-    JUnitTestCase.assertTrue(value is Keyword);
-    JUnitTestCase.assertEquals(source, (value as Keyword).syntax);
-    JUnitTestCase.assertEquals(TokenType.EOF, token.next.type);
+    expect(value is Keyword, isTrue);
+    expect((value as Keyword).syntax, source);
+    expect(token.next.type, TokenType.EOF);
   }
 
   void _assertLineInfo(String source, List<ScannerTest_ExpectedLocation> expectedLocations) {
@@ -1389,11 +1463,11 @@
     _scanWithListener(source, listener);
     listener.assertNoErrors();
     LineInfo info = listener.getLineInfo(new TestSource());
-    JUnitTestCase.assertNotNull(info);
+    expect(info, isNotNull);
     for (ScannerTest_ExpectedLocation expectedLocation in expectedLocations) {
       LineInfo_Location location = info.getLocation(expectedLocation._offset);
-      JUnitTestCase.assertEquals(expectedLocation._lineNumber, location.lineNumber);
-      JUnitTestCase.assertEquals(expectedLocation._columnNumber, location.columnNumber);
+      expect(location.lineNumber, expectedLocation._lineNumber);
+      expect(location.columnNumber, expectedLocation._columnNumber);
     }
   }
 
@@ -1405,44 +1479,44 @@
    */
   Token _assertToken(TokenType expectedType, String source) {
     Token originalToken = _scan(source);
-    JUnitTestCase.assertNotNull(originalToken);
-    JUnitTestCase.assertEquals(expectedType, originalToken.type);
-    JUnitTestCase.assertEquals(0, originalToken.offset);
-    JUnitTestCase.assertEquals(source.length, originalToken.length);
-    JUnitTestCase.assertEquals(source, originalToken.lexeme);
+    expect(originalToken, isNotNull);
+    expect(originalToken.type, expectedType);
+    expect(originalToken.offset, 0);
+    expect(originalToken.length, source.length);
+    expect(originalToken.lexeme, source);
     if (expectedType == TokenType.SCRIPT_TAG) {
       // Adding space before the script tag is not allowed, and adding text at the end changes nothing.
       return originalToken;
     } else if (expectedType == TokenType.SINGLE_LINE_COMMENT) {
       // Adding space to an end-of-line comment changes the comment.
-      Token tokenWithSpaces = _scan(" ${source}");
-      JUnitTestCase.assertNotNull(tokenWithSpaces);
-      JUnitTestCase.assertEquals(expectedType, tokenWithSpaces.type);
-      JUnitTestCase.assertEquals(1, tokenWithSpaces.offset);
-      JUnitTestCase.assertEquals(source.length, tokenWithSpaces.length);
-      JUnitTestCase.assertEquals(source, tokenWithSpaces.lexeme);
+      Token tokenWithSpaces = _scan(" $source");
+      expect(tokenWithSpaces, isNotNull);
+      expect(tokenWithSpaces.type, expectedType);
+      expect(tokenWithSpaces.offset, 1);
+      expect(tokenWithSpaces.length, source.length);
+      expect(tokenWithSpaces.lexeme, source);
       return originalToken;
     } else if (expectedType == TokenType.INT || expectedType == TokenType.DOUBLE) {
       Token tokenWithLowerD = _scan("${source}d");
-      JUnitTestCase.assertNotNull(tokenWithLowerD);
-      JUnitTestCase.assertEquals(expectedType, tokenWithLowerD.type);
-      JUnitTestCase.assertEquals(0, tokenWithLowerD.offset);
-      JUnitTestCase.assertEquals(source.length, tokenWithLowerD.length);
-      JUnitTestCase.assertEquals(source, tokenWithLowerD.lexeme);
+      expect(tokenWithLowerD, isNotNull);
+      expect(tokenWithLowerD.type, expectedType);
+      expect(tokenWithLowerD.offset, 0);
+      expect(tokenWithLowerD.length, source.length);
+      expect(tokenWithLowerD.lexeme, source);
       Token tokenWithUpperD = _scan("${source}D");
-      JUnitTestCase.assertNotNull(tokenWithUpperD);
-      JUnitTestCase.assertEquals(expectedType, tokenWithUpperD.type);
-      JUnitTestCase.assertEquals(0, tokenWithUpperD.offset);
-      JUnitTestCase.assertEquals(source.length, tokenWithUpperD.length);
-      JUnitTestCase.assertEquals(source, tokenWithUpperD.lexeme);
+      expect(tokenWithUpperD, isNotNull);
+      expect(tokenWithUpperD.type, expectedType);
+      expect(tokenWithUpperD.offset, 0);
+      expect(tokenWithUpperD.length, source.length);
+      expect(tokenWithUpperD.lexeme, source);
     }
-    Token tokenWithSpaces = _scan(" ${source} ");
-    JUnitTestCase.assertNotNull(tokenWithSpaces);
-    JUnitTestCase.assertEquals(expectedType, tokenWithSpaces.type);
-    JUnitTestCase.assertEquals(1, tokenWithSpaces.offset);
-    JUnitTestCase.assertEquals(source.length, tokenWithSpaces.length);
-    JUnitTestCase.assertEquals(source, tokenWithSpaces.lexeme);
-    JUnitTestCase.assertEquals(TokenType.EOF, originalToken.next.type);
+    Token tokenWithSpaces = _scan(" $source ");
+    expect(tokenWithSpaces, isNotNull);
+    expect(tokenWithSpaces.type, expectedType);
+    expect(tokenWithSpaces.offset, 1);
+    expect(tokenWithSpaces.length, source.length);
+    expect(tokenWithSpaces.lexeme, source);
+    expect(originalToken.next.type, TokenType.EOF);
     return originalToken;
   }
 
@@ -1459,18 +1533,18 @@
   }
 
   void _checkTokens(Token firstToken, List<Token> expectedTokens) {
-    JUnitTestCase.assertNotNull(firstToken);
+    expect(firstToken, isNotNull);
     Token token = firstToken;
     for (int i = 0; i < expectedTokens.length; i++) {
       Token expectedToken = expectedTokens[i];
-      JUnitTestCase.assertEqualsMsg("Wrong type for token ${i}", expectedToken.type, token.type);
-      JUnitTestCase.assertEqualsMsg("Wrong offset for token ${i}", expectedToken.offset, token.offset);
-      JUnitTestCase.assertEqualsMsg("Wrong length for token ${i}", expectedToken.length, token.length);
-      JUnitTestCase.assertEqualsMsg("Wrong lexeme for token ${i}", expectedToken.lexeme, token.lexeme);
+      expect(token.type, expectedToken.type, reason: "Wrong type for token $i");
+      expect(token.offset, expectedToken.offset, reason: "Wrong offset for token $i");
+      expect(token.length, expectedToken.length, reason: "Wrong length for token $i");
+      expect(token.lexeme, expectedToken.lexeme, reason: "Wrong lexeme for token $i");
       token = token.next;
-      JUnitTestCase.assertNotNull(token);
+      expect(token, isNotNull);
     }
-    JUnitTestCase.assertEquals(TokenType.EOF, token.type);
+    expect(token.type, TokenType.EOF);
   }
 
   Token _scan(String source) {
@@ -1513,14 +1587,14 @@
    * @param token the first token in the stream of tokens to be validated
    */
   void validate(Token token) {
-    JavaStringBuilder builder = new JavaStringBuilder();
-    _validateStream(builder, token);
-    if (builder.length > 0) {
-      JUnitTestCase.fail(builder.toString());
+    StringBuffer buffer = new StringBuffer();
+    _validateStream(buffer, token);
+    if (buffer.length > 0) {
+      fail(buffer.toString());
     }
   }
 
-  void _validateStream(JavaStringBuilder builder, Token token) {
+  void _validateStream(StringBuffer buffer, Token token) {
     if (token == null) {
       return;
     }
@@ -1528,24 +1602,24 @@
     int previousEnd = -1;
     Token currentToken = token;
     while (currentToken != null && currentToken.type != TokenType.EOF) {
-      _validateStream(builder, currentToken.precedingComments);
+      _validateStream(buffer, currentToken.precedingComments);
       TokenType type = currentToken.type;
       if (type == TokenType.OPEN_CURLY_BRACKET || type == TokenType.OPEN_PAREN || type == TokenType.OPEN_SQUARE_BRACKET || type == TokenType.STRING_INTERPOLATION_EXPRESSION) {
         if (currentToken is! BeginToken) {
-          builder.append("\r\nExpected BeginToken, found ");
-          builder.append(currentToken.runtimeType.toString());
-          builder.append(" ");
-          _writeToken(builder, currentToken);
+          buffer.write("\r\nExpected BeginToken, found ");
+          buffer.write(currentToken.runtimeType.toString());
+          buffer.write(" ");
+          _writeToken(buffer, currentToken);
         }
       }
       int currentStart = currentToken.offset;
       int currentLength = currentToken.length;
       int currentEnd = currentStart + currentLength - 1;
       if (currentStart <= previousEnd) {
-        builder.append("\r\nInvalid token sequence: ");
-        _writeToken(builder, previousToken);
-        builder.append(" followed by ");
-        _writeToken(builder, currentToken);
+        buffer.write("\r\nInvalid token sequence: ");
+        _writeToken(buffer, previousToken);
+        buffer.write(" followed by ");
+        _writeToken(buffer, currentToken);
       }
       previousEnd = currentEnd;
       previousToken = currentToken;
@@ -1553,88 +1627,88 @@
     }
   }
 
-  void _writeToken(JavaStringBuilder builder, Token token) {
-    builder.append("[");
-    builder.append(token.type);
-    builder.append(", '");
-    builder.append(token.lexeme);
-    builder.append("', ");
-    builder.append(token.offset);
-    builder.append(", ");
-    builder.append(token.length);
-    builder.append("]");
+  void _writeToken(StringBuffer buffer, Token token) {
+    buffer.write("[");
+    buffer.write(token.type);
+    buffer.write(", '");
+    buffer.write(token.lexeme);
+    buffer.write("', ");
+    buffer.write(token.offset);
+    buffer.write(", ");
+    buffer.write(token.length);
+    buffer.write("]");
   }
 }
 
 class TokenTypeTest extends EngineTestCase {
   void test_isOperator() {
-    JUnitTestCase.assertTrue(TokenType.AMPERSAND.isOperator);
-    JUnitTestCase.assertTrue(TokenType.AMPERSAND_AMPERSAND.isOperator);
-    JUnitTestCase.assertTrue(TokenType.AMPERSAND_EQ.isOperator);
-    JUnitTestCase.assertTrue(TokenType.BANG.isOperator);
-    JUnitTestCase.assertTrue(TokenType.BANG_EQ.isOperator);
-    JUnitTestCase.assertTrue(TokenType.BAR.isOperator);
-    JUnitTestCase.assertTrue(TokenType.BAR_BAR.isOperator);
-    JUnitTestCase.assertTrue(TokenType.BAR_EQ.isOperator);
-    JUnitTestCase.assertTrue(TokenType.CARET.isOperator);
-    JUnitTestCase.assertTrue(TokenType.CARET_EQ.isOperator);
-    JUnitTestCase.assertTrue(TokenType.EQ.isOperator);
-    JUnitTestCase.assertTrue(TokenType.EQ_EQ.isOperator);
-    JUnitTestCase.assertTrue(TokenType.GT.isOperator);
-    JUnitTestCase.assertTrue(TokenType.GT_EQ.isOperator);
-    JUnitTestCase.assertTrue(TokenType.GT_GT.isOperator);
-    JUnitTestCase.assertTrue(TokenType.GT_GT_EQ.isOperator);
-    JUnitTestCase.assertTrue(TokenType.INDEX.isOperator);
-    JUnitTestCase.assertTrue(TokenType.INDEX_EQ.isOperator);
-    JUnitTestCase.assertTrue(TokenType.IS.isOperator);
-    JUnitTestCase.assertTrue(TokenType.LT.isOperator);
-    JUnitTestCase.assertTrue(TokenType.LT_EQ.isOperator);
-    JUnitTestCase.assertTrue(TokenType.LT_LT.isOperator);
-    JUnitTestCase.assertTrue(TokenType.LT_LT_EQ.isOperator);
-    JUnitTestCase.assertTrue(TokenType.MINUS.isOperator);
-    JUnitTestCase.assertTrue(TokenType.MINUS_EQ.isOperator);
-    JUnitTestCase.assertTrue(TokenType.MINUS_MINUS.isOperator);
-    JUnitTestCase.assertTrue(TokenType.PERCENT.isOperator);
-    JUnitTestCase.assertTrue(TokenType.PERCENT_EQ.isOperator);
-    JUnitTestCase.assertTrue(TokenType.PERIOD_PERIOD.isOperator);
-    JUnitTestCase.assertTrue(TokenType.PLUS.isOperator);
-    JUnitTestCase.assertTrue(TokenType.PLUS_EQ.isOperator);
-    JUnitTestCase.assertTrue(TokenType.PLUS_PLUS.isOperator);
-    JUnitTestCase.assertTrue(TokenType.QUESTION.isOperator);
-    JUnitTestCase.assertTrue(TokenType.SLASH.isOperator);
-    JUnitTestCase.assertTrue(TokenType.SLASH_EQ.isOperator);
-    JUnitTestCase.assertTrue(TokenType.STAR.isOperator);
-    JUnitTestCase.assertTrue(TokenType.STAR_EQ.isOperator);
-    JUnitTestCase.assertTrue(TokenType.TILDE.isOperator);
-    JUnitTestCase.assertTrue(TokenType.TILDE_SLASH.isOperator);
-    JUnitTestCase.assertTrue(TokenType.TILDE_SLASH_EQ.isOperator);
+    expect(TokenType.AMPERSAND.isOperator, isTrue);
+    expect(TokenType.AMPERSAND_AMPERSAND.isOperator, isTrue);
+    expect(TokenType.AMPERSAND_EQ.isOperator, isTrue);
+    expect(TokenType.BANG.isOperator, isTrue);
+    expect(TokenType.BANG_EQ.isOperator, isTrue);
+    expect(TokenType.BAR.isOperator, isTrue);
+    expect(TokenType.BAR_BAR.isOperator, isTrue);
+    expect(TokenType.BAR_EQ.isOperator, isTrue);
+    expect(TokenType.CARET.isOperator, isTrue);
+    expect(TokenType.CARET_EQ.isOperator, isTrue);
+    expect(TokenType.EQ.isOperator, isTrue);
+    expect(TokenType.EQ_EQ.isOperator, isTrue);
+    expect(TokenType.GT.isOperator, isTrue);
+    expect(TokenType.GT_EQ.isOperator, isTrue);
+    expect(TokenType.GT_GT.isOperator, isTrue);
+    expect(TokenType.GT_GT_EQ.isOperator, isTrue);
+    expect(TokenType.INDEX.isOperator, isTrue);
+    expect(TokenType.INDEX_EQ.isOperator, isTrue);
+    expect(TokenType.IS.isOperator, isTrue);
+    expect(TokenType.LT.isOperator, isTrue);
+    expect(TokenType.LT_EQ.isOperator, isTrue);
+    expect(TokenType.LT_LT.isOperator, isTrue);
+    expect(TokenType.LT_LT_EQ.isOperator, isTrue);
+    expect(TokenType.MINUS.isOperator, isTrue);
+    expect(TokenType.MINUS_EQ.isOperator, isTrue);
+    expect(TokenType.MINUS_MINUS.isOperator, isTrue);
+    expect(TokenType.PERCENT.isOperator, isTrue);
+    expect(TokenType.PERCENT_EQ.isOperator, isTrue);
+    expect(TokenType.PERIOD_PERIOD.isOperator, isTrue);
+    expect(TokenType.PLUS.isOperator, isTrue);
+    expect(TokenType.PLUS_EQ.isOperator, isTrue);
+    expect(TokenType.PLUS_PLUS.isOperator, isTrue);
+    expect(TokenType.QUESTION.isOperator, isTrue);
+    expect(TokenType.SLASH.isOperator, isTrue);
+    expect(TokenType.SLASH_EQ.isOperator, isTrue);
+    expect(TokenType.STAR.isOperator, isTrue);
+    expect(TokenType.STAR_EQ.isOperator, isTrue);
+    expect(TokenType.TILDE.isOperator, isTrue);
+    expect(TokenType.TILDE_SLASH.isOperator, isTrue);
+    expect(TokenType.TILDE_SLASH_EQ.isOperator, isTrue);
   }
 
   void test_isUserDefinableOperator() {
-    JUnitTestCase.assertTrue(TokenType.AMPERSAND.isUserDefinableOperator);
-    JUnitTestCase.assertTrue(TokenType.BAR.isUserDefinableOperator);
-    JUnitTestCase.assertTrue(TokenType.CARET.isUserDefinableOperator);
-    JUnitTestCase.assertTrue(TokenType.EQ_EQ.isUserDefinableOperator);
-    JUnitTestCase.assertTrue(TokenType.GT.isUserDefinableOperator);
-    JUnitTestCase.assertTrue(TokenType.GT_EQ.isUserDefinableOperator);
-    JUnitTestCase.assertTrue(TokenType.GT_GT.isUserDefinableOperator);
-    JUnitTestCase.assertTrue(TokenType.INDEX.isUserDefinableOperator);
-    JUnitTestCase.assertTrue(TokenType.INDEX_EQ.isUserDefinableOperator);
-    JUnitTestCase.assertTrue(TokenType.LT.isUserDefinableOperator);
-    JUnitTestCase.assertTrue(TokenType.LT_EQ.isUserDefinableOperator);
-    JUnitTestCase.assertTrue(TokenType.LT_LT.isUserDefinableOperator);
-    JUnitTestCase.assertTrue(TokenType.MINUS.isUserDefinableOperator);
-    JUnitTestCase.assertTrue(TokenType.PERCENT.isUserDefinableOperator);
-    JUnitTestCase.assertTrue(TokenType.PLUS.isUserDefinableOperator);
-    JUnitTestCase.assertTrue(TokenType.SLASH.isUserDefinableOperator);
-    JUnitTestCase.assertTrue(TokenType.STAR.isUserDefinableOperator);
-    JUnitTestCase.assertTrue(TokenType.TILDE.isUserDefinableOperator);
-    JUnitTestCase.assertTrue(TokenType.TILDE_SLASH.isUserDefinableOperator);
+    expect(TokenType.AMPERSAND.isUserDefinableOperator, isTrue);
+    expect(TokenType.BAR.isUserDefinableOperator, isTrue);
+    expect(TokenType.CARET.isUserDefinableOperator, isTrue);
+    expect(TokenType.EQ_EQ.isUserDefinableOperator, isTrue);
+    expect(TokenType.GT.isUserDefinableOperator, isTrue);
+    expect(TokenType.GT_EQ.isUserDefinableOperator, isTrue);
+    expect(TokenType.GT_GT.isUserDefinableOperator, isTrue);
+    expect(TokenType.INDEX.isUserDefinableOperator, isTrue);
+    expect(TokenType.INDEX_EQ.isUserDefinableOperator, isTrue);
+    expect(TokenType.LT.isUserDefinableOperator, isTrue);
+    expect(TokenType.LT_EQ.isUserDefinableOperator, isTrue);
+    expect(TokenType.LT_LT.isUserDefinableOperator, isTrue);
+    expect(TokenType.MINUS.isUserDefinableOperator, isTrue);
+    expect(TokenType.PERCENT.isUserDefinableOperator, isTrue);
+    expect(TokenType.PLUS.isUserDefinableOperator, isTrue);
+    expect(TokenType.SLASH.isUserDefinableOperator, isTrue);
+    expect(TokenType.STAR.isUserDefinableOperator, isTrue);
+    expect(TokenType.TILDE.isUserDefinableOperator, isTrue);
+    expect(TokenType.TILDE_SLASH.isUserDefinableOperator, isTrue);
   }
 }
 
 main() {
-  _ut.groupSep = ' | ';
+  groupSep = ' | ';
   runReflectiveTests(CharSequenceReaderTest);
   runReflectiveTests(IncrementalScannerTest);
   runReflectiveTests(KeywordStateTest);
diff --git a/pkg/analyzer/test/generated/static_type_warning_code_test.dart b/pkg/analyzer/test/generated/static_type_warning_code_test.dart
index b8e8d5d..67ec5de 100644
--- a/pkg/analyzer/test/generated/static_type_warning_code_test.dart
+++ b/pkg/analyzer/test/generated/static_type_warning_code_test.dart
@@ -6,15 +6,15 @@
 
 import 'package:analyzer/src/generated/source_io.dart';
 import 'package:analyzer/src/generated/error.dart';
-import 'package:unittest/unittest.dart' as _ut;
+import 'package:unittest/unittest.dart';
 import 'resolver_test.dart';
-import 'test_support.dart';
 import '../reflective_tests.dart';
 
 
 class StaticTypeWarningCodeTest extends ResolverTestCase {
   void fail_inaccessibleSetter() {
-    Source source = addSource(EngineTestCase.createSource([]));
+    Source source = addSource(r'''
+''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.INACCESSIBLE_SETTER]);
     verify([source]);
@@ -22,199 +22,224 @@
 
   void fail_undefinedEnumConstant() {
     // We need a way to set the parseEnum flag in the parser to true.
-    Source source = addSource(EngineTestCase.createSource(["enum E { ONE }", "E e() {", "  return E.TWO;", "}"]));
+    Source source = addSource(r'''
+enum E { ONE }
+E e() {
+  return E.TWO;
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_ENUM_CONSTANT]);
     verify([source]);
   }
 
   void test_ambiguousImport_function() {
-    Source source = addSource(EngineTestCase.createSource([
-        "import 'lib1.dart';",
-        "import 'lib2.dart';",
-        "g() { return f(); }"]));
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "f() {}"]));
-    addNamedSource("/lib2.dart", EngineTestCase.createSource(["library lib2;", "f() {}"]));
+    Source source = addSource(r'''
+import 'lib1.dart';
+import 'lib2.dart';
+g() { return f(); }''');
+    addNamedSource("/lib1.dart", r'''
+library lib1;
+f() {}''');
+    addNamedSource("/lib2.dart", r'''
+library lib2;
+f() {}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.AMBIGUOUS_IMPORT]);
   }
 
   void test_expectedOneListTypeArgument() {
-    Source source = addSource(EngineTestCase.createSource(["main() {", "  <int, int> [];", "}"]));
+    Source source = addSource(r'''
+main() {
+  <int, int> [];
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.EXPECTED_ONE_LIST_TYPE_ARGUMENTS]);
     verify([source]);
   }
 
   void test_expectedTwoMapTypeArguments_one() {
-    Source source = addSource(EngineTestCase.createSource(["main() {", "  <int> {};", "}"]));
+    Source source = addSource(r'''
+main() {
+  <int> {};
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.EXPECTED_TWO_MAP_TYPE_ARGUMENTS]);
     verify([source]);
   }
 
   void test_expectedTwoMapTypeArguments_three() {
-    Source source = addSource(EngineTestCase.createSource(["main() {", "  <int, int, int> {};", "}"]));
+    Source source = addSource(r'''
+main() {
+  <int, int, int> {};
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.EXPECTED_TWO_MAP_TYPE_ARGUMENTS]);
     verify([source]);
   }
 
   void test_inconsistentMethodInheritance_paramCount() {
-    Source source = addSource(EngineTestCase.createSource([
-        "abstract class A {",
-        "  int x();",
-        "}",
-        "abstract class B {",
-        "  int x(int y);",
-        "}",
-        "class C implements A, B {",
-        "}"]));
+    Source source = addSource(r'''
+abstract class A {
+  int x();
+}
+abstract class B {
+  int x(int y);
+}
+class C implements A, B {
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE]);
     verify([source]);
   }
 
   void test_inconsistentMethodInheritance_paramType() {
-    Source source = addSource(EngineTestCase.createSource([
-        "abstract class A {",
-        "  x(int i);",
-        "}",
-        "abstract class B {",
-        "  x(String s);",
-        "}",
-        "abstract class C implements A, B {}"]));
+    Source source = addSource(r'''
+abstract class A {
+  x(int i);
+}
+abstract class B {
+  x(String s);
+}
+abstract class C implements A, B {}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE]);
     verify([source]);
   }
 
   void test_inconsistentMethodInheritance_returnType() {
-    Source source = addSource(EngineTestCase.createSource([
-        "abstract class A {",
-        "  int x();",
-        "}",
-        "abstract class B {",
-        "  String x();",
-        "}",
-        "abstract class C implements A, B {}"]));
+    Source source = addSource(r'''
+abstract class A {
+  int x();
+}
+abstract class B {
+  String x();
+}
+abstract class C implements A, B {}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE]);
     verify([source]);
   }
 
   void test_instanceAccessToStaticMember_method_invocation() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  static m() {}",
-        "}",
-        "main(A a) {",
-        "  a.m();",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  static m() {}
+}
+main(A a) {
+  a.m();
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER]);
     verify([source]);
   }
 
   void test_instanceAccessToStaticMember_method_reference() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  static m() {}",
-        "}",
-        "main(A a) {",
-        "  a.m;",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  static m() {}
+}
+main(A a) {
+  a.m;
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER]);
     verify([source]);
   }
 
   void test_instanceAccessToStaticMember_propertyAccess_field() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  static var f;",
-        "}",
-        "main(A a) {",
-        "  a.f;",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  static var f;
+}
+main(A a) {
+  a.f;
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER]);
     verify([source]);
   }
 
   void test_instanceAccessToStaticMember_propertyAccess_getter() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  static get f => 42;",
-        "}",
-        "main(A a) {",
-        "  a.f;",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  static get f => 42;
+}
+main(A a) {
+  a.f;
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER]);
     verify([source]);
   }
 
   void test_instanceAccessToStaticMember_propertyAccess_setter() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  static set f(x) {}",
-        "}",
-        "main(A a) {",
-        "  a.f = 42;",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  static set f(x) {}
+}
+main(A a) {
+  a.f = 42;
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER]);
     verify([source]);
   }
 
   void test_invalidAssignment_compoundAssignment() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class byte {",
-        "  int _value;",
-        "  byte(this._value);",
-        "  int operator +(int val) { return 0; }",
-        "}",
-        "",
-        "void main() {",
-        "  byte b = new byte(52);",
-        "  b += 3;",
-        "}"]));
+    Source source = addSource(r'''
+class byte {
+  int _value;
+  byte(this._value);
+  int operator +(int val) { return 0; }
+}
+
+void main() {
+  byte b = new byte(52);
+  b += 3;
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
     verify([source]);
   }
 
   void test_invalidAssignment_defaultValue_named() {
-    Source source = addSource(EngineTestCase.createSource(["f({String x: 0}) {", "}"]));
+    Source source = addSource(r'''
+f({String x: 0}) {
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
     verify([source]);
   }
 
   void test_invalidAssignment_defaultValue_optional() {
-    Source source = addSource(EngineTestCase.createSource(["f([String x = 0]) {", "}"]));
+    Source source = addSource(r'''
+f([String x = 0]) {
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
     verify([source]);
   }
 
   void test_invalidAssignment_instanceVariable() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  int x;",
-        "}",
-        "f() {",
-        "  A a;",
-        "  a.x = '0';",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  int x;
+}
+f() {
+  A a;
+  a.x = '0';
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
     verify([source]);
   }
 
   void test_invalidAssignment_localVariable() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  int x;", "  x = '0';", "}"]));
+    Source source = addSource(r'''
+f() {
+  int x;
+  x = '0';
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
     verify([source]);
@@ -222,27 +247,30 @@
 
   void test_invalidAssignment_regressionInIssue18468Fix() {
     // https://code.google.com/p/dart/issues/detail?id=18628
-    Source source = addSource(EngineTestCase.createSource(["class C<T> {", "  T t = int;", "}"]));
+    Source source = addSource(r'''
+class C<T> {
+  T t = int;
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
     verify([source]);
   }
 
   void test_invalidAssignment_staticVariable() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  static int x;",
-        "}",
-        "f() {",
-        "  A.x = '0';",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  static int x;
+}
+f() {
+  A.x = '0';
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
     verify([source]);
   }
 
   void test_invalidAssignment_topLevelVariableDeclaration() {
-    Source source = addSource(EngineTestCase.createSource(["int x = 'string';"]));
+    Source source = addSource("int x = 'string';");
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
     verify([source]);
@@ -250,190 +278,225 @@
 
   void test_invalidAssignment_typeParameter() {
     // 14221
-    Source source = addSource(EngineTestCase.createSource([
-        "class B<T> {",
-        "  T value;",
-        "  void test(num n) {",
-        "    value = n;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class B<T> {
+  T value;
+  void test(num n) {
+    value = n;
+  }
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
     verify([source]);
   }
 
   void test_invalidAssignment_variableDeclaration() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  int x = 'string';", "}"]));
+    Source source = addSource(r'''
+class A {
+  int x = 'string';
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
     verify([source]);
   }
 
   void test_invocationOfNonFunction_class() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  void m() {", "    A();", "  }", "}"]));
+    Source source = addSource(r'''
+class A {
+  void m() {
+    A();
+  }
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION]);
   }
 
   void test_invocationOfNonFunction_localVariable() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  int x;", "  return x();", "}"]));
+    Source source = addSource(r'''
+f() {
+  int x;
+  return x();
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION]);
     verify([source]);
   }
 
   void test_invocationOfNonFunction_ordinaryInvocation() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  static int x;",
-        "}",
-        "class B {",
-        "  m() {",
-        "    A.x();",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  static int x;
+}
+class B {
+  m() {
+    A.x();
+  }
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION]);
     // A call to verify(source) fails as A.x() cannot be resolved.
   }
 
   void test_invocationOfNonFunction_staticInvocation() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  static int get g => 0;",
-        "  f() {",
-        "    A.g();",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  static int get g => 0;
+  f() {
+    A.g();
+  }
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION]);
     // A call to verify(source) fails as g() cannot be resolved.
   }
 
   void test_invocationOfNonFunction_superExpression() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  int get g => 0;",
-        "}",
-        "class B extends A {",
-        "  m() {",
-        "    var v = super.g();",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  int get g => 0;
+}
+class B extends A {
+  m() {
+    var v = super.g();
+  }
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION]);
     verify([source]);
   }
 
   void test_invocationOfNonFunctionExpression_literal() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  3(5);", "}"]));
+    Source source = addSource(r'''
+f() {
+  3(5);
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION]);
     verify([source]);
   }
 
   void test_nonBoolCondition_conditional() {
-    Source source = addSource(EngineTestCase.createSource(["f() { return 3 ? 2 : 1; }"]));
+    Source source = addSource("f() { return 3 ? 2 : 1; }");
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.NON_BOOL_CONDITION]);
     verify([source]);
   }
 
   void test_nonBoolCondition_do() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  do {} while (3);", "}"]));
+    Source source = addSource(r'''
+f() {
+  do {} while (3);
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.NON_BOOL_CONDITION]);
     verify([source]);
   }
 
   void test_nonBoolCondition_if() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  if (3) return 2; else return 1;", "}"]));
+    Source source = addSource(r'''
+f() {
+  if (3) return 2; else return 1;
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.NON_BOOL_CONDITION]);
     verify([source]);
   }
 
   void test_nonBoolCondition_while() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  while (3) {}", "}"]));
+    Source source = addSource(r'''
+f() {
+  while (3) {}
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.NON_BOOL_CONDITION]);
     verify([source]);
   }
 
   void test_nonBoolExpression_functionType() {
-    Source source = addSource(EngineTestCase.createSource([
-        "int makeAssertion() => 1;",
-        "f() {",
-        "  assert(makeAssertion);",
-        "}"]));
+    Source source = addSource(r'''
+int makeAssertion() => 1;
+f() {
+  assert(makeAssertion);
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.NON_BOOL_EXPRESSION]);
     verify([source]);
   }
 
   void test_nonBoolExpression_interfaceType() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  assert(0);", "}"]));
+    Source source = addSource(r'''
+f() {
+  assert(0);
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.NON_BOOL_EXPRESSION]);
     verify([source]);
   }
 
   void test_nonBoolNegationExpression() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  !42;", "}"]));
+    Source source = addSource(r'''
+f() {
+  !42;
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.NON_BOOL_NEGATION_EXPRESSION]);
     verify([source]);
   }
 
   void test_nonBoolOperand_and_left() {
-    Source source = addSource(EngineTestCase.createSource([
-        "bool f(int left, bool right) {",
-        "  return left && right;",
-        "}"]));
+    Source source = addSource(r'''
+bool f(int left, bool right) {
+  return left && right;
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.NON_BOOL_OPERAND]);
     verify([source]);
   }
 
   void test_nonBoolOperand_and_right() {
-    Source source = addSource(EngineTestCase.createSource([
-        "bool f(bool left, String right) {",
-        "  return left && right;",
-        "}"]));
+    Source source = addSource(r'''
+bool f(bool left, String right) {
+  return left && right;
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.NON_BOOL_OPERAND]);
     verify([source]);
   }
 
   void test_nonBoolOperand_or_left() {
-    Source source = addSource(EngineTestCase.createSource([
-        "bool f(List<int> left, bool right) {",
-        "  return left || right;",
-        "}"]));
+    Source source = addSource(r'''
+bool f(List<int> left, bool right) {
+  return left || right;
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.NON_BOOL_OPERAND]);
     verify([source]);
   }
 
   void test_nonBoolOperand_or_right() {
-    Source source = addSource(EngineTestCase.createSource([
-        "bool f(bool left, double right) {",
-        "  return left || right;",
-        "}"]));
+    Source source = addSource(r'''
+bool f(bool left, double right) {
+  return left || right;
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.NON_BOOL_OPERAND]);
     verify([source]);
   }
 
   void test_nonTypeAsTypeArgument_notAType() {
-    Source source = addSource(EngineTestCase.createSource(["int A;", "class B<E> {}", "f(B<A> b) {}"]));
+    Source source = addSource(r'''
+int A;
+class B<E> {}
+f(B<A> b) {}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT]);
     verify([source]);
   }
 
   void test_nonTypeAsTypeArgument_undefinedIdentifier() {
-    Source source = addSource(EngineTestCase.createSource(["class B<E> {}", "f(B<A> b) {}"]));
+    Source source = addSource(r'''
+class B<E> {}
+f(B<A> b) {}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT]);
     verify([source]);
@@ -441,127 +504,133 @@
 
   void test_notEnoughRequiredArguments_mergedUnionTypeMethod() {
     enableUnionTypes(false);
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  int m(int x) => 0;",
-        "}",
-        "class B {",
-        "  String m(String x) => '0';",
-        "}",
-        "f(A a, B b) {",
-        "  var ab;",
-        "  if (0 < 1) {",
-        "    ab = a;",
-        "  } else {",
-        "    ab = b;",
-        "  }",
-        "  ab.m();",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  int m(int x) => 0;
+}
+class B {
+  String m(String x) => '0';
+}
+f(A a, B b) {
+  var ab;
+  if (0 < 1) {
+    ab = a;
+  } else {
+    ab = b;
+  }
+  ab.m();
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.NOT_ENOUGH_REQUIRED_ARGUMENTS]);
     verify([source]);
   }
 
   void test_returnOfInvalidType_expressionFunctionBody_function() {
-    Source source = addSource(EngineTestCase.createSource(["int f() => '0';"]));
+    Source source = addSource("int f() => '0';");
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
     verify([source]);
   }
 
   void test_returnOfInvalidType_expressionFunctionBody_getter() {
-    Source source = addSource(EngineTestCase.createSource(["int get g => '0';"]));
+    Source source = addSource("int get g => '0';");
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
     verify([source]);
   }
 
   void test_returnOfInvalidType_expressionFunctionBody_localFunction() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  String m() {",
-        "    int f() => '0';",
-        "    return '0';",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  String m() {
+    int f() => '0';
+    return '0';
+  }
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
     verify([source]);
   }
 
   void test_returnOfInvalidType_expressionFunctionBody_method() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  int f() => '0';", "}"]));
+    Source source = addSource(r'''
+class A {
+  int f() => '0';
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
     verify([source]);
   }
 
   void test_returnOfInvalidType_expressionFunctionBody_void() {
-    Source source = addSource(EngineTestCase.createSource(["void f() => 42;"]));
+    Source source = addSource("void f() => 42;");
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
     verify([source]);
   }
 
   void test_returnOfInvalidType_function() {
-    Source source = addSource(EngineTestCase.createSource(["int f() { return '0'; }"]));
+    Source source = addSource("int f() { return '0'; }");
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
     verify([source]);
   }
 
   void test_returnOfInvalidType_getter() {
-    Source source = addSource(EngineTestCase.createSource(["int get g { return '0'; }"]));
+    Source source = addSource("int get g { return '0'; }");
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
     verify([source]);
   }
 
   void test_returnOfInvalidType_localFunction() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  String m() {",
-        "    int f() { return '0'; }",
-        "    return '0';",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  String m() {
+    int f() { return '0'; }
+    return '0';
+  }
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
     verify([source]);
   }
 
   void test_returnOfInvalidType_method() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  int f() { return '0'; }", "}"]));
+    Source source = addSource(r'''
+class A {
+  int f() { return '0'; }
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
     verify([source]);
   }
 
   void test_returnOfInvalidType_void() {
-    Source source = addSource(EngineTestCase.createSource(["void f() { return 42; }"]));
+    Source source = addSource("void f() { return 42; }");
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
     verify([source]);
   }
 
   void test_typeArgumentNotMatchingBounds_classTypeAlias() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B {}",
-        "class C {}",
-        "class G<E extends A> {}",
-        "class D = G<B> with C;"]));
+    Source source = addSource(r'''
+class A {}
+class B {}
+class C {}
+class G<E extends A> {}
+class D = G<B> with C;''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
     verify([source]);
   }
 
   void test_typeArgumentNotMatchingBounds_extends() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B {}",
-        "class G<E extends A> {}",
-        "class C extends G<B>{}"]));
+    Source source = addSource(r'''
+class A {}
+class B {}
+class G<E extends A> {}
+class C extends G<B>{}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
     verify([source]);
@@ -569,138 +638,138 @@
 
   void test_typeArgumentNotMatchingBounds_extends_regressionInIssue18468Fix() {
     // https://code.google.com/p/dart/issues/detail?id=18628
-    Source source = addSource(EngineTestCase.createSource([
-        "class X<T extends Type> {}",
-        "class Y<U> extends X<U> {}"]));
+    Source source = addSource(r'''
+class X<T extends Type> {}
+class Y<U> extends X<U> {}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
     verify([source]);
   }
 
   void test_typeArgumentNotMatchingBounds_fieldFormalParameter() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B {}",
-        "class G<E extends A> {}",
-        "class C {",
-        "  var f;",
-        "  C(G<B> this.f) {}",
-        "}"]));
+    Source source = addSource(r'''
+class A {}
+class B {}
+class G<E extends A> {}
+class C {
+  var f;
+  C(G<B> this.f) {}
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
     verify([source]);
   }
 
   void test_typeArgumentNotMatchingBounds_functionReturnType() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B {}",
-        "class G<E extends A> {}",
-        "G<B> f() { return null; }"]));
+    Source source = addSource(r'''
+class A {}
+class B {}
+class G<E extends A> {}
+G<B> f() { return null; }''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
     verify([source]);
   }
 
   void test_typeArgumentNotMatchingBounds_functionTypeAlias() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B {}",
-        "class G<E extends A> {}",
-        "typedef G<B> f();"]));
+    Source source = addSource(r'''
+class A {}
+class B {}
+class G<E extends A> {}
+typedef G<B> f();''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
     verify([source]);
   }
 
   void test_typeArgumentNotMatchingBounds_functionTypedFormalParameter() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B {}",
-        "class G<E extends A> {}",
-        "f(G<B> h()) {}"]));
+    Source source = addSource(r'''
+class A {}
+class B {}
+class G<E extends A> {}
+f(G<B> h()) {}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
     verify([source]);
   }
 
   void test_typeArgumentNotMatchingBounds_implements() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B {}",
-        "class G<E extends A> {}",
-        "class C implements G<B>{}"]));
+    Source source = addSource(r'''
+class A {}
+class B {}
+class G<E extends A> {}
+class C implements G<B>{}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
     verify([source]);
   }
 
   void test_typeArgumentNotMatchingBounds_is() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B {}",
-        "class G<E extends A> {}",
-        "var b = 1 is G<B>;"]));
+    Source source = addSource(r'''
+class A {}
+class B {}
+class G<E extends A> {}
+var b = 1 is G<B>;''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
     verify([source]);
   }
 
   void test_typeArgumentNotMatchingBounds_methodReturnType() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B {}",
-        "class G<E extends A> {}",
-        "class C {",
-        "  G<B> m() { return null; }",
-        "}"]));
+    Source source = addSource(r'''
+class A {}
+class B {}
+class G<E extends A> {}
+class C {
+  G<B> m() { return null; }
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
     verify([source]);
   }
 
   void test_typeArgumentNotMatchingBounds_new() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B {}",
-        "class G<E extends A> {}",
-        "f() { return new G<B>(); }"]));
+    Source source = addSource(r'''
+class A {}
+class B {}
+class G<E extends A> {}
+f() { return new G<B>(); }''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
     verify([source]);
   }
 
   void test_typeArgumentNotMatchingBounds_new_superTypeOfUpperBound() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B extends A {}",
-        "class C extends B {}",
-        "class G<E extends B> {}",
-        "f() { return new G<A>(); }"]));
+    Source source = addSource(r'''
+class A {}
+class B extends A {}
+class C extends B {}
+class G<E extends B> {}
+f() { return new G<A>(); }''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
     verify([source]);
   }
 
   void test_typeArgumentNotMatchingBounds_parameter() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B {}",
-        "class G<E extends A> {}",
-        "f(G<B> g) {}"]));
+    Source source = addSource(r'''
+class A {}
+class B {}
+class G<E extends A> {}
+f(G<B> g) {}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
     verify([source]);
   }
 
   void test_typeArgumentNotMatchingBounds_redirectingConstructor() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B {}",
-        "class X<T extends A> {",
-        "  X(int x, int y) {}",
-        "  factory X.name(int x, int y) = X<B>;",
-        "}"]));
+    Source source = addSource(r'''
+class A {}
+class B {}
+class X<T extends A> {
+  X(int x, int y) {}
+  factory X.name(int x, int y) = X<B>;
+}''');
     resolve(source);
     assertErrors(source, [
         StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS,
@@ -709,611 +778,667 @@
   }
 
   void test_typeArgumentNotMatchingBounds_typeArgumentList() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B {}",
-        "class C<E> {}",
-        "class D<E extends A> {}",
-        "C<D<B>> Var;"]));
+    Source source = addSource(r'''
+class A {}
+class B {}
+class C<E> {}
+class D<E extends A> {}
+C<D<B>> Var;''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
     verify([source]);
   }
 
   void test_typeArgumentNotMatchingBounds_typeParameter() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B {}",
-        "class C {}",
-        "class G<E extends A> {}",
-        "class D<F extends G<B>> {}"]));
+    Source source = addSource(r'''
+class A {}
+class B {}
+class C {}
+class G<E extends A> {}
+class D<F extends G<B>> {}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
     verify([source]);
   }
 
   void test_typeArgumentNotMatchingBounds_variableDeclaration() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B {}",
-        "class G<E extends A> {}",
-        "G<B> g;"]));
+    Source source = addSource(r'''
+class A {}
+class B {}
+class G<E extends A> {}
+G<B> g;''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
     verify([source]);
   }
 
   void test_typeArgumentNotMatchingBounds_with() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B {}",
-        "class G<E extends A> {}",
-        "class C extends Object with G<B>{}"]));
+    Source source = addSource(r'''
+class A {}
+class B {}
+class G<E extends A> {}
+class C extends Object with G<B>{}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
     verify([source]);
   }
 
   void test_typeParameterSupertypeOfItsBound() {
-    Source source = addSource(EngineTestCase.createSource(["class A<T extends T> {", "}"]));
+    Source source = addSource(r'''
+class A<T extends T> {
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND]);
     verify([source]);
   }
 
   void test_typePromotion_booleanAnd_useInRight_accessedInClosureRight_mutated() {
-    Source source = addSource(EngineTestCase.createSource([
-        "callMe(f()) { f(); }",
-        "main(Object p) {",
-        "  (p is String) && callMe(() { p.length; });",
-        "  p = 0;",
-        "}"]));
+    Source source = addSource(r'''
+callMe(f()) { f(); }
+main(Object p) {
+  (p is String) && callMe(() { p.length; });
+  p = 0;
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
 
   void test_typePromotion_booleanAnd_useInRight_mutatedInLeft() {
-    Source source = addSource(EngineTestCase.createSource([
-        "main(Object p) {",
-        "  ((p is String) && ((p = 42) == 42)) && p.length != 0;",
-        "}"]));
+    Source source = addSource(r'''
+main(Object p) {
+  ((p is String) && ((p = 42) == 42)) && p.length != 0;
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
 
   void test_typePromotion_booleanAnd_useInRight_mutatedInRight() {
-    Source source = addSource(EngineTestCase.createSource([
-        "main(Object p) {",
-        "  (p is String) && (((p = 42) == 42) && p.length != 0);",
-        "}"]));
+    Source source = addSource(r'''
+main(Object p) {
+  (p is String) && (((p = 42) == 42) && p.length != 0);
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
 
   void test_typePromotion_conditional_useInThen_accessedInClosure_hasAssignment_after() {
-    Source source = addSource(EngineTestCase.createSource([
-        "callMe(f()) { f(); }",
-        "main(Object p) {",
-        "  p is String ? callMe(() { p.length; }) : 0;",
-        "  p = 42;",
-        "}"]));
+    Source source = addSource(r'''
+callMe(f()) { f(); }
+main(Object p) {
+  p is String ? callMe(() { p.length; }) : 0;
+  p = 42;
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
 
   void test_typePromotion_conditional_useInThen_accessedInClosure_hasAssignment_before() {
-    Source source = addSource(EngineTestCase.createSource([
-        "callMe(f()) { f(); }",
-        "main(Object p) {",
-        "  p = 42;",
-        "  p is String ? callMe(() { p.length; }) : 0;",
-        "}"]));
+    Source source = addSource(r'''
+callMe(f()) { f(); }
+main(Object p) {
+  p = 42;
+  p is String ? callMe(() { p.length; }) : 0;
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
 
   void test_typePromotion_conditional_useInThen_hasAssignment() {
-    Source source = addSource(EngineTestCase.createSource([
-        "main(Object p) {",
-        "  p is String ? (p.length + (p = 42)) : 0;",
-        "}"]));
+    Source source = addSource(r'''
+main(Object p) {
+  p is String ? (p.length + (p = 42)) : 0;
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
 
   void test_typePromotion_if_accessedInClosure_hasAssignment() {
-    Source source = addSource(EngineTestCase.createSource([
-        "callMe(f()) { f(); }",
-        "main(Object p) {",
-        "  if (p is String) {",
-        "    callMe(() {",
-        "      p.length;",
-        "    });",
-        "  }",
-        "  p = 0;",
-        "}"]));
+    Source source = addSource(r'''
+callMe(f()) { f(); }
+main(Object p) {
+  if (p is String) {
+    callMe(() {
+      p.length;
+    });
+  }
+  p = 0;
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
 
   void test_typePromotion_if_and_right_hasAssignment() {
-    Source source = addSource(EngineTestCase.createSource([
-        "main(Object p) {",
-        "  if (p is String && (p = null) == null) {",
-        "    p.length;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+main(Object p) {
+  if (p is String && (p = null) == null) {
+    p.length;
+  }
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
 
   void test_typePromotion_if_extends_notMoreSpecific_dynamic() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class V {}",
-        "class A<T> {}",
-        "class B<S> extends A<S> {",
-        "  var b;",
-        "}",
-        "",
-        "main(A<V> p) {",
-        "  if (p is B) {",
-        "    p.b;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class V {}
+class A<T> {}
+class B<S> extends A<S> {
+  var b;
+}
+
+main(A<V> p) {
+  if (p is B) {
+    p.b;
+  }
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
 
   void test_typePromotion_if_extends_notMoreSpecific_notMoreSpecificTypeArg() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class V {}",
-        "class A<T> {}",
-        "class B<S> extends A<S> {",
-        "  var b;",
-        "}",
-        "",
-        "main(A<V> p) {",
-        "  if (p is B<int>) {",
-        "    p.b;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class V {}
+class A<T> {}
+class B<S> extends A<S> {
+  var b;
+}
+
+main(A<V> p) {
+  if (p is B<int>) {
+    p.b;
+  }
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
 
   void test_typePromotion_if_hasAssignment_after() {
-    Source source = addSource(EngineTestCase.createSource([
-        "main(Object p) {",
-        "  if (p is String) {",
-        "    p.length;",
-        "    p = 0;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+main(Object p) {
+  if (p is String) {
+    p.length;
+    p = 0;
+  }
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
 
   void test_typePromotion_if_hasAssignment_before() {
-    Source source = addSource(EngineTestCase.createSource([
-        "main(Object p) {",
-        "  if (p is String) {",
-        "    p = 0;",
-        "    p.length;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+main(Object p) {
+  if (p is String) {
+    p = 0;
+    p.length;
+  }
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
 
   void test_typePromotion_if_hasAssignment_inClosure_anonymous_after() {
-    Source source = addSource(EngineTestCase.createSource([
-        "main(Object p) {",
-        "  if (p is String) {",
-        "    p.length;",
-        "  }",
-        "  () {p = 0;};",
-        "}"]));
+    Source source = addSource(r'''
+main(Object p) {
+  if (p is String) {
+    p.length;
+  }
+  () {p = 0;};
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
 
   void test_typePromotion_if_hasAssignment_inClosure_anonymous_before() {
-    Source source = addSource(EngineTestCase.createSource([
-        "main(Object p) {",
-        "  () {p = 0;};",
-        "  if (p is String) {",
-        "    p.length;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+main(Object p) {
+  () {p = 0;};
+  if (p is String) {
+    p.length;
+  }
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
 
   void test_typePromotion_if_hasAssignment_inClosure_function_after() {
-    Source source = addSource(EngineTestCase.createSource([
-        "main(Object p) {",
-        "  if (p is String) {",
-        "    p.length;",
-        "  }",
-        "  f() {p = 0;};",
-        "}"]));
+    Source source = addSource(r'''
+main(Object p) {
+  if (p is String) {
+    p.length;
+  }
+  f() {p = 0;};
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
 
   void test_typePromotion_if_hasAssignment_inClosure_function_before() {
-    Source source = addSource(EngineTestCase.createSource([
-        "main(Object p) {",
-        "  f() {p = 0;};",
-        "  if (p is String) {",
-        "    p.length;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+main(Object p) {
+  f() {p = 0;};
+  if (p is String) {
+    p.length;
+  }
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
 
   void test_typePromotion_if_implements_notMoreSpecific_dynamic() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class V {}",
-        "class A<T> {}",
-        "class B<S> implements A<S> {",
-        "  var b;",
-        "}",
-        "",
-        "main(A<V> p) {",
-        "  if (p is B) {",
-        "    p.b;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class V {}
+class A<T> {}
+class B<S> implements A<S> {
+  var b;
+}
+
+main(A<V> p) {
+  if (p is B) {
+    p.b;
+  }
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
 
   void test_typePromotion_if_with_notMoreSpecific_dynamic() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class V {}",
-        "class A<T> {}",
-        "class B<S> extends Object with A<S> {",
-        "  var b;",
-        "}",
-        "",
-        "main(A<V> p) {",
-        "  if (p is B) {",
-        "    p.b;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class V {}
+class A<T> {}
+class B<S> extends Object with A<S> {
+  var b;
+}
+
+main(A<V> p) {
+  if (p is B) {
+    p.b;
+  }
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
 
   void test_undefinedFunction() {
-    Source source = addSource(EngineTestCase.createSource(["void f() {", "  g();", "}"]));
+    Source source = addSource(r'''
+void f() {
+  g();
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_FUNCTION]);
   }
 
   void test_undefinedFunction_hasImportPrefix() {
-    Source source = addSource(EngineTestCase.createSource(["import 'lib.dart' as f;", "main() { return f(); }"]));
+    Source source = addSource(r'''
+import 'lib.dart' as f;
+main() { return f(); }''');
     addNamedSource("/lib.dart", "library lib;");
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_FUNCTION]);
   }
 
   void test_undefinedFunction_inCatch() {
-    Source source = addSource(EngineTestCase.createSource([
-        "void f() {",
-        "  try {",
-        "  } on Object {",
-        "    g();",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+void f() {
+  try {
+  } on Object {
+    g();
+  }
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_FUNCTION]);
   }
 
   void test_undefinedFunction_inImportedLib() {
-    Source source = addSource(EngineTestCase.createSource(["import 'lib.dart' as f;", "main() { return f.g(); }"]));
-    addNamedSource("/lib.dart", EngineTestCase.createSource(["library lib;", "h() {}"]));
+    Source source = addSource(r'''
+import 'lib.dart' as f;
+main() { return f.g(); }''');
+    addNamedSource("/lib.dart", r'''
+library lib;
+h() {}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_FUNCTION]);
   }
 
   void test_undefinedGetter() {
-    Source source = addSource(EngineTestCase.createSource(["class T {}", "f(T e) { return e.m; }"]));
+    Source source = addSource(r'''
+class T {}
+f(T e) { return e.m; }''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
 
   void test_undefinedGetter_proxy_annotation_fakeProxy() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library L;",
-        "class Fake {",
-        "  const Fake();",
-        "}",
-        "const proxy = const Fake();",
-        "@proxy class PrefixProxy {}",
-        "main() {",
-        "  new PrefixProxy().foo;",
-        "}"]));
+    Source source = addSource(r'''
+library L;
+class Fake {
+  const Fake();
+}
+const proxy = const Fake();
+@proxy class PrefixProxy {}
+main() {
+  new PrefixProxy().foo;
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
 
   void test_undefinedGetter_static() {
-    Source source = addSource(EngineTestCase.createSource(["class A {}", "var a = A.B;"]));
+    Source source = addSource(r'''
+class A {}
+var a = A.B;''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
 
   void test_undefinedGetter_void() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class T {",
-        "  void m() {}",
-        "}",
-        "f(T e) { return e.m().f; }"]));
+    Source source = addSource(r'''
+class T {
+  void m() {}
+}
+f(T e) { return e.m().f; }''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
 
   void test_undefinedGetter_wrongNumberOfTypeArguments_tooLittle() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A<K, V> {",
-        "  K element;",
-        "}",
-        "main(A<int> a) {",
-        "  a.element.anyGetterExistsInDynamic;",
-        "}"]));
+    Source source = addSource(r'''
+class A<K, V> {
+  K element;
+}
+main(A<int> a) {
+  a.element.anyGetterExistsInDynamic;
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS]);
     verify([source]);
   }
 
   void test_undefinedGetter_wrongNumberOfTypeArguments_tooMany() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A<E> {",
-        "  E element;",
-        "}",
-        "main(A<int,int> a) {",
-        "  a.element.anyGetterExistsInDynamic;",
-        "}"]));
+    Source source = addSource(r'''
+class A<E> {
+  E element;
+}
+main(A<int,int> a) {
+  a.element.anyGetterExistsInDynamic;
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS]);
     verify([source]);
   }
 
   void test_undefinedGetter_wrongOfTypeArgument() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A<E> {",
-        "  E element;",
-        "}",
-        "main(A<NoSuchType> a) {",
-        "  a.element.anyGetterExistsInDynamic;",
-        "}"]));
+    Source source = addSource(r'''
+class A<E> {
+  E element;
+}
+main(A<NoSuchType> a) {
+  a.element.anyGetterExistsInDynamic;
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT]);
     verify([source]);
   }
 
   void test_undefinedMethod() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  void m() {", "    n();", "  }", "}"]));
+    Source source = addSource(r'''
+class A {
+  void m() {
+    n();
+  }
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_METHOD]);
   }
 
   void test_undefinedMethod_assignmentExpression() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B {",
-        "  f(A a) {",
-        "    A a2 = new A();",
-        "    a += a2;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A {}
+class B {
+  f(A a) {
+    A a2 = new A();
+    a += a2;
+  }
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_METHOD]);
   }
 
   void test_undefinedMethod_ignoreTypePropagation() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B extends A {",
-        "  m() {}",
-        "}",
-        "class C {",
-        "  f() {",
-        "    A a = new B();",
-        "    a.m();",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A {}
+class B extends A {
+  m() {}
+}
+class C {
+  f() {
+    A a = new B();
+    a.m();
+  }
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_METHOD]);
   }
 
   void test_undefinedMethod_private() {
-    addNamedSource("/lib.dart", EngineTestCase.createSource(["library lib;", "class A {", "  _foo() {}", "}"]));
-    Source source = addSource(EngineTestCase.createSource([
-        "import 'lib.dart';",
-        "class B extends A {",
-        "  test() {",
-        "    _foo();",
-        "  }",
-        "}"]));
+    addNamedSource("/lib.dart", r'''
+library lib;
+class A {
+  _foo() {}
+}''');
+    Source source = addSource(r'''
+import 'lib.dart';
+class B extends A {
+  test() {
+    _foo();
+  }
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_METHOD]);
   }
 
   void test_undefinedMethod_proxy_annotation_fakeProxy() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library L;",
-        "class Fake {",
-        "  const Fake();",
-        "}",
-        "const proxy = const Fake();",
-        "@proxy class PrefixProxy {}",
-        "main() {",
-        "  new PrefixProxy().foo();",
-        "}"]));
+    Source source = addSource(r'''
+library L;
+class Fake {
+  const Fake();
+}
+const proxy = const Fake();
+@proxy class PrefixProxy {}
+main() {
+  new PrefixProxy().foo();
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_METHOD]);
   }
 
   void test_undefinedOperator_indexBoth() {
-    Source source = addSource(EngineTestCase.createSource(["class A {}", "f(A a) {", "  a[0]++;", "}"]));
+    Source source = addSource(r'''
+class A {}
+f(A a) {
+  a[0]++;
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
   }
 
   void test_undefinedOperator_indexGetter() {
-    Source source = addSource(EngineTestCase.createSource(["class A {}", "f(A a) {", "  a[0];", "}"]));
+    Source source = addSource(r'''
+class A {}
+f(A a) {
+  a[0];
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
   }
 
   void test_undefinedOperator_indexSetter() {
-    Source source = addSource(EngineTestCase.createSource(["class A {}", "f(A a) {", "  a[0] = 1;", "}"]));
+    Source source = addSource(r'''
+class A {}
+f(A a) {
+  a[0] = 1;
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
   }
 
   void test_undefinedOperator_plus() {
-    Source source = addSource(EngineTestCase.createSource(["class A {}", "f(A a) {", "  a + 1;", "}"]));
+    Source source = addSource(r'''
+class A {}
+f(A a) {
+  a + 1;
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
   }
 
   void test_undefinedOperator_postfixExpression() {
-    Source source = addSource(EngineTestCase.createSource(["class A {}", "f(A a) {", "  a++;", "}"]));
+    Source source = addSource(r'''
+class A {}
+f(A a) {
+  a++;
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
   }
 
   void test_undefinedOperator_prefixExpression() {
-    Source source = addSource(EngineTestCase.createSource(["class A {}", "f(A a) {", "  ++a;", "}"]));
+    Source source = addSource(r'''
+class A {}
+f(A a) {
+  ++a;
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
   }
 
   void test_undefinedSetter() {
-    Source source = addSource(EngineTestCase.createSource(["class T {}", "f(T e1) { e1.m = 0; }"]));
+    Source source = addSource(r'''
+class T {}
+f(T e1) { e1.m = 0; }''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_SETTER]);
   }
 
   void test_undefinedSetter_static() {
-    Source source = addSource(EngineTestCase.createSource(["class A {}", "f() { A.B = 0;}"]));
+    Source source = addSource(r'''
+class A {}
+f() { A.B = 0;}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_SETTER]);
   }
 
   void test_undefinedSetter_void() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class T {",
-        "  void m() {}",
-        "}",
-        "f(T e) { e.m().f = 0; }"]));
+    Source source = addSource(r'''
+class T {
+  void m() {}
+}
+f(T e) { e.m().f = 0; }''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_SETTER]);
   }
 
   void test_undefinedSuperMethod() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class B extends A {",
-        "  m() { return super.m(); }",
-        "}"]));
+    Source source = addSource(r'''
+class A {}
+class B extends A {
+  m() { return super.m(); }
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_SUPER_METHOD]);
   }
 
   void test_unqualifiedReferenceToNonLocalStaticMember_getter() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  static int get a => 0;",
-        "}",
-        "class B extends A {",
-        "  int b() {",
-        "    return a;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  static int get a => 0;
+}
+class B extends A {
+  int b() {
+    return a;
+  }
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER]);
     verify([source]);
   }
 
   void test_unqualifiedReferenceToNonLocalStaticMember_method() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  static void a() {}",
-        "}",
-        "class B extends A {",
-        "  void b() {",
-        "    a();",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  static void a() {}
+}
+class B extends A {
+  void b() {
+    a();
+  }
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER]);
     verify([source]);
   }
 
   void test_unqualifiedReferenceToNonLocalStaticMember_setter() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  static set a(x) {}",
-        "}",
-        "class B extends A {",
-        "  b(y) {",
-        "    a = y;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  static set a(x) {}
+}
+class B extends A {
+  b(y) {
+    a = y;
+  }
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER]);
     verify([source]);
   }
 
   void test_wrongNumberOfTypeArguments_classAlias() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class M {}",
-        "class B<F extends num> = A<F> with M;"]));
+    Source source = addSource(r'''
+class A {}
+class M {}
+class B<F extends num> = A<F> with M;''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS]);
     verify([source]);
   }
 
   void test_wrongNumberOfTypeArguments_tooFew() {
-    Source source = addSource(EngineTestCase.createSource(["class A<E, F> {}", "A<A> a = null;"]));
+    Source source = addSource(r'''
+class A<E, F> {}
+A<A> a = null;''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS]);
     verify([source]);
   }
 
   void test_wrongNumberOfTypeArguments_tooMany() {
-    Source source = addSource(EngineTestCase.createSource(["class A<E> {}", "A<A, A> a = null;"]));
+    Source source = addSource(r'''
+class A<E> {}
+A<A, A> a = null;''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS]);
     verify([source]);
   }
 
   void test_wrongNumberOfTypeArguments_typeTest_tooFew() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class C<K, V> {}",
-        "f(p) {",
-        "  return p is C<A>;",
-        "}"]));
+    Source source = addSource(r'''
+class A {}
+class C<K, V> {}
+f(p) {
+  return p is C<A>;
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS]);
     verify([source]);
   }
 
   void test_wrongNumberOfTypeArguments_typeTest_tooMany() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class C<E> {}",
-        "f(p) {",
-        "  return p is C<A, A>;",
-        "}"]));
+    Source source = addSource(r'''
+class A {}
+class C<E> {}
+f(p) {
+  return p is C<A, A>;
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS]);
     verify([source]);
@@ -1321,6 +1446,6 @@
 }
 
 main() {
-  _ut.groupSep = ' | ';
+  groupSep = ' | ';
   runReflectiveTests(StaticTypeWarningCodeTest);
 }
diff --git a/pkg/analyzer/test/generated/static_warning_code_test.dart b/pkg/analyzer/test/generated/static_warning_code_test.dart
index a4807c9..f8b0893 100644
--- a/pkg/analyzer/test/generated/static_warning_code_test.dart
+++ b/pkg/analyzer/test/generated/static_warning_code_test.dart
@@ -4,11 +4,10 @@
 
 library engine.static_warning_code_test;
 
-import 'package:analyzer/src/generated/java_junit.dart';
 import 'package:analyzer/src/generated/source_io.dart';
 import 'package:analyzer/src/generated/error.dart';
 import 'package:analyzer/src/generated/parser.dart' show ParserErrorCode;
-import 'package:unittest/unittest.dart' as _ut;
+import 'package:unittest/unittest.dart';
 import 'resolver_test.dart';
 import 'test_support.dart';
 import '../reflective_tests.dart';
@@ -16,14 +15,18 @@
 
 class StaticWarningCodeTest extends ResolverTestCase {
   void fail_undefinedGetter() {
-    Source source = addSource(EngineTestCase.createSource([]));
+    Source source = addSource(r'''
+''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.UNDEFINED_GETTER]);
     verify([source]);
   }
 
   void fail_undefinedIdentifier_commentReference() {
-    Source source = addSource(EngineTestCase.createSource(["/** [m] xxx [new B.c] */", "class A {", "}"]));
+    Source source = addSource(r'''
+/** [m] xxx [new B.c] */
+class A {
+}''');
     resolve(source);
     assertErrors(source, [
         StaticWarningCode.UNDEFINED_IDENTIFIER,
@@ -31,30 +34,42 @@
   }
 
   void fail_undefinedSetter() {
-    Source source = addSource(EngineTestCase.createSource(["class C {}", "f(var p) {", "  C.m = 0;", "}"]));
+    Source source = addSource(r'''
+class C {}
+f(var p) {
+  C.m = 0;
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.UNDEFINED_SETTER]);
     verify([source]);
   }
 
   void test_ambiguousImport_as() {
-    Source source = addSource(EngineTestCase.createSource([
-        "import 'lib1.dart';",
-        "import 'lib2.dart';",
-        "f(p) {p as N;}"]));
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class N {}"]));
-    addNamedSource("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class N {}"]));
+    Source source = addSource(r'''
+import 'lib1.dart';
+import 'lib2.dart';
+f(p) {p as N;}''');
+    addNamedSource("/lib1.dart", r'''
+library lib1;
+class N {}''');
+    addNamedSource("/lib2.dart", r'''
+library lib2;
+class N {}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.AMBIGUOUS_IMPORT]);
   }
 
   void test_ambiguousImport_extends() {
-    Source source = addSource(EngineTestCase.createSource([
-        "import 'lib1.dart';",
-        "import 'lib2.dart';",
-        "class A extends N {}"]));
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class N {}"]));
-    addNamedSource("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class N {}"]));
+    Source source = addSource(r'''
+import 'lib1.dart';
+import 'lib2.dart';
+class A extends N {}''');
+    addNamedSource("/lib1.dart", r'''
+library lib1;
+class N {}''');
+    addNamedSource("/lib2.dart", r'''
+library lib2;
+class N {}''');
     resolve(source);
     assertErrors(source, [
         StaticWarningCode.AMBIGUOUS_IMPORT,
@@ -62,12 +77,16 @@
   }
 
   void test_ambiguousImport_implements() {
-    Source source = addSource(EngineTestCase.createSource([
-        "import 'lib1.dart';",
-        "import 'lib2.dart';",
-        "class A implements N {}"]));
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class N {}"]));
-    addNamedSource("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class N {}"]));
+    Source source = addSource(r'''
+import 'lib1.dart';
+import 'lib2.dart';
+class A implements N {}''');
+    addNamedSource("/lib1.dart", r'''
+library lib1;
+class N {}''');
+    addNamedSource("/lib2.dart", r'''
+library lib2;
+class N {}''');
     resolve(source);
     assertErrors(source, [
         StaticWarningCode.AMBIGUOUS_IMPORT,
@@ -75,14 +94,20 @@
   }
 
   void test_ambiguousImport_inPart() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library lib;",
-        "import 'lib1.dart';",
-        "import 'lib2.dart';",
-        "part 'part.dart';"]));
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class N {}"]));
-    addNamedSource("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class N {}"]));
-    Source partSource = addNamedSource("/part.dart", EngineTestCase.createSource(["part of lib;", "class A extends N {}"]));
+    Source source = addSource(r'''
+library lib;
+import 'lib1.dart';
+import 'lib2.dart';
+part 'part.dart';''');
+    addNamedSource("/lib1.dart", r'''
+library lib1;
+class N {}''');
+    addNamedSource("/lib2.dart", r'''
+library lib2;
+class N {}''');
+    Source partSource = addNamedSource("/part.dart", r'''
+part of lib;
+class A extends N {}''');
     resolve(source);
     assertErrors(partSource, [
         StaticWarningCode.AMBIGUOUS_IMPORT,
@@ -90,54 +115,70 @@
   }
 
   void test_ambiguousImport_instanceCreation() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library L;",
-        "import 'lib1.dart';",
-        "import 'lib2.dart';",
-        "f() {new N();}"]));
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class N {}"]));
-    addNamedSource("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class N {}"]));
+    Source source = addSource(r'''
+library L;
+import 'lib1.dart';
+import 'lib2.dart';
+f() {new N();}''');
+    addNamedSource("/lib1.dart", r'''
+library lib1;
+class N {}''');
+    addNamedSource("/lib2.dart", r'''
+library lib2;
+class N {}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.AMBIGUOUS_IMPORT]);
   }
 
   void test_ambiguousImport_is() {
-    Source source = addSource(EngineTestCase.createSource([
-        "import 'lib1.dart';",
-        "import 'lib2.dart';",
-        "f(p) {p is N;}"]));
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class N {}"]));
-    addNamedSource("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class N {}"]));
+    Source source = addSource(r'''
+import 'lib1.dart';
+import 'lib2.dart';
+f(p) {p is N;}''');
+    addNamedSource("/lib1.dart", r'''
+library lib1;
+class N {}''');
+    addNamedSource("/lib2.dart", r'''
+library lib2;
+class N {}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.AMBIGUOUS_IMPORT]);
   }
 
   void test_ambiguousImport_qualifier() {
-    Source source = addSource(EngineTestCase.createSource([
-        "import 'lib1.dart';",
-        "import 'lib2.dart';",
-        "g() { N.FOO; }"]));
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class N {}"]));
-    addNamedSource("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class N {}"]));
+    Source source = addSource(r'''
+import 'lib1.dart';
+import 'lib2.dart';
+g() { N.FOO; }''');
+    addNamedSource("/lib1.dart", r'''
+library lib1;
+class N {}''');
+    addNamedSource("/lib2.dart", r'''
+library lib2;
+class N {}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.AMBIGUOUS_IMPORT]);
   }
 
   void test_ambiguousImport_typeAnnotation() {
-    Source source = addSource(EngineTestCase.createSource([
-        "import 'lib1.dart';",
-        "import 'lib2.dart';",
-        "typedef N FT(N p);",
-        "N f(N p) {",
-        "  N v;",
-        "  return null;",
-        "}",
-        "class A {",
-        "  N m() { return null; }",
-        "}",
-        "class B<T extends N> {}"]));
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class N {}"]));
-    addNamedSource("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class N {}"]));
+    Source source = addSource(r'''
+import 'lib1.dart';
+import 'lib2.dart';
+typedef N FT(N p);
+N f(N p) {
+  N v;
+  return null;
+}
+class A {
+  N m() { return null; }
+}
+class B<T extends N> {}''');
+    addNamedSource("/lib1.dart", r'''
+library lib1;
+class N {}''');
+    addNamedSource("/lib2.dart", r'''
+library lib2;
+class N {}''');
     resolve(source);
     assertErrors(source, [
         StaticWarningCode.AMBIGUOUS_IMPORT,
@@ -150,142 +191,161 @@
   }
 
   void test_ambiguousImport_typeArgument_annotation() {
-    Source source = addSource(EngineTestCase.createSource([
-        "import 'lib1.dart';",
-        "import 'lib2.dart';",
-        "class A<T> {}",
-        "A<N> f() { return null; }"]));
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class N {}"]));
-    addNamedSource("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class N {}"]));
+    Source source = addSource(r'''
+import 'lib1.dart';
+import 'lib2.dart';
+class A<T> {}
+A<N> f() { return null; }''');
+    addNamedSource("/lib1.dart", r'''
+library lib1;
+class N {}''');
+    addNamedSource("/lib2.dart", r'''
+library lib2;
+class N {}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.AMBIGUOUS_IMPORT]);
   }
 
   void test_ambiguousImport_typeArgument_instanceCreation() {
-    Source source = addSource(EngineTestCase.createSource([
-        "import 'lib1.dart';",
-        "import 'lib2.dart';",
-        "class A<T> {}",
-        "f() {new A<N>();}"]));
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class N {}"]));
-    addNamedSource("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class N {}"]));
+    Source source = addSource(r'''
+import 'lib1.dart';
+import 'lib2.dart';
+class A<T> {}
+f() {new A<N>();}''');
+    addNamedSource("/lib1.dart", r'''
+library lib1;
+class N {}''');
+    addNamedSource("/lib2.dart", r'''
+library lib2;
+class N {}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.AMBIGUOUS_IMPORT]);
   }
 
   void test_ambiguousImport_varRead() {
-    Source source = addSource(EngineTestCase.createSource([
-        "import 'lib1.dart';",
-        "import 'lib2.dart';",
-        "f() { g(v); }",
-        "g(p) {}"]));
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "var v;"]));
-    addNamedSource("/lib2.dart", EngineTestCase.createSource(["library lib2;", "var v;"]));
+    Source source = addSource(r'''
+import 'lib1.dart';
+import 'lib2.dart';
+f() { g(v); }
+g(p) {}''');
+    addNamedSource("/lib1.dart", r'''
+library lib1;
+var v;''');
+    addNamedSource("/lib2.dart", r'''
+library lib2;
+var v;''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.AMBIGUOUS_IMPORT]);
   }
 
   void test_ambiguousImport_varWrite() {
-    Source source = addSource(EngineTestCase.createSource([
-        "import 'lib1.dart';",
-        "import 'lib2.dart';",
-        "f() { v = 0; }"]));
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "var v;"]));
-    addNamedSource("/lib2.dart", EngineTestCase.createSource(["library lib2;", "var v;"]));
+    Source source = addSource(r'''
+import 'lib1.dart';
+import 'lib2.dart';
+f() { v = 0; }''');
+    addNamedSource("/lib1.dart", r'''
+library lib1;
+var v;''');
+    addNamedSource("/lib2.dart", r'''
+library lib2;
+var v;''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.AMBIGUOUS_IMPORT]);
   }
 
   void test_argumentTypeNotAssignable_ambiguousClassName() {
     // See dartbug.com/19624
-    Source source = addNamedSource("/lib1.dart", EngineTestCase.createSource([
-        "library lib1;",
-        "import 'lib2.dart';",
-        "class _A {}",
-        "f() {",
-        "  g((_A a) {});",
-        "}"]));
-    addNamedSource("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class _A {}", "g(h(_A a)) {}"]));
+    Source source = addNamedSource("/lib1.dart", r'''
+library lib1;
+import 'lib2.dart';
+class _A {}
+f() {
+  g((_A a) {});
+}''');
+    addNamedSource("/lib2.dart", r'''
+library lib2;
+class _A {}
+g(h(_A a)) {}''');
     resolve(source);
     // The name _A is private to the library it's defined in, so this is a type mismatch.
     // Furthermore, the error message should mention both _A and the filenames
     // so the user can figure out what's going on.
     List<AnalysisError> errors = analysisContext2.computeErrors(source);
-    EngineTestCase.assertLength(1, errors);
+    expect(errors, hasLength(1));
     AnalysisError error = errors[0];
-    JUnitTestCase.assertEquals(error.errorCode, StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE);
+    expect(StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, error.errorCode);
     String message = error.message;
-    JUnitTestCase.assertTrue(message.indexOf("_A") != -1);
-    JUnitTestCase.assertTrue(message.indexOf("lib1.dart") != -1);
-    JUnitTestCase.assertTrue(message.indexOf("lib2.dart") != -1);
+    expect(message.indexOf("_A") != -1, isTrue);
+    expect(message.indexOf("lib1.dart") != -1, isTrue);
+    expect(message.indexOf("lib2.dart") != -1, isTrue);
   }
 
   void test_argumentTypeNotAssignable_annotation_namedConstructor() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  const A.fromInt(int p);",
-        "}",
-        "@A.fromInt('0')",
-        "main() {",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  const A.fromInt(int p);
+}
+@A.fromInt('0')
+main() {
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
     verify([source]);
   }
 
   void test_argumentTypeNotAssignable_annotation_unnamedConstructor() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  const A(int p);",
-        "}",
-        "@A('0')",
-        "main() {",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  const A(int p);
+}
+@A('0')
+main() {
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
     verify([source]);
   }
 
   void test_argumentTypeNotAssignable_binary() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  operator +(int p) {}",
-        "}",
-        "f(A a) {",
-        "  a + '0';",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  operator +(int p) {}
+}
+f(A a) {
+  a + '0';
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
     verify([source]);
   }
 
   void test_argumentTypeNotAssignable_cascadeSecond() {
-    Source source = addSource(EngineTestCase.createSource([
-        "// filler filler filler filler filler filler filler filler filler filler",
-        "class A {",
-        "  B ma() { return new B(); }",
-        "}",
-        "class B {",
-        "  mb(String p) {}",
-        "}",
-        "",
-        "main() {",
-        "  A a = new A();",
-        "  a..  ma().mb(0);",
-        "}"]));
+    Source source = addSource(r'''
+// filler filler filler filler filler filler filler filler filler filler
+class A {
+  B ma() { return new B(); }
+}
+class B {
+  mb(String p) {}
+}
+
+main() {
+  A a = new A();
+  a..  ma().mb(0);
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
     verify([source]);
   }
 
   void test_argumentTypeNotAssignable_const() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  const A(String p);",
-        "}",
-        "main() {",
-        "  const A(42);",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  const A(String p);
+}
+main() {
+  const A(42);
+}''');
     resolve(source);
     assertErrors(source, [
         StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE,
@@ -294,643 +354,734 @@
   }
 
   void test_argumentTypeNotAssignable_const_super() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  const A(String p);",
-        "}",
-        "class B extends A {",
-        "  const B() : super(42);",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  const A(String p);
+}
+class B extends A {
+  const B() : super(42);
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
     verify([source]);
   }
 
   void test_argumentTypeNotAssignable_functionExpressionInvocation_required() {
-    Source source = addSource(EngineTestCase.createSource(["main() {", "  (int x) {} ('');", "}"]));
+    Source source = addSource(r'''
+main() {
+  (int x) {} ('');
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
     verify([source]);
   }
 
   void test_argumentTypeNotAssignable_index() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  operator [](int index) {}",
-        "}",
-        "f(A a) {",
-        "  a['0'];",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  operator [](int index) {}
+}
+f(A a) {
+  a['0'];
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
     verify([source]);
   }
 
   void test_argumentTypeNotAssignable_invocation_callParameter() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  call(int p) {}",
-        "}",
-        "f(A a) {",
-        "  a('0');",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  call(int p) {}
+}
+f(A a) {
+  a('0');
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
     verify([source]);
   }
 
   void test_argumentTypeNotAssignable_invocation_callVariable() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  call(int p) {}",
-        "}",
-        "main() {",
-        "  A a = new A();",
-        "  a('0');",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  call(int p) {}
+}
+main() {
+  A a = new A();
+  a('0');
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
     verify([source]);
   }
 
   void test_argumentTypeNotAssignable_invocation_functionParameter() {
-    Source source = addSource(EngineTestCase.createSource(["a(b(int p)) {", "  b('0');", "}"]));
+    Source source = addSource(r'''
+a(b(int p)) {
+  b('0');
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
     verify([source]);
   }
 
   void test_argumentTypeNotAssignable_invocation_functionParameter_generic() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A<K, V> {",
-        "  m(f(K k), V v) {",
-        "    f(v);",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A<K, V> {
+  m(f(K k), V v) {
+    f(v);
+  }
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
     verify([source]);
   }
 
   void test_argumentTypeNotAssignable_invocation_functionTypes_optional() {
-    Source source = addSource(EngineTestCase.createSource([
-        "void acceptFunNumOptBool(void funNumOptBool([bool b])) {}",
-        "void funNumBool(bool b) {}",
-        "main() {",
-        "  acceptFunNumOptBool(funNumBool);",
-        "}"]));
+    Source source = addSource(r'''
+void acceptFunNumOptBool(void funNumOptBool([bool b])) {}
+void funNumBool(bool b) {}
+main() {
+  acceptFunNumOptBool(funNumBool);
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
     verify([source]);
   }
 
   void test_argumentTypeNotAssignable_invocation_generic() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A<T> {",
-        "  m(T t) {}",
-        "}",
-        "f(A<String> a) {",
-        "  a.m(1);",
-        "}"]));
+    Source source = addSource(r'''
+class A<T> {
+  m(T t) {}
+}
+f(A<String> a) {
+  a.m(1);
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
     verify([source]);
   }
 
   void test_argumentTypeNotAssignable_invocation_named() {
-    Source source = addSource(EngineTestCase.createSource(["f({String p}) {}", "main() {", "  f(p: 42);", "}"]));
+    Source source = addSource(r'''
+f({String p}) {}
+main() {
+  f(p: 42);
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
     verify([source]);
   }
 
   void test_argumentTypeNotAssignable_invocation_optional() {
-    Source source = addSource(EngineTestCase.createSource(["f([String p]) {}", "main() {", "  f(42);", "}"]));
+    Source source = addSource(r'''
+f([String p]) {}
+main() {
+  f(42);
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
     verify([source]);
   }
 
   void test_argumentTypeNotAssignable_invocation_required() {
-    Source source = addSource(EngineTestCase.createSource(["f(String p) {}", "main() {", "  f(42);", "}"]));
+    Source source = addSource(r'''
+f(String p) {}
+main() {
+  f(42);
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
     verify([source]);
   }
 
   void test_argumentTypeNotAssignable_invocation_typedef_generic() {
-    Source source = addSource(EngineTestCase.createSource(["typedef A<T>(T p);", "f(A<int> a) {", "  a('1');", "}"]));
+    Source source = addSource(r'''
+typedef A<T>(T p);
+f(A<int> a) {
+  a('1');
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
     verify([source]);
   }
 
   void test_argumentTypeNotAssignable_invocation_typedef_local() {
-    Source source = addSource(EngineTestCase.createSource([
-        "typedef A(int p);",
-        "A getA() => null;",
-        "main() {",
-        "  A a = getA();",
-        "  a('1');",
-        "}"]));
+    Source source = addSource(r'''
+typedef A(int p);
+A getA() => null;
+main() {
+  A a = getA();
+  a('1');
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
     verify([source]);
   }
 
   void test_argumentTypeNotAssignable_invocation_typedef_parameter() {
-    Source source = addSource(EngineTestCase.createSource(["typedef A(int p);", "f(A a) {", "  a('1');", "}"]));
+    Source source = addSource(r'''
+typedef A(int p);
+f(A a) {
+  a('1');
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
     verify([source]);
   }
 
   void test_argumentTypeNotAssignable_new_generic() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A<T> {",
-        "  A(T p) {}",
-        "}",
-        "main() {",
-        "  new A<String>(42);",
-        "}"]));
+    Source source = addSource(r'''
+class A<T> {
+  A(T p) {}
+}
+main() {
+  new A<String>(42);
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
     verify([source]);
   }
 
   void test_argumentTypeNotAssignable_new_optional() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  A([String p]) {}",
-        "}",
-        "main() {",
-        "  new A(42);",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  A([String p]) {}
+}
+main() {
+  new A(42);
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
     verify([source]);
   }
 
   void test_argumentTypeNotAssignable_new_required() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  A(String p) {}",
-        "}",
-        "main() {",
-        "  new A(42);",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  A(String p) {}
+}
+main() {
+  new A(42);
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
     verify([source]);
   }
 
   void test_assignmentToConst_instanceVariable() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  static const v = 0;",
-        "}",
-        "f() {",
-        "  A.v = 1;",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  static const v = 0;
+}
+f() {
+  A.v = 1;
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_CONST]);
     verify([source]);
   }
 
   void test_assignmentToConst_instanceVariable_plusEq() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  static const v = 0;",
-        "}",
-        "f() {",
-        "  A.v += 1;",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  static const v = 0;
+}
+f() {
+  A.v += 1;
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_CONST]);
     verify([source]);
   }
 
   void test_assignmentToConst_localVariable() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  const x = 0;", "  x = 1;", "}"]));
+    Source source = addSource(r'''
+f() {
+  const x = 0;
+  x = 1;
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_CONST]);
     verify([source]);
   }
 
   void test_assignmentToConst_localVariable_plusEq() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  const x = 0;", "  x += 1;", "}"]));
+    Source source = addSource(r'''
+f() {
+  const x = 0;
+  x += 1;
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_CONST]);
     verify([source]);
   }
 
   void test_assignmentToFinal_instanceVariable() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  final v = 0;",
-        "}",
-        "f() {",
-        "  A a = new A();",
-        "  a.v = 1;",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  final v = 0;
+}
+f() {
+  A a = new A();
+  a.v = 1;
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_FINAL]);
     verify([source]);
   }
 
   void test_assignmentToFinal_instanceVariable_plusEq() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  final v = 0;",
-        "}",
-        "f() {",
-        "  A a = new A();",
-        "  a.v += 1;",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  final v = 0;
+}
+f() {
+  A a = new A();
+  a.v += 1;
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_FINAL]);
     verify([source]);
   }
 
   void test_assignmentToFinal_localVariable() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  final x = 0;", "  x = 1;", "}"]));
+    Source source = addSource(r'''
+f() {
+  final x = 0;
+  x = 1;
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_FINAL]);
     verify([source]);
   }
 
   void test_assignmentToFinal_localVariable_plusEq() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  final x = 0;", "  x += 1;", "}"]));
+    Source source = addSource(r'''
+f() {
+  final x = 0;
+  x += 1;
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_FINAL]);
     verify([source]);
   }
 
   void test_assignmentToFinal_postfixMinusMinus() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  final x = 0;", "  x--;", "}"]));
+    Source source = addSource(r'''
+f() {
+  final x = 0;
+  x--;
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_FINAL]);
     verify([source]);
   }
 
   void test_assignmentToFinal_postfixPlusPlus() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  final x = 0;", "  x++;", "}"]));
+    Source source = addSource(r'''
+f() {
+  final x = 0;
+  x++;
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_FINAL]);
     verify([source]);
   }
 
   void test_assignmentToFinal_prefixMinusMinus() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  final x = 0;", "  --x;", "}"]));
+    Source source = addSource(r'''
+f() {
+  final x = 0;
+  --x;
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_FINAL]);
     verify([source]);
   }
 
   void test_assignmentToFinal_prefixPlusPlus() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  final x = 0;", "  ++x;", "}"]));
+    Source source = addSource(r'''
+f() {
+  final x = 0;
+  ++x;
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_FINAL]);
     verify([source]);
   }
 
   void test_assignmentToFinal_suffixMinusMinus() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  final x = 0;", "  x--;", "}"]));
+    Source source = addSource(r'''
+f() {
+  final x = 0;
+  x--;
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_FINAL]);
     verify([source]);
   }
 
   void test_assignmentToFinal_suffixPlusPlus() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  final x = 0;", "  x++;", "}"]));
+    Source source = addSource(r'''
+f() {
+  final x = 0;
+  x++;
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_FINAL]);
     verify([source]);
   }
 
   void test_assignmentToFinal_topLevelVariable() {
-    Source source = addSource(EngineTestCase.createSource(["final x = 0;", "f() { x = 1; }"]));
+    Source source = addSource(r'''
+final x = 0;
+f() { x = 1; }''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_FINAL]);
     verify([source]);
   }
 
   void test_assignmentToFinalNoSetter_prefixedIdentifier() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  int get x => 0;",
-        "}",
-        "main() {",
-        "  A a = new A();",
-        "  a.x = 0;",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  int get x => 0;
+}
+main() {
+  A a = new A();
+  a.x = 0;
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_FINAL_NO_SETTER]);
     verify([source]);
   }
 
   void test_assignmentToFinalNoSetter_propertyAccess() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  int get x => 0;",
-        "}",
-        "class B {",
-        "  static A a;",
-        "}",
-        "main() {",
-        "  B.a.x = 0;",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  int get x => 0;
+}
+class B {
+  static A a;
+}
+main() {
+  B.a.x = 0;
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_FINAL_NO_SETTER]);
     verify([source]);
   }
 
   void test_assignmentToFunction() {
-    Source source = addSource(EngineTestCase.createSource(["f() {}", "main() {", "  f = null;", "}"]));
+    Source source = addSource(r'''
+f() {}
+main() {
+  f = null;
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_FUNCTION]);
     verify([source]);
   }
 
   void test_assignmentToMethod() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  m() {}",
-        "}",
-        "f(A a) {",
-        "  a.m = () {};",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  m() {}
+}
+f(A a) {
+  a.m = () {};
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.ASSIGNMENT_TO_METHOD]);
     verify([source]);
   }
 
   void test_caseBlockNotTerminated() {
-    Source source = addSource(EngineTestCase.createSource([
-        "f(int p) {",
-        "  switch (p) {",
-        "    case 0:",
-        "      f(p);",
-        "    case 1:",
-        "      break;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+f(int p) {
+  switch (p) {
+    case 0:
+      f(p);
+    case 1:
+      break;
+  }
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.CASE_BLOCK_NOT_TERMINATED]);
     verify([source]);
   }
 
   void test_castToNonType() {
-    Source source = addSource(EngineTestCase.createSource(["var A = 0;", "f(String s) { var x = s as A; }"]));
+    Source source = addSource(r'''
+var A = 0;
+f(String s) { var x = s as A; }''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.CAST_TO_NON_TYPE]);
     verify([source]);
   }
 
   void test_concreteClassWithAbstractMember() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  m();", "}"]));
+    Source source = addSource(r'''
+class A {
+  m();
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER]);
     verify([source]);
   }
 
   void test_conflictingDartImport() {
-    Source source = addSource(EngineTestCase.createSource([
-        "import 'lib.dart';",
-        "import 'dart:async';",
-        "Future f = null;",
-        "Stream s;"]));
-    addNamedSource("/lib.dart", EngineTestCase.createSource(["library lib;", "class Future {}"]));
+    Source source = addSource(r'''
+import 'lib.dart';
+import 'dart:async';
+Future f = null;
+Stream s;''');
+    addNamedSource("/lib.dart", r'''
+library lib;
+class Future {}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.CONFLICTING_DART_IMPORT]);
   }
 
   void test_conflictingInstanceGetterAndSuperclassMember_declField_direct_setter() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  static set v(x) {}",
-        "}",
-        "class B extends A {",
-        "  var v;",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  static set v(x) {}
+}
+class B extends A {
+  var v;
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER]);
     verify([source]);
   }
 
   void test_conflictingInstanceGetterAndSuperclassMember_declGetter_direct_getter() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  static get v => 0;",
-        "}",
-        "class B extends A {",
-        "  get v => 0;",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  static get v => 0;
+}
+class B extends A {
+  get v => 0;
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER]);
     verify([source]);
   }
 
   void test_conflictingInstanceGetterAndSuperclassMember_declGetter_direct_method() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  static v() {}",
-        "}",
-        "class B extends A {",
-        "  get v => 0;",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  static v() {}
+}
+class B extends A {
+  get v => 0;
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER]);
     verify([source]);
   }
 
   void test_conflictingInstanceGetterAndSuperclassMember_declGetter_direct_setter() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  static set v(x) {}",
-        "}",
-        "class B extends A {",
-        "  get v => 0;",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  static set v(x) {}
+}
+class B extends A {
+  get v => 0;
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER]);
     verify([source]);
   }
 
   void test_conflictingInstanceGetterAndSuperclassMember_declGetter_indirect() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  static int v;",
-        "}",
-        "class B extends A {}",
-        "class C extends B {",
-        "  get v => 0;",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  static int v;
+}
+class B extends A {}
+class C extends B {
+  get v => 0;
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER]);
     verify([source]);
   }
 
   void test_conflictingInstanceGetterAndSuperclassMember_declGetter_mixin() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class M {",
-        "  static int v;",
-        "}",
-        "class B extends Object with M {",
-        "  get v => 0;",
-        "}"]));
+    Source source = addSource(r'''
+class M {
+  static int v;
+}
+class B extends Object with M {
+  get v => 0;
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER]);
     verify([source]);
   }
 
   void test_conflictingInstanceGetterAndSuperclassMember_direct_field() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  static int v;",
-        "}",
-        "class B extends A {",
-        "  get v => 0;",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  static int v;
+}
+class B extends A {
+  get v => 0;
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER]);
     verify([source]);
   }
 
   void test_conflictingInstanceMethodSetter_sameClass() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  set foo(a) {}", "  foo() {}", "}"]));
+    Source source = addSource(r'''
+class A {
+  set foo(a) {}
+  foo() {}
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.CONFLICTING_INSTANCE_METHOD_SETTER]);
     verify([source]);
   }
 
   void test_conflictingInstanceMethodSetter_setterInInterface() {
-    Source source = addSource(EngineTestCase.createSource([
-        "abstract class A {",
-        "  set foo(a);",
-        "}",
-        "abstract class B implements A {",
-        "  foo() {}",
-        "}"]));
+    Source source = addSource(r'''
+abstract class A {
+  set foo(a);
+}
+abstract class B implements A {
+  foo() {}
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.CONFLICTING_INSTANCE_METHOD_SETTER]);
     verify([source]);
   }
 
   void test_conflictingInstanceMethodSetter_setterInSuper() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  set foo(a) {}",
-        "}",
-        "class B extends A {",
-        "  foo() {}",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  set foo(a) {}
+}
+class B extends A {
+  foo() {}
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.CONFLICTING_INSTANCE_METHOD_SETTER]);
     verify([source]);
   }
 
   void test_conflictingInstanceMethodSetter2() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  foo() {}", "  set foo(a) {}", "}"]));
+    Source source = addSource(r'''
+class A {
+  foo() {}
+  set foo(a) {}
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.CONFLICTING_INSTANCE_METHOD_SETTER2]);
     verify([source]);
   }
 
   void test_conflictingInstanceSetterAndSuperclassMember() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  static int v;",
-        "}",
-        "class B extends A {",
-        "  set v(x) {}",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  static int v;
+}
+class B extends A {
+  set v(x) {}
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER]);
     verify([source]);
   }
 
   void test_conflictingStaticGetterAndInstanceSetter_mixin() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  set x(int p) {}",
-        "}",
-        "class B extends Object with A {",
-        "  static get x => 0;",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  set x(int p) {}
+}
+class B extends Object with A {
+  static get x => 0;
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER]);
     verify([source]);
   }
 
   void test_conflictingStaticGetterAndInstanceSetter_superClass() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  set x(int p) {}",
-        "}",
-        "class B extends A {",
-        "  static get x => 0;",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  set x(int p) {}
+}
+class B extends A {
+  static get x => 0;
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER]);
     verify([source]);
   }
 
   void test_conflictingStaticGetterAndInstanceSetter_thisClass() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  static get x => 0;",
-        "  set x(int p) {}",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  static get x => 0;
+  set x(int p) {}
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER]);
     verify([source]);
   }
 
   void test_conflictingStaticSetterAndInstanceMember_thisClass_getter() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  get x => 0;",
-        "  static set x(int p) {}",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  get x => 0;
+  static set x(int p) {}
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER]);
     verify([source]);
   }
 
   void test_conflictingStaticSetterAndInstanceMember_thisClass_method() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  x() {}", "  static set x(int p) {}", "}"]));
+    Source source = addSource(r'''
+class A {
+  x() {}
+  static set x(int p) {}
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER]);
     verify([source]);
   }
 
   void test_constWithAbstractClass() {
-    Source source = addSource(EngineTestCase.createSource([
-        "abstract class A {",
-        "  const A();",
-        "}",
-        "void f() {",
-        "  A a = const A();",
-        "}"]));
+    Source source = addSource(r'''
+abstract class A {
+  const A();
+}
+void f() {
+  A a = const A();
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.CONST_WITH_ABSTRACT_CLASS]);
     verify([source]);
   }
 
   void test_equalKeysInMap() {
-    Source source = addSource(EngineTestCase.createSource(["var m = {'a' : 0, 'b' : 1, 'a' : 2};"]));
+    Source source = addSource("var m = {'a' : 0, 'b' : 1, 'a' : 2};");
     resolve(source);
     assertErrors(source, [StaticWarningCode.EQUAL_KEYS_IN_MAP]);
     verify([source]);
   }
 
   void test_equalKeysInMap_withEqualTypeParams() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A<T> {",
-        "  const A();",
-        "}",
-        "var m = {const A<int>(): 0, const A<int>(): 1};"]));
+    Source source = addSource(r'''
+class A<T> {
+  const A();
+}
+var m = {const A<int>(): 0, const A<int>(): 1};''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.EQUAL_KEYS_IN_MAP]);
     verify([source]);
@@ -938,21 +1089,21 @@
 
   void test_equalKeysInMap_withUnequalTypeParams() {
     // No error should be produced because A<int> and A<num> are different types.
-    Source source = addSource(EngineTestCase.createSource([
-        "class A<T> {",
-        "  const A();",
-        "}",
-        "var m = {const A<int>(): 0, const A<num>(): 1};"]));
+    Source source = addSource(r'''
+class A<T> {
+  const A();
+}
+var m = {const A<int>(): 0, const A<num>(): 1};''');
     resolve(source);
     assertNoErrors(source);
     verify([source]);
   }
 
   void test_exportDuplicatedLibraryName() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library test;",
-        "export 'lib1.dart';",
-        "export 'lib2.dart';"]));
+    Source source = addSource(r'''
+library test;
+export 'lib1.dart';
+export 'lib2.dart';''');
     addNamedSource("/lib1.dart", "library lib;");
     addNamedSource("/lib2.dart", "library lib;");
     resolve(source);
@@ -961,39 +1112,54 @@
   }
 
   void test_extraPositionalArguments() {
-    Source source = addSource(EngineTestCase.createSource(["f() {}", "main() {", "  f(0, 1, '2');", "}"]));
+    Source source = addSource(r'''
+f() {}
+main() {
+  f(0, 1, '2');
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.EXTRA_POSITIONAL_ARGUMENTS]);
     verify([source]);
   }
 
   void test_extraPositionalArguments_functionExpression() {
-    Source source = addSource(EngineTestCase.createSource(["main() {", "  (int x) {} (0, 1);", "}"]));
+    Source source = addSource(r'''
+main() {
+  (int x) {} (0, 1);
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.EXTRA_POSITIONAL_ARGUMENTS]);
     verify([source]);
   }
 
   void test_fieldInitializedInInitializerAndDeclaration_final() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  final int x = 0;",
-        "  A() : x = 1 {}",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  final int x = 0;
+  A() : x = 1 {}
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION]);
     verify([source]);
   }
 
   void test_fieldInitializerNotAssignable() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  int x;", "  A() : x = '';", "}"]));
+    Source source = addSource(r'''
+class A {
+  int x;
+  A() : x = '';
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.FIELD_INITIALIZER_NOT_ASSIGNABLE]);
     verify([source]);
   }
 
   void test_fieldInitializingFormalNotAssignable() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  int x;", "  A(String this.x) {}", "}"]));
+    Source source = addSource(r'''
+class A {
+  int x;
+  A(String this.x) {}
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE]);
     verify([source]);
@@ -1009,88 +1175,111 @@
    * the broader code
    */
   void test_finalInitializedInDeclarationAndConstructor_initializers() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  final x = 0;", "  A() : x = 0 {}", "}"]));
+    Source source = addSource(r'''
+class A {
+  final x = 0;
+  A() : x = 0 {}
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION]);
     verify([source]);
   }
 
   void test_finalInitializedInDeclarationAndConstructor_initializingFormal() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  final x = 0;", "  A(this.x) {}", "}"]));
+    Source source = addSource(r'''
+class A {
+  final x = 0;
+  A(this.x) {}
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR]);
     verify([source]);
   }
 
   void test_finalNotInitialized_inConstructor() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  final int x;", "  A() {}", "}"]));
+    Source source = addSource(r'''
+class A {
+  final int x;
+  A() {}
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.FINAL_NOT_INITIALIZED]);
     verify([source]);
   }
 
   void test_finalNotInitialized_instanceField_final() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  final F;", "}"]));
+    Source source = addSource(r'''
+class A {
+  final F;
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.FINAL_NOT_INITIALIZED]);
     verify([source]);
   }
 
   void test_finalNotInitialized_instanceField_final_static() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  static final F;", "}"]));
+    Source source = addSource(r'''
+class A {
+  static final F;
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.FINAL_NOT_INITIALIZED]);
     verify([source]);
   }
 
   void test_finalNotInitialized_library_final() {
-    Source source = addSource(EngineTestCase.createSource(["final F;"]));
+    Source source = addSource("final F;");
     resolve(source);
     assertErrors(source, [StaticWarningCode.FINAL_NOT_INITIALIZED]);
     verify([source]);
   }
 
   void test_finalNotInitialized_local_final() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  final int x;", "}"]));
+    Source source = addSource(r'''
+f() {
+  final int x;
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.FINAL_NOT_INITIALIZED]);
     verify([source]);
   }
 
   void test_functionWithoutCall_direct() {
-    Source source = addSource(EngineTestCase.createSource(["class A implements Function {", "}"]));
+    Source source = addSource(r'''
+class A implements Function {
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.FUNCTION_WITHOUT_CALL]);
     verify([source]);
   }
 
   void test_functionWithoutCall_indirect_extends() {
-    Source source = addSource(EngineTestCase.createSource([
-        "abstract class A implements Function {",
-        "}",
-        "class B extends A {",
-        "}"]));
+    Source source = addSource(r'''
+abstract class A implements Function {
+}
+class B extends A {
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.FUNCTION_WITHOUT_CALL]);
     verify([source]);
   }
 
   void test_functionWithoutCall_indirect_implements() {
-    Source source = addSource(EngineTestCase.createSource([
-        "abstract class A implements Function {",
-        "}",
-        "class B implements A {",
-        "}"]));
+    Source source = addSource(r'''
+abstract class A implements Function {
+}
+class B implements A {
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.FUNCTION_WITHOUT_CALL]);
     verify([source]);
   }
 
   void test_importDuplicatedLibraryName() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library test;",
-        "import 'lib1.dart';",
-        "import 'lib2.dart';"]));
+    Source source = addSource(r'''
+library test;
+import 'lib1.dart';
+import 'lib2.dart';''');
     addNamedSource("/lib1.dart", "library lib;");
     addNamedSource("/lib2.dart", "library lib;");
     resolve(source);
@@ -1103,163 +1292,165 @@
 
   void test_importOfNonLibrary() {
     resolveWithAndWithoutExperimental(<String> [
-        EngineTestCase.createSource(["part of lib;", "class A {}"]),
-        EngineTestCase.createSource([
-        "library lib;",
-        "import 'lib1.dart' deferred as p;",
-        "var a = new p.A();"])], <ErrorCode> [
+        r'''
+part of lib;
+class A {}''',
+        r'''
+library lib;
+import 'lib1.dart' deferred as p;
+var a = new p.A();'''], <ErrorCode> [
         CompileTimeErrorCode.IMPORT_OF_NON_LIBRARY,
         ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [StaticWarningCode.IMPORT_OF_NON_LIBRARY]);
   }
 
   void test_inconsistentMethodInheritanceGetterAndMethod() {
-    Source source = addSource(EngineTestCase.createSource([
-        "abstract class A {",
-        "  int x();",
-        "}",
-        "abstract class B {",
-        "  int get x;",
-        "}",
-        "class C implements A, B {",
-        "}"]));
+    Source source = addSource(r'''
+abstract class A {
+  int x();
+}
+abstract class B {
+  int get x;
+}
+class C implements A, B {
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD]);
     verify([source]);
   }
 
   void test_instanceMethodNameCollidesWithSuperclassStatic_field() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  static var n;",
-        "}",
-        "class B extends A {",
-        "  void n() {}",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  static var n;
+}
+class B extends A {
+  void n() {}
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC]);
     verify([source]);
   }
 
   void test_instanceMethodNameCollidesWithSuperclassStatic_field2() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  static var n;",
-        "}",
-        "class B extends A {",
-        "}",
-        "class C extends B {",
-        "  void n() {}",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  static var n;
+}
+class B extends A {
+}
+class C extends B {
+  void n() {}
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC]);
     verify([source]);
   }
 
   void test_instanceMethodNameCollidesWithSuperclassStatic_getter() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  static get n {return 0;}",
-        "}",
-        "class B extends A {",
-        "  void n() {}",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  static get n {return 0;}
+}
+class B extends A {
+  void n() {}
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC]);
     verify([source]);
   }
 
   void test_instanceMethodNameCollidesWithSuperclassStatic_getter2() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  static get n {return 0;}",
-        "}",
-        "class B extends A {",
-        "}",
-        "class C extends B {",
-        "  void n() {}",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  static get n {return 0;}
+}
+class B extends A {
+}
+class C extends B {
+  void n() {}
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC]);
     verify([source]);
   }
 
   void test_instanceMethodNameCollidesWithSuperclassStatic_method() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  static n () {}",
-        "}",
-        "class B extends A {",
-        "  void n() {}",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  static n () {}
+}
+class B extends A {
+  void n() {}
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC]);
     verify([source]);
   }
 
   void test_instanceMethodNameCollidesWithSuperclassStatic_method2() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  static n () {}",
-        "}",
-        "class B extends A {",
-        "}",
-        "class C extends B {",
-        "  void n() {}",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  static n () {}
+}
+class B extends A {
+}
+class C extends B {
+  void n() {}
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC]);
     verify([source]);
   }
 
   void test_instanceMethodNameCollidesWithSuperclassStatic_setter() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  static set n(int x) {}",
-        "}",
-        "class B extends A {",
-        "  void n() {}",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  static set n(int x) {}
+}
+class B extends A {
+  void n() {}
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC]);
     verify([source]);
   }
 
   void test_instanceMethodNameCollidesWithSuperclassStatic_setter2() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  static set n(int x) {}",
-        "}",
-        "class B extends A {",
-        "}",
-        "class C extends B {",
-        "  void n() {}",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  static set n(int x) {}
+}
+class B extends A {
+}
+class C extends B {
+  void n() {}
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC]);
     verify([source]);
   }
 
   void test_invalidGetterOverrideReturnType() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  int get g { return 0; }",
-        "}",
-        "class B extends A {",
-        "  String get g { return 'a'; }",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  int get g { return 0; }
+}
+class B extends A {
+  String get g { return 'a'; }
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.INVALID_GETTER_OVERRIDE_RETURN_TYPE]);
     verify([source]);
   }
 
   void test_invalidGetterOverrideReturnType_implicit() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  String f;",
-        "}",
-        "class B extends A {",
-        "  int f;",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  String f;
+}
+class B extends A {
+  int f;
+}''');
     resolve(source);
     assertErrors(source, [
         StaticWarningCode.INVALID_GETTER_OVERRIDE_RETURN_TYPE,
@@ -1269,105 +1460,105 @@
 
   void test_invalidGetterOverrideReturnType_twoInterfaces() {
     // test from language/override_inheritance_field_test_11.dart
-    Source source = addSource(EngineTestCase.createSource([
-        "abstract class I {",
-        "  int get getter => null;",
-        "}",
-        "abstract class J {",
-        "  num get getter => null;",
-        "}",
-        "abstract class A implements I, J {}",
-        "class B extends A {",
-        "  String get getter => null;",
-        "}"]));
+    Source source = addSource(r'''
+abstract class I {
+  int get getter => null;
+}
+abstract class J {
+  num get getter => null;
+}
+abstract class A implements I, J {}
+class B extends A {
+  String get getter => null;
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.INVALID_GETTER_OVERRIDE_RETURN_TYPE]);
     verify([source]);
   }
 
   void test_invalidGetterOverrideReturnType_twoInterfaces_conflicting() {
-    Source source = addSource(EngineTestCase.createSource([
-        "abstract class I<U> {",
-        "  U get g => null;",
-        "}",
-        "abstract class J<V> {",
-        "  V get g => null;",
-        "}",
-        "class B implements I<int>, J<String> {",
-        "  double get g => null;",
-        "}"]));
+    Source source = addSource(r'''
+abstract class I<U> {
+  U get g => null;
+}
+abstract class J<V> {
+  V get g => null;
+}
+class B implements I<int>, J<String> {
+  double get g => null;
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.INVALID_GETTER_OVERRIDE_RETURN_TYPE]);
     verify([source]);
   }
 
   void test_invalidMethodOverrideNamedParamType() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  m({int a}) {}",
-        "}",
-        "class B implements A {",
-        "  m({String a}) {}",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  m({int a}) {}
+}
+class B implements A {
+  m({String a}) {}
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE]);
     verify([source]);
   }
 
   void test_invalidMethodOverrideNormalParamType_interface() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  m(int a) {}",
-        "}",
-        "class B implements A {",
-        "  m(String a) {}",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  m(int a) {}
+}
+class B implements A {
+  m(String a) {}
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE]);
     verify([source]);
   }
 
   void test_invalidMethodOverrideNormalParamType_superclass() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  m(int a) {}",
-        "}",
-        "class B extends A {",
-        "  m(String a) {}",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  m(int a) {}
+}
+class B extends A {
+  m(String a) {}
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE]);
     verify([source]);
   }
 
   void test_invalidMethodOverrideNormalParamType_superclass_interface() {
-    Source source = addSource(EngineTestCase.createSource([
-        "abstract class I<U> {",
-        "  m(U u) => null;",
-        "}",
-        "abstract class J<V> {",
-        "  m(V v) => null;",
-        "}",
-        "class B extends I<int> implements J<String> {",
-        "  m(double d) {}",
-        "}"]));
+    Source source = addSource(r'''
+abstract class I<U> {
+  m(U u) => null;
+}
+abstract class J<V> {
+  m(V v) => null;
+}
+class B extends I<int> implements J<String> {
+  m(double d) {}
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE]);
     verify([source]);
   }
 
   void test_invalidMethodOverrideNormalParamType_twoInterfaces() {
-    Source source = addSource(EngineTestCase.createSource([
-        "abstract class I {",
-        "  m(int n);",
-        "}",
-        "abstract class J {",
-        "  m(num n);",
-        "}",
-        "abstract class A implements I, J {}",
-        "class B extends A {",
-        "  m(String n) {}",
-        "}"]));
+    Source source = addSource(r'''
+abstract class I {
+  m(int n);
+}
+abstract class J {
+  m(num n);
+}
+abstract class A implements I, J {}
+class B extends A {
+  m(String n) {}
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE]);
     verify([source]);
@@ -1375,279 +1566,279 @@
 
   void test_invalidMethodOverrideNormalParamType_twoInterfaces_conflicting() {
     // language/override_inheritance_generic_test/08
-    Source source = addSource(EngineTestCase.createSource([
-        "abstract class I<U> {",
-        "  m(U u) => null;",
-        "}",
-        "abstract class J<V> {",
-        "  m(V v) => null;",
-        "}",
-        "class B implements I<int>, J<String> {",
-        "  m(double d) {}",
-        "}"]));
+    Source source = addSource(r'''
+abstract class I<U> {
+  m(U u) => null;
+}
+abstract class J<V> {
+  m(V v) => null;
+}
+class B implements I<int>, J<String> {
+  m(double d) {}
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE]);
     verify([source]);
   }
 
   void test_invalidMethodOverrideOptionalParamType() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  m([int a]) {}",
-        "}",
-        "class B implements A {",
-        "  m([String a]) {}",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  m([int a]) {}
+}
+class B implements A {
+  m([String a]) {}
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE]);
     verify([source]);
   }
 
   void test_invalidMethodOverrideOptionalParamType_twoInterfaces() {
-    Source source = addSource(EngineTestCase.createSource([
-        "abstract class I {",
-        "  m([int n]);",
-        "}",
-        "abstract class J {",
-        "  m([num n]);",
-        "}",
-        "abstract class A implements I, J {}",
-        "class B extends A {",
-        "  m([String n]) {}",
-        "}"]));
+    Source source = addSource(r'''
+abstract class I {
+  m([int n]);
+}
+abstract class J {
+  m([num n]);
+}
+abstract class A implements I, J {}
+class B extends A {
+  m([String n]) {}
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE]);
     verify([source]);
   }
 
   void test_invalidMethodOverrideReturnType_interface() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  int m() { return 0; }",
-        "}",
-        "class B implements A {",
-        "  String m() { return 'a'; }",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  int m() { return 0; }
+}
+class B implements A {
+  String m() { return 'a'; }
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.INVALID_METHOD_OVERRIDE_RETURN_TYPE]);
     verify([source]);
   }
 
   void test_invalidMethodOverrideReturnType_interface_grandparent() {
-    Source source = addSource(EngineTestCase.createSource([
-        "abstract class A {",
-        "  int m();",
-        "}",
-        "abstract class B implements A {",
-        "}",
-        "class C implements B {",
-        "  String m() { return 'a'; }",
-        "}"]));
+    Source source = addSource(r'''
+abstract class A {
+  int m();
+}
+abstract class B implements A {
+}
+class C implements B {
+  String m() { return 'a'; }
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.INVALID_METHOD_OVERRIDE_RETURN_TYPE]);
     verify([source]);
   }
 
   void test_invalidMethodOverrideReturnType_mixin() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  int m() { return 0; }",
-        "}",
-        "class B extends Object with A {",
-        "  String m() { return 'a'; }",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  int m() { return 0; }
+}
+class B extends Object with A {
+  String m() { return 'a'; }
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.INVALID_METHOD_OVERRIDE_RETURN_TYPE]);
     verify([source]);
   }
 
   void test_invalidMethodOverrideReturnType_superclass() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  int m() { return 0; }",
-        "}",
-        "class B extends A {",
-        "  String m() { return 'a'; }",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  int m() { return 0; }
+}
+class B extends A {
+  String m() { return 'a'; }
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.INVALID_METHOD_OVERRIDE_RETURN_TYPE]);
     verify([source]);
   }
 
   void test_invalidMethodOverrideReturnType_superclass_grandparent() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  int m() { return 0; }",
-        "}",
-        "class B extends A {",
-        "}",
-        "class C extends B {",
-        "  String m() { return 'a'; }",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  int m() { return 0; }
+}
+class B extends A {
+}
+class C extends B {
+  String m() { return 'a'; }
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.INVALID_METHOD_OVERRIDE_RETURN_TYPE]);
     verify([source]);
   }
 
   void test_invalidMethodOverrideReturnType_twoInterfaces() {
-    Source source = addSource(EngineTestCase.createSource([
-        "abstract class I {",
-        "  int m();",
-        "}",
-        "abstract class J {",
-        "  num m();",
-        "}",
-        "abstract class A implements I, J {}",
-        "class B extends A {",
-        "  String m() => '';",
-        "}"]));
+    Source source = addSource(r'''
+abstract class I {
+  int m();
+}
+abstract class J {
+  num m();
+}
+abstract class A implements I, J {}
+class B extends A {
+  String m() => '';
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.INVALID_METHOD_OVERRIDE_RETURN_TYPE]);
     verify([source]);
   }
 
   void test_invalidMethodOverrideReturnType_void() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  int m() { return 0; }",
-        "}",
-        "class B extends A {",
-        "  void m() {}",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  int m() { return 0; }
+}
+class B extends A {
+  void m() {}
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.INVALID_METHOD_OVERRIDE_RETURN_TYPE]);
     verify([source]);
   }
 
   void test_invalidOverrideDifferentDefaultValues_named() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  m({int p : 0}) {}",
-        "}",
-        "class B extends A {",
-        "  m({int p : 1}) {}",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  m({int p : 0}) {}
+}
+class B extends A {
+  m({int p : 1}) {}
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_NAMED]);
     verify([source]);
   }
 
   void test_invalidOverrideDifferentDefaultValues_positional() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  m([int p = 0]) {}",
-        "}",
-        "class B extends A {",
-        "  m([int p = 1]) {}",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  m([int p = 0]) {}
+}
+class B extends A {
+  m([int p = 1]) {}
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_POSITIONAL]);
     verify([source]);
   }
 
   void test_invalidOverrideNamed_fewerNamedParameters() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  m({a, b}) {}",
-        "}",
-        "class B extends A {",
-        "  m({a}) {}",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  m({a, b}) {}
+}
+class B extends A {
+  m({a}) {}
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.INVALID_OVERRIDE_NAMED]);
     verify([source]);
   }
 
   void test_invalidOverrideNamed_missingNamedParameter() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  m({a, b}) {}",
-        "}",
-        "class B extends A {",
-        "  m({a, c}) {}",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  m({a, b}) {}
+}
+class B extends A {
+  m({a, c}) {}
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.INVALID_OVERRIDE_NAMED]);
     verify([source]);
   }
 
   void test_invalidOverridePositional_optional() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  m([a, b]) {}",
-        "}",
-        "class B extends A {",
-        "  m([a]) {}",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  m([a, b]) {}
+}
+class B extends A {
+  m([a]) {}
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.INVALID_OVERRIDE_POSITIONAL]);
     verify([source]);
   }
 
   void test_invalidOverridePositional_optionalAndRequired() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  m(a, b, [c, d]) {}",
-        "}",
-        "class B extends A {",
-        "  m(a, b, [c]) {}",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  m(a, b, [c, d]) {}
+}
+class B extends A {
+  m(a, b, [c]) {}
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.INVALID_OVERRIDE_POSITIONAL]);
     verify([source]);
   }
 
   void test_invalidOverridePositional_optionalAndRequired2() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  m(a, b, [c, d]) {}",
-        "}",
-        "class B extends A {",
-        "  m(a, [c, d]) {}",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  m(a, b, [c, d]) {}
+}
+class B extends A {
+  m(a, [c, d]) {}
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.INVALID_OVERRIDE_POSITIONAL]);
     verify([source]);
   }
 
   void test_invalidOverrideRequired() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  m(a) {}",
-        "}",
-        "class B extends A {",
-        "  m(a, b) {}",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  m(a) {}
+}
+class B extends A {
+  m(a, b) {}
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.INVALID_OVERRIDE_REQUIRED]);
     verify([source]);
   }
 
   void test_invalidSetterOverrideNormalParamType() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  void set s(int v) {}",
-        "}",
-        "class B extends A {",
-        "  void set s(String v) {}",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  void set s(int v) {}
+}
+class B extends A {
+  void set s(String v) {}
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE]);
     verify([source]);
   }
 
   void test_invalidSetterOverrideNormalParamType_superclass_interface() {
-    Source source = addSource(EngineTestCase.createSource([
-        "abstract class I {",
-        "  set setter14(int _) => null;",
-        "}",
-        "abstract class J {",
-        "  set setter14(num _) => null;",
-        "}",
-        "abstract class A extends I implements J {}",
-        "class B extends A {",
-        "  set setter14(String _) => null;",
-        "}"]));
+    Source source = addSource(r'''
+abstract class I {
+  set setter14(int _) => null;
+}
+abstract class J {
+  set setter14(num _) => null;
+}
+abstract class A extends I implements J {}
+class B extends A {
+  set setter14(String _) => null;
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE]);
     verify([source]);
@@ -1655,115 +1846,117 @@
 
   void test_invalidSetterOverrideNormalParamType_twoInterfaces() {
     // test from language/override_inheritance_field_test_34.dart
-    Source source = addSource(EngineTestCase.createSource([
-        "abstract class I {",
-        "  set setter14(int _) => null;",
-        "}",
-        "abstract class J {",
-        "  set setter14(num _) => null;",
-        "}",
-        "abstract class A implements I, J {}",
-        "class B extends A {",
-        "  set setter14(String _) => null;",
-        "}"]));
+    Source source = addSource(r'''
+abstract class I {
+  set setter14(int _) => null;
+}
+abstract class J {
+  set setter14(num _) => null;
+}
+abstract class A implements I, J {}
+class B extends A {
+  set setter14(String _) => null;
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE]);
     verify([source]);
   }
 
   void test_invalidSetterOverrideNormalParamType_twoInterfaces_conflicting() {
-    Source source = addSource(EngineTestCase.createSource([
-        "abstract class I<U> {",
-        "  set s(U u) {}",
-        "}",
-        "abstract class J<V> {",
-        "  set s(V v) {}",
-        "}",
-        "class B implements I<int>, J<String> {",
-        "  set s(double d) {}",
-        "}"]));
+    Source source = addSource(r'''
+abstract class I<U> {
+  set s(U u) {}
+}
+abstract class J<V> {
+  set s(V v) {}
+}
+class B implements I<int>, J<String> {
+  set s(double d) {}
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE]);
     verify([source]);
   }
 
   void test_listElementTypeNotAssignable() {
-    Source source = addSource(EngineTestCase.createSource(["var v = <String> [42];"]));
+    Source source = addSource("var v = <String> [42];");
     resolve(source);
     assertErrors(source, [StaticWarningCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE]);
     verify([source]);
   }
 
   void test_mapKeyTypeNotAssignable() {
-    Source source = addSource(EngineTestCase.createSource(["var v = <String, int > {1 : 2};"]));
+    Source source = addSource("var v = <String, int > {1 : 2};");
     resolve(source);
     assertErrors(source, [StaticWarningCode.MAP_KEY_TYPE_NOT_ASSIGNABLE]);
     verify([source]);
   }
 
   void test_mapValueTypeNotAssignable() {
-    Source source = addSource(EngineTestCase.createSource(["var v = <String, String> {'a' : 2};"]));
+    Source source = addSource("var v = <String, String> {'a' : 2};");
     resolve(source);
     assertErrors(source, [StaticWarningCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE]);
     verify([source]);
   }
 
   void test_mismatchedAccessorTypes_class() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  int get g { return 0; }",
-        "  set g(String v) {}",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  int get g { return 0; }
+  set g(String v) {}
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES]);
     verify([source]);
   }
 
   void test_mismatchedAccessorTypes_getterAndSuperSetter() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  int get g { return 0; }",
-        "}",
-        "class B extends A {",
-        "  set g(String v) {}",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  int get g { return 0; }
+}
+class B extends A {
+  set g(String v) {}
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE]);
     verify([source]);
   }
 
   void test_mismatchedAccessorTypes_setterAndSuperGetter() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  set g(int v) {}",
-        "}",
-        "class B extends A {",
-        "  String get g { return ''; }",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  set g(int v) {}
+}
+class B extends A {
+  String get g { return ''; }
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE]);
     verify([source]);
   }
 
   void test_mismatchedAccessorTypes_topLevel() {
-    Source source = addSource(EngineTestCase.createSource(["int get g { return 0; }", "set g(String v) {}"]));
+    Source source = addSource(r'''
+int get g { return 0; }
+set g(String v) {}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES]);
     verify([source]);
   }
 
   void test_mixedReturnTypes_localFunction() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class C {",
-        "  m(int x) {",
-        "    return (int y) {",
-        "      if (y < 0) {",
-        "        return;",
-        "      }",
-        "      return 0;",
-        "    };",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class C {
+  m(int x) {
+    return (int y) {
+      if (y < 0) {
+        return;
+      }
+      return 0;
+    };
+  }
+}''');
     resolve(source);
     assertErrors(source, [
         StaticWarningCode.MIXED_RETURN_TYPES,
@@ -1772,15 +1965,15 @@
   }
 
   void test_mixedReturnTypes_method() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class C {",
-        "  m(int x) {",
-        "    if (x < 0) {",
-        "      return;",
-        "    }",
-        "    return 0;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class C {
+  m(int x) {
+    if (x < 0) {
+      return;
+    }
+    return 0;
+  }
+}''');
     resolve(source);
     assertErrors(source, [
         StaticWarningCode.MIXED_RETURN_TYPES,
@@ -1789,13 +1982,13 @@
   }
 
   void test_mixedReturnTypes_topLevelFunction() {
-    Source source = addSource(EngineTestCase.createSource([
-        "f(int x) {",
-        "  if (x < 0) {",
-        "    return;",
-        "  }",
-        "  return 0;",
-        "}"]));
+    Source source = addSource(r'''
+f(int x) {
+  if (x < 0) {
+    return;
+  }
+  return 0;
+}''');
     resolve(source);
     assertErrors(source, [
         StaticWarningCode.MIXED_RETURN_TYPES,
@@ -1804,49 +1997,55 @@
   }
 
   void test_newWithAbstractClass() {
-    Source source = addSource(EngineTestCase.createSource([
-        "abstract class A {}",
-        "void f() {",
-        "  A a = new A();",
-        "}"]));
+    Source source = addSource(r'''
+abstract class A {}
+void f() {
+  A a = new A();
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.NEW_WITH_ABSTRACT_CLASS]);
     verify([source]);
   }
 
   void test_newWithInvalidTypeParameters() {
-    Source source = addSource(EngineTestCase.createSource(["class A {}", "f() { return new A<A>(); }"]));
+    Source source = addSource(r'''
+class A {}
+f() { return new A<A>(); }''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.NEW_WITH_INVALID_TYPE_PARAMETERS]);
     verify([source]);
   }
 
   void test_newWithInvalidTypeParameters_tooFew() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class C<K, V> {}",
-        "f(p) {",
-        "  return new C<A>();",
-        "}"]));
+    Source source = addSource(r'''
+class A {}
+class C<K, V> {}
+f(p) {
+  return new C<A>();
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.NEW_WITH_INVALID_TYPE_PARAMETERS]);
     verify([source]);
   }
 
   void test_newWithInvalidTypeParameters_tooMany() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {}",
-        "class C<E> {}",
-        "f(p) {",
-        "  return new C<A, A>();",
-        "}"]));
+    Source source = addSource(r'''
+class A {}
+class C<E> {}
+f(p) {
+  return new C<A, A>();
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.NEW_WITH_INVALID_TYPE_PARAMETERS]);
     verify([source]);
   }
 
   void test_newWithNonType() {
-    Source source = addSource(EngineTestCase.createSource(["var A = 0;", "void f() {", "  var a = new A();", "}"]));
+    Source source = addSource(r'''
+var A = 0;
+void f() {
+  var a = new A();
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.NEW_WITH_NON_TYPE]);
     verify([source]);
@@ -1854,12 +2053,12 @@
 
   void test_newWithNonType_fromLibrary() {
     Source source1 = addNamedSource("lib.dart", "class B {}");
-    Source source2 = addNamedSource("lib2.dart", EngineTestCase.createSource([
-        "import 'lib.dart' as lib;",
-        "void f() {",
-        "  var a = new lib.A();",
-        "}",
-        "lib.B b;"]));
+    Source source2 = addNamedSource("lib2.dart", r'''
+import 'lib.dart' as lib;
+void f() {
+  var a = new lib.A();
+}
+lib.B b;''');
     resolve(source1);
     resolve(source2);
     assertErrors(source2, [StaticWarningCode.NEW_WITH_NON_TYPE]);
@@ -1867,57 +2066,57 @@
   }
 
   void test_newWithUndefinedConstructor() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  A() {}",
-        "}",
-        "f() {",
-        "  new A.name();",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  A() {}
+}
+f() {
+  new A.name();
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.NEW_WITH_UNDEFINED_CONSTRUCTOR]);
     // no verify(), 'name' is not resolved
   }
 
   void test_newWithUndefinedConstructorDefault() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  A.name() {}",
-        "}",
-        "f() {",
-        "  new A();",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  A.name() {}
+}
+f() {
+  new A();
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.NEW_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT]);
     verify([source]);
   }
 
   void test_nonAbstractClassInheritsAbstractMemberFivePlus() {
-    Source source = addSource(EngineTestCase.createSource([
-        "abstract class A {",
-        "  m();",
-        "  n();",
-        "  o();",
-        "  p();",
-        "  q();",
-        "}",
-        "class C extends A {",
-        "}"]));
+    Source source = addSource(r'''
+abstract class A {
+  m();
+  n();
+  o();
+  p();
+  q();
+}
+class C extends A {
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS]);
     verify([source]);
   }
 
   void test_nonAbstractClassInheritsAbstractMemberFour() {
-    Source source = addSource(EngineTestCase.createSource([
-        "abstract class A {",
-        "  m();",
-        "  n();",
-        "  o();",
-        "  p();",
-        "}",
-        "class C extends A {",
-        "}"]));
+    Source source = addSource(r'''
+abstract class A {
+  m();
+  n();
+  o();
+  p();
+}
+class C extends A {
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR]);
     verify([source]);
@@ -1925,13 +2124,13 @@
 
   void test_nonAbstractClassInheritsAbstractMemberOne_classTypeAlias_interface() {
     // 15979
-    Source source = addSource(EngineTestCase.createSource([
-        "abstract class M {}",
-        "abstract class A {}",
-        "abstract class I {",
-        "  m();",
-        "}",
-        "class B = A with M implements I;"]));
+    Source source = addSource(r'''
+abstract class M {}
+abstract class A {}
+abstract class I {
+  m();
+}
+class B = A with M implements I;''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE]);
     verify([source]);
@@ -1939,12 +2138,12 @@
 
   void test_nonAbstractClassInheritsAbstractMemberOne_classTypeAlias_mixin() {
     // 15979
-    Source source = addSource(EngineTestCase.createSource([
-        "abstract class M {",
-        "  m();",
-        "}",
-        "abstract class A {}",
-        "class B = A with M;"]));
+    Source source = addSource(r'''
+abstract class M {
+  m();
+}
+abstract class A {}
+class B = A with M;''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE]);
     verify([source]);
@@ -1952,12 +2151,12 @@
 
   void test_nonAbstractClassInheritsAbstractMemberOne_classTypeAlias_superclass() {
     // 15979
-    Source source = addSource(EngineTestCase.createSource([
-        "class M {}",
-        "abstract class A {",
-        "  m();",
-        "}",
-        "class B = A with M;"]));
+    Source source = addSource(r'''
+class M {}
+abstract class A {
+  m();
+}
+class B = A with M;''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE]);
     verify([source]);
@@ -1965,62 +2164,62 @@
 
   void test_nonAbstractClassInheritsAbstractMemberOne_ensureCorrectFunctionSubtypeIsUsedInImplementation() {
     // 15028
-    Source source = addSource(EngineTestCase.createSource([
-        "class C {",
-        "  foo(int x) => x;",
-        "}",
-        "abstract class D {",
-        "  foo(x, [y]);",
-        "}",
-        "class E extends C implements D {}"]));
+    Source source = addSource(r'''
+class C {
+  foo(int x) => x;
+}
+abstract class D {
+  foo(x, [y]);
+}
+class E extends C implements D {}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE]);
     verify([source]);
   }
 
   void test_nonAbstractClassInheritsAbstractMemberOne_getter_fromInterface() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class I {",
-        "  int get g {return 1;}",
-        "}",
-        "class C implements I {",
-        "}"]));
+    Source source = addSource(r'''
+class I {
+  int get g {return 1;}
+}
+class C implements I {
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE]);
     verify([source]);
   }
 
   void test_nonAbstractClassInheritsAbstractMemberOne_getter_fromSuperclass() {
-    Source source = addSource(EngineTestCase.createSource([
-        "abstract class A {",
-        "  int get g;",
-        "}",
-        "class C extends A {",
-        "}"]));
+    Source source = addSource(r'''
+abstract class A {
+  int get g;
+}
+class C extends A {
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE]);
     verify([source]);
   }
 
   void test_nonAbstractClassInheritsAbstractMemberOne_method_fromInterface() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class I {",
-        "  m(p) {}",
-        "}",
-        "class C implements I {",
-        "}"]));
+    Source source = addSource(r'''
+class I {
+  m(p) {}
+}
+class C implements I {
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE]);
     verify([source]);
   }
 
   void test_nonAbstractClassInheritsAbstractMemberOne_method_fromSuperclass() {
-    Source source = addSource(EngineTestCase.createSource([
-        "abstract class A {",
-        "  m(p);",
-        "}",
-        "class C extends A {",
-        "}"]));
+    Source source = addSource(r'''
+abstract class A {
+  m(p);
+}
+class C extends A {
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE]);
     verify([source]);
@@ -2028,15 +2227,15 @@
 
   void test_nonAbstractClassInheritsAbstractMemberOne_method_optionalParamCount() {
     // 7640
-    Source source = addSource(EngineTestCase.createSource([
-        "abstract class A {",
-        "  int x(int a);",
-        "}",
-        "abstract class B {",
-        "  int x(int a, [int b]);",
-        "}",
-        "class C implements A, B {",
-        "}"]));
+    Source source = addSource(r'''
+abstract class A {
+  int x(int a);
+}
+abstract class B {
+  int x(int a, [int b]);
+}
+class C implements A, B {
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE]);
     verify([source]);
@@ -2044,70 +2243,70 @@
 
   void test_nonAbstractClassInheritsAbstractMemberOne_mixinInherits_getter() {
     // 15001
-    Source source = addSource(EngineTestCase.createSource([
-        "abstract class A { get g1; get g2; }",
-        "abstract class B implements A { get g1 => 1; }",
-        "class C extends Object with B {}"]));
+    Source source = addSource(r'''
+abstract class A { get g1; get g2; }
+abstract class B implements A { get g1 => 1; }
+class C extends Object with B {}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE]);
   }
 
   void test_nonAbstractClassInheritsAbstractMemberOne_mixinInherits_method() {
     // 15001
-    Source source = addSource(EngineTestCase.createSource([
-        "abstract class A { m1(); m2(); }",
-        "abstract class B implements A { m1() => 1; }",
-        "class C extends Object with B {}"]));
+    Source source = addSource(r'''
+abstract class A { m1(); m2(); }
+abstract class B implements A { m1() => 1; }
+class C extends Object with B {}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE]);
   }
 
   void test_nonAbstractClassInheritsAbstractMemberOne_mixinInherits_setter() {
     // 15001
-    Source source = addSource(EngineTestCase.createSource([
-        "abstract class A { set s1(v); set s2(v); }",
-        "abstract class B implements A { set s1(v) {} }",
-        "class C extends Object with B {}"]));
+    Source source = addSource(r'''
+abstract class A { set s1(v); set s2(v); }
+abstract class B implements A { set s1(v) {} }
+class C extends Object with B {}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE]);
   }
 
   void test_nonAbstractClassInheritsAbstractMemberOne_setter_and_implicitSetter() {
     // test from language/override_inheritance_abstract_test_14.dart
-    Source source = addSource(EngineTestCase.createSource([
-        "abstract class A {",
-        "  set field(_);",
-        "}",
-        "abstract class I {",
-        "  var field;",
-        "}",
-        "class B extends A implements I {",
-        "  get field => 0;",
-        "}"]));
+    Source source = addSource(r'''
+abstract class A {
+  set field(_);
+}
+abstract class I {
+  var field;
+}
+class B extends A implements I {
+  get field => 0;
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE]);
     verify([source]);
   }
 
   void test_nonAbstractClassInheritsAbstractMemberOne_setter_fromInterface() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class I {",
-        "  set s(int i) {}",
-        "}",
-        "class C implements I {",
-        "}"]));
+    Source source = addSource(r'''
+class I {
+  set s(int i) {}
+}
+class C implements I {
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE]);
     verify([source]);
   }
 
   void test_nonAbstractClassInheritsAbstractMemberOne_setter_fromSuperclass() {
-    Source source = addSource(EngineTestCase.createSource([
-        "abstract class A {",
-        "  set s(int i);",
-        "}",
-        "class C extends A {",
-        "}"]));
+    Source source = addSource(r'''
+abstract class A {
+  set s(int i);
+}
+class C extends A {
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE]);
     verify([source]);
@@ -2115,15 +2314,15 @@
 
   void test_nonAbstractClassInheritsAbstractMemberOne_superclasses_interface() {
     // bug 11154
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  get a => 'a';",
-        "}",
-        "abstract class B implements A {",
-        "  get b => 'b';",
-        "}",
-        "class C extends B {",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  get a => 'a';
+}
+abstract class B implements A {
+  get b => 'b';
+}
+class C extends B {
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE]);
     verify([source]);
@@ -2131,13 +2330,13 @@
 
   void test_nonAbstractClassInheritsAbstractMemberOne_variable_fromInterface_missingGetter() {
     // 16133
-    Source source = addSource(EngineTestCase.createSource([
-        "class I {",
-        "  var v;",
-        "}",
-        "class C implements I {",
-        "  set v(_) {}",
-        "}"]));
+    Source source = addSource(r'''
+class I {
+  var v;
+}
+class C implements I {
+  set v(_) {}
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE]);
     verify([source]);
@@ -2145,40 +2344,40 @@
 
   void test_nonAbstractClassInheritsAbstractMemberOne_variable_fromInterface_missingSetter() {
     // 16133
-    Source source = addSource(EngineTestCase.createSource([
-        "class I {",
-        "  var v;",
-        "}",
-        "class C implements I {",
-        "  get v => 1;",
-        "}"]));
+    Source source = addSource(r'''
+class I {
+  var v;
+}
+class C implements I {
+  get v => 1;
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE]);
     verify([source]);
   }
 
   void test_nonAbstractClassInheritsAbstractMemberThree() {
-    Source source = addSource(EngineTestCase.createSource([
-        "abstract class A {",
-        "  m();",
-        "  n();",
-        "  o();",
-        "}",
-        "class C extends A {",
-        "}"]));
+    Source source = addSource(r'''
+abstract class A {
+  m();
+  n();
+  o();
+}
+class C extends A {
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE]);
     verify([source]);
   }
 
   void test_nonAbstractClassInheritsAbstractMemberTwo() {
-    Source source = addSource(EngineTestCase.createSource([
-        "abstract class A {",
-        "  m();",
-        "  n();",
-        "}",
-        "class C extends A {",
-        "}"]));
+    Source source = addSource(r'''
+abstract class A {
+  m();
+  n();
+}
+class C extends A {
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO]);
     verify([source]);
@@ -2186,187 +2385,215 @@
 
   void test_nonAbstractClassInheritsAbstractMemberTwo_variable_fromInterface_missingBoth() {
     // 16133
-    Source source = addSource(EngineTestCase.createSource([
-        "class I {",
-        "  var v;",
-        "}",
-        "class C implements I {",
-        "}"]));
+    Source source = addSource(r'''
+class I {
+  var v;
+}
+class C implements I {
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO]);
     verify([source]);
   }
 
   void test_nonTypeInCatchClause_noElement() {
-    Source source = addSource(EngineTestCase.createSource(["f() {", "  try {", "  } on T catch (e) {", "  }", "}"]));
+    Source source = addSource(r'''
+f() {
+  try {
+  } on T catch (e) {
+  }
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.NON_TYPE_IN_CATCH_CLAUSE]);
     verify([source]);
   }
 
   void test_nonTypeInCatchClause_notType() {
-    Source source = addSource(EngineTestCase.createSource([
-        "var T = 0;",
-        "f() {",
-        "  try {",
-        "  } on T catch (e) {",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+var T = 0;
+f() {
+  try {
+  } on T catch (e) {
+  }
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.NON_TYPE_IN_CATCH_CLAUSE]);
     verify([source]);
   }
 
   void test_nonVoidReturnForOperator() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  int operator []=(a, b) { return a; }",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  int operator []=(a, b) { return a; }
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.NON_VOID_RETURN_FOR_OPERATOR]);
     verify([source]);
   }
 
   void test_nonVoidReturnForSetter_function() {
-    Source source = addSource(EngineTestCase.createSource(["int set x(int v) {", "  return 42;", "}"]));
+    Source source = addSource(r'''
+int set x(int v) {
+  return 42;
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.NON_VOID_RETURN_FOR_SETTER]);
     verify([source]);
   }
 
   void test_nonVoidReturnForSetter_method() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  int set x(int v) {",
-        "    return 42;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  int set x(int v) {
+    return 42;
+  }
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.NON_VOID_RETURN_FOR_SETTER]);
     verify([source]);
   }
 
   void test_notAType() {
-    Source source = addSource(EngineTestCase.createSource(["f() {}", "main() {", "  f v = null;", "}"]));
+    Source source = addSource(r'''
+f() {}
+main() {
+  f v = null;
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.NOT_A_TYPE]);
     verify([source]);
   }
 
   void test_notEnoughRequiredArguments() {
-    Source source = addSource(EngineTestCase.createSource(["f(int a, String b) {}", "main() {", "  f();", "}"]));
+    Source source = addSource(r'''
+f(int a, String b) {}
+main() {
+  f();
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.NOT_ENOUGH_REQUIRED_ARGUMENTS]);
     verify([source]);
   }
 
   void test_notEnoughRequiredArguments_functionExpression() {
-    Source source = addSource(EngineTestCase.createSource(["main() {", "  (int x) {} ();", "}"]));
+    Source source = addSource(r'''
+main() {
+  (int x) {} ();
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.NOT_ENOUGH_REQUIRED_ARGUMENTS]);
     verify([source]);
   }
 
   void test_notEnoughRequiredArguments_getterReturningFunction() {
-    Source source = addSource(EngineTestCase.createSource([
-        "typedef Getter(self);",
-        "Getter getter = (x) => x;",
-        "main() {",
-        "  getter();",
-        "}"]));
+    Source source = addSource(r'''
+typedef Getter(self);
+Getter getter = (x) => x;
+main() {
+  getter();
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.NOT_ENOUGH_REQUIRED_ARGUMENTS]);
     verify([source]);
   }
 
   void test_partOfDifferentLibrary() {
-    Source source = addSource(EngineTestCase.createSource(["library lib;", "part 'part.dart';"]));
-    addNamedSource("/part.dart", EngineTestCase.createSource(["part of lub;"]));
+    Source source = addSource(r'''
+library lib;
+part 'part.dart';''');
+    addNamedSource("/part.dart", "part of lub;");
     resolve(source);
     assertErrors(source, [StaticWarningCode.PART_OF_DIFFERENT_LIBRARY]);
     verify([source]);
   }
 
   void test_redirectToInvalidFunctionType() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A implements B {",
-        "  A(int p) {}",
-        "}",
-        "class B {",
-        "  factory B() = A;",
-        "}"]));
+    Source source = addSource(r'''
+class A implements B {
+  A(int p) {}
+}
+class B {
+  factory B() = A;
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.REDIRECT_TO_INVALID_FUNCTION_TYPE]);
     verify([source]);
   }
 
   void test_redirectToInvalidReturnType() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  A() {}",
-        "}",
-        "class B {",
-        "  factory B() = A;",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  A() {}
+}
+class B {
+  factory B() = A;
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.REDIRECT_TO_INVALID_RETURN_TYPE]);
     verify([source]);
   }
 
   void test_redirectToMissingConstructor_named() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A implements B{",
-        "  A() {}",
-        "}",
-        "class B {",
-        "  factory B() = A.name;",
-        "}"]));
+    Source source = addSource(r'''
+class A implements B{
+  A() {}
+}
+class B {
+  factory B() = A.name;
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.REDIRECT_TO_MISSING_CONSTRUCTOR]);
   }
 
   void test_redirectToMissingConstructor_unnamed() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A implements B{",
-        "  A.name() {}",
-        "}",
-        "class B {",
-        "  factory B() = A;",
-        "}"]));
+    Source source = addSource(r'''
+class A implements B{
+  A.name() {}
+}
+class B {
+  factory B() = A;
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.REDIRECT_TO_MISSING_CONSTRUCTOR]);
   }
 
   void test_redirectToNonClass_notAType() {
-    Source source = addSource(EngineTestCase.createSource(["class B {", "  int A;", "  factory B() = A;", "}"]));
+    Source source = addSource(r'''
+class B {
+  int A;
+  factory B() = A;
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.REDIRECT_TO_NON_CLASS]);
     verify([source]);
   }
 
   void test_redirectToNonClass_undefinedIdentifier() {
-    Source source = addSource(EngineTestCase.createSource(["class B {", "  factory B() = A;", "}"]));
+    Source source = addSource(r'''
+class B {
+  factory B() = A;
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.REDIRECT_TO_NON_CLASS]);
     verify([source]);
   }
 
   void test_returnWithoutValue_factoryConstructor() {
-    Source source = addSource(EngineTestCase.createSource(["class A { factory A() { return; } }"]));
+    Source source = addSource("class A { factory A() { return; } }");
     resolve(source);
     assertErrors(source, [StaticWarningCode.RETURN_WITHOUT_VALUE]);
     verify([source]);
   }
 
   void test_returnWithoutValue_function() {
-    Source source = addSource(EngineTestCase.createSource(["int f() { return; }"]));
+    Source source = addSource("int f() { return; }");
     resolve(source);
     assertErrors(source, [StaticWarningCode.RETURN_WITHOUT_VALUE]);
     verify([source]);
   }
 
   void test_returnWithoutValue_method() {
-    Source source = addSource(EngineTestCase.createSource(["class A { int m() { return; } }"]));
+    Source source = addSource("class A { int m() { return; } }");
     resolve(source);
     assertErrors(source, [StaticWarningCode.RETURN_WITHOUT_VALUE]);
     verify([source]);
@@ -2375,72 +2602,90 @@
   void test_returnWithoutValue_mixedReturnTypes_function() {
     // Tests that only the RETURN_WITHOUT_VALUE warning is created, and no MIXED_RETURN_TYPES are
     // created.
-    Source source = addSource(EngineTestCase.createSource([
-        "int f(int x) {",
-        "  if (x < 0) {",
-        "    return 1;",
-        "  }",
-        "  return;",
-        "}"]));
+    Source source = addSource(r'''
+int f(int x) {
+  if (x < 0) {
+    return 1;
+  }
+  return;
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.RETURN_WITHOUT_VALUE]);
     verify([source]);
   }
 
   void test_staticAccessToInstanceMember_method_invocation() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  m() {}", "}", "main() {", "  A.m();", "}"]));
+    Source source = addSource(r'''
+class A {
+  m() {}
+}
+main() {
+  A.m();
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.STATIC_ACCESS_TO_INSTANCE_MEMBER]);
     verify([source]);
   }
 
   void test_staticAccessToInstanceMember_method_reference() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  m() {}", "}", "main() {", "  A.m;", "}"]));
+    Source source = addSource(r'''
+class A {
+  m() {}
+}
+main() {
+  A.m;
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.STATIC_ACCESS_TO_INSTANCE_MEMBER]);
     verify([source]);
   }
 
   void test_staticAccessToInstanceMember_propertyAccess_field() {
-    Source source = addSource(EngineTestCase.createSource(["class A {", "  var f;", "}", "main() {", "  A.f;", "}"]));
+    Source source = addSource(r'''
+class A {
+  var f;
+}
+main() {
+  A.f;
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.STATIC_ACCESS_TO_INSTANCE_MEMBER]);
     verify([source]);
   }
 
   void test_staticAccessToInstanceMember_propertyAccess_getter() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  get f => 42;",
-        "}",
-        "main() {",
-        "  A.f;",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  get f => 42;
+}
+main() {
+  A.f;
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.STATIC_ACCESS_TO_INSTANCE_MEMBER]);
     verify([source]);
   }
 
   void test_staticAccessToInstanceMember_propertyAccess_setter() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class A {",
-        "  set f(x) {}",
-        "}",
-        "main() {",
-        "  A.f = 42;",
-        "}"]));
+    Source source = addSource(r'''
+class A {
+  set f(x) {}
+}
+main() {
+  A.f = 42;
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.STATIC_ACCESS_TO_INSTANCE_MEMBER]);
     verify([source]);
   }
 
   void test_switchExpressionNotAssignable() {
-    Source source = addSource(EngineTestCase.createSource([
-        "f(int p) {",
-        "  switch (p) {",
-        "    case 'a': break;",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+f(int p) {
+  switch (p) {
+    case 'a': break;
+  }
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.SWITCH_EXPRESSION_NOT_ASSIGNABLE]);
     verify([source]);
@@ -2448,218 +2693,267 @@
 
   void test_typeAnnotationDeferredClass_asExpression() {
     resolveWithAndWithoutExperimental(<String> [
-        EngineTestCase.createSource(["library lib1;", "class A {}"]),
-        EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "f(var v) {",
-        "  v as a.A;",
-        "}"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
+        r'''
+library lib1;
+class A {}''',
+        r'''
+library root;
+import 'lib1.dart' deferred as a;
+f(var v) {
+  v as a.A;
+}'''], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
   }
 
   void test_typeAnnotationDeferredClass_catchClause() {
     resolveWithAndWithoutExperimental(<String> [
-        EngineTestCase.createSource(["library lib1;", "class A {}"]),
-        EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "f(var v) {",
-        "  try {",
-        "  } on a.A {",
-        "  }",
-        "}"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
+        r'''
+library lib1;
+class A {}''',
+        r'''
+library root;
+import 'lib1.dart' deferred as a;
+f(var v) {
+  try {
+  } on a.A {
+  }
+}'''], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
   }
 
   void test_typeAnnotationDeferredClass_fieldFormalParameter() {
     resolveWithAndWithoutExperimental(<String> [
-        EngineTestCase.createSource(["library lib1;", "class A {}"]),
-        EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "class C {",
-        "  var v;",
-        "  C(a.A this.v);",
-        "}"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
+        r'''
+library lib1;
+class A {}''',
+        r'''
+library root;
+import 'lib1.dart' deferred as a;
+class C {
+  var v;
+  C(a.A this.v);
+}'''], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
   }
 
   void test_typeAnnotationDeferredClass_functionDeclaration_returnType() {
     resolveWithAndWithoutExperimental(<String> [
-        EngineTestCase.createSource(["library lib1;", "class A {}"]),
-        EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "a.A f() { return null; }"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
+        r'''
+library lib1;
+class A {}''',
+        r'''
+library root;
+import 'lib1.dart' deferred as a;
+a.A f() { return null; }'''], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
   }
 
   void test_typeAnnotationDeferredClass_functionTypedFormalParameter_returnType() {
     resolveWithAndWithoutExperimental(<String> [
-        EngineTestCase.createSource(["library lib1;", "class A {}"]),
-        EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "f(a.A g()) {}"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
+        r'''
+library lib1;
+class A {}''',
+        r'''
+library root;
+import 'lib1.dart' deferred as a;
+f(a.A g()) {}'''], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
   }
 
   void test_typeAnnotationDeferredClass_isExpression() {
     resolveWithAndWithoutExperimental(<String> [
-        EngineTestCase.createSource(["library lib1;", "class A {}"]),
-        EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "f(var v) {",
-        "  bool b = v is a.A;",
-        "}"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
+        r'''
+library lib1;
+class A {}''',
+        r'''
+library root;
+import 'lib1.dart' deferred as a;
+f(var v) {
+  bool b = v is a.A;
+}'''], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
   }
 
   void test_typeAnnotationDeferredClass_methodDeclaration_returnType() {
     resolveWithAndWithoutExperimental(<String> [
-        EngineTestCase.createSource(["library lib1;", "class A {}"]),
-        EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "class C {",
-        "  a.A m() { return null; }",
-        "}"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
+        r'''
+library lib1;
+class A {}''',
+        r'''
+library root;
+import 'lib1.dart' deferred as a;
+class C {
+  a.A m() { return null; }
+}'''], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
   }
 
   void test_typeAnnotationDeferredClass_simpleFormalParameter() {
     resolveWithAndWithoutExperimental(<String> [
-        EngineTestCase.createSource(["library lib1;", "class A {}"]),
-        EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "f(a.A v) {}"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
+        r'''
+library lib1;
+class A {}''',
+        r'''
+library root;
+import 'lib1.dart' deferred as a;
+f(a.A v) {}'''], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
   }
 
   void test_typeAnnotationDeferredClass_typeArgumentList() {
     resolveWithAndWithoutExperimental(<String> [
-        EngineTestCase.createSource(["library lib1;", "class A {}"]),
-        EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "class C<E> {}",
-        "C<a.A> c;"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
+        r'''
+library lib1;
+class A {}''',
+        r'''
+library root;
+import 'lib1.dart' deferred as a;
+class C<E> {}
+C<a.A> c;'''], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
   }
 
   void test_typeAnnotationDeferredClass_typeArgumentList2() {
     resolveWithAndWithoutExperimental(<String> [
-        EngineTestCase.createSource(["library lib1;", "class A {}"]),
-        EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "class C<E, F> {}",
-        "C<a.A, a.A> c;"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [
+        r'''
+library lib1;
+class A {}''',
+        r'''
+library root;
+import 'lib1.dart' deferred as a;
+class C<E, F> {}
+C<a.A, a.A> c;'''], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [
         StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS,
         StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
   }
 
   void test_typeAnnotationDeferredClass_typeParameter_bound() {
     resolveWithAndWithoutExperimental(<String> [
-        EngineTestCase.createSource(["library lib1;", "class A {}"]),
-        EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "class C<E extends a.A> {}"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
+        r'''
+library lib1;
+class A {}''',
+        r'''
+library root;
+import 'lib1.dart' deferred as a;
+class C<E extends a.A> {}'''], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
   }
 
   void test_typeAnnotationDeferredClass_variableDeclarationList() {
     resolveWithAndWithoutExperimental(<String> [
-        EngineTestCase.createSource(["library lib1;", "class A {}"]),
-        EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "a.A v;"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
+        r'''
+library lib1;
+class A {}''',
+        r'''
+library root;
+import 'lib1.dart' deferred as a;
+a.A v;'''], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
   }
 
   void test_typeParameterReferencedByStatic_field() {
-    Source source = addSource(EngineTestCase.createSource(["class A<K> {", "  static K k;", "}"]));
+    Source source = addSource(r'''
+class A<K> {
+  static K k;
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.TYPE_PARAMETER_REFERENCED_BY_STATIC]);
     verify([source]);
   }
 
   void test_typeParameterReferencedByStatic_getter() {
-    Source source = addSource(EngineTestCase.createSource(["class A<K> {", "  static K get k => null;", "}"]));
+    Source source = addSource(r'''
+class A<K> {
+  static K get k => null;
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.TYPE_PARAMETER_REFERENCED_BY_STATIC]);
     verify([source]);
   }
 
   void test_typeParameterReferencedByStatic_methodBodyReference() {
-    Source source = addSource(EngineTestCase.createSource(["class A<K> {", "  static m() {", "    K k;", "  }", "}"]));
+    Source source = addSource(r'''
+class A<K> {
+  static m() {
+    K k;
+  }
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.TYPE_PARAMETER_REFERENCED_BY_STATIC]);
     verify([source]);
   }
 
   void test_typeParameterReferencedByStatic_methodParameter() {
-    Source source = addSource(EngineTestCase.createSource(["class A<K> {", "  static m(K k) {}", "}"]));
+    Source source = addSource(r'''
+class A<K> {
+  static m(K k) {}
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.TYPE_PARAMETER_REFERENCED_BY_STATIC]);
     verify([source]);
   }
 
   void test_typeParameterReferencedByStatic_methodReturn() {
-    Source source = addSource(EngineTestCase.createSource(["class A<K> {", "  static K m() { return null; }", "}"]));
+    Source source = addSource(r'''
+class A<K> {
+  static K m() { return null; }
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.TYPE_PARAMETER_REFERENCED_BY_STATIC]);
     verify([source]);
   }
 
   void test_typeParameterReferencedByStatic_setter() {
-    Source source = addSource(EngineTestCase.createSource(["class A<K> {", "  static set s(K k) {}", "}"]));
+    Source source = addSource(r'''
+class A<K> {
+  static set s(K k) {}
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.TYPE_PARAMETER_REFERENCED_BY_STATIC]);
     verify([source]);
   }
 
   void test_typePromotion_functionType_arg_InterToDyn() {
-    Source source = addSource(EngineTestCase.createSource([
-        "typedef FuncDyn(x);",
-        "typedef FuncA(A a);",
-        "class A {}",
-        "class B {}",
-        "main(FuncA f) {",
-        "  if (f is FuncDyn) {",
-        "    f(new B());",
-        "  }",
-        "}"]));
+    Source source = addSource(r'''
+typedef FuncDyn(x);
+typedef FuncA(A a);
+class A {}
+class B {}
+main(FuncA f) {
+  if (f is FuncDyn) {
+    f(new B());
+  }
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
   }
 
   void test_typeTestNonType() {
-    Source source = addSource(EngineTestCase.createSource(["var A = 0;", "f(var p) {", "  if (p is A) {", "  }", "}"]));
+    Source source = addSource(r'''
+var A = 0;
+f(var p) {
+  if (p is A) {
+  }
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.TYPE_TEST_NON_TYPE]);
     verify([source]);
   }
 
   void test_undefinedClass_instanceCreation() {
-    Source source = addSource(EngineTestCase.createSource(["f() { new C(); }"]));
+    Source source = addSource("f() { new C(); }");
     resolve(source);
     assertErrors(source, [StaticWarningCode.UNDEFINED_CLASS]);
   }
 
   void test_undefinedClass_variableDeclaration() {
-    Source source = addSource(EngineTestCase.createSource(["f() { C c; }"]));
+    Source source = addSource("f() { C c; }");
     resolve(source);
     assertErrors(source, [StaticWarningCode.UNDEFINED_CLASS]);
   }
 
   void test_undefinedClassBoolean_variableDeclaration() {
-    Source source = addSource(EngineTestCase.createSource(["f() { boolean v; }"]));
+    Source source = addSource("f() { boolean v; }");
     resolve(source);
     assertErrors(source, [StaticWarningCode.UNDEFINED_CLASS_BOOLEAN]);
   }
 
   void test_undefinedGetter_fromLibrary() {
     Source source1 = addNamedSource("lib.dart", "");
-    Source source2 = addNamedSource("lib2.dart", EngineTestCase.createSource([
-        "import 'lib.dart' as lib;",
-        "void f() {",
-        "  var g = lib.gg;",
-        "}"]));
+    Source source2 = addNamedSource("lib2.dart", r'''
+import 'lib.dart' as lib;
+void f() {
+  var g = lib.gg;
+}''');
     resolve(source1);
     resolve(source2);
     assertErrors(source2, [StaticWarningCode.UNDEFINED_GETTER]);
@@ -2667,72 +2961,100 @@
   }
 
   void test_undefinedIdentifier_for() {
-    Source source = addSource(EngineTestCase.createSource(["f(var l) {", "  for (e in l) {", "  }", "}"]));
+    Source source = addSource(r'''
+f(var l) {
+  for (e in l) {
+  }
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.UNDEFINED_IDENTIFIER]);
   }
 
   void test_undefinedIdentifier_function() {
-    Source source = addSource(EngineTestCase.createSource(["int a() => b;"]));
+    Source source = addSource("int a() => b;");
     resolve(source);
     assertErrors(source, [StaticWarningCode.UNDEFINED_IDENTIFIER]);
   }
 
   void test_undefinedIdentifier_function_prefix() {
-    addNamedSource("/lib.dart", EngineTestCase.createSource(["library lib;", "class C {}"]));
-    Source source = addSource(EngineTestCase.createSource(["import 'lib.dart' as b;", "", "int a() => b;", "b.C c;"]));
+    addNamedSource("/lib.dart", r'''
+library lib;
+class C {}''');
+    Source source = addSource(r'''
+import 'lib.dart' as b;
+
+int a() => b;
+b.C c;''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.UNDEFINED_IDENTIFIER]);
     verify([source]);
   }
 
   void test_undefinedIdentifier_initializer() {
-    Source source = addSource(EngineTestCase.createSource(["var a = b;"]));
+    Source source = addSource("var a = b;");
     resolve(source);
     assertErrors(source, [StaticWarningCode.UNDEFINED_IDENTIFIER]);
   }
 
   void test_undefinedIdentifier_initializer_prefix() {
-    addNamedSource("/lib.dart", EngineTestCase.createSource(["library lib;", "class C {}"]));
-    Source source = addSource(EngineTestCase.createSource(["import 'lib.dart' as b;", "", "var a = b;", "b.C c;"]));
+    addNamedSource("/lib.dart", r'''
+library lib;
+class C {}''');
+    Source source = addSource(r'''
+import 'lib.dart' as b;
+
+var a = b;
+b.C c;''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.UNDEFINED_IDENTIFIER]);
   }
 
   void test_undefinedIdentifier_methodInvocation() {
-    Source source = addSource(EngineTestCase.createSource(["f() { C.m(); }"]));
+    Source source = addSource("f() { C.m(); }");
     resolve(source);
     assertErrors(source, [StaticWarningCode.UNDEFINED_IDENTIFIER]);
   }
 
   void test_undefinedIdentifier_private_getter() {
-    addNamedSource("/lib.dart", EngineTestCase.createSource(["library lib;", "class A {", "  var _foo;", "}"]));
-    Source source = addSource(EngineTestCase.createSource([
-        "import 'lib.dart';",
-        "class B extends A {",
-        "  test() {",
-        "    var v = _foo;",
-        "  }",
-        "}"]));
+    addNamedSource("/lib.dart", r'''
+library lib;
+class A {
+  var _foo;
+}''');
+    Source source = addSource(r'''
+import 'lib.dart';
+class B extends A {
+  test() {
+    var v = _foo;
+  }
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.UNDEFINED_IDENTIFIER]);
   }
 
   void test_undefinedIdentifier_private_setter() {
-    addNamedSource("/lib.dart", EngineTestCase.createSource(["library lib;", "class A {", "  var _foo;", "}"]));
-    Source source = addSource(EngineTestCase.createSource([
-        "import 'lib.dart';",
-        "class B extends A {",
-        "  test() {",
-        "    _foo = 42;",
-        "  }",
-        "}"]));
+    addNamedSource("/lib.dart", r'''
+library lib;
+class A {
+  var _foo;
+}''');
+    Source source = addSource(r'''
+import 'lib.dart';
+class B extends A {
+  test() {
+    _foo = 42;
+  }
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.UNDEFINED_IDENTIFIER]);
   }
 
   void test_undefinedNamedParameter() {
-    Source source = addSource(EngineTestCase.createSource(["f({a, b}) {}", "main() {", "  f(c: 1);", "}"]));
+    Source source = addSource(r'''
+f({a, b}) {}
+main() {
+  f(c: 1);
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.UNDEFINED_NAMED_PARAMETER]);
     // no verify(), 'c' is not resolved
@@ -2740,75 +3062,86 @@
 
   void test_undefinedSetter() {
     Source source1 = addNamedSource("lib.dart", "");
-    Source source2 = addNamedSource("lib2.dart", EngineTestCase.createSource([
-        "import 'lib.dart' as lib;",
-        "void f() {",
-        "  lib.gg = null;",
-        "}"]));
+    Source source2 = addNamedSource("lib2.dart", r'''
+import 'lib.dart' as lib;
+void f() {
+  lib.gg = null;
+}''');
     resolve(source1);
     resolve(source2);
     assertErrors(source2, [StaticWarningCode.UNDEFINED_SETTER]);
   }
 
   void test_undefinedStaticMethodOrGetter_getter() {
-    Source source = addSource(EngineTestCase.createSource(["class C {}", "f(var p) {", "  f(C.m);", "}"]));
+    Source source = addSource(r'''
+class C {}
+f(var p) {
+  f(C.m);
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
 
   void test_undefinedStaticMethodOrGetter_getter_inSuperclass() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class S {",
-        "  static int get g => 0;",
-        "}",
-        "class C extends S {}",
-        "f(var p) {",
-        "  f(C.g);",
-        "}"]));
+    Source source = addSource(r'''
+class S {
+  static int get g => 0;
+}
+class C extends S {}
+f(var p) {
+  f(C.g);
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
 
   void test_undefinedStaticMethodOrGetter_method() {
-    Source source = addSource(EngineTestCase.createSource(["class C {}", "f(var p) {", "  f(C.m());", "}"]));
+    Source source = addSource(r'''
+class C {}
+f(var p) {
+  f(C.m());
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_METHOD]);
   }
 
   void test_undefinedStaticMethodOrGetter_method_inSuperclass() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class S {",
-        "  static m() {}",
-        "}",
-        "class C extends S {}",
-        "f(var p) {",
-        "  f(C.m());",
-        "}"]));
+    Source source = addSource(r'''
+class S {
+  static m() {}
+}
+class C extends S {}
+f(var p) {
+  f(C.m());
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_METHOD]);
   }
 
   void test_undefinedStaticMethodOrGetter_setter_inSuperclass() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class S {",
-        "  static set s(int i) {}",
-        "}",
-        "class C extends S {}",
-        "f(var p) {",
-        "  f(C.s = 1);",
-        "}"]));
+    Source source = addSource(r'''
+class S {
+  static set s(int i) {}
+}
+class C extends S {}
+f(var p) {
+  f(C.s = 1);
+}''');
     resolve(source);
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_SETTER]);
   }
 
   void test_voidReturnForGetter() {
-    Source source = addSource(EngineTestCase.createSource(["class S {", "  void get value {}", "}"]));
+    Source source = addSource(r'''
+class S {
+  void get value {}
+}''');
     resolve(source);
     assertErrors(source, [StaticWarningCode.VOID_RETURN_FOR_GETTER]);
   }
 }
 
 main() {
-  _ut.groupSep = ' | ';
+  groupSep = ' | ';
   runReflectiveTests(StaticWarningCodeTest);
 }
diff --git a/pkg/analyzer/test/generated/test_all.dart b/pkg/analyzer/test/generated/test_all.dart
index 9c29923..a5690b6 100644
--- a/pkg/analyzer/test/generated/test_all.dart
+++ b/pkg/analyzer/test/generated/test_all.dart
@@ -19,6 +19,7 @@
 import 'scanner_test.dart' as scanner_test;
 import 'static_type_warning_code_test.dart' as static_type_warning_code_test;
 import 'static_warning_code_test.dart' as static_warning_code_test;
+import 'utilities_test.dart' as utilities_test;
 
 /// Utility for manually running all tests.
 main() {
@@ -37,5 +38,6 @@
     scanner_test.main();
     static_type_warning_code_test.main();
     static_warning_code_test.main();
+    utilities_test.main();
   });
 }
diff --git a/pkg/analyzer/test/generated/test_support.dart b/pkg/analyzer/test/generated/test_support.dart
index cb249cb..60c3ce6 100644
--- a/pkg/analyzer/test/generated/test_support.dart
+++ b/pkg/analyzer/test/generated/test_support.dart
@@ -15,16 +15,17 @@
 import 'package:analyzer/src/generated/error.dart';
 import 'package:analyzer/src/generated/java_core.dart';
 import 'package:analyzer/src/generated/java_engine.dart';
-import 'package:analyzer/src/generated/java_junit.dart';
-import 'package:analyzer/src/generated/scanner.dart';
 import 'package:analyzer/src/generated/source.dart';
+import 'package:unittest/unittest.dart';
 
 
 /**
  * The class `EngineTestCase` defines utility methods for making assertions.
  */
-class EngineTestCase extends JUnitTestCase {
-  static int _PRINT_RANGE = 6;
+class EngineTestCase {
+  void setUp() {}
+
+  void tearDown() {}
 
   /**
    * Assert that the given collection has the same number of elements as the number of specified
@@ -44,18 +45,18 @@
         }
       }
       if (!found) {
-        JavaStringBuilder msg = new JavaStringBuilder();
-        msg.append("Expected element named: ");
-        msg.append(elemName);
-        msg.append("\n  but found: ");
+        StringBuffer buffer = new StringBuffer();
+        buffer.write("Expected element named: ");
+        buffer.write(elemName);
+        buffer.write("\n  but found: ");
         for (Element elem in elements) {
-          msg.append(elem.name);
-          msg.append(", ");
+          buffer.write(elem.name);
+          buffer.write(", ");
         }
-        JUnitTestCase.fail(msg.toString());
+        fail(buffer.toString());
       }
     }
-    assertLength(names.length, elements);
+    expect(elements, hasLength(names.length));
   }
 
   AnalysisContextImpl createAnalysisContext() {
@@ -77,8 +78,7 @@
         return accessor;
       }
     }
-    JUnitTestCase.fail(
-        "Could not find getter named ${getterName} in ${type.displayName}");
+    fail("Could not find getter named $getterName in ${type.displayName}");
     return null;
   }
 
@@ -95,220 +95,11 @@
         return method;
       }
     }
-    JUnitTestCase.fail(
-        "Could not find method named ${methodName} in ${type.displayName}");
+    fail("Could not find method named $methodName in ${type.displayName}");
     return null;
   }
 
   /**
-   * Assert that the tokens in the actual stream of tokens have the same types and lexemes as the
-   * tokens in the expected stream of tokens. Note that this does not assert anything about the
-   * offsets of the tokens (although the lengths will be equal).
-   *
-   * @param expectedStream the head of the stream of tokens that were expected
-   * @param actualStream the head of the stream of tokens that were actually found
-   * @throws AssertionFailedError if the two streams of tokens are not the same
-   */
-  static void assertAllMatch(Token expectedStream, Token actualStream) {
-    Token left = expectedStream;
-    Token right = actualStream;
-    while (left.type != TokenType.EOF && right.type != TokenType.EOF) {
-      assertMatches(left, right);
-      left = left.next;
-      right = right.next;
-    }
-  }
-
-  /**
-   * Assert that the given collection is non-`null` and has the expected number of elements.
-   *
-   * @param expectedSize the expected number of elements
-   * @param c the collection being tested
-   * @throws AssertionFailedError if the list is `null` or does not have the expected number
-   *           of elements
-   */
-  static void assertCollectionSize(int expectedSize, Iterable c) {
-    if (c == null) {
-      JUnitTestCase.fail(
-          "Expected collection of size ${expectedSize}; found null");
-    } else if (c.length != expectedSize) {
-      JUnitTestCase.fail(
-          "Expected collection of size ${expectedSize}; contained ${c.length} elements");
-    }
-  }
-
-  /**
-   * Assert that the given array is non-`null` and contains the expected elements. The
-   * elements can appear in any order.
-   *
-   * @param array the array being tested
-   * @param expectedElements the expected elements
-   * @throws AssertionFailedError if the array is `null` or does not contain the expected
-   *           elements
-   */
-  static void assertContains(List<Object> array,
-      List<Object> expectedElements) {
-    int expectedSize = expectedElements.length;
-    if (array == null) {
-      JUnitTestCase.fail(
-          "Expected array of length ${expectedSize}; found null");
-    }
-    if (array.length != expectedSize) {
-      JUnitTestCase.fail(
-          "Expected array of length ${expectedSize}; contained ${array.length} elements");
-    }
-    List<bool> found = new List<bool>.filled(expectedSize, false);
-    for (int i = 0; i < expectedSize; i++) {
-      _privateAssertContains(array, found, expectedElements[i]);
-    }
-  }
-
-  /**
-   * Assert that a given String is equal to an expected value.
-   *
-   * @param expected the expected String value
-   * @param actual the actual String value
-   */
-  static void assertEqualString(String expected, String actual) {
-    if (actual == null || expected == null) {
-      if (identical(actual, expected)) {
-        return;
-      }
-      if (actual == null) {
-        JUnitTestCase.assertTrueMsg(
-            "Content not as expected: is 'null' expected: ${expected}",
-            false);
-      } else {
-        JUnitTestCase.assertTrueMsg(
-            "Content not as expected: expected 'null' is: ${actual}",
-            false);
-      }
-    }
-    int diffPos = _getDiffPos(expected, actual);
-    if (diffPos != -1) {
-      int diffAhead = Math.max(0, diffPos - _PRINT_RANGE);
-      int diffAfter = Math.min(actual.length, diffPos + _PRINT_RANGE);
-      String diffStr =
-          "${actual.substring(diffAhead, diffPos)}^${actual.substring(diffPos, diffAfter)}";
-      // use detailed message
-      String message =
-          "Content not as expected: is\n${actual}\nDiffers at pos ${diffPos}: ${diffStr}\nexpected:\n${expected}";
-      JUnitTestCase.assertEqualsMsg(message, expected, actual);
-    }
-  }
-
-  /**
-   * Assert that the array of actual values contain exactly the same values as those in the array of
-   * expected value, with the exception that the order of the elements is not required to be the
-   * same.
-   *
-   * @param expectedValues the values that are expected to be found
-   * @param actualValues the actual values that are being compared against the expected values
-   */
-  static void assertEqualsIgnoreOrder(List<Object> expectedValues,
-      List<Object> actualValues) {
-    JUnitTestCase.assertNotNull(actualValues);
-    int expectedLength = expectedValues.length;
-    JUnitTestCase.assertEquals(expectedLength, actualValues.length);
-    List<bool> found = new List<bool>.filled(expectedLength, false);
-    for (int i = 0; i < expectedLength; i++) {
-      found[i] = false;
-    }
-    for (Object actualValue in actualValues) {
-      bool wasExpected = false;
-      for (int i = 0; i < expectedLength; i++) {
-        if (!found[i] && expectedValues[i] == actualValue) {
-          found[i] = true;
-          wasExpected = true;
-          break;
-        }
-      }
-      if (!wasExpected) {
-        JUnitTestCase.fail("The actual value ${actualValue} was not expected");
-      }
-    }
-  }
-
-  /**
-   * Assert that the given array is non-`null` and has exactly expected elements.
-   *
-   * @param array the array being tested
-   * @param expectedElements the expected elements
-   * @throws AssertionFailedError if the array is `null` or does not have the expected
-   *           elements
-   */
-  static void assertExactElementsInArray(List<Object> array,
-      List<Object> expectedElements) {
-    int expectedSize = expectedElements.length;
-    if (array == null) {
-      JUnitTestCase.fail("Expected array of size ${expectedSize}; found null");
-    }
-    if (array.length != expectedSize) {
-      JUnitTestCase.fail(
-          "Expected array of size ${expectedSize}; contained ${array.length} elements");
-    }
-    for (int i = 0; i < expectedSize; i++) {
-      Object element = array[i];
-      Object expectedElement = expectedElements[i];
-      if (element != expectedElement) {
-        JUnitTestCase.fail(
-            "Expected ${expectedElement} at [${i}]; found ${element}");
-      }
-    }
-  }
-
-  /**
-   * Assert that the given list is non-`null` and has exactly expected elements.
-   *
-   * @param list the list being tested
-   * @param expectedElements the expected elements
-   * @throws AssertionFailedError if the list is `null` or does not have the expected elements
-   */
-  static void assertExactElementsInList(List list,
-      List<Object> expectedElements) {
-    int expectedSize = expectedElements.length;
-    if (list == null) {
-      JUnitTestCase.fail("Expected list of size ${expectedSize}; found null");
-    }
-    if (list.length != expectedSize) {
-      JUnitTestCase.fail(
-          "Expected list of size ${expectedSize}; contained ${list.length} elements");
-    }
-    for (int i = 0; i < expectedSize; i++) {
-      Object element = list[i];
-      Object expectedElement = expectedElements[i];
-      if (element != expectedElement) {
-        JUnitTestCase.fail(
-            "Expected ${expectedElement} at [${i}]; found ${element}");
-      }
-    }
-  }
-
-  /**
-   * Assert that the given list is non-`null` and has exactly expected elements.
-   *
-   * @param set the list being tested
-   * @param expectedElements the expected elements
-   * @throws AssertionFailedError if the list is `null` or does not have the expected elements
-   */
-  static void assertExactElementsInSet(Set set, List<Object> expectedElements) {
-    int expectedSize = expectedElements.length;
-    if (set == null) {
-      JUnitTestCase.fail("Expected list of size ${expectedSize}; found null");
-    }
-    if (set.length != expectedSize) {
-      JUnitTestCase.fail(
-          "Expected list of size ${expectedSize}; contained ${set.length} elements");
-    }
-    for (int i = 0; i < expectedSize; i++) {
-      Object expectedElement = expectedElements[i];
-      if (!set.contains(expectedElement)) {
-        JUnitTestCase.fail("Expected ${expectedElement} in set${set}");
-      }
-    }
-  }
-
-  /**
    * Assert that the given object is an instance of the expected class.
    *
    * @param expectedClass the class that the object is expected to be an instance of
@@ -319,177 +110,23 @@
   static Object assertInstanceOf(Predicate<Object> predicate,
       Type expectedClass, Object object) {
     if (!predicate(object)) {
-      JUnitTestCase.fail(
-          "Expected instance of ${expectedClass.toString()}, found ${(object == null ? "null" : object.runtimeType.toString())}");
+      fail("Expected instance of $expectedClass, found ${object == null ? "null" : object.runtimeType}");
     }
     return object;
   }
 
   /**
-   * Assert that the given array is non-`null` and has the expected number of elements.
-   *
-   * @param expectedLength the expected number of elements
-   * @param array the array being tested
-   * @throws AssertionFailedError if the array is `null` or does not have the expected number
-   *           of elements
-   */
-  static void assertLength(int expectedLength, List<Object> array) {
-    if (array == null) {
-      JUnitTestCase.fail(
-          "Expected array of length ${expectedLength}; found null");
-    } else if (array.length != expectedLength) {
-      JUnitTestCase.fail(
-          "Expected array of length ${expectedLength}; contained ${array.length} elements");
-    }
-  }
-
-  /**
-   * Assert that the actual token has the same type and lexeme as the expected token. Note that this
-   * does not assert anything about the offsets of the tokens (although the lengths will be equal).
-   *
-   * @param expectedToken the token that was expected
-   * @param actualToken the token that was found
-   * @throws AssertionFailedError if the two tokens are not the same
-   */
-  static void assertMatches(Token expectedToken, Token actualToken) {
-    JUnitTestCase.assertEquals(expectedToken.type, actualToken.type);
-    if (expectedToken is KeywordToken) {
-      assertInstanceOf((obj) => obj is KeywordToken, KeywordToken, actualToken);
-      JUnitTestCase.assertEquals(
-          expectedToken.keyword,
-          (actualToken as KeywordToken).keyword);
-    } else if (expectedToken is StringToken) {
-      assertInstanceOf((obj) => obj is StringToken, StringToken, actualToken);
-      JUnitTestCase.assertEquals(
-          expectedToken.lexeme,
-          (actualToken as StringToken).lexeme);
-    }
-  }
-
-  /**
-   * Assert that the given list is non-`null` and has the expected number of elements.
-   *
-   * @param expectedSize the expected number of elements
-   * @param list the list being tested
-   * @throws AssertionFailedError if the list is `null` or does not have the expected number
-   *           of elements
-   */
-  static void assertSizeOfList(int expectedSize, List list) {
-    if (list == null) {
-      JUnitTestCase.fail("Expected list of size ${expectedSize}; found null");
-    } else if (list.length != expectedSize) {
-      JUnitTestCase.fail(
-          "Expected list of size ${expectedSize}; contained ${list.length} elements");
-    }
-  }
-
-  /**
-   * Assert that the given map is non-`null` and has the expected number of elements.
-   *
-   * @param expectedSize the expected number of elements
-   * @param map the map being tested
-   * @throws AssertionFailedError if the map is `null` or does not have the expected number of
-   *           elements
-   */
-  static void assertSizeOfMap(int expectedSize, Map map) {
-    if (map == null) {
-      JUnitTestCase.fail("Expected map of size ${expectedSize}; found null");
-    } else if (map.length != expectedSize) {
-      JUnitTestCase.fail(
-          "Expected map of size ${expectedSize}; contained ${map.length} elements");
-    }
-  }
-
-  /**
-   * Assert that the given set is non-`null` and has the expected number of elements.
-   *
-   * @param expectedSize the expected number of elements
-   * @param set the set being tested
-   * @throws AssertionFailedError if the set is `null` or does not have the expected number of
-   *           elements
-   */
-  static void assertSizeOfSet(int expectedSize, Set set) {
-    if (set == null) {
-      JUnitTestCase.fail("Expected set of size ${expectedSize}; found null");
-    } else if (set.length != expectedSize) {
-      JUnitTestCase.fail(
-          "Expected set of size ${expectedSize}; contained ${set.length} elements");
-    }
-  }
-
-  /**
-   * Convert the given array of lines into a single source string.
-   *
-   * @param lines the lines to be merged into a single source string
-   * @return the source string composed of the given lines
-   */
-  static String createSource(List<String> lines) {
-    PrintStringWriter writer = new PrintStringWriter();
-    for (String line in lines) {
-      writer.println(line);
-    }
-    return writer.toString();
-  }
-
-  /**
    * @return the [AstNode] with requested type at offset of the "prefix".
    */
   static AstNode findNode(AstNode root, String code, String prefix,
       Predicate<AstNode> predicate) {
     int offset = code.indexOf(prefix);
     if (offset == -1) {
-      throw new IllegalArgumentException("Not found '${prefix}'.");
+      throw new IllegalArgumentException("Not found '$prefix'.");
     }
     AstNode node = new NodeLocator.con1(offset).searchWithin(root);
     return node.getAncestor(predicate);
   }
-
-  /**
-   * Calculate the offset where the given strings differ.
-   *
-   * @param str1 the first String to compare
-   * @param str2 the second String to compare
-   * @return the offset at which the strings differ (or <code>-1</code> if they do not)
-   */
-  static int _getDiffPos(String str1, String str2) {
-    int len1 = Math.min(str1.length, str2.length);
-    int diffPos = -1;
-    for (int i = 0; i < len1; i++) {
-      if (str1.codeUnitAt(i) != str2.codeUnitAt(i)) {
-        diffPos = i;
-        break;
-      }
-    }
-    if (diffPos == -1 && str1.length != str2.length) {
-      diffPos = len1;
-    }
-    return diffPos;
-  }
-
-  static void _privateAssertContains(List<Object> array, List<bool> found,
-      Object element) {
-    if (element == null) {
-      for (int i = 0; i < array.length; i++) {
-        if (!found[i]) {
-          if (array[i] == null) {
-            found[i] = true;
-            return;
-          }
-        }
-      }
-      JUnitTestCase.fail("Does not contain null");
-    } else {
-      for (int i = 0; i < array.length; i++) {
-        if (!found[i]) {
-          if (element == array[i]) {
-            found[i] = true;
-            return;
-          }
-        }
-      }
-      JUnitTestCase.fail("Does not contain ${element}");
-    }
-  }
 }
 
 /**
@@ -603,14 +240,12 @@
    *           expected
    */
   void assertErrorsWithCodes(List<ErrorCode> expectedErrorCodes) {
-    JavaStringBuilder builder = new JavaStringBuilder();
+    StringBuffer buffer = new StringBuffer();
     //
     // Verify that the expected error codes have a non-empty message.
     //
     for (ErrorCode errorCode in expectedErrorCodes) {
-      JUnitTestCase.assertFalseMsg(
-          "Empty error code message",
-          errorCode.message.isEmpty);
+      expect(errorCode.message.isEmpty, isFalse, reason: "Empty error code message");
     }
     //
     // Compute the expected number of each type of error.
@@ -642,9 +277,7 @@
     //
     // Compare the expected and actual number of each type of error.
     //
-    for (MapEntry<ErrorCode, int> entry in getMapEntrySet(expectedCounts)) {
-      ErrorCode code = entry.getKey();
-      int expectedCount = entry.getValue();
+    expectedCounts.forEach((ErrorCode code, int expectedCount) {
       int actualCount;
       List<AnalysisError> list = errorsByCode.remove(code);
       if (list == null) {
@@ -653,48 +286,45 @@
         actualCount = list.length;
       }
       if (actualCount != expectedCount) {
-        if (builder.length == 0) {
-          builder.append("Expected ");
+        if (buffer.length == 0) {
+          buffer.write("Expected ");
         } else {
-          builder.append("; ");
+          buffer.write("; ");
         }
-        builder.append(expectedCount);
-        builder.append(" errors of type ");
-        builder.append("${code.runtimeType.toString()}.${code}");
-        builder.append(", found ");
-        builder.append(actualCount);
+        buffer.write(expectedCount);
+        buffer.write(" errors of type ");
+        buffer.write("${code.runtimeType}.$code");
+        buffer.write(", found ");
+        buffer.write(actualCount);
       }
-    }
+    });
     //
     // Check that there are no more errors in the actual-errors map,
     // otherwise record message.
     //
-    for (MapEntry<ErrorCode, List<AnalysisError>> entry in getMapEntrySet(
-        errorsByCode)) {
-      ErrorCode code = entry.getKey();
-      List<AnalysisError> actualErrors = entry.getValue();
+    errorsByCode.forEach((ErrorCode code, List<AnalysisError> actualErrors) {
       int actualCount = actualErrors.length;
-      if (builder.length == 0) {
-        builder.append("Expected ");
+      if (buffer.length == 0) {
+        buffer.write("Expected ");
       } else {
-        builder.append("; ");
+        buffer.write("; ");
       }
-      builder.append("0 errors of type ");
-      builder.append("${code.runtimeType.toString()}.${code}");
-      builder.append(", found ");
-      builder.append(actualCount);
-      builder.append(" (");
+      buffer.write("0 errors of type ");
+      buffer.write("${code.runtimeType}.$code");
+      buffer.write(", found ");
+      buffer.write(actualCount);
+      buffer.write(" (");
       for (int i = 0; i < actualErrors.length; i++) {
         AnalysisError error = actualErrors[i];
         if (i > 0) {
-          builder.append(", ");
+          buffer.write(", ");
         }
-        builder.append(error.offset);
+        buffer.write(error.offset);
       }
-      builder.append(")");
-    }
-    if (builder.length > 0) {
-      JUnitTestCase.fail(builder.toString());
+      buffer.write(")");
+    });
+    if (buffer.length > 0) {
+      fail(buffer.toString());
     }
   }
 
@@ -728,8 +358,7 @@
     }
     if (expectedErrorCount != actualErrorCount ||
         expectedWarningCount != actualWarningCount) {
-      JUnitTestCase.fail(
-          "Expected ${expectedErrorCount} errors and ${expectedWarningCount} warnings, found ${actualErrorCount} errors and ${actualWarningCount} warnings");
+      fail("Expected $expectedErrorCount errors and $expectedWarningCount warnings, found $actualErrorCount errors and $actualWarningCount warnings");
     }
   }
 
@@ -825,17 +454,18 @@
    * @throws AssertionFailedError with
    */
   void _fail(List<AnalysisError> expectedErrors) {
-    PrintStringWriter writer = new PrintStringWriter();
-    writer.print("Expected ");
-    writer.print(expectedErrors.length);
-    writer.print(" errors:");
+    StringBuffer buffer = new StringBuffer();
+    buffer.write("Expected ");
+    buffer.write(expectedErrors.length);
+    buffer.write(" errors:");
     for (AnalysisError error in expectedErrors) {
       Source source = error.source;
       LineInfo lineInfo = _lineInfoMap[source];
-      writer.newLine();
+      buffer.writeln();
       if (lineInfo == null) {
         int offset = error.offset;
-        writer.printf(
+        StringUtils.printf(
+            buffer,
             "  %s %s (%d..%d)",
             [
                 source == null ? "" : source.shortName,
@@ -844,7 +474,8 @@
                 offset + error.length]);
       } else {
         LineInfo_Location location = lineInfo.getLocation(error.offset);
-        writer.printf(
+        StringUtils.printf(
+            buffer,
             "  %s %s (%d, %d/%d)",
             [
                 source == null ? "" : source.shortName,
@@ -854,17 +485,18 @@
                 error.length]);
       }
     }
-    writer.newLine();
-    writer.print("found ");
-    writer.print(_errors.length);
-    writer.print(" errors:");
+    buffer.writeln();
+    buffer.write("found ");
+    buffer.write(_errors.length);
+    buffer.write(" errors:");
     for (AnalysisError error in _errors) {
       Source source = error.source;
       LineInfo lineInfo = _lineInfoMap[source];
-      writer.newLine();
+      buffer.writeln();
       if (lineInfo == null) {
         int offset = error.offset;
-        writer.printf(
+        StringUtils.printf(
+            buffer,
             "  %s %s (%d..%d): %s",
             [
                 source == null ? "" : source.shortName,
@@ -874,7 +506,8 @@
                 error.message]);
       } else {
         LineInfo_Location location = lineInfo.getLocation(error.offset);
-        writer.printf(
+        StringUtils.printf(
+            buffer,
             "  %s %s (%d, %d/%d): %s",
             [
                 source == null ? "" : source.shortName,
@@ -885,7 +518,7 @@
                 error.message]);
       }
     }
-    JUnitTestCase.fail(writer.toString());
+    fail(buffer.toString());
   }
 
   /**
diff --git a/pkg/analyzer/test/generated/utilities_test.dart b/pkg/analyzer/test/generated/utilities_test.dart
new file mode 100644
index 0000000..5aea6b7
--- /dev/null
+++ b/pkg/analyzer/test/generated/utilities_test.dart
@@ -0,0 +1,5308 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This code was auto-generated, is not intended to be edited, and is subject to
+// significant change. Please see the README file for more information.
+
+library engine.utilities_test;
+
+import 'dart:collection';
+
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/java_core.dart';
+import 'package:analyzer/src/generated/java_engine.dart';
+import 'package:analyzer/src/generated/scanner.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/generated/testing/ast_factory.dart';
+import 'package:analyzer/src/generated/testing/token_factory.dart';
+import 'package:analyzer/src/generated/utilities_collection.dart';
+import 'package:unittest/unittest.dart';
+
+import '../reflective_tests.dart';
+import 'test_support.dart';
+
+main() {
+  groupSep = ' | ';
+  runReflectiveTests(AstClonerTest);
+  runReflectiveTests(NodeReplacerTest);
+  runReflectiveTests(LineInfoTest);
+  runReflectiveTests(SourceRangeTest);
+  runReflectiveTests(BooleanArrayTest);
+  runReflectiveTests(DirectedGraphTest);
+  runReflectiveTests(ListUtilitiesTest);
+  runReflectiveTests(MultipleMapIteratorTest);
+  runReflectiveTests(SingleMapIteratorTest);
+  runReflectiveTests(TokenMapTest);
+  runReflectiveTests(StringUtilitiesTest);
+}
+
+class AstClonerTest extends EngineTestCase {
+  void test_visitAdjacentStrings() {
+    _assertClone(
+        AstFactory.adjacentStrings([AstFactory.string2("a"), AstFactory.string2("b")]));
+  }
+
+  void test_visitAnnotation_constant() {
+    _assertClone(AstFactory.annotation(AstFactory.identifier3("A")));
+  }
+
+  void test_visitAnnotation_constructor() {
+    _assertClone(
+        AstFactory.annotation2(
+            AstFactory.identifier3("A"),
+            AstFactory.identifier3("c"),
+            AstFactory.argumentList([])));
+  }
+
+  void test_visitArgumentList() {
+    _assertClone(
+        AstFactory.argumentList(
+            [AstFactory.identifier3("a"), AstFactory.identifier3("b")]));
+  }
+
+  void test_visitAsExpression() {
+    _assertClone(
+        AstFactory.asExpression(
+            AstFactory.identifier3("e"),
+            AstFactory.typeName4("T", [])));
+  }
+
+  void test_visitAssertStatement() {
+    _assertClone(AstFactory.assertStatement(AstFactory.identifier3("a")));
+  }
+
+  void test_visitAssignmentExpression() {
+    _assertClone(
+        AstFactory.assignmentExpression(
+            AstFactory.identifier3("a"),
+            TokenType.EQ,
+            AstFactory.identifier3("b")));
+  }
+
+  void test_visitAwaitExpression() {
+    _assertClone(AstFactory.awaitExpression(AstFactory.identifier3("a")));
+  }
+
+  void test_visitBinaryExpression() {
+    _assertClone(
+        AstFactory.binaryExpression(
+            AstFactory.identifier3("a"),
+            TokenType.PLUS,
+            AstFactory.identifier3("b")));
+  }
+
+  void test_visitBlockFunctionBody() {
+    _assertClone(AstFactory.blockFunctionBody2([]));
+  }
+
+  void test_visitBlock_empty() {
+    _assertClone(AstFactory.block([]));
+  }
+
+  void test_visitBlock_nonEmpty() {
+    _assertClone(
+        AstFactory.block([AstFactory.breakStatement(), AstFactory.breakStatement()]));
+  }
+
+  void test_visitBooleanLiteral_false() {
+    _assertClone(AstFactory.booleanLiteral(false));
+  }
+
+  void test_visitBooleanLiteral_true() {
+    _assertClone(AstFactory.booleanLiteral(true));
+  }
+
+  void test_visitBreakStatement_label() {
+    _assertClone(AstFactory.breakStatement2("l"));
+  }
+
+  void test_visitBreakStatement_noLabel() {
+    _assertClone(AstFactory.breakStatement());
+  }
+
+  void test_visitCascadeExpression_field() {
+    _assertClone(
+        AstFactory.cascadeExpression(
+            AstFactory.identifier3("a"),
+            [
+                AstFactory.cascadedPropertyAccess("b"),
+                AstFactory.cascadedPropertyAccess("c")]));
+  }
+
+  void test_visitCascadeExpression_index() {
+    _assertClone(
+        AstFactory.cascadeExpression(
+            AstFactory.identifier3("a"),
+            [
+                AstFactory.cascadedIndexExpression(AstFactory.integer(0)),
+                AstFactory.cascadedIndexExpression(AstFactory.integer(1))]));
+  }
+
+  void test_visitCascadeExpression_method() {
+    _assertClone(
+        AstFactory.cascadeExpression(
+            AstFactory.identifier3("a"),
+            [
+                AstFactory.cascadedMethodInvocation("b", []),
+                AstFactory.cascadedMethodInvocation("c", [])]));
+  }
+
+  void test_visitCatchClause_catch_noStack() {
+    _assertClone(AstFactory.catchClause("e", []));
+  }
+
+  void test_visitCatchClause_catch_stack() {
+    _assertClone(AstFactory.catchClause2("e", "s", []));
+  }
+
+  void test_visitCatchClause_on() {
+    _assertClone(AstFactory.catchClause3(AstFactory.typeName4("E", []), []));
+  }
+
+  void test_visitCatchClause_on_catch() {
+    _assertClone(
+        AstFactory.catchClause4(AstFactory.typeName4("E", []), "e", []));
+  }
+
+  void test_visitClassDeclaration_abstract() {
+    _assertClone(
+        AstFactory.classDeclaration(Keyword.ABSTRACT, "C", null, null, null, null, []));
+  }
+
+  void test_visitClassDeclaration_empty() {
+    _assertClone(
+        AstFactory.classDeclaration(null, "C", null, null, null, null, []));
+  }
+
+  void test_visitClassDeclaration_extends() {
+    _assertClone(
+        AstFactory.classDeclaration(
+            null,
+            "C",
+            null,
+            AstFactory.extendsClause(AstFactory.typeName4("A", [])),
+            null,
+            null,
+            []));
+  }
+
+  void test_visitClassDeclaration_extends_implements() {
+    _assertClone(
+        AstFactory.classDeclaration(
+            null,
+            "C",
+            null,
+            AstFactory.extendsClause(AstFactory.typeName4("A", [])),
+            null,
+            AstFactory.implementsClause([AstFactory.typeName4("B", [])]),
+            []));
+  }
+
+  void test_visitClassDeclaration_extends_with() {
+    _assertClone(
+        AstFactory.classDeclaration(
+            null,
+            "C",
+            null,
+            AstFactory.extendsClause(AstFactory.typeName4("A", [])),
+            AstFactory.withClause([AstFactory.typeName4("M", [])]),
+            null,
+            []));
+  }
+
+  void test_visitClassDeclaration_extends_with_implements() {
+    _assertClone(
+        AstFactory.classDeclaration(
+            null,
+            "C",
+            null,
+            AstFactory.extendsClause(AstFactory.typeName4("A", [])),
+            AstFactory.withClause([AstFactory.typeName4("M", [])]),
+            AstFactory.implementsClause([AstFactory.typeName4("B", [])]),
+            []));
+  }
+
+  void test_visitClassDeclaration_implements() {
+    _assertClone(
+        AstFactory.classDeclaration(
+            null,
+            "C",
+            null,
+            null,
+            null,
+            AstFactory.implementsClause([AstFactory.typeName4("B", [])]),
+            []));
+  }
+
+  void test_visitClassDeclaration_multipleMember() {
+    _assertClone(
+        AstFactory.classDeclaration(
+            null,
+            "C",
+            null,
+            null,
+            null,
+            null,
+            [
+                AstFactory.fieldDeclaration2(
+                    false,
+                    Keyword.VAR,
+                    [AstFactory.variableDeclaration("a")]),
+                AstFactory.fieldDeclaration2(
+                    false,
+                    Keyword.VAR,
+                    [AstFactory.variableDeclaration("b")])]));
+  }
+
+  void test_visitClassDeclaration_parameters() {
+    _assertClone(
+        AstFactory.classDeclaration(
+            null,
+            "C",
+            AstFactory.typeParameterList(["E"]),
+            null,
+            null,
+            null,
+            []));
+  }
+
+  void test_visitClassDeclaration_parameters_extends() {
+    _assertClone(
+        AstFactory.classDeclaration(
+            null,
+            "C",
+            AstFactory.typeParameterList(["E"]),
+            AstFactory.extendsClause(AstFactory.typeName4("A", [])),
+            null,
+            null,
+            []));
+  }
+
+  void test_visitClassDeclaration_parameters_extends_implements() {
+    _assertClone(
+        AstFactory.classDeclaration(
+            null,
+            "C",
+            AstFactory.typeParameterList(["E"]),
+            AstFactory.extendsClause(AstFactory.typeName4("A", [])),
+            null,
+            AstFactory.implementsClause([AstFactory.typeName4("B", [])]),
+            []));
+  }
+
+  void test_visitClassDeclaration_parameters_extends_with() {
+    _assertClone(
+        AstFactory.classDeclaration(
+            null,
+            "C",
+            AstFactory.typeParameterList(["E"]),
+            AstFactory.extendsClause(AstFactory.typeName4("A", [])),
+            AstFactory.withClause([AstFactory.typeName4("M", [])]),
+            null,
+            []));
+  }
+
+  void test_visitClassDeclaration_parameters_extends_with_implements() {
+    _assertClone(
+        AstFactory.classDeclaration(
+            null,
+            "C",
+            AstFactory.typeParameterList(["E"]),
+            AstFactory.extendsClause(AstFactory.typeName4("A", [])),
+            AstFactory.withClause([AstFactory.typeName4("M", [])]),
+            AstFactory.implementsClause([AstFactory.typeName4("B", [])]),
+            []));
+  }
+
+  void test_visitClassDeclaration_parameters_implements() {
+    _assertClone(
+        AstFactory.classDeclaration(
+            null,
+            "C",
+            AstFactory.typeParameterList(["E"]),
+            null,
+            null,
+            AstFactory.implementsClause([AstFactory.typeName4("B", [])]),
+            []));
+  }
+
+  void test_visitClassDeclaration_singleMember() {
+    _assertClone(
+        AstFactory.classDeclaration(
+            null,
+            "C",
+            null,
+            null,
+            null,
+            null,
+            [
+                AstFactory.fieldDeclaration2(
+                    false,
+                    Keyword.VAR,
+                    [AstFactory.variableDeclaration("a")])]));
+  }
+
+  void test_visitClassDeclaration_withMetadata() {
+    ClassDeclaration declaration =
+        AstFactory.classDeclaration(null, "C", null, null, null, null, []);
+    declaration.metadata =
+        AstFactory.list([AstFactory.annotation(AstFactory.identifier3("deprecated"))]);
+    _assertClone(declaration);
+  }
+
+  void test_visitClassTypeAlias_abstract() {
+    _assertClone(
+        AstFactory.classTypeAlias(
+            "C",
+            null,
+            Keyword.ABSTRACT,
+            AstFactory.typeName4("S", []),
+            AstFactory.withClause([AstFactory.typeName4("M1", [])]),
+            null));
+  }
+
+  void test_visitClassTypeAlias_abstract_implements() {
+    _assertClone(
+        AstFactory.classTypeAlias(
+            "C",
+            null,
+            Keyword.ABSTRACT,
+            AstFactory.typeName4("S", []),
+            AstFactory.withClause([AstFactory.typeName4("M1", [])]),
+            AstFactory.implementsClause([AstFactory.typeName4("I", [])])));
+  }
+
+  void test_visitClassTypeAlias_generic() {
+    _assertClone(
+        AstFactory.classTypeAlias(
+            "C",
+            AstFactory.typeParameterList(["E"]),
+            null,
+            AstFactory.typeName4("S", [AstFactory.typeName4("E", [])]),
+            AstFactory.withClause(
+                [AstFactory.typeName4("M1", [AstFactory.typeName4("E", [])])]),
+            null));
+  }
+
+  void test_visitClassTypeAlias_implements() {
+    _assertClone(
+        AstFactory.classTypeAlias(
+            "C",
+            null,
+            null,
+            AstFactory.typeName4("S", []),
+            AstFactory.withClause([AstFactory.typeName4("M1", [])]),
+            AstFactory.implementsClause([AstFactory.typeName4("I", [])])));
+  }
+
+  void test_visitClassTypeAlias_minimal() {
+    _assertClone(
+        AstFactory.classTypeAlias(
+            "C",
+            null,
+            null,
+            AstFactory.typeName4("S", []),
+            AstFactory.withClause([AstFactory.typeName4("M1", [])]),
+            null));
+  }
+
+  void test_visitClassTypeAlias_parameters_abstract() {
+    _assertClone(
+        AstFactory.classTypeAlias(
+            "C",
+            AstFactory.typeParameterList(["E"]),
+            Keyword.ABSTRACT,
+            AstFactory.typeName4("S", []),
+            AstFactory.withClause([AstFactory.typeName4("M1", [])]),
+            null));
+  }
+
+  void test_visitClassTypeAlias_parameters_abstract_implements() {
+    _assertClone(
+        AstFactory.classTypeAlias(
+            "C",
+            AstFactory.typeParameterList(["E"]),
+            Keyword.ABSTRACT,
+            AstFactory.typeName4("S", []),
+            AstFactory.withClause([AstFactory.typeName4("M1", [])]),
+            AstFactory.implementsClause([AstFactory.typeName4("I", [])])));
+  }
+
+  void test_visitClassTypeAlias_parameters_implements() {
+    _assertClone(
+        AstFactory.classTypeAlias(
+            "C",
+            AstFactory.typeParameterList(["E"]),
+            null,
+            AstFactory.typeName4("S", []),
+            AstFactory.withClause([AstFactory.typeName4("M1", [])]),
+            AstFactory.implementsClause([AstFactory.typeName4("I", [])])));
+  }
+
+  void test_visitClassTypeAlias_withMetadata() {
+    ClassTypeAlias declaration = AstFactory.classTypeAlias(
+        "C",
+        null,
+        null,
+        AstFactory.typeName4("S", []),
+        AstFactory.withClause([AstFactory.typeName4("M1", [])]),
+        null);
+    declaration.metadata =
+        AstFactory.list([AstFactory.annotation(AstFactory.identifier3("deprecated"))]);
+    _assertClone(declaration);
+  }
+
+  void test_visitComment() {
+    _assertClone(
+        Comment.createBlockComment(
+            <Token>[TokenFactory.tokenFromString("/* comment */")]));
+  }
+
+  void test_visitCommentReference() {
+    _assertClone(new CommentReference(null, AstFactory.identifier3("a")));
+  }
+
+  void test_visitCompilationUnit_declaration() {
+    _assertClone(
+        AstFactory.compilationUnit2(
+            [
+                AstFactory.topLevelVariableDeclaration2(
+                    Keyword.VAR,
+                    [AstFactory.variableDeclaration("a")])]));
+  }
+
+  void test_visitCompilationUnit_directive() {
+    _assertClone(
+        AstFactory.compilationUnit3([AstFactory.libraryDirective2("l")]));
+  }
+
+  void test_visitCompilationUnit_directive_declaration() {
+    _assertClone(
+        AstFactory.compilationUnit4(
+            AstFactory.list([AstFactory.libraryDirective2("l")]),
+            AstFactory.list(
+                [
+                    AstFactory.topLevelVariableDeclaration2(
+                        Keyword.VAR,
+                        [AstFactory.variableDeclaration("a")])])));
+  }
+
+  void test_visitCompilationUnit_empty() {
+    _assertClone(AstFactory.compilationUnit());
+  }
+
+  void test_visitCompilationUnit_script() {
+    _assertClone(AstFactory.compilationUnit5("!#/bin/dartvm"));
+  }
+
+  void test_visitCompilationUnit_script_declaration() {
+    _assertClone(
+        AstFactory.compilationUnit6(
+            "!#/bin/dartvm",
+            [
+                AstFactory.topLevelVariableDeclaration2(
+                    Keyword.VAR,
+                    [AstFactory.variableDeclaration("a")])]));
+  }
+
+  void test_visitCompilationUnit_script_directive() {
+    _assertClone(
+        AstFactory.compilationUnit7(
+            "!#/bin/dartvm",
+            [AstFactory.libraryDirective2("l")]));
+  }
+
+  void test_visitCompilationUnit_script_directives_declarations() {
+    _assertClone(
+        AstFactory.compilationUnit8(
+            "!#/bin/dartvm",
+            AstFactory.list([AstFactory.libraryDirective2("l")]),
+            AstFactory.list(
+                [
+                    AstFactory.topLevelVariableDeclaration2(
+                        Keyword.VAR,
+                        [AstFactory.variableDeclaration("a")])])));
+  }
+
+  void test_visitConditionalExpression() {
+    _assertClone(
+        AstFactory.conditionalExpression(
+            AstFactory.identifier3("a"),
+            AstFactory.identifier3("b"),
+            AstFactory.identifier3("c")));
+  }
+
+  void test_visitConstructorDeclaration_const() {
+    _assertClone(
+        AstFactory.constructorDeclaration2(
+            Keyword.CONST,
+            null,
+            AstFactory.identifier3("C"),
+            null,
+            AstFactory.formalParameterList([]),
+            null,
+            AstFactory.blockFunctionBody2([])));
+  }
+
+  void test_visitConstructorDeclaration_external() {
+    _assertClone(
+        AstFactory.constructorDeclaration(
+            AstFactory.identifier3("C"),
+            null,
+            AstFactory.formalParameterList([]),
+            null));
+  }
+
+  void test_visitConstructorDeclaration_minimal() {
+    _assertClone(
+        AstFactory.constructorDeclaration2(
+            null,
+            null,
+            AstFactory.identifier3("C"),
+            null,
+            AstFactory.formalParameterList([]),
+            null,
+            AstFactory.blockFunctionBody2([])));
+  }
+
+  void test_visitConstructorDeclaration_multipleInitializers() {
+    _assertClone(
+        AstFactory.constructorDeclaration2(
+            null,
+            null,
+            AstFactory.identifier3("C"),
+            null,
+            AstFactory.formalParameterList([]),
+            AstFactory.list(
+                [
+                    AstFactory.constructorFieldInitializer(false, "a", AstFactory.identifier3("b")),
+                    AstFactory.constructorFieldInitializer(
+                        false,
+                        "c",
+                        AstFactory.identifier3("d"))]),
+            AstFactory.blockFunctionBody2([])));
+  }
+
+  void test_visitConstructorDeclaration_multipleParameters() {
+    _assertClone(
+        AstFactory.constructorDeclaration2(
+            null,
+            null,
+            AstFactory.identifier3("C"),
+            null,
+            AstFactory.formalParameterList(
+                [
+                    AstFactory.simpleFormalParameter(Keyword.VAR, "a"),
+                    AstFactory.simpleFormalParameter(Keyword.VAR, "b")]),
+            null,
+            AstFactory.blockFunctionBody2([])));
+  }
+
+  void test_visitConstructorDeclaration_named() {
+    _assertClone(
+        AstFactory.constructorDeclaration2(
+            null,
+            null,
+            AstFactory.identifier3("C"),
+            "m",
+            AstFactory.formalParameterList([]),
+            null,
+            AstFactory.blockFunctionBody2([])));
+  }
+
+  void test_visitConstructorDeclaration_singleInitializer() {
+    _assertClone(
+        AstFactory.constructorDeclaration2(
+            null,
+            null,
+            AstFactory.identifier3("C"),
+            null,
+            AstFactory.formalParameterList([]),
+            AstFactory.list(
+                [
+                    AstFactory.constructorFieldInitializer(
+                        false,
+                        "a",
+                        AstFactory.identifier3("b"))]),
+            AstFactory.blockFunctionBody2([])));
+  }
+
+  void test_visitConstructorDeclaration_withMetadata() {
+    ConstructorDeclaration declaration = AstFactory.constructorDeclaration2(
+        null,
+        null,
+        AstFactory.identifier3("C"),
+        null,
+        AstFactory.formalParameterList([]),
+        null,
+        AstFactory.blockFunctionBody2([]));
+    declaration.metadata =
+        AstFactory.list([AstFactory.annotation(AstFactory.identifier3("deprecated"))]);
+    _assertClone(declaration);
+  }
+
+  void test_visitConstructorFieldInitializer_withThis() {
+    _assertClone(
+        AstFactory.constructorFieldInitializer(true, "a", AstFactory.identifier3("b")));
+  }
+
+  void test_visitConstructorFieldInitializer_withoutThis() {
+    _assertClone(
+        AstFactory.constructorFieldInitializer(
+            false,
+            "a",
+            AstFactory.identifier3("b")));
+  }
+
+  void test_visitConstructorName_named_prefix() {
+    _assertClone(
+        AstFactory.constructorName(AstFactory.typeName4("p.C.n", []), null));
+  }
+
+  void test_visitConstructorName_unnamed_noPrefix() {
+    _assertClone(
+        AstFactory.constructorName(AstFactory.typeName4("C", []), null));
+  }
+
+  void test_visitConstructorName_unnamed_prefix() {
+    _assertClone(
+        AstFactory.constructorName(
+            AstFactory.typeName3(AstFactory.identifier5("p", "C"), []),
+            null));
+  }
+
+  void test_visitContinueStatement_label() {
+    _assertClone(AstFactory.continueStatement("l"));
+  }
+
+  void test_visitContinueStatement_noLabel() {
+    _assertClone(AstFactory.continueStatement());
+  }
+
+  void test_visitDefaultFormalParameter_named_noValue() {
+    _assertClone(
+        AstFactory.namedFormalParameter(AstFactory.simpleFormalParameter3("p"), null));
+  }
+
+  void test_visitDefaultFormalParameter_named_value() {
+    _assertClone(
+        AstFactory.namedFormalParameter(
+            AstFactory.simpleFormalParameter3("p"),
+            AstFactory.integer(0)));
+  }
+
+  void test_visitDefaultFormalParameter_positional_noValue() {
+    _assertClone(
+        AstFactory.positionalFormalParameter(
+            AstFactory.simpleFormalParameter3("p"),
+            null));
+  }
+
+  void test_visitDefaultFormalParameter_positional_value() {
+    _assertClone(
+        AstFactory.positionalFormalParameter(
+            AstFactory.simpleFormalParameter3("p"),
+            AstFactory.integer(0)));
+  }
+
+  void test_visitDoStatement() {
+    _assertClone(
+        AstFactory.doStatement(AstFactory.block([]), AstFactory.identifier3("c")));
+  }
+
+  void test_visitDoubleLiteral() {
+    _assertClone(AstFactory.doubleLiteral(4.2));
+  }
+
+  void test_visitEmptyFunctionBody() {
+    _assertClone(AstFactory.emptyFunctionBody());
+  }
+
+  void test_visitEmptyStatement() {
+    _assertClone(AstFactory.emptyStatement());
+  }
+
+  void test_visitExportDirective_combinator() {
+    _assertClone(
+        AstFactory.exportDirective2(
+            "a.dart",
+            [AstFactory.showCombinator([AstFactory.identifier3("A")])]));
+  }
+
+  void test_visitExportDirective_combinators() {
+    _assertClone(
+        AstFactory.exportDirective2(
+            "a.dart",
+            [
+                AstFactory.showCombinator([AstFactory.identifier3("A")]),
+                AstFactory.hideCombinator([AstFactory.identifier3("B")])]));
+  }
+
+  void test_visitExportDirective_minimal() {
+    _assertClone(AstFactory.exportDirective2("a.dart", []));
+  }
+
+  void test_visitExportDirective_withMetadata() {
+    ExportDirective directive = AstFactory.exportDirective2("a.dart", []);
+    directive.metadata =
+        AstFactory.list([AstFactory.annotation(AstFactory.identifier3("deprecated"))]);
+    _assertClone(directive);
+  }
+
+  void test_visitExpressionFunctionBody() {
+    _assertClone(
+        AstFactory.expressionFunctionBody(AstFactory.identifier3("a")));
+  }
+
+  void test_visitExpressionStatement() {
+    _assertClone(AstFactory.expressionStatement(AstFactory.identifier3("a")));
+  }
+
+  void test_visitExtendsClause() {
+    _assertClone(AstFactory.extendsClause(AstFactory.typeName4("C", [])));
+  }
+
+  void test_visitFieldDeclaration_instance() {
+    _assertClone(
+        AstFactory.fieldDeclaration2(
+            false,
+            Keyword.VAR,
+            [AstFactory.variableDeclaration("a")]));
+  }
+
+  void test_visitFieldDeclaration_static() {
+    _assertClone(
+        AstFactory.fieldDeclaration2(
+            true,
+            Keyword.VAR,
+            [AstFactory.variableDeclaration("a")]));
+  }
+
+  void test_visitFieldDeclaration_withMetadata() {
+    FieldDeclaration declaration = AstFactory.fieldDeclaration2(
+        false,
+        Keyword.VAR,
+        [AstFactory.variableDeclaration("a")]);
+    declaration.metadata =
+        AstFactory.list([AstFactory.annotation(AstFactory.identifier3("deprecated"))]);
+    _assertClone(declaration);
+  }
+
+  void test_visitFieldFormalParameter_functionTyped() {
+    _assertClone(
+        AstFactory.fieldFormalParameter(
+            null,
+            AstFactory.typeName4("A", []),
+            "a",
+            AstFactory.formalParameterList([AstFactory.simpleFormalParameter3("b")])));
+  }
+
+  void test_visitFieldFormalParameter_keyword() {
+    _assertClone(AstFactory.fieldFormalParameter(Keyword.VAR, null, "a"));
+  }
+
+  void test_visitFieldFormalParameter_keywordAndType() {
+    _assertClone(
+        AstFactory.fieldFormalParameter(
+            Keyword.FINAL,
+            AstFactory.typeName4("A", []),
+            "a"));
+  }
+
+  void test_visitFieldFormalParameter_type() {
+    _assertClone(
+        AstFactory.fieldFormalParameter(null, AstFactory.typeName4("A", []), "a"));
+  }
+
+  void test_visitForEachStatement_declared() {
+    _assertClone(
+        AstFactory.forEachStatement(
+            AstFactory.declaredIdentifier3("a"),
+            AstFactory.identifier3("b"),
+            AstFactory.block([])));
+  }
+
+  void test_visitForEachStatement_variable() {
+    _assertClone(
+        new ForEachStatement.con2(
+            null,
+            TokenFactory.tokenFromKeyword(Keyword.FOR),
+            TokenFactory.tokenFromType(TokenType.OPEN_PAREN),
+            AstFactory.identifier3("a"),
+            TokenFactory.tokenFromKeyword(Keyword.IN),
+            AstFactory.identifier3("b"),
+            TokenFactory.tokenFromType(TokenType.CLOSE_PAREN),
+            AstFactory.block([])));
+  }
+
+  void test_visitForEachStatement_variable_await() {
+    _assertClone(
+        new ForEachStatement.con2(
+            TokenFactory.tokenFromString("await"),
+            TokenFactory.tokenFromKeyword(Keyword.FOR),
+            TokenFactory.tokenFromType(TokenType.OPEN_PAREN),
+            AstFactory.identifier3("a"),
+            TokenFactory.tokenFromKeyword(Keyword.IN),
+            AstFactory.identifier3("b"),
+            TokenFactory.tokenFromType(TokenType.CLOSE_PAREN),
+            AstFactory.block([])));
+  }
+
+  void test_visitForStatement_c() {
+    _assertClone(
+        AstFactory.forStatement(
+            null,
+            AstFactory.identifier3("c"),
+            null,
+            AstFactory.block([])));
+  }
+
+  void test_visitForStatement_cu() {
+    _assertClone(
+        AstFactory.forStatement(
+            null,
+            AstFactory.identifier3("c"),
+            AstFactory.list([AstFactory.identifier3("u")]),
+            AstFactory.block([])));
+  }
+
+  void test_visitForStatement_e() {
+    _assertClone(
+        AstFactory.forStatement(
+            AstFactory.identifier3("e"),
+            null,
+            null,
+            AstFactory.block([])));
+  }
+
+  void test_visitForStatement_ec() {
+    _assertClone(
+        AstFactory.forStatement(
+            AstFactory.identifier3("e"),
+            AstFactory.identifier3("c"),
+            null,
+            AstFactory.block([])));
+  }
+
+  void test_visitForStatement_ecu() {
+    _assertClone(
+        AstFactory.forStatement(
+            AstFactory.identifier3("e"),
+            AstFactory.identifier3("c"),
+            AstFactory.list([AstFactory.identifier3("u")]),
+            AstFactory.block([])));
+  }
+
+  void test_visitForStatement_eu() {
+    _assertClone(
+        AstFactory.forStatement(
+            AstFactory.identifier3("e"),
+            null,
+            AstFactory.list([AstFactory.identifier3("u")]),
+            AstFactory.block([])));
+  }
+
+  void test_visitForStatement_i() {
+    _assertClone(
+        AstFactory.forStatement2(
+            AstFactory.variableDeclarationList2(
+                Keyword.VAR,
+                [AstFactory.variableDeclaration("i")]),
+            null,
+            null,
+            AstFactory.block([])));
+  }
+
+  void test_visitForStatement_ic() {
+    _assertClone(
+        AstFactory.forStatement2(
+            AstFactory.variableDeclarationList2(
+                Keyword.VAR,
+                [AstFactory.variableDeclaration("i")]),
+            AstFactory.identifier3("c"),
+            null,
+            AstFactory.block([])));
+  }
+
+  void test_visitForStatement_icu() {
+    _assertClone(
+        AstFactory.forStatement2(
+            AstFactory.variableDeclarationList2(
+                Keyword.VAR,
+                [AstFactory.variableDeclaration("i")]),
+            AstFactory.identifier3("c"),
+            AstFactory.list([AstFactory.identifier3("u")]),
+            AstFactory.block([])));
+  }
+
+  void test_visitForStatement_iu() {
+    _assertClone(
+        AstFactory.forStatement2(
+            AstFactory.variableDeclarationList2(
+                Keyword.VAR,
+                [AstFactory.variableDeclaration("i")]),
+            null,
+            AstFactory.list([AstFactory.identifier3("u")]),
+            AstFactory.block([])));
+  }
+
+  void test_visitForStatement_u() {
+    _assertClone(
+        AstFactory.forStatement(
+            null,
+            null,
+            AstFactory.list([AstFactory.identifier3("u")]),
+            AstFactory.block([])));
+  }
+
+  void test_visitFormalParameterList_empty() {
+    _assertClone(AstFactory.formalParameterList([]));
+  }
+
+  void test_visitFormalParameterList_n() {
+    _assertClone(
+        AstFactory.formalParameterList(
+            [
+                AstFactory.namedFormalParameter(
+                    AstFactory.simpleFormalParameter3("a"),
+                    AstFactory.integer(0))]));
+  }
+
+  void test_visitFormalParameterList_nn() {
+    _assertClone(
+        AstFactory.formalParameterList(
+            [
+                AstFactory.namedFormalParameter(
+                    AstFactory.simpleFormalParameter3("a"),
+                    AstFactory.integer(0)),
+                AstFactory.namedFormalParameter(
+                    AstFactory.simpleFormalParameter3("b"),
+                    AstFactory.integer(1))]));
+  }
+
+  void test_visitFormalParameterList_p() {
+    _assertClone(
+        AstFactory.formalParameterList(
+            [
+                AstFactory.positionalFormalParameter(
+                    AstFactory.simpleFormalParameter3("a"),
+                    AstFactory.integer(0))]));
+  }
+
+  void test_visitFormalParameterList_pp() {
+    _assertClone(
+        AstFactory.formalParameterList(
+            [
+                AstFactory.positionalFormalParameter(
+                    AstFactory.simpleFormalParameter3("a"),
+                    AstFactory.integer(0)),
+                AstFactory.positionalFormalParameter(
+                    AstFactory.simpleFormalParameter3("b"),
+                    AstFactory.integer(1))]));
+  }
+
+  void test_visitFormalParameterList_r() {
+    _assertClone(
+        AstFactory.formalParameterList([AstFactory.simpleFormalParameter3("a")]));
+  }
+
+  void test_visitFormalParameterList_rn() {
+    _assertClone(
+        AstFactory.formalParameterList(
+            [
+                AstFactory.simpleFormalParameter3("a"),
+                AstFactory.namedFormalParameter(
+                    AstFactory.simpleFormalParameter3("b"),
+                    AstFactory.integer(1))]));
+  }
+
+  void test_visitFormalParameterList_rnn() {
+    _assertClone(
+        AstFactory.formalParameterList(
+            [
+                AstFactory.simpleFormalParameter3("a"),
+                AstFactory.namedFormalParameter(
+                    AstFactory.simpleFormalParameter3("b"),
+                    AstFactory.integer(1)),
+                AstFactory.namedFormalParameter(
+                    AstFactory.simpleFormalParameter3("c"),
+                    AstFactory.integer(2))]));
+  }
+
+  void test_visitFormalParameterList_rp() {
+    _assertClone(
+        AstFactory.formalParameterList(
+            [
+                AstFactory.simpleFormalParameter3("a"),
+                AstFactory.positionalFormalParameter(
+                    AstFactory.simpleFormalParameter3("b"),
+                    AstFactory.integer(1))]));
+  }
+
+  void test_visitFormalParameterList_rpp() {
+    _assertClone(
+        AstFactory.formalParameterList(
+            [
+                AstFactory.simpleFormalParameter3("a"),
+                AstFactory.positionalFormalParameter(
+                    AstFactory.simpleFormalParameter3("b"),
+                    AstFactory.integer(1)),
+                AstFactory.positionalFormalParameter(
+                    AstFactory.simpleFormalParameter3("c"),
+                    AstFactory.integer(2))]));
+  }
+
+  void test_visitFormalParameterList_rr() {
+    _assertClone(
+        AstFactory.formalParameterList(
+            [
+                AstFactory.simpleFormalParameter3("a"),
+                AstFactory.simpleFormalParameter3("b")]));
+  }
+
+  void test_visitFormalParameterList_rrn() {
+    _assertClone(
+        AstFactory.formalParameterList(
+            [
+                AstFactory.simpleFormalParameter3("a"),
+                AstFactory.simpleFormalParameter3("b"),
+                AstFactory.namedFormalParameter(
+                    AstFactory.simpleFormalParameter3("c"),
+                    AstFactory.integer(3))]));
+  }
+
+  void test_visitFormalParameterList_rrnn() {
+    _assertClone(
+        AstFactory.formalParameterList(
+            [
+                AstFactory.simpleFormalParameter3("a"),
+                AstFactory.simpleFormalParameter3("b"),
+                AstFactory.namedFormalParameter(
+                    AstFactory.simpleFormalParameter3("c"),
+                    AstFactory.integer(3)),
+                AstFactory.namedFormalParameter(
+                    AstFactory.simpleFormalParameter3("d"),
+                    AstFactory.integer(4))]));
+  }
+
+  void test_visitFormalParameterList_rrp() {
+    _assertClone(
+        AstFactory.formalParameterList(
+            [
+                AstFactory.simpleFormalParameter3("a"),
+                AstFactory.simpleFormalParameter3("b"),
+                AstFactory.positionalFormalParameter(
+                    AstFactory.simpleFormalParameter3("c"),
+                    AstFactory.integer(3))]));
+  }
+
+  void test_visitFormalParameterList_rrpp() {
+    _assertClone(
+        AstFactory.formalParameterList(
+            [
+                AstFactory.simpleFormalParameter3("a"),
+                AstFactory.simpleFormalParameter3("b"),
+                AstFactory.positionalFormalParameter(
+                    AstFactory.simpleFormalParameter3("c"),
+                    AstFactory.integer(3)),
+                AstFactory.positionalFormalParameter(
+                    AstFactory.simpleFormalParameter3("d"),
+                    AstFactory.integer(4))]));
+  }
+
+  void test_visitFunctionDeclarationStatement() {
+    _assertClone(
+        AstFactory.functionDeclarationStatement(
+            null,
+            null,
+            "f",
+            AstFactory.functionExpression()));
+  }
+
+  void test_visitFunctionDeclaration_getter() {
+    _assertClone(
+        AstFactory.functionDeclaration(
+            null,
+            Keyword.GET,
+            "f",
+            AstFactory.functionExpression()));
+  }
+
+  void test_visitFunctionDeclaration_normal() {
+    _assertClone(
+        AstFactory.functionDeclaration(
+            null,
+            null,
+            "f",
+            AstFactory.functionExpression()));
+  }
+
+  void test_visitFunctionDeclaration_setter() {
+    _assertClone(
+        AstFactory.functionDeclaration(
+            null,
+            Keyword.SET,
+            "f",
+            AstFactory.functionExpression()));
+  }
+
+  void test_visitFunctionDeclaration_withMetadata() {
+    FunctionDeclaration declaration = AstFactory.functionDeclaration(
+        null,
+        null,
+        "f",
+        AstFactory.functionExpression());
+    declaration.metadata =
+        AstFactory.list([AstFactory.annotation(AstFactory.identifier3("deprecated"))]);
+    _assertClone(declaration);
+  }
+
+  void test_visitFunctionExpression() {
+    _assertClone(AstFactory.functionExpression());
+  }
+
+  void test_visitFunctionExpressionInvocation() {
+    _assertClone(
+        AstFactory.functionExpressionInvocation(AstFactory.identifier3("f"), []));
+  }
+
+  void test_visitFunctionTypeAlias_generic() {
+    _assertClone(
+        AstFactory.typeAlias(
+            AstFactory.typeName4("A", []),
+            "F",
+            AstFactory.typeParameterList(["B"]),
+            AstFactory.formalParameterList([])));
+  }
+
+  void test_visitFunctionTypeAlias_nonGeneric() {
+    _assertClone(
+        AstFactory.typeAlias(
+            AstFactory.typeName4("A", []),
+            "F",
+            null,
+            AstFactory.formalParameterList([])));
+  }
+
+  void test_visitFunctionTypeAlias_withMetadata() {
+    FunctionTypeAlias declaration = AstFactory.typeAlias(
+        AstFactory.typeName4("A", []),
+        "F",
+        null,
+        AstFactory.formalParameterList([]));
+    declaration.metadata =
+        AstFactory.list([AstFactory.annotation(AstFactory.identifier3("deprecated"))]);
+    _assertClone(declaration);
+  }
+
+  void test_visitFunctionTypedFormalParameter_noType() {
+    _assertClone(AstFactory.functionTypedFormalParameter(null, "f", []));
+  }
+
+  void test_visitFunctionTypedFormalParameter_type() {
+    _assertClone(
+        AstFactory.functionTypedFormalParameter(
+            AstFactory.typeName4("T", []),
+            "f",
+            []));
+  }
+
+  void test_visitIfStatement_withElse() {
+    _assertClone(
+        AstFactory.ifStatement2(
+            AstFactory.identifier3("c"),
+            AstFactory.block([]),
+            AstFactory.block([])));
+  }
+
+  void test_visitIfStatement_withoutElse() {
+    _assertClone(
+        AstFactory.ifStatement(AstFactory.identifier3("c"), AstFactory.block([])));
+  }
+
+  void test_visitImplementsClause_multiple() {
+    _assertClone(
+        AstFactory.implementsClause(
+            [AstFactory.typeName4("A", []), AstFactory.typeName4("B", [])]));
+  }
+
+  void test_visitImplementsClause_single() {
+    _assertClone(AstFactory.implementsClause([AstFactory.typeName4("A", [])]));
+  }
+
+  void test_visitImportDirective_combinator() {
+    _assertClone(
+        AstFactory.importDirective3(
+            "a.dart",
+            null,
+            [AstFactory.showCombinator([AstFactory.identifier3("A")])]));
+  }
+
+  void test_visitImportDirective_combinators() {
+    _assertClone(
+        AstFactory.importDirective3(
+            "a.dart",
+            null,
+            [
+                AstFactory.showCombinator([AstFactory.identifier3("A")]),
+                AstFactory.hideCombinator([AstFactory.identifier3("B")])]));
+  }
+
+  void test_visitImportDirective_minimal() {
+    _assertClone(AstFactory.importDirective3("a.dart", null, []));
+  }
+
+  void test_visitImportDirective_prefix() {
+    _assertClone(AstFactory.importDirective3("a.dart", "p", []));
+  }
+
+  void test_visitImportDirective_prefix_combinator() {
+    _assertClone(
+        AstFactory.importDirective3(
+            "a.dart",
+            "p",
+            [AstFactory.showCombinator([AstFactory.identifier3("A")])]));
+  }
+
+  void test_visitImportDirective_prefix_combinators() {
+    _assertClone(
+        AstFactory.importDirective3(
+            "a.dart",
+            "p",
+            [
+                AstFactory.showCombinator([AstFactory.identifier3("A")]),
+                AstFactory.hideCombinator([AstFactory.identifier3("B")])]));
+  }
+
+  void test_visitImportDirective_withMetadata() {
+    ImportDirective directive = AstFactory.importDirective3("a.dart", null, []);
+    directive.metadata =
+        AstFactory.list([AstFactory.annotation(AstFactory.identifier3("deprecated"))]);
+    _assertClone(directive);
+  }
+
+  void test_visitImportHideCombinator_multiple() {
+    _assertClone(
+        AstFactory.hideCombinator(
+            [AstFactory.identifier3("a"), AstFactory.identifier3("b")]));
+  }
+
+  void test_visitImportHideCombinator_single() {
+    _assertClone(AstFactory.hideCombinator([AstFactory.identifier3("a")]));
+  }
+
+  void test_visitImportShowCombinator_multiple() {
+    _assertClone(
+        AstFactory.showCombinator(
+            [AstFactory.identifier3("a"), AstFactory.identifier3("b")]));
+  }
+
+  void test_visitImportShowCombinator_single() {
+    _assertClone(AstFactory.showCombinator([AstFactory.identifier3("a")]));
+  }
+
+  void test_visitIndexExpression() {
+    _assertClone(
+        AstFactory.indexExpression(
+            AstFactory.identifier3("a"),
+            AstFactory.identifier3("i")));
+  }
+
+  void test_visitInstanceCreationExpression_const() {
+    _assertClone(
+        AstFactory.instanceCreationExpression2(
+            Keyword.CONST,
+            AstFactory.typeName4("C", []),
+            []));
+  }
+
+  void test_visitInstanceCreationExpression_named() {
+    _assertClone(
+        AstFactory.instanceCreationExpression3(
+            Keyword.NEW,
+            AstFactory.typeName4("C", []),
+            "c",
+            []));
+  }
+
+  void test_visitInstanceCreationExpression_unnamed() {
+    _assertClone(
+        AstFactory.instanceCreationExpression2(
+            Keyword.NEW,
+            AstFactory.typeName4("C", []),
+            []));
+  }
+
+  void test_visitIntegerLiteral() {
+    _assertClone(AstFactory.integer(42));
+  }
+
+  void test_visitInterpolationExpression_expression() {
+    _assertClone(
+        AstFactory.interpolationExpression(AstFactory.identifier3("a")));
+  }
+
+  void test_visitInterpolationExpression_identifier() {
+    _assertClone(AstFactory.interpolationExpression2("a"));
+  }
+
+  void test_visitInterpolationString() {
+    _assertClone(AstFactory.interpolationString("'x", "x"));
+  }
+
+  void test_visitIsExpression_negated() {
+    _assertClone(
+        AstFactory.isExpression(
+            AstFactory.identifier3("a"),
+            true,
+            AstFactory.typeName4("C", [])));
+  }
+
+  void test_visitIsExpression_normal() {
+    _assertClone(
+        AstFactory.isExpression(
+            AstFactory.identifier3("a"),
+            false,
+            AstFactory.typeName4("C", [])));
+  }
+
+  void test_visitLabel() {
+    _assertClone(AstFactory.label2("a"));
+  }
+
+  void test_visitLabeledStatement_multiple() {
+    _assertClone(
+        AstFactory.labeledStatement(
+            AstFactory.list([AstFactory.label2("a"), AstFactory.label2("b")]),
+            AstFactory.returnStatement()));
+  }
+
+  void test_visitLabeledStatement_single() {
+    _assertClone(
+        AstFactory.labeledStatement(
+            AstFactory.list([AstFactory.label2("a")]),
+            AstFactory.returnStatement()));
+  }
+
+  void test_visitLibraryDirective() {
+    _assertClone(AstFactory.libraryDirective2("l"));
+  }
+
+  void test_visitLibraryDirective_withMetadata() {
+    LibraryDirective directive = AstFactory.libraryDirective2("l");
+    directive.metadata =
+        AstFactory.list([AstFactory.annotation(AstFactory.identifier3("deprecated"))]);
+    _assertClone(directive);
+  }
+
+  void test_visitLibraryIdentifier_multiple() {
+    _assertClone(
+        AstFactory.libraryIdentifier(
+            [
+                AstFactory.identifier3("a"),
+                AstFactory.identifier3("b"),
+                AstFactory.identifier3("c")]));
+  }
+
+  void test_visitLibraryIdentifier_single() {
+    _assertClone(AstFactory.libraryIdentifier([AstFactory.identifier3("a")]));
+  }
+
+  void test_visitListLiteral_const() {
+    _assertClone(AstFactory.listLiteral2(Keyword.CONST, null, []));
+  }
+
+  void test_visitListLiteral_empty() {
+    _assertClone(AstFactory.listLiteral([]));
+  }
+
+  void test_visitListLiteral_nonEmpty() {
+    _assertClone(
+        AstFactory.listLiteral(
+            [
+                AstFactory.identifier3("a"),
+                AstFactory.identifier3("b"),
+                AstFactory.identifier3("c")]));
+  }
+
+  void test_visitMapLiteralEntry() {
+    _assertClone(AstFactory.mapLiteralEntry("a", AstFactory.identifier3("b")));
+  }
+
+  void test_visitMapLiteral_const() {
+    _assertClone(AstFactory.mapLiteral(Keyword.CONST, null, []));
+  }
+
+  void test_visitMapLiteral_empty() {
+    _assertClone(AstFactory.mapLiteral2([]));
+  }
+
+  void test_visitMapLiteral_nonEmpty() {
+    _assertClone(
+        AstFactory.mapLiteral2(
+            [
+                AstFactory.mapLiteralEntry("a", AstFactory.identifier3("a")),
+                AstFactory.mapLiteralEntry("b", AstFactory.identifier3("b")),
+                AstFactory.mapLiteralEntry("c", AstFactory.identifier3("c"))]));
+  }
+
+  void test_visitMethodDeclaration_external() {
+    _assertClone(
+        AstFactory.methodDeclaration(
+            null,
+            null,
+            null,
+            null,
+            AstFactory.identifier3("m"),
+            AstFactory.formalParameterList([])));
+  }
+
+  void test_visitMethodDeclaration_external_returnType() {
+    _assertClone(
+        AstFactory.methodDeclaration(
+            null,
+            AstFactory.typeName4("T", []),
+            null,
+            null,
+            AstFactory.identifier3("m"),
+            AstFactory.formalParameterList([])));
+  }
+
+  void test_visitMethodDeclaration_getter() {
+    _assertClone(
+        AstFactory.methodDeclaration2(
+            null,
+            null,
+            Keyword.GET,
+            null,
+            AstFactory.identifier3("m"),
+            null,
+            AstFactory.blockFunctionBody2([])));
+  }
+
+  void test_visitMethodDeclaration_getter_returnType() {
+    _assertClone(
+        AstFactory.methodDeclaration2(
+            null,
+            AstFactory.typeName4("T", []),
+            Keyword.GET,
+            null,
+            AstFactory.identifier3("m"),
+            null,
+            AstFactory.blockFunctionBody2([])));
+  }
+
+  void test_visitMethodDeclaration_getter_seturnType() {
+    _assertClone(
+        AstFactory.methodDeclaration2(
+            null,
+            AstFactory.typeName4("T", []),
+            Keyword.SET,
+            null,
+            AstFactory.identifier3("m"),
+            AstFactory.formalParameterList(
+                [AstFactory.simpleFormalParameter(Keyword.VAR, "v")]),
+            AstFactory.blockFunctionBody2([])));
+  }
+
+  void test_visitMethodDeclaration_minimal() {
+    _assertClone(
+        AstFactory.methodDeclaration2(
+            null,
+            null,
+            null,
+            null,
+            AstFactory.identifier3("m"),
+            AstFactory.formalParameterList([]),
+            AstFactory.blockFunctionBody2([])));
+  }
+
+  void test_visitMethodDeclaration_multipleParameters() {
+    _assertClone(
+        AstFactory.methodDeclaration2(
+            null,
+            null,
+            null,
+            null,
+            AstFactory.identifier3("m"),
+            AstFactory.formalParameterList(
+                [
+                    AstFactory.simpleFormalParameter(Keyword.VAR, "a"),
+                    AstFactory.simpleFormalParameter(Keyword.VAR, "b")]),
+            AstFactory.blockFunctionBody2([])));
+  }
+
+  void test_visitMethodDeclaration_operator() {
+    _assertClone(
+        AstFactory.methodDeclaration2(
+            null,
+            null,
+            null,
+            Keyword.OPERATOR,
+            AstFactory.identifier3("+"),
+            AstFactory.formalParameterList([]),
+            AstFactory.blockFunctionBody2([])));
+  }
+
+  void test_visitMethodDeclaration_operator_returnType() {
+    _assertClone(
+        AstFactory.methodDeclaration2(
+            null,
+            AstFactory.typeName4("T", []),
+            null,
+            Keyword.OPERATOR,
+            AstFactory.identifier3("+"),
+            AstFactory.formalParameterList([]),
+            AstFactory.blockFunctionBody2([])));
+  }
+
+  void test_visitMethodDeclaration_returnType() {
+    _assertClone(
+        AstFactory.methodDeclaration2(
+            null,
+            AstFactory.typeName4("T", []),
+            null,
+            null,
+            AstFactory.identifier3("m"),
+            AstFactory.formalParameterList([]),
+            AstFactory.blockFunctionBody2([])));
+  }
+
+  void test_visitMethodDeclaration_setter() {
+    _assertClone(
+        AstFactory.methodDeclaration2(
+            null,
+            null,
+            Keyword.SET,
+            null,
+            AstFactory.identifier3("m"),
+            AstFactory.formalParameterList(
+                [AstFactory.simpleFormalParameter(Keyword.VAR, "v")]),
+            AstFactory.blockFunctionBody2([])));
+  }
+
+  void test_visitMethodDeclaration_static() {
+    _assertClone(
+        AstFactory.methodDeclaration2(
+            Keyword.STATIC,
+            null,
+            null,
+            null,
+            AstFactory.identifier3("m"),
+            AstFactory.formalParameterList([]),
+            AstFactory.blockFunctionBody2([])));
+  }
+
+  void test_visitMethodDeclaration_static_returnType() {
+    _assertClone(
+        AstFactory.methodDeclaration2(
+            Keyword.STATIC,
+            AstFactory.typeName4("T", []),
+            null,
+            null,
+            AstFactory.identifier3("m"),
+            AstFactory.formalParameterList([]),
+            AstFactory.blockFunctionBody2([])));
+  }
+
+  void test_visitMethodDeclaration_withMetadata() {
+    MethodDeclaration declaration = AstFactory.methodDeclaration2(
+        null,
+        null,
+        null,
+        null,
+        AstFactory.identifier3("m"),
+        AstFactory.formalParameterList([]),
+        AstFactory.blockFunctionBody2([]));
+    declaration.metadata =
+        AstFactory.list([AstFactory.annotation(AstFactory.identifier3("deprecated"))]);
+    _assertClone(declaration);
+  }
+
+  void test_visitMethodInvocation_noTarget() {
+    _assertClone(AstFactory.methodInvocation2("m", []));
+  }
+
+  void test_visitMethodInvocation_target() {
+    _assertClone(
+        AstFactory.methodInvocation(AstFactory.identifier3("t"), "m", []));
+  }
+
+  void test_visitNamedExpression() {
+    _assertClone(AstFactory.namedExpression2("a", AstFactory.identifier3("b")));
+  }
+
+  void test_visitNamedFormalParameter() {
+    _assertClone(
+        AstFactory.namedFormalParameter(
+            AstFactory.simpleFormalParameter(Keyword.VAR, "a"),
+            AstFactory.integer(0)));
+  }
+
+  void test_visitNativeClause() {
+    _assertClone(AstFactory.nativeClause("code"));
+  }
+
+  void test_visitNativeFunctionBody() {
+    _assertClone(AstFactory.nativeFunctionBody("str"));
+  }
+
+  void test_visitNullLiteral() {
+    _assertClone(AstFactory.nullLiteral());
+  }
+
+  void test_visitParenthesizedExpression() {
+    _assertClone(
+        AstFactory.parenthesizedExpression(AstFactory.identifier3("a")));
+  }
+
+  void test_visitPartDirective() {
+    _assertClone(AstFactory.partDirective2("a.dart"));
+  }
+
+  void test_visitPartDirective_withMetadata() {
+    PartDirective directive = AstFactory.partDirective2("a.dart");
+    directive.metadata =
+        AstFactory.list([AstFactory.annotation(AstFactory.identifier3("deprecated"))]);
+    _assertClone(directive);
+  }
+
+  void test_visitPartOfDirective() {
+    _assertClone(
+        AstFactory.partOfDirective(AstFactory.libraryIdentifier2(["l"])));
+  }
+
+  void test_visitPartOfDirective_withMetadata() {
+    PartOfDirective directive =
+        AstFactory.partOfDirective(AstFactory.libraryIdentifier2(["l"]));
+    directive.metadata =
+        AstFactory.list([AstFactory.annotation(AstFactory.identifier3("deprecated"))]);
+    _assertClone(directive);
+  }
+
+  void test_visitPositionalFormalParameter() {
+    _assertClone(
+        AstFactory.positionalFormalParameter(
+            AstFactory.simpleFormalParameter(Keyword.VAR, "a"),
+            AstFactory.integer(0)));
+  }
+
+  void test_visitPostfixExpression() {
+    _assertClone(
+        AstFactory.postfixExpression(AstFactory.identifier3("a"), TokenType.PLUS_PLUS));
+  }
+
+  void test_visitPrefixExpression() {
+    _assertClone(
+        AstFactory.prefixExpression(TokenType.MINUS, AstFactory.identifier3("a")));
+  }
+
+  void test_visitPrefixedIdentifier() {
+    _assertClone(AstFactory.identifier5("a", "b"));
+  }
+
+  void test_visitPropertyAccess() {
+    _assertClone(AstFactory.propertyAccess2(AstFactory.identifier3("a"), "b"));
+  }
+
+  void test_visitRedirectingConstructorInvocation_named() {
+    _assertClone(AstFactory.redirectingConstructorInvocation2("c", []));
+  }
+
+  void test_visitRedirectingConstructorInvocation_unnamed() {
+    _assertClone(AstFactory.redirectingConstructorInvocation([]));
+  }
+
+  void test_visitRethrowExpression() {
+    _assertClone(AstFactory.rethrowExpression());
+  }
+
+  void test_visitReturnStatement_expression() {
+    _assertClone(AstFactory.returnStatement2(AstFactory.identifier3("a")));
+  }
+
+  void test_visitReturnStatement_noExpression() {
+    _assertClone(AstFactory.returnStatement());
+  }
+
+  void test_visitScriptTag() {
+    String scriptTag = "!#/bin/dart.exe";
+    _assertClone(AstFactory.scriptTag(scriptTag));
+  }
+
+  void test_visitSimpleFormalParameter_keyword() {
+    _assertClone(AstFactory.simpleFormalParameter(Keyword.VAR, "a"));
+  }
+
+  void test_visitSimpleFormalParameter_keyword_type() {
+    _assertClone(
+        AstFactory.simpleFormalParameter2(
+            Keyword.FINAL,
+            AstFactory.typeName4("A", []),
+            "a"));
+  }
+
+  void test_visitSimpleFormalParameter_type() {
+    _assertClone(
+        AstFactory.simpleFormalParameter4(AstFactory.typeName4("A", []), "a"));
+  }
+
+  void test_visitSimpleIdentifier() {
+    _assertClone(AstFactory.identifier3("a"));
+  }
+
+  void test_visitSimpleStringLiteral() {
+    _assertClone(AstFactory.string2("a"));
+  }
+
+  void test_visitStringInterpolation() {
+    _assertClone(
+        AstFactory.string(
+            [
+                AstFactory.interpolationString("'a", "a"),
+                AstFactory.interpolationExpression(AstFactory.identifier3("e")),
+                AstFactory.interpolationString("b'", "b")]));
+  }
+
+  void test_visitSuperConstructorInvocation() {
+    _assertClone(AstFactory.superConstructorInvocation([]));
+  }
+
+  void test_visitSuperConstructorInvocation_named() {
+    _assertClone(AstFactory.superConstructorInvocation2("c", []));
+  }
+
+  void test_visitSuperExpression() {
+    _assertClone(AstFactory.superExpression());
+  }
+
+  void test_visitSwitchCase_multipleLabels() {
+    _assertClone(
+        AstFactory.switchCase2(
+            AstFactory.list([AstFactory.label2("l1"), AstFactory.label2("l2")]),
+            AstFactory.identifier3("a"),
+            [AstFactory.block([])]));
+  }
+
+  void test_visitSwitchCase_multipleStatements() {
+    _assertClone(
+        AstFactory.switchCase(
+            AstFactory.identifier3("a"),
+            [AstFactory.block([]), AstFactory.block([])]));
+  }
+
+  void test_visitSwitchCase_noLabels() {
+    _assertClone(
+        AstFactory.switchCase(AstFactory.identifier3("a"), [AstFactory.block([])]));
+  }
+
+  void test_visitSwitchCase_singleLabel() {
+    _assertClone(
+        AstFactory.switchCase2(
+            AstFactory.list([AstFactory.label2("l1")]),
+            AstFactory.identifier3("a"),
+            [AstFactory.block([])]));
+  }
+
+  void test_visitSwitchDefault_multipleLabels() {
+    _assertClone(
+        AstFactory.switchDefault(
+            AstFactory.list([AstFactory.label2("l1"), AstFactory.label2("l2")]),
+            [AstFactory.block([])]));
+  }
+
+  void test_visitSwitchDefault_multipleStatements() {
+    _assertClone(
+        AstFactory.switchDefault2([AstFactory.block([]), AstFactory.block([])]));
+  }
+
+  void test_visitSwitchDefault_noLabels() {
+    _assertClone(AstFactory.switchDefault2([AstFactory.block([])]));
+  }
+
+  void test_visitSwitchDefault_singleLabel() {
+    _assertClone(
+        AstFactory.switchDefault(
+            AstFactory.list([AstFactory.label2("l1")]),
+            [AstFactory.block([])]));
+  }
+
+  void test_visitSwitchStatement() {
+    _assertClone(
+        AstFactory.switchStatement(
+            AstFactory.identifier3("a"),
+            [
+                AstFactory.switchCase(AstFactory.string2("b"), [AstFactory.block([])]),
+                AstFactory.switchDefault2([AstFactory.block([])])]));
+  }
+
+  void test_visitSymbolLiteral_multiple() {
+    _assertClone(AstFactory.symbolLiteral(["a", "b", "c"]));
+  }
+
+  void test_visitSymbolLiteral_single() {
+    _assertClone(AstFactory.symbolLiteral(["a"]));
+  }
+
+  void test_visitThisExpression() {
+    _assertClone(AstFactory.thisExpression());
+  }
+
+  void test_visitThrowStatement() {
+    _assertClone(AstFactory.throwExpression2(AstFactory.identifier3("e")));
+  }
+
+  void test_visitTopLevelVariableDeclaration_multiple() {
+    _assertClone(
+        AstFactory.topLevelVariableDeclaration2(
+            Keyword.VAR,
+            [AstFactory.variableDeclaration("a")]));
+  }
+
+  void test_visitTopLevelVariableDeclaration_single() {
+    _assertClone(
+        AstFactory.topLevelVariableDeclaration2(
+            Keyword.VAR,
+            [AstFactory.variableDeclaration("a"), AstFactory.variableDeclaration("b")]));
+  }
+
+  void test_visitTryStatement_catch() {
+    _assertClone(
+        AstFactory.tryStatement2(
+            AstFactory.block([]),
+            [AstFactory.catchClause3(AstFactory.typeName4("E", []), [])]));
+  }
+
+  void test_visitTryStatement_catchFinally() {
+    _assertClone(
+        AstFactory.tryStatement3(
+            AstFactory.block([]),
+            AstFactory.list([AstFactory.catchClause3(AstFactory.typeName4("E", []), [])]),
+            AstFactory.block([])));
+  }
+
+  void test_visitTryStatement_catches() {
+    _assertClone(
+        AstFactory.tryStatement2(
+            AstFactory.block([]),
+            [
+                AstFactory.catchClause3(AstFactory.typeName4("E", []), []),
+                AstFactory.catchClause3(AstFactory.typeName4("F", []), [])]));
+  }
+
+  void test_visitTryStatement_finally() {
+    _assertClone(
+        AstFactory.tryStatement(AstFactory.block([]), AstFactory.block([])));
+  }
+
+  void test_visitTypeArgumentList_multiple() {
+    _assertClone(
+        AstFactory.typeArgumentList(
+            [AstFactory.typeName4("E", []), AstFactory.typeName4("F", [])]));
+  }
+
+  void test_visitTypeArgumentList_single() {
+    _assertClone(AstFactory.typeArgumentList([AstFactory.typeName4("E", [])]));
+  }
+
+  void test_visitTypeName_multipleArgs() {
+    _assertClone(
+        AstFactory.typeName4(
+            "C",
+            [AstFactory.typeName4("D", []), AstFactory.typeName4("E", [])]));
+  }
+
+  void test_visitTypeName_nestedArg() {
+    _assertClone(
+        AstFactory.typeName4(
+            "C",
+            [AstFactory.typeName4("D", [AstFactory.typeName4("E", [])])]));
+  }
+
+  void test_visitTypeName_noArgs() {
+    _assertClone(AstFactory.typeName4("C", []));
+  }
+
+  void test_visitTypeName_singleArg() {
+    _assertClone(AstFactory.typeName4("C", [AstFactory.typeName4("D", [])]));
+  }
+
+  void test_visitTypeParameterList_multiple() {
+    _assertClone(AstFactory.typeParameterList(["E", "F"]));
+  }
+
+  void test_visitTypeParameterList_single() {
+    _assertClone(AstFactory.typeParameterList(["E"]));
+  }
+
+  void test_visitTypeParameter_withExtends() {
+    _assertClone(AstFactory.typeParameter2("E", AstFactory.typeName4("C", [])));
+  }
+
+  void test_visitTypeParameter_withMetadata() {
+    TypeParameter parameter = AstFactory.typeParameter("E");
+    parameter.metadata =
+        AstFactory.list([AstFactory.annotation(AstFactory.identifier3("deprecated"))]);
+    _assertClone(parameter);
+  }
+
+  void test_visitTypeParameter_withoutExtends() {
+    _assertClone(AstFactory.typeParameter("E"));
+  }
+
+  void test_visitVariableDeclarationList_const_type() {
+    _assertClone(
+        AstFactory.variableDeclarationList(
+            Keyword.CONST,
+            AstFactory.typeName4("C", []),
+            [AstFactory.variableDeclaration("a"), AstFactory.variableDeclaration("b")]));
+  }
+
+  void test_visitVariableDeclarationList_final_noType() {
+    _assertClone(
+        AstFactory.variableDeclarationList2(
+            Keyword.FINAL,
+            [AstFactory.variableDeclaration("a"), AstFactory.variableDeclaration("b")]));
+  }
+
+  void test_visitVariableDeclarationList_final_withMetadata() {
+    VariableDeclarationList declarationList =
+        AstFactory.variableDeclarationList2(
+            Keyword.FINAL,
+            [AstFactory.variableDeclaration("a"), AstFactory.variableDeclaration("b")]);
+    declarationList.metadata =
+        AstFactory.list([AstFactory.annotation(AstFactory.identifier3("deprecated"))]);
+    _assertClone(declarationList);
+  }
+
+  void test_visitVariableDeclarationList_type() {
+    _assertClone(
+        AstFactory.variableDeclarationList(
+            null,
+            AstFactory.typeName4("C", []),
+            [AstFactory.variableDeclaration("a"), AstFactory.variableDeclaration("b")]));
+  }
+
+  void test_visitVariableDeclarationList_var() {
+    _assertClone(
+        AstFactory.variableDeclarationList2(
+            Keyword.VAR,
+            [AstFactory.variableDeclaration("a"), AstFactory.variableDeclaration("b")]));
+  }
+
+  void test_visitVariableDeclarationStatement() {
+    _assertClone(
+        AstFactory.variableDeclarationStatement(
+            null,
+            AstFactory.typeName4("C", []),
+            [AstFactory.variableDeclaration("c")]));
+  }
+
+  void test_visitVariableDeclaration_initialized() {
+    _assertClone(
+        AstFactory.variableDeclaration2("a", AstFactory.identifier3("b")));
+  }
+
+  void test_visitVariableDeclaration_uninitialized() {
+    _assertClone(AstFactory.variableDeclaration("a"));
+  }
+
+  void test_visitVariableDeclaration_withMetadata() {
+    VariableDeclaration declaration = AstFactory.variableDeclaration("a");
+    declaration.metadata =
+        AstFactory.list([AstFactory.annotation(AstFactory.identifier3("deprecated"))]);
+    _assertClone(declaration);
+  }
+
+  void test_visitWhileStatement() {
+    _assertClone(
+        AstFactory.whileStatement(AstFactory.identifier3("c"), AstFactory.block([])));
+  }
+
+  void test_visitWithClause_multiple() {
+    _assertClone(
+        AstFactory.withClause(
+            [
+                AstFactory.typeName4("A", []),
+                AstFactory.typeName4("B", []),
+                AstFactory.typeName4("C", [])]));
+  }
+
+  void test_visitWithClause_single() {
+    _assertClone(AstFactory.withClause([AstFactory.typeName4("A", [])]));
+  }
+
+  void test_visitYieldStatement() {
+    _assertClone(AstFactory.yieldStatement(AstFactory.identifier3("A")));
+  }
+
+  /**
+   * Assert that an `AstCloner` will produce the expected AST structure when
+   * visiting the given [node].
+   *
+   * @param node the AST node being visited to produce the cloned structure
+   * @throws AFE if the visitor does not produce the expected source for the given node
+   */
+  void _assertClone(AstNode node) {
+    AstNode clone = node.accept(new AstCloner());
+    AstCloneComparator comparitor = new AstCloneComparator(false);
+    if (!comparitor.isEqualNodes(node, clone)) {
+      fail("Failed to clone ${node.runtimeType.toString()}");
+    }
+
+    clone = node.accept(new AstCloner(true));
+    comparitor = new AstCloneComparator(true);
+    if (!comparitor.isEqualNodes(node, clone)) {
+      fail("Failed to clone ${node.runtimeType.toString()}");
+    }
+  }
+}
+
+class AstCloneComparator extends AstComparator {
+  final bool expectTokensCopied;
+
+  AstCloneComparator(this.expectTokensCopied);
+
+  @override
+  bool isEqualNodes(AstNode first, AstNode second) {
+    if (first != null && identical(first, second)) {
+      fail('Failed to copy node: $first (${first.offset})');
+      return false;
+    }
+    return super.isEqualNodes(first, second);
+  }
+
+  @override
+  bool isEqualTokens(Token first, Token second) {
+    if (expectTokensCopied && first != null && identical(first, second)) {
+      fail('Failed to copy token: ${first.lexeme} (${first.offset})');
+      return false;
+    }
+    return super.isEqualTokens(first, second);
+  }
+}
+
+class BooleanArrayTest {
+  void test_get_negative() {
+    try {
+      BooleanArray.get(0, -1);
+      fail("Expected ");
+    } on RangeError catch (exception) {
+      // Expected
+    }
+  }
+
+  void test_get_tooBig() {
+    try {
+      BooleanArray.get(0, 31);
+      fail("Expected ");
+    } on RangeError catch (exception) {
+      // Expected
+    }
+  }
+
+  void test_get_valid() {
+    expect(BooleanArray.get(0, 0), false);
+    expect(BooleanArray.get(1, 0), true);
+    expect(BooleanArray.get(0, 30), false);
+    expect(BooleanArray.get(1 << 30, 30), true);
+  }
+
+  void test_set_negative() {
+    try {
+      BooleanArray.set(0, -1, true);
+      fail("Expected ");
+    } on RangeError catch (exception) {
+      // Expected
+    }
+  }
+
+  void test_set_tooBig() {
+    try {
+      BooleanArray.set(0, 32, true);
+      fail("Expected ");
+    } on RangeError catch (exception) {
+      // Expected
+    }
+  }
+
+  void test_set_valueChanging() {
+    expect(BooleanArray.set(0, 0, true), 1);
+    expect(BooleanArray.set(1, 0, false), 0);
+    expect(BooleanArray.set(0, 30, true), 1 << 30);
+    expect(BooleanArray.set(1 << 30, 30, false), 0);
+  }
+
+  void test_set_valuePreserving() {
+    expect(BooleanArray.set(0, 0, false), 0);
+    expect(BooleanArray.set(1, 0, true), 1);
+    expect(BooleanArray.set(0, 30, false), 0);
+    expect(BooleanArray.set(1 << 30, 30, true), 1 << 30);
+  }
+}
+
+class DirectedGraphTest extends EngineTestCase {
+  void test_addEdge() {
+    DirectedGraph<DirectedGraphTest_Node> graph =
+        new DirectedGraph<DirectedGraphTest_Node>();
+    expect(graph.isEmpty, isTrue);
+    graph.addEdge(new DirectedGraphTest_Node(), new DirectedGraphTest_Node());
+    expect(graph.isEmpty, isFalse);
+  }
+
+  void test_addNode() {
+    DirectedGraph<DirectedGraphTest_Node> graph =
+        new DirectedGraph<DirectedGraphTest_Node>();
+    expect(graph.isEmpty, isTrue);
+    graph.addNode(new DirectedGraphTest_Node());
+    expect(graph.isEmpty, isFalse);
+  }
+
+  void test_containsPath_noCycles() {
+    DirectedGraphTest_Node node1 = new DirectedGraphTest_Node();
+    DirectedGraphTest_Node node2 = new DirectedGraphTest_Node();
+    DirectedGraphTest_Node node3 = new DirectedGraphTest_Node();
+    DirectedGraph<DirectedGraphTest_Node> graph =
+        new DirectedGraph<DirectedGraphTest_Node>();
+    graph.addEdge(node1, node2);
+    graph.addEdge(node2, node3);
+    expect(graph.containsPath(node1, node1), isTrue);
+    expect(graph.containsPath(node1, node2), isTrue);
+    expect(graph.containsPath(node1, node3), isTrue);
+    expect(graph.containsPath(node2, node1), isFalse);
+    expect(graph.containsPath(node2, node2), isTrue);
+    expect(graph.containsPath(node2, node3), isTrue);
+    expect(graph.containsPath(node3, node1), isFalse);
+    expect(graph.containsPath(node3, node2), isFalse);
+    expect(graph.containsPath(node3, node3), isTrue);
+  }
+
+  void test_containsPath_withCycles() {
+    DirectedGraphTest_Node node1 = new DirectedGraphTest_Node();
+    DirectedGraphTest_Node node2 = new DirectedGraphTest_Node();
+    DirectedGraphTest_Node node3 = new DirectedGraphTest_Node();
+    DirectedGraphTest_Node node4 = new DirectedGraphTest_Node();
+    DirectedGraph<DirectedGraphTest_Node> graph =
+        new DirectedGraph<DirectedGraphTest_Node>();
+    graph.addEdge(node1, node2);
+    graph.addEdge(node2, node1);
+    graph.addEdge(node1, node3);
+    graph.addEdge(node3, node4);
+    graph.addEdge(node4, node3);
+    expect(graph.containsPath(node1, node1), isTrue);
+    expect(graph.containsPath(node1, node2), isTrue);
+    expect(graph.containsPath(node1, node3), isTrue);
+    expect(graph.containsPath(node1, node4), isTrue);
+    expect(graph.containsPath(node2, node1), isTrue);
+    expect(graph.containsPath(node2, node2), isTrue);
+    expect(graph.containsPath(node2, node3), isTrue);
+    expect(graph.containsPath(node2, node4), isTrue);
+    expect(graph.containsPath(node3, node1), isFalse);
+    expect(graph.containsPath(node3, node2), isFalse);
+    expect(graph.containsPath(node3, node3), isTrue);
+    expect(graph.containsPath(node3, node4), isTrue);
+    expect(graph.containsPath(node4, node1), isFalse);
+    expect(graph.containsPath(node4, node2), isFalse);
+    expect(graph.containsPath(node4, node3), isTrue);
+    expect(graph.containsPath(node4, node4), isTrue);
+  }
+
+  void test_creation() {
+    expect(new DirectedGraph<DirectedGraphTest_Node>(), isNotNull);
+  }
+
+  void test_findCycleContaining_complexCycle() {
+    // Two overlapping loops: (1, 2, 3) and (3, 4, 5)
+    DirectedGraphTest_Node node1 = new DirectedGraphTest_Node();
+    DirectedGraphTest_Node node2 = new DirectedGraphTest_Node();
+    DirectedGraphTest_Node node3 = new DirectedGraphTest_Node();
+    DirectedGraphTest_Node node4 = new DirectedGraphTest_Node();
+    DirectedGraphTest_Node node5 = new DirectedGraphTest_Node();
+    DirectedGraph<DirectedGraphTest_Node> graph =
+        new DirectedGraph<DirectedGraphTest_Node>();
+    graph.addEdge(node1, node2);
+    graph.addEdge(node2, node3);
+    graph.addEdge(node3, node1);
+    graph.addEdge(node3, node4);
+    graph.addEdge(node4, node5);
+    graph.addEdge(node5, node3);
+    List<DirectedGraphTest_Node> cycle = graph.findCycleContaining(node1);
+    expect(cycle, hasLength(5));
+    expect(cycle.contains(node1), isTrue);
+    expect(cycle.contains(node2), isTrue);
+    expect(cycle.contains(node3), isTrue);
+    expect(cycle.contains(node4), isTrue);
+    expect(cycle.contains(node5), isTrue);
+  }
+
+  void test_findCycleContaining_cycle() {
+    DirectedGraphTest_Node node1 = new DirectedGraphTest_Node();
+    DirectedGraphTest_Node node2 = new DirectedGraphTest_Node();
+    DirectedGraphTest_Node node3 = new DirectedGraphTest_Node();
+    DirectedGraph<DirectedGraphTest_Node> graph =
+        new DirectedGraph<DirectedGraphTest_Node>();
+    graph.addEdge(node1, node2);
+    graph.addEdge(node2, node3);
+    graph.addEdge(node2, new DirectedGraphTest_Node());
+    graph.addEdge(node3, node1);
+    graph.addEdge(node3, new DirectedGraphTest_Node());
+    List<DirectedGraphTest_Node> cycle = graph.findCycleContaining(node1);
+    expect(cycle, hasLength(3));
+    expect(cycle.contains(node1), isTrue);
+    expect(cycle.contains(node2), isTrue);
+    expect(cycle.contains(node3), isTrue);
+  }
+
+  void test_findCycleContaining_notInGraph() {
+    DirectedGraphTest_Node node = new DirectedGraphTest_Node();
+    DirectedGraph<DirectedGraphTest_Node> graph =
+        new DirectedGraph<DirectedGraphTest_Node>();
+    List<DirectedGraphTest_Node> cycle = graph.findCycleContaining(node);
+    expect(cycle, hasLength(1));
+    expect(cycle[0], node);
+  }
+
+  void test_findCycleContaining_null() {
+    DirectedGraph<DirectedGraphTest_Node> graph =
+        new DirectedGraph<DirectedGraphTest_Node>();
+    try {
+      graph.findCycleContaining(null);
+      fail("Expected IllegalArgumentException");
+    } on IllegalArgumentException catch (exception) {
+      // Expected
+    }
+  }
+
+  void test_findCycleContaining_singleton() {
+    DirectedGraphTest_Node node1 = new DirectedGraphTest_Node();
+    DirectedGraphTest_Node node2 = new DirectedGraphTest_Node();
+    DirectedGraphTest_Node node3 = new DirectedGraphTest_Node();
+    DirectedGraph<DirectedGraphTest_Node> graph =
+        new DirectedGraph<DirectedGraphTest_Node>();
+    graph.addEdge(node1, node2);
+    graph.addEdge(node2, node3);
+    List<DirectedGraphTest_Node> cycle = graph.findCycleContaining(node1);
+    expect(cycle, hasLength(1));
+    expect(cycle[0], node1);
+  }
+
+  void test_getNodeCount() {
+    DirectedGraphTest_Node node1 = new DirectedGraphTest_Node();
+    DirectedGraphTest_Node node2 = new DirectedGraphTest_Node();
+    DirectedGraph<DirectedGraphTest_Node> graph =
+        new DirectedGraph<DirectedGraphTest_Node>();
+    expect(graph.nodeCount, 0);
+    graph.addNode(node1);
+    expect(graph.nodeCount, 1);
+    graph.addNode(node2);
+    expect(graph.nodeCount, 2);
+    graph.removeNode(node1);
+    expect(graph.nodeCount, 1);
+  }
+
+  void test_getTails() {
+    DirectedGraphTest_Node node1 = new DirectedGraphTest_Node();
+    DirectedGraphTest_Node node2 = new DirectedGraphTest_Node();
+    DirectedGraphTest_Node node3 = new DirectedGraphTest_Node();
+    DirectedGraph<DirectedGraphTest_Node> graph =
+        new DirectedGraph<DirectedGraphTest_Node>();
+    expect(graph.getTails(node1), hasLength(0));
+    graph.addEdge(node1, node2);
+    expect(graph.getTails(node1), hasLength(1));
+    graph.addEdge(node1, node3);
+    expect(graph.getTails(node1), hasLength(2));
+  }
+
+  void test_removeAllNodes() {
+    DirectedGraphTest_Node node1 = new DirectedGraphTest_Node();
+    DirectedGraphTest_Node node2 = new DirectedGraphTest_Node();
+    List<DirectedGraphTest_Node> nodes = new List<DirectedGraphTest_Node>();
+    nodes.add(node1);
+    nodes.add(node2);
+    DirectedGraph<DirectedGraphTest_Node> graph =
+        new DirectedGraph<DirectedGraphTest_Node>();
+    graph.addEdge(node1, node2);
+    graph.addEdge(node2, node1);
+    expect(graph.isEmpty, isFalse);
+    graph.removeAllNodes(nodes);
+    expect(graph.isEmpty, isTrue);
+  }
+
+  void test_removeEdge() {
+    DirectedGraphTest_Node node1 = new DirectedGraphTest_Node();
+    DirectedGraphTest_Node node2 = new DirectedGraphTest_Node();
+    DirectedGraphTest_Node node3 = new DirectedGraphTest_Node();
+    DirectedGraph<DirectedGraphTest_Node> graph =
+        new DirectedGraph<DirectedGraphTest_Node>();
+    graph.addEdge(node1, node2);
+    graph.addEdge(node1, node3);
+    expect(graph.getTails(node1), hasLength(2));
+    graph.removeEdge(node1, node2);
+    expect(graph.getTails(node1), hasLength(1));
+  }
+
+  void test_removeNode() {
+    DirectedGraphTest_Node node1 = new DirectedGraphTest_Node();
+    DirectedGraphTest_Node node2 = new DirectedGraphTest_Node();
+    DirectedGraphTest_Node node3 = new DirectedGraphTest_Node();
+    DirectedGraph<DirectedGraphTest_Node> graph =
+        new DirectedGraph<DirectedGraphTest_Node>();
+    graph.addEdge(node1, node2);
+    graph.addEdge(node1, node3);
+    expect(graph.getTails(node1), hasLength(2));
+    graph.removeNode(node2);
+    expect(graph.getTails(node1), hasLength(1));
+  }
+
+  void test_removeSink() {
+    DirectedGraphTest_Node node1 = new DirectedGraphTest_Node();
+    DirectedGraphTest_Node node2 = new DirectedGraphTest_Node();
+    DirectedGraph<DirectedGraphTest_Node> graph =
+        new DirectedGraph<DirectedGraphTest_Node>();
+    graph.addEdge(node1, node2);
+    expect(graph.removeSink(), same(node2));
+    expect(graph.removeSink(), same(node1));
+    expect(graph.isEmpty, isTrue);
+  }
+
+  void test_topologicalSort_noCycles() {
+    DirectedGraphTest_Node node1 = new DirectedGraphTest_Node();
+    DirectedGraphTest_Node node2 = new DirectedGraphTest_Node();
+    DirectedGraphTest_Node node3 = new DirectedGraphTest_Node();
+    DirectedGraph<DirectedGraphTest_Node> graph =
+        new DirectedGraph<DirectedGraphTest_Node>();
+    graph.addEdge(node1, node2);
+    graph.addEdge(node1, node3);
+    graph.addEdge(node2, node3);
+    List<List<DirectedGraphTest_Node>> topologicalSort =
+        graph.computeTopologicalSort();
+    expect(topologicalSort, hasLength(3));
+    expect(topologicalSort[0], hasLength(1));
+    expect(topologicalSort[0][0], node3);
+    expect(topologicalSort[1], hasLength(1));
+    expect(topologicalSort[1][0], node2);
+    expect(topologicalSort[2], hasLength(1));
+    expect(topologicalSort[2][0], node1);
+  }
+
+  void test_topologicalSort_withCycles() {
+    DirectedGraphTest_Node node1 = new DirectedGraphTest_Node();
+    DirectedGraphTest_Node node2 = new DirectedGraphTest_Node();
+    DirectedGraphTest_Node node3 = new DirectedGraphTest_Node();
+    DirectedGraphTest_Node node4 = new DirectedGraphTest_Node();
+    DirectedGraph<DirectedGraphTest_Node> graph =
+        new DirectedGraph<DirectedGraphTest_Node>();
+    graph.addEdge(node1, node2);
+    graph.addEdge(node2, node1);
+    graph.addEdge(node1, node3);
+    graph.addEdge(node3, node4);
+    graph.addEdge(node4, node3);
+    List<List<DirectedGraphTest_Node>> topologicalSort =
+        graph.computeTopologicalSort();
+    expect(topologicalSort, hasLength(2));
+    expect(topologicalSort[0], unorderedEquals([node3, node4]));
+    expect(topologicalSort[1], unorderedEquals([node1, node2]));
+  }
+}
+
+/**
+ * Instances of the class `Node` represent simple nodes used for testing purposes.
+ */
+class DirectedGraphTest_Node {
+}
+
+class Getter_NodeReplacerTest_testAnnotatedNode implements
+    NodeReplacerTest_Getter {
+  @override
+  Comment get(AnnotatedNode node) => node.documentationComment;
+}
+
+class Getter_NodeReplacerTest_testNormalFormalParameter implements
+    NodeReplacerTest_Getter {
+  @override
+  SimpleIdentifier get(NormalFormalParameter node) => node.identifier;
+}
+
+class Getter_NodeReplacerTest_testNormalFormalParameter_2 implements
+    NodeReplacerTest_Getter {
+  @override
+  Comment get(NormalFormalParameter node) => node.documentationComment;
+}
+
+class Getter_NodeReplacerTest_testTypedLiteral implements
+    NodeReplacerTest_Getter {
+  @override
+  TypeArgumentList get(TypedLiteral node) => node.typeArguments;
+}
+
+class Getter_NodeReplacerTest_testUriBasedDirective implements
+    NodeReplacerTest_Getter {
+  @override
+  StringLiteral get(UriBasedDirective node) => node.uri;
+}
+
+class Getter_NodeReplacerTest_test_annotation implements NodeReplacerTest_Getter
+    {
+  @override
+  ArgumentList get(Annotation node) => node.arguments;
+}
+
+class Getter_NodeReplacerTest_test_annotation_2 implements
+    NodeReplacerTest_Getter {
+  @override
+  Identifier get(Annotation node) => node.name;
+}
+
+class Getter_NodeReplacerTest_test_annotation_3 implements
+    NodeReplacerTest_Getter {
+  @override
+  SimpleIdentifier get(Annotation node) => node.constructorName;
+}
+
+class Getter_NodeReplacerTest_test_asExpression implements
+    NodeReplacerTest_Getter {
+  @override
+  TypeName get(AsExpression node) => node.type;
+}
+
+class Getter_NodeReplacerTest_test_asExpression_2 implements
+    NodeReplacerTest_Getter {
+  @override
+  Expression get(AsExpression node) => node.expression;
+}
+
+class Getter_NodeReplacerTest_test_assertStatement implements
+    NodeReplacerTest_Getter {
+  @override
+  Expression get(AssertStatement node) => node.condition;
+}
+
+class Getter_NodeReplacerTest_test_assignmentExpression implements
+    NodeReplacerTest_Getter {
+  @override
+  Expression get(AssignmentExpression node) => node.rightHandSide;
+}
+
+class Getter_NodeReplacerTest_test_assignmentExpression_2 implements
+    NodeReplacerTest_Getter {
+  @override
+  Expression get(AssignmentExpression node) => node.leftHandSide;
+}
+
+class Getter_NodeReplacerTest_test_binaryExpression implements
+    NodeReplacerTest_Getter {
+  @override
+  Expression get(BinaryExpression node) => node.leftOperand;
+}
+
+class Getter_NodeReplacerTest_test_binaryExpression_2 implements
+    NodeReplacerTest_Getter {
+  @override
+  Expression get(BinaryExpression node) => node.rightOperand;
+}
+
+class Getter_NodeReplacerTest_test_blockFunctionBody implements
+    NodeReplacerTest_Getter {
+  @override
+  Block get(BlockFunctionBody node) => node.block;
+}
+
+class Getter_NodeReplacerTest_test_breakStatement implements
+    NodeReplacerTest_Getter {
+  @override
+  SimpleIdentifier get(BreakStatement node) => node.label;
+}
+
+class Getter_NodeReplacerTest_test_cascadeExpression implements
+    NodeReplacerTest_Getter {
+  @override
+  Expression get(CascadeExpression node) => node.target;
+}
+
+class Getter_NodeReplacerTest_test_catchClause implements
+    NodeReplacerTest_Getter {
+  @override
+  SimpleIdentifier get(CatchClause node) => node.stackTraceParameter;
+}
+
+class Getter_NodeReplacerTest_test_catchClause_2 implements
+    NodeReplacerTest_Getter {
+  @override
+  SimpleIdentifier get(CatchClause node) => node.exceptionParameter;
+}
+
+class Getter_NodeReplacerTest_test_catchClause_3 implements
+    NodeReplacerTest_Getter {
+  @override
+  TypeName get(CatchClause node) => node.exceptionType;
+}
+
+class Getter_NodeReplacerTest_test_classDeclaration implements
+    NodeReplacerTest_Getter {
+  @override
+  ImplementsClause get(ClassDeclaration node) => node.implementsClause;
+}
+
+class Getter_NodeReplacerTest_test_classDeclaration_2 implements
+    NodeReplacerTest_Getter {
+  @override
+  WithClause get(ClassDeclaration node) => node.withClause;
+}
+
+class Getter_NodeReplacerTest_test_classDeclaration_3 implements
+    NodeReplacerTest_Getter {
+  @override
+  NativeClause get(ClassDeclaration node) => node.nativeClause;
+}
+
+class Getter_NodeReplacerTest_test_classDeclaration_4 implements
+    NodeReplacerTest_Getter {
+  @override
+  ExtendsClause get(ClassDeclaration node) => node.extendsClause;
+}
+
+class Getter_NodeReplacerTest_test_classDeclaration_5 implements
+    NodeReplacerTest_Getter {
+  @override
+  TypeParameterList get(ClassDeclaration node) => node.typeParameters;
+}
+
+class Getter_NodeReplacerTest_test_classDeclaration_6 implements
+    NodeReplacerTest_Getter {
+  @override
+  SimpleIdentifier get(ClassDeclaration node) => node.name;
+}
+
+class Getter_NodeReplacerTest_test_classTypeAlias implements
+    NodeReplacerTest_Getter {
+  @override
+  TypeName get(ClassTypeAlias node) => node.superclass;
+}
+
+class Getter_NodeReplacerTest_test_classTypeAlias_2 implements
+    NodeReplacerTest_Getter {
+  @override
+  ImplementsClause get(ClassTypeAlias node) => node.implementsClause;
+}
+
+class Getter_NodeReplacerTest_test_classTypeAlias_3 implements
+    NodeReplacerTest_Getter {
+  @override
+  WithClause get(ClassTypeAlias node) => node.withClause;
+}
+
+class Getter_NodeReplacerTest_test_classTypeAlias_4 implements
+    NodeReplacerTest_Getter {
+  @override
+  SimpleIdentifier get(ClassTypeAlias node) => node.name;
+}
+
+class Getter_NodeReplacerTest_test_classTypeAlias_5 implements
+    NodeReplacerTest_Getter {
+  @override
+  TypeParameterList get(ClassTypeAlias node) => node.typeParameters;
+}
+
+class Getter_NodeReplacerTest_test_commentReference implements
+    NodeReplacerTest_Getter {
+  @override
+  Identifier get(CommentReference node) => node.identifier;
+}
+
+class Getter_NodeReplacerTest_test_compilationUnit implements
+    NodeReplacerTest_Getter {
+  @override
+  ScriptTag get(CompilationUnit node) => node.scriptTag;
+}
+
+class Getter_NodeReplacerTest_test_conditionalExpression implements
+    NodeReplacerTest_Getter {
+  @override
+  Expression get(ConditionalExpression node) => node.elseExpression;
+}
+
+class Getter_NodeReplacerTest_test_conditionalExpression_2 implements
+    NodeReplacerTest_Getter {
+  @override
+  Expression get(ConditionalExpression node) => node.thenExpression;
+}
+
+class Getter_NodeReplacerTest_test_conditionalExpression_3 implements
+    NodeReplacerTest_Getter {
+  @override
+  Expression get(ConditionalExpression node) => node.condition;
+}
+
+class Getter_NodeReplacerTest_test_constructorDeclaration implements
+    NodeReplacerTest_Getter {
+  @override
+  ConstructorName get(ConstructorDeclaration node) =>
+      node.redirectedConstructor;
+}
+
+class Getter_NodeReplacerTest_test_constructorDeclaration_2 implements
+    NodeReplacerTest_Getter {
+  @override
+  SimpleIdentifier get(ConstructorDeclaration node) => node.name;
+}
+
+class Getter_NodeReplacerTest_test_constructorDeclaration_3 implements
+    NodeReplacerTest_Getter {
+  @override
+  Identifier get(ConstructorDeclaration node) => node.returnType;
+}
+
+class Getter_NodeReplacerTest_test_constructorDeclaration_4 implements
+    NodeReplacerTest_Getter {
+  @override
+  FormalParameterList get(ConstructorDeclaration node) => node.parameters;
+}
+
+class Getter_NodeReplacerTest_test_constructorDeclaration_5 implements
+    NodeReplacerTest_Getter {
+  @override
+  FunctionBody get(ConstructorDeclaration node) => node.body;
+}
+
+class Getter_NodeReplacerTest_test_constructorFieldInitializer implements
+    NodeReplacerTest_Getter {
+  @override
+  SimpleIdentifier get(ConstructorFieldInitializer node) => node.fieldName;
+}
+
+class Getter_NodeReplacerTest_test_constructorFieldInitializer_2 implements
+    NodeReplacerTest_Getter {
+  @override
+  Expression get(ConstructorFieldInitializer node) => node.expression;
+}
+
+class Getter_NodeReplacerTest_test_constructorName implements
+    NodeReplacerTest_Getter {
+  @override
+  TypeName get(ConstructorName node) => node.type;
+}
+
+class Getter_NodeReplacerTest_test_constructorName_2 implements
+    NodeReplacerTest_Getter {
+  @override
+  SimpleIdentifier get(ConstructorName node) => node.name;
+}
+
+class Getter_NodeReplacerTest_test_continueStatement implements
+    NodeReplacerTest_Getter {
+  @override
+  SimpleIdentifier get(ContinueStatement node) => node.label;
+}
+
+class Getter_NodeReplacerTest_test_declaredIdentifier implements
+    NodeReplacerTest_Getter {
+  @override
+  TypeName get(DeclaredIdentifier node) => node.type;
+}
+
+class Getter_NodeReplacerTest_test_declaredIdentifier_2 implements
+    NodeReplacerTest_Getter {
+  @override
+  SimpleIdentifier get(DeclaredIdentifier node) => node.identifier;
+}
+
+class Getter_NodeReplacerTest_test_defaultFormalParameter implements
+    NodeReplacerTest_Getter {
+  @override
+  NormalFormalParameter get(DefaultFormalParameter node) => node.parameter;
+}
+
+class Getter_NodeReplacerTest_test_defaultFormalParameter_2 implements
+    NodeReplacerTest_Getter {
+  @override
+  Expression get(DefaultFormalParameter node) => node.defaultValue;
+}
+
+class Getter_NodeReplacerTest_test_doStatement implements
+    NodeReplacerTest_Getter {
+  @override
+  Expression get(DoStatement node) => node.condition;
+}
+
+class Getter_NodeReplacerTest_test_doStatement_2 implements
+    NodeReplacerTest_Getter {
+  @override
+  Statement get(DoStatement node) => node.body;
+}
+
+class Getter_NodeReplacerTest_test_enumConstantDeclaration implements
+    NodeReplacerTest_Getter {
+  @override
+  SimpleIdentifier get(EnumConstantDeclaration node) => node.name;
+}
+
+class Getter_NodeReplacerTest_test_enumDeclaration implements
+    NodeReplacerTest_Getter {
+  @override
+  SimpleIdentifier get(EnumDeclaration node) => node.name;
+}
+
+class Getter_NodeReplacerTest_test_expressionFunctionBody implements
+    NodeReplacerTest_Getter {
+  @override
+  Expression get(ExpressionFunctionBody node) => node.expression;
+}
+
+class Getter_NodeReplacerTest_test_expressionStatement implements
+    NodeReplacerTest_Getter {
+  @override
+  Expression get(ExpressionStatement node) => node.expression;
+}
+
+class Getter_NodeReplacerTest_test_extendsClause implements
+    NodeReplacerTest_Getter {
+  @override
+  TypeName get(ExtendsClause node) => node.superclass;
+}
+
+class Getter_NodeReplacerTest_test_fieldDeclaration implements
+    NodeReplacerTest_Getter {
+  @override
+  VariableDeclarationList get(FieldDeclaration node) => node.fields;
+}
+
+class Getter_NodeReplacerTest_test_fieldFormalParameter implements
+    NodeReplacerTest_Getter {
+  @override
+  FormalParameterList get(FieldFormalParameter node) => node.parameters;
+}
+
+class Getter_NodeReplacerTest_test_fieldFormalParameter_2 implements
+    NodeReplacerTest_Getter {
+  @override
+  TypeName get(FieldFormalParameter node) => node.type;
+}
+
+class Getter_NodeReplacerTest_test_forEachStatement_withIdentifier implements
+    NodeReplacerTest_Getter {
+  @override
+  Statement get(ForEachStatement node) => node.body;
+}
+
+class Getter_NodeReplacerTest_test_forEachStatement_withIdentifier_2 implements
+    NodeReplacerTest_Getter {
+  @override
+  SimpleIdentifier get(ForEachStatement node) => node.identifier;
+}
+
+class Getter_NodeReplacerTest_test_forEachStatement_withIdentifier_3 implements
+    NodeReplacerTest_Getter {
+  @override
+  Expression get(ForEachStatement node) => node.iterator;
+}
+
+class Getter_NodeReplacerTest_test_forEachStatement_withLoopVariable implements
+    NodeReplacerTest_Getter {
+  @override
+  Expression get(ForEachStatement node) => node.iterator;
+}
+
+class Getter_NodeReplacerTest_test_forEachStatement_withLoopVariable_2
+    implements NodeReplacerTest_Getter {
+  @override
+  DeclaredIdentifier get(ForEachStatement node) => node.loopVariable;
+}
+
+class Getter_NodeReplacerTest_test_forEachStatement_withLoopVariable_3
+    implements NodeReplacerTest_Getter {
+  @override
+  Statement get(ForEachStatement node) => node.body;
+}
+
+class Getter_NodeReplacerTest_test_forStatement_withInitialization implements
+    NodeReplacerTest_Getter {
+  @override
+  Statement get(ForStatement node) => node.body;
+}
+
+class Getter_NodeReplacerTest_test_forStatement_withInitialization_2 implements
+    NodeReplacerTest_Getter {
+  @override
+  Expression get(ForStatement node) => node.condition;
+}
+
+class Getter_NodeReplacerTest_test_forStatement_withInitialization_3 implements
+    NodeReplacerTest_Getter {
+  @override
+  Expression get(ForStatement node) => node.initialization;
+}
+
+class Getter_NodeReplacerTest_test_forStatement_withVariables implements
+    NodeReplacerTest_Getter {
+  @override
+  Statement get(ForStatement node) => node.body;
+}
+
+class Getter_NodeReplacerTest_test_forStatement_withVariables_2 implements
+    NodeReplacerTest_Getter {
+  @override
+  VariableDeclarationList get(ForStatement node) => node.variables;
+}
+
+class Getter_NodeReplacerTest_test_forStatement_withVariables_3 implements
+    NodeReplacerTest_Getter {
+  @override
+  Expression get(ForStatement node) => node.condition;
+}
+
+class Getter_NodeReplacerTest_test_functionDeclaration implements
+    NodeReplacerTest_Getter {
+  @override
+  TypeName get(FunctionDeclaration node) => node.returnType;
+}
+
+class Getter_NodeReplacerTest_test_functionDeclarationStatement implements
+    NodeReplacerTest_Getter {
+  @override
+  FunctionDeclaration get(FunctionDeclarationStatement node) =>
+      node.functionDeclaration;
+}
+
+class Getter_NodeReplacerTest_test_functionDeclaration_2 implements
+    NodeReplacerTest_Getter {
+  @override
+  FunctionExpression get(FunctionDeclaration node) => node.functionExpression;
+}
+
+class Getter_NodeReplacerTest_test_functionDeclaration_3 implements
+    NodeReplacerTest_Getter {
+  @override
+  SimpleIdentifier get(FunctionDeclaration node) => node.name;
+}
+
+class Getter_NodeReplacerTest_test_functionExpression implements
+    NodeReplacerTest_Getter {
+  @override
+  FormalParameterList get(FunctionExpression node) => node.parameters;
+}
+
+class Getter_NodeReplacerTest_test_functionExpressionInvocation implements
+    NodeReplacerTest_Getter {
+  @override
+  Expression get(FunctionExpressionInvocation node) => node.function;
+}
+
+class Getter_NodeReplacerTest_test_functionExpressionInvocation_2 implements
+    NodeReplacerTest_Getter {
+  @override
+  ArgumentList get(FunctionExpressionInvocation node) => node.argumentList;
+}
+
+class Getter_NodeReplacerTest_test_functionExpression_2 implements
+    NodeReplacerTest_Getter {
+  @override
+  FunctionBody get(FunctionExpression node) => node.body;
+}
+
+class Getter_NodeReplacerTest_test_functionTypeAlias implements
+    NodeReplacerTest_Getter {
+  @override
+  TypeParameterList get(FunctionTypeAlias node) => node.typeParameters;
+}
+
+class Getter_NodeReplacerTest_test_functionTypeAlias_2 implements
+    NodeReplacerTest_Getter {
+  @override
+  FormalParameterList get(FunctionTypeAlias node) => node.parameters;
+}
+
+class Getter_NodeReplacerTest_test_functionTypeAlias_3 implements
+    NodeReplacerTest_Getter {
+  @override
+  TypeName get(FunctionTypeAlias node) => node.returnType;
+}
+
+class Getter_NodeReplacerTest_test_functionTypeAlias_4 implements
+    NodeReplacerTest_Getter {
+  @override
+  SimpleIdentifier get(FunctionTypeAlias node) => node.name;
+}
+
+class Getter_NodeReplacerTest_test_functionTypedFormalParameter implements
+    NodeReplacerTest_Getter {
+  @override
+  TypeName get(FunctionTypedFormalParameter node) => node.returnType;
+}
+
+class Getter_NodeReplacerTest_test_functionTypedFormalParameter_2 implements
+    NodeReplacerTest_Getter {
+  @override
+  FormalParameterList get(FunctionTypedFormalParameter node) => node.parameters;
+}
+
+class Getter_NodeReplacerTest_test_ifStatement implements
+    NodeReplacerTest_Getter {
+  @override
+  Expression get(IfStatement node) => node.condition;
+}
+
+class Getter_NodeReplacerTest_test_ifStatement_2 implements
+    NodeReplacerTest_Getter {
+  @override
+  Statement get(IfStatement node) => node.elseStatement;
+}
+
+class Getter_NodeReplacerTest_test_ifStatement_3 implements
+    NodeReplacerTest_Getter {
+  @override
+  Statement get(IfStatement node) => node.thenStatement;
+}
+
+class Getter_NodeReplacerTest_test_importDirective implements
+    NodeReplacerTest_Getter {
+  @override
+  SimpleIdentifier get(ImportDirective node) => node.prefix;
+}
+
+class Getter_NodeReplacerTest_test_indexExpression implements
+    NodeReplacerTest_Getter {
+  @override
+  Expression get(IndexExpression node) => node.target;
+}
+
+class Getter_NodeReplacerTest_test_indexExpression_2 implements
+    NodeReplacerTest_Getter {
+  @override
+  Expression get(IndexExpression node) => node.index;
+}
+
+class Getter_NodeReplacerTest_test_instanceCreationExpression implements
+    NodeReplacerTest_Getter {
+  @override
+  ArgumentList get(InstanceCreationExpression node) => node.argumentList;
+}
+
+class Getter_NodeReplacerTest_test_instanceCreationExpression_2 implements
+    NodeReplacerTest_Getter {
+  @override
+  ConstructorName get(InstanceCreationExpression node) => node.constructorName;
+}
+
+class Getter_NodeReplacerTest_test_interpolationExpression implements
+    NodeReplacerTest_Getter {
+  @override
+  Expression get(InterpolationExpression node) => node.expression;
+}
+
+class Getter_NodeReplacerTest_test_isExpression implements
+    NodeReplacerTest_Getter {
+  @override
+  Expression get(IsExpression node) => node.expression;
+}
+
+class Getter_NodeReplacerTest_test_isExpression_2 implements
+    NodeReplacerTest_Getter {
+  @override
+  TypeName get(IsExpression node) => node.type;
+}
+
+class Getter_NodeReplacerTest_test_label implements NodeReplacerTest_Getter {
+  @override
+  SimpleIdentifier get(Label node) => node.label;
+}
+
+class Getter_NodeReplacerTest_test_labeledStatement implements
+    NodeReplacerTest_Getter {
+  @override
+  Statement get(LabeledStatement node) => node.statement;
+}
+
+class Getter_NodeReplacerTest_test_libraryDirective implements
+    NodeReplacerTest_Getter {
+  @override
+  LibraryIdentifier get(LibraryDirective node) => node.name;
+}
+
+class Getter_NodeReplacerTest_test_mapLiteralEntry implements
+    NodeReplacerTest_Getter {
+  @override
+  Expression get(MapLiteralEntry node) => node.value;
+}
+
+class Getter_NodeReplacerTest_test_mapLiteralEntry_2 implements
+    NodeReplacerTest_Getter {
+  @override
+  Expression get(MapLiteralEntry node) => node.key;
+}
+
+class Getter_NodeReplacerTest_test_methodDeclaration implements
+    NodeReplacerTest_Getter {
+  @override
+  TypeName get(MethodDeclaration node) => node.returnType;
+}
+
+class Getter_NodeReplacerTest_test_methodDeclaration_2 implements
+    NodeReplacerTest_Getter {
+  @override
+  FunctionBody get(MethodDeclaration node) => node.body;
+}
+
+class Getter_NodeReplacerTest_test_methodDeclaration_3 implements
+    NodeReplacerTest_Getter {
+  @override
+  SimpleIdentifier get(MethodDeclaration node) => node.name;
+}
+
+class Getter_NodeReplacerTest_test_methodDeclaration_4 implements
+    NodeReplacerTest_Getter {
+  @override
+  FormalParameterList get(MethodDeclaration node) => node.parameters;
+}
+
+class Getter_NodeReplacerTest_test_methodInvocation implements
+    NodeReplacerTest_Getter {
+  @override
+  ArgumentList get(MethodInvocation node) => node.argumentList;
+}
+
+class Getter_NodeReplacerTest_test_methodInvocation_2 implements
+    NodeReplacerTest_Getter {
+  @override
+  Expression get(MethodInvocation node) => node.target;
+}
+
+class Getter_NodeReplacerTest_test_methodInvocation_3 implements
+    NodeReplacerTest_Getter {
+  @override
+  SimpleIdentifier get(MethodInvocation node) => node.methodName;
+}
+
+class Getter_NodeReplacerTest_test_namedExpression implements
+    NodeReplacerTest_Getter {
+  @override
+  Label get(NamedExpression node) => node.name;
+}
+
+class Getter_NodeReplacerTest_test_namedExpression_2 implements
+    NodeReplacerTest_Getter {
+  @override
+  Expression get(NamedExpression node) => node.expression;
+}
+
+class Getter_NodeReplacerTest_test_nativeClause implements
+    NodeReplacerTest_Getter {
+  @override
+  StringLiteral get(NativeClause node) => node.name;
+}
+
+class Getter_NodeReplacerTest_test_nativeFunctionBody implements
+    NodeReplacerTest_Getter {
+  @override
+  StringLiteral get(NativeFunctionBody node) => node.stringLiteral;
+}
+
+class Getter_NodeReplacerTest_test_parenthesizedExpression implements
+    NodeReplacerTest_Getter {
+  @override
+  Expression get(ParenthesizedExpression node) => node.expression;
+}
+
+class Getter_NodeReplacerTest_test_partOfDirective implements
+    NodeReplacerTest_Getter {
+  @override
+  LibraryIdentifier get(PartOfDirective node) => node.libraryName;
+}
+
+class Getter_NodeReplacerTest_test_postfixExpression implements
+    NodeReplacerTest_Getter {
+  @override
+  Expression get(PostfixExpression node) => node.operand;
+}
+
+class Getter_NodeReplacerTest_test_prefixExpression implements
+    NodeReplacerTest_Getter {
+  @override
+  Expression get(PrefixExpression node) => node.operand;
+}
+
+class Getter_NodeReplacerTest_test_prefixedIdentifier implements
+    NodeReplacerTest_Getter {
+  @override
+  SimpleIdentifier get(PrefixedIdentifier node) => node.identifier;
+}
+
+class Getter_NodeReplacerTest_test_prefixedIdentifier_2 implements
+    NodeReplacerTest_Getter {
+  @override
+  SimpleIdentifier get(PrefixedIdentifier node) => node.prefix;
+}
+
+class Getter_NodeReplacerTest_test_propertyAccess implements
+    NodeReplacerTest_Getter {
+  @override
+  Expression get(PropertyAccess node) => node.target;
+}
+
+class Getter_NodeReplacerTest_test_propertyAccess_2 implements
+    NodeReplacerTest_Getter {
+  @override
+  SimpleIdentifier get(PropertyAccess node) => node.propertyName;
+}
+
+class Getter_NodeReplacerTest_test_redirectingConstructorInvocation implements
+    NodeReplacerTest_Getter {
+  @override
+  SimpleIdentifier get(RedirectingConstructorInvocation node) =>
+      node.constructorName;
+}
+
+class Getter_NodeReplacerTest_test_redirectingConstructorInvocation_2 implements
+    NodeReplacerTest_Getter {
+  @override
+  ArgumentList get(RedirectingConstructorInvocation node) => node.argumentList;
+}
+
+class Getter_NodeReplacerTest_test_returnStatement implements
+    NodeReplacerTest_Getter {
+  @override
+  Expression get(ReturnStatement node) => node.expression;
+}
+
+class Getter_NodeReplacerTest_test_simpleFormalParameter implements
+    NodeReplacerTest_Getter {
+  @override
+  TypeName get(SimpleFormalParameter node) => node.type;
+}
+
+class Getter_NodeReplacerTest_test_superConstructorInvocation implements
+    NodeReplacerTest_Getter {
+  @override
+  SimpleIdentifier get(SuperConstructorInvocation node) => node.constructorName;
+}
+
+class Getter_NodeReplacerTest_test_superConstructorInvocation_2 implements
+    NodeReplacerTest_Getter {
+  @override
+  ArgumentList get(SuperConstructorInvocation node) => node.argumentList;
+}
+
+class Getter_NodeReplacerTest_test_switchCase implements NodeReplacerTest_Getter
+    {
+  @override
+  Expression get(SwitchCase node) => node.expression;
+}
+
+class Getter_NodeReplacerTest_test_switchStatement implements
+    NodeReplacerTest_Getter {
+  @override
+  Expression get(SwitchStatement node) => node.expression;
+}
+
+class Getter_NodeReplacerTest_test_throwExpression implements
+    NodeReplacerTest_Getter {
+  @override
+  Expression get(ThrowExpression node) => node.expression;
+}
+
+class Getter_NodeReplacerTest_test_topLevelVariableDeclaration implements
+    NodeReplacerTest_Getter {
+  @override
+  VariableDeclarationList get(TopLevelVariableDeclaration node) =>
+      node.variables;
+}
+
+class Getter_NodeReplacerTest_test_tryStatement implements
+    NodeReplacerTest_Getter {
+  @override
+  Block get(TryStatement node) => node.finallyBlock;
+}
+
+class Getter_NodeReplacerTest_test_tryStatement_2 implements
+    NodeReplacerTest_Getter {
+  @override
+  Block get(TryStatement node) => node.body;
+}
+
+class Getter_NodeReplacerTest_test_typeName implements NodeReplacerTest_Getter {
+  @override
+  TypeArgumentList get(TypeName node) => node.typeArguments;
+}
+
+class Getter_NodeReplacerTest_test_typeName_2 implements NodeReplacerTest_Getter
+    {
+  @override
+  Identifier get(TypeName node) => node.name;
+}
+
+class Getter_NodeReplacerTest_test_typeParameter implements
+    NodeReplacerTest_Getter {
+  @override
+  TypeName get(TypeParameter node) => node.bound;
+}
+
+class Getter_NodeReplacerTest_test_typeParameter_2 implements
+    NodeReplacerTest_Getter {
+  @override
+  SimpleIdentifier get(TypeParameter node) => node.name;
+}
+
+class Getter_NodeReplacerTest_test_variableDeclaration implements
+    NodeReplacerTest_Getter {
+  @override
+  SimpleIdentifier get(VariableDeclaration node) => node.name;
+}
+
+class Getter_NodeReplacerTest_test_variableDeclarationList implements
+    NodeReplacerTest_Getter {
+  @override
+  TypeName get(VariableDeclarationList node) => node.type;
+}
+
+class Getter_NodeReplacerTest_test_variableDeclarationStatement implements
+    NodeReplacerTest_Getter {
+  @override
+  VariableDeclarationList get(VariableDeclarationStatement node) =>
+      node.variables;
+}
+
+class Getter_NodeReplacerTest_test_variableDeclaration_2 implements
+    NodeReplacerTest_Getter {
+  @override
+  Expression get(VariableDeclaration node) => node.initializer;
+}
+
+class Getter_NodeReplacerTest_test_whileStatement implements
+    NodeReplacerTest_Getter {
+  @override
+  Expression get(WhileStatement node) => node.condition;
+}
+
+class Getter_NodeReplacerTest_test_whileStatement_2 implements
+    NodeReplacerTest_Getter {
+  @override
+  Statement get(WhileStatement node) => node.body;
+}
+
+class LineInfoTest {
+  void test_creation() {
+    expect(new LineInfo(<int>[0]), isNotNull);
+  }
+
+  void test_creation_empty() {
+    try {
+      new LineInfo(<int>[]);
+      fail("Expected IllegalArgumentException");
+    } on IllegalArgumentException catch (exception) {
+      // Expected
+    }
+  }
+
+  void test_creation_null() {
+    try {
+      new LineInfo(null);
+      fail("Expected IllegalArgumentException");
+    } on IllegalArgumentException catch (exception) {
+      // Expected
+    }
+  }
+
+  void test_firstLine() {
+    LineInfo info = new LineInfo(<int>[0, 12, 34]);
+    LineInfo_Location location = info.getLocation(4);
+    expect(location.lineNumber, 1);
+    expect(location.columnNumber, 5);
+  }
+
+  void test_lastLine() {
+    LineInfo info = new LineInfo(<int>[0, 12, 34]);
+    LineInfo_Location location = info.getLocation(36);
+    expect(location.lineNumber, 3);
+    expect(location.columnNumber, 3);
+  }
+
+  void test_middleLine() {
+    LineInfo info = new LineInfo(<int>[0, 12, 34]);
+    LineInfo_Location location = info.getLocation(12);
+    expect(location.lineNumber, 2);
+    expect(location.columnNumber, 1);
+  }
+}
+
+class ListGetter_NodeReplacerTest_testAnnotatedNode extends
+    NodeReplacerTest_ListGetter<AnnotatedNode, Annotation> {
+  ListGetter_NodeReplacerTest_testAnnotatedNode(int arg0) : super(arg0);
+
+  @override
+  NodeList<Annotation> getList(AnnotatedNode node) => node.metadata;
+}
+
+class ListGetter_NodeReplacerTest_testNamespaceDirective extends
+    NodeReplacerTest_ListGetter<NamespaceDirective, Combinator> {
+  ListGetter_NodeReplacerTest_testNamespaceDirective(int arg0) : super(arg0);
+
+  @override
+  NodeList<Combinator> getList(NamespaceDirective node) => node.combinators;
+}
+
+class ListGetter_NodeReplacerTest_testNormalFormalParameter extends
+    NodeReplacerTest_ListGetter<NormalFormalParameter, Annotation> {
+  ListGetter_NodeReplacerTest_testNormalFormalParameter(int arg0) : super(arg0);
+
+  @override
+  NodeList<Annotation> getList(NormalFormalParameter node) => node.metadata;
+}
+
+class ListGetter_NodeReplacerTest_testSwitchMember extends
+    NodeReplacerTest_ListGetter<SwitchMember, Label> {
+  ListGetter_NodeReplacerTest_testSwitchMember(int arg0) : super(arg0);
+
+  @override
+  NodeList<Label> getList(SwitchMember node) => node.labels;
+}
+
+class ListGetter_NodeReplacerTest_testSwitchMember_2 extends
+    NodeReplacerTest_ListGetter<SwitchMember, Statement> {
+  ListGetter_NodeReplacerTest_testSwitchMember_2(int arg0) : super(arg0);
+
+  @override
+  NodeList<Statement> getList(SwitchMember node) => node.statements;
+}
+
+class ListGetter_NodeReplacerTest_test_adjacentStrings extends
+    NodeReplacerTest_ListGetter<AdjacentStrings, StringLiteral> {
+  ListGetter_NodeReplacerTest_test_adjacentStrings(int arg0) : super(arg0);
+
+  @override
+  NodeList<StringLiteral> getList(AdjacentStrings node) => node.strings;
+}
+
+class ListGetter_NodeReplacerTest_test_adjacentStrings_2 extends
+    NodeReplacerTest_ListGetter<AdjacentStrings, StringLiteral> {
+  ListGetter_NodeReplacerTest_test_adjacentStrings_2(int arg0) : super(arg0);
+
+  @override
+  NodeList<StringLiteral> getList(AdjacentStrings node) => node.strings;
+}
+
+class ListGetter_NodeReplacerTest_test_argumentList extends
+    NodeReplacerTest_ListGetter<ArgumentList, Expression> {
+  ListGetter_NodeReplacerTest_test_argumentList(int arg0) : super(arg0);
+
+  @override
+  NodeList<Expression> getList(ArgumentList node) => node.arguments;
+}
+
+class ListGetter_NodeReplacerTest_test_block extends
+    NodeReplacerTest_ListGetter<Block, Statement> {
+  ListGetter_NodeReplacerTest_test_block(int arg0) : super(arg0);
+
+  @override
+  NodeList<Statement> getList(Block node) => node.statements;
+}
+
+class ListGetter_NodeReplacerTest_test_cascadeExpression extends
+    NodeReplacerTest_ListGetter<CascadeExpression, Expression> {
+  ListGetter_NodeReplacerTest_test_cascadeExpression(int arg0) : super(arg0);
+
+  @override
+  NodeList<Expression> getList(CascadeExpression node) => node.cascadeSections;
+}
+
+class ListGetter_NodeReplacerTest_test_classDeclaration extends
+    NodeReplacerTest_ListGetter<ClassDeclaration, ClassMember> {
+  ListGetter_NodeReplacerTest_test_classDeclaration(int arg0) : super(arg0);
+
+  @override
+  NodeList<ClassMember> getList(ClassDeclaration node) => node.members;
+}
+
+class ListGetter_NodeReplacerTest_test_comment extends
+    NodeReplacerTest_ListGetter<Comment, CommentReference> {
+  ListGetter_NodeReplacerTest_test_comment(int arg0) : super(arg0);
+
+  @override
+  NodeList<CommentReference> getList(Comment node) => node.references;
+}
+
+class ListGetter_NodeReplacerTest_test_compilationUnit extends
+    NodeReplacerTest_ListGetter<CompilationUnit, Directive> {
+  ListGetter_NodeReplacerTest_test_compilationUnit(int arg0) : super(arg0);
+
+  @override
+  NodeList<Directive> getList(CompilationUnit node) => node.directives;
+}
+
+class ListGetter_NodeReplacerTest_test_compilationUnit_2 extends
+    NodeReplacerTest_ListGetter<CompilationUnit, CompilationUnitMember> {
+  ListGetter_NodeReplacerTest_test_compilationUnit_2(int arg0) : super(arg0);
+
+  @override
+  NodeList<CompilationUnitMember> getList(CompilationUnit node) =>
+      node.declarations;
+}
+
+class ListGetter_NodeReplacerTest_test_constructorDeclaration extends
+    NodeReplacerTest_ListGetter<ConstructorDeclaration, ConstructorInitializer> {
+  ListGetter_NodeReplacerTest_test_constructorDeclaration(int arg0)
+      : super(arg0);
+
+  @override
+  NodeList<ConstructorInitializer> getList(ConstructorDeclaration node) =>
+      node.initializers;
+}
+
+class ListGetter_NodeReplacerTest_test_forStatement_withInitialization extends
+    NodeReplacerTest_ListGetter<ForStatement, Expression> {
+  ListGetter_NodeReplacerTest_test_forStatement_withInitialization(int arg0)
+      : super(arg0);
+
+  @override
+  NodeList<Expression> getList(ForStatement node) => node.updaters;
+}
+
+class ListGetter_NodeReplacerTest_test_forStatement_withVariables extends
+    NodeReplacerTest_ListGetter<ForStatement, Expression> {
+  ListGetter_NodeReplacerTest_test_forStatement_withVariables(int arg0)
+      : super(arg0);
+
+  @override
+  NodeList<Expression> getList(ForStatement node) => node.updaters;
+}
+
+class ListGetter_NodeReplacerTest_test_formalParameterList extends
+    NodeReplacerTest_ListGetter<FormalParameterList, FormalParameter> {
+  ListGetter_NodeReplacerTest_test_formalParameterList(int arg0) : super(arg0);
+
+  @override
+  NodeList<FormalParameter> getList(FormalParameterList node) =>
+      node.parameters;
+}
+
+class ListGetter_NodeReplacerTest_test_hideCombinator extends
+    NodeReplacerTest_ListGetter<HideCombinator, SimpleIdentifier> {
+  ListGetter_NodeReplacerTest_test_hideCombinator(int arg0) : super(arg0);
+
+  @override
+  NodeList<SimpleIdentifier> getList(HideCombinator node) => node.hiddenNames;
+}
+
+class ListGetter_NodeReplacerTest_test_implementsClause extends
+    NodeReplacerTest_ListGetter<ImplementsClause, TypeName> {
+  ListGetter_NodeReplacerTest_test_implementsClause(int arg0) : super(arg0);
+
+  @override
+  NodeList<TypeName> getList(ImplementsClause node) => node.interfaces;
+}
+
+class ListGetter_NodeReplacerTest_test_labeledStatement extends
+    NodeReplacerTest_ListGetter<LabeledStatement, Label> {
+  ListGetter_NodeReplacerTest_test_labeledStatement(int arg0) : super(arg0);
+
+  @override
+  NodeList<Label> getList(LabeledStatement node) => node.labels;
+}
+
+class ListGetter_NodeReplacerTest_test_libraryIdentifier extends
+    NodeReplacerTest_ListGetter<LibraryIdentifier, SimpleIdentifier> {
+  ListGetter_NodeReplacerTest_test_libraryIdentifier(int arg0) : super(arg0);
+
+  @override
+  NodeList<SimpleIdentifier> getList(LibraryIdentifier node) => node.components;
+}
+
+class ListGetter_NodeReplacerTest_test_listLiteral extends
+    NodeReplacerTest_ListGetter<ListLiteral, Expression> {
+  ListGetter_NodeReplacerTest_test_listLiteral(int arg0) : super(arg0);
+
+  @override
+  NodeList<Expression> getList(ListLiteral node) => node.elements;
+}
+
+class ListGetter_NodeReplacerTest_test_mapLiteral extends
+    NodeReplacerTest_ListGetter<MapLiteral, MapLiteralEntry> {
+  ListGetter_NodeReplacerTest_test_mapLiteral(int arg0) : super(arg0);
+
+  @override
+  NodeList<MapLiteralEntry> getList(MapLiteral node) => node.entries;
+}
+
+class ListGetter_NodeReplacerTest_test_showCombinator extends
+    NodeReplacerTest_ListGetter<ShowCombinator, SimpleIdentifier> {
+  ListGetter_NodeReplacerTest_test_showCombinator(int arg0) : super(arg0);
+
+  @override
+  NodeList<SimpleIdentifier> getList(ShowCombinator node) => node.shownNames;
+}
+
+class ListGetter_NodeReplacerTest_test_stringInterpolation extends
+    NodeReplacerTest_ListGetter<StringInterpolation, InterpolationElement> {
+  ListGetter_NodeReplacerTest_test_stringInterpolation(int arg0) : super(arg0);
+
+  @override
+  NodeList<InterpolationElement> getList(StringInterpolation node) =>
+      node.elements;
+}
+
+class ListGetter_NodeReplacerTest_test_switchStatement extends
+    NodeReplacerTest_ListGetter<SwitchStatement, SwitchMember> {
+  ListGetter_NodeReplacerTest_test_switchStatement(int arg0) : super(arg0);
+
+  @override
+  NodeList<SwitchMember> getList(SwitchStatement node) => node.members;
+}
+
+class ListGetter_NodeReplacerTest_test_tryStatement extends
+    NodeReplacerTest_ListGetter<TryStatement, CatchClause> {
+  ListGetter_NodeReplacerTest_test_tryStatement(int arg0) : super(arg0);
+
+  @override
+  NodeList<CatchClause> getList(TryStatement node) => node.catchClauses;
+}
+
+class ListGetter_NodeReplacerTest_test_typeArgumentList extends
+    NodeReplacerTest_ListGetter<TypeArgumentList, TypeName> {
+  ListGetter_NodeReplacerTest_test_typeArgumentList(int arg0) : super(arg0);
+
+  @override
+  NodeList<TypeName> getList(TypeArgumentList node) => node.arguments;
+}
+
+class ListGetter_NodeReplacerTest_test_typeParameterList extends
+    NodeReplacerTest_ListGetter<TypeParameterList, TypeParameter> {
+  ListGetter_NodeReplacerTest_test_typeParameterList(int arg0) : super(arg0);
+
+  @override
+  NodeList<TypeParameter> getList(TypeParameterList node) =>
+      node.typeParameters;
+}
+
+class ListGetter_NodeReplacerTest_test_variableDeclarationList extends
+    NodeReplacerTest_ListGetter<VariableDeclarationList, VariableDeclaration> {
+  ListGetter_NodeReplacerTest_test_variableDeclarationList(int arg0)
+      : super(arg0);
+
+  @override
+  NodeList<VariableDeclaration> getList(VariableDeclarationList node) =>
+      node.variables;
+}
+
+class ListGetter_NodeReplacerTest_test_withClause extends
+    NodeReplacerTest_ListGetter<WithClause, TypeName> {
+  ListGetter_NodeReplacerTest_test_withClause(int arg0) : super(arg0);
+
+  @override
+  NodeList<TypeName> getList(WithClause node) => node.mixinTypes;
+}
+
+class ListUtilitiesTest {
+  void test_addAll_emptyToEmpty() {
+    List<String> list = new List<String>();
+    List<String> elements = [];
+    ListUtilities.addAll(list, elements);
+    expect(list.length, 0);
+  }
+
+  void test_addAll_emptyToNonEmpty() {
+    List<String> list = new List<String>();
+    list.add("a");
+    List<String> elements = [];
+    ListUtilities.addAll(list, elements);
+    expect(list.length, 1);
+  }
+
+  void test_addAll_nonEmptyToEmpty() {
+    List<String> list = new List<String>();
+    List<String> elements = ["b", "c"];
+    ListUtilities.addAll(list, elements);
+    expect(list.length, 2);
+  }
+
+  void test_addAll_nonEmptyToNonEmpty() {
+    List<String> list = new List<String>();
+    list.add("a");
+    List<String> elements = ["b", "c"];
+    ListUtilities.addAll(list, elements);
+    expect(list.length, 3);
+  }
+}
+
+class MultipleMapIteratorTest extends EngineTestCase {
+  void test_multipleMaps_firstEmpty() {
+    Map<String, String> map1 = new HashMap<String, String>();
+    Map<String, String> map2 = new HashMap<String, String>();
+    map2["k2"] = "v2";
+    Map<String, String> map3 = new HashMap<String, String>();
+    map3["k3"] = "v3";
+    MultipleMapIterator<String, String> iterator =
+        _iterator([map1, map2, map3]);
+    expect(iterator.moveNext(), isTrue);
+    expect(iterator.moveNext(), isTrue);
+    expect(iterator.moveNext(), isFalse);
+  }
+
+  void test_multipleMaps_lastEmpty() {
+    Map<String, String> map1 = new HashMap<String, String>();
+    map1["k1"] = "v1";
+    Map<String, String> map2 = new HashMap<String, String>();
+    map2["k2"] = "v2";
+    Map<String, String> map3 = new HashMap<String, String>();
+    MultipleMapIterator<String, String> iterator =
+        _iterator([map1, map2, map3]);
+    expect(iterator.moveNext(), isTrue);
+    expect(iterator.moveNext(), isTrue);
+    expect(iterator.moveNext(), isFalse);
+  }
+
+  void test_multipleMaps_middleEmpty() {
+    Map<String, String> map1 = new HashMap<String, String>();
+    map1["k1"] = "v1";
+    Map<String, String> map2 = new HashMap<String, String>();
+    Map<String, String> map3 = new HashMap<String, String>();
+    map3["k3"] = "v3";
+    MultipleMapIterator<String, String> iterator =
+        _iterator([map1, map2, map3]);
+    expect(iterator.moveNext(), isTrue);
+    expect(iterator.moveNext(), isTrue);
+    expect(iterator.moveNext(), isFalse);
+  }
+
+  void test_multipleMaps_nonEmpty() {
+    Map<String, String> map1 = new HashMap<String, String>();
+    map1["k1"] = "v1";
+    Map<String, String> map2 = new HashMap<String, String>();
+    map2["k2"] = "v2";
+    Map<String, String> map3 = new HashMap<String, String>();
+    map3["k3"] = "v3";
+    MultipleMapIterator<String, String> iterator =
+        _iterator([map1, map2, map3]);
+    expect(iterator.moveNext(), isTrue);
+    expect(iterator.moveNext(), isTrue);
+    expect(iterator.moveNext(), isTrue);
+    expect(iterator.moveNext(), isFalse);
+  }
+
+  void test_noMap() {
+    MultipleMapIterator<String, String> iterator = _iterator([]);
+    expect(iterator.moveNext(), isFalse);
+    expect(iterator.moveNext(), isFalse);
+  }
+
+  void test_singleMap_empty() {
+    Map<String, String> map = new HashMap<String, String>();
+    MultipleMapIterator<String, String> iterator = _iterator(<Map>[map]);
+    expect(iterator.moveNext(), isFalse);
+    try {
+      iterator.key;
+      fail("Expected NoSuchElementException");
+    } on NoSuchElementException catch (exception) {
+      // Expected
+    }
+    try {
+      iterator.value;
+      fail("Expected NoSuchElementException");
+    } on NoSuchElementException catch (exception) {
+      // Expected
+    }
+    try {
+      iterator.value = "x";
+      fail("Expected NoSuchElementException");
+    } on NoSuchElementException catch (exception) {
+      // Expected
+    }
+  }
+
+  void test_singleMap_multiple() {
+    Map<String, String> map = new HashMap<String, String>();
+    map["k1"] = "v1";
+    map["k2"] = "v2";
+    map["k3"] = "v3";
+    MultipleMapIterator<String, String> iterator = _iterator([map]);
+    expect(iterator.moveNext(), isTrue);
+    expect(iterator.moveNext(), isTrue);
+    expect(iterator.moveNext(), isTrue);
+    expect(iterator.moveNext(), isFalse);
+  }
+
+  void test_singleMap_single() {
+    String key = "key";
+    String value = "value";
+    Map<String, String> map = new HashMap<String, String>();
+    map[key] = value;
+    MultipleMapIterator<String, String> iterator = _iterator([map]);
+    expect(iterator.moveNext(), isTrue);
+    expect(iterator.key, same(key));
+    expect(iterator.value, same(value));
+    String newValue = "newValue";
+    iterator.value = newValue;
+    expect(iterator.value, same(newValue));
+    expect(iterator.moveNext(), isFalse);
+  }
+
+  MultipleMapIterator<String, String> _iterator(List<Map> maps) {
+    return new MultipleMapIterator<String, String>(maps);
+  }
+}
+
+class NodeReplacerTest extends EngineTestCase {
+  void test_adjacentStrings() {
+    AdjacentStrings node =
+        AstFactory.adjacentStrings([AstFactory.string2("a"), AstFactory.string2("b")]);
+    _assertReplace(
+        node,
+        new ListGetter_NodeReplacerTest_test_adjacentStrings_2(0));
+    _assertReplace(
+        node,
+        new ListGetter_NodeReplacerTest_test_adjacentStrings(1));
+  }
+
+  void test_annotation() {
+    Annotation node = AstFactory.annotation2(
+        AstFactory.identifier3("C"),
+        AstFactory.identifier3("c"),
+        AstFactory.argumentList([AstFactory.integer(0)]));
+    _assertReplace(node, new Getter_NodeReplacerTest_test_annotation());
+    _assertReplace(node, new Getter_NodeReplacerTest_test_annotation_3());
+    _assertReplace(node, new Getter_NodeReplacerTest_test_annotation_2());
+  }
+
+  void test_argumentList() {
+    ArgumentList node = AstFactory.argumentList([AstFactory.integer(0)]);
+    _assertReplace(node, new ListGetter_NodeReplacerTest_test_argumentList(0));
+  }
+
+  void test_asExpression() {
+    AsExpression node = AstFactory.asExpression(
+        AstFactory.integer(0),
+        AstFactory.typeName3(
+            AstFactory.identifier3("a"),
+            [AstFactory.typeName4("C", [])]));
+    _assertReplace(node, new Getter_NodeReplacerTest_test_asExpression_2());
+    _assertReplace(node, new Getter_NodeReplacerTest_test_asExpression());
+  }
+
+  void test_assertStatement() {
+    AssertStatement node =
+        AstFactory.assertStatement(AstFactory.booleanLiteral(true));
+    _assertReplace(node, new Getter_NodeReplacerTest_test_assertStatement());
+  }
+
+  void test_assignmentExpression() {
+    AssignmentExpression node = AstFactory.assignmentExpression(
+        AstFactory.identifier3("l"),
+        TokenType.EQ,
+        AstFactory.identifier3("r"));
+    _assertReplace(
+        node,
+        new Getter_NodeReplacerTest_test_assignmentExpression_2());
+    _assertReplace(
+        node,
+        new Getter_NodeReplacerTest_test_assignmentExpression());
+  }
+
+  void test_binaryExpression() {
+    BinaryExpression node = AstFactory.binaryExpression(
+        AstFactory.identifier3("l"),
+        TokenType.PLUS,
+        AstFactory.identifier3("r"));
+    _assertReplace(node, new Getter_NodeReplacerTest_test_binaryExpression());
+    _assertReplace(node, new Getter_NodeReplacerTest_test_binaryExpression_2());
+  }
+
+  void test_block() {
+    Block node = AstFactory.block([AstFactory.emptyStatement()]);
+    _assertReplace(node, new ListGetter_NodeReplacerTest_test_block(0));
+  }
+
+  void test_blockFunctionBody() {
+    BlockFunctionBody node = AstFactory.blockFunctionBody(AstFactory.block([]));
+    _assertReplace(node, new Getter_NodeReplacerTest_test_blockFunctionBody());
+  }
+
+  void test_breakStatement() {
+    BreakStatement node = AstFactory.breakStatement2("l");
+    _assertReplace(node, new Getter_NodeReplacerTest_test_breakStatement());
+  }
+
+  void test_cascadeExpression() {
+    CascadeExpression node = AstFactory.cascadeExpression(
+        AstFactory.integer(0),
+        [AstFactory.propertyAccess(null, AstFactory.identifier3("b"))]);
+    _assertReplace(node, new Getter_NodeReplacerTest_test_cascadeExpression());
+    _assertReplace(
+        node,
+        new ListGetter_NodeReplacerTest_test_cascadeExpression(0));
+  }
+
+  void test_catchClause() {
+    CatchClause node = AstFactory.catchClause5(
+        AstFactory.typeName4("E", []),
+        "e",
+        "s",
+        [AstFactory.emptyStatement()]);
+    _assertReplace(node, new Getter_NodeReplacerTest_test_catchClause_3());
+    _assertReplace(node, new Getter_NodeReplacerTest_test_catchClause_2());
+    _assertReplace(node, new Getter_NodeReplacerTest_test_catchClause());
+  }
+
+  void test_classDeclaration() {
+    ClassDeclaration node = AstFactory.classDeclaration(
+        null,
+        "A",
+        AstFactory.typeParameterList(["E"]),
+        AstFactory.extendsClause(AstFactory.typeName4("B", [])),
+        AstFactory.withClause([AstFactory.typeName4("C", [])]),
+        AstFactory.implementsClause([AstFactory.typeName4("D", [])]),
+        [
+            AstFactory.fieldDeclaration2(
+                false,
+                null,
+                [AstFactory.variableDeclaration("f")])]);
+    node.documentationComment =
+        Comment.createEndOfLineComment(new List<Token>(0));
+    node.metadata =
+        AstFactory.list([AstFactory.annotation(AstFactory.identifier3("a"))]);
+    node.nativeClause = AstFactory.nativeClause("");
+    _assertReplace(node, new Getter_NodeReplacerTest_test_classDeclaration_6());
+    _assertReplace(node, new Getter_NodeReplacerTest_test_classDeclaration_5());
+    _assertReplace(node, new Getter_NodeReplacerTest_test_classDeclaration_4());
+    _assertReplace(node, new Getter_NodeReplacerTest_test_classDeclaration_2());
+    _assertReplace(node, new Getter_NodeReplacerTest_test_classDeclaration());
+    _assertReplace(node, new Getter_NodeReplacerTest_test_classDeclaration_3());
+    _assertReplace(
+        node,
+        new ListGetter_NodeReplacerTest_test_classDeclaration(0));
+    _testAnnotatedNode(node);
+  }
+
+  void test_classTypeAlias() {
+    ClassTypeAlias node = AstFactory.classTypeAlias(
+        "A",
+        AstFactory.typeParameterList(["E"]),
+        null,
+        AstFactory.typeName4("B", []),
+        AstFactory.withClause([AstFactory.typeName4("C", [])]),
+        AstFactory.implementsClause([AstFactory.typeName4("D", [])]));
+    node.documentationComment =
+        Comment.createEndOfLineComment(new List<Token>(0));
+    node.metadata =
+        AstFactory.list([AstFactory.annotation(AstFactory.identifier3("a"))]);
+    _assertReplace(node, new Getter_NodeReplacerTest_test_classTypeAlias_4());
+    _assertReplace(node, new Getter_NodeReplacerTest_test_classTypeAlias_5());
+    _assertReplace(node, new Getter_NodeReplacerTest_test_classTypeAlias());
+    _assertReplace(node, new Getter_NodeReplacerTest_test_classTypeAlias_3());
+    _assertReplace(node, new Getter_NodeReplacerTest_test_classTypeAlias_2());
+    _testAnnotatedNode(node);
+  }
+
+  void test_comment() {
+    Comment node = Comment.createEndOfLineComment(new List<Token>(0));
+    node.references.add(
+        new CommentReference(null, AstFactory.identifier3("x")));
+    _assertReplace(node, new ListGetter_NodeReplacerTest_test_comment(0));
+  }
+
+  void test_commentReference() {
+    CommentReference node =
+        new CommentReference(null, AstFactory.identifier3("x"));
+    _assertReplace(node, new Getter_NodeReplacerTest_test_commentReference());
+  }
+
+  void test_compilationUnit() {
+    CompilationUnit node = AstFactory.compilationUnit8(
+        "",
+        AstFactory.list([AstFactory.libraryDirective2("lib")]),
+        AstFactory.list(
+            [
+                AstFactory.topLevelVariableDeclaration2(
+                    null,
+                    [AstFactory.variableDeclaration("X")])]));
+    _assertReplace(node, new Getter_NodeReplacerTest_test_compilationUnit());
+    _assertReplace(
+        node,
+        new ListGetter_NodeReplacerTest_test_compilationUnit(0));
+    _assertReplace(
+        node,
+        new ListGetter_NodeReplacerTest_test_compilationUnit_2(0));
+  }
+
+  void test_conditionalExpression() {
+    ConditionalExpression node = AstFactory.conditionalExpression(
+        AstFactory.booleanLiteral(true),
+        AstFactory.integer(0),
+        AstFactory.integer(1));
+    _assertReplace(
+        node,
+        new Getter_NodeReplacerTest_test_conditionalExpression_3());
+    _assertReplace(
+        node,
+        new Getter_NodeReplacerTest_test_conditionalExpression_2());
+    _assertReplace(
+        node,
+        new Getter_NodeReplacerTest_test_conditionalExpression());
+  }
+
+  void test_constructorDeclaration() {
+    ConstructorDeclaration node = AstFactory.constructorDeclaration2(
+        null,
+        null,
+        AstFactory.identifier3("C"),
+        "d",
+        AstFactory.formalParameterList([]),
+        AstFactory.list(
+            [AstFactory.constructorFieldInitializer(false, "x", AstFactory.integer(0))]),
+        AstFactory.emptyFunctionBody());
+    node.documentationComment =
+        Comment.createEndOfLineComment(new List<Token>(0));
+    node.metadata =
+        AstFactory.list([AstFactory.annotation(AstFactory.identifier3("a"))]);
+    node.redirectedConstructor =
+        AstFactory.constructorName(AstFactory.typeName4("B", []), "a");
+    _assertReplace(
+        node,
+        new Getter_NodeReplacerTest_test_constructorDeclaration_3());
+    _assertReplace(
+        node,
+        new Getter_NodeReplacerTest_test_constructorDeclaration_2());
+    _assertReplace(
+        node,
+        new Getter_NodeReplacerTest_test_constructorDeclaration_4());
+    _assertReplace(
+        node,
+        new Getter_NodeReplacerTest_test_constructorDeclaration());
+    _assertReplace(
+        node,
+        new Getter_NodeReplacerTest_test_constructorDeclaration_5());
+    _assertReplace(
+        node,
+        new ListGetter_NodeReplacerTest_test_constructorDeclaration(0));
+    _testAnnotatedNode(node);
+  }
+
+  void test_constructorFieldInitializer() {
+    ConstructorFieldInitializer node =
+        AstFactory.constructorFieldInitializer(false, "f", AstFactory.integer(0));
+    _assertReplace(
+        node,
+        new Getter_NodeReplacerTest_test_constructorFieldInitializer());
+    _assertReplace(
+        node,
+        new Getter_NodeReplacerTest_test_constructorFieldInitializer_2());
+  }
+
+  void test_constructorName() {
+    ConstructorName node =
+        AstFactory.constructorName(AstFactory.typeName4("C", []), "n");
+    _assertReplace(node, new Getter_NodeReplacerTest_test_constructorName());
+    _assertReplace(node, new Getter_NodeReplacerTest_test_constructorName_2());
+  }
+
+  void test_continueStatement() {
+    ContinueStatement node = AstFactory.continueStatement("l");
+    _assertReplace(node, new Getter_NodeReplacerTest_test_continueStatement());
+  }
+
+  void test_declaredIdentifier() {
+    DeclaredIdentifier node =
+        AstFactory.declaredIdentifier4(AstFactory.typeName4("C", []), "i");
+    node.documentationComment =
+        Comment.createEndOfLineComment(new List<Token>(0));
+    node.metadata =
+        AstFactory.list([AstFactory.annotation(AstFactory.identifier3("a"))]);
+    _assertReplace(node, new Getter_NodeReplacerTest_test_declaredIdentifier());
+    _assertReplace(
+        node,
+        new Getter_NodeReplacerTest_test_declaredIdentifier_2());
+    _testAnnotatedNode(node);
+  }
+
+  void test_defaultFormalParameter() {
+    DefaultFormalParameter node = AstFactory.positionalFormalParameter(
+        AstFactory.simpleFormalParameter3("p"),
+        AstFactory.integer(0));
+    _assertReplace(
+        node,
+        new Getter_NodeReplacerTest_test_defaultFormalParameter());
+    _assertReplace(
+        node,
+        new Getter_NodeReplacerTest_test_defaultFormalParameter_2());
+  }
+
+  void test_doStatement() {
+    DoStatement node =
+        AstFactory.doStatement(AstFactory.block([]), AstFactory.booleanLiteral(true));
+    _assertReplace(node, new Getter_NodeReplacerTest_test_doStatement_2());
+    _assertReplace(node, new Getter_NodeReplacerTest_test_doStatement());
+  }
+
+  void test_enumConstantDeclaration() {
+    EnumConstantDeclaration node = new EnumConstantDeclaration(
+        Comment.createEndOfLineComment(new List<Token>(0)),
+        AstFactory.list([AstFactory.annotation(AstFactory.identifier3("a"))]),
+        AstFactory.identifier3("C"));
+    _assertReplace(
+        node,
+        new Getter_NodeReplacerTest_test_enumConstantDeclaration());
+    _testAnnotatedNode(node);
+  }
+
+  void test_enumDeclaration() {
+    EnumDeclaration node = AstFactory.enumDeclaration2("E", ["ONE", "TWO"]);
+    node.documentationComment =
+        Comment.createEndOfLineComment(new List<Token>(0));
+    node.metadata =
+        AstFactory.list([AstFactory.annotation(AstFactory.identifier3("a"))]);
+    _assertReplace(node, new Getter_NodeReplacerTest_test_enumDeclaration());
+    _testAnnotatedNode(node);
+  }
+
+  void test_exportDirective() {
+    ExportDirective node =
+        AstFactory.exportDirective2("", [AstFactory.hideCombinator2(["C"])]);
+    node.documentationComment =
+        Comment.createEndOfLineComment(new List<Token>(0));
+    node.metadata =
+        AstFactory.list([AstFactory.annotation(AstFactory.identifier3("a"))]);
+    _testNamespaceDirective(node);
+  }
+
+  void test_expressionFunctionBody() {
+    ExpressionFunctionBody node =
+        AstFactory.expressionFunctionBody(AstFactory.integer(0));
+    _assertReplace(
+        node,
+        new Getter_NodeReplacerTest_test_expressionFunctionBody());
+  }
+
+  void test_expressionStatement() {
+    ExpressionStatement node =
+        AstFactory.expressionStatement(AstFactory.integer(0));
+    _assertReplace(
+        node,
+        new Getter_NodeReplacerTest_test_expressionStatement());
+  }
+
+  void test_extendsClause() {
+    ExtendsClause node =
+        AstFactory.extendsClause(AstFactory.typeName4("S", []));
+    _assertReplace(node, new Getter_NodeReplacerTest_test_extendsClause());
+  }
+
+  void test_fieldDeclaration() {
+    FieldDeclaration node = AstFactory.fieldDeclaration(
+        false,
+        null,
+        AstFactory.typeName4("C", []),
+        [AstFactory.variableDeclaration("c")]);
+    node.documentationComment =
+        Comment.createEndOfLineComment(new List<Token>(0));
+    node.metadata =
+        AstFactory.list([AstFactory.annotation(AstFactory.identifier3("a"))]);
+    _assertReplace(node, new Getter_NodeReplacerTest_test_fieldDeclaration());
+    _testAnnotatedNode(node);
+  }
+
+  void test_fieldFormalParameter() {
+    FieldFormalParameter node = AstFactory.fieldFormalParameter(
+        null,
+        AstFactory.typeName4("C", []),
+        "f",
+        AstFactory.formalParameterList([]));
+    node.documentationComment =
+        Comment.createEndOfLineComment(new List<Token>(0));
+    node.metadata =
+        AstFactory.list([AstFactory.annotation(AstFactory.identifier3("a"))]);
+    _assertReplace(
+        node,
+        new Getter_NodeReplacerTest_test_fieldFormalParameter_2());
+    _assertReplace(
+        node,
+        new Getter_NodeReplacerTest_test_fieldFormalParameter());
+    _testNormalFormalParameter(node);
+  }
+
+  void test_forEachStatement_withIdentifier() {
+    ForEachStatement node = AstFactory.forEachStatement2(
+        AstFactory.identifier3("i"),
+        AstFactory.identifier3("l"),
+        AstFactory.block([]));
+    _assertReplace(
+        node,
+        new Getter_NodeReplacerTest_test_forEachStatement_withIdentifier_2());
+    _assertReplace(
+        node,
+        new Getter_NodeReplacerTest_test_forEachStatement_withIdentifier_3());
+    _assertReplace(
+        node,
+        new Getter_NodeReplacerTest_test_forEachStatement_withIdentifier());
+  }
+
+  void test_forEachStatement_withLoopVariable() {
+    ForEachStatement node = AstFactory.forEachStatement(
+        AstFactory.declaredIdentifier3("e"),
+        AstFactory.identifier3("l"),
+        AstFactory.block([]));
+    _assertReplace(
+        node,
+        new Getter_NodeReplacerTest_test_forEachStatement_withLoopVariable_2());
+    _assertReplace(
+        node,
+        new Getter_NodeReplacerTest_test_forEachStatement_withLoopVariable());
+    _assertReplace(
+        node,
+        new Getter_NodeReplacerTest_test_forEachStatement_withLoopVariable_3());
+  }
+
+  void test_forStatement_withInitialization() {
+    ForStatement node = AstFactory.forStatement(
+        AstFactory.identifier3("a"),
+        AstFactory.booleanLiteral(true),
+        AstFactory.list([AstFactory.integer(0)]),
+        AstFactory.block([]));
+    _assertReplace(
+        node,
+        new Getter_NodeReplacerTest_test_forStatement_withInitialization_3());
+    _assertReplace(
+        node,
+        new Getter_NodeReplacerTest_test_forStatement_withInitialization_2());
+    _assertReplace(
+        node,
+        new Getter_NodeReplacerTest_test_forStatement_withInitialization());
+    _assertReplace(
+        node,
+        new ListGetter_NodeReplacerTest_test_forStatement_withInitialization(0));
+  }
+
+  void test_forStatement_withVariables() {
+    ForStatement node = AstFactory.forStatement2(
+        AstFactory.variableDeclarationList2(
+            null,
+            [AstFactory.variableDeclaration("i")]),
+        AstFactory.booleanLiteral(true),
+        AstFactory.list([AstFactory.integer(0)]),
+        AstFactory.block([]));
+    _assertReplace(
+        node,
+        new Getter_NodeReplacerTest_test_forStatement_withVariables_2());
+    _assertReplace(
+        node,
+        new Getter_NodeReplacerTest_test_forStatement_withVariables_3());
+    _assertReplace(
+        node,
+        new Getter_NodeReplacerTest_test_forStatement_withVariables());
+    _assertReplace(
+        node,
+        new ListGetter_NodeReplacerTest_test_forStatement_withVariables(0));
+  }
+
+  void test_formalParameterList() {
+    FormalParameterList node =
+        AstFactory.formalParameterList([AstFactory.simpleFormalParameter3("p")]);
+    _assertReplace(
+        node,
+        new ListGetter_NodeReplacerTest_test_formalParameterList(0));
+  }
+
+  void test_functionDeclaration() {
+    FunctionDeclaration node = AstFactory.functionDeclaration(
+        AstFactory.typeName4("R", []),
+        null,
+        "f",
+        AstFactory.functionExpression2(
+            AstFactory.formalParameterList([]),
+            AstFactory.blockFunctionBody(AstFactory.block([]))));
+    node.documentationComment =
+        Comment.createEndOfLineComment(new List<Token>(0));
+    node.metadata =
+        AstFactory.list([AstFactory.annotation(AstFactory.identifier3("a"))]);
+    _assertReplace(
+        node,
+        new Getter_NodeReplacerTest_test_functionDeclaration());
+    _assertReplace(
+        node,
+        new Getter_NodeReplacerTest_test_functionDeclaration_3());
+    _assertReplace(
+        node,
+        new Getter_NodeReplacerTest_test_functionDeclaration_2());
+    _testAnnotatedNode(node);
+  }
+
+  void test_functionDeclarationStatement() {
+    FunctionDeclarationStatement node = AstFactory.functionDeclarationStatement(
+        AstFactory.typeName4("R", []),
+        null,
+        "f",
+        AstFactory.functionExpression2(
+            AstFactory.formalParameterList([]),
+            AstFactory.blockFunctionBody(AstFactory.block([]))));
+    _assertReplace(
+        node,
+        new Getter_NodeReplacerTest_test_functionDeclarationStatement());
+  }
+
+  void test_functionExpression() {
+    FunctionExpression node = AstFactory.functionExpression2(
+        AstFactory.formalParameterList([]),
+        AstFactory.blockFunctionBody(AstFactory.block([])));
+    _assertReplace(node, new Getter_NodeReplacerTest_test_functionExpression());
+    _assertReplace(
+        node,
+        new Getter_NodeReplacerTest_test_functionExpression_2());
+  }
+
+  void test_functionExpressionInvocation() {
+    FunctionExpressionInvocation node = AstFactory.functionExpressionInvocation(
+        AstFactory.identifier3("f"),
+        [AstFactory.integer(0)]);
+    _assertReplace(
+        node,
+        new Getter_NodeReplacerTest_test_functionExpressionInvocation());
+    _assertReplace(
+        node,
+        new Getter_NodeReplacerTest_test_functionExpressionInvocation_2());
+  }
+
+  void test_functionTypeAlias() {
+    FunctionTypeAlias node = AstFactory.typeAlias(
+        AstFactory.typeName4("R", []),
+        "F",
+        AstFactory.typeParameterList(["E"]),
+        AstFactory.formalParameterList([]));
+    node.documentationComment =
+        Comment.createEndOfLineComment(new List<Token>(0));
+    node.metadata =
+        AstFactory.list([AstFactory.annotation(AstFactory.identifier3("a"))]);
+    _assertReplace(
+        node,
+        new Getter_NodeReplacerTest_test_functionTypeAlias_3());
+    _assertReplace(
+        node,
+        new Getter_NodeReplacerTest_test_functionTypeAlias_4());
+    _assertReplace(node, new Getter_NodeReplacerTest_test_functionTypeAlias());
+    _assertReplace(
+        node,
+        new Getter_NodeReplacerTest_test_functionTypeAlias_2());
+    _testAnnotatedNode(node);
+  }
+
+  void test_functionTypedFormalParameter() {
+    FunctionTypedFormalParameter node = AstFactory.functionTypedFormalParameter(
+        AstFactory.typeName4("R", []),
+        "f",
+        [AstFactory.simpleFormalParameter3("p")]);
+    node.documentationComment =
+        Comment.createEndOfLineComment(new List<Token>(0));
+    node.metadata =
+        AstFactory.list([AstFactory.annotation(AstFactory.identifier3("a"))]);
+    _assertReplace(
+        node,
+        new Getter_NodeReplacerTest_test_functionTypedFormalParameter());
+    _assertReplace(
+        node,
+        new Getter_NodeReplacerTest_test_functionTypedFormalParameter_2());
+    _testNormalFormalParameter(node);
+  }
+
+  void test_hideCombinator() {
+    HideCombinator node = AstFactory.hideCombinator2(["A", "B"]);
+    _assertReplace(
+        node,
+        new ListGetter_NodeReplacerTest_test_hideCombinator(0));
+  }
+
+  void test_ifStatement() {
+    IfStatement node = AstFactory.ifStatement2(
+        AstFactory.booleanLiteral(true),
+        AstFactory.block([]),
+        AstFactory.block([]));
+    _assertReplace(node, new Getter_NodeReplacerTest_test_ifStatement());
+    _assertReplace(node, new Getter_NodeReplacerTest_test_ifStatement_3());
+    _assertReplace(node, new Getter_NodeReplacerTest_test_ifStatement_2());
+  }
+
+  void test_implementsClause() {
+    ImplementsClause node = AstFactory.implementsClause(
+        [AstFactory.typeName4("I", []), AstFactory.typeName4("J", [])]);
+    _assertReplace(
+        node,
+        new ListGetter_NodeReplacerTest_test_implementsClause(0));
+  }
+
+  void test_importDirective() {
+    ImportDirective node = AstFactory.importDirective3(
+        "",
+        "p",
+        [AstFactory.showCombinator2(["A"]), AstFactory.hideCombinator2(["B"])]);
+    node.documentationComment =
+        Comment.createEndOfLineComment(new List<Token>(0));
+    node.metadata =
+        AstFactory.list([AstFactory.annotation(AstFactory.identifier3("a"))]);
+    _assertReplace(node, new Getter_NodeReplacerTest_test_importDirective());
+    _testNamespaceDirective(node);
+  }
+
+  void test_indexExpression() {
+    IndexExpression node = AstFactory.indexExpression(
+        AstFactory.identifier3("a"),
+        AstFactory.identifier3("i"));
+    _assertReplace(node, new Getter_NodeReplacerTest_test_indexExpression());
+    _assertReplace(node, new Getter_NodeReplacerTest_test_indexExpression_2());
+  }
+
+  void test_instanceCreationExpression() {
+    InstanceCreationExpression node = AstFactory.instanceCreationExpression3(
+        null,
+        AstFactory.typeName4("C", []),
+        "c",
+        [AstFactory.integer(2)]);
+    _assertReplace(
+        node,
+        new Getter_NodeReplacerTest_test_instanceCreationExpression_2());
+    _assertReplace(
+        node,
+        new Getter_NodeReplacerTest_test_instanceCreationExpression());
+  }
+
+  void test_interpolationExpression() {
+    InterpolationExpression node = AstFactory.interpolationExpression2("x");
+    _assertReplace(
+        node,
+        new Getter_NodeReplacerTest_test_interpolationExpression());
+  }
+
+  void test_isExpression() {
+    IsExpression node = AstFactory.isExpression(
+        AstFactory.identifier3("v"),
+        false,
+        AstFactory.typeName4("T", []));
+    _assertReplace(node, new Getter_NodeReplacerTest_test_isExpression());
+    _assertReplace(node, new Getter_NodeReplacerTest_test_isExpression_2());
+  }
+
+  void test_label() {
+    Label node = AstFactory.label2("l");
+    _assertReplace(node, new Getter_NodeReplacerTest_test_label());
+  }
+
+  void test_labeledStatement() {
+    LabeledStatement node = AstFactory.labeledStatement(
+        AstFactory.list([AstFactory.label2("l")]),
+        AstFactory.block([]));
+    _assertReplace(
+        node,
+        new ListGetter_NodeReplacerTest_test_labeledStatement(0));
+    _assertReplace(node, new Getter_NodeReplacerTest_test_labeledStatement());
+  }
+
+  void test_libraryDirective() {
+    LibraryDirective node = AstFactory.libraryDirective2("lib");
+    node.documentationComment =
+        Comment.createEndOfLineComment(new List<Token>(0));
+    node.metadata =
+        AstFactory.list([AstFactory.annotation(AstFactory.identifier3("a"))]);
+    _assertReplace(node, new Getter_NodeReplacerTest_test_libraryDirective());
+    _testAnnotatedNode(node);
+  }
+
+  void test_libraryIdentifier() {
+    LibraryIdentifier node = AstFactory.libraryIdentifier2(["lib"]);
+    _assertReplace(
+        node,
+        new ListGetter_NodeReplacerTest_test_libraryIdentifier(0));
+  }
+
+  void test_listLiteral() {
+    ListLiteral node = AstFactory.listLiteral2(
+        null,
+        AstFactory.typeArgumentList([AstFactory.typeName4("E", [])]),
+        [AstFactory.identifier3("e")]);
+    _assertReplace(node, new ListGetter_NodeReplacerTest_test_listLiteral(0));
+    _testTypedLiteral(node);
+  }
+
+  void test_mapLiteral() {
+    MapLiteral node = AstFactory.mapLiteral(
+        null,
+        AstFactory.typeArgumentList([AstFactory.typeName4("E", [])]),
+        [AstFactory.mapLiteralEntry("k", AstFactory.identifier3("v"))]);
+    _assertReplace(node, new ListGetter_NodeReplacerTest_test_mapLiteral(0));
+    _testTypedLiteral(node);
+  }
+
+  void test_mapLiteralEntry() {
+    MapLiteralEntry node =
+        AstFactory.mapLiteralEntry("k", AstFactory.identifier3("v"));
+    _assertReplace(node, new Getter_NodeReplacerTest_test_mapLiteralEntry_2());
+    _assertReplace(node, new Getter_NodeReplacerTest_test_mapLiteralEntry());
+  }
+
+  void test_methodDeclaration() {
+    MethodDeclaration node = AstFactory.methodDeclaration2(
+        null,
+        AstFactory.typeName4("A", []),
+        null,
+        null,
+        AstFactory.identifier3("m"),
+        AstFactory.formalParameterList([]),
+        AstFactory.blockFunctionBody(AstFactory.block([])));
+    node.documentationComment =
+        Comment.createEndOfLineComment(new List<Token>(0));
+    node.metadata =
+        AstFactory.list([AstFactory.annotation(AstFactory.identifier3("a"))]);
+    _assertReplace(node, new Getter_NodeReplacerTest_test_methodDeclaration());
+    _assertReplace(
+        node,
+        new Getter_NodeReplacerTest_test_methodDeclaration_3());
+    _assertReplace(
+        node,
+        new Getter_NodeReplacerTest_test_methodDeclaration_4());
+    _assertReplace(
+        node,
+        new Getter_NodeReplacerTest_test_methodDeclaration_2());
+    _testAnnotatedNode(node);
+  }
+
+  void test_methodInvocation() {
+    MethodInvocation node = AstFactory.methodInvocation(
+        AstFactory.identifier3("t"),
+        "m",
+        [AstFactory.integer(0)]);
+    _assertReplace(node, new Getter_NodeReplacerTest_test_methodInvocation_2());
+    _assertReplace(node, new Getter_NodeReplacerTest_test_methodInvocation_3());
+    _assertReplace(node, new Getter_NodeReplacerTest_test_methodInvocation());
+  }
+
+  void test_namedExpression() {
+    NamedExpression node =
+        AstFactory.namedExpression2("l", AstFactory.identifier3("v"));
+    _assertReplace(node, new Getter_NodeReplacerTest_test_namedExpression());
+    _assertReplace(node, new Getter_NodeReplacerTest_test_namedExpression_2());
+  }
+
+  void test_nativeClause() {
+    NativeClause node = AstFactory.nativeClause("");
+    _assertReplace(node, new Getter_NodeReplacerTest_test_nativeClause());
+  }
+
+  void test_nativeFunctionBody() {
+    NativeFunctionBody node = AstFactory.nativeFunctionBody("m");
+    _assertReplace(node, new Getter_NodeReplacerTest_test_nativeFunctionBody());
+  }
+
+  void test_parenthesizedExpression() {
+    ParenthesizedExpression node =
+        AstFactory.parenthesizedExpression(AstFactory.integer(0));
+    _assertReplace(
+        node,
+        new Getter_NodeReplacerTest_test_parenthesizedExpression());
+  }
+
+  void test_partDirective() {
+    PartDirective node = AstFactory.partDirective2("");
+    node.documentationComment =
+        Comment.createEndOfLineComment(new List<Token>(0));
+    node.metadata =
+        AstFactory.list([AstFactory.annotation(AstFactory.identifier3("a"))]);
+    _testUriBasedDirective(node);
+  }
+
+  void test_partOfDirective() {
+    PartOfDirective node =
+        AstFactory.partOfDirective(AstFactory.libraryIdentifier2(["lib"]));
+    node.documentationComment =
+        Comment.createEndOfLineComment(new List<Token>(0));
+    node.metadata =
+        AstFactory.list([AstFactory.annotation(AstFactory.identifier3("a"))]);
+    _assertReplace(node, new Getter_NodeReplacerTest_test_partOfDirective());
+    _testAnnotatedNode(node);
+  }
+
+  void test_postfixExpression() {
+    PostfixExpression node = AstFactory.postfixExpression(
+        AstFactory.identifier3("x"),
+        TokenType.MINUS_MINUS);
+    _assertReplace(node, new Getter_NodeReplacerTest_test_postfixExpression());
+  }
+
+  void test_prefixExpression() {
+    PrefixExpression node =
+        AstFactory.prefixExpression(TokenType.PLUS_PLUS, AstFactory.identifier3("y"));
+    _assertReplace(node, new Getter_NodeReplacerTest_test_prefixExpression());
+  }
+
+  void test_prefixedIdentifier() {
+    PrefixedIdentifier node = AstFactory.identifier5("a", "b");
+    _assertReplace(
+        node,
+        new Getter_NodeReplacerTest_test_prefixedIdentifier_2());
+    _assertReplace(node, new Getter_NodeReplacerTest_test_prefixedIdentifier());
+  }
+
+  void test_propertyAccess() {
+    PropertyAccess node =
+        AstFactory.propertyAccess2(AstFactory.identifier3("x"), "y");
+    _assertReplace(node, new Getter_NodeReplacerTest_test_propertyAccess());
+    _assertReplace(node, new Getter_NodeReplacerTest_test_propertyAccess_2());
+  }
+
+  void test_redirectingConstructorInvocation() {
+    RedirectingConstructorInvocation node =
+        AstFactory.redirectingConstructorInvocation2("c", [AstFactory.integer(0)]);
+    _assertReplace(
+        node,
+        new Getter_NodeReplacerTest_test_redirectingConstructorInvocation());
+    _assertReplace(
+        node,
+        new Getter_NodeReplacerTest_test_redirectingConstructorInvocation_2());
+  }
+
+  void test_returnStatement() {
+    ReturnStatement node = AstFactory.returnStatement2(AstFactory.integer(0));
+    _assertReplace(node, new Getter_NodeReplacerTest_test_returnStatement());
+  }
+
+  void test_showCombinator() {
+    ShowCombinator node = AstFactory.showCombinator2(["X", "Y"]);
+    _assertReplace(
+        node,
+        new ListGetter_NodeReplacerTest_test_showCombinator(0));
+  }
+
+  void test_simpleFormalParameter() {
+    SimpleFormalParameter node =
+        AstFactory.simpleFormalParameter4(AstFactory.typeName4("T", []), "p");
+    node.documentationComment =
+        Comment.createEndOfLineComment(new List<Token>(0));
+    node.metadata =
+        AstFactory.list([AstFactory.annotation(AstFactory.identifier3("a"))]);
+    _assertReplace(
+        node,
+        new Getter_NodeReplacerTest_test_simpleFormalParameter());
+    _testNormalFormalParameter(node);
+  }
+
+  void test_stringInterpolation() {
+    StringInterpolation node =
+        AstFactory.string([AstFactory.interpolationExpression2("a")]);
+    _assertReplace(
+        node,
+        new ListGetter_NodeReplacerTest_test_stringInterpolation(0));
+  }
+
+  void test_superConstructorInvocation() {
+    SuperConstructorInvocation node =
+        AstFactory.superConstructorInvocation2("s", [AstFactory.integer(1)]);
+    _assertReplace(
+        node,
+        new Getter_NodeReplacerTest_test_superConstructorInvocation());
+    _assertReplace(
+        node,
+        new Getter_NodeReplacerTest_test_superConstructorInvocation_2());
+  }
+
+  void test_switchCase() {
+    SwitchCase node = AstFactory.switchCase2(
+        AstFactory.list([AstFactory.label2("l")]),
+        AstFactory.integer(0),
+        [AstFactory.block([])]);
+    _assertReplace(node, new Getter_NodeReplacerTest_test_switchCase());
+    _testSwitchMember(node);
+  }
+
+  void test_switchDefault() {
+    SwitchDefault node = AstFactory.switchDefault(
+        AstFactory.list([AstFactory.label2("l")]),
+        [AstFactory.block([])]);
+    _testSwitchMember(node);
+  }
+
+  void test_switchStatement() {
+    SwitchStatement node = AstFactory.switchStatement(
+        AstFactory.identifier3("x"),
+        [
+            AstFactory.switchCase2(
+                AstFactory.list([AstFactory.label2("l")]),
+                AstFactory.integer(0),
+                [AstFactory.block([])]),
+            AstFactory.switchDefault(
+                AstFactory.list([AstFactory.label2("l")]),
+                [AstFactory.block([])])]);
+    _assertReplace(node, new Getter_NodeReplacerTest_test_switchStatement());
+    _assertReplace(
+        node,
+        new ListGetter_NodeReplacerTest_test_switchStatement(0));
+  }
+
+  void test_throwExpression() {
+    ThrowExpression node =
+        AstFactory.throwExpression2(AstFactory.identifier3("e"));
+    _assertReplace(node, new Getter_NodeReplacerTest_test_throwExpression());
+  }
+
+  void test_topLevelVariableDeclaration() {
+    TopLevelVariableDeclaration node = AstFactory.topLevelVariableDeclaration(
+        null,
+        AstFactory.typeName4("T", []),
+        [AstFactory.variableDeclaration("t")]);
+    node.documentationComment =
+        Comment.createEndOfLineComment(new List<Token>(0));
+    node.metadata =
+        AstFactory.list([AstFactory.annotation(AstFactory.identifier3("a"))]);
+    _assertReplace(
+        node,
+        new Getter_NodeReplacerTest_test_topLevelVariableDeclaration());
+    _testAnnotatedNode(node);
+  }
+
+  void test_tryStatement() {
+    TryStatement node = AstFactory.tryStatement3(
+        AstFactory.block([]),
+        AstFactory.list([AstFactory.catchClause("e", [AstFactory.block([])])]),
+        AstFactory.block([]));
+    _assertReplace(node, new Getter_NodeReplacerTest_test_tryStatement_2());
+    _assertReplace(node, new Getter_NodeReplacerTest_test_tryStatement());
+    _assertReplace(node, new ListGetter_NodeReplacerTest_test_tryStatement(0));
+  }
+
+  void test_typeArgumentList() {
+    TypeArgumentList node =
+        AstFactory.typeArgumentList([AstFactory.typeName4("A", [])]);
+    _assertReplace(
+        node,
+        new ListGetter_NodeReplacerTest_test_typeArgumentList(0));
+  }
+
+  void test_typeName() {
+    TypeName node = AstFactory.typeName4(
+        "T",
+        [AstFactory.typeName4("E", []), AstFactory.typeName4("F", [])]);
+    _assertReplace(node, new Getter_NodeReplacerTest_test_typeName_2());
+    _assertReplace(node, new Getter_NodeReplacerTest_test_typeName());
+  }
+
+  void test_typeParameter() {
+    TypeParameter node =
+        AstFactory.typeParameter2("E", AstFactory.typeName4("B", []));
+    _assertReplace(node, new Getter_NodeReplacerTest_test_typeParameter_2());
+    _assertReplace(node, new Getter_NodeReplacerTest_test_typeParameter());
+  }
+
+  void test_typeParameterList() {
+    TypeParameterList node = AstFactory.typeParameterList(["A", "B"]);
+    _assertReplace(
+        node,
+        new ListGetter_NodeReplacerTest_test_typeParameterList(0));
+  }
+
+  void test_variableDeclaration() {
+    VariableDeclaration node =
+        AstFactory.variableDeclaration2("a", AstFactory.nullLiteral());
+    node.documentationComment =
+        Comment.createEndOfLineComment(new List<Token>(0));
+    node.metadata =
+        AstFactory.list([AstFactory.annotation(AstFactory.identifier3("a"))]);
+    _assertReplace(
+        node,
+        new Getter_NodeReplacerTest_test_variableDeclaration());
+    _assertReplace(
+        node,
+        new Getter_NodeReplacerTest_test_variableDeclaration_2());
+    _testAnnotatedNode(node);
+  }
+
+  void test_variableDeclarationList() {
+    VariableDeclarationList node = AstFactory.variableDeclarationList(
+        null,
+        AstFactory.typeName4("T", []),
+        [AstFactory.variableDeclaration("a")]);
+    _assertReplace(
+        node,
+        new Getter_NodeReplacerTest_test_variableDeclarationList());
+    _assertReplace(
+        node,
+        new ListGetter_NodeReplacerTest_test_variableDeclarationList(0));
+  }
+
+  void test_variableDeclarationStatement() {
+    VariableDeclarationStatement node = AstFactory.variableDeclarationStatement(
+        null,
+        AstFactory.typeName4("T", []),
+        [AstFactory.variableDeclaration("a")]);
+    _assertReplace(
+        node,
+        new Getter_NodeReplacerTest_test_variableDeclarationStatement());
+  }
+
+  void test_whileStatement() {
+    WhileStatement node = AstFactory.whileStatement(
+        AstFactory.booleanLiteral(true),
+        AstFactory.block([]));
+    _assertReplace(node, new Getter_NodeReplacerTest_test_whileStatement());
+    _assertReplace(node, new Getter_NodeReplacerTest_test_whileStatement_2());
+  }
+
+  void test_withClause() {
+    WithClause node = AstFactory.withClause([AstFactory.typeName4("M", [])]);
+    _assertReplace(node, new ListGetter_NodeReplacerTest_test_withClause(0));
+  }
+
+  void _assertReplace(AstNode parent, NodeReplacerTest_Getter getter) {
+    AstNode child = getter.get(parent);
+    if (child != null) {
+      AstNode clone = child.accept(new AstCloner());
+      NodeReplacer.replace(child, clone);
+      expect(getter.get(parent), clone);
+      expect(clone.parent, parent);
+    }
+  }
+
+  void _testAnnotatedNode(AnnotatedNode node) {
+    _assertReplace(node, new Getter_NodeReplacerTest_testAnnotatedNode());
+    _assertReplace(node, new ListGetter_NodeReplacerTest_testAnnotatedNode(0));
+  }
+
+  void _testNamespaceDirective(NamespaceDirective node) {
+    _assertReplace(
+        node,
+        new ListGetter_NodeReplacerTest_testNamespaceDirective(0));
+    _testUriBasedDirective(node);
+  }
+
+  void _testNormalFormalParameter(NormalFormalParameter node) {
+    _assertReplace(
+        node,
+        new Getter_NodeReplacerTest_testNormalFormalParameter_2());
+    _assertReplace(
+        node,
+        new Getter_NodeReplacerTest_testNormalFormalParameter());
+    _assertReplace(
+        node,
+        new ListGetter_NodeReplacerTest_testNormalFormalParameter(0));
+  }
+
+  void _testSwitchMember(SwitchMember node) {
+    _assertReplace(node, new ListGetter_NodeReplacerTest_testSwitchMember(0));
+    _assertReplace(node, new ListGetter_NodeReplacerTest_testSwitchMember_2(0));
+  }
+
+  void _testTypedLiteral(TypedLiteral node) {
+    _assertReplace(node, new Getter_NodeReplacerTest_testTypedLiteral());
+  }
+
+  void _testUriBasedDirective(UriBasedDirective node) {
+    _assertReplace(node, new Getter_NodeReplacerTest_testUriBasedDirective());
+    _testAnnotatedNode(node);
+  }
+}
+
+abstract class NodeReplacerTest_Getter<P, C> {
+  C get(P parent);
+}
+
+abstract class NodeReplacerTest_ListGetter<P extends AstNode, C extends AstNode>
+    implements NodeReplacerTest_Getter<P, C> {
+  final int _index;
+
+  NodeReplacerTest_ListGetter(this._index);
+
+  @override
+  C get(P parent) {
+    NodeList<C> list = getList(parent);
+    if (list.isEmpty) {
+      return null;
+    }
+    return list[_index];
+  }
+
+  NodeList<C> getList(P parent);
+}
+
+class SingleMapIteratorTest extends EngineTestCase {
+  void test_empty() {
+    Map<String, String> map = new HashMap<String, String>();
+    SingleMapIterator<String, String> iterator =
+        new SingleMapIterator<String, String>(map);
+    expect(iterator.moveNext(), isFalse);
+    try {
+      iterator.key;
+      fail("Expected NoSuchElementException");
+    } on NoSuchElementException catch (exception) {
+      // Expected
+    }
+    try {
+      iterator.value;
+      fail("Expected NoSuchElementException");
+    } on NoSuchElementException catch (exception) {
+      // Expected
+    }
+    try {
+      iterator.value = "x";
+      fail("Expected NoSuchElementException");
+    } on NoSuchElementException catch (exception) {
+      // Expected
+    }
+    expect(iterator.moveNext(), isFalse);
+  }
+
+  void test_multiple() {
+    Map<String, String> map = new HashMap<String, String>();
+    map["k1"] = "v1";
+    map["k2"] = "v2";
+    map["k3"] = "v3";
+    SingleMapIterator<String, String> iterator =
+        new SingleMapIterator<String, String>(map);
+    expect(iterator.moveNext(), isTrue);
+    expect(iterator.moveNext(), isTrue);
+    expect(iterator.moveNext(), isTrue);
+    expect(iterator.moveNext(), isFalse);
+  }
+
+  void test_single() {
+    String key = "key";
+    String value = "value";
+    Map<String, String> map = new HashMap<String, String>();
+    map[key] = value;
+    SingleMapIterator<String, String> iterator =
+        new SingleMapIterator<String, String>(map);
+    expect(iterator.moveNext(), isTrue);
+    expect(iterator.key, same(key));
+    expect(iterator.value, same(value));
+    String newValue = "newValue";
+    iterator.value = newValue;
+    expect(iterator.value, same(newValue));
+    expect(iterator.moveNext(), isFalse);
+  }
+}
+
+class SourceRangeTest {
+  void test_access() {
+    SourceRange r = new SourceRange(10, 1);
+    expect(r.offset, 10);
+    expect(r.length, 1);
+    expect(r.end, 10 + 1);
+    // to check
+    r.hashCode;
+  }
+
+  void test_contains() {
+    SourceRange r = new SourceRange(5, 10);
+    expect(r.contains(5), isTrue);
+    expect(r.contains(10), isTrue);
+    expect(r.contains(14), isTrue);
+    expect(r.contains(0), isFalse);
+    expect(r.contains(15), isFalse);
+  }
+
+  void test_containsExclusive() {
+    SourceRange r = new SourceRange(5, 10);
+    expect(r.containsExclusive(5), isFalse);
+    expect(r.containsExclusive(10), isTrue);
+    expect(r.containsExclusive(14), isTrue);
+    expect(r.containsExclusive(0), isFalse);
+    expect(r.containsExclusive(15), isFalse);
+  }
+
+  void test_coveredBy() {
+    SourceRange r = new SourceRange(5, 10);
+    // ends before
+    expect(r.coveredBy(new SourceRange(20, 10)), isFalse);
+    // starts after
+    expect(r.coveredBy(new SourceRange(0, 3)), isFalse);
+    // only intersects
+    expect(r.coveredBy(new SourceRange(0, 10)), isFalse);
+    expect(r.coveredBy(new SourceRange(10, 10)), isFalse);
+    // covered
+    expect(r.coveredBy(new SourceRange(0, 20)), isTrue);
+    expect(r.coveredBy(new SourceRange(5, 10)), isTrue);
+  }
+
+  void test_covers() {
+    SourceRange r = new SourceRange(5, 10);
+    // ends before
+    expect(r.covers(new SourceRange(0, 3)), isFalse);
+    // starts after
+    expect(r.covers(new SourceRange(20, 3)), isFalse);
+    // only intersects
+    expect(r.covers(new SourceRange(0, 10)), isFalse);
+    expect(r.covers(new SourceRange(10, 10)), isFalse);
+    // covers
+    expect(r.covers(new SourceRange(5, 10)), isTrue);
+    expect(r.covers(new SourceRange(6, 9)), isTrue);
+    expect(r.covers(new SourceRange(6, 8)), isTrue);
+  }
+
+  void test_endsIn() {
+    SourceRange r = new SourceRange(5, 10);
+    // ends before
+    expect(r.endsIn(new SourceRange(20, 10)), isFalse);
+    // starts after
+    expect(r.endsIn(new SourceRange(0, 3)), isFalse);
+    // ends
+    expect(r.endsIn(new SourceRange(10, 20)), isTrue);
+    expect(r.endsIn(new SourceRange(0, 20)), isTrue);
+  }
+
+  void test_equals() {
+    SourceRange r = new SourceRange(10, 1);
+    expect(r == null, isFalse);
+    expect(r == this, isFalse);
+    expect(r == new SourceRange(20, 2), isFalse);
+    expect(r == new SourceRange(10, 1), isTrue);
+    expect(r == r, isTrue);
+  }
+
+  void test_getExpanded() {
+    SourceRange r = new SourceRange(5, 3);
+    expect(r.getExpanded(0), r);
+    expect(r.getExpanded(2), new SourceRange(3, 7));
+    expect(r.getExpanded(-1), new SourceRange(6, 1));
+  }
+
+  void test_getMoveEnd() {
+    SourceRange r = new SourceRange(5, 3);
+    expect(r.getMoveEnd(0), r);
+    expect(r.getMoveEnd(3), new SourceRange(5, 6));
+    expect(r.getMoveEnd(-1), new SourceRange(5, 2));
+  }
+
+  void test_getTranslated() {
+    SourceRange r = new SourceRange(5, 3);
+    expect(r.getTranslated(0), r);
+    expect(r.getTranslated(2), new SourceRange(7, 3));
+    expect(r.getTranslated(-1), new SourceRange(4, 3));
+  }
+
+  void test_getUnion() {
+    expect(new SourceRange(10, 10).getUnion(new SourceRange(15, 10)), new SourceRange(10, 15));
+    expect(new SourceRange(15, 10).getUnion(new SourceRange(10, 10)), new SourceRange(10, 15));
+    // "other" is covered/covers
+    expect(new SourceRange(10, 10).getUnion(new SourceRange(15, 2)), new SourceRange(10, 10));
+    expect(new SourceRange(15, 2).getUnion(new SourceRange(10, 10)), new SourceRange(10, 10));
+  }
+
+  void test_intersects() {
+    SourceRange r = new SourceRange(5, 3);
+    // null
+    expect(r.intersects(null), isFalse);
+    // ends before
+    expect(r.intersects(new SourceRange(0, 5)), isFalse);
+    // begins after
+    expect(r.intersects(new SourceRange(8, 5)), isFalse);
+    // begins on same offset
+    expect(r.intersects(new SourceRange(5, 1)), isTrue);
+    // begins inside, ends inside
+    expect(r.intersects(new SourceRange(6, 1)), isTrue);
+    // begins inside, ends after
+    expect(r.intersects(new SourceRange(6, 10)), isTrue);
+    // begins before, ends after
+    expect(r.intersects(new SourceRange(0, 10)), isTrue);
+  }
+
+  void test_startsIn() {
+    SourceRange r = new SourceRange(5, 10);
+    // ends before
+    expect(r.startsIn(new SourceRange(20, 10)), isFalse);
+    // starts after
+    expect(r.startsIn(new SourceRange(0, 3)), isFalse);
+    // starts
+    expect(r.startsIn(new SourceRange(5, 1)), isTrue);
+    expect(r.startsIn(new SourceRange(0, 20)), isTrue);
+  }
+
+  void test_toString() {
+    SourceRange r = new SourceRange(10, 1);
+    expect(r.toString(), "[offset=10, length=1]");
+  }
+}
+
+class StringUtilitiesTest {
+  void test_EMPTY() {
+    expect(StringUtilities.EMPTY, "");
+    expect(StringUtilities.EMPTY.isEmpty, isTrue);
+  }
+
+  void test_EMPTY_ARRAY() {
+    expect(StringUtilities.EMPTY_ARRAY.length, 0);
+  }
+
+  void test_endsWith3() {
+    expect(StringUtilities.endsWith3("abc", 0x61, 0x62, 0x63), isTrue);
+    expect(StringUtilities.endsWith3("abcdefghi", 0x67, 0x68, 0x69), isTrue);
+    expect(StringUtilities.endsWith3("abcdefghi", 0x64, 0x65, 0x61), isFalse);
+    // missing
+  }
+
+  void test_endsWithChar() {
+    expect(StringUtilities.endsWithChar("a", 0x61), isTrue);
+    expect(StringUtilities.endsWithChar("b", 0x61), isFalse);
+    expect(StringUtilities.endsWithChar("", 0x61), isFalse);
+  }
+
+  void test_indexOf1() {
+    expect(StringUtilities.indexOf1("a", 0, 0x61), 0);
+    expect(StringUtilities.indexOf1("abcdef", 0, 0x61), 0);
+    expect(StringUtilities.indexOf1("abcdef", 0, 0x63), 2);
+    expect(StringUtilities.indexOf1("abcdef", 0, 0x66), 5);
+    expect(StringUtilities.indexOf1("abcdef", 0, 0x7A), -1);
+    expect(StringUtilities.indexOf1("abcdef", 1, 0x61), -1);
+    // before start
+  }
+
+  void test_indexOf2() {
+    expect(StringUtilities.indexOf2("ab", 0, 0x61, 0x62), 0);
+    expect(StringUtilities.indexOf2("abcdef", 0, 0x61, 0x62), 0);
+    expect(StringUtilities.indexOf2("abcdef", 0, 0x63, 0x64), 2);
+    expect(StringUtilities.indexOf2("abcdef", 0, 0x65, 0x66), 4);
+    expect(StringUtilities.indexOf2("abcdef", 0, 0x64, 0x61), -1);
+    expect(StringUtilities.indexOf2("abcdef", 1, 0x61, 0x62), -1);
+    // before start
+  }
+
+  void test_indexOf4() {
+    expect(StringUtilities.indexOf4("abcd", 0, 0x61, 0x62, 0x63, 0x64), 0);
+    expect(StringUtilities.indexOf4("abcdefghi", 0, 0x61, 0x62, 0x63, 0x64), 0);
+    expect(StringUtilities.indexOf4("abcdefghi", 0, 0x63, 0x64, 0x65, 0x66), 2);
+    expect(StringUtilities.indexOf4("abcdefghi", 0, 0x66, 0x67, 0x68, 0x69), 5);
+    expect(StringUtilities.indexOf4("abcdefghi", 0, 0x64, 0x65, 0x61, 0x64), -1);
+    expect(StringUtilities.indexOf4("abcdefghi", 1, 0x61, 0x62, 0x63, 0x64), -1);
+    // before start
+  }
+
+  void test_indexOf5() {
+    expect(StringUtilities.indexOf5("abcde", 0, 0x61, 0x62, 0x63, 0x64, 0x65), 0);
+    expect(StringUtilities.indexOf5("abcdefghi", 0, 0x61, 0x62, 0x63, 0x64, 0x65), 0);
+    expect(StringUtilities.indexOf5("abcdefghi", 0, 0x63, 0x64, 0x65, 0x66, 0x67), 2);
+    expect(StringUtilities.indexOf5("abcdefghi", 0, 0x65, 0x66, 0x67, 0x68, 0x69), 4);
+    expect(StringUtilities.indexOf5("abcdefghi", 0, 0x64, 0x65, 0x66, 0x69, 0x6E), -1);
+    expect(StringUtilities.indexOf5("abcdefghi", 1, 0x61, 0x62, 0x63, 0x64, 0x65), -1);
+    // before start
+  }
+
+  void test_isEmpty() {
+    expect(StringUtilities.isEmpty(""), isTrue);
+    expect(StringUtilities.isEmpty(" "), isFalse);
+    expect(StringUtilities.isEmpty("a"), isFalse);
+    expect(StringUtilities.isEmpty(StringUtilities.EMPTY), isTrue);
+  }
+
+  void test_isTagName() {
+    expect(StringUtilities.isTagName(null), isFalse);
+    expect(StringUtilities.isTagName(""), isFalse);
+    expect(StringUtilities.isTagName("-"), isFalse);
+    expect(StringUtilities.isTagName("0"), isFalse);
+    expect(StringUtilities.isTagName("0a"), isFalse);
+    expect(StringUtilities.isTagName("a b"), isFalse);
+    expect(StringUtilities.isTagName("a0"), isTrue);
+    expect(StringUtilities.isTagName("a"), isTrue);
+    expect(StringUtilities.isTagName("ab"), isTrue);
+    expect(StringUtilities.isTagName("a-b"), isTrue);
+  }
+
+  void test_printListOfQuotedNames_empty() {
+    try {
+      StringUtilities.printListOfQuotedNames(new List<String>(0));
+      fail("Expected IllegalArgumentException");
+    } on IllegalArgumentException catch (exception) {
+      // Expected
+    }
+  }
+
+  void test_printListOfQuotedNames_five() {
+    expect(StringUtilities.printListOfQuotedNames(<String>["a", "b", "c", "d", "e"]), "'a', 'b', 'c', 'd' and 'e'");
+  }
+
+  void test_printListOfQuotedNames_null() {
+    try {
+      StringUtilities.printListOfQuotedNames(null);
+      fail("Expected IllegalArgumentException");
+    } on IllegalArgumentException catch (exception) {
+      // Expected
+    }
+  }
+
+  void test_printListOfQuotedNames_one() {
+    try {
+      StringUtilities.printListOfQuotedNames(<String>["a"]);
+      fail("Expected IllegalArgumentException");
+    } on IllegalArgumentException catch (exception) {
+      // Expected
+    }
+  }
+
+  void test_printListOfQuotedNames_three() {
+    expect(StringUtilities.printListOfQuotedNames(<String>["a", "b", "c"]), "'a', 'b' and 'c'");
+  }
+
+  void test_printListOfQuotedNames_two() {
+    expect(StringUtilities.printListOfQuotedNames(<String>["a", "b"]), "'a' and 'b'");
+  }
+
+  void test_startsWith2() {
+    expect(StringUtilities.startsWith2("ab", 0, 0x61, 0x62), isTrue);
+    expect(StringUtilities.startsWith2("abcdefghi", 0, 0x61, 0x62), isTrue);
+    expect(StringUtilities.startsWith2("abcdefghi", 2, 0x63, 0x64), isTrue);
+    expect(StringUtilities.startsWith2("abcdefghi", 5, 0x66, 0x67), isTrue);
+    expect(StringUtilities.startsWith2("abcdefghi", 0, 0x64, 0x64), isFalse);
+    // missing
+  }
+
+  void test_startsWith3() {
+    expect(StringUtilities.startsWith3("abc", 0, 0x61, 0x62, 0x63), isTrue);
+    expect(StringUtilities.startsWith3("abcdefghi", 0, 0x61, 0x62, 0x63), isTrue);
+    expect(StringUtilities.startsWith3("abcdefghi", 2, 0x63, 0x64, 0x65), isTrue);
+    expect(StringUtilities.startsWith3("abcdefghi", 6, 0x67, 0x68, 0x69), isTrue);
+    expect(StringUtilities.startsWith3("abcdefghi", 0, 0x64, 0x65, 0x61), isFalse);
+    // missing
+  }
+
+  void test_startsWith4() {
+    expect(StringUtilities.startsWith4("abcd", 0, 0x61, 0x62, 0x63, 0x64), isTrue);
+    expect(StringUtilities.startsWith4("abcdefghi", 0, 0x61, 0x62, 0x63, 0x64), isTrue);
+    expect(StringUtilities.startsWith4("abcdefghi", 2, 0x63, 0x64, 0x65, 0x66), isTrue);
+    expect(StringUtilities.startsWith4("abcdefghi", 5, 0x66, 0x67, 0x68, 0x69), isTrue);
+    expect(StringUtilities.startsWith4("abcdefghi", 0, 0x64, 0x65, 0x61, 0x64), isFalse);
+    // missing
+  }
+
+  void test_startsWith5() {
+    expect(StringUtilities.startsWith5("abcde", 0, 0x61, 0x62, 0x63, 0x64, 0x65), isTrue);
+    expect(StringUtilities.startsWith5("abcdefghi", 0, 0x61, 0x62, 0x63, 0x64, 0x65), isTrue);
+    expect(StringUtilities.startsWith5("abcdefghi", 2, 0x63, 0x64, 0x65, 0x66, 0x67), isTrue);
+    expect(StringUtilities.startsWith5("abcdefghi", 4, 0x65, 0x66, 0x67, 0x68, 0x69), isTrue);
+    expect(StringUtilities.startsWith5("abcdefghi", 0, 0x61, 0x62, 0x63, 0x62, 0x61), isFalse);
+    // missing
+  }
+
+  void test_startsWith6() {
+    expect(StringUtilities.startsWith6("abcdef", 0, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66), isTrue);
+    expect(StringUtilities.startsWith6(
+            "abcdefghi",
+            0,
+            0x61,
+            0x62,
+            0x63,
+            0x64,
+            0x65,
+            0x66), isTrue);
+    expect(StringUtilities.startsWith6(
+            "abcdefghi",
+            2,
+            0x63,
+            0x64,
+            0x65,
+            0x66,
+            0x67,
+            0x68), isTrue);
+    expect(StringUtilities.startsWith6(
+            "abcdefghi",
+            3,
+            0x64,
+            0x65,
+            0x66,
+            0x67,
+            0x68,
+            0x69), isTrue);
+    expect(StringUtilities.startsWith6(
+            "abcdefghi",
+            0,
+            0x61,
+            0x62,
+            0x63,
+            0x64,
+            0x65,
+            0x67), isFalse);
+    // missing
+  }
+
+  void test_startsWithChar() {
+    expect(StringUtilities.startsWithChar("a", 0x61), isTrue);
+    expect(StringUtilities.startsWithChar("b", 0x61), isFalse);
+    expect(StringUtilities.startsWithChar("", 0x61), isFalse);
+  }
+
+  void test_substringBefore() {
+    expect(StringUtilities.substringBefore(null, ""), null);
+    expect(StringUtilities.substringBefore(null, "a"), null);
+    expect(StringUtilities.substringBefore("", "a"), "");
+    expect(StringUtilities.substringBefore("abc", "a"), "");
+    expect(StringUtilities.substringBefore("abcba", "b"), "a");
+    expect(StringUtilities.substringBefore("abc", "c"), "ab");
+    expect(StringUtilities.substringBefore("abc", "d"), "abc");
+    expect(StringUtilities.substringBefore("abc", ""), "");
+    expect(StringUtilities.substringBefore("abc", null), "abc");
+  }
+
+  void test_substringBeforeChar() {
+    expect(StringUtilities.substringBeforeChar(null, 0x61), null);
+    expect(StringUtilities.substringBeforeChar("", 0x61), "");
+    expect(StringUtilities.substringBeforeChar("abc", 0x61), "");
+    expect(StringUtilities.substringBeforeChar("abcba", 0x62), "a");
+    expect(StringUtilities.substringBeforeChar("abc", 0x63), "ab");
+    expect(StringUtilities.substringBeforeChar("abc", 0x64), "abc");
+  }
+}
+
+/**
+ * Instances of the class `TestLogger` implement a logger that can be used by tests.
+ */
+class TestLogger implements Logger {
+  /**
+   * The number of error messages that were logged.
+   */
+  int _errorCount = 0;
+
+  /**
+   * The number of informational messages that were logged.
+   */
+  int _infoCount = 0;
+
+  /**
+   * Return the number of error messages that were logged.
+   *
+   * @return the number of error messages that were logged
+   */
+  int get errorCount => _errorCount;
+
+  /**
+   * Return the number of informational messages that were logged.
+   *
+   * @return the number of informational messages that were logged
+   */
+  int get infoCount => _infoCount;
+
+  @override
+  void logError(String message) {
+    _errorCount++;
+  }
+
+  @override
+  void logError2(String message, Exception exception) {
+    _errorCount++;
+  }
+
+  @override
+  void logInformation(String message) {
+    _infoCount++;
+  }
+
+  @override
+  void logInformation2(String message, Exception exception) {
+    _infoCount++;
+  }
+}
+
+
+class TokenMapTest {
+  void test_creation() {
+    expect(new TokenMap(), isNotNull);
+  }
+
+  void test_get_absent() {
+    TokenMap tokenMap = new TokenMap();
+    expect(tokenMap.get(TokenFactory.tokenFromType(TokenType.AT)), isNull);
+  }
+
+  void test_get_added() {
+    TokenMap tokenMap = new TokenMap();
+    Token key = TokenFactory.tokenFromType(TokenType.AT);
+    Token value = TokenFactory.tokenFromType(TokenType.AT);
+    tokenMap.put(key, value);
+    expect(tokenMap.get(key), same(value));
+  }
+}
diff --git a/pkg/analyzer/test/task/task_dart_test.dart b/pkg/analyzer/test/task/task_dart_test.dart
index b9e86ec..9a44b7d 100644
--- a/pkg/analyzer/test/task/task_dart_test.dart
+++ b/pkg/analyzer/test/task/task_dart_test.dart
@@ -61,7 +61,9 @@
   }
 
   void test_perform_valid() {
-    var content = EngineTestCase.createSource(["library lib;", "class A {}"]);
+    var content = """
+library lib;
+class A {}""";
     Source source = new TestSource('/test.dart', content);
     InternalAnalysisContext context = AnalysisContextFactory.contextWithCore();
     CompilationUnit unit = parseUnit(context, source, content);
diff --git a/pkg/analyzer2dart/lib/src/cps_generator.dart b/pkg/analyzer2dart/lib/src/cps_generator.dart
index 7acf504..a8c7698 100644
--- a/pkg/analyzer2dart/lib/src/cps_generator.dart
+++ b/pkg/analyzer2dart/lib/src/cps_generator.dart
@@ -6,6 +6,7 @@
 
 import 'package:analyzer/analyzer.dart';
 
+import 'package:compiler/implementation/dart_types.dart' as dart2js;
 import 'package:compiler/implementation/elements/elements.dart' as dart2js;
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/element.dart' as analyzer;
@@ -45,8 +46,7 @@
       function.parameters.forEach((analyzer.ParameterElement parameter) {
         // TODO(johnniwinther): Support "closure variables", that is variables
         // accessed from an inner function.
-        irBuilder.createParameter(converter.convertElement(parameter),
-                                  isClosureVariable: false);
+        irBuilder.createParameter(converter.convertElement(parameter));
       });
       // Visit the body directly to avoid processing the signature as
       // expressions.
@@ -69,6 +69,12 @@
   }
 
   @override
+  ir.Node visitMethodInvocation(MethodInvocation node) {
+    // Overridden to avoid eager visits of the receiver and arguments.
+    return handleMethodInvocation(node);
+  }
+
+  @override
   ir.Primitive visitDynamicInvocation(MethodInvocation node,
                                       AccessSemantics semantics) {
     // TODO(johnniwinther): Handle implicit `this`.
@@ -76,7 +82,8 @@
     List<ir.Definition> arguments = visitArguments(node.argumentList);
     return irBuilder.buildDynamicInvocation(
         receiver,
-        createSelectorFromMethodInvocation(node, node.methodName.name),
+        createSelectorFromMethodInvocation(
+            node.argumentList, node.methodName.name),
         arguments);
   }
 
@@ -88,11 +95,33 @@
     List<ir.Definition> arguments = visitArguments(node.argumentList);
     return irBuilder.buildStaticInvocation(
         element,
-        createSelectorFromMethodInvocation(node, node.methodName.name),
+        createSelectorFromMethodInvocation(
+            node.argumentList, node.methodName.name),
         arguments);
   }
 
   @override
+  ir.Primitive visitInstanceCreationExpression(
+      InstanceCreationExpression node) {
+    analyzer.Element staticElement = node.staticElement;
+    if (staticElement != null) {
+      dart2js.Element element = converter.convertElement(staticElement);
+      dart2js.DartType type = converter.convertType(node.staticType);
+      List<ir.Definition> arguments = visitArguments(node.argumentList);
+      String name = '';
+      if (node.constructorName.name != null) {
+        name = node.constructorName.name.name;
+      }
+      return irBuilder.buildConstructorInvocation(
+          element,
+          createSelectorFromMethodInvocation(node.argumentList, name),
+          type,
+          arguments);
+    }
+    return giveUp(node, "Unresolved constructor invocation.");
+  }
+
+  @override
   ir.Constant visitNullLiteral(NullLiteral node) {
     return irBuilder.buildNullLiteral();
   }
@@ -137,6 +166,12 @@
   }
 
   @override
+  ir.Node visitPropertyAccess(PropertyAccess node) {
+    // Overridden to avoid eager visits of the receiver.
+    return handlePropertyAccess(node);
+  }
+
+  @override
   ir.Node visitLocalVariableAccess(AstNode node, AccessSemantics semantics) {
     return handleLocalAccess(node, semantics);
   }
@@ -155,11 +190,43 @@
         initialValue: initialValue);
   }
 
-  ir.Primitive handleLocalAccess(AstNode node, AccessSemantics semantics) {
+  dart2js.Element getLocal(AstNode node, AccessSemantics semantics) {
     analyzer.Element element = semantics.element;
     dart2js.Element target = converter.convertElement(element);
     assert(invariant(node, target.isLocal, '$target expected to be local.'));
-    return irBuilder.buildLocalGet(target);
+    return target;
+  }
+
+  ir.Primitive handleLocalAccess(AstNode node, AccessSemantics semantics) {
+    return irBuilder.buildLocalGet(getLocal(node, semantics));
+  }
+
+  ir.Primitive handleLocalAssignment(AssignmentExpression node,
+                                     AccessSemantics semantics) {
+    if (node.operator.lexeme != '=') {
+      return giveUp(node, 'Assignment operator: ${node.operator.lexeme}');
+    }
+    return irBuilder.buildLocalSet(
+        getLocal(node, semantics),
+        build(node.rightHandSide));
+  }
+
+  @override
+  ir.Node visitAssignmentExpression(AssignmentExpression node) {
+    // Avoid eager visiting of left and right hand side.
+    return handleAssignmentExpression(node);
+  }
+
+  @override
+  ir.Node visitLocalVariableAssignment(AssignmentExpression node,
+                                       AccessSemantics semantics) {
+    return handleLocalAssignment(node, semantics);
+  }
+
+  @override
+  ir.Node visitParameterAssignment(AssignmentExpression node,
+                                   AccessSemantics semantics) {
+    return handleLocalAssignment(node, semantics);
   }
 
   @override
@@ -230,4 +297,24 @@
         subbuild(node.thenStatement),
         subbuild(node.elseStatement));
   }
+
+  @override
+  visitBlock(Block node) {
+    irBuilder.buildBlock(node.statements, build);
+  }
+
+  @override
+  visitForStatement(ForStatement node) {
+    // TODO(johnniwinther): Support `for` as a jump target.
+    SubbuildFunction buildInitializer;
+    if (node.variables != null) {
+      buildInitializer = subbuild(node.variables);
+    } else {
+      buildInitializer = subbuild(node.initialization);
+    }
+    irBuilder.buildFor(buildInitializer: buildInitializer,
+                       buildCondition: subbuild(node.condition),
+                       buildBody: subbuild(node.body),
+                       buildUpdate: subbuildSequence(node.updaters));
+  }
 }
diff --git a/pkg/analyzer2dart/lib/src/dart_backend.dart b/pkg/analyzer2dart/lib/src/dart_backend.dart
index 8409515..ab0f644 100644
--- a/pkg/analyzer2dart/lib/src/dart_backend.dart
+++ b/pkg/analyzer2dart/lib/src/dart_backend.dart
@@ -21,7 +21,11 @@
     mainFunction: convertedWorld.mainFunction,
     computeElementAst: (Element element) {
       return DartBackend.createElementAst(
-          null, null, null, null, convertedWorld.getIr(element));
+          null, // No compiler.
+          null, // No tracer.
+          DART_CONSTANT_SYSTEM,
+          element,
+          convertedWorld.getIr(element));
     },
     shouldOutput: (_) => true,
     isSafeToRemoveTypeDeclarations: (_) => false);
diff --git a/pkg/analyzer2dart/lib/src/element_converter.dart b/pkg/analyzer2dart/lib/src/element_converter.dart
index 6148b59..e6400c3 100644
--- a/pkg/analyzer2dart/lib/src/element_converter.dart
+++ b/pkg/analyzer2dart/lib/src/element_converter.dart
@@ -153,4 +153,10 @@
       analyzer.LocalVariableElement input) {
     return new LocalVariableElementY(converter, input);
   }
+
+  @override
+  dart2js.ConstructorElement visitConstructorElement(
+      analyzer.ConstructorElement input) {
+    return new ConstructorElementY(converter, input);
+  }
 }
diff --git a/pkg/analyzer2dart/lib/src/identifier_semantics.dart b/pkg/analyzer2dart/lib/src/identifier_semantics.dart
index ccfd78f..026e00a 100644
--- a/pkg/analyzer2dart/lib/src/identifier_semantics.dart
+++ b/pkg/analyzer2dart/lib/src/identifier_semantics.dart
@@ -69,6 +69,7 @@
  * Data structure used to classify the semantics of a property access or method
  * or function invocation.
  */
+// TODO(paulberry,johnniwinther): Support index operations in AccessSemantics.
 class AccessSemantics {
   /**
    * The kind of access.
@@ -199,253 +200,264 @@
   }
 }
 
-/**
- * Return the semantics for [node].
- */
-AccessSemantics classifyMethodInvocation(MethodInvocation node) {
-  Expression target = node.realTarget;
-  Element staticElement = node.methodName.staticElement;
-  if (target == null) {
-    if (staticElement is FunctionElement) {
-      if (staticElement.enclosingElement is CompilationUnitElement) {
+// TODO(johnniwinther,paulberry): This should be a constant.
+final AccessSemanticsVisitor ACCESS_SEMANTICS_VISITOR =
+    new AccessSemanticsVisitor();
+
+// TODO(johnniwinther,paulberry): This should extend a non-recursive visitor.
+class AccessSemanticsVisitor extends RecursiveAstVisitor<AccessSemantics> {
+  /**
+   * Return the semantics for [node].
+   */
+  @override
+  AccessSemantics visitMethodInvocation(MethodInvocation node) {
+    Expression target = node.realTarget;
+    Element staticElement = node.methodName.staticElement;
+    if (target == null) {
+      if (staticElement is FunctionElement) {
+        if (staticElement.enclosingElement is CompilationUnitElement) {
+          return new AccessSemantics.staticMethod(
+              node.methodName,
+              staticElement,
+              null,
+              isInvoke: true);
+        } else {
+          return new AccessSemantics.localFunction(
+              node.methodName,
+              staticElement,
+              isInvoke: true);
+        }
+      } else if (staticElement is MethodElement && staticElement.isStatic) {
         return new AccessSemantics.staticMethod(
             node.methodName,
             staticElement,
-            null,
-            isInvoke: true);
-      } else {
-        return new AccessSemantics.localFunction(
-            node.methodName,
-            staticElement,
-            isInvoke: true);
-      }
-    } else if (staticElement is MethodElement && staticElement.isStatic) {
-      return new AccessSemantics.staticMethod(
-          node.methodName,
-          staticElement,
-          staticElement.enclosingElement,
-          isInvoke: true);
-    } else if (staticElement is PropertyAccessorElement) {
-      if (staticElement.isSynthetic) {
-        if (staticElement.enclosingElement is CompilationUnitElement) {
-          return new AccessSemantics.staticField(
-              node.methodName,
-              staticElement.variable,
-              null,
-              isInvoke: true);
-        } else if (staticElement.isStatic) {
-          return new AccessSemantics.staticField(
-              node.methodName,
-              staticElement.variable,
-              staticElement.enclosingElement,
-              isInvoke: true);
-        }
-      } else {
-        if (staticElement.enclosingElement is CompilationUnitElement) {
-          return new AccessSemantics.staticProperty(
-              node.methodName,
-              staticElement,
-              null,
-              isInvoke: true);
-        } else if (staticElement.isStatic) {
-          return new AccessSemantics.staticProperty(
-              node.methodName,
-              staticElement,
-              staticElement.enclosingElement,
-              isInvoke: true);
-        }
-      }
-    } else if (staticElement is LocalVariableElement) {
-      return new AccessSemantics.localVariable(
-          node.methodName,
-          staticElement,
-          isInvoke: true);
-    } else if (staticElement is ParameterElement) {
-      return new AccessSemantics.parameter(
-          node.methodName,
-          staticElement,
-          isInvoke: true);
-    }
-  } else if (target is Identifier) {
-    Element targetStaticElement = target.staticElement;
-    if (targetStaticElement is PrefixElement) {
-      if (staticElement == null) {
-        return new AccessSemantics.dynamic(
-            node.methodName,
-            null,
+            staticElement.enclosingElement,
             isInvoke: true);
       } else if (staticElement is PropertyAccessorElement) {
         if (staticElement.isSynthetic) {
-          return new AccessSemantics.staticField(
+          if (staticElement.enclosingElement is CompilationUnitElement) {
+            return new AccessSemantics.staticField(
+                node.methodName,
+                staticElement.variable,
+                null,
+                isInvoke: true);
+          } else if (staticElement.isStatic) {
+            return new AccessSemantics.staticField(
+                node.methodName,
+                staticElement.variable,
+                staticElement.enclosingElement,
+                isInvoke: true);
+          }
+        } else {
+          if (staticElement.enclosingElement is CompilationUnitElement) {
+            return new AccessSemantics.staticProperty(
+                node.methodName,
+                staticElement,
+                null,
+                isInvoke: true);
+          } else if (staticElement.isStatic) {
+            return new AccessSemantics.staticProperty(
+                node.methodName,
+                staticElement,
+                staticElement.enclosingElement,
+                isInvoke: true);
+          }
+        }
+      } else if (staticElement is LocalVariableElement) {
+        return new AccessSemantics.localVariable(
+            node.methodName,
+            staticElement,
+            isInvoke: true);
+      } else if (staticElement is ParameterElement) {
+        return new AccessSemantics.parameter(
+            node.methodName,
+            staticElement,
+            isInvoke: true);
+      }
+    } else if (target is Identifier) {
+      Element targetStaticElement = target.staticElement;
+      if (targetStaticElement is PrefixElement) {
+        if (staticElement == null) {
+          return new AccessSemantics.dynamic(
               node.methodName,
-              staticElement.variable,
               null,
               isInvoke: true);
+        } else if (staticElement is PropertyAccessorElement) {
+          if (staticElement.isSynthetic) {
+            return new AccessSemantics.staticField(
+                node.methodName,
+                staticElement.variable,
+                null,
+                isInvoke: true);
+          } else {
+            return new AccessSemantics.staticProperty(
+                node.methodName,
+                staticElement,
+                null,
+                isInvoke: true);
+          }
         } else {
-          return new AccessSemantics.staticProperty(
+          return new AccessSemantics.staticMethod(
               node.methodName,
               staticElement,
               null,
               isInvoke: true);
         }
-      } else {
-        return new AccessSemantics.staticMethod(
-            node.methodName,
-            staticElement,
-            null,
-            isInvoke: true);
-      }
-    } else if (targetStaticElement is ClassElement) {
-      if (staticElement is PropertyAccessorElement) {
-        if (staticElement.isSynthetic) {
-          return new AccessSemantics.staticField(
-              node.methodName,
-              staticElement.variable,
-              targetStaticElement,
-              isInvoke: true);
+      } else if (targetStaticElement is ClassElement) {
+        if (staticElement is PropertyAccessorElement) {
+          if (staticElement.isSynthetic) {
+            return new AccessSemantics.staticField(
+                node.methodName,
+                staticElement.variable,
+                targetStaticElement,
+                isInvoke: true);
+          } else {
+            return new AccessSemantics.staticProperty(
+                node.methodName,
+                staticElement,
+                targetStaticElement,
+                isInvoke: true);
+          }
         } else {
-          return new AccessSemantics.staticProperty(
+          return new AccessSemantics.staticMethod(
               node.methodName,
               staticElement,
               targetStaticElement,
               isInvoke: true);
         }
+      }
+    }
+    return new AccessSemantics.dynamic(node.methodName, target, isInvoke: true);
+  }
+
+  /**
+   * Return the access semantics for [node].
+   */
+  @override
+  AccessSemantics visitPrefixedIdentifier(PrefixedIdentifier node) {
+    return _classifyPrefixed(node.prefix, node.identifier);
+  }
+
+  /**
+   * Helper function for classifying an expression of type
+   * Identifier.SimpleIdentifier.
+   */
+  AccessSemantics _classifyPrefixed(Identifier lhs, SimpleIdentifier rhs) {
+    Element lhsElement = lhs.staticElement;
+    Element rhsElement = rhs.staticElement;
+    if (lhsElement is PrefixElement) {
+      if (rhsElement is PropertyAccessorElement) {
+        if (rhsElement.isSynthetic) {
+          return new AccessSemantics.staticField(rhs, rhsElement.variable, null);
+        } else {
+          return new AccessSemantics.staticProperty(rhs, rhsElement, null);
+        }
+      } else if (rhsElement is FunctionElement) {
+        return new AccessSemantics.staticMethod(rhs, rhsElement, null);
       } else {
-        return new AccessSemantics.staticMethod(
-            node.methodName,
-            staticElement,
-            targetStaticElement,
-            isInvoke: true);
+        return new AccessSemantics.dynamic(rhs, null);
       }
-    }
-  }
-  return new AccessSemantics.dynamic(node.methodName, target, isInvoke: true);
-}
-
-/**
- * Return the access semantics for [node].
- */
-AccessSemantics classifyPrefixedIdentifier(PrefixedIdentifier node) {
-  return _classifyPrefixed(node.prefix, node.identifier);
-}
-
-/**
- * Helper function for classifying an expression of type
- * Identifier.SimpleIdentifier.
- */
-AccessSemantics _classifyPrefixed(Identifier lhs, SimpleIdentifier rhs) {
-  Element lhsElement = lhs.staticElement;
-  Element rhsElement = rhs.staticElement;
-  if (lhsElement is PrefixElement) {
-    if (rhsElement is PropertyAccessorElement) {
-      if (rhsElement.isSynthetic) {
-        return new AccessSemantics.staticField(rhs, rhsElement.variable, null);
+    } else if (lhsElement is ClassElement) {
+      if (rhsElement is PropertyAccessorElement && rhsElement.isSynthetic) {
+        return new AccessSemantics.staticField(
+            rhs,
+            rhsElement.variable,
+            lhsElement);
+      } else if (rhsElement is MethodElement) {
+        return new AccessSemantics.staticMethod(rhs, rhsElement, lhsElement);
       } else {
-        return new AccessSemantics.staticProperty(rhs, rhsElement, null);
+        return new AccessSemantics.staticProperty(rhs, rhsElement, lhsElement);
       }
-    } else if (rhsElement is FunctionElement) {
-      return new AccessSemantics.staticMethod(rhs, rhsElement, null);
     } else {
-      return new AccessSemantics.dynamic(rhs, null);
+      return new AccessSemantics.dynamic(rhs, lhs);
     }
-  } else if (lhsElement is ClassElement) {
-    if (rhsElement is PropertyAccessorElement && rhsElement.isSynthetic) {
-      return new AccessSemantics.staticField(
-          rhs,
-          rhsElement.variable,
-          lhsElement);
-    } else if (rhsElement is MethodElement) {
-      return new AccessSemantics.staticMethod(rhs, rhsElement, lhsElement);
-    } else {
-      return new AccessSemantics.staticProperty(rhs, rhsElement, lhsElement);
-    }
-  } else {
-    return new AccessSemantics.dynamic(rhs, lhs);
   }
-}
 
-/**
- * Return the access semantics for [node].
- */
-AccessSemantics classifyPropertyAccess(PropertyAccess node) {
-  if (node.target is Identifier) {
-    return _classifyPrefixed(node.target, node.propertyName);
-  } else {
-    return new AccessSemantics.dynamic(node.propertyName, node.realTarget);
+  /**
+   * Return the access semantics for [node].
+   */
+  @override
+  AccessSemantics visitPropertyAccess(PropertyAccess node) {
+    if (node.target is Identifier) {
+      return _classifyPrefixed(node.target, node.propertyName);
+    } else {
+      return new AccessSemantics.dynamic(node.propertyName, node.realTarget);
+    }
   }
-}
 
-/**
- * Return the access semantics for [node].
- *
- * Note: if [node] is the right hand side of a [PropertyAccess] or
- * [PrefixedIdentifier], or the method name of a [MethodInvocation], the return
- * value is null, since the semantics are determined by the parent.  In
- * practice these cases should never arise because the parent will visit the
- * parent node before visiting this one.
- */
-AccessSemantics classifySimpleIdentifier(SimpleIdentifier node) {
-  AstNode parent = node.parent;
-  if (node.inDeclarationContext()) {
-    // This identifier is a declaration, not a use.
-    return null;
-  }
-  if (parent is TypeName) {
-    // TODO(paulberry): handle this case.  Or, perhaps it would be better to
-    // require clients not to visit the children of a TypeName when visiting
-    // the AST structure.
-    //
-    // TODO(paulberry): be sure to consider type literals, e.g.:
-    //   class A {}
-    //   var a = A;
-    return null;
-  }
-  if ((parent is PropertyAccess && parent.propertyName == node) ||
-      (parent is PrefixedIdentifier && parent.identifier == node) ||
-      (parent is MethodInvocation && parent.methodName == node)) {
-    // The access semantics are determined by the parent.
-    return null;
-  }
-  // TODO(paulberry): handle PrefixElement.
-  Element staticElement = node.staticElement;
-  if (staticElement is PropertyAccessorElement) {
-    if (staticElement.isSynthetic) {
-      if (staticElement.enclosingElement is CompilationUnitElement) {
-        return new AccessSemantics.staticField(
-            node,
-            staticElement.variable,
-            null);
-      } else if (staticElement.isStatic) {
-        return new AccessSemantics.staticField(
-            node,
-            staticElement.variable,
-            staticElement.enclosingElement);
-      }
-    } else {
-      if (staticElement.enclosingElement is CompilationUnitElement) {
-        return new AccessSemantics.staticProperty(node, staticElement, null);
-      } else if (staticElement.isStatic) {
-        return new AccessSemantics.staticProperty(
-            node,
-            staticElement,
-            staticElement.enclosingElement);
-      }
+  /**
+   * Return the access semantics for [node].
+   *
+   * Note: if [node] is the right hand side of a [PropertyAccess] or
+   * [PrefixedIdentifier], or the method name of a [MethodInvocation], the return
+   * value is null, since the semantics are determined by the parent.  In
+   * practice these cases should never arise because the parent will visit the
+   * parent node before visiting this one.
+   */
+  @override
+  AccessSemantics visitSimpleIdentifier(SimpleIdentifier node) {
+    AstNode parent = node.parent;
+    if (node.inDeclarationContext()) {
+      // This identifier is a declaration, not a use.
+      return null;
     }
-  } else if (staticElement is LocalVariableElement) {
-    return new AccessSemantics.localVariable(node, staticElement);
-  } else if (staticElement is ParameterElement) {
-    return new AccessSemantics.parameter(node, staticElement);
-  } else if (staticElement is FunctionElement) {
-    if (staticElement.enclosingElement is CompilationUnitElement) {
-      return new AccessSemantics.staticMethod(node, staticElement, null);
-    } else {
-      return new AccessSemantics.localFunction(node, staticElement);
+    if (parent is TypeName) {
+      // TODO(paulberry): handle this case.  Or, perhaps it would be better to
+      // require clients not to visit the children of a TypeName when visiting
+      // the AST structure.
+      //
+      // TODO(paulberry): be sure to consider type literals, e.g.:
+      //   class A {}
+      //   var a = A;
+      return null;
     }
-  } else if (staticElement is MethodElement && staticElement.isStatic) {
-    return new AccessSemantics.staticMethod(
-        node,
-        staticElement,
-        staticElement.enclosingElement);
+    if ((parent is PropertyAccess && parent.propertyName == node) ||
+        (parent is PrefixedIdentifier && parent.identifier == node) ||
+        (parent is MethodInvocation && parent.methodName == node)) {
+      // The access semantics are determined by the parent.
+      return null;
+    }
+    // TODO(paulberry): handle PrefixElement.
+    Element staticElement = node.staticElement;
+    if (staticElement is PropertyAccessorElement) {
+      if (staticElement.isSynthetic) {
+        if (staticElement.enclosingElement is CompilationUnitElement) {
+          return new AccessSemantics.staticField(
+              node,
+              staticElement.variable,
+              null);
+        } else if (staticElement.isStatic) {
+          return new AccessSemantics.staticField(
+              node,
+              staticElement.variable,
+              staticElement.enclosingElement);
+        }
+      } else {
+        if (staticElement.enclosingElement is CompilationUnitElement) {
+          return new AccessSemantics.staticProperty(node, staticElement, null);
+        } else if (staticElement.isStatic) {
+          return new AccessSemantics.staticProperty(
+              node,
+              staticElement,
+              staticElement.enclosingElement);
+        }
+      }
+    } else if (staticElement is LocalVariableElement) {
+      return new AccessSemantics.localVariable(node, staticElement);
+    } else if (staticElement is ParameterElement) {
+      return new AccessSemantics.parameter(node, staticElement);
+    } else if (staticElement is FunctionElement) {
+      if (staticElement.enclosingElement is CompilationUnitElement) {
+        return new AccessSemantics.staticMethod(node, staticElement, null);
+      } else {
+        return new AccessSemantics.localFunction(node, staticElement);
+      }
+    } else if (staticElement is MethodElement && staticElement.isStatic) {
+      return new AccessSemantics.staticMethod(
+          node,
+          staticElement,
+          staticElement.enclosingElement);
+    }
+    return new AccessSemantics.dynamic(node, null);
   }
-  return new AccessSemantics.dynamic(node, null);
-}
+}
\ No newline at end of file
diff --git a/pkg/analyzer2dart/lib/src/modely.dart b/pkg/analyzer2dart/lib/src/modely.dart
index ea65b24..390ea7c 100644
--- a/pkg/analyzer2dart/lib/src/modely.dart
+++ b/pkg/analyzer2dart/lib/src/modely.dart
@@ -345,21 +345,8 @@
   bool get isAbstract => false;
 }
 
-class TopLevelFunctionElementY extends ElementY
-    with AnalyzableElementY, AstElementY, TopLevelElementMixin
-    implements dart2js.FunctionElement {
-  analyzer.FunctionElement get element => super.element;
-
-  @override
-  dart2js.ElementKind get kind => dart2js.ElementKind.FUNCTION;
-
-  @override
-  dart2js.FunctionType get type => converter.convertType(element.type);
-
-  TopLevelFunctionElementY(ElementConverter converter,
-                           analyzer.FunctionElement element)
-      : super(converter, element);
-
+abstract class FunctionElementMixin
+    implements ElementY, dart2js.FunctionElement {
   @override
   get abstractField => unsupported('abstractField');
 
@@ -376,6 +363,25 @@
   bool get hasFunctionSignature => unsupported('hasFunctionSignature');
 }
 
+class TopLevelFunctionElementY extends ElementY
+    with AnalyzableElementY,
+         AstElementY,
+         TopLevelElementMixin,
+         FunctionElementMixin
+    implements dart2js.FunctionElement {
+  analyzer.FunctionElement get element => super.element;
+
+  @override
+  dart2js.ElementKind get kind => dart2js.ElementKind.FUNCTION;
+
+  @override
+  dart2js.FunctionType get type => converter.convertType(element.type);
+
+  TopLevelFunctionElementY(ElementConverter converter,
+                           analyzer.FunctionElement element)
+      : super(converter, element);
+}
+
 class ParameterElementY extends ElementY
     with AnalyzableElementY, AstElementY
     implements dart2js.ParameterElement {
@@ -679,6 +685,9 @@
   @override
   bool get isConst => element.isConst;
 
+  @override
+  bool get isStatic => false;
+
   LocalVariableElementY(ElementConverter converter,
                         analyzer.LocalVariableElement element)
       : super(converter, element);
@@ -688,4 +697,47 @@
 
   @override
   dart2js.DartType get type => unsupported('type');
+}
+
+class ConstructorElementY extends ElementY
+    with AnalyzableElementY,
+         AstElementY,
+         FunctionElementMixin
+    implements dart2js.ConstructorElement {
+
+  analyzer.ConstructorElement get element => super.element;
+
+  @override
+  dart2js.ClassElement get enclosingClass {
+    return converter.convertElement(element.enclosingElement);
+  }
+
+  // TODO(johnniwinther): Support redirecting/factory constructors.
+  @override
+  dart2js.ElementKind get kind => dart2js.ElementKind.GENERATIVE_CONSTRUCTOR;
+
+  ConstructorElementY(ElementConverter converter,
+                      analyzer.ConstructorElement element)
+      : super(converter, element);
+
+  @override
+  computeEffectiveTargetType(_) => unsupported('computeEffectiveTargetType');
+
+  @override
+  get definingConstructor => unsupported('definingConstructor');
+
+  @override
+  get effectiveTarget => unsupported('effectiveTarget');
+
+  @override
+  get immediateRedirectionTarget => unsupported('immediateRedirectionTarget');
+
+  @override
+  bool get isRedirectingFactory => unsupported('isRedirectingFactory');
+
+  @override
+  get nestedClosures => unsupported('nestedClosures');
+
+  @override
+  get type => unsupported('type');
 }
\ No newline at end of file
diff --git a/pkg/analyzer2dart/lib/src/semantic_visitor.dart b/pkg/analyzer2dart/lib/src/semantic_visitor.dart
index b0b955c..d53051c 100644
--- a/pkg/analyzer2dart/lib/src/semantic_visitor.dart
+++ b/pkg/analyzer2dart/lib/src/semantic_visitor.dart
@@ -77,7 +77,11 @@
       node.target.accept(this);
     }
     node.argumentList.accept(this);
-    AccessSemantics semantics = classifyMethodInvocation(node);
+    return handleMethodInvocation(node);
+  }
+
+  R handleMethodInvocation(MethodInvocation node) {
+    AccessSemantics semantics = node.accept(ACCESS_SEMANTICS_VISITOR);
     switch (semantics.kind) {
       case AccessKind.DYNAMIC:
         return visitDynamicInvocation(node, semantics);
@@ -105,18 +109,26 @@
     if (node.target != null) {
       node.target.accept(this);
     }
-    return _handlePropertyAccess(node, classifyPropertyAccess(node));
+    return handlePropertyAccess(node);
+  }
+
+  R handlePropertyAccess(PropertyAccess node) {
+    return _handlePropertyAccess(node, node.accept(ACCESS_SEMANTICS_VISITOR));
   }
 
   @override
   R visitPrefixedIdentifier(PrefixedIdentifier node) {
     node.prefix.accept(this);
-    return _handlePropertyAccess(node, classifyPrefixedIdentifier(node));
+    return handlePrefixedIdentifier(node);
+  }
+
+  R handlePrefixedIdentifier(PrefixedIdentifier node) {
+    return _handlePropertyAccess(node, node.accept(ACCESS_SEMANTICS_VISITOR));
   }
 
   @override
   R visitSimpleIdentifier(SimpleIdentifier node) {
-    AccessSemantics semantics = classifySimpleIdentifier(node);
+    AccessSemantics semantics = node.accept(ACCESS_SEMANTICS_VISITOR);
     if (semantics != null) {
       return _handlePropertyAccess(node, semantics);
     } else {
@@ -174,4 +186,74 @@
             'Unexpected ${semantics} in _handlePropertyAccess.');
     }
   }
+
+  R visitDynamicPropertyAssignment(AssignmentExpression node,
+                                   AccessSemantics semantics) {
+    return giveUp(node, 'visitDynamicPropertyAssignment of $semantics');
+  }
+
+  R visitLocalFunctionAssignment(AssignmentExpression node,
+                                 AccessSemantics semantics) {
+    return giveUp(node, 'visitLocalFunctionAssignment of $semantics');
+  }
+
+  R visitLocalVariableAssignment(AssignmentExpression node,
+                                 AccessSemantics semantics) {
+    return giveUp(node, 'visitLocalVariableAssignment of $semantics');
+  }
+
+  R visitParameterAssignment(AssignmentExpression node,
+                             AccessSemantics semantics) {
+    return giveUp(node, 'visitParameterAssignment of $semantics');
+  }
+
+  R visitStaticFieldAssignment(AssignmentExpression node,
+                               AccessSemantics semantics) {
+    return giveUp(node, 'visitStaticFieldAssignment of $semantics');
+  }
+
+  R visitStaticMethodAssignment(AssignmentExpression node,
+                                AccessSemantics semantics) {
+    return giveUp(node, 'visitStaticMethodAssignment of $semantics');
+  }
+
+  R visitStaticPropertyAssignment(AssignmentExpression node,
+                                  AccessSemantics semantics) {
+    return giveUp(node, 'visitStaticPropertyAssignment of $semantics');
+  }
+
+  @override
+  R visitAssignmentExpression(AssignmentExpression node) {
+    super.visitAssignmentExpression(node);
+    return handleAssignmentExpression(node);
+  }
+
+  R handleAssignmentExpression(AssignmentExpression node) {
+    AccessSemantics semantics =
+        node.leftHandSide.accept(ACCESS_SEMANTICS_VISITOR);
+    if (semantics == null) {
+      return giveUp(node, 'handleAssignmentExpression with no AccessSemantics');
+    } else {
+      switch (semantics.kind) {
+        case AccessKind.DYNAMIC:
+          return visitDynamicPropertyAssignment(node, semantics);
+        case AccessKind.LOCAL_FUNCTION:
+          return visitLocalFunctionAssignment(node, semantics);
+        case AccessKind.LOCAL_VARIABLE:
+          return visitLocalVariableAssignment(node, semantics);
+        case AccessKind.PARAMETER:
+          return visitParameterAssignment(node, semantics);
+        case AccessKind.STATIC_FIELD:
+          return visitStaticFieldAssignment(node, semantics);
+        case AccessKind.STATIC_METHOD:
+          return visitStaticMethodAssignment(node, semantics);
+        case AccessKind.STATIC_PROPERTY:
+          return visitStaticPropertyAssignment(node, semantics);
+        default:
+          // Unexpected access kind.
+          return giveUp(node,
+              'Unexpected ${semantics} in _handlePropertyAccess.');
+      }
+    }
+  }
 }
diff --git a/pkg/analyzer2dart/lib/src/tree_shaker.dart b/pkg/analyzer2dart/lib/src/tree_shaker.dart
index ba24c4c..47a653f 100644
--- a/pkg/analyzer2dart/lib/src/tree_shaker.dart
+++ b/pkg/analyzer2dart/lib/src/tree_shaker.dart
@@ -207,7 +207,6 @@
     _addElement(_world.mainFunction);
     while (_queue.isNotEmpty) {
       Element element = _queue.removeLast();
-      print('Tree shaker handling $element');
       if (element is ExecutableElement) {
         MethodAnalysis analysis = _localComputer.analyzeMethod(element);
         _world.executableElements[element] = analysis.declaration;
@@ -233,7 +232,6 @@
                 '$element (${element.runtimeType})');
       }
     }
-    print('Tree shaking done');
     return _world;
   }
 }
@@ -261,8 +259,8 @@
   @override
   void visitDynamicInvocation(MethodInvocation node,
       AccessSemantics semantics) {
-    analysis.invokes.add(
-        createSelectorFromMethodInvocation(node, node.methodName.name));
+    analysis.invokes.add(createSelectorFromMethodInvocation(
+        node.argumentList, node.methodName.name));
   }
 
   @override
@@ -288,21 +286,24 @@
       AccessSemantics semantics) {
     // Invocation of a static field.
     analysis.accesses.add(semantics.element);
-    analysis.invokes.add(createSelectorFromMethodInvocation(node, 'call'));
+    analysis.invokes.add(createSelectorFromMethodInvocation(
+        node.argumentList, 'call'));
   }
 
+  @override
   void visitStaticMethodInvocation(MethodInvocation node,
       AccessSemantics semantics) {
     analysis.calls.add(semantics.element);
   }
 
+  @override
   void visitStaticPropertyInvocation(MethodInvocation node,
       AccessSemantics semantics) {
     // Invocation of a property.  TODO(paulberry): handle this.
     super.visitStaticPropertyInvocation(node, semantics);
   }
 
-  void visitDynamicAccess(AstNode node, AccessSemantics semantics) {
+  void handleDynamicAccess(AccessSemantics semantics) {
     if (semantics.isRead) {
       analysis.invokes.add(
           new Selector.getter(semantics.identifier.name, null));
@@ -315,27 +316,38 @@
     }
   }
 
+  @override
+  void visitDynamicAccess(AstNode node, AccessSemantics semantics) {
+    handleDynamicAccess(semantics);
+  }
+
+  @override
   void visitLocalFunctionAccess(AstNode node, AccessSemantics semantics) {
     // Locals don't need to be tree shaken.
   }
 
+  @override
   void visitLocalVariableAccess(AstNode node, AccessSemantics semantics) {
     // Locals don't need to be tree shaken.
   }
 
+  @override
   void visitParameterAccess(AstNode node, AccessSemantics semantics) {
     // Locals don't need to be tree shaken.
   }
 
+  @override
   void visitStaticFieldAccess(AstNode node, AccessSemantics semantics) {
     analysis.accesses.add(semantics.element);
   }
 
+  @override
   void visitStaticMethodAccess(AstNode node, AccessSemantics semantics) {
     // Method tear-off.  TODO(paulberry): implement.
     super.visitStaticMethodAccess(node, semantics);
   }
 
+  @override
   void visitStaticPropertyAccess(AstNode node, AccessSemantics semantics) {
     // TODO(paulberry): implement.
     super.visitStaticPropertyAccess(node, semantics);
@@ -374,4 +386,9 @@
     // reported as a compile time error.
     analysis.calls.add(node.staticElement);
   }
+
+  @override
+  void handleAssignmentExpression(AssignmentExpression node) {
+    // Don't special-case assignment expressions.
+  }
 }
diff --git a/pkg/analyzer2dart/lib/src/util.dart b/pkg/analyzer2dart/lib/src/util.dart
index 6eee618..c7fe801 100644
--- a/pkg/analyzer2dart/lib/src/util.dart
+++ b/pkg/analyzer2dart/lib/src/util.dart
@@ -11,13 +11,13 @@
 import 'package:compiler/implementation/universe/universe.dart';
 import 'package:compiler/implementation/source_file.dart';
 
-Selector createSelectorFromMethodInvocation(MethodInvocation node,
+Selector createSelectorFromMethodInvocation(ArgumentList node,
                                             String name) {
   int arity = 0;
   List<String> namedArguments = <String>[];
-  for (var x in node.argumentList.arguments) {
-    if (x is NamedExpression) {
-      namedArguments.add(x.name.label.name);
+  for (Expression argument in node.arguments) {
+    if (argument is NamedExpression) {
+      namedArguments.add(argument.name.label.name);
     } else {
       arity++;
     }
diff --git a/pkg/analyzer2dart/test/end2end_data.dart b/pkg/analyzer2dart/test/end2end_data.dart
new file mode 100644
index 0000000..455f790
--- /dev/null
+++ b/pkg/analyzer2dart/test/end2end_data.dart
@@ -0,0 +1,561 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// Test data for the end2end test.
+library test.end2end.data;
+
+import 'test_helper.dart' show Group;
+import 'test_helper.dart' as base show TestSpec;
+
+class TestSpec extends base.TestSpec {
+  const TestSpec(String input, [String output])
+      : super(input, output != null ? output : input);
+}
+
+const List<Group> TEST_DATA = const <Group>[
+  const Group('Empty main', const <TestSpec>[
+    const TestSpec('''
+main() {}
+'''),
+
+    const TestSpec('''
+main() {}
+foo() {}
+''', '''
+main() {}
+'''),
+  ]),
+  const Group('Simple call-chains', const <TestSpec>[
+    const TestSpec('''
+foo() {}
+main() {
+  foo();
+}
+'''),
+
+    const TestSpec('''
+bar() {}
+foo() {
+  bar();
+}
+main() {
+  foo();
+}
+'''),
+
+    const TestSpec('''
+bar() {
+  main();
+}
+foo() {
+  bar();
+}
+main() {
+  foo();
+}
+'''),
+
+  ]),
+  const Group('Literals', const <TestSpec>[
+    const TestSpec('''
+main() {
+  return 0;
+}
+'''),
+
+    const TestSpec('''
+main() {
+  return 1.5;
+}
+'''),
+
+    const TestSpec('''
+main() {
+  return true;
+}
+'''),
+
+    const TestSpec('''
+main() {
+  return false;
+}
+'''),
+
+    const TestSpec('''
+main() {
+  return "a";
+}
+'''),
+
+    const TestSpec('''
+main() {
+  return "a" "b";
+}
+''', '''
+main() {
+  return "ab";
+}
+'''),
+  ]),
+
+  const Group('Parameters', const <TestSpec>[
+    const TestSpec('''
+main(args) {}
+'''),
+
+    const TestSpec('''
+main(a, b) {}
+'''),
+  ]),
+
+  const Group('Typed parameters', const <TestSpec>[
+    const TestSpec('''
+void main(args) {}
+'''),
+
+    const TestSpec('''
+main(int a, String b) {}
+'''),
+
+    const TestSpec('''
+main(Comparator a, List b) {}
+'''),
+
+    const TestSpec('''
+main(Comparator<dynamic> a, List<dynamic> b) {}
+''','''
+main(Comparator a, List b) {}
+'''),
+
+    const TestSpec('''
+main(Map a, Map<dynamic, List<int>> b) {}
+'''),
+  ]),
+
+  const Group('Pass arguments', const <TestSpec>[
+    const TestSpec('''
+foo(a) {}
+main() {
+  foo(null);
+}
+'''),
+
+    const TestSpec('''
+bar(b, c) {}
+foo(a) {}
+main() {
+  foo(null);
+  bar(0, "");
+}
+'''),
+
+    const TestSpec('''
+bar(b) {}
+foo(a) {
+  bar(a);
+}
+main() {
+  foo(null);
+}
+'''),
+  ]),
+
+  const Group('Top level field access', const <TestSpec>[
+    const TestSpec('''
+main(args) {
+  return deprecated;
+}
+'''),
+  ]),
+
+  const Group('Local variables', const <TestSpec>[
+    const TestSpec('''
+main() {
+  var a;
+  return a;
+}
+''','''
+main() {}
+'''),
+
+    const TestSpec('''
+main() {
+  var a = 0;
+  return a;
+}
+''','''
+main() {
+  return 0;
+}
+'''),
+  ]),
+
+  const Group('Local variable writes', const <TestSpec>[
+    const TestSpec('''
+main() {
+  var a;
+  a = 10;
+  return a;
+}
+''', '''
+main() {
+  return 10;
+}
+'''),
+
+    const TestSpec('''
+main() {
+  var a = 0;
+  a = 10;
+  return a;
+}
+''', '''
+main() {
+  return 10;
+}
+'''),
+
+    const TestSpec('''
+main() {
+  var a = 0;
+  print(a);
+  a = "";
+  print(a);
+  return a;
+}
+'''),
+
+    const TestSpec('''
+main(a) {
+  print(a);
+  a = "";
+  print(a);
+  return a;
+}
+'''),
+
+    const TestSpec('''
+main(a) {
+  if (a) {
+    a = "";
+  }
+  print(a);
+  return a;
+}
+'''),
+  ]),
+
+  const Group('Dynamic access', const <TestSpec>[
+    const TestSpec('''
+main(a) {
+  return a.foo;
+}
+'''),
+
+    const TestSpec('''
+main() {
+  var a = "";
+  return a.foo;
+}
+''','''
+main() {
+  return "".foo;
+}
+'''),
+  ]),
+
+  const Group('Dynamic invocation', const <TestSpec>[
+    const TestSpec('''
+main(a) {
+  return a.foo(0);
+}
+'''),
+
+    const TestSpec('''
+main() {
+  var a = "";
+  return a.foo(0, 1);
+}
+''','''
+main() {
+  return "".foo(0, 1);
+}
+'''),
+  ]),
+
+  const Group('Binary expressions', const <TestSpec>[
+    const TestSpec('''
+main(a) {
+  return a + deprecated;
+}
+'''),
+
+    const TestSpec('''
+main(a) {
+  return a - deprecated;
+}
+'''),
+
+    const TestSpec('''
+main(a) {
+  return a * deprecated;
+}
+'''),
+
+    const TestSpec('''
+main(a) {
+  return a / deprecated;
+}
+'''),
+
+    const TestSpec('''
+main(a) {
+  return a ~/ deprecated;
+}
+'''),
+
+    const TestSpec('''
+main(a) {
+  return a % deprecated;
+}
+'''),
+
+    const TestSpec('''
+main(a) {
+  return a < deprecated;
+}
+'''),
+
+    const TestSpec('''
+main(a) {
+  return a <= deprecated;
+}
+'''),
+
+    const TestSpec('''
+main(a) {
+  return a > deprecated;
+}
+'''),
+
+    const TestSpec('''
+main(a) {
+  return a >= deprecated;
+}
+'''),
+
+    const TestSpec('''
+main(a) {
+  return a << deprecated;
+}
+'''),
+
+    const TestSpec('''
+main(a) {
+  return a >> deprecated;
+}
+'''),
+
+    const TestSpec('''
+main(a) {
+  return a & deprecated;
+}
+'''),
+
+    const TestSpec('''
+main(a) {
+  return a | deprecated;
+}
+'''),
+
+    const TestSpec('''
+main(a) {
+  return a ^ deprecated;
+}
+'''),
+
+    const TestSpec('''
+main(a) {
+  return a == deprecated;
+}
+'''),
+
+    const TestSpec('''
+main(a) {
+  return a != deprecated;
+}
+''','''
+main(a) {
+  return !(a == deprecated);
+}
+'''),
+
+    const TestSpec('''
+main(a) {
+  return a && deprecated;
+}
+'''),
+
+    const TestSpec('''
+main(a) {
+  return a || deprecated;
+}
+'''),
+  ]),
+
+  const Group('If statement', const <TestSpec>[
+    const TestSpec('''
+main(a) {
+  if (a) {
+    print(0);
+  }
+}
+'''),
+
+    const TestSpec('''
+main(a) {
+  if (a) {
+    print(0);
+  } else {
+    print(1);
+  }
+}
+''','''
+main(a) {
+  a ? print(0) : print(1);
+}
+'''),
+
+    const TestSpec('''
+main(a) {
+  if (a) {
+    print(0);
+  } else {
+    print(1);
+    print(2);
+  }
+}
+'''),
+  ]),
+
+  const Group('Conditional expression', const <TestSpec>[
+    const TestSpec('''
+main(a) {
+  return a ? print(0) : print(1);
+}
+'''),
+  ]),
+
+  // These test that unreachable statements are skipped within a block.
+  const Group('Block statements', const <TestSpec>[
+    const TestSpec('''
+main(a) {
+  return 0;
+  return 1;
+}
+''', '''
+main(a) {
+  return 0;
+}
+'''),
+
+    const TestSpec('''
+main(a) {
+  if (a) {
+    return 0;
+    return 1;
+  } else {
+    return 2;
+    return 3;
+  }
+}
+''', '''
+main(a) {
+  return a ? 0 : 2;
+}
+'''),
+
+    const TestSpec('''
+main(a) {
+  if (a) {
+    print(0);
+    return 0;
+    return 1;
+  } else {
+    print(2);
+    return 2;
+    return 3;
+  }
+}
+''', '''
+main(a) {
+  if (a) {
+    print(0);
+    return 0;
+  } else {
+    print(2);
+    return 2;
+  }
+}
+'''),
+  ]),
+
+  const Group('Constructor invocation', const <TestSpec>[
+    const TestSpec('''
+main(a) {
+  new Object();
+}
+'''),
+
+const TestSpec('''
+main(a) {
+  new Deprecated("");
+}
+'''),
+  ]),
+
+  const Group('For loop', const <TestSpec>[
+    const TestSpec('''
+main() {
+  for (;;) {}
+}
+''', '''
+main() {
+  while (true) {}
+}
+'''),
+
+const TestSpec('''
+main() {
+  for (int i = 0; i < 10; i = i + 1) {
+    print(i);
+  }
+}
+''', '''
+main() {
+  var i = 0;
+  while (i < 10) {
+    print(i);
+    ++i;
+  }
+}
+'''),
+
+const TestSpec('''
+main(i) {
+  for (i = 0; i < 10; i = i + 1) {
+    print(i);
+  }
+}
+''', '''
+main(i) {
+  i = 0;
+  while (i < 10) {
+    print(i);
+    ++i;
+  }
+}
+'''),
+  ]),
+];
diff --git a/pkg/analyzer2dart/test/end2end_test.dart b/pkg/analyzer2dart/test/end2end_test.dart
index 8bdbfff..3cfde57 100644
--- a/pkg/analyzer2dart/test/end2end_test.dart
+++ b/pkg/analyzer2dart/test/end2end_test.dart
@@ -3,8 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 /// End-to-end test of the analyzer2dart compiler.
-
-import 'dart:async';
+library test.end2end;
 
 import 'mock_sdk.dart';
 import 'package:analyzer/file_system/memory_file_system.dart';
@@ -18,491 +17,17 @@
 import '../lib/src/converted_world.dart';
 import '../lib/src/dart_backend.dart';
 
+import 'test_helper.dart' hide TestSpec;
+import 'output_helper.dart';
+import 'end2end_data.dart';
+
 main() {
-  test('Empty main', () {
-    String expectedResult =  '''
-main() {}
-''';
-    checkResult('''
-main() {}''',
-        expectedResult);
-
-    checkResult('''
-main() {}
-foo() {}''',
-        expectedResult);
-  });
-
-  test('Simple call-chains', () {
-    checkResult('''
-foo() {}
-main() {
-  foo();
-}
-''');
-
-    checkResult('''
-bar() {}
-foo() {
-  bar();
-}
-main() {
-  foo();
-}
-''');
-
-    checkResult('''
-bar() {
-  main();
-}
-foo() {
-  bar();
-}
-main() {
-  foo();
-}
-''');
-  });
-
-  test('Literals', () {
-    checkResult('''
-main() {
-  return 0;
-}
-''');
-
-    checkResult('''
-main() {
-  return 1.5;
-}
-''');
-
-    checkResult('''
-main() {
-  return true;
-}
-''');
-
-    checkResult('''
-main() {
-  return false;
-}
-''');
-
-    checkResult('''
-main() {
-  return "a";
-}
-''');
-
-    checkResult('''
-main() {
-  return "a" "b";
-}
-''', '''
-main() {
-  return "ab";
-}
-''');
-  });
-
-  test('Parameters', () {
-    checkResult('''
-main(args) {}
-''');
-
-    checkResult('''
-main(a, b) {}
-''');
-  });
-
-  test('Typed parameters', () {
-    checkResult('''
-void main(args) {}
-''');
-
-    checkResult('''
-main(int a, String b) {}
-''');
-
-    checkResult('''
-main(Comparator a, List b) {}
-''');
-
-    checkResult('''
-main(Comparator<dynamic> a, List<dynamic> b) {}
-''', '''
-main(Comparator a, List b) {}
-''');
-
-    checkResult('''
-main(Map a, Map<dynamic, List<int>> b) {}
-''');
-  });
-
-  test('Pass arguments', () {
-    checkResult('''
-foo(a) {}
-main() {
-  foo(null);
-}
-''');
-
-    checkResult('''
-bar(b, c) {}
-foo(a) {}
-main() {
-  foo(null);
-  bar(0, "");
-}
-''');
-
-    checkResult('''
-bar(b) {}
-foo(a) {
-  bar(a);
-}
-main() {
-  foo(null);
-}
-''');
-  });
-
-  test('Top level field access', () {
-    checkResult('''
-main(args) {
-  return deprecated;
-}
-''');
-  });
-
-  test('Local variables', () {
-    checkResult('''
-main() {
-  var a;
-  return a;
-}
-''', '''
-main() {}
-''');
-
-    checkResult('''
-main() {
-  var a = 0;
-  return a;
-}
-''', '''
-main() {
-  return 0;
-}
-''');
-  });
-
-  test('Dynamic access', () {
-    checkResult('''
-main(a) {
-  return a.foo;
-}
-''', '''
-main(a) {
-  return a.foo;
-}
-''');
-
-    checkResult('''
-main() {
-  var a = "";
-  return a.foo;
-}
-''', '''
-main() {
-  return "".foo;
-}
-''');
-  });
-
-  test('Dynamic invocation', () {
-    checkResult('''
-main(a) {
-  return a.foo(0);
-}
-''', '''
-main(a) {
-  return a.foo(0);
-}
-''');
-
-    checkResult('''
-main() {
-  var a = "";
-  return a.foo(0, 1);
-}
-''', '''
-main() {
-  return "".foo(0, 1);
-}
-''');
-  });
-
-  test('Binary expressions', () {
-    checkResult('''
-main(a) {
-  return a + deprecated;
-}
-''', '''
-main(a) {
-  return a + deprecated;
-}
-''');
-
-    checkResult('''
-main(a) {
-  return a - deprecated;
-}
-''', '''
-main(a) {
-  return a - deprecated;
-}
-''');
-
-    checkResult('''
-main(a) {
-  return a * deprecated;
-}
-''', '''
-main(a) {
-  return a * deprecated;
-}
-''');
-
-    checkResult('''
-main(a) {
-  return a / deprecated;
-}
-''', '''
-main(a) {
-  return a / deprecated;
-}
-''');
-
-    checkResult('''
-main(a) {
-  return a ~/ deprecated;
-}
-''', '''
-main(a) {
-  return a ~/ deprecated;
-}
-''');
-
-    checkResult('''
-main(a) {
-  return a % deprecated;
-}
-''', '''
-main(a) {
-  return a % deprecated;
-}
-''');
-
-    checkResult('''
-main(a) {
-  return a < deprecated;
-}
-''', '''
-main(a) {
-  return a < deprecated;
-}
-''');
-
-    checkResult('''
-main(a) {
-  return a <= deprecated;
-}
-''', '''
-main(a) {
-  return a <= deprecated;
-}
-''');
-
-    checkResult('''
-main(a) {
-  return a > deprecated;
-}
-''', '''
-main(a) {
-  return a > deprecated;
-}
-''');
-
-    checkResult('''
-main(a) {
-  return a >= deprecated;
-}
-''', '''
-main(a) {
-  return a >= deprecated;
-}
-''');
-
-    checkResult('''
-main(a) {
-  return a << deprecated;
-}
-''', '''
-main(a) {
-  return a << deprecated;
-}
-''');
-
-    checkResult('''
-main(a) {
-  return a >> deprecated;
-}
-''', '''
-main(a) {
-  return a >> deprecated;
-}
-''');
-
-    checkResult('''
-main(a) {
-  return a & deprecated;
-}
-''', '''
-main(a) {
-  return a & deprecated;
-}
-''');
-
-    checkResult('''
-main(a) {
-  return a | deprecated;
-}
-''', '''
-main(a) {
-  return a | deprecated;
-}
-''');
-
-    checkResult('''
-main(a) {
-  return a ^ deprecated;
-}
-''', '''
-main(a) {
-  return a ^ deprecated;
-}
-''');
-
-    checkResult('''
-main(a) {
-  return a == deprecated;
-}
-''', '''
-main(a) {
-  return a == deprecated;
-}
-''');
-
-    checkResult('''
-main(a) {
-  return a != deprecated;
-}
-''', '''
-main(a) {
-  return !(a == deprecated);
-}
-''');
-
-    checkResult('''
-main(a) {
-  return a || deprecated;
-}
-''', '''
-main(a) {
-  return a || deprecated;
-}
-''');
-
-    checkResult('''
-main(a) {
-  return a && deprecated;
-}
-''', '''
-main(a) {
-  return a && deprecated;
-}
-''');
-  });
-
-  test('If statement', () {
-    checkResult('''
-main(a) {
-  if (a) {
-    print(0);
-  }
-}
-''', '''
-main(a) {
-  if (a) {
-    print(0);
-  }
-}
-''');
-
-    checkResult('''
-main(a) {
-  if (a) {
-    print(0);
-  } else {
-    print(1);
-  }
-}
-''', '''
-main(a) {
-  a ? print(0) : print(1);
-}
-''');
-
-    checkResult('''
-main(a) {
-  if (a) {
-    print(0);
-  } else {
-    print(1);
-    print(2);
-  }
-}
-''', '''
-main(a) {
-  if (a) {
-    print(0);
-  } else {
-    print(1);
-    print(2);
-  }
-}
-''');
-  });
-
-  test('If statement', () {
-    checkResult('''
-main(a) {
-  return a ? print(0) : print(1);
-}
-''', '''
-main(a) {
-  return a ? print(0) : print(1);
-}
-''');
-  });
+  performTests(TEST_DATA, unittester, checkResult);
 }
 
-checkResult(String input, [String expectedOutput]) {
-  if (expectedOutput == null) {
-    expectedOutput = input;
-  }
+checkResult(TestSpec result) {
+  String input = result.input;
+  String expectedOutput = result.output;
 
   CollectingOutputProvider outputProvider = new CollectingOutputProvider();
   MemoryResourceProvider provider = new MemoryResourceProvider();
@@ -518,26 +43,3 @@
   String output = outputProvider.output.text;
   expect(output, equals(expectedOutput));
 }
-
-class CollectingOutputProvider {
-  StringBufferSink output;
-
-  EventSink<String> call(String name, String extension) {
-    return output = new StringBufferSink();
-  }
-}
-
-class StringBufferSink implements EventSink<String> {
-  StringBuffer sb = new StringBuffer();
-
-  void add(String text) {
-    sb.write(text);
-  }
-
-  void addError(errorEvent, [StackTrace stackTrace]) {}
-
-  void close() {}
-
-  String get text => sb.toString();
-}
-
diff --git a/pkg/analyzer2dart/test/identifier_semantics_test.dart b/pkg/analyzer2dart/test/identifier_semantics_test.dart
index 9d929c7..3ccc46f 100644
--- a/pkg/analyzer2dart/test/identifier_semantics_test.dart
+++ b/pkg/analyzer2dart/test/identifier_semantics_test.dart
@@ -2119,22 +2119,22 @@
 
   @override
   visitMethodInvocation(MethodInvocation node) {
-    onAccess(node, classifyMethodInvocation(node));
+    onAccess(node, node.accept(ACCESS_SEMANTICS_VISITOR));
   }
 
   @override
   visitPrefixedIdentifier(PrefixedIdentifier node) {
-    onAccess(node, classifyPrefixedIdentifier(node));
+    onAccess(node, node.accept(ACCESS_SEMANTICS_VISITOR));
   }
 
   @override
   visitPropertyAccess(PropertyAccess node) {
-    onAccess(node, classifyPropertyAccess(node));
+    onAccess(node, node.accept(ACCESS_SEMANTICS_VISITOR));
   }
 
   @override
   visitSimpleIdentifier(SimpleIdentifier node) {
-    AccessSemantics semantics = classifySimpleIdentifier(node);
+    AccessSemantics semantics = node.accept(ACCESS_SEMANTICS_VISITOR);
     if (semantics != null) {
       onAccess(node, semantics);
     }
diff --git a/pkg/analyzer2dart/test/output_helper.dart b/pkg/analyzer2dart/test/output_helper.dart
new file mode 100644
index 0000000..5a3f6b4
--- /dev/null
+++ b/pkg/analyzer2dart/test/output_helper.dart
@@ -0,0 +1,32 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// Helper classes for testing compiler output.
+library test.output_helper;
+
+import 'dart:async';
+
+
+class CollectingOutputProvider {
+  StringBufferSink output;
+
+  EventSink<String> call(String name, String extension) {
+    return output = new StringBufferSink();
+  }
+}
+
+class StringBufferSink implements EventSink<String> {
+  StringBuffer sb = new StringBuffer();
+
+  void add(String text) {
+    sb.write(text);
+  }
+
+  void addError(errorEvent, [StackTrace stackTrace]) {}
+
+  void close() {}
+
+  String get text => sb.toString();
+}
+
diff --git a/pkg/analyzer2dart/test/sexpr_data.dart b/pkg/analyzer2dart/test/sexpr_data.dart
new file mode 100644
index 0000000..bf1f08a
--- /dev/null
+++ b/pkg/analyzer2dart/test/sexpr_data.dart
@@ -0,0 +1,891 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// Test data for sexpr_test.
+library test.sexpr.data;
+
+import 'test_helper.dart';
+
+const List<Group> TEST_DATA = const [
+  const Group('Empty main', const [
+    const TestSpec('''
+main() {}
+''', '''
+(FunctionDefinition main ( return)
+  (LetPrim v0 (Constant NullConstant))
+  (InvokeContinuation return v0))
+'''),
+
+    const TestSpec('''
+foo() {}
+main() {
+  foo();
+}
+''', '''
+(FunctionDefinition main ( return)
+  (LetCont (k0 v0)
+    (LetPrim v1 (Constant NullConstant))
+    (InvokeContinuation return v1))
+  (InvokeStatic foo  k0))
+''')
+  ]),
+
+  const Group('Literals', const [
+    const TestSpec('''
+main() {
+  return 0;
+}
+''', '''
+(FunctionDefinition main ( return)
+  (LetPrim v0 (Constant IntConstant(0)))
+  (InvokeContinuation return v0))
+'''),
+
+    const TestSpec('''
+main() {
+  return 1.5;
+}
+''', '''
+(FunctionDefinition main ( return)
+  (LetPrim v0 (Constant DoubleConstant(1.5)))
+  (InvokeContinuation return v0))
+'''),
+
+    const TestSpec('''
+main() {
+  return true;
+}
+''', '''
+(FunctionDefinition main ( return)
+  (LetPrim v0 (Constant BoolConstant(true)))
+  (InvokeContinuation return v0))
+'''),
+
+    const TestSpec('''
+main() {
+  return false;
+}
+''', '''
+(FunctionDefinition main ( return)
+  (LetPrim v0 (Constant BoolConstant(false)))
+  (InvokeContinuation return v0))
+'''),
+
+    const TestSpec('''
+main() {
+  return "a";
+}
+''', '''
+(FunctionDefinition main ( return)
+  (LetPrim v0 (Constant StringConstant("a")))
+  (InvokeContinuation return v0))
+'''),
+  ]),
+
+  const Group('Parameters', const [
+    const TestSpec('''
+main(args) {}
+''', '''
+(FunctionDefinition main (args return)
+  (LetPrim v0 (Constant NullConstant))
+  (InvokeContinuation return v0))
+'''),
+
+    const TestSpec('''
+main(a, b) {}
+''', '''
+(FunctionDefinition main (a b return)
+  (LetPrim v0 (Constant NullConstant))
+  (InvokeContinuation return v0))
+'''),
+  ]),
+
+  const Group('Pass arguments', const [
+    const TestSpec('''
+foo(a) {}
+main() {
+  foo(null);
+}
+''', '''
+(FunctionDefinition main ( return)
+  (LetPrim v0 (Constant NullConstant))
+  (LetCont (k0 v1)
+    (LetPrim v2 (Constant NullConstant))
+    (InvokeContinuation return v2))
+  (InvokeStatic foo v0 k0))
+'''),
+
+    const TestSpec('''
+bar(b, c) {}
+foo(a) {}
+main() {
+  foo(null);
+  bar(0, "");
+}
+''', '''
+(FunctionDefinition main ( return)
+  (LetPrim v0 (Constant NullConstant))
+  (LetCont (k0 v1)
+    (LetPrim v2 (Constant IntConstant(0)))
+    (LetPrim v3 (Constant StringConstant("")))
+    (LetCont (k1 v4)
+      (LetPrim v5 (Constant NullConstant))
+      (InvokeContinuation return v5))
+    (InvokeStatic bar v2 v3 k1))
+  (InvokeStatic foo v0 k0))
+'''),
+
+    const TestSpec('''
+foo(a) {}
+main() {
+  return foo(null);
+}
+''', '''
+(FunctionDefinition main ( return)
+  (LetPrim v0 (Constant NullConstant))
+  (LetCont (k0 v1)
+    (InvokeContinuation return v1))
+  (InvokeStatic foo v0 k0))
+'''),
+  ]),
+
+  const Group('Local variables', const [
+    const TestSpec('''
+main() {
+  var a;
+  return a;
+}
+''', '''
+(FunctionDefinition main ( return)
+  (LetPrim v0 (Constant NullConstant))
+  (InvokeContinuation return v0))
+'''),
+
+    const TestSpec('''
+main() {
+  var a = 0;
+  return a;
+}
+''', '''
+(FunctionDefinition main ( return)
+  (LetPrim v0 (Constant IntConstant(0)))
+  (InvokeContinuation return v0))
+'''),
+
+    const TestSpec('''
+main(a) {
+  return a;
+}
+''', '''
+(FunctionDefinition main (a return)
+  (InvokeContinuation return a))
+'''),
+    ]),
+
+  const Group('Local variable writes', const <TestSpec>[
+    const TestSpec('''
+main() {
+  var a;
+  a = 10;
+  return a;
+}
+''', '''
+(FunctionDefinition main ( return)
+  (LetPrim v0 (Constant NullConstant))
+  (LetPrim v1 (Constant IntConstant(10)))
+  (InvokeContinuation return v1))
+'''),
+
+    const TestSpec('''
+main() {
+  var a = 0;
+  a = 10;
+  return a;
+}
+''', '''
+(FunctionDefinition main ( return)
+  (LetPrim v0 (Constant IntConstant(0)))
+  (LetPrim v1 (Constant IntConstant(10)))
+  (InvokeContinuation return v1))
+'''),
+
+    const TestSpec('''
+main() {
+  var a = 0;
+  print(a);
+  a = "";
+  print(a);
+  return a;
+}
+''', '''
+(FunctionDefinition main ( return)
+  (LetPrim v0 (Constant IntConstant(0)))
+  (LetCont (k0 v1)
+    (LetPrim v2 (Constant StringConstant("")))
+    (LetCont (k1 v3)
+      (InvokeContinuation return v2))
+    (InvokeStatic print v2 k1))
+  (InvokeStatic print v0 k0))
+'''),
+
+    const TestSpec('''
+main(a) {
+  print(a);
+  a = "";
+  print(a);
+  return a;
+}
+''', '''
+(FunctionDefinition main (a return)
+  (LetCont (k0 v0)
+    (LetPrim v1 (Constant StringConstant("")))
+    (LetCont (k1 v2)
+      (InvokeContinuation return v1))
+    (InvokeStatic print v1 k1))
+  (InvokeStatic print a k0))
+'''),
+
+    const TestSpec('''
+main(a) {
+  if (a) {
+    a = "";
+  }
+  print(a);
+  return a;
+}
+''', '''
+(FunctionDefinition main (a return)
+  (LetCont (k0 v0)
+    (LetCont (k1 v1)
+      (InvokeContinuation return v0))
+    (InvokeStatic print v0 k1))
+  (LetCont (k2)
+    (LetPrim v2 (Constant StringConstant("")))
+    (InvokeContinuation k0 v2))
+  (LetCont (k3)
+    (InvokeContinuation k0 a))
+  (Branch (IsTrue a) k2 k3))
+'''),
+  ]),
+
+  const Group('Dynamic access', const [
+    const TestSpec('''
+main(a) {
+  return a.foo;
+}
+''', '''
+(FunctionDefinition main (a return)
+  (LetCont (k0 v0)
+    (InvokeContinuation return v0))
+  (InvokeMethod a foo  k0))
+'''),
+
+    const TestSpec('''
+main() {
+  var a = "";
+  return a.foo;
+}
+''', '''
+(FunctionDefinition main ( return)
+  (LetPrim v0 (Constant StringConstant("")))
+  (LetCont (k0 v1)
+    (InvokeContinuation return v1))
+  (InvokeMethod v0 foo  k0))
+'''),
+    ]),
+
+  const Group('Dynamic invocation', const [
+    const TestSpec('''
+main(a) {
+  return a.foo(0);
+}
+''', '''
+(FunctionDefinition main (a return)
+  (LetPrim v0 (Constant IntConstant(0)))
+  (LetCont (k0 v1)
+    (InvokeContinuation return v1))
+  (InvokeMethod a foo v0 k0))
+'''),
+
+    const TestSpec('''
+main() {
+  var a = "";
+  return a.foo(0, 1);
+}
+''', '''
+(FunctionDefinition main ( return)
+  (LetPrim v0 (Constant StringConstant("")))
+  (LetPrim v1 (Constant IntConstant(0)))
+  (LetPrim v2 (Constant IntConstant(1)))
+  (LetCont (k0 v3)
+    (InvokeContinuation return v3))
+  (InvokeMethod v0 foo v1 v2 k0))
+'''),
+    ]),
+
+  const Group('Binary expressions', const [
+    const TestSpec('''
+main() {
+  return 0 + "";
+}
+''', '''
+(FunctionDefinition main ( return)
+  (LetPrim v0 (Constant IntConstant(0)))
+  (LetPrim v1 (Constant StringConstant("")))
+  (LetCont (k0 v2)
+    (InvokeContinuation return v2))
+  (InvokeMethod v0 + v1 k0))
+'''),
+
+    const TestSpec('''
+main() {
+  return 0 - "";
+}
+''', '''
+(FunctionDefinition main ( return)
+  (LetPrim v0 (Constant IntConstant(0)))
+  (LetPrim v1 (Constant StringConstant("")))
+  (LetCont (k0 v2)
+    (InvokeContinuation return v2))
+  (InvokeMethod v0 - v1 k0))
+'''),
+
+    const TestSpec('''
+main() {
+  return 0 * "";
+}
+''', '''
+(FunctionDefinition main ( return)
+  (LetPrim v0 (Constant IntConstant(0)))
+  (LetPrim v1 (Constant StringConstant("")))
+  (LetCont (k0 v2)
+    (InvokeContinuation return v2))
+  (InvokeMethod v0 * v1 k0))
+'''),
+
+    const TestSpec('''
+main() {
+  return 0 / "";
+}
+''', '''
+(FunctionDefinition main ( return)
+  (LetPrim v0 (Constant IntConstant(0)))
+  (LetPrim v1 (Constant StringConstant("")))
+  (LetCont (k0 v2)
+    (InvokeContinuation return v2))
+  (InvokeMethod v0 / v1 k0))
+'''),
+
+    const TestSpec('''
+main() {
+  return 0 ~/ "";
+}
+''', '''
+(FunctionDefinition main ( return)
+  (LetPrim v0 (Constant IntConstant(0)))
+  (LetPrim v1 (Constant StringConstant("")))
+  (LetCont (k0 v2)
+    (InvokeContinuation return v2))
+  (InvokeMethod v0 ~/ v1 k0))
+'''),
+
+    const TestSpec('''
+main() {
+  return 0 < "";
+}
+''', '''
+(FunctionDefinition main ( return)
+  (LetPrim v0 (Constant IntConstant(0)))
+  (LetPrim v1 (Constant StringConstant("")))
+  (LetCont (k0 v2)
+    (InvokeContinuation return v2))
+  (InvokeMethod v0 < v1 k0))
+'''),
+
+    const TestSpec('''
+main() {
+  return 0 <= "";
+}
+''', '''
+(FunctionDefinition main ( return)
+  (LetPrim v0 (Constant IntConstant(0)))
+  (LetPrim v1 (Constant StringConstant("")))
+  (LetCont (k0 v2)
+    (InvokeContinuation return v2))
+  (InvokeMethod v0 <= v1 k0))
+'''),
+
+    const TestSpec('''
+main() {
+  return 0 > "";
+}
+''', '''
+(FunctionDefinition main ( return)
+  (LetPrim v0 (Constant IntConstant(0)))
+  (LetPrim v1 (Constant StringConstant("")))
+  (LetCont (k0 v2)
+    (InvokeContinuation return v2))
+  (InvokeMethod v0 > v1 k0))
+'''),
+
+    const TestSpec('''
+main() {
+  return 0 >= "";
+}
+''', '''
+(FunctionDefinition main ( return)
+  (LetPrim v0 (Constant IntConstant(0)))
+  (LetPrim v1 (Constant StringConstant("")))
+  (LetCont (k0 v2)
+    (InvokeContinuation return v2))
+  (InvokeMethod v0 >= v1 k0))
+'''),
+
+    const TestSpec('''
+main() {
+  return 0 << "";
+}
+''', '''
+(FunctionDefinition main ( return)
+  (LetPrim v0 (Constant IntConstant(0)))
+  (LetPrim v1 (Constant StringConstant("")))
+  (LetCont (k0 v2)
+    (InvokeContinuation return v2))
+  (InvokeMethod v0 << v1 k0))
+'''),
+
+    const TestSpec('''
+main() {
+  return 0 >> "";
+}
+''', '''
+(FunctionDefinition main ( return)
+  (LetPrim v0 (Constant IntConstant(0)))
+  (LetPrim v1 (Constant StringConstant("")))
+  (LetCont (k0 v2)
+    (InvokeContinuation return v2))
+  (InvokeMethod v0 >> v1 k0))
+'''),
+
+    const TestSpec('''
+main() {
+  return 0 & "";
+}
+''', '''
+(FunctionDefinition main ( return)
+  (LetPrim v0 (Constant IntConstant(0)))
+  (LetPrim v1 (Constant StringConstant("")))
+  (LetCont (k0 v2)
+    (InvokeContinuation return v2))
+  (InvokeMethod v0 & v1 k0))
+'''),
+
+    const TestSpec('''
+main() {
+  return 0 | "";
+}
+''', '''
+(FunctionDefinition main ( return)
+  (LetPrim v0 (Constant IntConstant(0)))
+  (LetPrim v1 (Constant StringConstant("")))
+  (LetCont (k0 v2)
+    (InvokeContinuation return v2))
+  (InvokeMethod v0 | v1 k0))
+'''),
+
+    const TestSpec('''
+main() {
+  return 0 ^ "";
+}
+''', '''
+(FunctionDefinition main ( return)
+  (LetPrim v0 (Constant IntConstant(0)))
+  (LetPrim v1 (Constant StringConstant("")))
+  (LetCont (k0 v2)
+    (InvokeContinuation return v2))
+  (InvokeMethod v0 ^ v1 k0))
+'''),
+
+    const TestSpec('''
+main() {
+  return 0 == "";
+}
+''', '''
+(FunctionDefinition main ( return)
+  (LetPrim v0 (Constant IntConstant(0)))
+  (LetPrim v1 (Constant StringConstant("")))
+  (LetCont (k0 v2)
+    (InvokeContinuation return v2))
+  (InvokeMethod v0 == v1 k0))
+'''),
+
+    const TestSpec('''
+main() {
+  return 0 != "";
+}
+''', '''
+(FunctionDefinition main ( return)
+  (LetPrim v0 (Constant IntConstant(0)))
+  (LetPrim v1 (Constant StringConstant("")))
+  (LetCont (k0 v2)
+    (LetCont (k1 v3)
+      (InvokeContinuation return v3))
+    (LetCont (k2)
+      (LetPrim v4 (Constant BoolConstant(false)))
+      (InvokeContinuation k1 v4))
+    (LetCont (k3)
+      (LetPrim v5 (Constant BoolConstant(true)))
+      (InvokeContinuation k1 v5))
+    (Branch (IsTrue v2) k2 k3))
+  (InvokeMethod v0 == v1 k0))
+'''),
+
+    const TestSpec('''
+main() {
+  return 0 && "";
+}
+''', '''
+(FunctionDefinition main ( return)
+  (LetPrim v0 (Constant IntConstant(0)))
+  (LetCont (k0 v1)
+    (InvokeContinuation return v1))
+  (LetCont (k1)
+    (LetPrim v2 (Constant StringConstant("")))
+    (LetCont (k2)
+      (LetPrim v3 (Constant BoolConstant(true)))
+      (InvokeContinuation k0 v3))
+    (LetCont (k3)
+      (LetPrim v4 (Constant BoolConstant(false)))
+      (InvokeContinuation k0 v4))
+    (Branch (IsTrue v2) k2 k3))
+  (LetCont (k4)
+    (LetPrim v5 (Constant BoolConstant(false)))
+    (InvokeContinuation k0 v5))
+  (Branch (IsTrue v0) k1 k4))
+'''),
+
+    const TestSpec('''
+main() {
+  return 0 || "";
+}
+''', '''
+(FunctionDefinition main ( return)
+  (LetPrim v0 (Constant IntConstant(0)))
+  (LetCont (k0 v1)
+    (InvokeContinuation return v1))
+  (LetCont (k1)
+    (LetPrim v2 (Constant BoolConstant(true)))
+    (InvokeContinuation k0 v2))
+  (LetCont (k2)
+    (LetPrim v3 (Constant StringConstant("")))
+    (LetCont (k3)
+      (LetPrim v4 (Constant BoolConstant(true)))
+      (InvokeContinuation k0 v4))
+    (LetCont (k4)
+      (LetPrim v5 (Constant BoolConstant(false)))
+      (InvokeContinuation k0 v5))
+    (Branch (IsTrue v3) k3 k4))
+  (Branch (IsTrue v0) k1 k2))
+'''),
+
+    const TestSpec('''
+main() {
+  return 0 + "" * 2;
+}
+''', '''
+(FunctionDefinition main ( return)
+  (LetPrim v0 (Constant IntConstant(0)))
+  (LetPrim v1 (Constant StringConstant("")))
+  (LetPrim v2 (Constant IntConstant(2)))
+  (LetCont (k0 v3)
+    (LetCont (k1 v4)
+      (InvokeContinuation return v4))
+    (InvokeMethod v0 + v3 k1))
+  (InvokeMethod v1 * v2 k0))
+'''),
+
+    const TestSpec('''
+main() {
+  return 0 * "" + 2;
+}
+''', '''
+(FunctionDefinition main ( return)
+  (LetPrim v0 (Constant IntConstant(0)))
+  (LetPrim v1 (Constant StringConstant("")))
+  (LetCont (k0 v2)
+    (LetPrim v3 (Constant IntConstant(2)))
+    (LetCont (k1 v4)
+      (InvokeContinuation return v4))
+    (InvokeMethod v2 + v3 k1))
+  (InvokeMethod v0 * v1 k0))
+'''),
+    ]),
+
+  const Group('If statement', const [
+    const TestSpec('''
+main(a) {
+  if (a) {
+    print(0);
+  }
+}
+''', '''
+(FunctionDefinition main (a return)
+  (LetCont (k0)
+    (LetPrim v0 (Constant NullConstant))
+    (InvokeContinuation return v0))
+  (LetCont (k1)
+    (LetPrim v1 (Constant IntConstant(0)))
+    (LetCont (k2 v2)
+      (InvokeContinuation k0 ))
+    (InvokeStatic print v1 k2))
+  (LetCont (k3)
+    (InvokeContinuation k0 ))
+  (Branch (IsTrue a) k1 k3))
+'''),
+
+    const TestSpec('''
+main(a) {
+  if (a) {
+    print(0);
+  } else {
+    print(1);
+  }
+}
+''', '''
+(FunctionDefinition main (a return)
+  (LetCont (k0)
+    (LetPrim v0 (Constant NullConstant))
+    (InvokeContinuation return v0))
+  (LetCont (k1)
+    (LetPrim v1 (Constant IntConstant(0)))
+    (LetCont (k2 v2)
+      (InvokeContinuation k0 ))
+    (InvokeStatic print v1 k2))
+  (LetCont (k3)
+    (LetPrim v3 (Constant IntConstant(1)))
+    (LetCont (k4 v4)
+      (InvokeContinuation k0 ))
+    (InvokeStatic print v3 k4))
+  (Branch (IsTrue a) k1 k3))
+'''),
+
+    const TestSpec('''
+main(a) {
+  if (a) {
+    print(0);
+  } else {
+    print(1);
+    print(2);
+  }
+}
+''', '''
+(FunctionDefinition main (a return)
+  (LetCont (k0)
+    (LetPrim v0 (Constant NullConstant))
+    (InvokeContinuation return v0))
+  (LetCont (k1)
+    (LetPrim v1 (Constant IntConstant(0)))
+    (LetCont (k2 v2)
+      (InvokeContinuation k0 ))
+    (InvokeStatic print v1 k2))
+  (LetCont (k3)
+    (LetPrim v3 (Constant IntConstant(1)))
+    (LetCont (k4 v4)
+      (LetPrim v5 (Constant IntConstant(2)))
+      (LetCont (k5 v6)
+        (InvokeContinuation k0 ))
+      (InvokeStatic print v5 k5))
+    (InvokeStatic print v3 k4))
+  (Branch (IsTrue a) k1 k3))
+'''),
+    ]),
+
+  const Group('Conditional expression', const [
+    const TestSpec('''
+main(a) {
+  return a ? print(0) : print(1);
+}
+''', '''
+(FunctionDefinition main (a return)
+  (LetCont (k0 v0)
+    (InvokeContinuation return v0))
+  (LetCont (k1)
+    (LetPrim v1 (Constant IntConstant(0)))
+    (LetCont (k2 v2)
+      (InvokeContinuation k0 v2))
+    (InvokeStatic print v1 k2))
+  (LetCont (k3)
+    (LetPrim v3 (Constant IntConstant(1)))
+    (LetCont (k4 v4)
+      (InvokeContinuation k0 v4))
+    (InvokeStatic print v3 k4))
+  (Branch (IsTrue a) k1 k3))
+'''),
+    ]),
+
+
+  // These test that unreachable statements are skipped within a block.
+  const Group('Block statements', const <TestSpec>[
+    const TestSpec('''
+main(a) {
+  return 0;
+  return 1;
+}
+''', '''
+(FunctionDefinition main (a return)
+  (LetPrim v0 (Constant IntConstant(0)))
+  (InvokeContinuation return v0))
+'''),
+
+    const TestSpec('''
+main(a) {
+  if (a) {
+    return 0;
+    return 1;
+  } else {
+    return 2;
+    return 3;
+  }
+}
+''', '''
+(FunctionDefinition main (a return)
+  (LetCont (k0)
+    (LetPrim v0 (Constant IntConstant(0)))
+    (InvokeContinuation return v0))
+  (LetCont (k1)
+    (LetPrim v1 (Constant IntConstant(2)))
+    (InvokeContinuation return v1))
+  (Branch (IsTrue a) k0 k1))
+'''),
+
+    const TestSpec('''
+main(a) {
+  if (a) {
+    print(0);
+    return 0;
+    return 1;
+  } else {
+    print(2);
+    return 2;
+    return 3;
+  }
+}
+''', '''
+(FunctionDefinition main (a return)
+  (LetCont (k0)
+    (LetPrim v0 (Constant IntConstant(0)))
+    (LetCont (k1 v1)
+      (LetPrim v2 (Constant IntConstant(0)))
+      (InvokeContinuation return v2))
+    (InvokeStatic print v0 k1))
+  (LetCont (k2)
+    (LetPrim v3 (Constant IntConstant(2)))
+    (LetCont (k3 v4)
+      (LetPrim v5 (Constant IntConstant(2)))
+      (InvokeContinuation return v5))
+    (InvokeStatic print v3 k3))
+  (Branch (IsTrue a) k0 k2))
+'''),
+  ]),
+
+  const Group('Constructor invocation', const <TestSpec>[
+    const TestSpec('''
+main(a) {
+  new Object();
+}
+''', '''
+(FunctionDefinition main (a return)
+  (LetCont (k0 v0)
+    (LetPrim v1 (Constant NullConstant))
+    (InvokeContinuation return v1))
+  (InvokeConstructor Object  k0))
+'''),
+
+    const TestSpec('''
+main(a) {
+  new Deprecated("");
+}
+''', '''
+(FunctionDefinition main (a return)
+  (LetPrim v0 (Constant StringConstant("")))
+  (LetCont (k0 v1)
+    (LetPrim v2 (Constant NullConstant))
+    (InvokeContinuation return v2))
+  (InvokeConstructor Deprecated v0 k0))
+'''),
+  ]),
+
+  const Group('For loop', const <TestSpec>[
+    const TestSpec('''
+main() {
+  for (;;) {}
+}
+''', '''
+(FunctionDefinition main ( return)
+  (LetCont* (k0)
+    (LetPrim v0 (Constant BoolConstant(true)))
+    (LetCont (k1)
+      (LetPrim v1 (Constant NullConstant))
+      (InvokeContinuation return v1))
+    (LetCont (k2)
+      (InvokeContinuation* k0 ))
+    (Branch (IsTrue v0) k2 k1))
+  (InvokeContinuation k0 ))
+'''),
+
+const TestSpec('''
+main() {
+  for (int i = 0; i < 10; i = i + 1) {
+    print(i);
+  }
+}
+''', '''
+(FunctionDefinition main ( return)
+  (LetPrim v0 (Constant IntConstant(0)))
+  (LetCont* (k0 v1)
+    (LetPrim v2 (Constant IntConstant(10)))
+    (LetCont (k1 v3)
+      (LetCont (k2)
+        (LetPrim v4 (Constant NullConstant))
+        (InvokeContinuation return v4))
+      (LetCont (k3)
+        (LetCont (k4 v5)
+          (LetPrim v6 (Constant IntConstant(1)))
+          (LetCont (k5 v7)
+            (InvokeContinuation* k0 v7))
+          (InvokeMethod v1 + v6 k5))
+        (InvokeStatic print v1 k4))
+      (Branch (IsTrue v3) k3 k2))
+    (InvokeMethod v1 < v2 k1))
+  (InvokeContinuation k0 v0))
+'''),
+
+const TestSpec('''
+main(i) {
+  for (i = 0; i < 10; i = i + 1) {
+    print(i);
+  }
+}
+''', '''
+(FunctionDefinition main (i return)
+  (LetPrim v0 (Constant IntConstant(0)))
+  (LetCont* (k0 v1)
+    (LetPrim v2 (Constant IntConstant(10)))
+    (LetCont (k1 v3)
+      (LetCont (k2)
+        (LetPrim v4 (Constant NullConstant))
+        (InvokeContinuation return v4))
+      (LetCont (k3)
+        (LetCont (k4 v5)
+          (LetPrim v6 (Constant IntConstant(1)))
+          (LetCont (k5 v7)
+            (InvokeContinuation* k0 v7))
+          (InvokeMethod v1 + v6 k5))
+        (InvokeStatic print v1 k4))
+      (Branch (IsTrue v3) k3 k2))
+    (InvokeMethod v1 < v2 k1))
+  (InvokeContinuation k0 v0))
+'''),
+  ]),
+];
diff --git a/pkg/analyzer2dart/test/sexpr_test.dart b/pkg/analyzer2dart/test/sexpr_test.dart
new file mode 100644
index 0000000..c8a6fbf
--- /dev/null
+++ b/pkg/analyzer2dart/test/sexpr_test.dart
@@ -0,0 +1,46 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// Unittest test of the CPS ir generated by the analyzer2dart compiler.
+
+import 'mock_sdk.dart';
+import 'package:analyzer/file_system/memory_file_system.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/sdk.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:compiler/implementation/cps_ir/cps_ir_nodes_sexpr.dart';
+import 'package:unittest/unittest.dart';
+
+import '../lib/src/closed_world.dart';
+import '../lib/src/driver.dart';
+import '../lib/src/converted_world.dart';
+import 'output_helper.dart';
+import 'test_helper.dart';
+import 'sexpr_data.dart';
+
+main() {
+  performTests(TEST_DATA, unittester, checkResult);
+}
+
+checkResult(TestSpec result) {
+  String input = result.input.trim();
+  String expectedOutput = result.output.trim();
+  CollectingOutputProvider outputProvider = new CollectingOutputProvider();
+  MemoryResourceProvider provider = new MemoryResourceProvider();
+  DartSdk sdk = new MockSdk();
+  Driver driver = new Driver(provider, sdk, outputProvider);
+  String rootFile = '/root.dart';
+  provider.newFile(rootFile, input);
+  Source rootSource = driver.setRoot(rootFile);
+  FunctionElement entryPoint = driver.resolveEntryPoint(rootSource);
+  ClosedWorld world = driver.computeWorld(entryPoint);
+  ConvertedWorld convertedWorld = convertWorld(world);
+  String output = convertedWorld.getIr(convertedWorld.mainFunction)
+      .accept(new SExpressionStringifier());
+  expect(output, equals(expectedOutput),
+      reason: 'Input:\n$input\n'
+              'Expected:\n$expectedOutput\n'
+              'Actual:\n$output');
+}
+
diff --git a/pkg/analyzer2dart/test/test_helper.dart b/pkg/analyzer2dart/test/test_helper.dart
new file mode 100644
index 0000000..e8e5a92
--- /dev/null
+++ b/pkg/analyzer2dart/test/test_helper.dart
@@ -0,0 +1,43 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// Helpers for defining input/output based unittests through (constant) data.
+
+import 'package:unittest/unittest.dart';
+
+/// A unittest group with a name and a list of input/output results.
+class Group {
+  final String name;
+  final List<TestSpec> results;
+
+  const Group(this.name, this.results);
+}
+
+/// A input/output pair that defines the expected [output] of when processing
+/// the [input].
+class TestSpec {
+  final String input;
+  final String output;
+
+  const TestSpec(this.input, this.output);
+}
+
+typedef TestGroup(Group group, RunTest check);
+typedef RunTest(TestSpec result);
+
+/// Test [data] using [testGroup] and [check].
+void performTests(List<Group> data, TestGroup testGroup, RunTest runTest) {
+  for (Group group in data) {
+    testGroup(group, runTest);
+  }
+}
+
+/// Test group using unittest.
+unittester(Group group, RunTest runTest) {
+  test(group.name, () {
+    for (TestSpec result in group.results) {
+      runTest(result);
+    }
+  });
+}
\ No newline at end of file
diff --git a/pkg/csslib/lib/src/tokenizer_base.dart b/pkg/csslib/lib/src/tokenizer_base.dart
index 07dee48..5501e6c 100644
--- a/pkg/csslib/lib/src/tokenizer_base.dart
+++ b/pkg/csslib/lib/src/tokenizer_base.dart
@@ -52,8 +52,8 @@
   //     http://dev.w3.org/csswg/selectors4/
   bool inSelector = false;
 
-  int _index;
-  int _startIndex;
+  int _index = 0;
+  int _startIndex = 0;
 
   static const String _CDATA_START = '<![CDATA[';
   static const String _CDATA_END = ']]>';
@@ -435,4 +435,3 @@
     }
   }
 }
-
diff --git a/pkg/pkg.status b/pkg/pkg.status
index 9413140..b7f4dbe 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -266,7 +266,7 @@
 scheduled_test/test/scheduled_test/wrap_async_test: Timeout # Issue 21007
 scheduled_test/test/scheduled_test/wrap_future_test: Timeout # Issue 21007
 
-[ $runtime == safari || $runtime == safarimobilesim ]
+[ ($runtime == safari && $builder_tag == mac10_7) || $runtime == safarimobilesim ]
 # Unexplained errors only occuring on Safari.
 typed_data/test/typed_buffers_test: RuntimeError
 
@@ -495,3 +495,10 @@
 
 [ $system == windows ]
 analysis_server/test/integration/search/get_type_hierarchy_test: Pass, Fail # Issue 20436
+
+[ $runtime == safari && $builder_tag == mac10_8 ]
+polymer/e2e_test/good_import/test/import_test: RuntimeError # Issue 21424
+polymer/test/custom_event_test: RuntimeError # Issue 21425
+polymer/test/instance_attrs_test: RuntimeError # Issue 21425
+polymer/test/property_observe_test: RuntimeError # Issue 21425
+intl/test/date_time_format_http_request_test: RuntimeError # Issue 21428
diff --git a/pkg/polymer/CHANGELOG.md b/pkg/polymer/CHANGELOG.md
index 747d319..c45932b 100644
--- a/pkg/polymer/CHANGELOG.md
+++ b/pkg/polymer/CHANGELOG.md
@@ -1,3 +1,7 @@
+#### 0.15.1+3
+  * Make sure that `dart_support.js` is always appended after `platform.js`,
+    [21435](http://dartbug.com/21435).
+
 #### 0.15.1+2
   * Handle and warn about cases where a script file is included twice from the
     same entrypoint [21332](http://dartbug.com/21332).
diff --git a/pkg/polymer/lib/src/build/polyfill_injector.dart b/pkg/polymer/lib/src/build/polyfill_injector.dart
index 2001fac..2dc3b32 100644
--- a/pkg/polymer/lib/src/build/polyfill_injector.dart
+++ b/pkg/polymer/lib/src/build/polyfill_injector.dart
@@ -38,7 +38,7 @@
         detailsUri: 'http://goo.gl/5HPeuP');
     return readPrimaryAsHtml(transform, logger).then((document) {
       bool dartSupportFound = false;
-      bool platformJsFound = false;
+      Element platformJs;
       Element dartJs;
       final dartScripts = <Element>[];
 
@@ -47,7 +47,7 @@
         if (src != null) {
           var last = src.split('/').last;
           if (_platformJS.hasMatch(last)) {
-            platformJsFound = true;
+            platformJs = tag;
           } else if (_dartSupportJS.hasMatch(last)) {
             dartSupportFound = true;
           } else if (last == 'dart.js') {
@@ -97,10 +97,24 @@
               '<script src="packages/$urlSegment"></script>\n'));
       }
 
-      var suffix = options.releaseMode ? '.js' : '.concat.js';
-      if (!dartSupportFound) _addScriptFirst('web_components/dart_support.js');
-      // platform.js should come before all other scripts.
-      if (!platformJsFound && options.injectPlatformJs) {
+      // Inserts dart_support.js either at the top of the document or directly
+      // after platform.js if it exists.
+      if (!dartSupportFound) {
+        if (platformJs == null) {
+          _addScriptFirst('web_components/dart_support.js');
+        } else {
+          var parentsNodes = platformJs.parentNode.nodes;
+          parentsNodes.insert(
+              parentsNodes.indexOf(platformJs) + 1,
+              parseFragment(
+                  '\n<script src="packages/web_components/dart_support.js">'
+                  '</script>'));
+        }
+      }
+
+      // By default platform.js should come before all other scripts.
+      if (platformJs == null && options.injectPlatformJs) {
+        var suffix = options.releaseMode ? '.js' : '.concat.js';
         _addScriptFirst('web_components/platform$suffix');
       }
 
diff --git a/pkg/polymer/pubspec.yaml b/pkg/polymer/pubspec.yaml
index 7f1513f..f94eb8a 100644
--- a/pkg/polymer/pubspec.yaml
+++ b/pkg/polymer/pubspec.yaml
@@ -1,5 +1,5 @@
 name: polymer
-version: 0.15.1+2
+version: 0.15.1+3
 author: Polymer.dart Authors <web-ui-dev@dartlang.org>
 description: >
   Polymer.dart is a new type of library for the web, built on top of Web
diff --git a/pkg/polymer/test/build/common.dart b/pkg/polymer/test/build/common.dart
index eed4c20..3eaa805 100644
--- a/pkg/polymer/test/build/common.dart
+++ b/pkg/polymer/test/build/common.dart
@@ -199,11 +199,12 @@
 
 const EMPTY_DATA = '{"experimental_bootstrap":false,"script_ids":[]}';
 
-const WEB_COMPONENTS_TAG =
-    '<script src="packages/web_components/platform.js"></script>\n'
-    '<script src="packages/web_components/dart_support.js"></script>\n';
 const DART_SUPPORT_TAG =
     '<script src="packages/web_components/dart_support.js"></script>\n';
+const PLATFORM_JS_TAG =
+    '<script src="packages/web_components/platform.js"></script>\n';
+const WEB_COMPONENTS_TAG =
+    '$PLATFORM_JS_TAG$DART_SUPPORT_TAG';
 
 const INTEROP_TAG = '<script src="packages/browser/interop.js"></script>\n';
 const DART_JS_TAG = '<script src="packages/browser/dart.js"></script>';
diff --git a/pkg/polymer/test/build/polyfill_injector_test.dart b/pkg/polymer/test/build/polyfill_injector_test.dart
index 84af1c7..6eba339 100644
--- a/pkg/polymer/test/build/polyfill_injector_test.dart
+++ b/pkg/polymer/test/build/polyfill_injector_test.dart
@@ -74,6 +74,40 @@
           '</body></html>',
     });
 
+  testPhases('dart_support.js after platform.js, platform present', phases, {
+      'a|web/test.html':
+          '<!DOCTYPE html><html><head>'
+          '$PLATFORM_JS_TAG'
+          '</head><body>'
+          '<script type="application/dart" src="a.dart"></script>'
+          '$dartJsTag'
+    }, {
+      'a|web/test.html':
+          '<!DOCTYPE html><html><head>'
+          '$WEB_COMPONENTS_TAG'
+          '</head><body>'
+          '<script ${type}src="a.dart$ext"$async></script>'
+          '$dartJsTag'
+          '</body></html>',
+    });
+
+  testPhases('dart_support.js after platform.js, dart_support present', phases, {
+      'a|web/test.html':
+          '<!DOCTYPE html><html><head>'
+          '$DART_SUPPORT_TAG'
+          '</head><body>'
+          '<script type="application/dart" src="a.dart"></script>'
+          '$dartJsTag'
+    }, {
+      'a|web/test.html':
+          '<!DOCTYPE html><html><head>'
+          '$WEB_COMPONENTS_TAG'
+          '</head><body>'
+          '<script ${type}src="a.dart$ext"$async></script>'
+          '$dartJsTag'
+          '</body></html>',
+    });
+
   var noPlatformPhases = [[new PolyfillInjector(new TransformOptions(
         directlyIncludeJS: js, injectPlatformJs: false))]];
 
diff --git a/pkg/string_scanner/CHANGELOG.md b/pkg/string_scanner/CHANGELOG.md
index f1d8763..d7f09f3 100644
--- a/pkg/string_scanner/CHANGELOG.md
+++ b/pkg/string_scanner/CHANGELOG.md
@@ -1,3 +1,12 @@
+## 0.1.1
+
+* Declare `SpanScanner`'s exposed `SourceSpan`s and `SourceLocation`s to be
+  `FileSpan`s and `FileLocation`s. They always were underneath, but callers may
+  now rely on it.
+
+* Add `SpanScanner.location`, which returns the scanner's current
+  `SourceLocation`.
+
 ## 0.1.0
 
 * Switch from `source_maps`' `Span` class to `source_span`'s `SourceSpan` class.
diff --git a/pkg/string_scanner/lib/src/span_scanner.dart b/pkg/string_scanner/lib/src/span_scanner.dart
index d8dc230..a70d5fd 100644
--- a/pkg/string_scanner/lib/src/span_scanner.dart
+++ b/pkg/string_scanner/lib/src/span_scanner.dart
@@ -34,28 +34,31 @@
     this.position = state.position;
   }
 
-  /// The [SourceSpan] for [lastMatch].
+  /// The [FileSpan] for [lastMatch].
   ///
   /// This is the span for the entire match. There's no way to get spans for
   /// subgroups since [Match] exposes no information about their positions.
-  SourceSpan get lastSpan => _lastSpan;
-  SourceSpan _lastSpan;
+  FileSpan get lastSpan => _lastSpan;
+  FileSpan _lastSpan;
+
+  /// The current location of the scanner.
+  FileLocation get location => _sourceFile.location(position);
 
   /// Returns an empty span at the current location.
-  SourceSpan get emptySpan => _sourceFile.location(position).pointSpan();
+  FileSpan get emptySpan => location.pointSpan();
 
   /// Creates a new [SpanScanner] that starts scanning from [position].
   ///
   /// [sourceUrl] is used as [SourceLocation.sourceUrl] for the returned
-  /// [SourceSpan]s as well as for error reporting. It can be a [String], a
+  /// [FileSpan]s as well as for error reporting. It can be a [String], a
   /// [Uri], or `null`.
   SpanScanner(String string, {sourceUrl, int position})
       : _sourceFile = new SourceFile(string, url: sourceUrl),
         super(string, sourceUrl: sourceUrl, position: position);
 
-  /// Creates a [SourceSpan] representing the source range between [startState]
+  /// Creates a [FileSpan] representing the source range between [startState]
   /// and the current position.
-  SourceSpan spanFrom(LineScannerState startState) =>
+  FileSpan spanFrom(LineScannerState startState) =>
       _sourceFile.span(startState.position, position);
 
   bool matches(Pattern pattern) {
diff --git a/pkg/string_scanner/pubspec.yaml b/pkg/string_scanner/pubspec.yaml
index 1451fc5..831dfac 100644
--- a/pkg/string_scanner/pubspec.yaml
+++ b/pkg/string_scanner/pubspec.yaml
@@ -1,5 +1,5 @@
 name: string_scanner
-version: 0.1.0
+version: 0.1.1
 author: "Dart Team <misc@dartlang.org>"
 homepage: http://www.dartlang.org
 description: >
diff --git a/pkg/template_binding/CHANGELOG.md b/pkg/template_binding/CHANGELOG.md
index 2840f8c..960805b 100644
--- a/pkg/template_binding/CHANGELOG.md
+++ b/pkg/template_binding/CHANGELOG.md
@@ -1,5 +1,6 @@
-#### Pub version 0.13.1-dev
+#### Pub version 0.13.1
   * Up to date with release 0.4.2 ([TemplateBinding#35b7880][35b7880]).
+  * Widen web_components version constraint to include 0.9.0.
 
 #### Pub version 0.13.0+1
   * Widen web_components version constraint.
diff --git a/pkg/template_binding/pubspec.yaml b/pkg/template_binding/pubspec.yaml
index c772110..4692743 100644
--- a/pkg/template_binding/pubspec.yaml
+++ b/pkg/template_binding/pubspec.yaml
@@ -1,5 +1,5 @@
 name: template_binding
-version: 0.13.1-dev
+version: 0.13.1
 author: Polymer.dart Team <web-ui-dev@dartlang.org>
 description: >
   Extends the capabilities of the HTML Template Element by enabling it to
diff --git a/runtime/CPPLINT.cfg b/runtime/CPPLINT.cfg
new file mode 100644
index 0000000..64aa482
--- /dev/null
+++ b/runtime/CPPLINT.cfg
@@ -0,0 +1,7 @@
+# Do not continue looking up the directory hierarchy
+# for more config files.
+set noparent
+
+# Do not limit function size. For example parts of
+# the simulator are really large.
+filter=-readability/fn_size
diff --git a/runtime/bin/dbg_message.cc b/runtime/bin/dbg_message.cc
index 30eb730..e507544 100644
--- a/runtime/bin/dbg_message.cc
+++ b/runtime/bin/dbg_message.cc
@@ -1096,8 +1096,18 @@
   while (true) {
     // Handle all available vm service messages, up to a resume
     // request.
-    if (Dart_HandleServiceMessages()) {
-      break;
+    while (Dart_HasServiceMessages()) {
+      // Release the message queue lock before handling service
+      // messages.  This allows notifications to come in while we are
+      // processing long requests and avoids deadlock with the PortMap
+      // lock in the vm.
+      msg_queue_lock_.Exit();
+      bool resume = Dart_HandleServiceMessages();
+      msg_queue_lock_.Enter();
+      if (resume) {
+        // Resume requested through the vm service.
+        break;
+      }
     }
 
     // Handle all available debug messages, up to a resume request.
diff --git a/runtime/bin/eventhandler.h b/runtime/bin/eventhandler.h
index 54845d0..80efaca 100644
--- a/runtime/bin/eventhandler.h
+++ b/runtime/bin/eventhandler.h
@@ -29,6 +29,14 @@
   kPipe = 17,
 };
 
+#define COMMAND_MASK ((1 << kCloseCommand) | \
+                      (1 << kShutdownReadCommand) | \
+                      (1 << kShutdownWriteCommand) | \
+                      (1 << kReturnTokenCommand))
+#define IS_COMMAND(data, command_bit) \
+    ((data & COMMAND_MASK) == (1 << command_bit))  // NOLINT
+#define ASSERT_NO_COMMAND(data) ASSERT((data & COMMAND_MASK) == 0)  // NOLINT
+#define TOKEN_COUNT(data) (data & ((1 << kCloseCommand) - 1))
 
 class TimeoutQueue {
  private:
diff --git a/runtime/bin/eventhandler_android.cc b/runtime/bin/eventhandler_android.cc
index b1a4b66..680bcae 100644
--- a/runtime/bin/eventhandler_android.cc
+++ b/runtime/bin/eventhandler_android.cc
@@ -174,16 +174,14 @@
       shutdown_ = true;
     } else {
       SocketData* sd = GetSocketData(msg[i].id);
-      if ((msg[i].data & (1 << kShutdownReadCommand)) != 0) {
-        ASSERT(msg[i].data == (1 << kShutdownReadCommand));
+
+      if (IS_COMMAND(msg[i].data, kShutdownReadCommand)) {
         // Close the socket for reading.
         shutdown(sd->fd(), SHUT_RD);
-      } else if ((msg[i].data & (1 << kShutdownWriteCommand)) != 0) {
-        ASSERT(msg[i].data == (1 << kShutdownWriteCommand));
+      } else if (IS_COMMAND(msg[i].data, kShutdownWriteCommand)) {
         // Close the socket for writing.
         shutdown(sd->fd(), SHUT_WR);
-      } else if ((msg[i].data & (1 << kCloseCommand)) != 0) {
-        ASSERT(msg[i].data == (1 << kCloseCommand));
+      } else if (IS_COMMAND(msg[i].data, kCloseCommand)) {
         // Close the socket and free system resources and move on to
         // next message.
         RemoveFromEpollInstance(epoll_fd_, sd);
@@ -192,14 +190,16 @@
         socket_map_.Remove(GetHashmapKeyFromFd(fd), GetHashmapHashFromFd(fd));
         delete sd;
         DartUtils::PostInt32(msg[i].dart_port, 1 << kDestroyedEvent);
-      } else if ((msg[i].data & (1 << kReturnTokenCommand)) != 0) {
-        int count = msg[i].data & ((1 << kReturnTokenCommand) - 1);
+      } else if (IS_COMMAND(msg[i].data, kReturnTokenCommand)) {
+        int count = TOKEN_COUNT(msg[i].data);
+
         for (int i = 0; i < count; i++) {
           if (sd->ReturnToken()) {
             AddToEpollInstance(epoll_fd_, sd);
           }
         }
       } else {
+        ASSERT_NO_COMMAND(msg[i].data);
         // Setup events to wait for.
         sd->SetPortAndMask(msg[i].dart_port, msg[i].data);
         AddToEpollInstance(epoll_fd_, sd);
diff --git a/runtime/bin/eventhandler_linux.cc b/runtime/bin/eventhandler_linux.cc
index 0701810..97b305b 100644
--- a/runtime/bin/eventhandler_linux.cc
+++ b/runtime/bin/eventhandler_linux.cc
@@ -199,20 +199,17 @@
     } else {
       SocketData* sd = GetSocketData(
           msg[i].id, (msg[i].data & (1 << kListeningSocket)) != 0);
-      if ((msg[i].data & (1 << kShutdownReadCommand)) != 0) {
-        ASSERT(msg[i].data == (1 << kShutdownReadCommand));
+      if (IS_COMMAND(msg[i].data, kShutdownReadCommand)) {
         ASSERT(!sd->IsListeningSocket());
         // Close the socket for reading.
         VOID_NO_RETRY_EXPECTED(shutdown(sd->fd(), SHUT_RD));
-      } else if ((msg[i].data & (1 << kShutdownWriteCommand)) != 0) {
-        ASSERT(msg[i].data == (1 << kShutdownWriteCommand));
+      } else if (IS_COMMAND(msg[i].data, kShutdownWriteCommand)) {
         ASSERT(!sd->IsListeningSocket());
         // Close the socket for writing.
         VOID_NO_RETRY_EXPECTED(shutdown(sd->fd(), SHUT_WR));
-      } else if ((msg[i].data & (1 << kCloseCommand)) != 0) {
-        ASSERT(msg[i].data == (1 << kCloseCommand));
-        // Close the socket and free system resources and move on to
-        // next message.
+      } else if (IS_COMMAND(msg[i].data, kCloseCommand)) {
+        // Close the socket and free system resources and move on to next
+        // message.
         if (sd->RemovePort(msg[i].dart_port)) {
           RemoveFromEpollInstance(epoll_fd_, sd);
           intptr_t fd = sd->fd();
@@ -221,12 +218,13 @@
           delete sd;
         }
         DartUtils::PostInt32(msg[i].dart_port, 1 << kDestroyedEvent);
-      } else if ((msg[i].data & (1 << kReturnTokenCommand)) != 0) {
-        int count = msg[i].data & ((1 << kReturnTokenCommand) - 1);
+      } else if (IS_COMMAND(msg[i].data, kReturnTokenCommand)) {
+        int count = TOKEN_COUNT(msg[i].data);
         if (sd->ReturnToken(msg[i].dart_port, count)) {
           AddToEpollInstance(epoll_fd_, sd);
         }
       } else {
+        ASSERT_NO_COMMAND(msg[i].data);
         // Setup events to wait for.
         if (sd->AddPort(msg[i].dart_port)) {
           sd->SetMask(msg[i].data);
diff --git a/runtime/bin/eventhandler_linux.h b/runtime/bin/eventhandler_linux.h
index 1a8d968..0db4f3f 100644
--- a/runtime/bin/eventhandler_linux.h
+++ b/runtime/bin/eventhandler_linux.h
@@ -187,21 +187,32 @@
   virtual bool RemovePort(Dart_Port port) {
     HashMap::Entry* entry = tokens_map_.Lookup(
         GetHashmapKeyFromPort(port), GetHashmapHashFromPort(port), false);
-    ASSERT(entry != NULL);
-    intptr_t tokens = reinterpret_cast<intptr_t>(entry->value);
-    if (tokens == 0) {
-      while (idle_ports_.head() != port) {
-        idle_ports_.Rotate();
+    if (entry != NULL) {
+      intptr_t tokens = reinterpret_cast<intptr_t>(entry->value);
+      if (tokens == 0) {
+        while (idle_ports_.head() != port) {
+          idle_ports_.Rotate();
+        }
+        idle_ports_.RemoveHead();
+      } else {
+        while (live_ports_.head() != port) {
+          live_ports_.Rotate();
+        }
+        live_ports_.RemoveHead();
       }
-      idle_ports_.RemoveHead();
+      tokens_map_.Remove(
+          GetHashmapKeyFromPort(port), GetHashmapHashFromPort(port));
     } else {
-      while (live_ports_.head() != port) {
-        live_ports_.Rotate();
-      }
-      live_ports_.RemoveHead();
+      // NOTE: This is a listening socket which has been immediately closed.
+      //
+      // If a listening socket is not listened on, the event handler does not
+      // know about it beforehand. So the first time the event handler knows
+      // about it, is when it is supposed to be closed. We therefore do nothing
+      // here.
+      //
+      // But whether to close it, depends on whether other isolates have it open
+      // as well or not.
     }
-    tokens_map_.Remove(
-        GetHashmapKeyFromPort(port), GetHashmapHashFromPort(port));
     return !live_ports_.HasHead();
   }
 
diff --git a/runtime/bin/eventhandler_macos.cc b/runtime/bin/eventhandler_macos.cc
index ede500f..49ec247 100644
--- a/runtime/bin/eventhandler_macos.cc
+++ b/runtime/bin/eventhandler_macos.cc
@@ -192,16 +192,13 @@
       shutdown_ = true;
     } else {
       SocketData* sd = GetSocketData(msg[i].id);
-      if ((msg[i].data & (1 << kShutdownReadCommand)) != 0) {
-        ASSERT(msg[i].data == (1 << kShutdownReadCommand));
+      if (IS_COMMAND(msg[i].data, kShutdownReadCommand)) {
         // Close the socket for reading.
         shutdown(sd->fd(), SHUT_RD);
-      } else if ((msg[i].data & (1 << kShutdownWriteCommand)) != 0) {
-        ASSERT(msg[i].data == (1 << kShutdownWriteCommand));
+      } else if (IS_COMMAND(msg[i].data, kShutdownWriteCommand)) {
         // Close the socket for writing.
         shutdown(sd->fd(), SHUT_WR);
-      } else if ((msg[i].data & (1 << kCloseCommand)) != 0) {
-        ASSERT(msg[i].data == (1 << kCloseCommand));
+      } else if (IS_COMMAND(msg[i].data, kCloseCommand)) {
         // Close the socket and free system resources.
         RemoveFromKqueue(kqueue_fd_, sd);
         intptr_t fd = sd->fd();
@@ -209,14 +206,15 @@
         socket_map_.Remove(GetHashmapKeyFromFd(fd), GetHashmapHashFromFd(fd));
         delete sd;
         DartUtils::PostInt32(msg[i].dart_port, 1 << kDestroyedEvent);
-      } else if ((msg[i].data & (1 << kReturnTokenCommand)) != 0) {
-        int count = msg[i].data & ((1 << kReturnTokenCommand) - 1);
+      } else if (IS_COMMAND(msg[i].data, kReturnTokenCommand)) {
+        int count = TOKEN_COUNT(msg[i].data);
         for (int i = 0; i < count; i++) {
           if (sd->ReturnToken()) {
             AddToKqueue(kqueue_fd_, sd);
           }
         }
       } else {
+        ASSERT_NO_COMMAND(msg[i].data);
         // Setup events to wait for.
         ASSERT((msg[i].data > 0) && (msg[i].data < kIntptrMax));
         ASSERT(sd->port() == 0);
diff --git a/runtime/bin/socket_patch.dart b/runtime/bin/socket_patch.dart
index d2dfc14..ab5019b 100644
--- a/runtime/bin/socket_patch.dart
+++ b/runtime/bin/socket_patch.dart
@@ -805,7 +805,7 @@
     if (write) issueWriteEvent();
     if (!flagsSent && !isClosing) {
       flagsSent = true;
-      int flags = typeFlags & TYPE_TYPE_MASK;
+      int flags = 0;
       if (!isClosedRead) flags |= 1 << READ_EVENT;
       if (!isClosedWrite) flags |= 1 << WRITE_EVENT;
       sendToEventHandler(flags);
@@ -861,9 +861,10 @@
   }
 
   void sendToEventHandler(int data) {
+    int fullData = (typeFlags & TYPE_TYPE_MASK) | data;
     assert(!isClosing);
     connectToEventHandler();
-    _EventHandler._sendData(this, eventPort.sendPort, data);
+    _EventHandler._sendData(this, eventPort.sendPort, fullData);
   }
 
   void connectToEventHandler() {
@@ -1182,6 +1183,7 @@
         _controller.close();
         if (_referencePort != null) {
           _referencePort.close();
+          _referencePort = null;
         }
       });
     return _controller.stream.listen(
@@ -1195,7 +1197,15 @@
 
   InternetAddress get address => _socket.address;
 
-  Future close() => _socket.close().then((_) => this);
+  Future close() {
+    return _socket.close().then((_) {
+      if (_referencePort != null) {
+        _referencePort.close();
+        _referencePort = null;
+      }
+      return this;
+    });
+  }
 
   void _pause() {
     _socket.setListening(read: false, write: false);
diff --git a/runtime/include/dart_api.h b/runtime/include/dart_api.h
index cd5b76f..f27c501 100755
--- a/runtime/include/dart_api.h
+++ b/runtime/include/dart_api.h
@@ -1133,6 +1133,13 @@
 DART_EXPORT bool Dart_HandleServiceMessages();
 
 /**
+ * Does the current isolate have pending service messages?
+ *
+ * \return true if the isolate has pending service messages, false otherwise.
+ */
+DART_EXPORT bool Dart_HasServiceMessages();
+
+/**
  * Processes any incoming messages for the current isolate.
  *
  * This function may only be used when the embedder has not provided
diff --git a/runtime/lib/convert_patch.dart b/runtime/lib/convert_patch.dart
index 2a4ab1b..eea0fa5 100644
--- a/runtime/lib/convert_patch.dart
+++ b/runtime/lib/convert_patch.dart
@@ -1,7 +1,9 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import "dart:_internal" show POWERS_OF_TEN;
+
 // JSON conversion.
 
 patch _parseJson(String json, reviver(var key, var value)) {
@@ -11,7 +13,11 @@
   } else {
     listener = new _ReviverJsonListener(reviver);
   }
-  new _JsonParser(json, listener).parse();
+  var parser = new _JsonStringParser(listener);
+  parser.chunk = json;
+  parser.chunkEnd = json.length;
+  parser.parse(0);
+  parser.close();
   return listener.result;
 }
 
@@ -19,6 +25,9 @@
 
 // Simple API for JSON parsing.
 
+/**
+ * Listener for parsing events from [_ChunkedJsonParser].
+ */
 abstract class _JsonListener {
   void handleString(String value) {}
   void handleNumber(num value) {}
@@ -34,7 +43,7 @@
 }
 
 /**
- * A [JsonListener] that builds data objects from the parser events.
+ * A [_JsonListener] that builds data objects from the parser events.
  *
  * This is a simple stack-based object builder. It keeps the most recently
  * seen value in a variable, and uses it depending on the following event.
@@ -135,7 +144,72 @@
   }
 }
 
-class _JsonParser {
+/**
+ * Buffer holding parts of a numeral.
+ *
+ * The buffer contains the characters of a JSON number.
+ * These are all ASCII, so an [Uint8List] is used as backing store.
+ *
+ * This buffer is used when a JSON number is split between separate chunks.
+ *
+ */
+class _NumberBuffer {
+  static const int minCapacity = 16;
+  static const int kDefaultOverhead = 5;
+  Uint8List list;
+  int length = 0;
+  _NumberBuffer(int initialCapacity)
+      : list = new Uint8List(_initialCapacity(initialCapacity));
+
+  int get capacity => list.length;
+
+  // Pick an initial capacity greater than the first part's size.
+  // The typical use case has two parts, this is the attempt at
+  // guessing the size of the second part without overdoing it.
+  // The default estimate of the second part is [kDefaultOverhead],
+  // then round to multiplum of four, and return the result,
+  // or [minCapacity] if that is greater.
+  static int _initialCapacity(int minCapacity) {
+    minCapacity += kDefaultOverhead;
+    if (minCapacity < minCapacity) return minCapacity;
+    minCapacity = (minCapacity + 3) & ~3;  // Round to multiple of four.
+    return minCapacity;
+  }
+
+  // Grows to the exact size asked for.
+  void ensureCapacity(int newCapacity) {
+    Uint8List list = this.list;
+    if (newCapacity <= list.length) return;
+    Uint8List newList = new Uint8List(newCapacity);
+    newList.setRange(0, list.length, list, 0);
+    this.list = newList;
+  }
+
+  String getString() {
+    var list = this.list;
+    if (length < list.length) {
+      list = new Uint8List.view(list.buffer, 0, length);
+    }
+    String result = new String.fromCharCodes(list);
+    return result;
+  }
+
+  // TODO(lrn): See if parsing of numbers can be abstracted to something
+  // not only working on strings, but also on char-code lists, without lossing
+  // performance.
+  int parseInt() => int.parse(getString());
+  double parseDouble() => double.parse(getString());
+}
+
+/**
+ * Chunked JSON parser.
+ *
+ * Receives inputs in chunks, gives access to individual parts of the input,
+ * and stores input state between chunks.
+ *
+ * Implementations include [String] and UTF-8 parsers.
+ */
+abstract class _ChunkedJsonParser {
   // A simple non-recursive state-based parser for JSON.
   //
   // Literal values accepted in states ARRAY_EMPTY, ARRAY_COMMA, OBJECT_COLON
@@ -172,11 +246,11 @@
   static const int NO_VALUES = 12;
 
   // Objects and arrays are "empty" until their first property/element.
+  // At this position, they may either have an entry or a close-bracket.
   static const int EMPTY = 0;
   static const int NON_EMPTY = 16;
   static const int EMPTY_MASK = 16;  // Empty if zero.
 
-
   static const int VALUE_READ_BITS = NO_VALUES | NON_EMPTY;
 
   // Actual states.
@@ -226,18 +300,466 @@
   static const int LBRACE          = 0x7b;
   static const int RBRACE          = 0x7d;
 
-  final String source;
-  final _JsonListener listener;
-  _JsonParser(this.source, this.listener);
+  // State of partial value at chunk split.
+  static const int NO_PARTIAL      = 0;
+  static const int PARTIAL_STRING  = 1;
+  static const int PARTIAL_NUMERAL = 2;
+  static const int PARTIAL_KEYWORD = 3;
+  static const int MASK_PARTIAL    = 3;
 
-  /** Parses [source], or throws if it fails. */
-  void parse() {
-    final List<int> states = <int>[];
-    int state = STATE_INITIAL;
-    int position = 0;
-    int length = source.length;
+  // Partial states for numerals. Values can be |'ed with PARTIAL_NUMERAL.
+  static const int NUM_SIGN        =  0;  // After initial '-'.
+  static const int NUM_ZERO        =  4;  // After '0' as first digit.
+  static const int NUM_DIGIT       =  8;  // After digit, no '.' or 'e' seen.
+  static const int NUM_DOT         = 12;  // After '.'.
+  static const int NUM_DOT_DIGIT   = 16;  // After a decimal digit (after '.').
+  static const int NUM_E           = 20;  // After 'e' or 'E'.
+  static const int NUM_E_SIGN      = 24;  // After '-' or '+' after 'e' or 'E'.
+  static const int NUM_E_DIGIT     = 28;  // After exponent digit.
+  static const int NUM_SUCCESS     = 32;  // Never stored as partial state.
+
+  // Partial states for strings.
+  static const int STR_PLAIN         =  0;   // Inside string, but not escape.
+  static const int STR_ESCAPE        =  4;   // After '\'.
+  static const int STR_U             =  16;  // After '\u' and 0-3 hex digits.
+  static const int STR_U_COUNT_SHIFT =  2;   // Hex digit count in bits 2-3.
+  static const int STR_U_VALUE_SHIFT =  5;   // Hex digit value in bits 5+.
+
+  // Partial states for keywords.
+  static const int KWD_TYPE_MASK     = 12;
+  static const int KWD_TYPE_SHIFT    = 2;
+  static const int KWD_NULL          = 0;  // Prefix of "null" seen.
+  static const int KWD_TRUE          = 4;  // Prefix of "true" seen.
+  static const int KWD_FALSE         = 8;  // Prefix of "false" seen.
+  static const int KWD_COUNT_SHIFT   = 4;  // Prefix length in bits 4+.
+
+  // Mask used to mask off two lower bits.
+  static const int TWO_BIT_MASK = 3;
+
+  final _JsonListener listener;
+
+  // The current parsing state.
+  int state = STATE_INITIAL;
+  List<int> states = <int>[];
+
+  /**
+   * Stores tokenizer state between chunks.
+   *
+   * This state is stored when a chunk stops in the middle of a
+   * token (string, numeral, boolean or null).
+   *
+   * The partial state is used to continue parsing on the next chunk.
+   * The previous chunk is not retained, any data needed are stored in
+   * this integer, or in the [buffer] field as a string-building buffer
+   * or a [_NumberBuffer].
+   *
+   * Prefix state stored in [prefixState] as bits.
+   *
+   *            ..00 : No partial value (NO_PARTIAL).
+   *
+   *         ..00001 : Partial string, not inside escape.
+   *         ..00101 : Partial string, after '\'.
+   *     ..vvvv1dd01 : Partial \u escape.
+   *                   The 'dd' bits (2-3) encode the number of hex digits seen.
+   *                   Bits 5-16 encode the value of the hex digits seen so far.
+   *
+   *        ..0ddd10 : Partial numeral.
+   *                   The `ddd` bits store the parts of in the numeral seen so
+   *                   far, as the constants `NUM_*` defined above.
+   *                   The characters of the numeral are stored in [buffer]
+   *                   as a [_NumberBuffer].
+   *
+   *      ..0ddd0011 : Partial 'null' keyword.
+   *      ..0ddd0111 : Partial 'true' keyword.
+   *      ..0ddd1011 : Partial 'false' keyword.
+   *                   For all three keywords, the `ddd` bits encode the number
+   *                   of letters seen.
+   */
+  int partialState = NO_PARTIAL;
+
+  /**
+   * Extra data stored while parsing a primitive value.
+   * May be set during parsing, always set at chunk end if a value is partial.
+   *
+   * May contain a string buffer while parsing strings.
+   */
+  var buffer = null;
+
+  _ChunkedJsonParser(this.listener);
+
+  /**
+   * Push the current parse [state] on a stack.
+   *
+   * State is pushed when a new array or object literal starts,
+   * so the parser can go back to the correct value when the literal ends.
+   */
+  void saveState(int state) {
+    states.add(state);
+  }
+
+  /**
+   * Restore a state pushed with [saveState].
+   */
+  int restoreState() {
+    return states.removeLast();  // Throws if empty.
+  }
+
+  /**
+   * Finalizes the parsing.
+   *
+   * Throws if the source read so far doesn't end up with a complete
+   * parsed value. That means it must not be inside a list or object
+   * literal, and any partial value read should also be a valid complete
+   * value.
+   *
+   * The only valid partial state is a number that ends in a digit, and
+   * only if the number is the entire JSON value being parsed
+   * (otherwise it would be inside a list or object).
+   * Such a number will be completed. Any other partial state is an error.
+   */
+  void close() {
+    if (partialState != NO_PARTIAL) {
+      int partialType = partialState & MASK_PARTIAL;
+      if (partialType == PARTIAL_NUMERAL) {
+        int numState = partialState & ~MASK_PARTIAL;
+        // A partial number might be a valid number if we know it's done.
+        // There is an unnecessary overhead if input is a single number,
+        // but this is assumed to be rare.
+        _NumberBuffer buffer = this.buffer;
+        this.buffer = null;
+        finishChunkNumber(numState, 0, 0, buffer);
+      } else if (partialType == PARTIAL_STRING) {
+        fail(chunkEnd, "Unterminated string");
+      } else {
+        assert(partialType == PARTIAL_KEYWORD);
+        fail(chunkEnd);  // Incomplete literal.
+      }
+    }
+    if (state != STATE_END) {
+      fail(chunkEnd);
+    }
+  }
+
+  /**
+   * Read out the result after successfully closing the parser.
+   *
+   * The parser is closed by calling [close] or calling [addSourceChunk] with
+   * `true` as second (`isLast`) argument.
+   */
+  Object get result {
+    return listener.result;
+  }
+
+  /** Sets the current source chunk. */
+  void set chunk(var source);
+
+  /**
+   * Length of current chunk.
+   *
+   * The valid arguments to [getChar] are 0 .. `chunkEnd - 1`.
+   */
+  int get chunkEnd;
+
+  /**
+   * Returns the chunk itself.
+   *
+   * Only used by [fail] to include the chunk in the thrown [FormatException].
+   */
+  get chunk;
+
+  /**
+   * Get charcacter/code unit of current chunk.
+   *
+   * The [index] must be non-negative and less than `chunkEnd`.
+   * In practive, [index] will be no smaller than the `start` argument passed
+   * to [parse].
+   */
+  int getChar(int index);
+
+  /**
+   * Copy ASCII characters from start to end of chunk into a list.
+   *
+   * Used for number buffer (always copies ASCII, so encoding is not important).
+   */
+  void copyCharsToList(int start, int end, List<int> target);
+
+  /**
+   * Build a string using input code units.
+   *
+   * Creates a string buffer and enables adding characters and slices
+   * to that buffer.
+   * The buffer is stored in the [buffer] field. If the string is unterminated,
+   * the same buffer is used to continue parsing in the next chunk.
+   */
+  void beginString();
+  /**
+   * Add single character code to string being built.
+   *
+   * Used for unparsed escape sequences.
+   */
+  void addCharToString(int charCode);
+
+  /**
+   * Adds slice of current chunk to string being built.
+   *
+   * The [start] positions is inclusive, [end] is exclusive.
+   */
+  void addSliceToString(int start, int end);
+
+  /** Finalizes the string being built and returns it as a String. */
+  String endString();
+
+  /**
+   * Extracts a literal string from a slice of the current chunk.
+   *
+   * No interpretation of the content is performed, except for converting
+   * the source format to string.
+   * This can be implemented more or less efficiently depending on the
+   * underlying source.
+   *
+   * This is used for string literals that contain no escapes.
+   */
+  String getString(int start, int end);
+
+  /**
+   * Parse a slice of the current chunk as an integer.
+   *
+   * The format is expected to be correct.
+   */
+  int parseInt(int start, int end) {
+    return int.parse(getString(start, end));
+  }
+
+  /**
+   * Parse a slice of the current chunk as a double.
+   *
+   * The format is expected to be correct.
+   * This is used by [parseNumber] when the double value cannot be
+   * built exactly during parsing.
+   */
+  double parseDouble(int start, int end) {
+    return double.parse(getString(start, end));
+  }
+
+  /**
+   * Create a _NumberBuffer containing the digits from [start] to [chunkEnd].
+   *
+   * This creates a number buffer and initializes it with the part of the
+   * number literal ending the current chunk
+   */
+  void createNumberBuffer(int start) {
+    assert(start >= 0);
+    assert(start < chunkEnd);
+    int length = chunkEnd - start;
+    var buffer = new _NumberBuffer(length);
+    copyCharsToList(start, chunkEnd, buffer.list);
+    buffer.length = length;
+    return buffer;
+  }
+
+  /**
+   * Continues parsing a partial value.
+   */
+  int parsePartial(int position) {
+    if (position == chunkEnd) return position;
+    int partialState = this.partialState;
+    assert(partialState != NO_PARTIAL);
+    int partialType = partialState & MASK_PARTIAL;
+    this.partialState = NO_PARTIAL;
+    partialState = partialState & ~MASK_PARTIAL;
+    assert(partialType != 0);
+    if (partialType == PARTIAL_STRING) {
+      position = parsePartialString(position, partialState);
+    } else if (partialType == PARTIAL_NUMERAL) {
+      position = parsePartialNumber(position, partialState);
+    } else if (partialType == PARTIAL_KEYWORD) {
+      position = parsePartialKeyword(position, partialState);
+    }
+    return position;
+  }
+
+  /**
+   * Parses the remainder of a number into the number buffer.
+   *
+   * Syntax is checked while pasing.
+   * Starts at position, which is expected to be the start of the chunk,
+   * and returns the index of the first non-number-literal character found,
+   * or chunkEnd if the entire chunk is a valid number continuation.
+   * Throws if a syntax error is detected.
+   */
+  int parsePartialNumber(int position, int state) {
+    int start = position;
+    // Primitive implementation, can be optimized.
+    _NumberBuffer buffer = this.buffer;
+    this.buffer = null;
+    int end = chunkEnd;
+    toBailout: {
+      if (position == end) break toBailout;
+      int char = getChar(position);
+      int digit = char ^ CHAR_0;
+      if (state == NUM_SIGN) {
+        if (digit <= 9) {
+          if (digit == 0) {
+            state = NUM_ZERO;
+          } else {
+            state = NUM_DIGIT;
+          }
+          position++;
+          if (position == end) break toBailout;
+          char = getChar(position);
+          digit = char ^ CHAR_0;
+        } else {
+          return fail(position);
+        }
+      }
+      if (state == NUM_ZERO) {
+        // JSON does not allow insignificant leading zeros (e.g., "09").
+        if (digit <= 9) return fail(position);
+        state = NUM_DIGIT;
+      }
+      while (state == NUM_DIGIT) {
+        if (digit > 9) {
+          if (char == DECIMALPOINT) {
+            state = NUM_DOT;
+          } else if ((char | 0x20) == CHAR_e) {
+            state = NUM_E;
+          } else {
+            finishChunkNumber(state, start, position, buffer);
+            return position;
+          }
+        }
+        position++;
+        if (position == end) break toBailout;
+        char = getChar(position);
+        digit = char ^ CHAR_0;
+      }
+      if (state == NUM_DOT) {
+        if (digit > 9) return fail(position);
+        state = NUM_DOT_DIGIT;
+      }
+      while (state == NUM_DOT_DIGIT) {
+        if (digit > 9) {
+          if ((char | 0x20) == CHAR_e) {
+            state = NUM_E;
+          } else {
+            finishChunkNumber(state, start, position, buffer);
+            return position;
+          }
+        }
+        position++;
+        if (position == end) break toBailout;
+        char = getChar(position);
+        digit = char ^ CHAR_0;
+      }
+      if (state == NUM_E) {
+        if (char == PLUS || char == MINUS) {
+          state = NUM_E_SIGN;
+          position++;
+          if (position == end) break toBailout;
+          char = getChar(position);
+          digit = char ^ CHAR_0;
+        }
+      }
+      assert(state >= NUM_E);
+      while (digit <= 9) {
+        state = NUM_E_DIGIT;
+        position++;
+        if (position == end) break toBailout;
+        char = getChar(position);
+        digit = char ^ CHAR_0;
+      }
+      finishChunkNumber(state, start, position, buffer);
+      return position;
+    }
+    // Bailout code in case the current chunk ends while parsing the numeral.
+    assert(position == end);
+    continueChunkNumber(state, start, buffer);
+    return chunkEnd;
+  }
+
+  /**
+   * Continues parsing a partial string literal.
+   *
+   * Handles partial escapes and then hands the parsing off to
+   * [parseStringToBuffer].
+   */
+  int parsePartialString(int position, int partialState) {
+    if (partialState == STR_PLAIN) {
+      return parseStringToBuffer(position);
+    }
+    if (partialState == STR_ESCAPE) {
+      position = parseStringEscape(position);
+      // parseStringEscape sets partialState if it sees the end.
+      if (position == chunkEnd) return position;
+      return parseStringToBuffer(position);
+    }
+    assert((partialState & STR_U) != 0);
+    int value = partialState >> STR_U_VALUE_SHIFT;
+    int count = (partialState >> STR_U_COUNT_SHIFT) & TWO_BIT_MASK;
+    for (int i = count; i < 4; i++, position++) {
+      if (position == chunkEnd) return chunkStringEscapeU(i, value);
+      int char = getChar(position);
+      int digit = parseHexDigit(char);
+      if (digit < 0) fail(position, "Invalid hex digit");
+      value = 16 * value + digit;
+    }
+    addCharToString(value);
+    return parseStringToBuffer(position);
+  }
+
+  /**
+   * Continues parsing a partial keyword.
+   */
+  int parsePartialKeyword(int position, int partialState) {
+    int keywordType = partialState & KWD_TYPE_MASK;
+    int count = partialState >> KWD_COUNT_SHIFT;
+    int keywordTypeIndex = keywordType >> KWD_TYPE_SHIFT;
+    String keyword = const ["null", "true", "false"][keywordTypeIndex];
+    assert(count < keyword.length);
+    do {
+      if (position == chunkEnd) {
+        this.partialState =
+            PARTIAL_KEYWORD | keywordType | (count << KWD_COUNT_SHIFT);
+        return chunkEnd;
+      }
+      int expectedChar = keyword.codeUnitAt(count);
+      if (getChar(position) != expectedChar) return fail(position);
+      position++;
+      count++;
+    } while (count < keyword.length);
+    if (keywordType == KWD_NULL) {
+      listener.handleNull();
+    } else {
+      listener.handleBool(keywordType == KWD_TRUE);
+    }
+    return position;
+  }
+
+  /** Convert hex-digit to its value. Returns -1 if char is not a hex digit. */
+  int parseHexDigit(int char) {
+    int digit = char ^ 0x30;
+    if (digit <= 9) return digit;
+    int letter = (char | 0x20) ^ 0x60;
+    // values 1 .. 6 are 'a' through 'f'
+    if (letter <= 6 && letter > 0) return letter + 9;
+    return -1;
+  }
+
+  /**
+   * Parses the current chunk as a chunk of JSON.
+   *
+   * Starts parsing at [position] and continues until [chunkEnd].
+   * Continues parsing where the previous chunk (if any) ended.
+   */
+  void parse(int position) {
+    int length = chunkEnd;
+    if (partialState != NO_PARTIAL) {
+      position = parsePartial(position);
+      if (position == length) return;
+    }
+    int state = this.state;
     while (position < length) {
-      int char = source.codeUnitAt(position);
+      int char = getChar(position);
       switch (char) {
         case SPACE:
         case CARRIAGE_RETURN:
@@ -246,41 +768,41 @@
           position++;
           break;
         case QUOTE:
-          if ((state & ALLOW_STRING_MASK) != 0) fail(position);
-          position = parseString(position + 1);
+          if ((state & ALLOW_STRING_MASK) != 0) return fail(position);
           state |= VALUE_READ_BITS;
+          position = parseString(position + 1);
           break;
         case LBRACKET:
-          if ((state & ALLOW_VALUE_MASK) != 0) fail(position);
+          if ((state & ALLOW_VALUE_MASK) != 0) return fail(position);
           listener.beginArray();
-          states.add(state);
+          saveState(state);
           state = STATE_ARRAY_EMPTY;
           position++;
           break;
         case LBRACE:
-          if ((state & ALLOW_VALUE_MASK) != 0) fail(position);
+          if ((state & ALLOW_VALUE_MASK) != 0) return fail(position);
           listener.beginObject();
-          states.add(state);
+          saveState(state);
           state = STATE_OBJECT_EMPTY;
           position++;
           break;
         case CHAR_n:
-          if ((state & ALLOW_VALUE_MASK) != 0) fail(position);
-          position = parseNull(position);
+          if ((state & ALLOW_VALUE_MASK) != 0) return fail(position);
           state |= VALUE_READ_BITS;
+          position = parseNull(position);
           break;
         case CHAR_f:
-          if ((state & ALLOW_VALUE_MASK) != 0) fail(position);
-          position = parseFalse(position);
+          if ((state & ALLOW_VALUE_MASK) != 0) return fail(position);
           state |= VALUE_READ_BITS;
+          position = parseFalse(position);
           break;
         case CHAR_t:
-          if ((state & ALLOW_VALUE_MASK) != 0) fail(position);
-          position = parseTrue(position);
+          if ((state & ALLOW_VALUE_MASK) != 0) return fail(position);
           state |= VALUE_READ_BITS;
+          position = parseTrue(position);
           break;
         case COLON:
-          if (state != STATE_OBJECT_KEY) fail(position);
+          if (state != STATE_OBJECT_KEY) return fail(position);
           listener.propertyName();
           state = STATE_OBJECT_COLON;
           position++;
@@ -295,7 +817,7 @@
             state = STATE_ARRAY_COMMA;
             position++;
           } else {
-            fail(position);
+            return fail(position);
           }
           break;
         case RBRACKET:
@@ -305,9 +827,9 @@
             listener.arrayElement();
             listener.endArray();
           } else {
-            fail(position);
+            return fail(position);
           }
-          state = states.removeLast() | VALUE_READ_BITS;
+          state = restoreState() | VALUE_READ_BITS;
           position++;
           break;
         case RBRACE:
@@ -317,19 +839,19 @@
             listener.propertyValue();
             listener.endObject();
           } else {
-            fail(position);
+            return fail(position);
           }
-          state = states.removeLast() | VALUE_READ_BITS;
+          state = restoreState() | VALUE_READ_BITS;
           position++;
           break;
         default:
           if ((state & ALLOW_VALUE_MASK) != 0) fail(position);
-          position = parseNumber(char, position);
           state |= VALUE_READ_BITS;
+          position = parseNumber(char, position);
           break;
       }
     }
-    if (state != STATE_END) fail(position);
+    this.state = state;
   }
 
   /**
@@ -338,12 +860,14 @@
    * [:source[position]:] must be "t".
    */
   int parseTrue(int position) {
-    assert(source.codeUnitAt(position) == CHAR_t);
-    if (source.length < position + 4) fail(position, "Unexpected identifier");
-    if (source.codeUnitAt(position + 1) != CHAR_r ||
-        source.codeUnitAt(position + 2) != CHAR_u ||
-        source.codeUnitAt(position + 3) != CHAR_e) {
-      fail(position);
+    assert(getChar(position) == CHAR_t);
+    if (chunkEnd < position + 4) {
+      return parseKeywordPrefix(position, "true", KWD_TRUE);
+    }
+    if (getChar(position + 1) != CHAR_r ||
+        getChar(position + 2) != CHAR_u ||
+        getChar(position + 3) != CHAR_e) {
+      return fail(position);
     }
     listener.handleBool(true);
     return position + 4;
@@ -355,13 +879,15 @@
    * [:source[position]:] must be "f".
    */
   int parseFalse(int position) {
-    assert(source.codeUnitAt(position) == CHAR_f);
-    if (source.length < position + 5) fail(position, "Unexpected identifier");
-    if (source.codeUnitAt(position + 1) != CHAR_a ||
-        source.codeUnitAt(position + 2) != CHAR_l ||
-        source.codeUnitAt(position + 3) != CHAR_s ||
-        source.codeUnitAt(position + 4) != CHAR_e) {
-      fail(position);
+    assert(getChar(position) == CHAR_f);
+    if (chunkEnd < position + 5) {
+      return parseKeywordPrefix(position, "false", KWD_FALSE);
+    }
+    if (getChar(position + 1) != CHAR_a ||
+        getChar(position + 2) != CHAR_l ||
+        getChar(position + 3) != CHAR_s ||
+        getChar(position + 4) != CHAR_e) {
+      return fail(position);
     }
     listener.handleBool(false);
     return position + 5;
@@ -373,17 +899,33 @@
    * [:source[position]:] must be "n".
    */
   int parseNull(int position) {
-    assert(source.codeUnitAt(position) == CHAR_n);
-    if (source.length < position + 4) fail(position, "Unexpected identifier");
-    if (source.codeUnitAt(position + 1) != CHAR_u ||
-        source.codeUnitAt(position + 2) != CHAR_l ||
-        source.codeUnitAt(position + 3) != CHAR_l) {
-      fail(position);
+    assert(getChar(position) == CHAR_n);
+    if (chunkEnd < position + 4) {
+      return parseKeywordPrefix(position, "null", KWD_NULL);
+    }
+    if (getChar(position + 1) != CHAR_u ||
+        getChar(position + 2) != CHAR_l ||
+        getChar(position + 3) != CHAR_l) {
+      return fail(position);
     }
     listener.handleNull();
     return position + 4;
   }
 
+  int parseKeywordPrefix(int position, String chars, int type) {
+    assert(getChar(position) == chars.codeUnitAt(0));
+    int length = chunkEnd;
+    int start = position;
+    int count = 1;
+    while (++position < length) {
+      int char = getChar(position);
+      if (char != chars.codeUnitAt(count)) return fail(start);
+      count++;
+    }
+    this.partialState = PARTIAL_KEYWORD | type | (count << KWD_COUNT_SHIFT);
+    return length;
+  }
+
   /**
    * Parses a string value.
    *
@@ -394,92 +936,208 @@
     // Format: '"'([^\x00-\x1f\\\"]|'\\'[bfnrt/\\"])*'"'
     // Initial position is right after first '"'.
     int start = position;
-    while (position < source.length) {
-      int char = source.codeUnitAt(position++);
+    int end = chunkEnd;
+    while (position < end) {
+      int char = getChar(position++);
       // BACKSLASH is larger than QUOTE and SPACE.
       if (char > BACKSLASH) {
         continue;
       }
       if (char == BACKSLASH) {
-        return parseStringWithEscapes(start, position - 1);
+        beginString();
+        int sliceEnd = position - 1;
+        if (start < sliceEnd) addSliceToString(start, sliceEnd);
+        return parseStringToBuffer(position - 1);
       }
       if (char == QUOTE) {
-        listener.handleString(source.substring(start, position - 1));
+        listener.handleString(getString(start, position - 1));
         return position;
       }
       if (char < SPACE) {
         fail(position - 1, "Control character in string");
       }
     }
-    fail(start - 1, "Unterminated string");
+    beginString();
+    if (start < end) addSliceToString(start, end);
+    return chunkString(STR_PLAIN);
   }
 
-  int parseStringWithEscapes(start, position) {
-    // Backslash escape detected. Collect character codes for rest of string.
-    int firstEscape = position;
-    List<int> chars = <int>[];
-    for (int i = start; i < firstEscape; i++) {
-      chars.add(source.codeUnitAt(i));
-    }
-    position++;
+  /**
+   * Sets up a partial string state.
+   *
+   * The state is either not inside an escape, or right after a backslash.
+   * For partial strings ending inside a Unicode escape, use
+   * [chunkStringEscapeU].
+   */
+  int chunkString(int stringState) {
+    partialState = PARTIAL_STRING | stringState;
+    return chunkEnd;
+  }
+
+  /**
+   * Sets up a partial string state for a partially parsed Unicode escape.
+   *
+   * The partial string state includes the current [buffer] and the
+   * number of hex digits of the Unicode seen so far (e.g., for `"\u30')
+   * the state knows that two digits have been seen, and what their value is.
+   *
+   * Returns [chunkEnd] so it can be used as part of a return statement.
+   */
+  int chunkStringEscapeU(int count, int value) {
+    partialState = PARTIAL_STRING | STR_U |
+                   (count << STR_U_COUNT_SHIFT) |
+                   (value << STR_U_VALUE_SHIFT);
+    return chunkEnd;
+  }
+
+  /**
+   * Parses the remainder of a string literal into a buffer.
+   *
+   * The buffer is stored in [buffer] and its underlying format depends on
+   * the input chunk type. For example UTF-8 decoding happens in the
+   * buffer, not in the parser, since all significant JSON characters are ASCII.
+   *
+   * This function scans through the string literal for escapes, and copies
+   * slices of non-escape characters using [addSliceToString].
+   */
+  int parseStringToBuffer(position) {
+    int end = chunkEnd;
+    int start = position;
     while (true) {
-      if (position == source.length) {
-        fail(start - 1, "Unterminated string");
-      }
-      int char = source.codeUnitAt(position);
-      switch (char) {
-        case CHAR_b: char = BACKSPACE; break;
-        case CHAR_f: char = FORM_FEED; break;
-        case CHAR_n: char = NEWLINE; break;
-        case CHAR_r: char = CARRIAGE_RETURN; break;
-        case CHAR_t: char = TAB; break;
-        case SLASH:
-        case BACKSLASH:
-        case QUOTE:
-          break;
-        case CHAR_u:
-          int hexStart = position - 1;
-          int value = 0;
-          for (int i = 0; i < 4; i++) {
-            position++;
-            if (position == source.length) {
-              fail(start - 1, "Unterminated string");
-            }
-            char = source.codeUnitAt(position);
-            char -= 0x30;
-            if (char < 0) fail(hexStart, "Invalid unicode escape");
-            if (char < 10) {
-              value = value * 16 + char;
-            } else {
-              char = (char | 0x20) - 0x31;
-              if (char < 0 || char > 5) {
-                fail(hexStart, "Invalid unicode escape");
-              }
-              value = value * 16 + char + 10;
-            }
-          }
-          char = value;
-          break;
-        default:
-          if (char < SPACE) fail(position, "Control character in string");
-          fail(position, "Unrecognized string escape");
-      }
-      do {
-        chars.add(char);
-        position++;
-        if (position == source.length) fail(start - 1, "Unterminated string");
-        char = source.codeUnitAt(position);
-        if (char == QUOTE) {
-          String result = new String.fromCharCodes(chars);
-          listener.handleString(result);
-          return position + 1;
+      if (position == end) {
+        if (position > start) {
+          addSliceToString(start, position);
         }
-        if (char < SPACE) {
-          fail(position, "Control character in string");
+        return chunkString(STR_PLAIN);
+      }
+      int char = getChar(position++);
+      if (char > BACKSLASH) continue;
+      if (char < SPACE) {
+        fail(position - 1);  // Control character in string.
+        return;
+      }
+      if (char == QUOTE) {
+        int quotePosition = position - 1;
+        if (quotePosition > start) {
+          addSliceToString(start, quotePosition);
         }
-      } while (char != BACKSLASH);
-      position++;
+        listener.handleString(endString());
+        return position;
+      }
+      if (char != BACKSLASH) {
+        continue;
+      }
+      // Handle escape.
+      if (position - 1 > start) {
+        addSliceToString(start, position - 1);
+      }
+      if (position == end) return chunkString(STR_ESCAPE);
+      position = parseStringEscape(position);
+      if (position == end) return position;
+      start = position;
     }
+    return -1;  // UNREACHABLE.
+  }
+
+  /**
+   * Parse a string escape.
+   *
+   * Position is right after the initial backslash.
+   * The following escape is parsed into a character code which is added to
+   * the current string buffer using [addCharToString].
+   *
+   * Returns position after the last character of the escape.
+   */
+  int parseStringEscape(int position) {
+    int char = getChar(position++);
+    int length = chunkEnd;
+    switch (char) {
+      case CHAR_b: char = BACKSPACE; break;
+      case CHAR_f: char = FORM_FEED; break;
+      case CHAR_n: char = NEWLINE; break;
+      case CHAR_r: char = CARRIAGE_RETURN; break;
+      case CHAR_t: char = TAB; break;
+      case SLASH:
+      case BACKSLASH:
+      case QUOTE:
+        break;
+      case CHAR_u:
+        int hexStart = position - 1;
+        int value = 0;
+        for (int i = 0; i < 4; i++) {
+          if (position == length) return chunkStringEscapeU(i, value);
+          char = getChar(position++);
+          int digit = char ^ 0x30;
+          value *= 16;
+          if (digit <= 9) {
+            value += digit;
+          } else {
+            digit = (char | 0x20) - CHAR_a;
+            if (digit < 0 || digit > 5) {
+              return fail(hexStart, "Invalid unicode escape");
+            }
+            value += digit + 10;
+          }
+        }
+        char = value;
+        break;
+      default:
+        if (char < SPACE) return fail(position, "Control character in string");
+        return fail(position, "Unrecognized string escape");
+    }
+    addCharToString(char);
+    if (position == length) return chunkString(STR_PLAIN);
+    return position;
+  }
+
+  /// Sets up a partial numeral state.
+  /// Returns chunkEnd to allow easy one-line bailout tests.
+  int beginChunkNumber(int state, int start) {
+    int end = chunkEnd;
+    int length = end - start;
+    var buffer = new _NumberBuffer(length);
+    copyCharsToList(start, end, buffer.list, 0);
+    buffer.length = length;
+    this.buffer = buffer;
+    this.partialState = PARTIAL_NUMERAL | state;
+    return end;
+  }
+
+  void addNumberChunk(_NumberBuffer buffer, int start, int end, int overhead) {
+    int length = end - start;
+    int count = buffer.length;
+    int newCount = count + length;
+    int newCapacity = newCount + overhead;
+    buffer.ensureCapacity(newCapacity);
+    copyCharsToList(start, end, buffer.list, count);
+    buffer.length = newCount;
+  }
+
+  // Continues an already chunked number accross an entire chunk.
+  int continueChunkNumber(int state, int start, _NumberBuffer buffer) {
+    int end = chunkEnd;
+    addNumberChunk(buffer, start, end, _NumberBuffer.kDefaultOverhead);
+    this.buffer = buffer;
+    this.partialState = PARTIAL_NUMERAL | state;
+    return end;
+  }
+
+  int finishChunkNumber(int state, int start, int end, _NumberBuffer buffer) {
+    if (state == NUM_ZERO) {
+      listener.handleNumber(0);
+      return;
+    }
+    if (end > start) {
+      addNumberChunk(buffer, start, end, 0);
+    }
+    if (state == NUM_DIGIT) {
+      listener.handleNumber(buffer.parseInt());
+    } else if (state == NUM_DOT_DIGIT || state == NUM_E_DIGIT) {
+      listener.handleNumber(buffer.parseDouble());
+    } else {
+      fail(chunkEnd, "Unterminated number literal");
+    }
+    return end;
   }
 
   int parseNumber(int char, int position) {
@@ -487,89 +1145,576 @@
     // Format:
     //  '-'?('0'|[1-9][0-9]*)('.'[0-9]+)?([eE][+-]?[0-9]+)?
     int start = position;
-    int length = source.length;
-    int intValue = 0;  // Collect int value while parsing.
-    int intSign = 1;
+    int length = chunkEnd;
+    // Collects an int value while parsing. Used for both an integer literal,
+    // an the exponent part of a double literal.
+    int intValue = 0;
+    double doubleValue = 0.0; // Collect double value while parsing.
+    int sign = 1;
     bool isDouble = false;
     // Break this block when the end of the number literal is reached.
     // At that time, position points to the next character, and isDouble
     // is set if the literal contains a decimal point or an exponential.
     parsing: {
       if (char == MINUS) {
-        intSign = -1;
+        sign = -1;
         position++;
-        if (position == length) fail(position, "Missing expected digit");
-        char = source.codeUnitAt(position);
+        if (position == length) return beginChunkNumber(NUM_SIGN, start);
+        char = getChar(position);
       }
-      if (char < CHAR_0 || char > CHAR_9) {
-        if (intSign < 0) {
+      int digit = char ^ CHAR_0;
+      if (digit > 9) {
+        if (sign < 0) {
           fail(position, "Missing expected digit");
         } else {
           // If it doesn't even start out as a numeral.
           fail(position, "Unexpected character");
         }
       }
-      if (char == CHAR_0) {
+      if (digit == 0) {
         position++;
-        if (position == length) break parsing;
-        char = source.codeUnitAt(position);
-        if (CHAR_0 <= char && char <= CHAR_9) {
-          fail(position);
-        }
+        if (position == length) return beginChunkNumber(NUM_ZERO, start);
+        char = getChar(position);
+        digit = char ^ CHAR_0;
+        // If starting with zero, next character must not be digit.
+        if (digit <= 9) fail(position);
       } else {
         do {
-          intValue = intValue * 10 + (char - CHAR_0);
+          intValue = 10 * intValue + digit;
           position++;
-          if (position == length) break parsing;
-          char = source.codeUnitAt(position);
-        } while (CHAR_0 <= char && char <= CHAR_9);
+          if (position == length) return beginChunkNumber(NUM_DIGIT, start);
+          char = getChar(position);
+          digit = char ^ CHAR_0;
+        } while (digit <= 9);
       }
       if (char == DECIMALPOINT) {
         isDouble = true;
+        doubleValue = intValue.toDouble();
+        intValue = 0;
         position++;
-        if (position == length) fail(position, "Missing expected digit");
-        char = source.codeUnitAt(position);
-        if (char < CHAR_0 || char > CHAR_9) fail(position);
+        if (position == length) return beginChunkNumber(NUM_DOT, start);
+        char = getChar(position);
+        digit = char ^ CHAR_0;
+        if (digit > 9) fail(position);
         do {
+          doubleValue = 10.0 * doubleValue + digit;
+          intValue -= 1;
           position++;
-          if (position == length) break parsing;
-          char = source.codeUnitAt(position);
-        } while (CHAR_0 <= char && char <= CHAR_9);
+          if (position == length) return beginChunkNumber(NUM_DOT_DIGIT, start);
+          char = getChar(position);
+          digit = char ^ CHAR_0;
+        } while (digit <= 9);
       }
-      if (char == CHAR_e || char == CHAR_E) {
-        isDouble = true;
-        position++;
-        if (position == length) fail(position, "Missing expected digit");
-        char = source.codeUnitAt(position);
-        if (char == PLUS || char == MINUS) {
-          position++;
-          if (position == length) fail(position, "Missing expected digit");
-          char = source.codeUnitAt(position);
+      if ((char | 0x20) == CHAR_e) {
+        if (!isDouble) {
+          doubleValue = intValue.toDouble();
+          intValue = 0;
+          isDouble = true;
         }
-        if (char < CHAR_0 || char > CHAR_9) {
+        position++;
+        if (position == length) return beginChunkNumber(NUM_E, start);
+        char = getChar(position);
+        int expSign = 1;
+        int exponent = 0;
+        if (char == PLUS || char == MINUS) {
+          expSign = 0x2C - char;  // -1 for MINUS, +1 for PLUS
+          position++;
+          if (position == length) return beginChunkNumber(NUM_E_SIGN, start);
+          char = getChar(position);
+        }
+        digit = char ^ CHAR_0;
+        if (digit > 9) {
           fail(position, "Missing expected digit");
         }
         do {
+          exponent = 10 * exponent + digit;
           position++;
-          if (position == length) break parsing;
-          char = source.codeUnitAt(position);
-        } while (CHAR_0 <= char && char <= CHAR_9);
+          if (position == length) return beginChunkNumber(NUM_E_DIGIT, start);
+          char = getChar(position);
+          digit = char ^ CHAR_0;
+        } while (digit <= 9);
+        intValue += expSign * exponent;
       }
     }
     if (!isDouble) {
-      listener.handleNumber(intSign * intValue);
+      listener.handleNumber(sign * intValue);
       return position;
     }
-    // This correctly creates -0.0 for doubles.
-    listener.handleNumber(_parseDouble(source, start, position));
+    // Double values at or above this value (2**53) may have lost precission.
+    // Only trust results that are below this value.
+    const double maxExactDouble = 9007199254740992.0;
+    if (doubleValue < maxExactDouble) {
+      int exponent = intValue;
+      double signedMantissa = doubleValue * sign;
+      if (exponent >= -22) {
+        if (exponent < 0) {
+          listener.handleNumber(signedMantissa / POWERS_OF_TEN[-exponent]);
+          return position;
+        }
+        if (exponent == 0) {
+          listener.handleNumber(signedMantissa);
+          return position;
+        }
+        if (exponent <= 22) {
+          listener.handleNumber(signedMantissa * POWERS_OF_TEN[exponent]);
+          return position;
+        }
+      }
+    }
+    // If the value is outside the range +/-maxExactDouble or
+    // exponent is outside the range +/-22, then we can't trust simple double
+    // arithmetic to get the exact result, so we use the system double parsing.
+    listener.handleNumber(parseDouble(start, position));
     return position;
   }
 
-  static double _parseDouble(String source, int start, int end)
-      native "Double_parse";
+  int fail(int position, [String message]) {
+    if (message == null) {
+      message = "Unexpected character";
+      if (position == chunkEnd) message = "Unexpected end of input";
+    }
+    throw new FormatException(message, chunk, position);
+  }
+}
 
-  void fail(int position, [String message]) {
-    if (message == null) message = "Unexpected character";
-    throw new FormatException(message, source, position);
+/**
+ * Chunked JSON parser that parses [String] chunks.
+ */
+class _JsonStringParser extends _ChunkedJsonParser {
+  String chunk;
+  int chunkEnd;
+
+  _JsonStringParser(_JsonListener listener) : super(listener);
+
+  int getChar(int position) => chunk.codeUnitAt(position);
+
+  String getString(int start, int end) {
+    return chunk.substring(start, end);
+  }
+
+  void beginString() {
+    this.buffer = new StringBuffer();
+  }
+
+  void addSliceToString(int start, int end) {
+    StringBuffer buffer = this.buffer;
+    buffer.write(chunk.substring(start, end));
+  }
+
+  void addCharToString(int charCode) {
+    StringBuffer buffer = this.buffer;
+    buffer.writeCharCode(charCode);
+  }
+
+  String endString() {
+    StringBuffer buffer = this.buffer;
+    this.buffer = null;
+    return buffer.toString();
+  }
+
+  void copyCharsToList(int start, int end, List target, int offset) {
+    int length = end - start;
+    for (int i = 0; i < length; i++) {
+      target[offset + i] = chunk.codeUnitAt(start + i);
+    }
+  }
+
+  double parseDouble(int start, int end) {
+    return _parseDouble(chunk, start, end);
+  }
+}
+
+patch class JsonDecoder {
+  /* patch */ StringConversionSink startChunkedConversion(Sink<Object> sink) {
+    return new _JsonStringDecoderSink(this._reviver, sink);
+  }
+}
+
+/**
+ * Implements the chunked conversion from a JSON string to its corresponding
+ * object.
+ *
+ * The sink only creates one object, but its input can be chunked.
+ */
+class _JsonStringDecoderSink extends StringConversionSinkBase {
+  _ChunkedJsonParser _parser;
+  Function _reviver;
+  final Sink<Object> _sink;
+
+  _JsonStringDecoderSink(reviver, this._sink)
+      : _reviver = reviver, _parser = _createParser(reviver);
+
+  static _ChunkedJsonParser _createParser(reviver) {
+    _BuildJsonListener listener;
+    if (reviver == null) {
+      listener = new _BuildJsonListener();
+    } else {
+      listener = new _ReviverJsonListener(reviver);
+    }
+    return new _JsonStringParser(listener);
+  }
+
+  void addSlice(String chunk, int start, int end, bool isLast) {
+    _parser.chunk = chunk;
+    _parser.chunkEnd = end;
+    _parser.parse(start);
+    if (isLast) _parser.close();
+  }
+
+  void add(String chunk) {
+    addSlice(chunk, 0, chunk.length, false);
+  }
+
+  void close() {
+    _parser.close();
+    var decoded = _parser.result;
+    _sink.add(decoded);
+    _sink.close();
+  }
+
+  ByteConversionSink asUtf8Sink(bool allowMalformed) {
+    _parser = null;
+    return new _JsonUtf8DecoderSink(_reviver, _sink, allowMalformed);
+  }
+}
+
+class _Utf8StringBuffer {
+  static const int INITIAL_CAPACITY = 32;
+  // Partial state encoding.
+  static const int MASK_TWO_BIT = 0x03;
+  static const int MASK_SIZE = MASK_TWO_BIT;
+  static const int SHIFT_MISSING = 2;
+  static const int SHIFT_VALUE = 4;
+  static const int NO_PARTIAL = 0;
+
+  // UTF-8 encoding and limits.
+  static const int MAX_ASCII = 127;
+  static const int MAX_TWO_BYTE = 0x7ff;
+  static const int MAX_THREE_BYTE = 0xffff;
+  static const int MAX_UNICODE = 0X10ffff;
+  static const int MASK_TWO_BYTE = 0x1f;
+  static const int MASK_THREE_BYTE = 0x0f;
+  static const int MASK_FOUR_BYTE = 0x07;
+  static const int MASK_CONTINUE_TAG = 0xC0;
+  static const int MASK_CONTINUE_VALUE = 0x3f;
+  static const int CONTINUE_TAG = 0x80;
+
+  // UTF-16 surrogate encoding.
+  static const int LEAD_SURROGATE = 0xD800;
+  static const int TAIL_SURROGATE = 0xDC00;
+  static const int SHIFT_HIGH_SURROGATE = 10;
+  static const int MASK_LOW_SURROGATE = 0x3ff;
+
+  // The internal buffer starts as Uint8List, but may change to Uint16List
+  // if the string contains non-Latin-1 characters.
+  List<int> buffer = new Uint8List(INITIAL_CAPACITY);
+  // Number of elements in buffer.
+  int length = 0;
+  // Partial decoding state, for cases where an UTF-8 sequences is split
+  // between chunks.
+  int partialState = NO_PARTIAL;
+  // Whether all characters so far have been Latin-1 (and the buffer is
+  // still a Uint8List). Set to false when the first non-Latin-1 character
+  // is encountered, and the buffer is then also converted to a Uint16List.
+  bool isLatin1 = true;
+  // If allowing malformed, invalid UTF-8 sequences are converted to
+  // U+FFFD.
+  bool allowMalformed;
+
+  _Utf8StringBuffer(this.allowMalformed);
+
+  /**
+   * Parse the continuation of a multi-byte UTF-8 sequence.
+   *
+   * Parse [utf8] from [position] to [end]. If the sequence extends beyond
+   * `end`, store the partial state in [partialState], and continue from there
+   * on the next added slice.
+   *
+   * The [size] is the number of expected continuation bytes total,
+   * and [missing] is the number of remaining continuation bytes.
+   * The [size] is used to detect overlong encodings.
+   * The [value] is the value collected so far.
+   *
+   * When called after seeing the first multi-byte marker, the [size] and
+   * [missing] values are always the same, but they may differ if continuing
+   * after a partial sequence.
+   */
+  int addContinuation(List<int> utf8, int position, int end,
+                      int size, int missing, int value) {
+    int codeEnd = position + missing;
+    do {
+      if (position == end) {
+        missing = codeEnd - position;
+        partialState =
+            size | (missing << SHIFT_MISSING) | (value << SHIFT_VALUE);
+        return end;
+      }
+      int char = utf8[position];
+      if ((char & MASK_CONTINUE_TAG) != CONTINUE_TAG) {
+        if (allowMalformed) {
+          addCharCode(0xFFFD);
+          return position;
+        }
+        throw new FormatException("Expected UTF-8 continuation byte, "
+                                  "found $char", utf8, position);
+      }
+      value = 64 * value + (char & MASK_CONTINUE_VALUE);
+      position++;
+    } while (position < codeEnd);
+    if (value <= const [0, MAX_ASCII, MAX_TWO_BYTE, MAX_THREE_BYTE][size]) {
+      // Over-long encoding.
+      if (allowMalformed) {
+        value = 0xFFFD;
+      } else {
+        throw new FormatException(
+            "Invalid encoding: U+${value.toRadixString(16).padLeft(4, '0')}"
+            " encoded in ${size + 1} bytes.", utf8, position - 1);
+      }
+    }
+    addCharCode(value);
+    return position;
+  }
+
+  void addCharCode(int char) {
+    assert(char >= 0);
+    assert(char <= MAX_UNICODE);
+    if (partialState != NO_PARTIAL) {
+      if (allowMalformed) {
+        partialState = NO_PARTIAL;
+        addCharCode(0xFFFD);
+      } else {
+        throw new FormatException("Incomplete UTF-8 sequence", utf8);
+      }
+    }
+    if (isLatin1 && char > 0xff) {
+      _to16Bit();  // Also grows a little if close to full.
+    }
+    int length = this.length;
+    if (char <= MAX_THREE_BYTE) {
+      if (length == buffer.length) _grow();
+      buffer[length] = char;
+      this.length = length + 1;
+      return;
+    }
+    if (length + 2 > buffer.length) _grow();
+    int bits = char - 0x10000;
+    buffer[length] = LEAD_SURROGATE | (bits >> SHIFT_HIGH_SURROGATE);
+    buffer[length + 1] = TAIL_SURROGATE | (bits & MASK_LOW_SURROGATE);
+    this.length = length + 2;
+  }
+
+  void _to16Bit() {
+    assert(isLatin1);
+    Uint16List newBuffer;
+    if ((length + INITIAL_CAPACITY) * 2 <= buffer.length) {
+      // Reuse existing buffer if it's big enough.
+      newBuffer = new Uint16List.view(buffer.buffer);
+    } else {
+      int newCapacity = buffer.length;
+      if (newCapacity - length < INITIAL_CAPACITY) {
+        newCapacity = length + INITIAL_CAPACITY;
+      }
+      newBuffer = new Uint16List(newCapacity);
+    }
+    newBuffer.setRange(0, length, buffer);
+    buffer = newBuffer;
+    isLatin1 = false;
+  }
+
+  void _grow() {
+    int newCapacity = buffer.length * 2;
+    List newBuffer;
+    if (isLatin1) {
+      newBuffer = new Uint8List(newCapacity);
+    } else {
+      newBuffer = new Uint16List(newCapacity);
+    }
+    newBuffer.setRange(0, length, buffer);
+    buffer = newBuffer;
+  }
+
+  void addSlice(List<int> utf8, int position, int end) {
+    assert(position < end);
+    if (partialState > 0) {
+      int continueByteCount = (partialState & MASK_TWO_BIT);
+      int missing = (partialState >> SHIFT_MISSING) & MASK_TWO_BIT;
+      int value = partialState >> SHIFT_VALUE;
+      partialState = NO_PARTIAL;
+      position = addContinuation(utf8, position, end,
+                                 continueByteCount, missing, value);
+      if (position == end) return;
+    }
+    // Keep index and capacity in local variables while looping over
+    // ASCII characters.
+    int index = length;
+    int capacity = buffer.length;
+    while (position < end) {
+      int char = utf8[position];
+      if (char <= MAX_ASCII) {
+        if (index == capacity) {
+          length = index;
+          _grow();
+          capacity = buffer.length;
+        }
+        buffer[index++] = char;
+        position++;
+        continue;
+      }
+      length = index;
+      if ((char & MASK_CONTINUE_TAG) == CONTINUE_TAG) {
+        if (allowMalformed) {
+          addCharCode(0xFFFD);
+          position++;
+        } else {
+          throw new FormatException("Unexepected UTF-8 continuation byte",
+                                    utf8, position);
+        }
+      } else if (char < 0xE0) {  // C0-DF
+        // Two-byte.
+        position = addContinuation(utf8, position + 1, end, 1, 1,
+                                   char & MASK_TWO_BYTE);
+      } else if (char < 0xF0) {  // E0-EF
+        // Three-byte.
+        position = addContinuation(utf8, position + 1, end, 2, 2,
+                                   char & MASK_THREE_BYTE);
+      } else if (char < 0xF8) {  // F0-F7
+        // Four-byte.
+        position = addContinuation(utf8, position + 1, end, 3, 3,
+                                   char & MASK_FOUR_BYTE);
+      } else {
+        if (allowMalformed) {
+          addCharCode(0xFFFD);
+          position++;
+        } else {
+          throw new FormatException("Invalid UTF-8 byte: $char",
+                                    utf8, position);
+        }
+      }
+      index = length;
+      capacity = buffer.length;
+    }
+    length = index;
+  }
+
+  String toString() {
+    if (partialState != NO_PARTIAL) {
+      if (allowMalformed) {
+        partialState = NO_PARTIAL;
+        addCharCode(0xFFFD);
+      } else {
+        int continueByteCount = (partialState & MASK_TWO_BIT);
+        int missing = (partialState >> SHIFT_MISSING) & MASK_TWO_BIT;
+        int value = partialState >> SHIFT_VALUE;
+        int seenByteCount = continueByteCount - missing + 1;
+        List source = new Uint8List(seenByteCount);
+        while (seenByteCount > 1) {
+          seenByteCount--;
+          source[seenByteCount] = CONTINUE_TAG | (value & MASK_CONTINUE_VALUE);
+          value >>= 6;
+        }
+        source[0] = value | (0x3c0 >> (continueByteCount - 1));
+        throw new FormatException("Incomplete UTF-8 sequence",
+                                  source, source.length);
+      }
+    }
+    return new String.fromCharCodes(buffer, 0, length);
+  }
+}
+
+/**
+ * Chunked JSON parser that parses UTF-8 chunks.
+ */
+class _JsonUtf8Parser extends _ChunkedJsonParser {
+  final bool allowMalformed;
+  List<int> chunk;
+  int chunkEnd;
+
+  _JsonUtf8Parser(_JsonListener listener, this.allowMalformed)
+      : super(listener);
+
+  int getChar(int position) => chunk[position];
+
+  String getString(int start, int end) {
+    beginString();
+    if (start < end) addSliceToString(start, end);
+    String result = endString();
+    return result;
+  }
+
+  void beginString() {
+    this.buffer = new _Utf8StringBuffer(allowMalformed);
+  }
+
+  void addSliceToString(int start, int end) {
+    _Utf8StringBuffer buffer = this.buffer;
+    buffer.addSlice(chunk, start, end);
+  }
+
+  void addCharToString(int charCode) {
+    _Utf8StringBuffer buffer = this.buffer;
+    buffer.addCharCode(charCode);
+  }
+
+  String endString() {
+    _Utf8StringBuffer buffer = this.buffer;
+    this.buffer = null;
+    return buffer.toString();
+  }
+
+  void copyCharsToList(int start, int end, List target, int offset) {
+    int length = end - start;
+    target.setRange(offset, offset + length, chunk, start);
+  }
+
+  double parseDouble(int start, int end) {
+    String string = getString(start, end);
+    return _parseDouble(string, 0, string.length);
+  }
+}
+
+double _parseDouble(String source, int start, int end)
+    native "Double_parse";
+
+/**
+ * Implements the chunked conversion from a UTF-8 encoding of JSON
+ * to its corresponding object.
+ */
+class _JsonUtf8DecoderSink extends ByteConversionSinkBase {
+  _JsonUtf8Parser _parser;
+  final Sink<Object> _sink;
+
+  _JsonUtf8DecoderSink(reviver, this._sink, bool allowMalformed)
+      : _parser = _createParser(reviver, allowMalformed);
+
+  static _ChunkedJsonParser _createParser(reviver, bool allowMalformed) {
+    _BuildJsonListener listener;
+    if (reviver == null) {
+      listener = new _BuildJsonListener();
+    } else {
+      listener = new _ReviverJsonListener(reviver);
+    }
+    return new _JsonUtf8Parser(listener, allowMalformed);
+  }
+
+  void addSlice(List<int> chunk, int start, int end, bool isLast) {
+    _addChunk(chunk, start, end);
+    if (isLast) close();
+  }
+
+  void add(List<int> chunk) {
+    _addChunk(chunk, 0, chunk.length);
+  }
+
+  void _addChunk(List<int> chunk, int start, int end) {
+    _parser.chunk = chunk;
+    _parser.chunkEnd = end;
+    _parser.parse(start);
+  }
+
+  void close() {
+    _parser.close();
+    var decoded = _parser.result;
+    _sink.add(decoded);
+    _sink.close();
   }
 }
diff --git a/runtime/lib/double_patch.dart b/runtime/lib/double_patch.dart
index f00a833..f33122a 100644
--- a/runtime/lib/double_patch.dart
+++ b/runtime/lib/double_patch.dart
@@ -80,33 +80,7 @@
     }
     if (!digitsSeen) return null;  // No digits.
     if (exponent == 0) return sign * doubleValue;
-    // Powers of 10 up to 10^22 are representable as doubles.
-    // Powers of 10 above that are only approximate due to lack of precission.
-    const P10 = const [
-                            1.0,  /*  0 */
-                           10.0,
-                          100.0,
-                         1000.0,
-                        10000.0,
-                       100000.0,  /*  5 */
-                      1000000.0,
-                     10000000.0,
-                    100000000.0,
-                   1000000000.0,
-                  10000000000.0,  /* 10 */
-                 100000000000.0,
-                1000000000000.0,
-               10000000000000.0,
-              100000000000000.0,
-             1000000000000000.0,  /*  15 */
-            10000000000000000.0,
-           100000000000000000.0,
-          1000000000000000000.0,
-         10000000000000000000.0,
-        100000000000000000000.0,  /*  20 */
-       1000000000000000000000.0,
-      10000000000000000000000.0,
-    ];
+    const P10 = POWERS_OF_TEN;  // From shared library
     if (exponent < 0) {
       int negExponent = -exponent;
       if (negExponent >= P10.length) return null;
diff --git a/runtime/vm/assembler_arm64.cc b/runtime/vm/assembler_arm64.cc
index 5ce11e9..34eb8d8 100644
--- a/runtime/vm/assembler_arm64.cc
+++ b/runtime/vm/assembler_arm64.cc
@@ -61,35 +61,35 @@
       patchable_pool_entries_.Add(kNotPatchable);
     }
 
-    if (StubCode::CallToRuntime_entry() != NULL) {
-      FindExternalLabel(&StubCode::CallToRuntimeLabel(), kNotPatchable);
+    if (stub_code->CallToRuntime_entry() != NULL) {
+      FindExternalLabel(&stub_code->CallToRuntimeLabel(), kNotPatchable);
     } else {
       object_pool_.Add(vacant, Heap::kOld);
       patchable_pool_entries_.Add(kNotPatchable);
     }
 
     // Create fixed object pool entries for debugger stubs.
-    if (StubCode::ICCallBreakpoint_entry() != NULL) {
+    if (stub_code->ICCallBreakpoint_entry() != NULL) {
       intptr_t index =
-          FindExternalLabel(&StubCode::ICCallBreakpointLabel(),
+          FindExternalLabel(&stub_code->ICCallBreakpointLabel(),
                             kNotPatchable);
       ASSERT(index == kICCallBreakpointCPIndex);
     } else {
       object_pool_.Add(vacant, Heap::kOld);
       patchable_pool_entries_.Add(kNotPatchable);
     }
-    if (StubCode::ClosureCallBreakpoint_entry() != NULL) {
+    if (stub_code->ClosureCallBreakpoint_entry() != NULL) {
       intptr_t index =
-          FindExternalLabel(&StubCode::ClosureCallBreakpointLabel(),
+          FindExternalLabel(&stub_code->ClosureCallBreakpointLabel(),
                             kNotPatchable);
       ASSERT(index == kClosureCallBreakpointCPIndex);
     } else {
       object_pool_.Add(vacant, Heap::kOld);
       patchable_pool_entries_.Add(kNotPatchable);
     }
-    if (StubCode::RuntimeCallBreakpoint_entry() != NULL) {
+    if (stub_code->RuntimeCallBreakpoint_entry() != NULL) {
       intptr_t index =
-          FindExternalLabel(&StubCode::RuntimeCallBreakpointLabel(),
+          FindExternalLabel(&stub_code->RuntimeCallBreakpointLabel(),
                             kNotPatchable);
       ASSERT(index == kRuntimeCallBreakpointCPIndex);
     } else {
diff --git a/runtime/vm/assembler_x64.cc b/runtime/vm/assembler_x64.cc
index f6197ec..336baf3 100644
--- a/runtime/vm/assembler_x64.cc
+++ b/runtime/vm/assembler_x64.cc
@@ -58,35 +58,35 @@
       patchable_pool_entries_.Add(kNotPatchable);
     }
 
-    if (StubCode::CallToRuntime_entry() != NULL) {
-      FindExternalLabel(&StubCode::CallToRuntimeLabel(), kNotPatchable);
+    if (stub_code->CallToRuntime_entry() != NULL) {
+      FindExternalLabel(&stub_code->CallToRuntimeLabel(), kNotPatchable);
     } else {
       object_pool_.Add(vacant, Heap::kOld);
       patchable_pool_entries_.Add(kNotPatchable);
     }
 
     // Create fixed object pool entries for debugger stubs.
-    if (StubCode::ICCallBreakpoint_entry() != NULL) {
+    if (stub_code->ICCallBreakpoint_entry() != NULL) {
       intptr_t index =
-          FindExternalLabel(&StubCode::ICCallBreakpointLabel(),
+          FindExternalLabel(&stub_code->ICCallBreakpointLabel(),
                             kNotPatchable);
       ASSERT(index == kICCallBreakpointCPIndex);
     } else {
       object_pool_.Add(vacant, Heap::kOld);
       patchable_pool_entries_.Add(kNotPatchable);
     }
-    if (StubCode::ClosureCallBreakpoint_entry() != NULL) {
+    if (stub_code->ClosureCallBreakpoint_entry() != NULL) {
       intptr_t index =
-          FindExternalLabel(&StubCode::ClosureCallBreakpointLabel(),
+          FindExternalLabel(&stub_code->ClosureCallBreakpointLabel(),
                             kNotPatchable);
       ASSERT(index == kClosureCallBreakpointCPIndex);
     } else {
       object_pool_.Add(vacant, Heap::kOld);
       patchable_pool_entries_.Add(kNotPatchable);
     }
-    if (StubCode::RuntimeCallBreakpoint_entry() != NULL) {
+    if (stub_code->RuntimeCallBreakpoint_entry() != NULL) {
       intptr_t index =
-          FindExternalLabel(&StubCode::RuntimeCallBreakpointLabel(),
+          FindExternalLabel(&stub_code->RuntimeCallBreakpointLabel(),
                             kNotPatchable);
       ASSERT(index == kRuntimeCallBreakpointCPIndex);
     } else {
diff --git a/runtime/vm/atomic.h b/runtime/vm/atomic.h
index 85ef846..c256fe5 100644
--- a/runtime/vm/atomic.h
+++ b/runtime/vm/atomic.h
@@ -8,6 +8,7 @@
 #include "platform/globals.h"
 
 #include "vm/allocation.h"
+#include "vm/simulator.h"
 
 namespace dart {
 
@@ -15,6 +16,9 @@
  public:
   // Atomically fetch the value at p and increment the value at p.
   // Returns the original value at p.
+  //
+  // NOTE: Not to be used for any atomic operations involving memory locations
+  // that are accessed by generated code
   static uintptr_t FetchAndIncrement(uintptr_t* p);
 
   static uword CompareAndSwapWord(uword* ptr, uword old_value, uword new_value);
@@ -23,6 +27,10 @@
 
 }  // namespace dart
 
+// We need to use the simulator to ensure that atomic operations are observed
+// both in C++ and in generated code if the simulator is active.
+#include "vm/atomic_simulator.h"
+
 #if defined(TARGET_OS_ANDROID)
 #include "vm/atomic_android.h"
 #elif defined(TARGET_OS_LINUX)
diff --git a/runtime/vm/atomic_android.h b/runtime/vm/atomic_android.h
index a041409..06208f2 100644
--- a/runtime/vm/atomic_android.h
+++ b/runtime/vm/atomic_android.h
@@ -21,11 +21,13 @@
 }
 
 
+#if !defined(USING_SIMULATOR)
 inline uword AtomicOperations::CompareAndSwapWord(uword* ptr,
                                                   uword old_value,
                                                   uword new_value) {
   return __sync_val_compare_and_swap(ptr, old_value, new_value);
 }
+#endif  // !defined(USING_SIMULATOR)
 
 }  // namespace dart
 
diff --git a/runtime/vm/atomic_linux.h b/runtime/vm/atomic_linux.h
index da7102b..9789ae5 100644
--- a/runtime/vm/atomic_linux.h
+++ b/runtime/vm/atomic_linux.h
@@ -21,11 +21,13 @@
 }
 
 
+#if !defined(USING_SIMULATOR)
 inline uword AtomicOperations::CompareAndSwapWord(uword* ptr,
                                                   uword old_value,
                                                   uword new_value) {
   return __sync_val_compare_and_swap(ptr, old_value, new_value);
 }
+#endif  // !defined(USING_SIMULATOR)
 
 }  // namespace dart
 
diff --git a/runtime/vm/atomic_macos.h b/runtime/vm/atomic_macos.h
index 649384a..288fe3c 100644
--- a/runtime/vm/atomic_macos.h
+++ b/runtime/vm/atomic_macos.h
@@ -21,11 +21,13 @@
 }
 
 
+#if !defined(USING_SIMULATOR)
 inline uword AtomicOperations::CompareAndSwapWord(uword* ptr,
                                                   uword old_value,
                                                   uword new_value) {
   return __sync_val_compare_and_swap(ptr, old_value, new_value);
 }
+#endif  // !defined(USING_SIMULATOR)
 
 }  // namespace dart
 
diff --git a/runtime/vm/atomic_simulator.h b/runtime/vm/atomic_simulator.h
new file mode 100644
index 0000000..26cde3c
--- /dev/null
+++ b/runtime/vm/atomic_simulator.h
@@ -0,0 +1,25 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#ifndef VM_ATOMIC_SIMULATOR_H_
+#define VM_ATOMIC_SIMULATOR_H_
+
+#if !defined VM_ATOMIC_H_
+#error Do not include atomic_simulator.h directly. Use atomic.h instead.
+#endif
+
+namespace dart {
+
+#if defined(USING_SIMULATOR)
+// Forward atomic operations to the simulator if the simulator is active.
+inline uword AtomicOperations::CompareAndSwapWord(uword* ptr,
+                                                  uword old_value,
+                                                  uword new_value) {
+  return Simulator::CompareExchange(ptr, old_value, new_value);
+}
+#endif  // defined(USING_SIMULATOR)
+
+}  // namespace dart
+
+#endif  // VM_ATOMIC_SIMULATOR_H_
diff --git a/runtime/vm/atomic_win.h b/runtime/vm/atomic_win.h
index 6124803..24be3b1 100644
--- a/runtime/vm/atomic_win.h
+++ b/runtime/vm/atomic_win.h
@@ -28,6 +28,7 @@
 }
 
 
+#if !defined(USING_SIMULATOR)
 inline uword AtomicOperations::CompareAndSwapWord(uword* ptr,
                                                   uword old_value,
                                                   uword new_value) {
@@ -45,6 +46,7 @@
   UNIMPLEMENTED();
 #endif
 }
+#endif  // !defined(USING_SIMULATOR)
 
 }  // namespace dart
 
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index 71a8b8e..b8827c5b 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -1547,6 +1547,13 @@
 }
 
 
+DART_EXPORT bool Dart_HasServiceMessages() {
+  Isolate* isolate = Isolate::Current();
+  ASSERT(isolate);
+  return isolate->message_handler()->HasOOBMessages();
+}
+
+
 DART_EXPORT bool Dart_HasLivePorts() {
   Isolate* isolate = Isolate::Current();
   ASSERT(isolate);
diff --git a/runtime/vm/dart_entry.cc b/runtime/vm/dart_entry.cc
index 129b927..80d54a4 100644
--- a/runtime/vm/dart_entry.cc
+++ b/runtime/vm/dart_entry.cc
@@ -33,7 +33,6 @@
                                      const Array& arguments_descriptor) {
   const Context& context =
       Context::Handle(Isolate::Current()->object_store()->empty_context());
-  ASSERT(context.isolate() == Isolate::Current());
   return InvokeFunction(function, arguments, arguments_descriptor, context);
 }
 
diff --git a/runtime/vm/debugger_arm.cc b/runtime/vm/debugger_arm.cc
index 3be4d1e..43d3031 100644
--- a/runtime/vm/debugger_arm.cc
+++ b/runtime/vm/debugger_arm.cc
@@ -42,6 +42,7 @@
   ASSERT(!is_enabled_);
   const Code& code = Code::Handle(code_);
   const Instructions& instrs = Instructions::Handle(code.instructions());
+  Isolate* isolate = Isolate::Current();
   {
     WritableInstructionsScope writable(instrs.EntryPoint(), instrs.size());
     switch (breakpoint_kind_) {
@@ -49,19 +50,19 @@
       case RawPcDescriptors::kUnoptStaticCall: {
         saved_value_ = CodePatcher::GetStaticCallTargetAt(pc_, code);
         CodePatcher::PatchStaticCallAt(
-            pc_, code, StubCode::ICCallBreakpointEntryPoint());
+            pc_, code, isolate->stub_code()->ICCallBreakpointEntryPoint());
         break;
       }
       case RawPcDescriptors::kClosureCall: {
         saved_value_ = CodePatcher::GetStaticCallTargetAt(pc_, code);
         CodePatcher::PatchStaticCallAt(
-            pc_, code, StubCode::ClosureCallBreakpointEntryPoint());
+            pc_, code, isolate->stub_code()->ClosureCallBreakpointEntryPoint());
         break;
       }
       case RawPcDescriptors::kRuntimeCall: {
         saved_value_ = CodePatcher::GetStaticCallTargetAt(pc_, code);
         CodePatcher::PatchStaticCallAt(
-            pc_, code, StubCode::RuntimeCallBreakpointEntryPoint());
+            pc_, code, isolate->stub_code()->RuntimeCallBreakpointEntryPoint());
         break;
       }
       default:
diff --git a/runtime/vm/debugger_ia32.cc b/runtime/vm/debugger_ia32.cc
index 8798e38..ed6c944 100644
--- a/runtime/vm/debugger_ia32.cc
+++ b/runtime/vm/debugger_ia32.cc
@@ -46,6 +46,7 @@
   ASSERT(!is_enabled_);
   const Code& code = Code::Handle(code_);
   const Instructions& instrs = Instructions::Handle(code.instructions());
+  Isolate* isolate = Isolate::Current();
   {
     WritableInstructionsScope writable(instrs.EntryPoint(), instrs.size());
     switch (breakpoint_kind_) {
@@ -53,19 +54,19 @@
       case RawPcDescriptors::kUnoptStaticCall: {
         saved_value_ = CodePatcher::GetStaticCallTargetAt(pc_, code);
         CodePatcher::PatchStaticCallAt(
-            pc_, code, StubCode::ICCallBreakpointEntryPoint());
+            pc_, code, isolate->stub_code()->ICCallBreakpointEntryPoint());
         break;
       }
       case RawPcDescriptors::kClosureCall: {
         saved_value_ = CodePatcher::GetStaticCallTargetAt(pc_, code);
         CodePatcher::PatchStaticCallAt(
-            pc_, code, StubCode::ClosureCallBreakpointEntryPoint());
+            pc_, code, isolate->stub_code()->ClosureCallBreakpointEntryPoint());
         break;
       }
       case RawPcDescriptors::kRuntimeCall: {
         saved_value_ = CodePatcher::GetStaticCallTargetAt(pc_, code);
         CodePatcher::PatchStaticCallAt(
-            pc_, code, StubCode::RuntimeCallBreakpointEntryPoint());
+            pc_, code, isolate->stub_code()->RuntimeCallBreakpointEntryPoint());
         break;
       }
       default:
diff --git a/runtime/vm/debugger_mips.cc b/runtime/vm/debugger_mips.cc
index 7caa461..eb11fbc 100644
--- a/runtime/vm/debugger_mips.cc
+++ b/runtime/vm/debugger_mips.cc
@@ -42,6 +42,7 @@
   ASSERT(!is_enabled_);
   const Code& code = Code::Handle(code_);
   const Instructions& instrs = Instructions::Handle(code.instructions());
+  Isolate* isolate = Isolate::Current();
   {
     WritableInstructionsScope writable(instrs.EntryPoint(), instrs.size());
     switch (breakpoint_kind_) {
@@ -49,19 +50,19 @@
       case RawPcDescriptors::kUnoptStaticCall: {
         saved_value_ = CodePatcher::GetStaticCallTargetAt(pc_, code);
         CodePatcher::PatchStaticCallAt(
-            pc_, code, StubCode::ICCallBreakpointEntryPoint());
+            pc_, code, isolate->stub_code()->ICCallBreakpointEntryPoint());
         break;
       }
       case RawPcDescriptors::kClosureCall: {
         saved_value_ = CodePatcher::GetStaticCallTargetAt(pc_, code);
         CodePatcher::PatchStaticCallAt(
-            pc_, code, StubCode::ClosureCallBreakpointEntryPoint());
+            pc_, code, isolate->stub_code()->ClosureCallBreakpointEntryPoint());
         break;
       }
       case RawPcDescriptors::kRuntimeCall: {
         saved_value_ = CodePatcher::GetStaticCallTargetAt(pc_, code);
         CodePatcher::PatchStaticCallAt(
-            pc_, code, StubCode::RuntimeCallBreakpointEntryPoint());
+            pc_, code, isolate->stub_code()->RuntimeCallBreakpointEntryPoint());
         break;
       }
       default:
diff --git a/runtime/vm/flow_graph_builder.cc b/runtime/vm/flow_graph_builder.cc
index 23f6373..5ae8d6d 100644
--- a/runtime/vm/flow_graph_builder.cc
+++ b/runtime/vm/flow_graph_builder.cc
@@ -1454,12 +1454,15 @@
                             &instantiator,
                             &instantiator_type_arguments);
   }
+
+  const intptr_t deopt_id = Isolate::Current()->GetNextDeoptId();
   return new(I) AssertAssignableInstr(token_pos,
                                       value,
                                       instantiator,
                                       instantiator_type_arguments,
                                       dst_type,
-                                      dst_name);
+                                      dst_name,
+                                      deopt_id);
 }
 
 
diff --git a/runtime/vm/flow_graph_optimizer.cc b/runtime/vm/flow_graph_optimizer.cc
index 0b98367..7a70da4 100644
--- a/runtime/vm/flow_graph_optimizer.cc
+++ b/runtime/vm/flow_graph_optimizer.cc
@@ -1347,11 +1347,8 @@
                                      new(I) Value(instantiator),
                                      new(I) Value(type_args),
                                      value_type,
-                                     Symbols::Value());
-    // Newly inserted instructions that can deoptimize or throw an exception
-    // must have a deoptimization id that is valid for lookup in the unoptimized
-    // code.
-    assert_value->deopt_id_ = call->deopt_id();
+                                     Symbols::Value(),
+                                     call->deopt_id());
     cursor = flow_graph()->AppendTo(cursor,
                                     assert_value,
                                     call->env(),
@@ -3323,8 +3320,7 @@
     return false;
   }
   if (recognized_kind == MethodRecognizer::kFloat32x4Zero) {
-    Float32x4ZeroInstr* zero =
-        new(I) Float32x4ZeroInstr(call->deopt_id());
+    Float32x4ZeroInstr* zero = new(I) Float32x4ZeroInstr();
     ReplaceCall(call, zero);
     return true;
   } else if (recognized_kind == MethodRecognizer::kFloat32x4Splat) {
@@ -3367,8 +3363,7 @@
     return false;
   }
   if (recognized_kind == MethodRecognizer::kFloat64x2Zero) {
-    Float64x2ZeroInstr* zero =
-        new(I) Float64x2ZeroInstr(call->deopt_id());
+    Float64x2ZeroInstr* zero = new(I) Float64x2ZeroInstr();
     ReplaceCall(call, zero);
     return true;
   } else if (recognized_kind == MethodRecognizer::kFloat64x2Splat) {
@@ -4333,11 +4328,8 @@
                                    new(I) Value(instantiator),
                                    new(I) Value(type_args),
                                    type,
-                                   dst_name);
-  // Newly inserted instructions that can deoptimize or throw an exception
-  // must have a deoptimization id that is valid for lookup in the unoptimized
-  // code.
-  assert_as->deopt_id_ = call->deopt_id();
+                                   dst_name,
+                                   call->deopt_id());
   ReplaceCall(call, assert_as);
 }
 
diff --git a/runtime/vm/gc_marker.cc b/runtime/vm/gc_marker.cc
index aad3ebe6..846e0c1 100644
--- a/runtime/vm/gc_marker.cc
+++ b/runtime/vm/gc_marker.cc
@@ -245,8 +245,9 @@
         // If the code wasn't strongly visited through other references
         // after skipping the function's code pointer, then we disconnect the
         // code from the function.
+        StubCode* stub_code = isolate()->stub_code();
         func->ptr()->instructions_ =
-            StubCode::LazyCompile_entry()->code()->ptr()->instructions_;
+            stub_code->LazyCompile_entry()->code()->ptr()->instructions_;
         func->ptr()->unoptimized_code_ = Code::null();
         if (FLAG_log_code_drop) {
           // NOTE: This code runs while GC is in progress and runs within
diff --git a/runtime/vm/il_printer.cc b/runtime/vm/il_printer.cc
index e9eea97..5a34fcc 100644
--- a/runtime/vm/il_printer.cc
+++ b/runtime/vm/il_printer.cc
@@ -662,11 +662,6 @@
 }
 
 
-void Float32x4ZeroInstr::PrintOperandsTo(BufferFormatter* f) const {
-  f->Print("ZERO ");
-}
-
-
 void Float32x4SplatInstr::PrintOperandsTo(BufferFormatter* f) const {
   f->Print("SPLAT ");
   value()->PrintTo(f);
@@ -750,11 +745,6 @@
 }
 
 
-void Float64x2ZeroInstr::PrintOperandsTo(BufferFormatter* f) const {
-  f->Print("Float64x2.zero ");
-}
-
-
 void Float64x2SplatInstr::PrintOperandsTo(BufferFormatter* f) const {
   f->Print("Float64x2.splat ");
   value()->PrintTo(f);
diff --git a/runtime/vm/intermediate_language.cc b/runtime/vm/intermediate_language.cc
index c9c1968..7a80023 100644
--- a/runtime/vm/intermediate_language.cc
+++ b/runtime/vm/intermediate_language.cc
@@ -38,8 +38,9 @@
 DECLARE_FLAG(bool, trace_constant_propagation);
 DECLARE_FLAG(bool, throw_on_javascript_int_overflow);
 
-Definition::Definition()
-    : range_(NULL),
+Definition::Definition(intptr_t deopt_id)
+    : Instruction(deopt_id),
+      range_(NULL),
       type_(NULL),
       temp_index_(-1),
       ssa_temp_index_(-1),
@@ -108,7 +109,8 @@
                                  intptr_t deopt_id,
                                  const ICData& unary_checks,
                                  intptr_t token_pos)
-    : unary_checks_(unary_checks),
+    : TemplateInstruction(deopt_id),
+      unary_checks_(unary_checks),
       cids_(unary_checks.NumberOfChecks()),
       licm_hoisted_(false),
       token_pos_(token_pos) {
@@ -118,7 +120,6 @@
   ASSERT(unary_checks_.NumberOfChecks() > 0);
   ASSERT(unary_checks_.NumArgsTested() == 1);
   SetInputAt(0, value);
-  deopt_id_ = deopt_id;
   // Otherwise use CheckSmiInstr.
   ASSERT((unary_checks_.NumberOfChecks() != 1) ||
          (unary_checks_.GetReceiverClassIdAt(0) != kSmiCid));
@@ -291,7 +292,8 @@
 bool StrictCompareInstr::AttributesEqual(Instruction* other) const {
   StrictCompareInstr* other_op = other->AsStrictCompare();
   ASSERT(other_op != NULL);
-  return kind() == other_op->kind();
+  return ComparisonInstr::AttributesEqual(other) &&
+    (needs_number_check() == other_op->needs_number_check());
 }
 
 
@@ -359,18 +361,6 @@
 }
 
 
-EffectSet LoadIndexedInstr::Dependencies() const {
-  return EffectSet::All();
-}
-
-
-bool LoadIndexedInstr::AttributesEqual(Instruction* other) const {
-  LoadIndexedInstr* other_load = other->AsLoadIndexed();
-  ASSERT(other_load != NULL);
-  return class_id() == other_load->class_id();
-}
-
-
 ConstantInstr::ConstantInstr(const Object& value) : value_(value) {
   // Check that the value is not an incorrect Integer representation.
   ASSERT(!value.IsBigint() || !Bigint::Cast(value).FitsIntoSmi());
@@ -1621,7 +1611,7 @@
                                        Token::kSHL,
                                        left()->CopyWithType(),
                                        new Value(constant_1),
-                                       deopt_id_,
+                                       GetDeoptId(),
                                        can_overflow(),
                                        is_truncating(),
                                        range());
@@ -1659,7 +1649,7 @@
             UnaryIntegerOpInstr::Make(representation(),
                                       Token::kBIT_NOT,
                                       left()->CopyWithType(),
-                                      deopt_id_,
+                                      GetDeoptId(),
                                       range());
         if (bit_not != NULL) {
           flow_graph->InsertBefore(this, bit_not, env(), FlowGraph::kValue);
@@ -1682,7 +1672,7 @@
             UnaryIntegerOpInstr::Make(representation(),
                                       Token::kNEGATE,
                                       left()->CopyWithType(),
-                                      deopt_id_,
+                                      GetDeoptId(),
                                       range());
         if (negation != NULL) {
           flow_graph->InsertBefore(this, negation, env(), FlowGraph::kValue);
@@ -1696,7 +1686,7 @@
         return left()->definition();
       } else if (rhs < 0) {
         DeoptimizeInstr* deopt =
-            new DeoptimizeInstr(ICData::kDeoptBinarySmiOp, deopt_id_);
+            new DeoptimizeInstr(ICData::kDeoptBinarySmiOp, GetDeoptId());
         flow_graph->InsertBefore(this, deopt, env(), FlowGraph::kEffect);
         return flow_graph->GetConstant(Smi::Handle(Smi::New(0)));
       }
@@ -1709,7 +1699,7 @@
       } else if ((rhs < 0) || (rhs >= kMaxShift)) {
         if ((rhs < 0) || !is_truncating()) {
           DeoptimizeInstr* deopt =
-              new DeoptimizeInstr(ICData::kDeoptBinarySmiOp, deopt_id_);
+              new DeoptimizeInstr(ICData::kDeoptBinarySmiOp, GetDeoptId());
           flow_graph->InsertBefore(this, deopt, env(), FlowGraph::kEffect);
         }
         return flow_graph->GetConstant(Smi::Handle(Smi::New(0)));
@@ -1960,7 +1950,7 @@
           representation(),
           box_defn->value()->CopyWithType(),
           (representation() == kUnboxedInt32) ?
-              deopt_id_ : Isolate::kNoDeoptId);
+              GetDeoptId() : Isolate::kNoDeoptId);
       if ((representation() == kUnboxedInt32) && is_truncating()) {
         converter->mark_truncating();
       }
@@ -1987,7 +1977,7 @@
         box_defn->from(),
         representation(),
         box_defn->value()->CopyWithType(),
-        (to() == kUnboxedInt32) ? deopt_id_ : Isolate::kNoDeoptId);
+        (to() == kUnboxedInt32) ? GetDeoptId() : Isolate::kNoDeoptId);
     if ((representation() == kUnboxedInt32) && is_truncating()) {
       converter->mark_truncating();
     }
@@ -2004,7 +1994,7 @@
     // and code path that unboxes Mint into Int32. We should just schedule
     // these instructions close to each other instead of fusing them.
     Definition* replacement =
-        new UnboxInt32Instr(unbox_defn->value()->CopyWithType(), deopt_id_);
+        new UnboxInt32Instr(unbox_defn->value()->CopyWithType(), GetDeoptId());
     if (is_truncating()) {
       replacement->AsUnboxInt32()->mark_truncating();
     }
@@ -2495,7 +2485,7 @@
   __ Bind(compiler->GetJumpLabel(this));
   if (!compiler->is_optimizing()) {
     compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt,
-                                   deopt_id_,
+                                   GetDeoptId(),
                                    Scanner::kNoSourcePos);
   }
   if (HasParallelMove()) {
@@ -2521,7 +2511,7 @@
     // uniformity with ARM and MIPS, where we can reuse pattern matching
     // code that matches backwards from the end of the pattern.
     compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt,
-                                   deopt_id_,
+                                   GetDeoptId(),
                                    Scanner::kNoSourcePos);
   }
   if (HasParallelMove()) {
@@ -2727,9 +2717,12 @@
                                        Value* left,
                                        Value* right,
                                        bool needs_number_check)
-    : ComparisonInstr(token_pos, kind, left, right),
+    : ComparisonInstr(token_pos,
+                      kind,
+                      left,
+                      right,
+                      Isolate::Current()->GetNextDeoptId()),
       needs_number_check_(needs_number_check) {
-  deopt_id_ = Isolate::Current()->GetNextDeoptId();
   ASSERT((kind == Token::kEQ_STRICT) || (kind == Token::kNE_STRICT));
 }
 
@@ -3044,8 +3037,7 @@
 
 bool TestCidsInstr::AttributesEqual(Instruction* other) const {
   TestCidsInstr* other_instr = other->AsTestCids();
-  ASSERT(other != NULL);
-  if (kind() != other_instr->kind()) {
+  if (!ComparisonInstr::AttributesEqual(other)) {
     return false;
   }
   if (cid_results().length() != other_instr->cid_results().length()) {
@@ -3216,10 +3208,11 @@
 
 InvokeMathCFunctionInstr::InvokeMathCFunctionInstr(
     ZoneGrowableArray<Value*>* inputs,
-    intptr_t original_deopt_id,
+    intptr_t deopt_id,
     MethodRecognizer::Kind recognized_kind,
     intptr_t token_pos)
-    : inputs_(inputs),
+    : PureDefinition(deopt_id),
+      inputs_(inputs),
       recognized_kind_(recognized_kind),
       token_pos_(token_pos) {
   ASSERT(inputs_->length() == ArgumentCountFor(recognized_kind_));
@@ -3228,7 +3221,6 @@
     (*inputs)[i]->set_instruction(this);
     (*inputs)[i]->set_use_index(i);
   }
-  deopt_id_ = original_deopt_id;
 }
 
 
@@ -3338,9 +3330,10 @@
 
 
 MergedMathInstr::MergedMathInstr(ZoneGrowableArray<Value*>* inputs,
-                                 intptr_t original_deopt_id,
+                                 intptr_t deopt_id,
                                  MergedMathInstr::Kind kind)
-    : inputs_(inputs),
+    : PureDefinition(deopt_id),
+      inputs_(inputs),
       kind_(kind) {
   ASSERT(inputs_->length() == InputCountFor(kind_));
   for (intptr_t i = 0; i < inputs_->length(); ++i) {
@@ -3348,7 +3341,6 @@
     (*inputs)[i]->set_instruction(this);
     (*inputs)[i]->set_use_index(i);
   }
-  deopt_id_ = original_deopt_id;
 }
 
 
diff --git a/runtime/vm/intermediate_language.h b/runtime/vm/intermediate_language.h
index a851006..26733a5 100644
--- a/runtime/vm/intermediate_language.h
+++ b/runtime/vm/intermediate_language.h
@@ -600,8 +600,8 @@
   };
 #undef DECLARE_TAG
 
-  Instruction()
-      : deopt_id_(Isolate::kNoDeoptId),
+  explicit Instruction(intptr_t deopt_id = Isolate::kNoDeoptId)
+      : deopt_id_(deopt_id),
         lifetime_position_(-1),
         previous_(NULL),
         next_(NULL),
@@ -851,108 +851,12 @@
   friend class Definition;  // Needed for InsertBefore, InsertAfter.
   friend class CallSiteInliner;
 
-  // Classes that set or read deopt_id_.
-  friend class UnboxIntegerInstr;
-  friend class UnboxDoubleInstr;
-  friend class UnboxFloat32x4Instr;
-  friend class UnboxFloat64x2Instr;
-  friend class UnboxInt32x4Instr;
-  friend class BinaryDoubleOpInstr;
-  friend class BinaryFloat32x4OpInstr;
-  friend class Float32x4ZeroInstr;
-  friend class Float32x4SplatInstr;
-  friend class Simd32x4ShuffleInstr;
-  friend class Simd32x4ShuffleMixInstr;
-  friend class Simd32x4GetSignMaskInstr;
-  friend class Float32x4ConstructorInstr;
-  friend class Float32x4ComparisonInstr;
-  friend class Float32x4MinMaxInstr;
-  friend class Float32x4ScaleInstr;
-  friend class Float32x4SqrtInstr;
-  friend class Float32x4ZeroArgInstr;
-  friend class Float32x4ClampInstr;
-  friend class Float32x4WithInstr;
-  friend class Float32x4ToInt32x4Instr;
-  friend class Simd64x2ShuffleInstr;
-  friend class Float64x2ZeroArgInstr;
-  friend class Float64x2OneArgInstr;
-  friend class Float32x4ToFloat64x2Instr;
-  friend class Float64x2ToFloat32x4Instr;
-  friend class Float64x2ZeroInstr;
-  friend class Float64x2SplatInstr;
-  friend class Float64x2ConstructorInstr;
-  friend class Int32x4ConstructorInstr;
-  friend class Int32x4BoolConstructorInstr;
-  friend class Int32x4GetFlagInstr;
-  friend class Int32x4SetFlagInstr;
-  friend class Int32x4SelectInstr;
-  friend class Int32x4ToFloat32x4Instr;
-  friend class BinaryInt32x4OpInstr;
-  friend class BinaryFloat64x2OpInstr;
-  friend class UnaryDoubleOpInstr;
-  friend class MathUnaryInstr;
-  friend class MathMinMaxInstr;
-  friend class CheckClassInstr;
-  friend class CheckClassIdInstr;
-  friend class GuardFieldInstr;
-  friend class CheckSmiInstr;
-  friend class CheckArrayBoundInstr;
-  friend class CheckEitherNonSmiInstr;
+  // deopt_id_ write access.
+  friend class ComparisonInstr;
   friend class LICM;
   friend class Scheduler;
-  friend class DoubleToSmiInstr;
-  friend class DoubleToDoubleInstr;
-  friend class DoubleToFloatInstr;
-  friend class FloatToDoubleInstr;
-  friend class InvokeMathCFunctionInstr;
-  friend class MergedMathInstr;
-  friend class FlowGraphOptimizer;
-  friend class LoadIndexedInstr;
-  friend class StoreIndexedInstr;
-  friend class StoreInstanceFieldInstr;
-  friend class ComparisonInstr;
-  friend class TargetEntryInstr;
-  friend class JoinEntryInstr;
-  friend class InstanceOfInstr;
-  friend class PolymorphicInstanceCallInstr;
-  friend class SmiToDoubleInstr;
-  friend class MintToDoubleInstr;
-  friend class DoubleToIntegerInstr;
-  friend class BranchSimplifier;
   friend class BlockEntryInstr;
-  friend class RelationalOpInstr;
-  friend class EqualityCompareInstr;
-  friend class TestCidsInstr;
-  friend class UnboxIntNInstr;
-  friend class UnboxInt32Instr;
-  friend class UnboxUint32Instr;
-  friend class UnboxedIntConverterInstr;
-  friend class UnaryIntegerOpInstr;
-  friend class BinaryIntegerOpInstr;
-  friend class DeoptimizeInstr;
-
-  // deopt_id_ access.
-  friend class InstanceCallInstr;
-  friend class StaticCallInstr;
-  friend class GotoInstr;
-  friend class ReturnInstr;
-  friend class BranchInstr;
-  friend class AssertAssignableInstr;
-  friend class TestSmiInstr;
-  friend class IfThenElseInstr;
-  friend class StrictCompareInstr;
-  friend class ThrowInstr;
-  friend class ReThrowInstr;
-  friend class AssertBooleanInstr;
-  friend class CurrentContextInstr;
-  friend class ClosureCallInstr;
-  friend class StringInterpolateInstr;
-  friend class CreateArrayInstr;
-  friend class InstantiateTypeInstr;
-  friend class InstantiateTypeArgumentsInstr;
-  friend class InitStaticFieldInstr;
-  friend class CloneContextInstr;
-  friend class CheckStackOverflowInstr;
+  friend class BranchSimplifier;
 
   virtual void RawSetInputAt(intptr_t i, Value* value) = 0;
 
@@ -972,14 +876,57 @@
 };
 
 
-template<intptr_t N>
-class TemplateInstruction: public Instruction {
+class PureInstruction : public Instruction {
  public:
-  TemplateInstruction<N>() : inputs_() { }
+  explicit PureInstruction(intptr_t deopt_id)
+      : Instruction(deopt_id) { }
+
+  virtual bool AllowsCSE() const { return true; }
+  virtual EffectSet Dependencies() const { return EffectSet::None(); }
+
+  virtual EffectSet Effects() const { return EffectSet::None(); }
+};
+
+
+// Types to be used as ThrowsTrait for TemplateInstruction/TemplateDefinition.
+struct Throws {
+  static const bool kCanThrow = true;
+};
+
+
+struct NoThrow {
+  static const bool kCanThrow = false;
+};
+
+
+// Types to be used as CSETrait for TemplateInstruction/TemplateDefinition.
+// Pure instructions are those that allow CSE and have no effects and
+// no dependencies.
+template<typename DefaultBase, typename PureBase>
+struct Pure {
+  typedef PureBase Base;
+};
+
+
+template<typename DefaultBase, typename PureBase>
+struct NoCSE {
+  typedef DefaultBase Base;
+};
+
+
+template<intptr_t N,
+         typename ThrowsTrait,
+         template<typename Default, typename Pure> class CSETrait = NoCSE>
+class TemplateInstruction: public CSETrait<Instruction, PureInstruction>::Base {
+ public:
+  explicit TemplateInstruction(intptr_t deopt_id = Isolate::kNoDeoptId)
+      : CSETrait<Instruction, PureInstruction>::Base(deopt_id), inputs_() { }
 
   virtual intptr_t InputCount() const { return N; }
   virtual Value* InputAt(intptr_t i) const { return inputs_[i]; }
 
+  virtual bool MayThrow() const { return ThrowsTrait::kCanThrow; }
+
  protected:
   EmbeddedArray<Value*, N> inputs_;
 
@@ -1048,7 +995,7 @@
 };
 
 
-class ParallelMoveInstr : public TemplateInstruction<0> {
+class ParallelMoveInstr : public TemplateInstruction<0, NoThrow> {
  public:
   ParallelMoveInstr() : moves_(4) { }
 
@@ -1082,8 +1029,6 @@
 
   virtual void PrintTo(BufferFormatter* f) const;
 
-  virtual bool MayThrow() const { return false; }
-
  private:
   GrowableArray<MoveOperands*> moves_;   // Elements cannot be null.
 
@@ -1228,7 +1173,8 @@
 
  protected:
   BlockEntryInstr(intptr_t block_id, intptr_t try_index)
-      : block_id_(block_id),
+      : Instruction(Isolate::Current()->GetNextDeoptId()),
+        block_id_(block_id),
         try_index_(try_index),
         preorder_number_(-1),
         postorder_number_(-1),
@@ -1237,7 +1183,6 @@
         last_instruction_(NULL),
         parallel_move_(NULL),
         loop_info_(NULL) {
-    deopt_id_ = Isolate::Current()->GetNextDeoptId();
   }
 
  private:
@@ -1628,7 +1573,7 @@
 // Abstract super-class of all instructions that define a value (Bind, Phi).
 class Definition : public Instruction {
  public:
-  Definition();
+  explicit Definition(intptr_t deopt_id = Isolate::kNoDeoptId);
 
   // Overridden by definitions that have pushed arguments.
   virtual intptr_t ArgumentCount() const { return 0; }
@@ -1837,14 +1782,31 @@
 }
 
 
-template<intptr_t N>
-class TemplateDefinition : public Definition {
+class PureDefinition : public Definition {
  public:
-  TemplateDefinition<N>() : inputs_() { }
+  explicit PureDefinition(intptr_t deopt_id)
+      : Definition(deopt_id) { }
+
+  virtual bool AllowsCSE() const { return true; }
+  virtual EffectSet Dependencies() const { return EffectSet::None(); }
+
+  virtual EffectSet Effects() const { return EffectSet::None(); }
+};
+
+
+template<intptr_t N,
+         typename ThrowsTrait,
+         template<typename Impure, typename Pure> class CSETrait = NoCSE>
+class TemplateDefinition : public CSETrait<Definition, PureDefinition>::Base {
+ public:
+  explicit TemplateDefinition(intptr_t deopt_id = Isolate::kNoDeoptId)
+      : CSETrait<Definition, PureDefinition>::Base(deopt_id), inputs_() { }
 
   virtual intptr_t InputCount() const { return N; }
   virtual Value* InputAt(intptr_t i) const { return inputs_[i]; }
 
+  virtual bool MayThrow() const { return ThrowsTrait::kCanThrow; }
+
  protected:
   EmbeddedArray<Value*, N> inputs_;
 
@@ -2017,7 +1979,7 @@
 };
 
 
-class PushArgumentInstr : public TemplateDefinition<1> {
+class PushArgumentInstr : public TemplateDefinition<1, NoThrow> {
  public:
   explicit PushArgumentInstr(Value* value) {
     SetInputAt(0, value);
@@ -2037,8 +1999,6 @@
 
   virtual void PrintOperandsTo(BufferFormatter* f) const;
 
-  virtual bool MayThrow() const { return false; }
-
  private:
   DISALLOW_COPY_AND_ASSIGN(PushArgumentInstr);
 };
@@ -2049,11 +2009,11 @@
 }
 
 
-class ReturnInstr : public TemplateInstruction<1> {
+class ReturnInstr : public TemplateInstruction<1, NoThrow> {
  public:
   ReturnInstr(intptr_t token_pos, Value* value)
-      : token_pos_(token_pos) {
-    deopt_id_ = Isolate::Current()->GetNextDeoptId();
+      : TemplateInstruction(Isolate::Current()->GetNextDeoptId()),
+        token_pos_(token_pos) {
     SetInputAt(0, value);
   }
 
@@ -2074,8 +2034,6 @@
 
   virtual EffectSet Effects() const { return EffectSet::None(); }
 
-  virtual bool MayThrow() const { return false; }
-
  private:
   const intptr_t token_pos_;
 
@@ -2083,10 +2041,11 @@
 };
 
 
-class ThrowInstr : public TemplateInstruction<0> {
+class ThrowInstr : public TemplateInstruction<0, Throws> {
  public:
-  explicit ThrowInstr(intptr_t token_pos) : token_pos_(token_pos) {
-    deopt_id_ = Isolate::Current()->GetNextDeoptId();
+  explicit ThrowInstr(intptr_t token_pos)
+      : TemplateInstruction(Isolate::Current()->GetNextDeoptId()),
+        token_pos_(token_pos) {
   }
 
   DECLARE_INSTRUCTION(Throw)
@@ -2099,8 +2058,6 @@
 
   virtual EffectSet Effects() const { return EffectSet::None(); }
 
-  virtual bool MayThrow() const { return true; }
-
  private:
   const intptr_t token_pos_;
 
@@ -2108,13 +2065,14 @@
 };
 
 
-class ReThrowInstr : public TemplateInstruction<0> {
+class ReThrowInstr : public TemplateInstruction<0, Throws> {
  public:
   // 'catch_try_index' can be CatchClauseNode::kInvalidTryIndex if the
   // rethrow has been artifically generated by the parser.
   ReThrowInstr(intptr_t token_pos, intptr_t catch_try_index)
-      : token_pos_(token_pos), catch_try_index_(catch_try_index) {
-    deopt_id_ = Isolate::Current()->GetNextDeoptId();
+      : TemplateInstruction(Isolate::Current()->GetNextDeoptId()),
+        token_pos_(token_pos),
+        catch_try_index_(catch_try_index) {
   }
 
   DECLARE_INSTRUCTION(ReThrow)
@@ -2128,8 +2086,6 @@
 
   virtual EffectSet Effects() const { return EffectSet::None(); }
 
-  virtual bool MayThrow() const { return true; }
-
  private:
   const intptr_t token_pos_;
   const intptr_t catch_try_index_;
@@ -2138,13 +2094,13 @@
 };
 
 
-class GotoInstr : public TemplateInstruction<0> {
+class GotoInstr : public TemplateInstruction<0, NoThrow> {
  public:
   explicit GotoInstr(JoinEntryInstr* entry)
-    : successor_(entry),
+    : TemplateInstruction(Isolate::Current()->GetNextDeoptId()),
+      successor_(entry),
       edge_weight_(0.0),
       parallel_move_(NULL) {
-    deopt_id_ = Isolate::Current()->GetNextDeoptId();
   }
 
   DECLARE_INSTRUCTION(Goto)
@@ -2191,8 +2147,6 @@
 
   virtual void PrintTo(BufferFormatter* f) const;
 
-  virtual bool MayThrow() const { return false; }
-
  private:
   JoinEntryInstr* successor_;
   double edge_weight_;
@@ -2203,7 +2157,7 @@
 };
 
 
-class ComparisonInstr : public TemplateDefinition<2> {
+class ComparisonInstr : public TemplateDefinition<2, NoThrow, Pure> {
  public:
   Value* left() const { return inputs_[0]; }
   Value* right() const { return inputs_[1]; }
@@ -2231,14 +2185,27 @@
     kind_ = Token::NegateComparison(kind_);
   }
 
+  virtual bool CanBecomeDeoptimizationTarget() const { return true; }
+  virtual intptr_t DeoptimizationTarget() const { return GetDeoptId(); }
+
+  virtual bool AttributesEqual(Instruction* other) const {
+    ComparisonInstr* other_comparison = other->AsComparison();
+    return kind() == other_comparison->kind() &&
+        (operation_cid() == other_comparison->operation_cid());
+  }
+
   DEFINE_INSTRUCTION_TYPE_CHECK(Comparison)
 
  protected:
   ComparisonInstr(intptr_t token_pos,
                   Token::Kind kind,
                   Value* left,
-                  Value* right)
-      : token_pos_(token_pos), kind_(kind), operation_cid_(kIllegalCid) {
+                  Value* right,
+                  intptr_t deopt_id = Isolate::kNoDeoptId)
+      : TemplateDefinition(deopt_id),
+        token_pos_(token_pos),
+        kind_(kind),
+        operation_cid_(kIllegalCid) {
     SetInputAt(0, left);
     if (right != NULL) {
       SetInputAt(1, right);
@@ -2257,11 +2224,11 @@
 class BranchInstr : public Instruction {
  public:
   explicit BranchInstr(ComparisonInstr* comparison)
-      : comparison_(comparison),
+      : Instruction(Isolate::Current()->GetNextDeoptId()),
+        comparison_(comparison),
         is_checked_(false),
         constrained_type_(NULL),
         constant_target_(NULL) {
-    deopt_id_ = Isolate::Current()->GetNextDeoptId();
     ASSERT(comparison->env() == NULL);
     for (intptr_t i = comparison->InputCount() - 1; i >= 0; --i) {
       comparison->InputAt(i)->set_instruction(this);
@@ -2363,7 +2330,7 @@
 };
 
 
-class StoreContextInstr : public TemplateInstruction<1> {
+class StoreContextInstr : public TemplateInstruction<1, NoThrow> {
  public:
   explicit StoreContextInstr(Value* value) {
     SetInputAt(kValuePos, value);
@@ -2383,33 +2350,26 @@
 
   virtual EffectSet Effects() const { return EffectSet::None(); }
 
-  virtual bool MayThrow() const { return false; }
-
  private:
   DISALLOW_COPY_AND_ASSIGN(StoreContextInstr);
 };
 
 
-class DeoptimizeInstr : public TemplateInstruction<0> {
+class DeoptimizeInstr : public TemplateInstruction<0, NoThrow, Pure> {
  public:
   DeoptimizeInstr(ICData::DeoptReasonId deopt_reason, intptr_t deopt_id)
-      : deopt_reason_(deopt_reason) {
-    deopt_id_ = deopt_id;
+      : TemplateInstruction(deopt_id),
+        deopt_reason_(deopt_reason) {
   }
 
   virtual intptr_t ArgumentCount() const { return 0; }
 
   virtual bool CanDeoptimize() const { return true; }
 
-  virtual bool AllowsCSE() const { return true; }
-  virtual EffectSet Effects() const { return EffectSet::None(); }
-  virtual EffectSet Dependencies() const { return EffectSet::None(); }
   virtual bool AttributesEqual(Instruction* other) const {
     return true;
   }
 
-  virtual bool MayThrow() const { return false; }
-
   DECLARE_INSTRUCTION(Deoptimize)
 
  private:
@@ -2419,7 +2379,7 @@
 };
 
 
-class RedefinitionInstr : public TemplateDefinition<1> {
+class RedefinitionInstr : public TemplateDefinition<1, NoThrow> {
  public:
   explicit RedefinitionInstr(Value* value) {
     SetInputAt(0, value);
@@ -2436,14 +2396,12 @@
   virtual EffectSet Dependencies() const { return EffectSet::None(); }
   virtual EffectSet Effects() const { return EffectSet::None(); }
 
-  virtual bool MayThrow() const { return false; }
-
  private:
   DISALLOW_COPY_AND_ASSIGN(RedefinitionInstr);
 };
 
 
-class ConstraintInstr : public TemplateDefinition<1> {
+class ConstraintInstr : public TemplateDefinition<1, NoThrow> {
  public:
   ConstraintInstr(Value* value, Range* constraint)
       : constraint_(constraint),
@@ -2464,8 +2422,6 @@
     return false;
   }
 
-  virtual bool MayThrow() const { return false; }
-
   virtual void PrintOperandsTo(BufferFormatter* f) const;
 
   Value* value() const { return inputs_[0]; }
@@ -2491,7 +2447,7 @@
 };
 
 
-class ConstantInstr : public TemplateDefinition<0> {
+class ConstantInstr : public TemplateDefinition<0, NoThrow, Pure> {
  public:
   explicit ConstantInstr(const Object& value);
 
@@ -2508,13 +2464,8 @@
 
   virtual void InferRange(RangeAnalysis* analysis, Range* range);
 
-  virtual bool AllowsCSE() const { return true; }
-  virtual EffectSet Effects() const { return EffectSet::None(); }
-  virtual EffectSet Dependencies() const { return EffectSet::None(); }
   virtual bool AttributesEqual(Instruction* other) const;
 
-  virtual bool MayThrow() const { return false; }
-
  private:
   const Object& value_;
 
@@ -2547,18 +2498,19 @@
 };
 
 
-class AssertAssignableInstr : public TemplateDefinition<3> {
+class AssertAssignableInstr : public TemplateDefinition<3, Throws, Pure> {
  public:
   AssertAssignableInstr(intptr_t token_pos,
                         Value* value,
                         Value* instantiator,
                         Value* instantiator_type_arguments,
                         const AbstractType& dst_type,
-                        const String& dst_name)
-      : token_pos_(token_pos),
+                        const String& dst_name,
+                        intptr_t deopt_id)
+      : TemplateDefinition(deopt_id),
+        token_pos_(token_pos),
         dst_type_(AbstractType::ZoneHandle(dst_type.raw())),
         dst_name_(dst_name) {
-    deopt_id_ = Isolate::Current()->GetNextDeoptId();
     ASSERT(!dst_type.IsNull());
     ASSERT(!dst_name.IsNull());
     SetInputAt(0, value);
@@ -2593,13 +2545,8 @@
 
   virtual Definition* Canonicalize(FlowGraph* flow_graph);
 
-  virtual bool AllowsCSE() const { return true; }
-  virtual EffectSet Effects() const { return EffectSet::None(); }
-  virtual EffectSet Dependencies() const { return EffectSet::None(); }
   virtual bool AttributesEqual(Instruction* other) const;
 
-  virtual bool MayThrow() const { return true; }
-
  private:
   const intptr_t token_pos_;
   AbstractType& dst_type_;
@@ -2609,11 +2556,11 @@
 };
 
 
-class AssertBooleanInstr : public TemplateDefinition<1> {
+class AssertBooleanInstr : public TemplateDefinition<1, Throws, Pure> {
  public:
   AssertBooleanInstr(intptr_t token_pos, Value* value)
-      : token_pos_(token_pos) {
-    deopt_id_ = Isolate::Current()->GetNextDeoptId();
+      : TemplateDefinition(Isolate::Current()->GetNextDeoptId()),
+        token_pos_(token_pos) {
     SetInputAt(0, value);
   }
 
@@ -2629,13 +2576,8 @@
 
   virtual Definition* Canonicalize(FlowGraph* flow_graph);
 
-  virtual bool AllowsCSE() const { return true; }
-  virtual EffectSet Effects() const { return EffectSet::None(); }
-  virtual EffectSet Dependencies() const { return EffectSet::None(); }
   virtual bool AttributesEqual(Instruction* other) const { return true; }
 
-  virtual bool MayThrow() const { return true; }
-
  private:
   const intptr_t token_pos_;
 
@@ -2645,10 +2587,10 @@
 
 // Denotes the current context, normally held in a register.  This is
 // a computation, not a value, because it's mutable.
-class CurrentContextInstr : public TemplateDefinition<0> {
+class CurrentContextInstr : public TemplateDefinition<0, NoThrow> {
  public:
-  CurrentContextInstr() {
-    deopt_id_ = Isolate::Current()->GetNextDeoptId();
+  CurrentContextInstr()
+      : TemplateDefinition(Isolate::Current()->GetNextDeoptId()) {
   }
 
   DECLARE_INSTRUCTION(CurrentContext)
@@ -2660,21 +2602,19 @@
   virtual EffectSet Dependencies() const { return EffectSet::None(); }
   virtual bool AttributesEqual(Instruction* other) const { return true; }
 
-  virtual bool MayThrow() const { return false; }
-
  private:
   DISALLOW_COPY_AND_ASSIGN(CurrentContextInstr);
 };
 
 
-class ClosureCallInstr : public TemplateDefinition<1> {
+class ClosureCallInstr : public TemplateDefinition<1, Throws> {
  public:
   ClosureCallInstr(Value* function,
                    ClosureCallNode* node,
                    ZoneGrowableArray<PushArgumentInstr*>* arguments)
-      : ast_node_(*node),
+      : TemplateDefinition(Isolate::Current()->GetNextDeoptId()),
+        ast_node_(*node),
         arguments_(arguments) {
-    deopt_id_ = Isolate::Current()->GetNextDeoptId();
     SetInputAt(0, function);
   }
 
@@ -2697,8 +2637,6 @@
 
   virtual EffectSet Effects() const { return EffectSet::All(); }
 
-  virtual bool MayThrow() const { return true; }
-
  private:
   const ClosureCallNode& ast_node_;
   ZoneGrowableArray<PushArgumentInstr*>* arguments_;
@@ -2707,7 +2645,7 @@
 };
 
 
-class InstanceCallInstr : public TemplateDefinition<0> {
+class InstanceCallInstr : public TemplateDefinition<0, Throws> {
  public:
   InstanceCallInstr(intptr_t token_pos,
                     const String& function_name,
@@ -2716,14 +2654,14 @@
                     const Array& argument_names,
                     intptr_t checked_argument_count,
                     const ZoneGrowableArray<const ICData*>& ic_data_array)
-      : ic_data_(NULL),
+      : TemplateDefinition(Isolate::Current()->GetNextDeoptId()),
+        ic_data_(NULL),
         token_pos_(token_pos),
         function_name_(function_name),
         token_kind_(token_kind),
         arguments_(arguments),
         argument_names_(argument_names),
         checked_argument_count_(checked_argument_count) {
-    deopt_id_ = Isolate::Current()->GetNextDeoptId();
     ic_data_ = GetICData(ic_data_array);
     ASSERT(function_name.IsNotTemporaryScopedHandle());
     ASSERT(!arguments->is_empty());
@@ -2772,8 +2710,6 @@
 
   virtual EffectSet Effects() const { return EffectSet::All(); }
 
-  virtual bool MayThrow() const { return true; }
-
  protected:
   friend class FlowGraphOptimizer;
   void set_ic_data(ICData* value) { ic_data_ = value; }
@@ -2791,17 +2727,17 @@
 };
 
 
-class PolymorphicInstanceCallInstr : public TemplateDefinition<0> {
+class PolymorphicInstanceCallInstr : public TemplateDefinition<0, Throws> {
  public:
   PolymorphicInstanceCallInstr(InstanceCallInstr* instance_call,
                                const ICData& ic_data,
                                bool with_checks)
-      : instance_call_(instance_call),
+      : TemplateDefinition(instance_call->deopt_id()),
+        instance_call_(instance_call),
         ic_data_(ic_data),
         with_checks_(with_checks) {
     ASSERT(instance_call_ != NULL);
     ASSERT(ic_data.NumberOfChecks() > 0);
-    deopt_id_ = instance_call->deopt_id();
   }
 
   InstanceCallInstr* instance_call() const { return instance_call_; }
@@ -2831,8 +2767,6 @@
 
   virtual void PrintOperandsTo(BufferFormatter* f) const;
 
-  virtual bool MayThrow() const { return true; }
-
  private:
   InstanceCallInstr* instance_call_;
   const ICData& ic_data_;
@@ -2858,11 +2792,6 @@
 
   virtual void PrintOperandsTo(BufferFormatter* f) const;
 
-  virtual bool CanBecomeDeoptimizationTarget() const {
-    // StrictCompare can be merged into Branch and thus needs an environment.
-    return true;
-  }
-
   virtual bool CanDeoptimize() const { return false; }
 
   virtual Definition* Canonicalize(FlowGraph* flow_graph);
@@ -2876,12 +2805,7 @@
   bool needs_number_check() const { return needs_number_check_; }
   void set_needs_number_check(bool value) { needs_number_check_ = value; }
 
-  virtual bool AllowsCSE() const { return true; }
-  virtual EffectSet Effects() const { return EffectSet::None(); }
-  virtual EffectSet Dependencies() const { return EffectSet::None(); }
-  virtual bool AttributesEqual(Instruction* other) const;
-
-  virtual bool MayThrow() const { return false; }
+  bool AttributesEqual(Instruction* other) const;
 
  private:
   // True if the comparison must check for double, Mint or Bigint and
@@ -2898,7 +2822,6 @@
  public:
   TestSmiInstr(intptr_t token_pos, Token::Kind kind, Value* left, Value* right)
       : ComparisonInstr(token_pos, kind, left, right) {
-    deopt_id_ = Isolate::Current()->GetNextDeoptId();
     ASSERT(kind == Token::kEQ || kind == Token::kNE);
   }
 
@@ -2910,23 +2833,10 @@
 
   virtual bool CanDeoptimize() const { return false; }
 
-  virtual bool CanBecomeDeoptimizationTarget() const {
-    // TestSmi can be merged into Branch and thus needs an environment.
-    return true;
-  }
-
-  virtual intptr_t DeoptimizationTarget() const {
-    return GetDeoptId();
-  }
-
   virtual Representation RequiredInputRepresentation(intptr_t idx) const {
     return kTagged;
   }
 
-  virtual EffectSet Effects() const { return EffectSet::None(); }
-
-  virtual bool MayThrow() const { return false; }
-
   virtual void EmitBranchCode(FlowGraphCompiler* compiler,
                               BranchInstr* branch);
 
@@ -2949,11 +2859,10 @@
                 Value* value,
                 const ZoneGrowableArray<intptr_t>& cid_results,
                 intptr_t deopt_id)
-      : ComparisonInstr(token_pos, kind, value, NULL),
+      : ComparisonInstr(token_pos, kind, value, NULL, deopt_id),
         cid_results_(cid_results) {
     ASSERT((kind == Token::kIS) || (kind == Token::kISNOT));
     set_operation_cid(kObjectCid);
-    deopt_id_ = deopt_id;
   }
 
   virtual intptr_t InputCount() const { return 1; }
@@ -2969,28 +2878,13 @@
   virtual CompileType ComputeType() const;
 
   virtual bool CanDeoptimize() const {
-    return deopt_id_ != Isolate::kNoDeoptId;
-  }
-
-  virtual bool CanBecomeDeoptimizationTarget() const {
-    // TestCid can be merged into Branch and thus needs an environment.
-    return true;
-  }
-
-  virtual intptr_t DeoptimizationTarget() const {
-    return GetDeoptId();
+    return GetDeoptId() != Isolate::kNoDeoptId;
   }
 
   virtual Representation RequiredInputRepresentation(intptr_t idx) const {
     return kTagged;
   }
 
-  virtual EffectSet Effects() const { return EffectSet::None(); }
-  virtual bool AllowsCSE() const { return true; }
-  virtual EffectSet Dependencies() const { return EffectSet::None(); }
-
-  virtual bool MayThrow() const { return false; }
-
   virtual bool AttributesEqual(Instruction* other) const;
 
   virtual void EmitBranchCode(FlowGraphCompiler* compiler,
@@ -3015,10 +2909,9 @@
                        Value* right,
                        intptr_t cid,
                        intptr_t deopt_id)
-      : ComparisonInstr(token_pos, kind, left, right) {
+      : ComparisonInstr(token_pos, kind, left, right, deopt_id) {
     ASSERT(Token::IsEqualityOperator(kind));
     set_operation_cid(cid);
-    deopt_id_ = deopt_id;  // Override generated deopt-id.
   }
 
   DECLARE_INSTRUCTION(EqualityCompare)
@@ -3031,21 +2924,12 @@
 
   virtual bool CanDeoptimize() const { return false; }
 
-  virtual bool CanBecomeDeoptimizationTarget() const {
-    // EqualityCompare can be merged into Branch and thus needs an environment.
-    return true;
-  }
-
   virtual void EmitBranchCode(FlowGraphCompiler* compiler,
                               BranchInstr* branch);
 
   virtual Condition EmitComparisonCode(FlowGraphCompiler* compiler,
                                        BranchLabels labels);
 
-  virtual intptr_t DeoptimizationTarget() const {
-    return GetDeoptId();
-  }
-
   virtual Representation RequiredInputRepresentation(intptr_t idx) const {
     ASSERT((idx == 0) || (idx == 1));
     if (operation_cid() == kDoubleCid) return kUnboxedDouble;
@@ -3053,10 +2937,6 @@
     return kTagged;
   }
 
-  virtual EffectSet Effects() const { return EffectSet::None(); }
-
-  virtual bool MayThrow() const { return false; }
-
  private:
   DISALLOW_COPY_AND_ASSIGN(EqualityCompareInstr);
 };
@@ -3070,10 +2950,9 @@
                     Value* right,
                     intptr_t cid,
                     intptr_t deopt_id)
-      : ComparisonInstr(token_pos, kind, left, right) {
+      : ComparisonInstr(token_pos, kind, left, right, deopt_id) {
     ASSERT(Token::IsRelationalOperator(kind));
     set_operation_cid(cid);
-    deopt_id_ = deopt_id;  // Override generated deopt-id.
   }
 
   DECLARE_INSTRUCTION(RelationalOp)
@@ -3086,21 +2965,12 @@
 
   virtual bool CanDeoptimize() const { return false; }
 
-  virtual bool CanBecomeDeoptimizationTarget() const {
-    // RelationalOp can be merged into Branch and thus needs an environment.
-    return true;
-  }
-
   virtual void EmitBranchCode(FlowGraphCompiler* compiler,
                               BranchInstr* branch);
 
   virtual Condition EmitComparisonCode(FlowGraphCompiler* compiler,
                                        BranchLabels labels);
 
-  virtual intptr_t DeoptimizationTarget() const {
-    return GetDeoptId();
-  }
-
   virtual Representation RequiredInputRepresentation(intptr_t idx) const {
     ASSERT((idx == 0) || (idx == 1));
     if (operation_cid() == kDoubleCid) return kUnboxedDouble;
@@ -3108,12 +2978,6 @@
     return kTagged;
   }
 
-  virtual EffectSet Effects() const {
-    return EffectSet::None();
-  }
-
-  virtual bool MayThrow() const { return false; }
-
  private:
   DISALLOW_COPY_AND_ASSIGN(RelationalOpInstr);
 };
@@ -3126,10 +2990,10 @@
   IfThenElseInstr(ComparisonInstr* comparison,
                   Value* if_true,
                   Value* if_false)
-      : comparison_(comparison),
+      : Definition(Isolate::Current()->GetNextDeoptId()),
+        comparison_(comparison),
         if_true_(Smi::Cast(if_true->BoundConstant()).Value()),
         if_false_(Smi::Cast(if_false->BoundConstant()).Value()) {
-    deopt_id_ = Isolate::Current()->GetNextDeoptId();
     // Adjust uses at the comparison.
     ASSERT(comparison->env() == NULL);
     for (intptr_t i = comparison->InputCount() - 1; i >= 0; --i) {
@@ -3200,14 +3064,15 @@
 };
 
 
-class StaticCallInstr : public TemplateDefinition<0> {
+class StaticCallInstr : public TemplateDefinition<0, Throws> {
  public:
   StaticCallInstr(intptr_t token_pos,
                   const Function& function,
                   const Array& argument_names,
                   ZoneGrowableArray<PushArgumentInstr*>* arguments,
                   const ZoneGrowableArray<const ICData*>& ic_data_array)
-      : ic_data_(NULL),
+      : TemplateDefinition(Isolate::Current()->GetNextDeoptId()),
+        ic_data_(NULL),
         token_pos_(token_pos),
         function_(function),
         argument_names_(argument_names),
@@ -3216,7 +3081,6 @@
         is_known_list_constructor_(false),
         is_native_list_factory_(false),
         identity_(AliasIdentity::Unknown()) {
-    deopt_id_ = Isolate::Current()->GetNextDeoptId();
     ic_data_ = GetICData(ic_data_array);
     ASSERT(function.IsZoneHandle());
     ASSERT(argument_names.IsZoneHandle() ||  argument_names.InVMHeap());
@@ -3271,8 +3135,6 @@
     return is_known_list_constructor() || is_native_list_factory();
   }
 
-  virtual bool MayThrow() const { return true; }
-
   virtual AliasIdentity Identity() const { return identity_; }
   virtual void SetIdentity(AliasIdentity identity) { identity_ = identity; }
 
@@ -3294,7 +3156,7 @@
 };
 
 
-class LoadLocalInstr : public TemplateDefinition<0> {
+class LoadLocalInstr : public TemplateDefinition<0, NoThrow> {
  public:
   explicit LoadLocalInstr(const LocalVariable& local)
       : local_(local), is_last_(false) { }
@@ -3316,11 +3178,6 @@
   void mark_last() { is_last_ = true; }
   bool is_last() const { return is_last_; }
 
-  virtual bool MayThrow() const {
-    UNREACHABLE();
-    return false;
-  }
-
  private:
   const LocalVariable& local_;
   bool is_last_;
@@ -3329,7 +3186,7 @@
 };
 
 
-class PushTempInstr : public TemplateDefinition<1> {
+class PushTempInstr : public TemplateDefinition<1, NoThrow> {
  public:
   explicit PushTempInstr(Value* value) {
     SetInputAt(0, value);
@@ -3348,11 +3205,6 @@
     return EffectSet::None();
   }
 
-  virtual bool MayThrow() const {
-    UNREACHABLE();
-    return false;
-  }
-
  private:
   DISALLOW_COPY_AND_ASSIGN(PushTempInstr);
 };
@@ -3407,7 +3259,7 @@
 };
 
 
-class StoreLocalInstr : public TemplateDefinition<1> {
+class StoreLocalInstr : public TemplateDefinition<1, NoThrow> {
  public:
   StoreLocalInstr(const LocalVariable& local, Value* value)
       : local_(local), is_dead_(false), is_last_(false) {
@@ -3435,11 +3287,6 @@
     return EffectSet::None();
   }
 
-  virtual bool MayThrow() const {
-    UNREACHABLE();
-    return false;
-  }
-
  private:
   const LocalVariable& local_;
   bool is_dead_;
@@ -3449,7 +3296,7 @@
 };
 
 
-class NativeCallInstr : public TemplateDefinition<0> {
+class NativeCallInstr : public TemplateDefinition<0, Throws> {
  public:
   explicit NativeCallInstr(NativeBodyNode* node)
       : ast_node_(*node) {}
@@ -3478,11 +3325,6 @@
 
   virtual EffectSet Effects() const { return EffectSet::All(); }
 
-  virtual bool MayThrow() const {
-    UNREACHABLE();
-    return true;
-  }
-
  private:
   const NativeBodyNode& ast_node_;
 
@@ -3490,7 +3332,7 @@
 };
 
 
-class DebugStepCheckInstr : public TemplateInstruction<0> {
+class DebugStepCheckInstr : public TemplateInstruction<0, NoThrow> {
  public:
   DebugStepCheckInstr(intptr_t token_pos,
                       RawPcDescriptors::Kind stub_kind)
@@ -3501,7 +3343,6 @@
   DECLARE_INSTRUCTION(DebugStepCheck)
 
   virtual intptr_t token_pos() const { return token_pos_; }
-  virtual bool MayThrow() const { return false; }
   virtual bool CanDeoptimize() const { return false; }
   virtual EffectSet Effects() const { return EffectSet::All(); }
   virtual intptr_t ArgumentCount() const { return 0; }
@@ -3521,7 +3362,7 @@
 };
 
 
-class StoreInstanceFieldInstr : public TemplateDefinition<2> {
+class StoreInstanceFieldInstr : public TemplateDefinition<2, NoThrow> {
  public:
   StoreInstanceFieldInstr(const Field& field,
                           Value* instance,
@@ -3589,8 +3430,6 @@
   // are marked as having no side-effects.
   virtual EffectSet Effects() const { return EffectSet::None(); }
 
-  virtual bool MayThrow() const { return false; }
-
   bool IsUnboxedStore() const;
 
   bool IsPotentialUnboxedStore() const;
@@ -3617,13 +3456,13 @@
 };
 
 
-class GuardFieldInstr : public TemplateInstruction<1> {
+class GuardFieldInstr : public TemplateInstruction<1, NoThrow, Pure> {
  public:
   GuardFieldInstr(Value* value,
                   const Field& field,
                   intptr_t deopt_id)
-    : field_(field) {
-    deopt_id_ = deopt_id;
+    : TemplateInstruction(deopt_id),
+      field_(field) {
     SetInputAt(0, value);
   }
 
@@ -3639,12 +3478,6 @@
     return true;
   }
 
-  virtual bool AllowsCSE() const { return true; }
-  virtual EffectSet Effects() const { return EffectSet::None(); }
-  virtual EffectSet Dependencies() const { return EffectSet::None(); }
-
-  virtual bool MayThrow() const { return false; }
-
   virtual void PrintOperandsTo(BufferFormatter* f) const;
 
  private:
@@ -3690,7 +3523,7 @@
 };
 
 
-class LoadStaticFieldInstr : public TemplateDefinition<1> {
+class LoadStaticFieldInstr : public TemplateDefinition<1, NoThrow> {
  public:
   explicit LoadStaticFieldInstr(Value* field_value) {
     ASSERT(field_value->BindsToConstant());
@@ -3713,14 +3546,12 @@
   virtual EffectSet Dependencies() const;
   virtual bool AttributesEqual(Instruction* other) const;
 
-  virtual bool MayThrow() const { return false; }
-
  private:
   DISALLOW_COPY_AND_ASSIGN(LoadStaticFieldInstr);
 };
 
 
-class StoreStaticFieldInstr : public TemplateDefinition<1> {
+class StoreStaticFieldInstr : public TemplateDefinition<1, NoThrow> {
  public:
   StoreStaticFieldInstr(const Field& field, Value* value)
       : field_(field) {
@@ -3747,8 +3578,6 @@
   // are marked as having no side-effects.
   virtual EffectSet Effects() const { return EffectSet::None(); }
 
-  virtual bool MayThrow() const { return false; }
-
  private:
   bool CanValueBeSmi() const {
     const intptr_t cid = value()->Type()->ToNullableCid();
@@ -3763,7 +3592,7 @@
 };
 
 
-class LoadIndexedInstr : public TemplateDefinition<2> {
+class LoadIndexedInstr : public TemplateDefinition<2, NoThrow> {
  public:
   LoadIndexedInstr(Value* array,
                    Value* index,
@@ -3771,12 +3600,12 @@
                    intptr_t class_id,
                    intptr_t deopt_id,
                    intptr_t token_pos)
-      : index_scale_(index_scale),
+      : TemplateDefinition(deopt_id),
+        index_scale_(index_scale),
         class_id_(class_id),
         token_pos_(token_pos) {
     SetInputAt(0, array);
     SetInputAt(1, index);
-    deopt_id_ = deopt_id;
   }
 
   intptr_t token_pos() const { return token_pos_; }
@@ -3801,7 +3630,7 @@
   intptr_t class_id() const { return class_id_; }
 
   virtual bool CanDeoptimize() const {
-    return deopt_id_ != Isolate::kNoDeoptId;
+    return GetDeoptId() != Isolate::kNoDeoptId;
   }
 
   bool Typed32BitIsSmi() const {
@@ -3811,12 +3640,7 @@
   virtual Representation representation() const;
   virtual void InferRange(RangeAnalysis* analysis, Range* range);
 
-  virtual bool AllowsCSE() const { return false; }
   virtual EffectSet Effects() const { return EffectSet::None(); }
-  virtual EffectSet Dependencies() const;
-  virtual bool AttributesEqual(Instruction* other) const;
-
-  virtual bool MayThrow() const { return false; }
 
  private:
   const intptr_t index_scale_;
@@ -3827,7 +3651,7 @@
 };
 
 
-class StringFromCharCodeInstr : public TemplateDefinition<1> {
+class StringFromCharCodeInstr : public TemplateDefinition<1, NoThrow, Pure> {
  public:
   StringFromCharCodeInstr(Value* char_code, intptr_t cid) : cid_(cid) {
     ASSERT(char_code != NULL);
@@ -3844,15 +3668,10 @@
 
   virtual bool CanDeoptimize() const { return false; }
 
-  virtual bool AllowsCSE() const { return true; }
-  virtual EffectSet Effects() const { return EffectSet::None(); }
-  virtual EffectSet Dependencies() const { return EffectSet::None(); }
   virtual bool AttributesEqual(Instruction* other) const {
     return other->AsStringFromCharCode()->cid_ == cid_;
   }
 
-  virtual bool MayThrow() const { return false; }
-
  private:
   const intptr_t cid_;
 
@@ -3860,7 +3679,7 @@
 };
 
 
-class StringToCharCodeInstr : public TemplateDefinition<1> {
+class StringToCharCodeInstr : public TemplateDefinition<1, NoThrow, Pure> {
  public:
   StringToCharCodeInstr(Value* str, intptr_t cid) : cid_(cid) {
     ASSERT(str != NULL);
@@ -3874,15 +3693,10 @@
 
   virtual bool CanDeoptimize() const { return false; }
 
-  virtual bool AllowsCSE() const { return true; }
-  virtual EffectSet Effects() const { return EffectSet::None(); }
-  virtual EffectSet Dependencies() const { return EffectSet::None(); }
   virtual bool AttributesEqual(Instruction* other) const {
     return other->AsStringToCharCode()->cid_ == cid_;
   }
 
-  virtual bool MayThrow() const { return false; }
-
  private:
   const intptr_t cid_;
 
@@ -3890,11 +3704,12 @@
 };
 
 
-class StringInterpolateInstr : public TemplateDefinition<1> {
+class StringInterpolateInstr : public TemplateDefinition<1, Throws> {
  public:
   StringInterpolateInstr(Value* value, intptr_t token_pos)
-      : token_pos_(token_pos), function_(Function::Handle()) {
-    deopt_id_ = Isolate::Current()->GetNextDeoptId();
+      : TemplateDefinition(Isolate::Current()->GetNextDeoptId()),
+        token_pos_(token_pos),
+        function_(Function::Handle()) {
     SetInputAt(0, value);
   }
 
@@ -3905,7 +3720,6 @@
   // Issues a static call to Dart code which calls toString on objects.
   virtual EffectSet Effects() const { return EffectSet::All(); }
   virtual bool CanDeoptimize() const { return true; }
-  virtual bool MayThrow() const { return true; }
 
   const Function& CallFunction() const;
 
@@ -3921,7 +3735,7 @@
 };
 
 
-class StoreIndexedInstr : public TemplateDefinition<3> {
+class StoreIndexedInstr : public TemplateDefinition<3, NoThrow> {
  public:
   StoreIndexedInstr(Value* array,
                     Value* index,
@@ -3931,14 +3745,14 @@
                     intptr_t class_id,
                     intptr_t deopt_id,
                     intptr_t token_pos)
-      : emit_store_barrier_(emit_store_barrier),
+      : TemplateDefinition(deopt_id),
+        emit_store_barrier_(emit_store_barrier),
         index_scale_(index_scale),
         class_id_(class_id),
         token_pos_(token_pos) {
     SetInputAt(kArrayPos, array);
     SetInputAt(kIndexPos, index);
     SetInputAt(kValuePos, value);
-    deopt_id_ = deopt_id;
   }
 
   DECLARE_INSTRUCTION(StoreIndexed)
@@ -3972,13 +3786,11 @@
   virtual intptr_t DeoptimizationTarget() const {
     // Direct access since this instruction cannot deoptimize, and the deopt-id
     // was inherited from another instruction that could deoptimize.
-    return deopt_id_;
+    return GetDeoptId();
   }
 
   virtual EffectSet Effects() const { return EffectSet::None(); }
 
-  virtual bool MayThrow() const { return false; }
-
  private:
   const StoreBarrierType emit_store_barrier_;
   const intptr_t index_scale_;
@@ -3990,7 +3802,7 @@
 
 
 // Note overrideable, built-in: value ? false : true.
-class BooleanNegateInstr : public TemplateDefinition<1> {
+class BooleanNegateInstr : public TemplateDefinition<1, NoThrow> {
  public:
   explicit BooleanNegateInstr(Value* value) {
     SetInputAt(0, value);
@@ -4005,8 +3817,6 @@
 
   virtual EffectSet Effects() const { return EffectSet::None(); }
 
-  virtual bool MayThrow() const { return false; }
-
   virtual Definition* Canonicalize(FlowGraph* flow_graph);
 
  private:
@@ -4014,7 +3824,7 @@
 };
 
 
-class InstanceOfInstr : public TemplateDefinition<3> {
+class InstanceOfInstr : public TemplateDefinition<3, Throws> {
  public:
   InstanceOfInstr(intptr_t token_pos,
                   Value* value,
@@ -4023,14 +3833,14 @@
                   const AbstractType& type,
                   bool negate_result,
                   intptr_t deopt_id)
-      : token_pos_(token_pos),
+      : TemplateDefinition(deopt_id),
+        token_pos_(token_pos),
         type_(type),
         negate_result_(negate_result) {
     ASSERT(!type.IsNull());
     SetInputAt(0, value);
     SetInputAt(1, instantiator);
     SetInputAt(2, instantiator_type_arguments);
-    deopt_id_ = deopt_id;
   }
 
   DECLARE_INSTRUCTION(InstanceOf)
@@ -4050,8 +3860,6 @@
 
   virtual EffectSet Effects() const { return EffectSet::None(); }
 
-  virtual bool MayThrow() const { return true; }
-
  private:
   const intptr_t token_pos_;
   Value* value_;
@@ -4064,7 +3872,7 @@
 };
 
 
-class AllocateObjectInstr : public TemplateDefinition<0> {
+class AllocateObjectInstr : public TemplateDefinition<0, NoThrow> {
  public:
   AllocateObjectInstr(intptr_t token_pos,
                       const Class& cls,
@@ -4100,8 +3908,6 @@
 
   virtual EffectSet Effects() const { return EffectSet::None(); }
 
-  virtual bool MayThrow() const { return false; }
-
   virtual AliasIdentity Identity() const { return identity_; }
   virtual void SetIdentity(AliasIdentity identity) { identity_ = identity; }
 
@@ -4205,13 +4011,14 @@
 };
 
 
-class CreateArrayInstr : public TemplateDefinition<2> {
+class CreateArrayInstr : public TemplateDefinition<2, Throws> {
  public:
   CreateArrayInstr(intptr_t token_pos,
                    Value* element_type,
                    Value* num_elements)
-      : token_pos_(token_pos), identity_(AliasIdentity::Unknown())  {
-    deopt_id_ = Isolate::Current()->GetNextDeoptId();
+      : TemplateDefinition(Isolate::Current()->GetNextDeoptId()),
+        token_pos_(token_pos),
+        identity_(AliasIdentity::Unknown())  {
     SetInputAt(kElementTypePos, element_type);
     SetInputAt(kLengthPos, num_elements);
   }
@@ -4234,9 +4041,6 @@
 
   virtual EffectSet Effects() const { return EffectSet::None(); }
 
-  // OutOfMemoryError can be called.
-  virtual bool MayThrow() const { return true; }
-
   virtual AliasIdentity Identity() const { return identity_; }
   virtual void SetIdentity(AliasIdentity identity) { identity_ = identity; }
 
@@ -4248,7 +4052,12 @@
 };
 
 
-class LoadUntaggedInstr : public TemplateDefinition<1> {
+// Note: this instruction must not be moved without the indexed access that
+// depends on it (e.g. out of loops). GC may cause collect
+// the array while the external data-array is still accessed.
+// TODO(vegorov) enable LICMing this instruction by ensuring that array itself
+// is kept alive.
+class LoadUntaggedInstr : public TemplateDefinition<1, NoThrow> {
  public:
   LoadUntaggedInstr(Value* object, intptr_t offset) : offset_(offset) {
     SetInputAt(0, object);
@@ -4265,16 +4074,9 @@
 
   virtual bool CanDeoptimize() const { return false; }
 
-  // This instruction must not be moved without the indexed access that
-  // depends on it (e.g. out of loops). GC may cause collect
-  // the array while the external data-array is still accessed.
-  virtual bool AllowsCSE() const { return false; }
   virtual EffectSet Effects() const { return EffectSet::None(); }
-  virtual EffectSet Dependencies() const { return EffectSet::None(); }
   virtual bool AttributesEqual(Instruction* other) const { return true; }
 
-  virtual bool MayThrow() const { return false; }
-
  private:
   intptr_t offset_;
 
@@ -4282,7 +4084,7 @@
 };
 
 
-class LoadClassIdInstr : public TemplateDefinition<1> {
+class LoadClassIdInstr : public TemplateDefinition<1, NoThrow> {
  public:
   explicit LoadClassIdInstr(Value* object) {
     SetInputAt(0, object);
@@ -4299,20 +4101,18 @@
   virtual bool CanDeoptimize() const { return false; }
 
   virtual bool AllowsCSE() const { return true; }
-  virtual EffectSet Effects() const { return EffectSet::None(); }
   virtual EffectSet Dependencies() const {
     return EffectSet::Externalization();
   }
+  virtual EffectSet Effects() const { return EffectSet::None(); }
   virtual bool AttributesEqual(Instruction* other) const { return true; }
 
-  virtual bool MayThrow() const { return false; }
-
  private:
   DISALLOW_COPY_AND_ASSIGN(LoadClassIdInstr);
 };
 
 
-class LoadFieldInstr : public TemplateDefinition<1> {
+class LoadFieldInstr : public TemplateDefinition<1, NoThrow> {
  public:
   LoadFieldInstr(Value* instance,
                  intptr_t offset_in_bytes,
@@ -4393,8 +4193,6 @@
   virtual EffectSet Dependencies() const;
   virtual bool AttributesEqual(Instruction* other) const;
 
-  virtual bool MayThrow() const { return false; }
-
  private:
   const intptr_t offset_in_bytes_;
   const AbstractType& type_;
@@ -4409,16 +4207,16 @@
 };
 
 
-class InstantiateTypeInstr : public TemplateDefinition<1> {
+class InstantiateTypeInstr : public TemplateDefinition<1, Throws> {
  public:
   InstantiateTypeInstr(intptr_t token_pos,
                        const AbstractType& type,
                        const Class& instantiator_class,
                        Value* instantiator)
-      : token_pos_(token_pos),
+      : TemplateDefinition(Isolate::Current()->GetNextDeoptId()),
+        token_pos_(token_pos),
         type_(type),
         instantiator_class_(instantiator_class) {
-    deopt_id_ = Isolate::Current()->GetNextDeoptId();
     ASSERT(type.IsZoneHandle());
     SetInputAt(0, instantiator);
   }
@@ -4437,8 +4235,6 @@
 
   virtual EffectSet Effects() const { return EffectSet::None(); }
 
-  virtual bool MayThrow() const { return true; }
-
  private:
   const intptr_t token_pos_;
   const AbstractType& type_;
@@ -4448,16 +4244,16 @@
 };
 
 
-class InstantiateTypeArgumentsInstr : public TemplateDefinition<1> {
+class InstantiateTypeArgumentsInstr : public TemplateDefinition<1, Throws> {
  public:
   InstantiateTypeArgumentsInstr(intptr_t token_pos,
                                 const TypeArguments& type_arguments,
                                 const Class& instantiator_class,
                                 Value* instantiator)
-      : token_pos_(token_pos),
+      : TemplateDefinition(Isolate::Current()->GetNextDeoptId()),
+        token_pos_(token_pos),
         type_arguments_(type_arguments),
         instantiator_class_(instantiator_class) {
-    deopt_id_ = Isolate::Current()->GetNextDeoptId();
     ASSERT(type_arguments.IsZoneHandle());
     SetInputAt(0, instantiator);
   }
@@ -4477,8 +4273,6 @@
 
   virtual EffectSet Effects() const { return EffectSet::None(); }
 
-  virtual bool MayThrow() const { return true; }
-
   virtual Definition* Canonicalize(FlowGraph* flow_graph);
 
  private:
@@ -4490,7 +4284,7 @@
 };
 
 
-class AllocateContextInstr : public TemplateDefinition<0> {
+class AllocateContextInstr : public TemplateDefinition<0, NoThrow> {
  public:
   AllocateContextInstr(intptr_t token_pos,
                        intptr_t num_context_variables)
@@ -4509,8 +4303,6 @@
 
   virtual EffectSet Effects() const { return EffectSet::None(); }
 
-  virtual bool MayThrow() const { return false; }
-
  private:
   const intptr_t token_pos_;
   const intptr_t num_context_variables_;
@@ -4519,11 +4311,11 @@
 };
 
 
-class InitStaticFieldInstr : public TemplateInstruction<1> {
+class InitStaticFieldInstr : public TemplateInstruction<1, Throws> {
  public:
   InitStaticFieldInstr(Value* input, const Field& field)
-      : field_(field) {
-    deopt_id_ = Isolate::Current()->GetNextDeoptId();
+      : TemplateInstruction(Isolate::Current()->GetNextDeoptId()),
+        field_(field) {
     SetInputAt(0, input);
   }
 
@@ -4535,7 +4327,6 @@
   virtual intptr_t ArgumentCount() const { return 0; }
   virtual bool CanDeoptimize() const { return true; }
   virtual EffectSet Effects() const { return EffectSet::All(); }
-  virtual bool MayThrow() const { return true; }
   virtual Instruction* Canonicalize(FlowGraph* flow_graph);
 
  private:
@@ -4545,7 +4336,8 @@
 };
 
 
-class AllocateUninitializedContextInstr : public TemplateDefinition<0> {
+class AllocateUninitializedContextInstr
+    : public TemplateDefinition<0, NoThrow> {
  public:
   AllocateUninitializedContextInstr(intptr_t token_pos,
                                     intptr_t num_context_variables)
@@ -4564,8 +4356,6 @@
 
   virtual EffectSet Effects() const { return EffectSet::None(); }
 
-  virtual bool MayThrow() const { return false; }
-
  private:
   const intptr_t token_pos_;
   const intptr_t num_context_variables_;
@@ -4574,11 +4364,11 @@
 };
 
 
-class CloneContextInstr : public TemplateDefinition<1> {
+class CloneContextInstr : public TemplateDefinition<1, NoThrow> {
  public:
   CloneContextInstr(intptr_t token_pos, Value* context_value)
-      : token_pos_(token_pos) {
-    deopt_id_ = Isolate::Current()->GetNextDeoptId();
+      : TemplateDefinition(Isolate::Current()->GetNextDeoptId()),
+        token_pos_(token_pos) {
     SetInputAt(0, context_value);
   }
 
@@ -4592,8 +4382,6 @@
 
   virtual EffectSet Effects() const { return EffectSet::None(); }
 
-  virtual bool MayThrow() const { return false; }
-
  private:
   const intptr_t token_pos_;
 
@@ -4601,14 +4389,12 @@
 };
 
 
-class CheckEitherNonSmiInstr : public TemplateInstruction<2> {
+class CheckEitherNonSmiInstr : public TemplateInstruction<2, NoThrow, Pure> {
  public:
   CheckEitherNonSmiInstr(Value* left, Value* right, intptr_t deopt_id)
-      : licm_hoisted_(false) {
+      : TemplateInstruction(deopt_id), licm_hoisted_(false) {
     SetInputAt(0, left);
     SetInputAt(1, right);
-    // Override generated deopt-id.
-    deopt_id_ = deopt_id;
   }
 
   Value* left() const { return inputs_[0]; }
@@ -4622,13 +4408,8 @@
 
   virtual Instruction* Canonicalize(FlowGraph* flow_graph);
 
-  virtual bool AllowsCSE() const { return true; }
-  virtual EffectSet Effects() const { return EffectSet::None(); }
-  virtual EffectSet Dependencies() const { return EffectSet::None(); }
   virtual bool AttributesEqual(Instruction* other) const { return true; }
 
-  virtual bool MayThrow() const { return false; }
-
   void set_licm_hoisted(bool value) { licm_hoisted_ = value; }
 
  private:
@@ -4638,7 +4419,7 @@
 };
 
 
-class BoxDoubleInstr : public TemplateDefinition<1> {
+class BoxDoubleInstr : public TemplateDefinition<1, NoThrow, Pure> {
  public:
   explicit BoxDoubleInstr(Value* value) {
     SetInputAt(0, value);
@@ -4660,13 +4441,8 @@
     return kUnboxedDouble;
   }
 
-  virtual bool AllowsCSE() const { return true; }
-  virtual EffectSet Effects() const { return EffectSet::None(); }
-  virtual EffectSet Dependencies() const { return EffectSet::None(); }
   virtual bool AttributesEqual(Instruction* other) const { return true; }
 
-  virtual bool MayThrow() const { return false; }
-
   Definition* Canonicalize(FlowGraph* flow_graph);
 
  private:
@@ -4674,7 +4450,7 @@
 };
 
 
-class BoxFloat32x4Instr : public TemplateDefinition<1> {
+class BoxFloat32x4Instr : public TemplateDefinition<1, NoThrow, Pure> {
  public:
   explicit BoxFloat32x4Instr(Value* value) {
     SetInputAt(0, value);
@@ -4696,13 +4472,8 @@
   DECLARE_INSTRUCTION(BoxFloat32x4)
   virtual CompileType ComputeType() const;
 
-  virtual bool AllowsCSE() const { return true; }
-  virtual EffectSet Effects() const { return EffectSet::None(); }
-  virtual EffectSet Dependencies() const { return EffectSet::None(); }
   virtual bool AttributesEqual(Instruction* other) const { return true; }
 
-  virtual bool MayThrow() const { return false; }
-
   Definition* Canonicalize(FlowGraph* flow_graph);
 
  private:
@@ -4710,7 +4481,7 @@
 };
 
 
-class BoxFloat64x2Instr : public TemplateDefinition<1> {
+class BoxFloat64x2Instr : public TemplateDefinition<1, NoThrow, Pure> {
  public:
   explicit BoxFloat64x2Instr(Value* value) {
     SetInputAt(0, value);
@@ -4732,13 +4503,8 @@
   DECLARE_INSTRUCTION(BoxFloat64x2)
   virtual CompileType ComputeType() const;
 
-  virtual bool AllowsCSE() const { return true; }
-  virtual EffectSet Effects() const { return EffectSet::None(); }
-  virtual EffectSet Dependencies() const { return EffectSet::None(); }
   virtual bool AttributesEqual(Instruction* other) const { return true; }
 
-  virtual bool MayThrow() const { return false; }
-
   Definition* Canonicalize(FlowGraph* flow_graph);
 
  private:
@@ -4747,7 +4513,7 @@
 
 
 
-class BoxInt32x4Instr : public TemplateDefinition<1> {
+class BoxInt32x4Instr : public TemplateDefinition<1, NoThrow, Pure> {
  public:
   explicit BoxInt32x4Instr(Value* value) {
     SetInputAt(0, value);
@@ -4769,13 +4535,8 @@
   DECLARE_INSTRUCTION(BoxInt32x4)
   virtual CompileType ComputeType() const;
 
-  virtual bool AllowsCSE() const { return true; }
-  virtual EffectSet Effects() const { return EffectSet::None(); }
-  virtual EffectSet Dependencies() const { return EffectSet::None(); }
   virtual bool AttributesEqual(Instruction* other) const { return true; }
 
-  virtual bool MayThrow() const { return false; }
-
   Definition* Canonicalize(FlowGraph* flow_graph);
 
  private:
@@ -4783,7 +4544,7 @@
 };
 
 
-class BoxIntegerInstr : public TemplateDefinition<1> {
+class BoxIntegerInstr : public TemplateDefinition<1, NoThrow, Pure> {
  public:
   explicit BoxIntegerInstr(Value* value) : is_smi_(false) {
     SetInputAt(0, value);
@@ -4811,13 +4572,8 @@
 
   virtual void InferRange(RangeAnalysis* analysis, Range* range);
 
-  virtual bool AllowsCSE() const { return true; }
-  virtual EffectSet Effects() const { return EffectSet::None(); }
-  virtual EffectSet Dependencies() const { return EffectSet::None(); }
   virtual bool AttributesEqual(Instruction* other) const { return true; }
 
-  virtual bool MayThrow() const { return false; }
-
   virtual Definition* Canonicalize(FlowGraph* flow_graph);
 
  private:
@@ -4827,11 +4583,11 @@
 };
 
 
-class UnboxDoubleInstr : public TemplateDefinition<1> {
+class UnboxDoubleInstr : public TemplateDefinition<1, NoThrow, Pure> {
  public:
-  UnboxDoubleInstr(Value* value, intptr_t deopt_id) {
+  UnboxDoubleInstr(Value* value, intptr_t deopt_id)
+      : TemplateDefinition(deopt_id) {
     SetInputAt(0, value);
-    deopt_id_ = deopt_id;
   }
 
   Value* value() const { return inputs_[0]; }
@@ -4848,13 +4604,8 @@
   DECLARE_INSTRUCTION(UnboxDouble)
   virtual CompileType ComputeType() const;
 
-  virtual bool AllowsCSE() const { return true; }
-  virtual EffectSet Effects() const { return EffectSet::None(); }
-  virtual EffectSet Dependencies() const { return EffectSet::None(); }
   virtual bool AttributesEqual(Instruction* other) const { return true; }
 
-  virtual bool MayThrow() const { return false; }
-
   Definition* Canonicalize(FlowGraph* flow_graph);
 
  private:
@@ -4862,11 +4613,11 @@
 };
 
 
-class UnboxFloat32x4Instr : public TemplateDefinition<1> {
+class UnboxFloat32x4Instr : public TemplateDefinition<1, NoThrow, Pure> {
  public:
-  UnboxFloat32x4Instr(Value* value, intptr_t deopt_id) {
+  UnboxFloat32x4Instr(Value* value, intptr_t deopt_id)
+      : TemplateDefinition(deopt_id) {
     SetInputAt(0, value);
-    deopt_id_ = deopt_id;
   }
 
   Value* value() const { return inputs_[0]; }
@@ -4882,13 +4633,8 @@
   DECLARE_INSTRUCTION(UnboxFloat32x4)
   virtual CompileType ComputeType() const;
 
-  virtual bool AllowsCSE() const { return true; }
-  virtual EffectSet Effects() const { return EffectSet::None(); }
-  virtual EffectSet Dependencies() const { return EffectSet::None(); }
   virtual bool AttributesEqual(Instruction* other) const { return true; }
 
-  virtual bool MayThrow() const { return false; }
-
   Definition* Canonicalize(FlowGraph* flow_graph);
 
  private:
@@ -4896,11 +4642,11 @@
 };
 
 
-class UnboxFloat64x2Instr : public TemplateDefinition<1> {
+class UnboxFloat64x2Instr : public TemplateDefinition<1, NoThrow, Pure> {
  public:
-  UnboxFloat64x2Instr(Value* value, intptr_t deopt_id) {
+  UnboxFloat64x2Instr(Value* value, intptr_t deopt_id)
+      : TemplateDefinition(deopt_id) {
     SetInputAt(0, value);
-    deopt_id_ = deopt_id;
   }
 
   Value* value() const { return inputs_[0]; }
@@ -4916,13 +4662,8 @@
   DECLARE_INSTRUCTION(UnboxFloat64x2)
   virtual CompileType ComputeType() const;
 
-  virtual bool AllowsCSE() const { return true; }
-  virtual EffectSet Effects() const { return EffectSet::None(); }
-  virtual EffectSet Dependencies() const { return EffectSet::None(); }
   virtual bool AttributesEqual(Instruction* other) const { return true; }
 
-  virtual bool MayThrow() const { return false; }
-
   Definition* Canonicalize(FlowGraph* flow_graph);
 
  private:
@@ -4930,11 +4671,11 @@
 };
 
 
-class UnboxInt32x4Instr : public TemplateDefinition<1> {
+class UnboxInt32x4Instr : public TemplateDefinition<1, NoThrow, Pure> {
  public:
-  UnboxInt32x4Instr(Value* value, intptr_t deopt_id) {
+  UnboxInt32x4Instr(Value* value, intptr_t deopt_id)
+      : TemplateDefinition(deopt_id) {
     SetInputAt(0, value);
-    deopt_id_ = deopt_id;
   }
 
   Value* value() const { return inputs_[0]; }
@@ -4947,16 +4688,11 @@
     return kUnboxedInt32x4;
   }
 
-  virtual bool AllowsCSE() const { return true; }
-  virtual EffectSet Effects() const { return EffectSet::None(); }
-  virtual EffectSet Dependencies() const { return EffectSet::None(); }
   virtual bool AttributesEqual(Instruction* other) const { return true; }
 
   DECLARE_INSTRUCTION(UnboxInt32x4)
   virtual CompileType ComputeType() const;
 
-  virtual bool MayThrow() const { return false; }
-
   Definition* Canonicalize(FlowGraph* flow_graph);
 
  private:
@@ -4964,11 +4700,11 @@
 };
 
 
-class UnboxIntegerInstr : public TemplateDefinition<1> {
+class UnboxIntegerInstr : public TemplateDefinition<1, NoThrow, Pure> {
  public:
-  UnboxIntegerInstr(Value* value, intptr_t deopt_id) {
+  UnboxIntegerInstr(Value* value, intptr_t deopt_id)
+      : TemplateDefinition(deopt_id) {
     SetInputAt(0, value);
-    deopt_id_ = deopt_id;
   }
 
   Value* value() const { return inputs_[0]; }
@@ -4982,20 +4718,15 @@
     return kUnboxedMint;
   }
 
-  intptr_t deopt_id() const { return deopt_id_; }
+  intptr_t deopt_id() const { return GetDeoptId(); }
 
   virtual void InferRange(RangeAnalysis* analysis, Range* range);
 
   DECLARE_INSTRUCTION(UnboxInteger)
   virtual CompileType ComputeType() const;
 
-  virtual bool AllowsCSE() const { return true; }
-  virtual EffectSet Effects() const { return EffectSet::None(); }
-  virtual EffectSet Dependencies() const { return EffectSet::None(); }
   virtual bool AttributesEqual(Instruction* other) const { return true; }
 
-  virtual bool MayThrow() const { return false; }
-
   virtual Definition* Canonicalize(FlowGraph* flow_graph);
 
  private:
@@ -5003,7 +4734,7 @@
 };
 
 
-class MathUnaryInstr : public TemplateDefinition<1> {
+class MathUnaryInstr : public TemplateDefinition<1, NoThrow, Pure> {
  public:
   enum MathUnaryKind {
     kIllegal,
@@ -5013,9 +4744,8 @@
     kDoubleSquare,
   };
   MathUnaryInstr(MathUnaryKind kind, Value* value, intptr_t deopt_id)
-      : kind_(kind) {
+      : TemplateDefinition(deopt_id), kind_(kind) {
     SetInputAt(0, value);
-    deopt_id_ = deopt_id;
   }
 
   Value* value() const { return inputs_[0]; }
@@ -5038,21 +4768,16 @@
   virtual intptr_t DeoptimizationTarget() const {
     // Direct access since this instruction cannot deoptimize, and the deopt-id
     // was inherited from another instruction that could deoptimize.
-    return deopt_id_;
+    return GetDeoptId();
   }
 
   DECLARE_INSTRUCTION(MathUnary)
   virtual CompileType ComputeType() const;
 
-  virtual bool AllowsCSE() const { return true; }
-  virtual EffectSet Effects() const { return EffectSet::None(); }
-  virtual EffectSet Dependencies() const { return EffectSet::None(); }
   virtual bool AttributesEqual(Instruction* other) const {
     return kind() == other->AsMathUnary()->kind();
   }
 
-  virtual bool MayThrow() const { return false; }
-
   Definition* Canonicalize(FlowGraph* flow_graph);
 
   static const char* KindToCString(MathUnaryKind kind);
@@ -5065,18 +4790,19 @@
 
 
 // Represents Math's static min and max functions.
-class MathMinMaxInstr : public TemplateDefinition<2> {
+class MathMinMaxInstr : public TemplateDefinition<2, NoThrow, Pure> {
  public:
   MathMinMaxInstr(MethodRecognizer::Kind op_kind,
                   Value* left_value,
                   Value* right_value,
                   intptr_t deopt_id,
                   intptr_t result_cid)
-      : op_kind_(op_kind), result_cid_(result_cid) {
+      : TemplateDefinition(deopt_id),
+        op_kind_(op_kind),
+        result_cid_(result_cid) {
     ASSERT((result_cid == kSmiCid) || (result_cid == kDoubleCid));
     SetInputAt(0, left_value);
     SetInputAt(1, right_value);
-    deopt_id_ = deopt_id;
   }
 
   MethodRecognizer::Kind op_kind() const { return op_kind_; }
@@ -5107,18 +4833,13 @@
   virtual intptr_t DeoptimizationTarget() const {
     // Direct access since this instruction cannot deoptimize, and the deopt-id
     // was inherited from another instruction that could deoptimize.
-    return deopt_id_;
+    return GetDeoptId();
   }
 
   DECLARE_INSTRUCTION(MathMinMax)
   virtual CompileType ComputeType() const;
-  virtual bool AllowsCSE() const { return true; }
-  virtual EffectSet Effects() const { return EffectSet::None(); }
-  virtual EffectSet Dependencies() const { return EffectSet::None(); }
   virtual bool AttributesEqual(Instruction* other) const;
 
-  virtual bool MayThrow() const { return false; }
-
  private:
   const MethodRecognizer::Kind op_kind_;
   const intptr_t result_cid_;
@@ -5127,18 +4848,18 @@
 };
 
 
-class BinaryDoubleOpInstr : public TemplateDefinition<2> {
+class BinaryDoubleOpInstr : public TemplateDefinition<2, NoThrow, Pure> {
  public:
   BinaryDoubleOpInstr(Token::Kind op_kind,
                       Value* left,
                       Value* right,
                       intptr_t deopt_id,
                       intptr_t token_pos)
-      : op_kind_(op_kind), token_pos_(token_pos) {
+      : TemplateDefinition(deopt_id),
+        op_kind_(op_kind),
+        token_pos_(token_pos) {
     SetInputAt(0, left);
     SetInputAt(1, right);
-    // Overriden generated deopt_id.
-    deopt_id_ = deopt_id;
   }
 
   Value* left() const { return inputs_[0]; }
@@ -5164,7 +4885,7 @@
   virtual intptr_t DeoptimizationTarget() const {
     // Direct access since this instruction cannot deoptimize, and the deopt-id
     // was inherited from another instruction that could deoptimize.
-    return deopt_id_;
+    return GetDeoptId();
   }
 
   DECLARE_INSTRUCTION(BinaryDoubleOp)
@@ -5172,15 +4893,10 @@
 
   virtual Definition* Canonicalize(FlowGraph* flow_graph);
 
-  virtual bool AllowsCSE() const { return true; }
-  virtual EffectSet Effects() const { return EffectSet::None(); }
-  virtual EffectSet Dependencies() const { return EffectSet::None(); }
   virtual bool AttributesEqual(Instruction* other) const {
     return op_kind() == other->AsBinaryDoubleOp()->op_kind();
   }
 
-  virtual bool MayThrow() const { return false; }
-
  private:
   const Token::Kind op_kind_;
   const intptr_t token_pos_;
@@ -5189,16 +4905,15 @@
 };
 
 
-class BinaryFloat32x4OpInstr : public TemplateDefinition<2> {
+class BinaryFloat32x4OpInstr : public TemplateDefinition<2, NoThrow, Pure> {
  public:
   BinaryFloat32x4OpInstr(Token::Kind op_kind,
                          Value* left,
                          Value* right,
                          intptr_t deopt_id)
-      : op_kind_(op_kind) {
+      : TemplateDefinition(deopt_id), op_kind_(op_kind) {
     SetInputAt(0, left);
     SetInputAt(1, right);
-    deopt_id_ = deopt_id;
   }
 
   Value* left() const { return inputs_[0]; }
@@ -5222,21 +4937,16 @@
   virtual intptr_t DeoptimizationTarget() const {
     // Direct access since this instruction cannot deoptimize, and the deopt-id
     // was inherited from another instruction that could deoptimize.
-    return deopt_id_;
+    return GetDeoptId();
   }
 
   DECLARE_INSTRUCTION(BinaryFloat32x4Op)
   virtual CompileType ComputeType() const;
 
-  virtual bool AllowsCSE() const { return true; }
-  virtual EffectSet Effects() const { return EffectSet::None(); }
-  virtual EffectSet Dependencies() const { return EffectSet::None(); }
   virtual bool AttributesEqual(Instruction* other) const {
     return op_kind() == other->AsBinaryFloat32x4Op()->op_kind();
   }
 
-  virtual bool MayThrow() const { return false; }
-
  private:
   const Token::Kind op_kind_;
 
@@ -5244,14 +4954,13 @@
 };
 
 
-class Simd32x4ShuffleInstr : public TemplateDefinition<1> {
+class Simd32x4ShuffleInstr : public TemplateDefinition<1, NoThrow, Pure> {
  public:
   Simd32x4ShuffleInstr(MethodRecognizer::Kind op_kind, Value* value,
                        intptr_t mask,
                        intptr_t deopt_id)
-      : op_kind_(op_kind), mask_(mask) {
+      : TemplateDefinition(deopt_id), op_kind_(op_kind), mask_(mask) {
     SetInputAt(0, value);
-    deopt_id_ = deopt_id;
   }
 
   Value* value() const { return inputs_[0]; }
@@ -5294,22 +5003,17 @@
   virtual intptr_t DeoptimizationTarget() const {
     // Direct access since this instruction cannot deoptimize, and the deopt-id
     // was inherited from another instruction that could deoptimize.
-    return deopt_id_;
+    return GetDeoptId();
   }
 
   DECLARE_INSTRUCTION(Simd32x4Shuffle)
   virtual CompileType ComputeType() const;
 
-  virtual bool AllowsCSE() const { return true; }
-  virtual EffectSet Effects() const { return EffectSet::None(); }
-  virtual EffectSet Dependencies() const { return EffectSet::None(); }
   virtual bool AttributesEqual(Instruction* other) const {
     return (op_kind() == other->AsSimd32x4Shuffle()->op_kind()) &&
            (mask() == other->AsSimd32x4Shuffle()->mask());
   }
 
-  virtual bool MayThrow() const { return false; }
-
  private:
   const MethodRecognizer::Kind op_kind_;
   const intptr_t mask_;
@@ -5318,14 +5022,13 @@
 };
 
 
-class Simd32x4ShuffleMixInstr : public TemplateDefinition<2> {
+class Simd32x4ShuffleMixInstr : public TemplateDefinition<2, NoThrow, Pure> {
  public:
   Simd32x4ShuffleMixInstr(MethodRecognizer::Kind op_kind, Value* xy,
                            Value* zw, intptr_t mask, intptr_t deopt_id)
-      : op_kind_(op_kind), mask_(mask) {
+      : TemplateDefinition(deopt_id), op_kind_(op_kind), mask_(mask) {
     SetInputAt(0, xy);
     SetInputAt(1, zw);
-    deopt_id_ = deopt_id;
   }
 
   Value* xy() const { return inputs_[0]; }
@@ -5359,22 +5062,17 @@
   virtual intptr_t DeoptimizationTarget() const {
     // Direct access since this instruction cannot deoptimize, and the deopt-id
     // was inherited from another instruction that could deoptimize.
-    return deopt_id_;
+    return GetDeoptId();
   }
 
   DECLARE_INSTRUCTION(Simd32x4ShuffleMix)
   virtual CompileType ComputeType() const;
 
-  virtual bool AllowsCSE() const { return true; }
-  virtual EffectSet Effects() const { return EffectSet::None(); }
-  virtual EffectSet Dependencies() const { return EffectSet::None(); }
   virtual bool AttributesEqual(Instruction* other) const {
     return (op_kind() == other->AsSimd32x4ShuffleMix()->op_kind()) &&
            (mask() == other->AsSimd32x4ShuffleMix()->mask());
   }
 
-  virtual bool MayThrow() const { return false; }
-
  private:
   const MethodRecognizer::Kind op_kind_;
   const intptr_t mask_;
@@ -5383,15 +5081,18 @@
 };
 
 
-class Float32x4ConstructorInstr : public TemplateDefinition<4> {
+class Float32x4ConstructorInstr : public TemplateDefinition<4, NoThrow, Pure> {
  public:
-  Float32x4ConstructorInstr(Value* value0, Value* value1, Value* value2,
-                            Value* value3, intptr_t deopt_id) {
+  Float32x4ConstructorInstr(Value* value0,
+                            Value* value1,
+                            Value* value2,
+                            Value* value3,
+                            intptr_t deopt_id)
+      : TemplateDefinition(deopt_id) {
     SetInputAt(0, value0);
     SetInputAt(1, value1);
     SetInputAt(2, value2);
     SetInputAt(3, value3);
-    deopt_id_ = deopt_id;
   }
 
   Value* value0() const { return inputs_[0]; }
@@ -5415,29 +5116,24 @@
   virtual intptr_t DeoptimizationTarget() const {
     // Direct access since this instruction cannot deoptimize, and the deopt-id
     // was inherited from another instruction that could deoptimize.
-    return deopt_id_;
+    return GetDeoptId();
   }
 
   DECLARE_INSTRUCTION(Float32x4Constructor)
   virtual CompileType ComputeType() const;
 
-  virtual bool AllowsCSE() const { return true; }
-  virtual EffectSet Effects() const { return EffectSet::None(); }
-  virtual EffectSet Dependencies() const { return EffectSet::None(); }
   virtual bool AttributesEqual(Instruction* other) const { return true; }
 
-  virtual bool MayThrow() const { return false; }
-
  private:
   DISALLOW_COPY_AND_ASSIGN(Float32x4ConstructorInstr);
 };
 
 
-class Float32x4SplatInstr : public TemplateDefinition<1> {
+class Float32x4SplatInstr : public TemplateDefinition<1, NoThrow, Pure> {
  public:
-  Float32x4SplatInstr(Value* value, intptr_t deopt_id) {
+  Float32x4SplatInstr(Value* value, intptr_t deopt_id)
+      : TemplateDefinition(deopt_id) {
     SetInputAt(0, value);
-    deopt_id_ = deopt_id;
   }
 
   Value* value() const { return inputs_[0]; }
@@ -5458,33 +5154,23 @@
   virtual intptr_t DeoptimizationTarget() const {
     // Direct access since this instruction cannot deoptimize, and the deopt-id
     // was inherited from another instruction that could deoptimize.
-    return deopt_id_;
+    return GetDeoptId();
   }
 
   DECLARE_INSTRUCTION(Float32x4Splat)
   virtual CompileType ComputeType() const;
 
-  virtual bool AllowsCSE() const { return true; }
-  virtual EffectSet Effects() const { return EffectSet::None(); }
-  virtual EffectSet Dependencies() const { return EffectSet::None(); }
   virtual bool AttributesEqual(Instruction* other) const { return true; }
 
-  virtual bool MayThrow() const { return false; }
-
  private:
   DISALLOW_COPY_AND_ASSIGN(Float32x4SplatInstr);
 };
 
 
-class Float32x4ZeroInstr : public TemplateDefinition<0> {
+// TODO(vegorov) replace with UnboxedConstantInstr.
+class Float32x4ZeroInstr : public TemplateDefinition<0, NoThrow, Pure> {
  public:
-  explicit Float32x4ZeroInstr(intptr_t deopt_id) {
-    deopt_id_ = deopt_id;
-  }
-
-  Value* value() const { return inputs_[0]; }
-
-  virtual void PrintOperandsTo(BufferFormatter* f) const;
+  Float32x4ZeroInstr() { }
 
   virtual bool CanDeoptimize() const { return false; }
 
@@ -5492,40 +5178,25 @@
     return kUnboxedFloat32x4;
   }
 
-  virtual Representation RequiredInputRepresentation(intptr_t idx) const {
-    UNIMPLEMENTED();
-    return kUnboxedFloat32x4;
-  }
-
-  virtual intptr_t DeoptimizationTarget() const {
-    // Direct access since this instruction cannot deoptimize, and the deopt-id
-    // was inherited from another instruction that could deoptimize.
-    return deopt_id_;
-  }
-
   DECLARE_INSTRUCTION(Float32x4Zero)
   virtual CompileType ComputeType() const;
 
-  virtual bool AllowsCSE() const { return true; }
-  virtual EffectSet Effects() const { return EffectSet::None(); }
-  virtual EffectSet Dependencies() const { return EffectSet::None(); }
   virtual bool AttributesEqual(Instruction* other) const { return true; }
 
-  virtual bool MayThrow() const { return false; }
-
  private:
   DISALLOW_COPY_AND_ASSIGN(Float32x4ZeroInstr);
 };
 
 
-class Float32x4ComparisonInstr : public TemplateDefinition<2> {
+class Float32x4ComparisonInstr : public TemplateDefinition<2, NoThrow, Pure> {
  public:
-  Float32x4ComparisonInstr(MethodRecognizer::Kind op_kind, Value* left,
-                           Value* right, intptr_t deopt_id)
-      : op_kind_(op_kind) {
+  Float32x4ComparisonInstr(MethodRecognizer::Kind op_kind,
+                           Value* left,
+                           Value* right,
+                           intptr_t deopt_id)
+      : TemplateDefinition(deopt_id), op_kind_(op_kind) {
     SetInputAt(0, left);
     SetInputAt(1, right);
-    deopt_id_ = deopt_id;
   }
 
   Value* left() const { return inputs_[0]; }
@@ -5549,21 +5220,16 @@
   virtual intptr_t DeoptimizationTarget() const {
     // Direct access since this instruction cannot deoptimize, and the deopt-id
     // was inherited from another instruction that could deoptimize.
-    return deopt_id_;
+    return GetDeoptId();
   }
 
   DECLARE_INSTRUCTION(Float32x4Comparison)
   virtual CompileType ComputeType() const;
 
-  virtual bool AllowsCSE() const { return true; }
-  virtual EffectSet Effects() const { return EffectSet::None(); }
-  virtual EffectSet Dependencies() const { return EffectSet::None(); }
   virtual bool AttributesEqual(Instruction* other) const {
     return op_kind() == other->AsFloat32x4Comparison()->op_kind();
   }
 
-  virtual bool MayThrow() const { return false; }
-
  private:
   const MethodRecognizer::Kind op_kind_;
 
@@ -5571,14 +5237,15 @@
 };
 
 
-class Float32x4MinMaxInstr : public TemplateDefinition<2> {
+class Float32x4MinMaxInstr : public TemplateDefinition<2, NoThrow, Pure> {
  public:
-  Float32x4MinMaxInstr(MethodRecognizer::Kind op_kind, Value* left,
-                       Value* right, intptr_t deopt_id)
-      : op_kind_(op_kind) {
+  Float32x4MinMaxInstr(MethodRecognizer::Kind op_kind,
+                       Value* left,
+                       Value* right,
+                       intptr_t deopt_id)
+      : TemplateDefinition(deopt_id), op_kind_(op_kind) {
     SetInputAt(0, left);
     SetInputAt(1, right);
-    deopt_id_ = deopt_id;
   }
 
   Value* left() const { return inputs_[0]; }
@@ -5602,21 +5269,16 @@
   virtual intptr_t DeoptimizationTarget() const {
     // Direct access since this instruction cannot deoptimize, and the deopt-id
     // was inherited from another instruction that could deoptimize.
-    return deopt_id_;
+    return GetDeoptId();
   }
 
   DECLARE_INSTRUCTION(Float32x4MinMax)
   virtual CompileType ComputeType() const;
 
-  virtual bool AllowsCSE() const { return true; }
-  virtual EffectSet Effects() const { return EffectSet::None(); }
-  virtual EffectSet Dependencies() const { return EffectSet::None(); }
   virtual bool AttributesEqual(Instruction* other) const {
     return op_kind() == other->AsFloat32x4MinMax()->op_kind();
   }
 
-  virtual bool MayThrow() const { return false; }
-
  private:
   const MethodRecognizer::Kind op_kind_;
 
@@ -5624,14 +5286,15 @@
 };
 
 
-class Float32x4ScaleInstr : public TemplateDefinition<2> {
+class Float32x4ScaleInstr : public TemplateDefinition<2, NoThrow, Pure> {
  public:
-  Float32x4ScaleInstr(MethodRecognizer::Kind op_kind, Value* left,
-                      Value* right, intptr_t deopt_id)
-      : op_kind_(op_kind) {
+  Float32x4ScaleInstr(MethodRecognizer::Kind op_kind,
+                      Value* left,
+                      Value* right,
+                      intptr_t deopt_id)
+      : TemplateDefinition(deopt_id), op_kind_(op_kind) {
     SetInputAt(0, left);
     SetInputAt(1, right);
-    deopt_id_ = deopt_id;
   }
 
   Value* left() const { return inputs_[0]; }
@@ -5658,21 +5321,16 @@
   virtual intptr_t DeoptimizationTarget() const {
     // Direct access since this instruction cannot deoptimize, and the deopt-id
     // was inherited from another instruction that could deoptimize.
-    return deopt_id_;
+    return GetDeoptId();
   }
 
   DECLARE_INSTRUCTION(Float32x4Scale)
   virtual CompileType ComputeType() const;
 
-  virtual bool AllowsCSE() const { return true; }
-  virtual EffectSet Effects() const { return EffectSet::None(); }
-  virtual EffectSet Dependencies() const { return EffectSet::None(); }
   virtual bool AttributesEqual(Instruction* other) const {
     return op_kind() == other->AsFloat32x4Scale()->op_kind();
   }
 
-  virtual bool MayThrow() const { return false; }
-
  private:
   const MethodRecognizer::Kind op_kind_;
 
@@ -5680,12 +5338,13 @@
 };
 
 
-class Float32x4SqrtInstr : public TemplateDefinition<1> {
+class Float32x4SqrtInstr : public TemplateDefinition<1, NoThrow, Pure> {
  public:
-  Float32x4SqrtInstr(MethodRecognizer::Kind op_kind, Value* left,
-                     intptr_t deopt_id) : op_kind_(op_kind) {
+  Float32x4SqrtInstr(MethodRecognizer::Kind op_kind,
+                     Value* left,
+                     intptr_t deopt_id)
+      : TemplateDefinition(deopt_id), op_kind_(op_kind) {
     SetInputAt(0, left);
-    deopt_id_ = deopt_id;
   }
 
   Value* left() const { return inputs_[0]; }
@@ -5708,21 +5367,16 @@
   virtual intptr_t DeoptimizationTarget() const {
     // Direct access since this instruction cannot deoptimize, and the deopt-id
     // was inherited from another instruction that could deoptimize.
-    return deopt_id_;
+    return GetDeoptId();
   }
 
   DECLARE_INSTRUCTION(Float32x4Sqrt)
   virtual CompileType ComputeType() const;
 
-  virtual bool AllowsCSE() const { return true; }
-  virtual EffectSet Effects() const { return EffectSet::None(); }
-  virtual EffectSet Dependencies() const { return EffectSet::None(); }
   virtual bool AttributesEqual(Instruction* other) const {
     return op_kind() == other->AsFloat32x4Sqrt()->op_kind();
   }
 
-  virtual bool MayThrow() const { return false; }
-
  private:
   const MethodRecognizer::Kind op_kind_;
 
@@ -5730,12 +5384,15 @@
 };
 
 
-class Float32x4ZeroArgInstr : public TemplateDefinition<1> {
+// TODO(vegorov) rename to Unary to match naming convention for arithmetic.
+class Float32x4ZeroArgInstr : public TemplateDefinition<1, NoThrow, Pure> {
  public:
-  Float32x4ZeroArgInstr(MethodRecognizer::Kind op_kind, Value* left,
-                        intptr_t deopt_id) : op_kind_(op_kind) {
+  Float32x4ZeroArgInstr(MethodRecognizer::Kind op_kind,
+                        Value* left,
+                        intptr_t deopt_id)
+      : TemplateDefinition(deopt_id),
+        op_kind_(op_kind) {
     SetInputAt(0, left);
-    deopt_id_ = deopt_id;
   }
 
   Value* left() const { return inputs_[0]; }
@@ -5758,21 +5415,16 @@
   virtual intptr_t DeoptimizationTarget() const {
     // Direct access since this instruction cannot deoptimize, and the deopt-id
     // was inherited from another instruction that could deoptimize.
-    return deopt_id_;
+    return GetDeoptId();
   }
 
   DECLARE_INSTRUCTION(Float32x4ZeroArg)
   virtual CompileType ComputeType() const;
 
-  virtual bool AllowsCSE() const { return true; }
-  virtual EffectSet Effects() const { return EffectSet::None(); }
-  virtual EffectSet Dependencies() const { return EffectSet::None(); }
   virtual bool AttributesEqual(Instruction* other) const {
     return op_kind() == other->AsFloat32x4ZeroArg()->op_kind();
   }
 
-  virtual bool MayThrow() const { return false; }
-
  private:
   const MethodRecognizer::Kind op_kind_;
 
@@ -5780,14 +5432,16 @@
 };
 
 
-class Float32x4ClampInstr : public TemplateDefinition<3> {
+class Float32x4ClampInstr : public TemplateDefinition<3, NoThrow, Pure> {
  public:
-  Float32x4ClampInstr(Value* left, Value* lower, Value* upper,
-                      intptr_t deopt_id) {
+  Float32x4ClampInstr(Value* left,
+                      Value* lower,
+                      Value* upper,
+                      intptr_t deopt_id)
+      : TemplateDefinition(deopt_id) {
     SetInputAt(0, left);
     SetInputAt(1, lower);
     SetInputAt(2, upper);
-    deopt_id_ = deopt_id;
   }
 
   Value* left() const { return inputs_[0]; }
@@ -5810,32 +5464,29 @@
   virtual intptr_t DeoptimizationTarget() const {
     // Direct access since this instruction cannot deoptimize, and the deopt-id
     // was inherited from another instruction that could deoptimize.
-    return deopt_id_;
+    return GetDeoptId();
   }
 
   DECLARE_INSTRUCTION(Float32x4Clamp)
   virtual CompileType ComputeType() const;
 
-  virtual bool AllowsCSE() const { return true; }
-  virtual EffectSet Effects() const { return EffectSet::None(); }
-  virtual EffectSet Dependencies() const { return EffectSet::None(); }
   virtual bool AttributesEqual(Instruction* other) const { return true; }
 
-  virtual bool MayThrow() const { return false; }
-
  private:
   DISALLOW_COPY_AND_ASSIGN(Float32x4ClampInstr);
 };
 
 
-class Float32x4WithInstr : public TemplateDefinition<2> {
+class Float32x4WithInstr : public TemplateDefinition<2, NoThrow, Pure> {
  public:
-  Float32x4WithInstr(MethodRecognizer::Kind op_kind, Value* left,
-                     Value* replacement, intptr_t deopt_id)
-      : op_kind_(op_kind) {
+  Float32x4WithInstr(MethodRecognizer::Kind op_kind,
+                     Value* left,
+                     Value* replacement,
+                     intptr_t deopt_id)
+      : TemplateDefinition(deopt_id),
+        op_kind_(op_kind) {
     SetInputAt(0, replacement);
     SetInputAt(1, left);
-    deopt_id_ = deopt_id;
   }
 
   Value* left() const { return inputs_[1]; }
@@ -5862,21 +5513,16 @@
   virtual intptr_t DeoptimizationTarget() const {
     // Direct access since this instruction cannot deoptimize, and the deopt-id
     // was inherited from another instruction that could deoptimize.
-    return deopt_id_;
+    return GetDeoptId();
   }
 
   DECLARE_INSTRUCTION(Float32x4With)
   virtual CompileType ComputeType() const;
 
-  virtual bool AllowsCSE() const { return true; }
-  virtual EffectSet Effects() const { return EffectSet::None(); }
-  virtual EffectSet Dependencies() const { return EffectSet::None(); }
   virtual bool AttributesEqual(Instruction* other) const {
     return op_kind() == other->AsFloat32x4With()->op_kind();
   }
 
-  virtual bool MayThrow() const { return false; }
-
  private:
   const MethodRecognizer::Kind op_kind_;
 
@@ -5884,14 +5530,14 @@
 };
 
 
-class Simd64x2ShuffleInstr : public TemplateDefinition<1> {
+class Simd64x2ShuffleInstr : public TemplateDefinition<1, NoThrow, Pure> {
  public:
-  Simd64x2ShuffleInstr(MethodRecognizer::Kind op_kind, Value* value,
+  Simd64x2ShuffleInstr(MethodRecognizer::Kind op_kind,
+                       Value* value,
                        intptr_t mask,
                        intptr_t deopt_id)
-      : op_kind_(op_kind), mask_(mask) {
+      : TemplateDefinition(deopt_id), op_kind_(op_kind), mask_(mask) {
     SetInputAt(0, value);
-    deopt_id_ = deopt_id;
   }
 
   Value* value() const { return inputs_[0]; }
@@ -5926,22 +5572,17 @@
   virtual intptr_t DeoptimizationTarget() const {
     // Direct access since this instruction cannot deoptimize, and the deopt-id
     // was inherited from another instruction that could deoptimize.
-    return deopt_id_;
+    return GetDeoptId();
   }
 
   DECLARE_INSTRUCTION(Simd64x2Shuffle)
   virtual CompileType ComputeType() const;
 
-  virtual bool AllowsCSE() const { return true; }
-  virtual EffectSet Effects() const { return EffectSet::None(); }
-  virtual EffectSet Dependencies() const { return EffectSet::None(); }
   virtual bool AttributesEqual(Instruction* other) const {
     return (op_kind() == other->AsSimd64x2Shuffle()->op_kind()) &&
            (mask() == other->AsSimd64x2Shuffle()->mask());
   }
 
-  virtual bool MayThrow() const { return false; }
-
  private:
   const MethodRecognizer::Kind op_kind_;
   const intptr_t mask_;
@@ -5950,11 +5591,11 @@
 };
 
 
-class Float32x4ToInt32x4Instr : public TemplateDefinition<1> {
+class Float32x4ToInt32x4Instr : public TemplateDefinition<1, NoThrow, Pure> {
  public:
-  Float32x4ToInt32x4Instr(Value* left, intptr_t deopt_id) {
+  Float32x4ToInt32x4Instr(Value* left, intptr_t deopt_id)
+      : TemplateDefinition(deopt_id) {
     SetInputAt(0, left);
-    deopt_id_ = deopt_id;
   }
 
   Value* left() const { return inputs_[0]; }
@@ -5975,29 +5616,24 @@
   virtual intptr_t DeoptimizationTarget() const {
     // Direct access since this instruction cannot deoptimize, and the deopt-id
     // was inherited from another instruction that could deoptimize.
-    return deopt_id_;
+    return GetDeoptId();
   }
 
   DECLARE_INSTRUCTION(Float32x4ToInt32x4)
   virtual CompileType ComputeType() const;
 
-  virtual bool AllowsCSE() const { return true; }
-  virtual EffectSet Effects() const { return EffectSet::None(); }
-  virtual EffectSet Dependencies() const { return EffectSet::None(); }
   virtual bool AttributesEqual(Instruction* other) const { return true; }
 
-  virtual bool MayThrow() const { return false; }
-
  private:
   DISALLOW_COPY_AND_ASSIGN(Float32x4ToInt32x4Instr);
 };
 
 
-class Float32x4ToFloat64x2Instr : public TemplateDefinition<1> {
+class Float32x4ToFloat64x2Instr : public TemplateDefinition<1, NoThrow, Pure> {
  public:
-  Float32x4ToFloat64x2Instr(Value* left, intptr_t deopt_id) {
+  Float32x4ToFloat64x2Instr(Value* left, intptr_t deopt_id)
+      : TemplateDefinition(deopt_id) {
     SetInputAt(0, left);
-    deopt_id_ = deopt_id;
   }
 
   Value* left() const { return inputs_[0]; }
@@ -6018,29 +5654,24 @@
   virtual intptr_t DeoptimizationTarget() const {
     // Direct access since this instruction cannot deoptimize, and the deopt-id
     // was inherited from another instruction that could deoptimize.
-    return deopt_id_;
+    return GetDeoptId();
   }
 
   DECLARE_INSTRUCTION(Float32x4ToFloat64x2)
   virtual CompileType ComputeType() const;
 
-  virtual bool AllowsCSE() const { return true; }
-  virtual EffectSet Effects() const { return EffectSet::None(); }
-  virtual EffectSet Dependencies() const { return EffectSet::None(); }
   virtual bool AttributesEqual(Instruction* other) const { return true; }
 
-  virtual bool MayThrow() const { return false; }
-
  private:
   DISALLOW_COPY_AND_ASSIGN(Float32x4ToFloat64x2Instr);
 };
 
 
-class Float64x2ToFloat32x4Instr : public TemplateDefinition<1> {
+class Float64x2ToFloat32x4Instr : public TemplateDefinition<1, NoThrow, Pure> {
  public:
-  Float64x2ToFloat32x4Instr(Value* left, intptr_t deopt_id) {
+  Float64x2ToFloat32x4Instr(Value* left, intptr_t deopt_id)
+      : TemplateDefinition(deopt_id) {
     SetInputAt(0, left);
-    deopt_id_ = deopt_id;
   }
 
   Value* left() const { return inputs_[0]; }
@@ -6061,30 +5692,25 @@
   virtual intptr_t DeoptimizationTarget() const {
     // Direct access since this instruction cannot deoptimize, and the deopt-id
     // was inherited from another instruction that could deoptimize.
-    return deopt_id_;
+    return GetDeoptId();
   }
 
   DECLARE_INSTRUCTION(Float64x2ToFloat32x4)
   virtual CompileType ComputeType() const;
 
-  virtual bool AllowsCSE() const { return true; }
-  virtual EffectSet Effects() const { return EffectSet::None(); }
-  virtual EffectSet Dependencies() const { return EffectSet::None(); }
   virtual bool AttributesEqual(Instruction* other) const { return true; }
 
-  virtual bool MayThrow() const { return false; }
-
  private:
   DISALLOW_COPY_AND_ASSIGN(Float64x2ToFloat32x4Instr);
 };
 
 
-class Float64x2ConstructorInstr : public TemplateDefinition<2> {
+class Float64x2ConstructorInstr : public TemplateDefinition<2, NoThrow, Pure> {
  public:
-  Float64x2ConstructorInstr(Value* value0, Value* value1, intptr_t deopt_id) {
+  Float64x2ConstructorInstr(Value* value0, Value* value1, intptr_t deopt_id)
+      : TemplateDefinition(deopt_id) {
     SetInputAt(0, value0);
     SetInputAt(1, value1);
-    deopt_id_ = deopt_id;
   }
 
   Value* value0() const { return inputs_[0]; }
@@ -6106,29 +5732,24 @@
   virtual intptr_t DeoptimizationTarget() const {
     // Direct access since this instruction cannot deoptimize, and the deopt-id
     // was inherited from another instruction that could deoptimize.
-    return deopt_id_;
+    return GetDeoptId();
   }
 
   DECLARE_INSTRUCTION(Float64x2Constructor)
   virtual CompileType ComputeType() const;
 
-  virtual bool AllowsCSE() const { return true; }
-  virtual EffectSet Effects() const { return EffectSet::None(); }
-  virtual EffectSet Dependencies() const { return EffectSet::None(); }
   virtual bool AttributesEqual(Instruction* other) const { return true; }
 
-  virtual bool MayThrow() const { return false; }
-
  private:
   DISALLOW_COPY_AND_ASSIGN(Float64x2ConstructorInstr);
 };
 
 
-class Float64x2SplatInstr : public TemplateDefinition<1> {
+class Float64x2SplatInstr : public TemplateDefinition<1, NoThrow, Pure> {
  public:
-  Float64x2SplatInstr(Value* value, intptr_t deopt_id) {
+  Float64x2SplatInstr(Value* value, intptr_t deopt_id)
+      : TemplateDefinition(deopt_id) {
     SetInputAt(0, value);
-    deopt_id_ = deopt_id;
   }
 
   Value* value() const { return inputs_[0]; }
@@ -6149,31 +5770,22 @@
   virtual intptr_t DeoptimizationTarget() const {
     // Direct access since this instruction cannot deoptimize, and the deopt-id
     // was inherited from another instruction that could deoptimize.
-    return deopt_id_;
+    return GetDeoptId();
   }
 
   DECLARE_INSTRUCTION(Float64x2Splat)
   virtual CompileType ComputeType() const;
 
-  virtual bool AllowsCSE() const { return true; }
-  virtual EffectSet Effects() const { return EffectSet::None(); }
-  virtual EffectSet Dependencies() const { return EffectSet::None(); }
   virtual bool AttributesEqual(Instruction* other) const { return true; }
 
-  virtual bool MayThrow() const { return false; }
-
  private:
   DISALLOW_COPY_AND_ASSIGN(Float64x2SplatInstr);
 };
 
 
-class Float64x2ZeroInstr : public TemplateDefinition<0> {
+class Float64x2ZeroInstr : public TemplateDefinition<0, NoThrow, Pure> {
  public:
-  explicit Float64x2ZeroInstr(intptr_t deopt_id) {
-    deopt_id_ = deopt_id;
-  }
-
-  virtual void PrintOperandsTo(BufferFormatter* f) const;
+  Float64x2ZeroInstr() { }
 
   virtual bool CanDeoptimize() const { return false; }
 
@@ -6181,38 +5793,24 @@
     return kUnboxedFloat64x2;
   }
 
-  virtual Representation RequiredInputRepresentation(intptr_t idx) const {
-    UNIMPLEMENTED();
-    return kUnboxedFloat64x2;
-  }
-
-  virtual intptr_t DeoptimizationTarget() const {
-    // Direct access since this instruction cannot deoptimize, and the deopt-id
-    // was inherited from another instruction that could deoptimize.
-    return deopt_id_;
-  }
-
   DECLARE_INSTRUCTION(Float64x2Zero)
   virtual CompileType ComputeType() const;
 
-  virtual bool AllowsCSE() const { return true; }
-  virtual EffectSet Effects() const { return EffectSet::None(); }
-  virtual EffectSet Dependencies() const { return EffectSet::None(); }
   virtual bool AttributesEqual(Instruction* other) const { return true; }
 
-  virtual bool MayThrow() const { return false; }
-
  private:
   DISALLOW_COPY_AND_ASSIGN(Float64x2ZeroInstr);
 };
 
 
-class Float64x2ZeroArgInstr : public TemplateDefinition<1> {
+// TODO(vegorov) rename to Unary to match arithmetic instructions.
+class Float64x2ZeroArgInstr : public TemplateDefinition<1, NoThrow, Pure> {
  public:
-  Float64x2ZeroArgInstr(MethodRecognizer::Kind op_kind, Value* left,
-                        intptr_t deopt_id) : op_kind_(op_kind) {
+  Float64x2ZeroArgInstr(MethodRecognizer::Kind op_kind,
+                        Value* left,
+                        intptr_t deopt_id)
+      : TemplateDefinition(deopt_id), op_kind_(op_kind) {
     SetInputAt(0, left);
-    deopt_id_ = deopt_id;
   }
 
   Value* left() const { return inputs_[0]; }
@@ -6239,21 +5837,16 @@
   virtual intptr_t DeoptimizationTarget() const {
     // Direct access since this instruction cannot deoptimize, and the deopt-id
     // was inherited from another instruction that could deoptimize.
-    return deopt_id_;
+    return GetDeoptId();
   }
 
   DECLARE_INSTRUCTION(Float64x2ZeroArg)
   virtual CompileType ComputeType() const;
 
-  virtual bool AllowsCSE() const { return true; }
-  virtual EffectSet Effects() const { return EffectSet::None(); }
-  virtual EffectSet Dependencies() const { return EffectSet::None(); }
   virtual bool AttributesEqual(Instruction* other) const {
     return op_kind() == other->AsFloat64x2ZeroArg()->op_kind();
   }
 
-  virtual bool MayThrow() const { return false; }
-
  private:
   const MethodRecognizer::Kind op_kind_;
 
@@ -6261,13 +5854,15 @@
 };
 
 
-class Float64x2OneArgInstr : public TemplateDefinition<2> {
+class Float64x2OneArgInstr : public TemplateDefinition<2, NoThrow, Pure> {
  public:
-  Float64x2OneArgInstr(MethodRecognizer::Kind op_kind, Value* left,
-                       Value* right, intptr_t deopt_id) : op_kind_(op_kind) {
+  Float64x2OneArgInstr(MethodRecognizer::Kind op_kind,
+                       Value* left,
+                       Value* right,
+                       intptr_t deopt_id)
+      : TemplateDefinition(deopt_id), op_kind_(op_kind) {
     SetInputAt(0, left);
     SetInputAt(1, right);
-    deopt_id_ = deopt_id;
   }
 
   Value* left() const { return inputs_[0]; }
@@ -6299,21 +5894,16 @@
   virtual intptr_t DeoptimizationTarget() const {
     // Direct access since this instruction cannot deoptimize, and the deopt-id
     // was inherited from another instruction that could deoptimize.
-    return deopt_id_;
+    return GetDeoptId();
   }
 
   DECLARE_INSTRUCTION(Float64x2OneArg)
   virtual CompileType ComputeType() const;
 
-  virtual bool AllowsCSE() const { return true; }
-  virtual EffectSet Effects() const { return EffectSet::None(); }
-  virtual EffectSet Dependencies() const { return EffectSet::None(); }
   virtual bool AttributesEqual(Instruction* other) const {
     return op_kind() == other->AsFloat64x2OneArg()->op_kind();
   }
 
-  virtual bool MayThrow() const { return false; }
-
  private:
   const MethodRecognizer::Kind op_kind_;
 
@@ -6321,15 +5911,18 @@
 };
 
 
-class Int32x4ConstructorInstr : public TemplateDefinition<4> {
+class Int32x4ConstructorInstr : public TemplateDefinition<4, NoThrow, Pure> {
  public:
-  Int32x4ConstructorInstr(Value* value0, Value* value1, Value* value2,
-                          Value* value3, intptr_t deopt_id) {
+  Int32x4ConstructorInstr(Value* value0,
+                          Value* value1,
+                          Value* value2,
+                          Value* value3,
+                          intptr_t deopt_id)
+      : TemplateDefinition(deopt_id) {
     SetInputAt(0, value0);
     SetInputAt(1, value1);
     SetInputAt(2, value2);
     SetInputAt(3, value3);
-    deopt_id_ = deopt_id;
   }
 
   Value* value0() const { return inputs_[0]; }
@@ -6353,33 +5946,32 @@
   virtual intptr_t DeoptimizationTarget() const {
     // Direct access since this instruction cannot deoptimize, and the deopt-id
     // was inherited from another instruction that could deoptimize.
-    return deopt_id_;
+    return GetDeoptId();
   }
 
   DECLARE_INSTRUCTION(Int32x4Constructor)
   virtual CompileType ComputeType() const;
 
-  virtual bool AllowsCSE() const { return true; }
-  virtual EffectSet Effects() const { return EffectSet::None(); }
-  virtual EffectSet Dependencies() const { return EffectSet::None(); }
   virtual bool AttributesEqual(Instruction* other) const { return true; }
 
-  virtual bool MayThrow() const { return false; }
-
  private:
   DISALLOW_COPY_AND_ASSIGN(Int32x4ConstructorInstr);
 };
 
 
-class Int32x4BoolConstructorInstr : public TemplateDefinition<4> {
+class Int32x4BoolConstructorInstr
+    : public TemplateDefinition<4, NoThrow, Pure> {
  public:
-  Int32x4BoolConstructorInstr(Value* value0, Value* value1, Value* value2,
-                              Value* value3, intptr_t deopt_id) {
+  Int32x4BoolConstructorInstr(Value* value0,
+                              Value* value1,
+                              Value* value2,
+                              Value* value3,
+                              intptr_t deopt_id)
+      : TemplateDefinition(deopt_id) {
     SetInputAt(0, value0);
     SetInputAt(1, value1);
     SetInputAt(2, value2);
     SetInputAt(3, value3);
-    deopt_id_ = deopt_id;
   }
 
   Value* value0() const { return inputs_[0]; }
@@ -6403,31 +5995,26 @@
   virtual intptr_t DeoptimizationTarget() const {
     // Direct access since this instruction cannot deoptimize, and the deopt-id
     // was inherited from another instruction that could deoptimize.
-    return deopt_id_;
+    return GetDeoptId();
   }
 
   DECLARE_INSTRUCTION(Int32x4BoolConstructor)
   virtual CompileType ComputeType() const;
 
-  virtual bool AllowsCSE() const { return true; }
-  virtual EffectSet Effects() const { return EffectSet::None(); }
-  virtual EffectSet Dependencies() const { return EffectSet::None(); }
   virtual bool AttributesEqual(Instruction* other) const { return true; }
 
-  virtual bool MayThrow() const { return false; }
-
  private:
   DISALLOW_COPY_AND_ASSIGN(Int32x4BoolConstructorInstr);
 };
 
 
-class Int32x4GetFlagInstr : public TemplateDefinition<1> {
+class Int32x4GetFlagInstr : public TemplateDefinition<1, NoThrow, Pure> {
  public:
-  Int32x4GetFlagInstr(MethodRecognizer::Kind op_kind, Value* value,
-                       intptr_t deopt_id)
-      : op_kind_(op_kind) {
+  Int32x4GetFlagInstr(MethodRecognizer::Kind op_kind,
+                      Value* value,
+                      intptr_t deopt_id)
+      : TemplateDefinition(deopt_id), op_kind_(op_kind) {
     SetInputAt(0, value);
-    deopt_id_ = deopt_id;
   }
 
   Value* value() const { return inputs_[0]; }
@@ -6450,21 +6037,16 @@
   virtual intptr_t DeoptimizationTarget() const {
     // Direct access since this instruction cannot deoptimize, and the deopt-id
     // was inherited from another instruction that could deoptimize.
-    return deopt_id_;
+    return GetDeoptId();
   }
 
   DECLARE_INSTRUCTION(Int32x4GetFlag)
   virtual CompileType ComputeType() const;
 
-  virtual bool AllowsCSE() const { return true; }
-  virtual EffectSet Effects() const { return EffectSet::None(); }
-  virtual EffectSet Dependencies() const { return EffectSet::None(); }
   virtual bool AttributesEqual(Instruction* other) const {
     return op_kind() == other->AsInt32x4GetFlag()->op_kind();
   }
 
-  virtual bool MayThrow() const { return false; }
-
  private:
   const MethodRecognizer::Kind op_kind_;
 
@@ -6472,12 +6054,13 @@
 };
 
 
-class Simd32x4GetSignMaskInstr : public TemplateDefinition<1> {
+class Simd32x4GetSignMaskInstr : public TemplateDefinition<1, NoThrow, Pure> {
  public:
-  Simd32x4GetSignMaskInstr(MethodRecognizer::Kind op_kind, Value* value,
-                           intptr_t deopt_id) : op_kind_(op_kind) {
+  Simd32x4GetSignMaskInstr(MethodRecognizer::Kind op_kind,
+                           Value* value,
+                           intptr_t deopt_id)
+      : TemplateDefinition(deopt_id), op_kind_(op_kind) {
     SetInputAt(0, value);
-    deopt_id_ = deopt_id;
   }
 
   Value* value() const { return inputs_[0]; }
@@ -6504,21 +6087,16 @@
   virtual intptr_t DeoptimizationTarget() const {
     // Direct access since this instruction cannot deoptimize, and the deopt-id
     // was inherited from another instruction that could deoptimize.
-    return deopt_id_;
+    return GetDeoptId();
   }
 
   DECLARE_INSTRUCTION(Simd32x4GetSignMask)
   virtual CompileType ComputeType() const;
 
-  virtual bool AllowsCSE() const { return true; }
-  virtual EffectSet Effects() const { return EffectSet::None(); }
-  virtual EffectSet Dependencies() const { return EffectSet::None(); }
   virtual bool AttributesEqual(Instruction* other) const {
     return other->AsSimd32x4GetSignMask()->op_kind() == op_kind();
   }
 
-  virtual bool MayThrow() const { return false; }
-
  private:
   const MethodRecognizer::Kind op_kind_;
 
@@ -6526,14 +6104,16 @@
 };
 
 
-class Int32x4SelectInstr : public TemplateDefinition<3> {
+class Int32x4SelectInstr : public TemplateDefinition<3, NoThrow, Pure> {
  public:
-  Int32x4SelectInstr(Value* mask, Value* trueValue, Value* falseValue,
-                      intptr_t deopt_id) {
+  Int32x4SelectInstr(Value* mask,
+                     Value* trueValue,
+                     Value* falseValue,
+                     intptr_t deopt_id)
+      : TemplateDefinition(deopt_id) {
     SetInputAt(0, mask);
     SetInputAt(1, trueValue);
     SetInputAt(2, falseValue);
-    deopt_id_ = deopt_id;
   }
 
   Value* mask() const { return inputs_[0]; }
@@ -6559,32 +6139,28 @@
   virtual intptr_t DeoptimizationTarget() const {
     // Direct access since this instruction cannot deoptimize, and the deopt-id
     // was inherited from another instruction that could deoptimize.
-    return deopt_id_;
+    return GetDeoptId();
   }
 
   DECLARE_INSTRUCTION(Int32x4Select)
   virtual CompileType ComputeType() const;
 
-  virtual bool AllowsCSE() const { return true; }
-  virtual EffectSet Effects() const { return EffectSet::None(); }
-  virtual EffectSet Dependencies() const { return EffectSet::None(); }
   virtual bool AttributesEqual(Instruction* other) const { return true; }
 
-  virtual bool MayThrow() const { return false; }
-
  private:
   DISALLOW_COPY_AND_ASSIGN(Int32x4SelectInstr);
 };
 
 
-class Int32x4SetFlagInstr : public TemplateDefinition<2> {
+class Int32x4SetFlagInstr : public TemplateDefinition<2, NoThrow, Pure> {
  public:
-  Int32x4SetFlagInstr(MethodRecognizer::Kind op_kind, Value* value,
-                       Value* flagValue, intptr_t deopt_id)
-      : op_kind_(op_kind) {
+  Int32x4SetFlagInstr(MethodRecognizer::Kind op_kind,
+                      Value* value,
+                      Value* flagValue,
+                      intptr_t deopt_id)
+      : TemplateDefinition(deopt_id), op_kind_(op_kind) {
     SetInputAt(0, value);
     SetInputAt(1, flagValue);
-    deopt_id_ = deopt_id;
   }
 
   Value* value() const { return inputs_[0]; }
@@ -6611,21 +6187,16 @@
   virtual intptr_t DeoptimizationTarget() const {
     // Direct access since this instruction cannot deoptimize, and the deopt-id
     // was inherited from another instruction that could deoptimize.
-    return deopt_id_;
+    return GetDeoptId();
   }
 
   DECLARE_INSTRUCTION(Int32x4SetFlag)
   virtual CompileType ComputeType() const;
 
-  virtual bool AllowsCSE() const { return true; }
-  virtual EffectSet Effects() const { return EffectSet::None(); }
-  virtual EffectSet Dependencies() const { return EffectSet::None(); }
   virtual bool AttributesEqual(Instruction* other) const {
     return op_kind() == other->AsInt32x4SetFlag()->op_kind();
   }
 
-  virtual bool MayThrow() const { return false; }
-
  private:
   const MethodRecognizer::Kind op_kind_;
 
@@ -6633,11 +6204,11 @@
 };
 
 
-class Int32x4ToFloat32x4Instr : public TemplateDefinition<1> {
+class Int32x4ToFloat32x4Instr : public TemplateDefinition<1, NoThrow, Pure> {
  public:
-  Int32x4ToFloat32x4Instr(Value* left, intptr_t deopt_id) {
+  Int32x4ToFloat32x4Instr(Value* left, intptr_t deopt_id)
+      : TemplateDefinition(deopt_id) {
     SetInputAt(0, left);
-    deopt_id_ = deopt_id;
   }
 
   Value* left() const { return inputs_[0]; }
@@ -6658,34 +6229,28 @@
   virtual intptr_t DeoptimizationTarget() const {
     // Direct access since this instruction cannot deoptimize, and the deopt-id
     // was inherited from another instruction that could deoptimize.
-    return deopt_id_;
+    return GetDeoptId();
   }
 
   DECLARE_INSTRUCTION(Int32x4ToFloat32x4)
   virtual CompileType ComputeType() const;
 
-  virtual bool AllowsCSE() const { return true; }
-  virtual EffectSet Effects() const { return EffectSet::None(); }
-  virtual EffectSet Dependencies() const { return EffectSet::None(); }
   virtual bool AttributesEqual(Instruction* other) const { return true; }
 
-  virtual bool MayThrow() const { return false; }
-
  private:
   DISALLOW_COPY_AND_ASSIGN(Int32x4ToFloat32x4Instr);
 };
 
 
-class BinaryInt32x4OpInstr : public TemplateDefinition<2> {
+class BinaryInt32x4OpInstr : public TemplateDefinition<2, NoThrow, Pure> {
  public:
   BinaryInt32x4OpInstr(Token::Kind op_kind,
                         Value* left,
                         Value* right,
                         intptr_t deopt_id)
-      : op_kind_(op_kind) {
+      : TemplateDefinition(deopt_id), op_kind_(op_kind) {
     SetInputAt(0, left);
     SetInputAt(1, right);
-    deopt_id_ = deopt_id;
   }
 
   Value* left() const { return inputs_[0]; }
@@ -6709,21 +6274,16 @@
   virtual intptr_t DeoptimizationTarget() const {
     // Direct access since this instruction cannot deoptimize, and the deopt-id
     // was inherited from another instruction that could deoptimize.
-    return deopt_id_;
+    return GetDeoptId();
   }
 
   DECLARE_INSTRUCTION(BinaryInt32x4Op)
   virtual CompileType ComputeType() const;
 
-  virtual bool AllowsCSE() const { return true; }
-  virtual EffectSet Effects() const { return EffectSet::None(); }
-  virtual EffectSet Dependencies() const { return EffectSet::None(); }
   virtual bool AttributesEqual(Instruction* other) const {
     return op_kind() == other->AsBinaryInt32x4Op()->op_kind();
   }
 
-  virtual bool MayThrow() const { return false; }
-
  private:
   const Token::Kind op_kind_;
 
@@ -6731,16 +6291,15 @@
 };
 
 
-class BinaryFloat64x2OpInstr : public TemplateDefinition<2> {
+class BinaryFloat64x2OpInstr : public TemplateDefinition<2, NoThrow, Pure> {
  public:
   BinaryFloat64x2OpInstr(Token::Kind op_kind,
                          Value* left,
                          Value* right,
                          intptr_t deopt_id)
-      : op_kind_(op_kind) {
+      : TemplateDefinition(deopt_id), op_kind_(op_kind) {
     SetInputAt(0, left);
     SetInputAt(1, right);
-    deopt_id_ = deopt_id;
   }
 
   Value* left() const { return inputs_[0]; }
@@ -6764,22 +6323,16 @@
   virtual intptr_t DeoptimizationTarget() const {
     // Direct access since this instruction cannot deoptimize, and the deopt-id
     // was inherited from another instruction that could deoptimize.
-    return deopt_id_;
+    return GetDeoptId();
   }
 
   DECLARE_INSTRUCTION(BinaryFloat64x2Op)
   virtual CompileType ComputeType() const;
 
-  virtual bool AllowsCSE() const { return true; }
-  virtual EffectSet Effects() const { return EffectSet::None(); }
-  virtual EffectSet Dependencies() const { return EffectSet::None(); }
   virtual bool AttributesEqual(Instruction* other) const {
-    ASSERT(other->IsBinaryFloat64x2Op());
     return op_kind() == other->AsBinaryFloat64x2Op()->op_kind();
   }
 
-  virtual bool MayThrow() const { return false; }
-
  private:
   const Token::Kind op_kind_;
 
@@ -6787,17 +6340,15 @@
 };
 
 
-class UnaryIntegerOpInstr : public TemplateDefinition<1> {
+class UnaryIntegerOpInstr : public TemplateDefinition<1, NoThrow, Pure> {
  public:
   UnaryIntegerOpInstr(Token::Kind op_kind,
                       Value* value,
                       intptr_t deopt_id)
-      : op_kind_(op_kind) {
+      : TemplateDefinition(deopt_id), op_kind_(op_kind) {
     ASSERT((op_kind == Token::kNEGATE) ||
            (op_kind == Token::kBIT_NOT));
     SetInputAt(0, value);
-    // Override generated deopt-id.
-    deopt_id_ = deopt_id;
   }
 
   static UnaryIntegerOpInstr* Make(Representation representation,
@@ -6809,9 +6360,6 @@
   Value* value() const { return inputs_[0]; }
   Token::Kind op_kind() const { return op_kind_; }
 
-  virtual bool AllowsCSE() const { return true; }
-  virtual EffectSet Effects() const { return EffectSet::None(); }
-  virtual EffectSet Dependencies() const { return EffectSet::None(); }
   virtual bool AttributesEqual(Instruction* other) const {
     return other->AsUnaryIntegerOp()->op_kind() == op_kind();
   }
@@ -6819,11 +6367,9 @@
   virtual intptr_t DeoptimizationTarget() const {
     // Direct access since this instruction cannot deoptimize, and the deopt-id
     // was inherited from another instruction that could deoptimize.
-    return deopt_id_;
+    return GetDeoptId();
   }
 
-  virtual bool MayThrow() const { return false; }
-
   virtual void PrintOperandsTo(BufferFormatter* f) const;
 
   DEFINE_INSTRUCTION_TYPE_CHECK(UnaryIntegerOp)
@@ -6910,19 +6456,18 @@
 };
 
 
-class BinaryIntegerOpInstr : public TemplateDefinition<2> {
+class BinaryIntegerOpInstr : public TemplateDefinition<2, NoThrow, Pure> {
  public:
   BinaryIntegerOpInstr(Token::Kind op_kind,
                        Value* left,
                        Value* right,
                        intptr_t deopt_id)
-      : op_kind_(op_kind),
+      : TemplateDefinition(deopt_id),
+        op_kind_(op_kind),
         can_overflow_(true),
         is_truncating_(false) {
     SetInputAt(0, left);
     SetInputAt(1, right);
-    // Override generated deopt-id.
-    deopt_id_ = deopt_id;
   }
 
   static BinaryIntegerOpInstr* Make(Representation representation,
@@ -6977,14 +6522,10 @@
         return false;
     }
   }
-  virtual bool AllowsCSE() const { return true; }
-  virtual EffectSet Effects() const { return EffectSet::None(); }
-  virtual EffectSet Dependencies() const { return EffectSet::None(); }
+
   virtual bool AttributesEqual(Instruction* other) const;
 
-  virtual intptr_t DeoptimizationTarget() const { return deopt_id_; }
-
-  virtual bool MayThrow() const { return false; }
+  virtual intptr_t DeoptimizationTarget() const { return GetDeoptId(); }
 
   virtual void PrintOperandsTo(BufferFormatter* f) const;
 
@@ -7214,16 +6755,14 @@
 
 
 // Handles only NEGATE.
-class UnaryDoubleOpInstr : public TemplateDefinition<1> {
+class UnaryDoubleOpInstr : public TemplateDefinition<1, NoThrow, Pure> {
  public:
   UnaryDoubleOpInstr(Token::Kind op_kind,
                      Value* value,
                      intptr_t deopt_id)
-      : op_kind_(op_kind) {
+      : TemplateDefinition(deopt_id), op_kind_(op_kind) {
     ASSERT(op_kind == Token::kNEGATE);
     SetInputAt(0, value);
-    // Overriden generated deopt_id.
-    deopt_id_ = deopt_id;
   }
 
   Value* value() const { return inputs_[0]; }
@@ -7239,7 +6778,7 @@
   virtual intptr_t DeoptimizationTarget() const {
     // Direct access since this instruction cannot deoptimize, and the deopt-id
     // was inherited from another instruction that could deoptimize.
-    return deopt_id_;
+    return GetDeoptId();
   }
 
   virtual Representation representation() const {
@@ -7251,13 +6790,8 @@
     return kUnboxedDouble;
   }
 
-  virtual bool AllowsCSE() const { return true; }
-  virtual EffectSet Effects() const { return EffectSet::None(); }
-  virtual EffectSet Dependencies() const { return EffectSet::None(); }
   virtual bool AttributesEqual(Instruction* other) const { return true; }
 
-  virtual bool MayThrow() const { return false; }
-
  private:
   const Token::Kind op_kind_;
 
@@ -7265,11 +6799,12 @@
 };
 
 
-class CheckStackOverflowInstr : public TemplateInstruction<0> {
+class CheckStackOverflowInstr : public TemplateInstruction<0, NoThrow> {
  public:
   CheckStackOverflowInstr(intptr_t token_pos, intptr_t loop_depth)
-      : token_pos_(token_pos), loop_depth_(loop_depth) {
-    deopt_id_ = Isolate::Current()->GetNextDeoptId();
+      : TemplateInstruction(Isolate::Current()->GetNextDeoptId()),
+        token_pos_(token_pos),
+        loop_depth_(loop_depth) {
   }
 
   virtual intptr_t token_pos() const { return token_pos_; }
@@ -7284,8 +6819,6 @@
 
   virtual EffectSet Effects() const { return EffectSet::None(); }
 
-  virtual bool MayThrow() const { return false; }
-
   virtual void PrintOperandsTo(BufferFormatter* f) const;
 
  private:
@@ -7297,7 +6830,7 @@
 
 
 // TODO(vegorov): remove this instruction in favor of Int32ToDouble.
-class SmiToDoubleInstr : public TemplateDefinition<1> {
+class SmiToDoubleInstr : public TemplateDefinition<1, NoThrow, Pure> {
  public:
   SmiToDoubleInstr(Value* value, intptr_t token_pos)
       : token_pos_(token_pos) {
@@ -7316,13 +6849,8 @@
 
   virtual bool CanDeoptimize() const { return false; }
 
-  virtual bool AllowsCSE() const { return true; }
-  virtual EffectSet Effects() const { return EffectSet::None(); }
-  virtual EffectSet Dependencies() const { return EffectSet::None(); }
   virtual bool AttributesEqual(Instruction* other) const { return true; }
 
-  virtual bool MayThrow() const { return false; }
-
  private:
   const intptr_t token_pos_;
 
@@ -7330,7 +6858,7 @@
 };
 
 
-class Int32ToDoubleInstr : public TemplateDefinition<1> {
+class Int32ToDoubleInstr : public TemplateDefinition<1, NoThrow, Pure> {
  public:
   explicit Int32ToDoubleInstr(Value* value) {
     SetInputAt(0, value);
@@ -7352,22 +6880,17 @@
 
   virtual bool CanDeoptimize() const { return false; }
 
-  virtual bool AllowsCSE() const { return true; }
-  virtual EffectSet Effects() const { return EffectSet::None(); }
-  virtual EffectSet Dependencies() const { return EffectSet::None(); }
   virtual bool AttributesEqual(Instruction* other) const { return true; }
 
-  virtual bool MayThrow() const { return false; }
-
  private:
   DISALLOW_COPY_AND_ASSIGN(Int32ToDoubleInstr);
 };
 
 
-class MintToDoubleInstr : public TemplateDefinition<1> {
+class MintToDoubleInstr : public TemplateDefinition<1, NoThrow, Pure> {
  public:
   MintToDoubleInstr(Value* value, intptr_t deopt_id)
-      : deopt_id_(deopt_id) {
+      : TemplateDefinition(deopt_id) {
     SetInputAt(0, value);
   }
 
@@ -7388,31 +6911,23 @@
   virtual intptr_t DeoptimizationTarget() const {
     // Direct access since this instruction cannot deoptimize, and the deopt-id
     // was inherited from another instruction that could deoptimize.
-    return deopt_id_;
+    return GetDeoptId();
   }
 
   virtual bool CanDeoptimize() const { return false; }
-
-  virtual bool AllowsCSE() const { return true; }
-  virtual EffectSet Effects() const { return EffectSet::None(); }
-  virtual EffectSet Dependencies() const { return EffectSet::None(); }
   virtual bool AttributesEqual(Instruction* other) const { return true; }
 
-  virtual bool MayThrow() const { return false; }
-
  private:
-  const intptr_t deopt_id_;
-
   DISALLOW_COPY_AND_ASSIGN(MintToDoubleInstr);
 };
 
 
-class DoubleToIntegerInstr : public TemplateDefinition<1> {
+class DoubleToIntegerInstr : public TemplateDefinition<1, Throws> {
  public:
   DoubleToIntegerInstr(Value* value, InstanceCallInstr* instance_call)
-      : instance_call_(instance_call) {
+      : TemplateDefinition(instance_call->deopt_id()),
+        instance_call_(instance_call) {
     SetInputAt(0, value);
-    deopt_id_ = instance_call->deopt_id();
   }
 
   Value* value() const { return inputs_[0]; }
@@ -7427,8 +6942,6 @@
 
   virtual EffectSet Effects() const { return EffectSet::None(); }
 
-  virtual bool MayThrow() const { return true; }
-
  private:
   InstanceCallInstr* instance_call_;
 
@@ -7438,12 +6951,11 @@
 
 // Similar to 'DoubleToIntegerInstr' but expects unboxed double as input
 // and creates a Smi.
-class DoubleToSmiInstr : public TemplateDefinition<1> {
+class DoubleToSmiInstr : public TemplateDefinition<1, NoThrow, Pure> {
  public:
-  DoubleToSmiInstr(Value* value, intptr_t deopt_id) {
+  DoubleToSmiInstr(Value* value, intptr_t deopt_id)
+      : TemplateDefinition(deopt_id) {
     SetInputAt(0, value);
-    // Override generated deopt-id.
-    deopt_id_ = deopt_id;
   }
 
   Value* value() const { return inputs_[0]; }
@@ -7458,26 +6970,23 @@
     return kUnboxedDouble;
   }
 
-  virtual intptr_t DeoptimizationTarget() const { return deopt_id_; }
+  virtual intptr_t DeoptimizationTarget() const { return GetDeoptId(); }
 
-  virtual EffectSet Effects() const { return EffectSet::None(); }
-
-  virtual bool MayThrow() const { return false; }
+  virtual bool AttributesEqual(Instruction* other) const { return true; }
 
  private:
   DISALLOW_COPY_AND_ASSIGN(DoubleToSmiInstr);
 };
 
 
-class DoubleToDoubleInstr : public TemplateDefinition<1> {
+class DoubleToDoubleInstr : public TemplateDefinition<1, NoThrow, Pure> {
  public:
   DoubleToDoubleInstr(Value* value,
                       MethodRecognizer::Kind recognized_kind,
                       intptr_t deopt_id)
-    : recognized_kind_(recognized_kind) {
+    : TemplateDefinition(deopt_id),
+      recognized_kind_(recognized_kind) {
     SetInputAt(0, value);
-    // Override generated deopt-id.
-    deopt_id_ = deopt_id;
   }
 
   Value* value() const { return inputs_[0]; }
@@ -7498,17 +7007,12 @@
     return kUnboxedDouble;
   }
 
-  virtual intptr_t DeoptimizationTarget() const { return deopt_id_; }
+  virtual intptr_t DeoptimizationTarget() const { return GetDeoptId(); }
 
-  virtual bool AllowsCSE() const { return true; }
-  virtual EffectSet Effects() const { return EffectSet::None(); }
-  virtual EffectSet Dependencies() const { return EffectSet::None(); }
   virtual bool AttributesEqual(Instruction* other) const {
     return other->AsDoubleToDouble()->recognized_kind() == recognized_kind();
   }
 
-  virtual bool MayThrow() const { return false; }
-
  private:
   const MethodRecognizer::Kind recognized_kind_;
 
@@ -7516,12 +7020,11 @@
 };
 
 
-class DoubleToFloatInstr: public TemplateDefinition<1> {
+class DoubleToFloatInstr: public TemplateDefinition<1, NoThrow, Pure> {
  public:
-  DoubleToFloatInstr(Value* value, intptr_t deopt_id) {
+  DoubleToFloatInstr(Value* value, intptr_t deopt_id)
+      : TemplateDefinition(deopt_id) {
     SetInputAt(0, value);
-    // Override generated deopt-id.
-    deopt_id_ = deopt_id;
   }
 
   Value* value() const { return inputs_[0]; }
@@ -7545,15 +7048,10 @@
     return kUnboxedDouble;
   }
 
-  virtual intptr_t DeoptimizationTarget() const { return deopt_id_; }
+  virtual intptr_t DeoptimizationTarget() const { return GetDeoptId(); }
 
-  virtual bool AllowsCSE() const { return true; }
-  virtual EffectSet Effects() const { return EffectSet::None(); }
-  virtual EffectSet Dependencies() const { return EffectSet::None(); }
   virtual bool AttributesEqual(Instruction* other) const { return true; }
 
-  virtual bool MayThrow() const { return false; }
-
   virtual Definition* Canonicalize(FlowGraph* flow_graph);
 
  private:
@@ -7561,12 +7059,11 @@
 };
 
 
-class FloatToDoubleInstr: public TemplateDefinition<1> {
+class FloatToDoubleInstr: public TemplateDefinition<1, NoThrow, Pure> {
  public:
-  FloatToDoubleInstr(Value* value, intptr_t deopt_id) {
+  FloatToDoubleInstr(Value* value, intptr_t deopt_id)
+      : TemplateDefinition(deopt_id) {
     SetInputAt(0, value);
-    // Override generated deopt-id.
-    deopt_id_ = deopt_id;
   }
 
   Value* value() const { return inputs_[0]; }
@@ -7586,15 +7083,10 @@
     return kUnboxedDouble;
   }
 
-  virtual intptr_t DeoptimizationTarget() const { return deopt_id_; }
+  virtual intptr_t DeoptimizationTarget() const { return GetDeoptId(); }
 
-  virtual bool AllowsCSE() const { return true; }
-  virtual EffectSet Effects() const { return EffectSet::None(); }
-  virtual EffectSet Dependencies() const { return EffectSet::None(); }
   virtual bool AttributesEqual(Instruction* other) const { return true; }
 
-  virtual bool MayThrow() const { return false; }
-
   virtual Definition* Canonicalize(FlowGraph* flow_graph);
 
  private:
@@ -7602,10 +7094,10 @@
 };
 
 
-class InvokeMathCFunctionInstr : public Definition {
+class InvokeMathCFunctionInstr : public PureDefinition {
  public:
   InvokeMathCFunctionInstr(ZoneGrowableArray<Value*>* inputs,
-                           intptr_t original_deopt_id,
+                           intptr_t deopt_id,
                            MethodRecognizer::Kind recognized_kind,
                            intptr_t token_pos);
 
@@ -7632,7 +7124,7 @@
     return kUnboxedDouble;
   }
 
-  virtual intptr_t DeoptimizationTarget() const { return deopt_id_; }
+  virtual intptr_t DeoptimizationTarget() const { return GetDeoptId(); }
 
   virtual intptr_t InputCount() const {
     return inputs_->length();
@@ -7642,9 +7134,6 @@
     return (*inputs_)[i];
   }
 
-  virtual bool AllowsCSE() const { return true; }
-  virtual EffectSet Effects() const { return EffectSet::None(); }
-  virtual EffectSet Dependencies() const { return EffectSet::None(); }
   virtual bool AttributesEqual(Instruction* other) const {
     InvokeMathCFunctionInstr* other_invoke = other->AsInvokeMathCFunction();
     return other_invoke->recognized_kind() == recognized_kind();
@@ -7669,7 +7158,7 @@
 };
 
 
-class ExtractNthOutputInstr : public TemplateDefinition<1> {
+class ExtractNthOutputInstr : public TemplateDefinition<1, NoThrow, Pure> {
  public:
   // Extract the Nth output register from value.
   ExtractNthOutputInstr(Value* value,
@@ -7707,17 +7196,12 @@
     return definition_rep_;
   }
 
-  virtual bool AllowsCSE() const { return true; }
-  virtual EffectSet Effects() const { return EffectSet::None(); }
-  virtual EffectSet Dependencies() const { return EffectSet::None(); }
   virtual bool AttributesEqual(Instruction* other) const {
     ExtractNthOutputInstr* other_extract = other->AsExtractNthOutput();
     return (other_extract->representation() == representation()) &&
            (other_extract->index() == index());
   }
 
-  virtual bool MayThrow() const { return false; }
-
  private:
   const intptr_t index_;
   const Representation definition_rep_;
@@ -7726,7 +7210,7 @@
 };
 
 
-class MergedMathInstr : public Definition {
+class MergedMathInstr : public PureDefinition {
  public:
   enum Kind {
     kTruncDivMod,
@@ -7796,13 +7280,10 @@
     }
   }
 
-  virtual intptr_t DeoptimizationTarget() const { return deopt_id_; }
+  virtual intptr_t DeoptimizationTarget() const { return GetDeoptId(); }
 
   DECLARE_INSTRUCTION(MergedMath)
 
-  virtual bool AllowsCSE() const { return true; }
-  virtual EffectSet Effects() const { return EffectSet::None(); }
-  virtual EffectSet Dependencies() const { return EffectSet::None(); }
   virtual bool AttributesEqual(Instruction* other) const {
     MergedMathInstr* other_invoke = other->AsMergedMath();
     return other_invoke->kind() == kind();
@@ -7827,7 +7308,7 @@
 };
 
 
-class CheckClassInstr : public TemplateInstruction<1> {
+class CheckClassInstr : public TemplateInstruction<1, NoThrow> {
  public:
   CheckClassInstr(Value* value,
                   intptr_t deopt_id,
@@ -7859,12 +7340,10 @@
   static bool IsDenseMask(intptr_t mask);
 
   virtual bool AllowsCSE() const { return true; }
-  virtual EffectSet Effects() const { return EffectSet::None(); }
   virtual EffectSet Dependencies() const;
+  virtual EffectSet Effects() const { return EffectSet::None(); }
   virtual bool AttributesEqual(Instruction* other) const;
 
-  virtual bool MayThrow() const { return false; }
-
   void set_licm_hoisted(bool value) { licm_hoisted_ = value; }
 
  private:
@@ -7877,12 +7356,13 @@
 };
 
 
-class CheckSmiInstr : public TemplateInstruction<1> {
+class CheckSmiInstr : public TemplateInstruction<1, NoThrow, Pure> {
  public:
-  CheckSmiInstr(Value* value, intptr_t original_deopt_id, intptr_t token_pos)
-      : token_pos_(token_pos), licm_hoisted_(false) {
+  CheckSmiInstr(Value* value, intptr_t deopt_id, intptr_t token_pos)
+      : TemplateInstruction(deopt_id),
+        token_pos_(token_pos),
+        licm_hoisted_(false) {
     SetInputAt(0, value);
-    deopt_id_ = original_deopt_id;
   }
 
   Value* value() const { return inputs_[0]; }
@@ -7896,13 +7376,8 @@
 
   virtual Instruction* Canonicalize(FlowGraph* flow_graph);
 
-  virtual bool AllowsCSE() const { return true; }
-  virtual EffectSet Effects() const { return EffectSet::None(); }
-  virtual EffectSet Dependencies() const { return EffectSet::None(); }
   virtual bool AttributesEqual(Instruction* other) const { return true; }
 
-  virtual bool MayThrow() const { return false; }
-
   void set_licm_hoisted(bool value) { licm_hoisted_ = value; }
 
  private:
@@ -7913,12 +7388,11 @@
 };
 
 
-class CheckClassIdInstr : public TemplateInstruction<1> {
+class CheckClassIdInstr : public TemplateInstruction<1, NoThrow> {
  public:
-  CheckClassIdInstr(Value* value, intptr_t cid, intptr_t deopt_id) : cid_(cid) {
+  CheckClassIdInstr(Value* value, intptr_t cid, intptr_t deopt_id)
+      : TemplateInstruction(deopt_id), cid_(cid) {
     SetInputAt(0, value);
-    // Override generated deopt-id.
-    deopt_id_ = deopt_id;
   }
 
   Value* value() const { return inputs_[0]; }
@@ -7933,12 +7407,10 @@
   virtual Instruction* Canonicalize(FlowGraph* flow_graph);
 
   virtual bool AllowsCSE() const { return true; }
-  virtual EffectSet Effects() const { return EffectSet::None(); }
   virtual EffectSet Dependencies() const;
+  virtual EffectSet Effects() const { return EffectSet::None(); }
   virtual bool AttributesEqual(Instruction* other) const { return true; }
 
-  virtual bool MayThrow() const { return false; }
-
   virtual void PrintOperandsTo(BufferFormatter* f) const;
 
  private:
@@ -7948,14 +7420,14 @@
 };
 
 
-class CheckArrayBoundInstr : public TemplateInstruction<2> {
+class CheckArrayBoundInstr : public TemplateInstruction<2, NoThrow, Pure> {
  public:
   CheckArrayBoundInstr(Value* length, Value* index, intptr_t deopt_id)
-      : generalized_(false), licm_hoisted_(false) {
+      : TemplateInstruction(deopt_id),
+        generalized_(false),
+        licm_hoisted_(false) {
     SetInputAt(kLengthPos, length);
     SetInputAt(kIndexPos, index);
-    // Override generated deopt-id.
-    deopt_id_ = deopt_id;
   }
 
   Value* length() const { return inputs_[kLengthPos]; }
@@ -7980,13 +7452,8 @@
 
   static bool IsFixedLengthArrayType(intptr_t class_id);
 
-  virtual bool AllowsCSE() const { return true; }
-  virtual EffectSet Effects() const { return EffectSet::None(); }
-  virtual EffectSet Dependencies() const { return EffectSet::None(); }
   virtual bool AttributesEqual(Instruction* other) const { return true; }
 
-  virtual bool MayThrow() const { return false; }
-
   void set_licm_hoisted(bool value) { licm_hoisted_ = value; }
 
   // Give a name to the location/input indices.
@@ -8003,7 +7470,7 @@
 };
 
 
-class BoxIntNInstr : public TemplateDefinition<1> {
+class BoxIntNInstr : public TemplateDefinition<1, NoThrow, Pure> {
  public:
   BoxIntNInstr(Representation representation, Value* value)
       : from_representation_(representation) {
@@ -8029,15 +7496,10 @@
     return from_representation_;
   }
 
-  virtual bool AllowsCSE() const { return true; }
-  virtual EffectSet Effects() const { return EffectSet::None(); }
-  virtual EffectSet Dependencies() const { return EffectSet::None(); }
   virtual bool AttributesEqual(Instruction* other) const {
     return other->AsBoxIntN()->from_representation_ == from_representation_;
   }
 
-  virtual bool MayThrow() const { return false; }
-
   virtual Definition* Canonicalize(FlowGraph* flow_graph);
 
   DEFINE_INSTRUCTION_TYPE_CHECK(BoxIntN)
@@ -8076,15 +7538,15 @@
 };
 
 
-class UnboxIntNInstr : public TemplateDefinition<1> {
+class UnboxIntNInstr : public TemplateDefinition<1, NoThrow, Pure> {
  public:
   UnboxIntNInstr(Representation representation,
                  Value* value,
                  intptr_t deopt_id)
-      : representation_(representation),
+      : TemplateDefinition(deopt_id),
+        representation_(representation),
         is_truncating_(representation == kUnboxedUint32) {
     SetInputAt(0, value);
-    deopt_id_ = deopt_id;
   }
 
   Value* value() const { return inputs_[0]; }
@@ -8098,17 +7560,12 @@
 
   virtual CompileType ComputeType() const;
 
-  virtual bool AllowsCSE() const { return true; }
-  virtual EffectSet Effects() const { return EffectSet::None(); }
-  virtual EffectSet Dependencies() const { return EffectSet::None(); }
   virtual bool AttributesEqual(Instruction* other) const {
     UnboxIntNInstr* other_unbox = other->AsUnboxIntN();
     return (other_unbox->representation_ == representation_) &&
         (other_unbox->is_truncating_ == is_truncating_);
   }
 
-  virtual bool MayThrow() const { return false; }
-
   virtual Definition* Canonicalize(FlowGraph* flow_graph);
 
   virtual void PrintOperandsTo(BufferFormatter* f) const;
@@ -8162,13 +7619,14 @@
 };
 
 
-class UnboxedIntConverterInstr : public TemplateDefinition<1> {
+class UnboxedIntConverterInstr : public TemplateDefinition<1, NoThrow> {
  public:
   UnboxedIntConverterInstr(Representation from,
                            Representation to,
                            Value* value,
                            intptr_t deopt_id)
-      : from_representation_(from),
+      : TemplateDefinition(deopt_id),
+        from_representation_(from),
         to_representation_(to),
         is_truncating_(to == kUnboxedUint32) {
     ASSERT(from != to);
@@ -8180,7 +7638,6 @@
            (to == kUnboxedInt32));
     ASSERT((to != kUnboxedInt32) || (deopt_id != Isolate::kNoDeoptId));
     SetInputAt(0, value);
-    deopt_id_ = deopt_id;
   }
 
   Value* value() const { return inputs_[0]; }
@@ -8214,8 +7671,6 @@
         (converter->is_truncating() == is_truncating());
   }
 
-  virtual bool MayThrow() const { return false; }
-
   virtual void InferRange(RangeAnalysis* analysis, Range* range);
 
   virtual void PrintOperandsTo(BufferFormatter* f) const;
diff --git a/runtime/vm/intermediate_language_arm.cc b/runtime/vm/intermediate_language_arm.cc
index 8124cc2..5de809b 100644
--- a/runtime/vm/intermediate_language_arm.cc
+++ b/runtime/vm/intermediate_language_arm.cc
@@ -2612,10 +2612,6 @@
   __ LoadImmediate(temp0, num_context_variables());
   __ str(temp0, FieldAddress(result, Context::num_variables_offset()));
 
-  // Setup isolate field.
-  __ ldr(temp0, FieldAddress(CTX, Context::isolate_offset()));
-  __ str(temp0, FieldAddress(result, Context::isolate_offset()));
-
   __ Bind(slow_path->exit_label());
 }
 
@@ -3624,7 +3620,7 @@
     __ vmovdr(DTMP, 0, IP);
     __ vcvtdi(result, STMP);
   } else {
-    Label* deopt = compiler->AddDeoptStub(deopt_id_,
+    Label* deopt = compiler->AddDeoptStub(deopt_id(),
                                           ICData::kDeoptBinaryDoubleOp);
     const Register temp = locs()->temp(0).reg();
     if (value_type->is_nullable() &&
@@ -3708,7 +3704,7 @@
 
   if (value_cid != kFloat32x4Cid) {
     const Register temp = locs()->temp(0).reg();
-    Label* deopt = compiler->AddDeoptStub(deopt_id_, ICData::kDeoptCheckClass);
+    Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptCheckClass);
     __ tst(value, Operand(kSmiTagMask));
     __ b(deopt, EQ);
     __ CompareClassId(value, kFloat32x4Cid, temp);
@@ -3776,7 +3772,8 @@
 
   if (value_cid != kFloat64x2Cid) {
     const Register temp = locs()->temp(0).reg();
-    Label* deopt = compiler->AddDeoptStub(deopt_id_, ICData::kDeoptCheckClass);
+    Label* deopt = compiler->AddDeoptStub(GetDeoptId(),
+                                          ICData::kDeoptCheckClass);
     __ tst(value, Operand(kSmiTagMask));
     __ b(deopt, EQ);
     __ CompareClassId(value, kFloat64x2Cid, temp);
@@ -3844,7 +3841,8 @@
 
   if (value_cid != kInt32x4Cid) {
     const Register temp = locs()->temp(0).reg();
-    Label* deopt = compiler->AddDeoptStub(deopt_id_, ICData::kDeoptCheckClass);
+    Label* deopt = compiler->AddDeoptStub(GetDeoptId(),
+                                          ICData::kDeoptCheckClass);
     __ tst(value, Operand(kSmiTagMask));
     __ b(deopt, EQ);
     __ CompareClassId(value, kInt32x4Cid, temp);
@@ -6039,7 +6037,7 @@
     __ SignFill(result_hi, result_lo);
   } else {
     const Register temp = locs()->temp(0).reg();
-    Label* deopt = compiler->AddDeoptStub(deopt_id_,
+    Label* deopt = compiler->AddDeoptStub(GetDeoptId(),
                                           ICData::kDeoptUnboxInteger);
     Label is_smi, done;
     __ tst(value, Operand(kSmiTagMask));
@@ -6687,7 +6685,7 @@
   const Register out = locs()->out(0).reg();
   const Register temp = CanDeoptimize() ? locs()->temp(0).reg() : kNoRegister;
   Label* deopt = CanDeoptimize() ?
-        compiler->AddDeoptStub(deopt_id_, ICData::kDeoptUnboxInteger) : NULL;
+        compiler->AddDeoptStub(GetDeoptId(), ICData::kDeoptUnboxInteger) : NULL;
   Label* out_of_range = !is_truncating() ? deopt : NULL;
   ASSERT(value != out);
 
diff --git a/runtime/vm/intermediate_language_arm64.cc b/runtime/vm/intermediate_language_arm64.cc
index 264dec0..d550611 100644
--- a/runtime/vm/intermediate_language_arm64.cc
+++ b/runtime/vm/intermediate_language_arm64.cc
@@ -2392,10 +2392,6 @@
   __ LoadImmediate(temp0, num_context_variables(), PP);
   __ str(temp0, FieldAddress(result, Context::num_variables_offset()));
 
-  // Setup isolate field.
-  __ ldr(temp0, FieldAddress(CTX, Context::isolate_offset()));
-  __ str(temp0, FieldAddress(result, Context::isolate_offset()));
-
   __ Bind(slow_path->exit_label());
 }
 
@@ -3106,7 +3102,7 @@
     __ SmiUntag(TMP, value);  // Untag input before conversion.
     __ scvtfdx(result, TMP);
   } else {
-    Label* deopt = compiler->AddDeoptStub(deopt_id_,
+    Label* deopt = compiler->AddDeoptStub(GetDeoptId(),
                                           ICData::kDeoptBinaryDoubleOp);
     if (value_type->is_nullable() &&
         (value_type->ToNullableCid() == kDoubleCid)) {
@@ -3173,7 +3169,8 @@
   const VRegister result = locs()->out(0).fpu_reg();
 
   if (value_cid != kFloat32x4Cid) {
-    Label* deopt = compiler->AddDeoptStub(deopt_id_, ICData::kDeoptCheckClass);
+    Label* deopt =
+        compiler->AddDeoptStub(GetDeoptId(), ICData::kDeoptCheckClass);
     __ tsti(value, Immediate(kSmiTagMask));
     __ b(deopt, EQ);
     __ CompareClassId(value, kFloat32x4Cid, PP);
@@ -3226,7 +3223,8 @@
   const VRegister result = locs()->out(0).fpu_reg();
 
   if (value_cid != kFloat64x2Cid) {
-    Label* deopt = compiler->AddDeoptStub(deopt_id_, ICData::kDeoptCheckClass);
+    Label* deopt =
+        compiler->AddDeoptStub(GetDeoptId(), ICData::kDeoptCheckClass);
     __ tsti(value, Immediate(kSmiTagMask));
     __ b(deopt, EQ);
     __ CompareClassId(value, kFloat64x2Cid, PP);
@@ -3278,7 +3276,8 @@
   const VRegister result = locs()->out(0).fpu_reg();
 
   if (value_cid != kInt32x4Cid) {
-    Label* deopt = compiler->AddDeoptStub(deopt_id_, ICData::kDeoptCheckClass);
+    Label* deopt =
+        compiler->AddDeoptStub(GetDeoptId(), ICData::kDeoptCheckClass);
     __ tsti(value, Immediate(kSmiTagMask));
     __ b(deopt, EQ);
     __ CompareClassId(value, kInt32x4Cid, PP);
@@ -5287,7 +5286,7 @@
   const Register out = locs()->out(0).reg();
   const Register value = locs()->in(0).reg();
   Label* deopt = CanDeoptimize() ?
-      compiler->AddDeoptStub(deopt_id_, ICData::kDeoptUnboxInteger) : NULL;
+      compiler->AddDeoptStub(GetDeoptId(), ICData::kDeoptUnboxInteger) : NULL;
 
   if (value_cid == kSmiCid) {
     __ SmiUntag(out, value);
diff --git a/runtime/vm/intermediate_language_ia32.cc b/runtime/vm/intermediate_language_ia32.cc
index 68455b0..2c16100 100644
--- a/runtime/vm/intermediate_language_ia32.cc
+++ b/runtime/vm/intermediate_language_ia32.cc
@@ -2447,10 +2447,6 @@
   __ movl(FieldAddress(result, Context::num_variables_offset()),
           Immediate(num_context_variables()));
 
-  // Setup isolate field.
-  __ movl(FieldAddress(result, Context::isolate_offset()),
-          Immediate(reinterpret_cast<int32_t>(Isolate::Current())));
-
   __ Bind(slow_path->exit_label());
 }
 
@@ -3387,7 +3383,7 @@
     __ SmiUntag(value);  // Untag input before conversion.
     __ cvtsi2sd(result, value);
   } else {
-    Label* deopt = compiler->AddDeoptStub(deopt_id_,
+    Label* deopt = compiler->AddDeoptStub(GetDeoptId(),
                                           ICData::kDeoptBinaryDoubleOp);
     Register temp = locs()->temp(0).reg();
     if (value_type->is_nullable() &&
@@ -3464,7 +3460,8 @@
 
   if (value_cid != kFloat32x4Cid) {
     const Register temp = locs()->temp(0).reg();
-    Label* deopt = compiler->AddDeoptStub(deopt_id_, ICData::kDeoptCheckClass);
+    Label* deopt =
+        compiler->AddDeoptStub(GetDeoptId(), ICData::kDeoptCheckClass);
     __ testl(value, Immediate(kSmiTagMask));
     __ j(ZERO, deopt);
     __ CompareClassId(value, kFloat32x4Cid, temp);
@@ -3522,7 +3519,8 @@
 
   if (value_cid != kFloat64x2Cid) {
     const Register temp = locs()->temp(0).reg();
-    Label* deopt = compiler->AddDeoptStub(deopt_id_, ICData::kDeoptCheckClass);
+    Label* deopt =
+        compiler->AddDeoptStub(GetDeoptId(), ICData::kDeoptCheckClass);
     __ testl(value, Immediate(kSmiTagMask));
     __ j(ZERO, deopt);
     __ CompareClassId(value, kFloat64x2Cid, temp);
@@ -3580,7 +3578,8 @@
 
   if (value_cid != kInt32x4Cid) {
     const Register temp = locs()->temp(0).reg();
-    Label* deopt = compiler->AddDeoptStub(deopt_id_, ICData::kDeoptCheckClass);
+    Label* deopt =
+        compiler->AddDeoptStub(GetDeoptId(), ICData::kDeoptCheckClass);
     __ testl(value, Immediate(kSmiTagMask));
     __ j(ZERO, deopt);
     __ CompareClassId(value, kInt32x4Cid, temp);
@@ -5678,7 +5677,7 @@
     // Sign extend into result_hi.
     __ cdq();
   } else {
-    Label* deopt = compiler->AddDeoptStub(deopt_id_,
+    Label* deopt = compiler->AddDeoptStub(GetDeoptId(),
                                           ICData::kDeoptUnboxInteger);
     Label is_smi, done;
     __ testl(value, Immediate(kSmiTagMask));
@@ -6326,7 +6325,7 @@
   const Register result = locs()->out(0).reg();
   const Register temp = CanDeoptimize() ? locs()->temp(0).reg() : kNoRegister;
   Label* deopt = CanDeoptimize() ?
-      compiler->AddDeoptStub(deopt_id_, ICData::kDeoptUnboxInteger) : NULL;
+      compiler->AddDeoptStub(GetDeoptId(), ICData::kDeoptUnboxInteger) : NULL;
   Label* out_of_range = !is_truncating() ? deopt : NULL;
 
   const intptr_t lo_offset = Mint::value_offset();
diff --git a/runtime/vm/intermediate_language_mips.cc b/runtime/vm/intermediate_language_mips.cc
index eb98286..f23a56e 100644
--- a/runtime/vm/intermediate_language_mips.cc
+++ b/runtime/vm/intermediate_language_mips.cc
@@ -2391,10 +2391,6 @@
   __ LoadImmediate(temp0, num_context_variables());
   __ sw(temp0, FieldAddress(result, Context::num_variables_offset()));
 
-  // Setup isolate field.
-  __ lw(temp0, FieldAddress(CTX, Context::isolate_offset()));
-  __ sw(temp0, FieldAddress(result, Context::isolate_offset()));
-
   __ Bind(slow_path->exit_label());
 }
 
@@ -3131,7 +3127,7 @@
     __ mtc1(TMP, STMP1);
     __ cvtdw(result, STMP1);
   } else {
-    Label* deopt = compiler->AddDeoptStub(deopt_id_,
+    Label* deopt = compiler->AddDeoptStub(GetDeoptId(),
                                           ICData::kDeoptBinaryDoubleOp);
     if (value_type->is_nullable() &&
         (value_type->ToNullableCid() == kDoubleCid)) {
@@ -4675,7 +4671,7 @@
   const Register value = locs()->in(0).reg();
   const Register out = locs()->out(0).reg();
   Label* deopt = CanDeoptimize() ?
-        compiler->AddDeoptStub(deopt_id_, ICData::kDeoptUnboxInteger) : NULL;
+        compiler->AddDeoptStub(GetDeoptId(), ICData::kDeoptUnboxInteger) : NULL;
   Label* out_of_range = !is_truncating() ? deopt : NULL;
   ASSERT(value != out);
 
diff --git a/runtime/vm/intermediate_language_x64.cc b/runtime/vm/intermediate_language_x64.cc
index 5ec7afc..1167b3a 100644
--- a/runtime/vm/intermediate_language_x64.cc
+++ b/runtime/vm/intermediate_language_x64.cc
@@ -2366,10 +2366,6 @@
   __ movq(FieldAddress(result, Context::num_variables_offset()),
           Immediate(num_context_variables()));
 
-  // Setup isolate field.
-  __ movq(FieldAddress(result, Context::isolate_offset()),
-          Immediate(reinterpret_cast<intptr_t>(Isolate::Current())));
-
   __ Bind(slow_path->exit_label());
 }
 
@@ -3249,7 +3245,7 @@
     __ SmiUntag(value);  // Untag input before conversion.
     __ cvtsi2sdq(result, value);
   } else {
-    Label* deopt = compiler->AddDeoptStub(deopt_id_,
+    Label* deopt = compiler->AddDeoptStub(GetDeoptId(),
                                           ICData::kDeoptBinaryDoubleOp);
     if (value_type->is_nullable() &&
         (value_type->ToNullableCid() == kDoubleCid)) {
@@ -3316,7 +3312,8 @@
   const XmmRegister result = locs()->out(0).fpu_reg();
 
   if (value_cid != kFloat32x4Cid) {
-    Label* deopt = compiler->AddDeoptStub(deopt_id_, ICData::kDeoptCheckClass);
+    Label* deopt =
+        compiler->AddDeoptStub(GetDeoptId(), ICData::kDeoptCheckClass);
     __ testq(value, Immediate(kSmiTagMask));
     __ j(ZERO, deopt);
     __ CompareClassId(value, kFloat32x4Cid);
@@ -3369,7 +3366,8 @@
   const XmmRegister result = locs()->out(0).fpu_reg();
 
   if (value_cid != kFloat64x2Cid) {
-    Label* deopt = compiler->AddDeoptStub(deopt_id_, ICData::kDeoptCheckClass);
+    Label* deopt =
+        compiler->AddDeoptStub(GetDeoptId(), ICData::kDeoptCheckClass);
     __ testq(value, Immediate(kSmiTagMask));
     __ j(ZERO, deopt);
     __ CompareClassId(value, kFloat64x2Cid);
@@ -3421,7 +3419,8 @@
   const XmmRegister result = locs()->out(0).fpu_reg();
 
   if (value_cid != kInt32x4Cid) {
-    Label* deopt = compiler->AddDeoptStub(deopt_id_, ICData::kDeoptCheckClass);
+    Label* deopt =
+        compiler->AddDeoptStub(GetDeoptId(), ICData::kDeoptCheckClass);
     __ testq(value, Immediate(kSmiTagMask));
     __ j(ZERO, deopt);
     __ CompareClassId(value, kInt32x4Cid);
@@ -5556,7 +5555,7 @@
   } else if (value_cid == kSmiCid) {
     __ SmiUntag(result);
   } else {
-    Label* deopt = compiler->AddDeoptStub(deopt_id_,
+    Label* deopt = compiler->AddDeoptStub(GetDeoptId(),
                                           ICData::kDeoptUnboxInteger);
     Label done;
     __ SmiUntagOrCheckClass(value, kMintCid, &done);
@@ -6007,7 +6006,7 @@
   const intptr_t value_cid = value()->Type()->ToCid();
   const Register value = locs()->in(0).reg();
   Label* deopt = CanDeoptimize() ?
-      compiler->AddDeoptStub(deopt_id_, ICData::kDeoptUnboxInteger) : NULL;
+      compiler->AddDeoptStub(GetDeoptId(), ICData::kDeoptUnboxInteger) : NULL;
   ASSERT(value == locs()->out(0).reg());
 
   if (value_cid == kSmiCid) {
diff --git a/runtime/vm/message.h b/runtime/vm/message.h
index f69c395..113a943 100644
--- a/runtime/vm/message.h
+++ b/runtime/vm/message.h
@@ -93,12 +93,12 @@
   // message is available.  This function will not block.
   Message* Dequeue();
 
+  bool IsEmpty() { return head_ == NULL; }
+
   // Clear all messages from the message queue.
   void Clear();
 
  private:
-  friend class MessageQueueTestPeer;
-
   Message* head_;
   Message* tail_;
 
diff --git a/runtime/vm/message_handler.cc b/runtime/vm/message_handler.cc
index e5990fb..1f67d6b 100644
--- a/runtime/vm/message_handler.cc
+++ b/runtime/vm/message_handler.cc
@@ -204,6 +204,12 @@
 }
 
 
+bool MessageHandler::HasOOBMessages() {
+  MonitorLocker ml(&monitor_);
+  return !oob_queue_->IsEmpty();
+}
+
+
 void MessageHandler::TaskCallback() {
   ASSERT(Isolate::Current() == NULL);
   bool ok = true;
diff --git a/runtime/vm/message_handler.h b/runtime/vm/message_handler.h
index 65dc32f..0d2cc54 100644
--- a/runtime/vm/message_handler.h
+++ b/runtime/vm/message_handler.h
@@ -54,6 +54,10 @@
   // Returns true on success.
   bool HandleOOBMessages();
 
+  // Returns true if there are pending OOB messages for this message
+  // handler.
+  bool HasOOBMessages();
+
   // A message handler tracks how many live ports it has.
   bool HasLivePorts() const { return live_ports_ > 0; }
 
diff --git a/runtime/vm/message_handler_test.cc b/runtime/vm/message_handler_test.cc
index e401335..ccd476f 100644
--- a/runtime/vm/message_handler_test.cc
+++ b/runtime/vm/message_handler_test.cc
@@ -148,6 +148,27 @@
 }
 
 
+UNIT_TEST_CASE(MessageHandler_HasOOBMessages) {
+  TestMessageHandler handler;
+  MessageHandlerTestPeer handler_peer(&handler);
+
+  EXPECT(!handler.HasOOBMessages());
+
+  // Post a normal message.
+  Message* message = new Message(1, NULL, 0, Message::kNormalPriority);
+  handler_peer.PostMessage(message);
+  EXPECT(!handler.HasOOBMessages());
+
+  // Post an oob message.
+  message = new Message(1, NULL, 0, Message::kOOBPriority);
+  handler_peer.PostMessage(message);
+  EXPECT(handler.HasOOBMessages());
+
+  // Delete all pending messages.
+  handler_peer.CloseAllPorts();
+}
+
+
 UNIT_TEST_CASE(MessageHandler_ClosePort) {
   TestMessageHandler handler;
   MessageHandlerTestPeer handler_peer(&handler);
diff --git a/runtime/vm/message_test.cc b/runtime/vm/message_test.cc
index bc47b39..e2203a3 100644
--- a/runtime/vm/message_test.cc
+++ b/runtime/vm/message_test.cc
@@ -9,25 +9,6 @@
 namespace dart {
 
 
-// Provide access to private members of MessageQueue for testing.
-class MessageQueueTestPeer {
- public:
-  explicit MessageQueueTestPeer(MessageQueue* queue) : queue_(queue) {}
-
-  bool HasMessage() const {
-    // We don't really need to grab the monitor during the unit test,
-    // but it doesn't hurt.
-    bool result = (queue_->head_ != NULL);
-    return result;
-  }
-
- private:
-  MessageQueue* queue_;
-
-  DISALLOW_COPY_AND_ASSIGN(MessageQueueTestPeer);
-};
-
-
 static uint8_t* AllocMsg(const char* str) {
   return reinterpret_cast<uint8_t*>(strdup(str));
 }
@@ -35,8 +16,7 @@
 
 TEST_CASE(MessageQueue_BasicOperations) {
   MessageQueue queue;
-  MessageQueueTestPeer queue_peer(&queue);
-  EXPECT(!queue_peer.HasMessage());
+  EXPECT(queue.IsEmpty());
 
   Dart_Port port = 1;
 
@@ -48,25 +28,25 @@
       new Message(port, AllocMsg(str1), strlen(str1) + 1,
                   Message::kNormalPriority);
   queue.Enqueue(msg1);
-  EXPECT(queue_peer.HasMessage());
+  EXPECT(!queue.IsEmpty());
 
   Message* msg2 =
       new Message(port, AllocMsg(str2), strlen(str2) + 1,
                   Message::kNormalPriority);
 
   queue.Enqueue(msg2);
-  EXPECT(queue_peer.HasMessage());
+  EXPECT(!queue.IsEmpty());
 
   // Remove two messages.
   Message* msg = queue.Dequeue();
   EXPECT(msg != NULL);
   EXPECT_STREQ(str1, reinterpret_cast<char*>(msg->data()));
-  EXPECT(queue_peer.HasMessage());
+  EXPECT(!queue.IsEmpty());
 
   msg = queue.Dequeue();
   EXPECT(msg != NULL);
   EXPECT_STREQ(str2, reinterpret_cast<char*>(msg->data()));
-  EXPECT(!queue_peer.HasMessage());
+  EXPECT(queue.IsEmpty());
 
   delete msg1;
   delete msg2;
@@ -75,7 +55,6 @@
 
 TEST_CASE(MessageQueue_Clear) {
   MessageQueue queue;
-  MessageQueueTestPeer queue_peer(&queue);
   Dart_Port port1 = 1;
   Dart_Port port2 = 2;
 
@@ -92,9 +71,9 @@
                   Message::kNormalPriority);
   queue.Enqueue(msg2);
 
-  EXPECT(queue_peer.HasMessage());
+  EXPECT(!queue.IsEmpty());
   queue.Clear();
-  EXPECT(!queue_peer.HasMessage());
+  EXPECT(queue.IsEmpty());
 
   // msg1 and msg2 already delete by FlushAll.
 }
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 2177c1e..197ef30 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -1136,8 +1136,7 @@
     isolate_lib = Library::NewLibraryHelper(Symbols::DartIsolate(), true);
     isolate_lib.SetLoadRequested();
     isolate_lib.Register();
-    isolate->object_store()->set_bootstrap_library(ObjectStore::kIsolate,
-                                                   isolate_lib);
+    object_store->set_bootstrap_library(ObjectStore::kIsolate, isolate_lib);
   }
   ASSERT(!isolate_lib.IsNull());
   ASSERT(isolate_lib.raw() == Library::IsolateLibrary());
@@ -1259,8 +1258,7 @@
     lib = Library::NewLibraryHelper(Symbols::DartMirrors(), true);
     lib.SetLoadRequested();
     lib.Register();
-    isolate->object_store()->set_bootstrap_library(ObjectStore::kMirrors,
-                                                   lib);
+    object_store->set_bootstrap_library(ObjectStore::kMirrors, lib);
   }
   ASSERT(!lib.IsNull());
   ASSERT(lib.raw() == Library::MirrorsLibrary());
@@ -1275,8 +1273,7 @@
     lib = Library::NewLibraryHelper(Symbols::DartCollection(), true);
     lib.SetLoadRequested();
     lib.Register();
-    isolate->object_store()->set_bootstrap_library(ObjectStore::kCollection,
-                                                   lib);
+    object_store->set_bootstrap_library(ObjectStore::kCollection, lib);
   }
   ASSERT(!lib.IsNull());
   ASSERT(lib.raw() == Library::CollectionLibrary());
@@ -1296,8 +1293,7 @@
     lib = Library::NewLibraryHelper(Symbols::DartProfiler(), true);
     lib.SetLoadRequested();
     lib.Register();
-    isolate->object_store()->set_bootstrap_library(ObjectStore::kProfiler,
-                                                   lib);
+    object_store->set_bootstrap_library(ObjectStore::kProfiler, lib);
   }
   ASSERT(!lib.IsNull());
   ASSERT(lib.raw() == Library::ProfilerLibrary());
@@ -1311,7 +1307,7 @@
   // Setup some default native field classes which can be extended for
   // specifying native fields in dart classes.
   Library::InitNativeWrappersLibrary(isolate);
-  ASSERT(isolate->object_store()->native_wrappers_library() != Library::null());
+  ASSERT(object_store->native_wrappers_library() != Library::null());
 
   // Pre-register the typed_data library so the native class implementations
   // can be hooked up before compiling it.
@@ -1320,8 +1316,7 @@
     lib = Library::NewLibraryHelper(Symbols::DartTypedData(), true);
     lib.SetLoadRequested();
     lib.Register();
-    isolate->object_store()->set_bootstrap_library(ObjectStore::kTypedData,
-                                                   lib);
+    object_store->set_bootstrap_library(ObjectStore::kTypedData, lib);
   }
   ASSERT(!lib.IsNull());
   ASSERT(lib.raw() == Library::TypedDataLibrary());
@@ -1468,6 +1463,7 @@
 
   // Finish the initialization by compiling the bootstrap scripts containing the
   // base interfaces and the implementation of the internal classes.
+  StubCode::InitBootstrapStubs(isolate);
   const Error& error = Error::Handle(Bootstrap::LoadandCompileScripts());
   if (!error.IsNull()) {
     return error.raw();
@@ -1506,7 +1502,7 @@
   CLASS_LIST_WITH_NULL(ADD_SET_FIELD)
 #undef ADD_SET_FIELD
 
-  object_store->InitAsyncObjects();
+  isolate->object_store()->InitAsyncObjects();
 
   return Error::null();
 }
@@ -1617,6 +1613,8 @@
 
   cls = Class::New<MirrorReference>();
   cls = Class::New<UserTag>();
+
+  StubCode::InitBootstrapStubs(isolate);
 }
 
 
@@ -5108,15 +5106,17 @@
 
 bool Function::HasCode() const {
   ASSERT(raw_ptr()->instructions_ != Instructions::null());
+  StubCode* stub_code = Isolate::Current()->stub_code();
   return raw_ptr()->instructions_ !=
-      StubCode::LazyCompile_entry()->code()->ptr()->instructions_;
+      stub_code->LazyCompile_entry()->code()->ptr()->instructions_;
 }
 
 
 void Function::ClearCode() const {
   StorePointer(&raw_ptr()->unoptimized_code_, Code::null());
+  StubCode* stub_code = Isolate::Current()->stub_code();
   StorePointer(&raw_ptr()->instructions_,
-      Code::Handle(StubCode::LazyCompile_entry()->code()).instructions());
+      Code::Handle(stub_code->LazyCompile_entry()->code()).instructions());
 }
 
 
@@ -6130,7 +6130,8 @@
   result.set_is_inlinable(true);
   result.set_allows_hoisting_check_class(true);
   result.set_allows_bounds_check_generalization(true);
-  result.SetInstructions(Code::Handle(StubCode::LazyCompile_entry()->code()));
+  StubCode* stub_code = Isolate::Current()->stub_code();
+  result.SetInstructions(Code::Handle(stub_code->LazyCompile_entry()->code()));
   if (kind == RawFunction::kClosureFunction) {
     const ClosureData& data = ClosureData::Handle(ClosureData::New());
     result.set_data(data);
@@ -12445,7 +12446,6 @@
     result ^= raw;
     result.set_num_variables(num_variables);
   }
-  result.set_isolate(Isolate::Current());
   return result.raw();
 }
 
@@ -19697,9 +19697,6 @@
 RawInstance* Closure::New(const Function& function,
                           const Context& context,
                           Heap::Space space) {
-  Isolate* isolate = Isolate::Current();
-  ASSERT(context.isolate() == isolate);
-
   const Class& cls = Class::Handle(function.signature_class());
   ASSERT(cls.instance_size() == Closure::InstanceSize());
   Instance& result = Instance::Handle();
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 6c34fbc..d5e012a 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -4067,14 +4067,10 @@
  public:
   RawContext* parent() const { return raw_ptr()->parent_; }
   void set_parent(const Context& parent) const {
-    ASSERT(parent.IsNull() || parent.isolate() == Isolate::Current());
     StorePointer(&raw_ptr()->parent_, parent.raw());
   }
   static intptr_t parent_offset() { return OFFSET_OF(RawContext, parent_); }
 
-  Isolate* isolate() const { return raw_ptr()->isolate_; }
-  static intptr_t isolate_offset() { return OFFSET_OF(RawContext, isolate_); }
-
   intptr_t num_variables() const { return raw_ptr()->num_variables_; }
   static intptr_t num_variables_offset() {
     return OFFSET_OF(RawContext, num_variables_);
@@ -4114,10 +4110,6 @@
     return &raw_ptr()->data()[context_index];
   }
 
-  void set_isolate(Isolate* isolate) const {
-    StoreNonPointer(&raw_ptr()->isolate_, isolate);
-  }
-
   void set_num_variables(intptr_t num_variables) const {
     StoreNonPointer(&raw_ptr()->num_variables_, num_variables);
   }
diff --git a/runtime/vm/object_store.cc b/runtime/vm/object_store.cc
index 24e198c..5854176 100644
--- a/runtime/vm/object_store.cc
+++ b/runtime/vm/object_store.cc
@@ -37,6 +37,7 @@
     string_type_(Type::null()),
     future_class_(Class::null()),
     completer_class_(Class::null()),
+    stream_iterator_class_(Class::null()),
     one_byte_string_class_(Class::null()),
     two_byte_string_class_(Class::null()),
     external_one_byte_string_class_(Class::null()),
@@ -182,6 +183,9 @@
   cls = async_lib.LookupClass(Symbols::Completer());
   ASSERT(!cls.IsNull());
   set_completer_class(cls);
+  cls = async_lib.LookupClass(Symbols::StreamIterator());
+  ASSERT(!cls.IsNull());
+  set_stream_iterator_class(cls);
 }
 
 }  // namespace dart
diff --git a/runtime/vm/object_store.h b/runtime/vm/object_store.h
index 20b0b07..cf123e4 100644
--- a/runtime/vm/object_store.h
+++ b/runtime/vm/object_store.h
@@ -124,6 +124,11 @@
     completer_class_ = value.raw();
   }
 
+  RawClass* stream_iterator_class() const { return stream_iterator_class_; }
+  void set_stream_iterator_class(const Class& value) {
+    stream_iterator_class_ = value.raw();
+  }
+
   RawClass* one_byte_string_class() const { return one_byte_string_class_; }
   void set_one_byte_string_class(const Class& value) {
     one_byte_string_class_ = value.raw();
@@ -447,6 +452,7 @@
   RawType* string_type_;
   RawClass* future_class_;
   RawClass* completer_class_;
+  RawClass* stream_iterator_class_;
   RawClass* one_byte_string_class_;
   RawClass* two_byte_string_class_;
   RawClass* external_one_byte_string_class_;
diff --git a/runtime/vm/object_test.cc b/runtime/vm/object_test.cc
index 82efd99..4bd4aff 100644
--- a/runtime/vm/object_test.cc
+++ b/runtime/vm/object_test.cc
@@ -2400,11 +2400,8 @@
 TEST_CASE(Context) {
   const int kNumVariables = 5;
   const Context& parent_context = Context::Handle(Context::New(0));
-  EXPECT_EQ(parent_context.isolate(), Isolate::Current());
   const Context& context = Context::Handle(Context::New(kNumVariables));
   context.set_parent(parent_context);
-  const Context& check_parent_context = Context::Handle(context.parent());
-  EXPECT_EQ(context.isolate(), check_parent_context.isolate());
   EXPECT_EQ(kNumVariables, context.num_variables());
   EXPECT(Context::Handle(context.parent()).raw() == parent_context.raw());
   EXPECT_EQ(0, Context::Handle(context.parent()).num_variables());
diff --git a/runtime/vm/pages.cc b/runtime/vm/pages.cc
index 1f5666d..3972b55 100644
--- a/runtime/vm/pages.cc
+++ b/runtime/vm/pages.cc
@@ -35,13 +35,13 @@
             "Emit a log message when pointers to unused code are dropped.");
 DEFINE_FLAG(bool, always_drop_code, false,
             "Always try to drop code if the function's usage counter is >= 0");
-#if defined(TARGET_ARCH_IA32)
+#if defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_ARM)
 DEFINE_FLAG(bool, concurrent_sweep, true,
             "Concurrent sweep for old generation.");
-#else  // TARGET_ARCH_IA32
+#else  // TARGET_ARCH_IA32 || TARGET_ARCH_ARM
 DEFINE_FLAG(bool, concurrent_sweep, false,
             "Concurrent sweep for old generation.");
-#endif  // TARGET_ARCH_IA32
+#endif  // TARGET_ARCH_IA32 || TARGET_ARCH_ARM
 DEFINE_FLAG(bool, log_growth, false, "Log PageSpace growth policy decisions.");
 
 HeapPage* HeapPage::Initialize(VirtualMemory* memory, PageType type) {
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index d053fc6..775ed5f 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -7234,6 +7234,151 @@
 }
 
 
+AstNode* Parser::ParseAwaitForStatement(String* label_name) {
+  TRACE_PARSER("ParseAwaitForStatement");
+  ASSERT(IsAwaitKeyword());
+  const intptr_t await_for_pos = TokenPos();
+  ConsumeToken();  // await.
+  ASSERT(CurrentToken() == Token::kFOR);
+  ConsumeToken();  // for.
+  ExpectToken(Token::kLPAREN);
+
+  // Parse loop variable.
+  bool loop_var_is_final = (CurrentToken() == Token::kFINAL);
+  if (CurrentToken() == Token::kCONST) {
+    ReportError("Loop variable cannot be 'const'");
+  }
+  bool new_loop_var = false;
+  AbstractType& loop_var_type =  AbstractType::ZoneHandle(I);
+  if (LookaheadToken(1) != Token::kIN) {
+    // Declaration of a new loop variable.
+    // Delay creation of the local variable until we know its actual
+    // position, which is inside the loop body.
+    new_loop_var = true;
+    loop_var_type = ParseConstFinalVarOrType(
+       FLAG_enable_type_checks ? ClassFinalizer::kCanonicalize :
+                                 ClassFinalizer::kIgnore);
+  }
+  intptr_t loop_var_pos = TokenPos();
+  const String* loop_var_name = ExpectIdentifier("variable name expected");
+
+  // Parse stream expression.
+  ExpectToken(Token::kIN);
+  const intptr_t stream_pos = TokenPos();
+  AstNode* stream_expr =
+      ParseAwaitableExpr(kAllowConst, kConsumeCascades, NULL);
+  ExpectToken(Token::kRPAREN);
+
+  OpenBlock();
+
+  // Build creation of implicit StreamIterator.
+  // var :for-in-iter = new StreamIterator(stream_expr).
+  const Class& stream_iterator_cls =
+      Class::ZoneHandle(I, I->object_store()->stream_iterator_class());
+  ASSERT(!stream_iterator_cls.IsNull());
+  const Function& iterator_ctor =
+      Function::ZoneHandle(I, stream_iterator_cls.LookupFunction(
+          Symbols::StreamIteratorConstructor()));
+  ASSERT(!iterator_ctor.IsNull());
+  ArgumentListNode* ctor_args = new (I) ArgumentListNode(Scanner::kNoSourcePos);
+  ctor_args->Add(stream_expr);
+  ConstructorCallNode* ctor_call =
+      new (I) ConstructorCallNode(Scanner::kNoSourcePos,
+                              TypeArguments::ZoneHandle(I),
+                              iterator_ctor,
+                              ctor_args);
+  const AbstractType& iterator_type = Type::ZoneHandle(I, Type::DynamicType());
+  LocalVariable* iterator_var = new(I) LocalVariable(
+      stream_pos, Symbols::ForInIter(), iterator_type);
+  current_block_->scope->AddVariable(iterator_var);
+  AstNode* iterator_init =
+      new(I) StoreLocalNode(stream_pos, iterator_var, ctor_call);
+  current_block_->statements->Add(iterator_init);
+
+  // Build while loop condition.
+  // while (await :for-in-iter.moveNext())
+  ArgumentListNode* no_args = new(I) ArgumentListNode(stream_pos);
+  AstNode* iterator_moveNext = new(I) InstanceCallNode(
+      stream_pos,
+      new(I) LoadLocalNode(stream_pos, iterator_var),
+                           Symbols::MoveNext(),
+                           no_args);
+  AstNode* await_moveNext = new (I) AwaitNode(stream_pos, iterator_moveNext);
+  OpenBlock();
+  AwaitTransformer at(current_block_->statements,
+                      parsed_function(),
+                      async_temp_scope_);
+  AstNode* transformed_await = at.Transform(await_moveNext);
+  SequenceNode* await_preamble = CloseBlock();
+
+  // Parse the for loop body. Ideally, we would use ParseNestedStatement()
+  // here, but that does not work well because we have to insert an implicit
+  // variable assignment and potentially a variable declaration in the
+  // loop body.
+  OpenLoopBlock();
+  SourceLabel* label =
+      SourceLabel::New(await_for_pos, label_name, SourceLabel::kFor);
+  current_block_->scope->AddLabel(label);
+  const intptr_t loop_var_assignment_pos = TokenPos();
+
+  AstNode* iterator_current = new(I) InstanceGetterNode(
+      loop_var_assignment_pos,
+      new(I) LoadLocalNode(loop_var_assignment_pos, iterator_var),
+      Symbols::Current());
+
+  // Generate assignment of next iterator value to loop variable.
+  AstNode* loop_var_assignment = NULL;
+  if (new_loop_var) {
+    // The for loop variable is new for each iteration.
+    // Create a variable and add it to the loop body scope.
+    // Note that the variable token position needs to be inside the
+    // loop block, so it gets put in the loop context level.
+    LocalVariable* loop_var =
+        new(I) LocalVariable(loop_var_assignment_pos,
+                             *loop_var_name,
+                             loop_var_type);;
+    if (loop_var_is_final) {
+      loop_var->set_is_final();
+    }
+    current_block_->scope->AddVariable(loop_var);
+    loop_var_assignment = new(I) StoreLocalNode(
+        loop_var_assignment_pos, loop_var, iterator_current);
+  } else {
+    AstNode* loop_var_primary =
+        ResolveIdent(loop_var_pos, *loop_var_name, false);
+    ASSERT(!loop_var_primary->IsPrimaryNode());
+    loop_var_assignment = CreateAssignmentNode(loop_var_primary,
+                                               iterator_current,
+                                               loop_var_name,
+                                               loop_var_assignment_pos);
+    ASSERT(loop_var_assignment != NULL);
+  }
+  current_block_->statements->Add(loop_var_assignment);
+
+  // Now parse the for-in loop statement or block.
+  if (CurrentToken() == Token::kLBRACE) {
+    ConsumeToken();
+    ParseStatementSequence();
+    ExpectToken(Token::kRBRACE);
+  } else {
+    AstNode* statement = ParseStatement();
+    if (statement != NULL) {
+      current_block_->statements->Add(statement);
+    }
+  }
+  SequenceNode* for_loop_statement = CloseBlock();
+
+  WhileNode* while_node = new (I) WhileNode(await_for_pos,
+                                            label,
+                                            transformed_await,
+                                            await_preamble,
+                                            for_loop_statement);
+  current_block_->statements->Add(while_node);
+
+  return CloseBlock();  // Implicit block around while loop.
+}
+
+
 AstNode* Parser::ParseForInStatement(intptr_t forin_pos,
                                      SourceLabel* label) {
   TRACE_PARSER("ParseForInStatement");
@@ -8100,6 +8245,8 @@
     statement = ParseWhileStatement(label_name);
   } else if (token == Token::kFOR) {
     statement = ParseForStatement(label_name);
+  } else if (IsAwaitKeyword() && (LookaheadToken(1) == Token::kFOR)) {
+    statement = ParseAwaitForStatement(label_name);
   } else if (token == Token::kDO) {
     statement = ParseDoWhileStatement(label_name);
   } else if (token == Token::kSWITCH) {
diff --git a/runtime/vm/parser.h b/runtime/vm/parser.h
index 4be94ef..207b03d 100644
--- a/runtime/vm/parser.h
+++ b/runtime/vm/parser.h
@@ -568,6 +568,7 @@
   AstNode* ParseWhileStatement(String* label_name);
   AstNode* ParseDoWhileStatement(String* label_name);
   AstNode* ParseForStatement(String* label_name);
+  AstNode* ParseAwaitForStatement(String* label_name);
   AstNode* ParseForInStatement(intptr_t forin_pos, SourceLabel* label);
   RawClass* CheckCaseExpressions(const GrowableArray<LiteralNode*>& values);
   CaseNode* ParseCaseClause(LocalVariable* switch_expr_value,
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index a23585e..c59095d2 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -1173,7 +1173,6 @@
   RAW_HEAP_OBJECT_IMPLEMENTATION(Context);
 
   int32_t num_variables_;
-  Isolate* isolate_;
 
   RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->parent_); }
   RawContext* parent_;
diff --git a/runtime/vm/raw_object_snapshot.cc b/runtime/vm/raw_object_snapshot.cc
index 1c26b95..b0faf50 100644
--- a/runtime/vm/raw_object_snapshot.cc
+++ b/runtime/vm/raw_object_snapshot.cc
@@ -1365,9 +1365,6 @@
   // Set the object tags.
   context.set_tags(tags);
 
-  // Set the isolate implicitly.
-  context.set_isolate(reader->isolate());
-
   // Set all the object fields.
   // TODO(5411462): Need to assert No GC can happen here, even though
   // allocations may happen.
diff --git a/runtime/vm/runtime_entry_arm.cc b/runtime/vm/runtime_entry_arm.cc
index de52089..09cb5de 100644
--- a/runtime/vm/runtime_entry_arm.cc
+++ b/runtime/vm/runtime_entry_arm.cc
@@ -49,7 +49,7 @@
     // informative error message.
     __ LoadImmediate(R5, entry);
     __ LoadImmediate(R4, argument_count);
-    __ BranchLink(&StubCode::CallToRuntimeLabel());
+    __ BranchLink(&Isolate::Current()->stub_code()->CallToRuntimeLabel());
   }
 }
 
diff --git a/runtime/vm/runtime_entry_arm64.cc b/runtime/vm/runtime_entry_arm64.cc
index 6ce93de..553f64c 100644
--- a/runtime/vm/runtime_entry_arm64.cc
+++ b/runtime/vm/runtime_entry_arm64.cc
@@ -57,7 +57,7 @@
     // informative error message.
     __ LoadImmediate(R5, entry, kNoPP);
     __ LoadImmediate(R4, argument_count, kNoPP);
-    __ BranchLink(&StubCode::CallToRuntimeLabel(), PP);
+    __ BranchLink(&Isolate::Current()->stub_code()->CallToRuntimeLabel(), PP);
   }
 }
 
diff --git a/runtime/vm/runtime_entry_ia32.cc b/runtime/vm/runtime_entry_ia32.cc
index ecd2393..612b72b 100644
--- a/runtime/vm/runtime_entry_ia32.cc
+++ b/runtime/vm/runtime_entry_ia32.cc
@@ -33,7 +33,7 @@
     // informative error message.
     __ movl(ECX, Immediate(GetEntryPoint()));
     __ movl(EDX, Immediate(argument_count));
-    __ call(&StubCode::CallToRuntimeLabel());
+    __ call(&Isolate::Current()->stub_code()->CallToRuntimeLabel());
   }
 }
 
diff --git a/runtime/vm/runtime_entry_mips.cc b/runtime/vm/runtime_entry_mips.cc
index ca4a529..70f51cc 100644
--- a/runtime/vm/runtime_entry_mips.cc
+++ b/runtime/vm/runtime_entry_mips.cc
@@ -49,7 +49,7 @@
     // informative error message.
     __ LoadImmediate(S5, entry);
     __ LoadImmediate(S4, argument_count);
-    __ BranchLink(&StubCode::CallToRuntimeLabel());
+    __ BranchLink(&Isolate::Current()->stub_code()->CallToRuntimeLabel());
   }
 }
 
diff --git a/runtime/vm/runtime_entry_x64.cc b/runtime/vm/runtime_entry_x64.cc
index 8688684..7d07795 100644
--- a/runtime/vm/runtime_entry_x64.cc
+++ b/runtime/vm/runtime_entry_x64.cc
@@ -30,7 +30,7 @@
     // informative error message.
     __ movq(RBX, Immediate(GetEntryPoint()));
     __ movq(R10, Immediate(argument_count));
-    __ Call(&StubCode::CallToRuntimeLabel(), PP);
+    __ Call(&Isolate::Current()->stub_code()->CallToRuntimeLabel(), PP);
   }
 }
 
diff --git a/runtime/vm/simulator_arm.cc b/runtime/vm/simulator_arm.cc
index 17810a1c..399079c 100644
--- a/runtime/vm/simulator_arm.cc
+++ b/runtime/vm/simulator_arm.cc
@@ -678,55 +678,14 @@
 
 // Synchronization primitives support.
 Mutex* Simulator::exclusive_access_lock_ = NULL;
-Simulator::AddressTag Simulator::exclusive_access_state_[kNumAddressTags];
-int Simulator::next_address_tag_;
-
-
-void Simulator::SetExclusiveAccess(uword addr) {
-  Isolate* isolate = Isolate::Current();
-  ASSERT(isolate != NULL);
-  int i = 0;
-  while ((i < kNumAddressTags) &&
-         (exclusive_access_state_[i].isolate != isolate)) {
-    i++;
-  }
-  if (i == kNumAddressTags) {
-    i = next_address_tag_;
-    if (++next_address_tag_ == kNumAddressTags) next_address_tag_ = 0;
-    exclusive_access_state_[i].isolate = isolate;
-  }
-  exclusive_access_state_[i].addr = addr;
-}
-
-
-bool Simulator::HasExclusiveAccessAndOpen(uword addr) {
-  Isolate* isolate = Isolate::Current();
-  ASSERT(isolate != NULL);
-  bool result = false;
-  for (int i = 0; i < kNumAddressTags; i++) {
-    if (exclusive_access_state_[i].isolate == isolate) {
-      if (exclusive_access_state_[i].addr == addr) {
-        result = true;
-      }
-      exclusive_access_state_[i].addr = NULL;
-      continue;
-    }
-    if (exclusive_access_state_[i].addr == addr) {
-      exclusive_access_state_[i].addr = NULL;
-    }
-  }
-  return result;
-}
+Simulator::AddressTag Simulator::exclusive_access_state_[kNumAddressTags] =
+    {{NULL, 0}};
+int Simulator::next_address_tag_ = 0;
 
 
 void Simulator::InitOnce() {
-  // Setup exclusive access state.
+  // Setup exclusive access state lock.
   exclusive_access_lock_ = new Mutex();
-  for (int i = 0; i < kNumAddressTags; i++) {
-    exclusive_access_state_[i].isolate = NULL;
-    exclusive_access_state_[i].addr = NULL;
-  }
-  next_address_tag_ = 0;
 }
 
 
@@ -1112,16 +1071,59 @@
 
 
 // Synchronization primitives support.
+void Simulator::SetExclusiveAccess(uword addr) {
+  Isolate* isolate = Isolate::Current();
+  ASSERT(isolate != NULL);
+  DEBUG_ASSERT(exclusive_access_lock_->Owner() == isolate);
+  int i = 0;
+  // Find an entry for this isolate in the exclusive access state.
+  while ((i < kNumAddressTags) &&
+         (exclusive_access_state_[i].isolate != isolate)) {
+    i++;
+  }
+  // Round-robin replacement of previously used entries.
+  if (i == kNumAddressTags) {
+    i = next_address_tag_;
+    if (++next_address_tag_ == kNumAddressTags) {
+      next_address_tag_ = 0;
+    }
+    exclusive_access_state_[i].isolate = isolate;
+  }
+  // Remember the address being reserved.
+  exclusive_access_state_[i].addr = addr;
+}
+
+
+bool Simulator::HasExclusiveAccessAndOpen(uword addr) {
+  Isolate* isolate = Isolate::Current();
+  ASSERT(isolate != NULL);
+  ASSERT(addr != 0);
+  DEBUG_ASSERT(exclusive_access_lock_->Owner() == isolate);
+  bool result = false;
+  for (int i = 0; i < kNumAddressTags; i++) {
+    if (exclusive_access_state_[i].isolate == isolate) {
+      // Check whether the current isolate's address reservation matches.
+      if (exclusive_access_state_[i].addr == addr) {
+        result = true;
+      }
+      exclusive_access_state_[i].addr = 0;
+    } else if (exclusive_access_state_[i].addr == addr) {
+      // Other isolates with matching address lose their reservations.
+      exclusive_access_state_[i].addr = 0;
+    }
+  }
+  return result;
+}
+
+
 void Simulator::ClearExclusive() {
-  // This lock is initialized in Simulator::InitOnce().
   MutexLocker ml(exclusive_access_lock_);
-  // Set exclusive access to open state for this isolate.
-  HasExclusiveAccessAndOpen(NULL);
+  // Remove the reservation for this isolate.
+  SetExclusiveAccess(NULL);
 }
 
 
 intptr_t Simulator::ReadExclusiveW(uword addr, Instr* instr) {
-  // This lock is initialized in Simulator::InitOnce().
   MutexLocker ml(exclusive_access_lock_);
   SetExclusiveAccess(addr);
   return ReadW(addr, instr);
@@ -1129,7 +1131,6 @@
 
 
 intptr_t Simulator::WriteExclusiveW(uword addr, intptr_t value, Instr* instr) {
-  // This lock is initialized in Simulator::InitOnce().
   MutexLocker ml(exclusive_access_lock_);
   bool write_allowed = HasExclusiveAccessAndOpen(addr);
   if (write_allowed) {
@@ -1143,8 +1144,10 @@
 uword Simulator::CompareExchange(uword* address,
                                  uword compare_value,
                                  uword new_value) {
-  // This lock is initialized in Simulator::InitOnce().
   MutexLocker ml(exclusive_access_lock_);
+  // We do not get a reservation as it would be guaranteed to be found when
+  // writing below. No other isolate is able to make a reservation while we
+  // hold the lock.
   uword value = *address;
   if (value == compare_value) {
     *address = new_value;
diff --git a/runtime/vm/simulator_arm.h b/runtime/vm/simulator_arm.h
index 5136aba..b858b00f 100644
--- a/runtime/vm/simulator_arm.h
+++ b/runtime/vm/simulator_arm.h
@@ -17,11 +17,12 @@
 #endif
 
 #include "vm/constants_arm.h"
-#include "vm/object.h"
 
 namespace dart {
 
 class Isolate;
+class Mutex;
+class RawObject;
 class SimulatorSetjmpBuffer;
 
 typedef struct {
diff --git a/runtime/vm/simulator_arm64.cc b/runtime/vm/simulator_arm64.cc
index 6607c53..2192a8f 100644
--- a/runtime/vm/simulator_arm64.cc
+++ b/runtime/vm/simulator_arm64.cc
@@ -17,6 +17,7 @@
 #include "vm/constants_arm64.h"
 #include "vm/cpu.h"
 #include "vm/disassembler.h"
+#include "vm/lockers.h"
 #include "vm/native_arguments.h"
 #include "vm/stack_frame.h"
 #include "vm/thread.h"
@@ -529,6 +530,19 @@
 }
 
 
+// Synchronization primitives support.
+Mutex* Simulator::exclusive_access_lock_ = NULL;
+Simulator::AddressTag Simulator::exclusive_access_state_[kNumAddressTags] =
+    {{NULL, 0}};
+int Simulator::next_address_tag_ = 0;
+
+
+void Simulator::InitOnce() {
+  // Setup exclusive access state lock.
+  exclusive_access_lock_ = new Mutex();
+}
+
+
 Simulator::Simulator() {
   // Setup simulator support first. Some of this information is needed to
   // setup the architecture state.
@@ -923,6 +937,97 @@
 }
 
 
+// Synchronization primitives support.
+void Simulator::SetExclusiveAccess(uword addr) {
+  Isolate* isolate = Isolate::Current();
+  ASSERT(isolate != NULL);
+  DEBUG_ASSERT(exclusive_access_lock_->Owner() == isolate);
+  int i = 0;
+  // Find an entry for this isolate in the exclusive access state.
+  while ((i < kNumAddressTags) &&
+         (exclusive_access_state_[i].isolate != isolate)) {
+    i++;
+  }
+  // Round-robin replacement of previously used entries.
+  if (i == kNumAddressTags) {
+    i = next_address_tag_;
+    if (++next_address_tag_ == kNumAddressTags) {
+      next_address_tag_ = 0;
+    }
+    exclusive_access_state_[i].isolate = isolate;
+  }
+  // Remember the address being reserved.
+  exclusive_access_state_[i].addr = addr;
+}
+
+
+bool Simulator::HasExclusiveAccessAndOpen(uword addr) {
+  Isolate* isolate = Isolate::Current();
+  ASSERT(isolate != NULL);
+  ASSERT(addr != 0);
+  DEBUG_ASSERT(exclusive_access_lock_->Owner() == isolate);
+  bool result = false;
+  for (int i = 0; i < kNumAddressTags; i++) {
+    if (exclusive_access_state_[i].isolate == isolate) {
+      // Check whether the current isolates address reservation matches.
+      if (exclusive_access_state_[i].addr == addr) {
+        result = true;
+      }
+      exclusive_access_state_[i].addr = 0;
+    } else if (exclusive_access_state_[i].addr == addr) {
+      // Other isolates with matching address lose their reservations.
+      exclusive_access_state_[i].addr = 0;
+    }
+  }
+  return result;
+}
+
+
+void Simulator::ClearExclusive() {
+  MutexLocker ml(exclusive_access_lock_);
+  // Remove the reservation for this isolate.
+  SetExclusiveAccess(NULL);
+}
+
+
+intptr_t Simulator::ReadExclusiveW(uword addr, Instr* instr) {
+  MutexLocker ml(exclusive_access_lock_);
+  SetExclusiveAccess(addr);
+  return ReadW(addr, instr);
+}
+
+
+intptr_t Simulator::WriteExclusiveW(uword addr, intptr_t value, Instr* instr) {
+  MutexLocker ml(exclusive_access_lock_);
+  bool write_allowed = HasExclusiveAccessAndOpen(addr);
+  if (write_allowed) {
+    WriteW(addr, value, instr);
+    return 0;  // Success.
+  }
+  return 1;  // Failure.
+}
+
+
+uword Simulator::CompareExchange(uword* address,
+                                 uword compare_value,
+                                 uword new_value) {
+  MutexLocker ml(exclusive_access_lock_);
+  // We do not get a reservation as it would be guaranteed to be found when
+  // writing below. No other isolate is able to make a reservation while we
+  // hold the lock.
+  uword value = *address;
+  if (value == compare_value) {
+    *address = new_value;
+    // Same effect on exclusive access state as a successful STREX.
+    HasExclusiveAccessAndOpen(reinterpret_cast<uword>(address));
+  } else {
+    // Same effect on exclusive access state as an LDREX.
+    SetExclusiveAccess(reinterpret_cast<uword>(address));
+  }
+  return value;
+}
+
+
 // Unsupported instructions use Format to print an error and stop execution.
 void Simulator::Format(Instr* instr, const char* format) {
   OS::Print("Simulator found unsupported instruction:\n 0x%p: %s\n",
diff --git a/runtime/vm/simulator_arm64.h b/runtime/vm/simulator_arm64.h
index b63975a..be1679d 100644
--- a/runtime/vm/simulator_arm64.h
+++ b/runtime/vm/simulator_arm64.h
@@ -17,11 +17,12 @@
 #endif
 
 #include "vm/constants_arm64.h"
-#include "vm/object.h"
 
 namespace dart {
 
 class Isolate;
+class Mutex;
+class RawObject;
 class SimulatorSetjmpBuffer;
 
 typedef struct {
@@ -77,7 +78,7 @@
   void set_top_exit_frame_info(uword value) { top_exit_frame_info_ = value; }
 
   // Call on program start.
-  static void InitOnce() {}
+  static void InitOnce();
 
   // Dart generally calls into generated code with 5 parameters. This is a
   // convenience function, which sets up the simulator state and grabs the
@@ -91,6 +92,12 @@
                bool fp_return = false,
                bool fp_args = false);
 
+  // Implementation of atomic compare and exchange in the same synchronization
+  // domain as other synchronization primitive instructions (e.g. ldrex, strex).
+  static uword CompareExchange(uword* address,
+                               uword compare_value,
+                               uword new_value);
+
   // Runtime and native call support.
   enum CallKind {
     kRuntimeCall,
@@ -173,6 +180,38 @@
   inline intptr_t ReadX(uword addr, Instr* instr);
   inline void WriteX(uword addr, intptr_t value, Instr* instr);
 
+  // In Dart, there is at most one thread per isolate.
+  // We keep track of 16 exclusive access address tags across all isolates.
+  // Since we cannot simulate a native context switch, which clears
+  // the exclusive access state of the local monitor (using the CLREX
+  // instruction), we associate the isolate requesting exclusive access to the
+  // address tag. Multiple isolates requesting exclusive access (using the LDREX
+  // instruction) to the same address will result in multiple address tags being
+  // created for the same address, one per isolate.
+  // At any given time, each isolate is associated to at most one address tag.
+  static Mutex* exclusive_access_lock_;
+  static const int kNumAddressTags = 16;
+  static struct AddressTag {
+    Isolate* isolate;
+    uword addr;
+  } exclusive_access_state_[kNumAddressTags];
+  static int next_address_tag_;
+
+  // Synchronization primitives support.
+  void ClearExclusive();
+  intptr_t ReadExclusiveW(uword addr, Instr* instr);
+  intptr_t WriteExclusiveW(uword addr, intptr_t value, Instr* instr);
+
+  // Set access to given address to 'exclusive state' for current isolate.
+  static void SetExclusiveAccess(uword addr);
+
+  // Returns true if the current isolate has exclusive access to given address,
+  // returns false otherwise. In either case, set access to given address to
+  // 'open state' for all isolates.
+  // If given addr is NULL, set access to 'open state' for current
+  // isolate (CLREX).
+  static bool HasExclusiveAccessAndOpen(uword addr);
+
   // Helper functions to set the conditional flags in the architecture state.
   void SetNZFlagsW(int32_t val);
   bool CarryFromW(int32_t left, int32_t right, int32_t carry);
diff --git a/runtime/vm/simulator_mips.cc b/runtime/vm/simulator_mips.cc
index 36019a0..b1ce7f2 100644
--- a/runtime/vm/simulator_mips.cc
+++ b/runtime/vm/simulator_mips.cc
@@ -16,6 +16,7 @@
 #include "vm/assembler.h"
 #include "vm/constants_mips.h"
 #include "vm/disassembler.h"
+#include "vm/lockers.h"
 #include "vm/native_arguments.h"
 #include "vm/thread.h"
 
@@ -558,7 +559,16 @@
 }
 
 
+// Synchronization primitives support.
+Mutex* Simulator::exclusive_access_lock_ = NULL;
+Simulator::AddressTag Simulator::exclusive_access_state_[kNumAddressTags] =
+    {{NULL, 0}};
+int Simulator::next_address_tag_ = 0;
+
+
 void Simulator::InitOnce() {
+  // Setup exclusive access state lock.
+  exclusive_access_lock_ = new Mutex();
 }
 
 
@@ -943,6 +953,97 @@
 }
 
 
+// Synchronization primitives support.
+void Simulator::SetExclusiveAccess(uword addr) {
+  Isolate* isolate = Isolate::Current();
+  ASSERT(isolate != NULL);
+  DEBUG_ASSERT(exclusive_access_lock_->Owner() == isolate);
+  int i = 0;
+  // Find an entry for this isolate in the exclusive access state.
+  while ((i < kNumAddressTags) &&
+         (exclusive_access_state_[i].isolate != isolate)) {
+    i++;
+  }
+  // Round-robin replacement of previously used entries.
+  if (i == kNumAddressTags) {
+    i = next_address_tag_;
+    if (++next_address_tag_ == kNumAddressTags) {
+      next_address_tag_ = 0;
+    }
+    exclusive_access_state_[i].isolate = isolate;
+  }
+  // Remember the address being reserved.
+  exclusive_access_state_[i].addr = addr;
+}
+
+
+bool Simulator::HasExclusiveAccessAndOpen(uword addr) {
+  Isolate* isolate = Isolate::Current();
+  ASSERT(isolate != NULL);
+  ASSERT(addr != 0);
+  DEBUG_ASSERT(exclusive_access_lock_->Owner() == isolate);
+  bool result = false;
+  for (int i = 0; i < kNumAddressTags; i++) {
+    if (exclusive_access_state_[i].isolate == isolate) {
+      // Check whether the current isolates address reservation matches.
+      if (exclusive_access_state_[i].addr == addr) {
+        result = true;
+      }
+      exclusive_access_state_[i].addr = 0;
+    } else if (exclusive_access_state_[i].addr == addr) {
+      // Other isolates with matching address lose their reservations.
+      exclusive_access_state_[i].addr = 0;
+    }
+  }
+  return result;
+}
+
+
+void Simulator::ClearExclusive() {
+  MutexLocker ml(exclusive_access_lock_);
+  // Remove the reservation for this isolate.
+  SetExclusiveAccess(NULL);
+}
+
+
+intptr_t Simulator::ReadExclusiveW(uword addr, Instr* instr) {
+  MutexLocker ml(exclusive_access_lock_);
+  SetExclusiveAccess(addr);
+  return ReadW(addr, instr);
+}
+
+
+intptr_t Simulator::WriteExclusiveW(uword addr, intptr_t value, Instr* instr) {
+  MutexLocker ml(exclusive_access_lock_);
+  bool write_allowed = HasExclusiveAccessAndOpen(addr);
+  if (write_allowed) {
+    WriteW(addr, value, instr);
+    return 0;  // Success.
+  }
+  return 1;  // Failure.
+}
+
+
+uword Simulator::CompareExchange(uword* address,
+                                 uword compare_value,
+                                 uword new_value) {
+  MutexLocker ml(exclusive_access_lock_);
+  // We do not get a reservation as it would be guaranteed to be found when
+  // writing below. No other isolate is able to make a reservation while we
+  // hold the lock.
+  uword value = *address;
+  if (value == compare_value) {
+    *address = new_value;
+    // Same effect on exclusive access state as a successful SC.
+    HasExclusiveAccessAndOpen(reinterpret_cast<uword>(address));
+  } else {
+    // Same effect on exclusive access state as an LL.
+    SetExclusiveAccess(reinterpret_cast<uword>(address));
+  }
+  return value;
+}
+
+
 bool Simulator::OverflowFrom(int32_t alu_out,
                              int32_t left, int32_t right, bool addition) {
   bool overflow;
diff --git a/runtime/vm/simulator_mips.h b/runtime/vm/simulator_mips.h
index 45f45d8..1df5523 100644
--- a/runtime/vm/simulator_mips.h
+++ b/runtime/vm/simulator_mips.h
@@ -17,11 +17,12 @@
 #endif
 
 #include "vm/constants_mips.h"
-#include "vm/object.h"
 
 namespace dart {
 
 class Isolate;
+class Mutex;
+class RawObject;
 class SimulatorSetjmpBuffer;
 
 class Simulator {
@@ -110,6 +111,12 @@
                bool fp_return = false,
                bool fp_args = false);
 
+  // Implementation of atomic compare and exchange in the same synchronization
+  // domain as other synchronization primitive instructions (e.g. ldrex, strex).
+  static uword CompareExchange(uword* address,
+                               uword compare_value,
+                               uword new_value);
+
   // Runtime and native call support.
   enum CallKind {
     kRuntimeCall,
@@ -190,6 +197,38 @@
   inline double ReadD(uword addr, Instr* instr);
   inline void WriteD(uword addr, double value, Instr* instr);
 
+  // In Dart, there is at most one thread per isolate.
+  // We keep track of 16 exclusive access address tags across all isolates.
+  // Since we cannot simulate a native context switch, which clears
+  // the exclusive access state of the local monitor, we associate the isolate
+  // requesting exclusive access to the address tag.
+  // Multiple isolates requesting exclusive access (using the LL instruction)
+  // to the same address will result in multiple address tags being created for
+  // the same address, one per isolate.
+  // At any given time, each isolate is associated to at most one address tag.
+  static Mutex* exclusive_access_lock_;
+  static const int kNumAddressTags = 16;
+  static struct AddressTag {
+    Isolate* isolate;
+    uword addr;
+  } exclusive_access_state_[kNumAddressTags];
+  static int next_address_tag_;
+
+  // Synchronization primitives support.
+  void ClearExclusive();
+  intptr_t ReadExclusiveW(uword addr, Instr* instr);
+  intptr_t WriteExclusiveW(uword addr, intptr_t value, Instr* instr);
+
+  // Set access to given address to 'exclusive state' for current isolate.
+  static void SetExclusiveAccess(uword addr);
+
+  // Returns true if the current isolate has exclusive access to given address,
+  // returns false otherwise. In either case, set access to given address to
+  // 'open state' for all isolates.
+  // If given addr is NULL, set access to 'open state' for current
+  // isolate (CLREX).
+  static bool HasExclusiveAccessAndOpen(uword addr);
+
   void DoBranch(Instr* instr, bool taken, bool likely);
   void DoBreak(Instr *instr);
 
diff --git a/runtime/vm/snapshot.cc b/runtime/vm/snapshot.cc
index ff74a58..366ad92 100644
--- a/runtime/vm/snapshot.cc
+++ b/runtime/vm/snapshot.cc
@@ -304,12 +304,10 @@
     return result.raw();
   }
   ASSERT((class_header & kSmiTagMask) != kSmiTag);
-  cls_ = LookupInternalClass(class_header);
-  ASSERT(!cls_.IsNull());
 
   // Similarly Array and ImmutableArray objects are also similarly only
   // allocated here, the individual array elements are read later.
-  intptr_t class_id = cls_.id();
+  intptr_t class_id = LookupInternalClass(class_header);
   if (class_id == kArrayCid) {
     // Read the length and allocate an object based on the len.
     intptr_t len = ReadSmiValue();
@@ -806,21 +804,18 @@
 }
 
 
-RawClass* SnapshotReader::LookupInternalClass(intptr_t class_header) {
+intptr_t SnapshotReader::LookupInternalClass(intptr_t class_header) {
   // If the header is an object Id, lookup singleton VM classes or classes
   // stored in the object store.
   if (IsVMIsolateObject(class_header)) {
     intptr_t class_id = GetVMIsolateObjectId(class_header);
-    if (IsSingletonClassId(class_id)) {
-      return isolate()->class_table()->At(class_id);  // get singleton class.
-    }
-  } else if (SerializedHeaderTag::decode(class_header) == kObjectId) {
-    intptr_t class_id = SerializedHeaderData::decode(class_header);
-    if (IsObjectStoreClassId(class_id)) {
-      return isolate()->class_table()->At(class_id);  // get singleton class.
-    }
+    ASSERT(IsSingletonClassId(class_id));
+    return class_id;
   }
-  return Class::null();
+  ASSERT(SerializedHeaderTag::decode(class_header) == kObjectId);
+  intptr_t class_id = SerializedHeaderData::decode(class_header);
+  ASSERT(IsObjectStoreClassId(class_id));
+  return class_id;
 }
 
 
@@ -991,9 +986,8 @@
     return result->raw();
   }
   ASSERT((class_header & kSmiTagMask) != kSmiTag);
-  cls_ = LookupInternalClass(class_header);
-  ASSERT(!cls_.IsNull());
-  switch (cls_.id()) {
+  intptr_t class_id = LookupInternalClass(class_header);
+  switch (class_id) {
 #define SNAPSHOT_READ(clazz)                                                   \
     case clazz::kClassId: {                                                    \
       pobj_ = clazz::ReadFrom(this, object_id, tags, kind_);                   \
@@ -1005,7 +999,7 @@
     case kTypedData##clazz##Cid:                                               \
 
     CLASS_LIST_TYPED_DATA(SNAPSHOT_READ) {
-      tags = RawObject::ClassIdTag::update(cls_.id(), tags);
+      tags = RawObject::ClassIdTag::update(class_id, tags);
       pobj_ = TypedData::ReadFrom(this, object_id, tags, kind_);
       break;
     }
@@ -1014,7 +1008,7 @@
     case kExternalTypedData##clazz##Cid:                                       \
 
     CLASS_LIST_TYPED_DATA(SNAPSHOT_READ) {
-      tags = RawObject::ClassIdTag::update(cls_.id(), tags);
+      tags = RawObject::ClassIdTag::update(class_id, tags);
       pobj_ = ExternalTypedData::ReadFrom(this, object_id, tags, kind_);
       break;
     }
diff --git a/runtime/vm/snapshot.h b/runtime/vm/snapshot.h
index 117a9a2..74a77a1 100644
--- a/runtime/vm/snapshot.h
+++ b/runtime/vm/snapshot.h
@@ -361,8 +361,8 @@
   // Read an inlined object from the stream.
   RawObject* ReadInlinedObject(intptr_t object_id);
 
-  // Based on header field check to see if it is an internal VM class.
-  RawClass* LookupInternalClass(intptr_t class_header);
+  // Decode class id from the header field.
+  intptr_t LookupInternalClass(intptr_t class_header);
 
   void ArrayReadFrom(const Array& result, intptr_t len, intptr_t tags);
 
diff --git a/runtime/vm/stub_code.cc b/runtime/vm/stub_code.cc
index 96a5cae..8e41237 100644
--- a/runtime/vm/stub_code.cc
+++ b/runtime/vm/stub_code.cc
@@ -58,19 +58,31 @@
 }
 
 
-void StubCode::GenerateFor(Isolate* init) {
-  // Generate all the stubs.
+void StubCode::GenerateBootstrapStubsFor(Isolate* init) {
+  // Generate initial stubs.
   Code& code = Code::Handle();
-  STUB_CODE_LIST(STUB_CODE_GENERATE);
+  BOOTSTRAP_STUB_CODE_LIST(STUB_CODE_GENERATE);
+}
+
+
+void StubCode::GenerateStubsFor(Isolate* init) {
+  // Generate all the other stubs.
+  Code& code = Code::Handle();
+  REST_STUB_CODE_LIST(STUB_CODE_GENERATE);
 }
 
 #undef STUB_CODE_GENERATE
 
 
-void StubCode::Init(Isolate* isolate) {
+void StubCode::InitBootstrapStubs(Isolate* isolate) {
   StubCode* stubs = new StubCode(isolate);
   isolate->set_stub_code(stubs);
-  stubs->GenerateFor(isolate);
+  stubs->GenerateBootstrapStubsFor(isolate);
+}
+
+
+void StubCode::Init(Isolate* isolate) {
+  isolate->stub_code()->GenerateStubsFor(isolate);
 }
 
 
diff --git a/runtime/vm/stub_code.h b/runtime/vm/stub_code.h
index b8cc6d9..5e382c1 100644
--- a/runtime/vm/stub_code.h
+++ b/runtime/vm/stub_code.h
@@ -21,24 +21,8 @@
 // isolates running in this dart process.
 #define VM_STUB_CODE_LIST(V)                                                   \
   V(PrintStopMessage)                                                          \
-  V(CallToRuntime)                                                             \
-  V(LazyCompile)                                                               \
-  V(CallBootstrapCFunction)                                                    \
-  V(CallNativeCFunction)                                                       \
-  V(CallStaticFunction)                                                        \
-  V(FixCallersTarget)                                                          \
-  V(FixAllocationStubTarget)                                                   \
-  V(FixAllocateArrayStubTarget)                                                \
-  V(Deoptimize)                                                                \
-  V(DeoptimizeLazy)                                                            \
-  V(ICCallBreakpoint)                                                          \
-  V(ClosureCallBreakpoint)                                                     \
-  V(RuntimeCallBreakpoint)                                                     \
-  V(DebugStepCheck)                                                            \
   V(GetStackPointer)                                                           \
   V(JumpToExceptionHandler)                                                    \
-  V(UnoptimizedIdenticalWithNumberCheck)                                       \
-  V(OptimizedIdenticalWithNumberCheck)                                         \
 
 // Is it permitted for the stubs above to refer to Object::null(), which is
 // allocated in the VM isolate and shared across all isolates.
@@ -48,7 +32,19 @@
 
 // List of stubs created per isolate, these stubs could potentially contain
 // embedded objects and hence cannot be shared across isolates.
-#define STUB_CODE_LIST(V)                                                      \
+// The initial stubs are needed for loading bootstrapping scripts and have to
+// be generated before Object::Init is called.
+#define BOOTSTRAP_STUB_CODE_LIST(V)                                            \
+  V(CallToRuntime)                                                             \
+  V(LazyCompile)                                                               \
+
+#define REST_STUB_CODE_LIST(V)                                                 \
+  V(CallBootstrapCFunction)                                                    \
+  V(CallNativeCFunction)                                                       \
+  V(FixCallersTarget)                                                          \
+  V(CallStaticFunction)                                                        \
+  V(FixAllocationStubTarget)                                                   \
+  V(FixAllocateArrayStubTarget)                                                \
   V(CallClosureNoSuchMethod)                                                   \
   V(AllocateContext)                                                           \
   V(UpdateStoreBuffer)                                                         \
@@ -69,6 +65,18 @@
   V(Subtype1TestCache)                                                         \
   V(Subtype2TestCache)                                                         \
   V(Subtype3TestCache)                                                         \
+  V(Deoptimize)                                                                \
+  V(DeoptimizeLazy)                                                            \
+  V(ICCallBreakpoint)                                                          \
+  V(ClosureCallBreakpoint)                                                     \
+  V(RuntimeCallBreakpoint)                                                     \
+  V(UnoptimizedIdenticalWithNumberCheck)                                       \
+  V(OptimizedIdenticalWithNumberCheck)                                         \
+  V(DebugStepCheck)                                                            \
+
+#define STUB_CODE_LIST(V)                                                      \
+  BOOTSTRAP_STUB_CODE_LIST(V)                                                  \
+  REST_STUB_CODE_LIST(V)
 
 // class StubEntry is used to describe stub methods generated in dart to
 // abstract out common code executed from generated dart code.
@@ -106,7 +114,6 @@
         isolate_(isolate) {}
   ~StubCode();
 
-  void GenerateFor(Isolate* isolate);
 
   // Generate all stubs which are shared across all isolates, this is done
   // only once and the stub code resides in the vm_isolate heap.
@@ -114,6 +121,9 @@
 
   // Generate all stubs which are generated on a per isolate basis as they
   // have embedded objects which are isolate specific.
+  // Bootstrap stubs are needed before Object::Init to compile the bootstrap
+  // scripts.
+  static void InitBootstrapStubs(Isolate* isolate);
   static void Init(Isolate* isolate);
 
   static void VisitObjectPointers(ObjectPointerVisitor* visitor);
@@ -172,6 +182,9 @@
   static const intptr_t kNoInstantiator = 0;
 
  private:
+  void GenerateBootstrapStubsFor(Isolate* isolate);
+  void GenerateStubsFor(Isolate* isolate);
+
   friend class MegamorphicCacheTable;
 
   static const intptr_t kStubCodeSize = 4 * KB;
diff --git a/runtime/vm/stub_code_arm.cc b/runtime/vm/stub_code_arm.cc
index 6cdce72..77f9f74 100644
--- a/runtime/vm/stub_code_arm.cc
+++ b/runtime/vm/stub_code_arm.cc
@@ -45,8 +45,7 @@
   __ Push(IP);  // Push 0 for the PC marker.
   __ EnterFrame((1 << FP) | (1 << LR), 0);
 
-  // Load current Isolate pointer from Context structure into R0.
-  __ ldr(R0, FieldAddress(CTX, Context::isolate_offset()));
+  __ LoadIsolate(R0);
 
   // Save exit frame information to enable stack walking as we are about
   // to transition to Dart VM C++ code.
@@ -159,8 +158,7 @@
   __ Push(IP);  // Push 0 for the PC marker.
   __ EnterFrame((1 << FP) | (1 << LR), 0);
 
-  // Load current Isolate pointer from Context structure into R0.
-  __ ldr(R0, FieldAddress(CTX, Context::isolate_offset()));
+  __ LoadIsolate(R0);
 
   // Save exit frame information to enable stack walking as we are about
   // to transition to native code.
@@ -267,8 +265,7 @@
   __ Push(IP);  // Push 0 for the PC marker.
   __ EnterFrame((1 << FP) | (1 << LR), 0);
 
-  // Load current Isolate pointer from Context structure into R0.
-  __ ldr(R0, FieldAddress(CTX, Context::isolate_offset()));
+  __ LoadIsolate(R0);
 
   // Save exit frame information to enable stack walking as we are about
   // to transition to native code.
@@ -788,8 +785,6 @@
   __ EnterFrame((1 << FP) | (1 << LR), 0);
 
   // Save new context and C++ ABI callee-saved registers.
-  const intptr_t kNewContextOffsetFromFp =
-      -(1 + kAbiPreservedCpuRegCount) * kWordSize;
   __ PushList((1 << R3) | kAbiPreservedCpuRegs);
 
   const DRegister firstd = EvenDRegisterOf(kAbiFirstPreservedFpuReg);
@@ -815,7 +810,6 @@
   // Cache the new Context pointer into CTX while executing Dart code.
   __ ldr(CTX, Address(R3, VMHandles::kOffsetOfRawPtrInHandle));
 
-  // Load Isolate pointer into temporary register R8.
   __ LoadIsolate(R8);
 
   // Save the current VMTag on the stack.
@@ -875,14 +869,10 @@
   // Call the Dart code entrypoint.
   __ blx(R0);  // R4 is the arguments descriptor array.
 
-  // Read the saved new Context pointer.
-  __ ldr(CTX, Address(FP, kNewContextOffsetFromFp));
-  __ ldr(CTX, Address(CTX, VMHandles::kOffsetOfRawPtrInHandle));
-
   // Get rid of arguments pushed on the stack.
   __ AddImmediate(SP, FP, kSavedContextSlotFromEntryFp * kWordSize);
 
-  // Load Isolate pointer into CTX. Drop Context.
+  // Load Isolate pointer into CTX.
   __ LoadIsolate(CTX);
 
   // Restore the saved Context pointer into the Isolate structure.
@@ -988,16 +978,6 @@
     // R4: allocation stats address.
     __ str(R1, FieldAddress(R0, Context::num_variables_offset()));
 
-    // Setup isolate field.
-    // Load Isolate pointer into R3.
-    // R0: new object.
-    // R1: number of context variables.
-    // R2: object size.
-    // R4: allocation stats address.
-    __ LoadIsolate(R3);
-    // R3: isolate, not an object.
-    __ str(R3, FieldAddress(R0, Context::isolate_offset()));
-
     // Setup the parent field.
     // R0: new object.
     // R1: number of context variables.
@@ -1065,8 +1045,25 @@
   __ Ret();
 
   __ Bind(&add_to_buffer);
-  __ orr(R2, R2, Operand(1 << RawObject::kRememberedBit));
-  __ str(R2, FieldAddress(R0, Object::tags_offset()));
+  // R2: Header word.
+  if (TargetCPUFeatures::arm_version() == ARMv5TE) {
+    // TODO(21263): Implement 'swp' and use it below.
+    ASSERT(OS::NumberOfAvailableProcessors() <= 1);
+    __ orr(R2, R2, Operand(1 << RawObject::kRememberedBit));
+    __ str(R2, FieldAddress(R0, Object::tags_offset()));
+  } else {
+    // Atomically set the remembered bit of the object header.
+    ASSERT(Object::tags_offset() == 0);
+    __ sub(R3, R0, Operand(kHeapObjectTag));
+    // R3: Untagged address of header word (ldrex/strex do not support offsets).
+    Label retry;
+    __ Bind(&retry);
+    __ ldrex(R2, R3);
+    __ orr(R2, R2, Operand(1 << RawObject::kRememberedBit));
+    __ strex(R1, R2, R3);
+    __ cmp(R1, Operand(1));
+    __ b(&retry, EQ);
+  }
 
   // Load the isolate.
   // Spilled: R1, R2, R3.
@@ -1761,7 +1758,7 @@
     Assembler* assembler) {
   // Check single stepping.
   Label stepping, done_stepping;
-  __ ldr(R1, FieldAddress(CTX, Context::isolate_offset()));
+  __ LoadIsolate(R1);
   __ ldrb(R1, Address(R1, Isolate::single_step_offset()));
   __ CompareImmediate(R1, 0);
   __ b(&stepping, NE);
@@ -2021,7 +2018,7 @@
     Assembler* assembler) {
   // Check single stepping.
   Label stepping, done_stepping;
-  __ ldr(R1, FieldAddress(CTX, Context::isolate_offset()));
+  __ LoadIsolate(R1);
   __ ldrb(R1, Address(R1, Isolate::single_step_offset()));
   __ CompareImmediate(R1, 0);
   __ b(&stepping, NE);
diff --git a/runtime/vm/stub_code_arm64.cc b/runtime/vm/stub_code_arm64.cc
index b7f4a59..6fb4a0d 100644
--- a/runtime/vm/stub_code_arm64.cc
+++ b/runtime/vm/stub_code_arm64.cc
@@ -44,8 +44,7 @@
   __ Comment("CallToRuntimeStub");
   __ EnterFrame(0);
 
-  // Load current Isolate pointer from Context structure into R0.
-  __ LoadFieldFromOffset(R0, CTX, Context::isolate_offset(), kNoPP);
+  __ LoadIsolate(R0, kNoPP);
 
   // Save exit frame information to enable stack walking as we are about
   // to transition to Dart VM C++ code.
@@ -161,8 +160,7 @@
 
   __ EnterFrame(0);
 
-  // Load current Isolate pointer from Context structure into R0.
-  __ LoadFieldFromOffset(R0, CTX, Context::isolate_offset(), kNoPP);
+  __ LoadIsolate(R0, kNoPP);
 
   // Save exit frame information to enable stack walking as we are about
   // to transition to native code.
@@ -278,8 +276,7 @@
 
   __ EnterFrame(0);
 
-  // Load current Isolate pointer from Context structure into R0.
-  __ LoadFieldFromOffset(R0, CTX, Context::isolate_offset(), kNoPP);
+  __ LoadIsolate(R0, kNoPP);
 
   // Save exit frame information to enable stack walking as we are about
   // to transition to native code.
@@ -815,9 +812,6 @@
 //   R3 : new context containing the current isolate pointer.
 void StubCode::GenerateInvokeDartCodeStub(Assembler* assembler) {
   __ Comment("InvokeDartCodeStub");
-  // The new context, saved vm tag, the top exit frame, and the old context.
-  const intptr_t kNewContextOffsetFromFp =
-      -(1 + kAbiPreservedCpuRegCount + kAbiPreservedFpuRegCount) * kWordSize;
 
   // Copy the C stack pointer (R31) into the stack pointer we'll actually use
   // to access the stack, and put the C stack pointer at the stack limit.
@@ -844,6 +838,9 @@
 #if defined(DEBUG)
   {
     Label ok;
+    // The new context, saved vm tag, the top exit frame, and the old context.
+    const intptr_t kNewContextOffsetFromFp =
+        -(1 + kAbiPreservedCpuRegCount + kAbiPreservedFpuRegCount) * kWordSize;
     __ AddImmediate(R4, FP, kNewContextOffsetFromFp, kNoPP);
     __ CompareRegisters(R4, SP);
     __ b(&ok, EQ);
@@ -869,9 +866,6 @@
   // Load Isolate pointer into temporary register R5.
   __ LoadIsolate(R5, PP);
 
-  // Cache the new Context pointer into CTX while executing Dart code.
-  __ LoadFromOffset(CTX, R3, VMHandles::kOffsetOfRawPtrInHandle, PP);
-
   // Save the current VMTag on the stack.
   ASSERT(kSavedVMTagSlotFromEntryFp == -20);
   __ LoadFromOffset(R4, R5, Isolate::vm_tag_offset(), PP);
@@ -933,14 +927,10 @@
   // Restore constant pool pointer after return.
   __ LoadPoolPointer(PP);
 
-  // Read the saved new Context pointer.
-  __ LoadFromOffset(CTX, FP, kNewContextOffsetFromFp, PP);
-  __ LoadFromOffset(CTX, CTX, VMHandles::kOffsetOfRawPtrInHandle, PP);
-
   // Get rid of arguments pushed on the stack.
   __ AddImmediate(SP, FP, kSavedContextSlotFromEntryFp * kWordSize, PP);
 
-  // Load Isolate pointer into CTX. Drop Context.
+  // Load Isolate pointer into CTX.
   __ LoadIsolate(CTX, PP);
 
   // Restore the current VMTag from the stack.
@@ -1054,14 +1044,6 @@
     // R1: number of context variables as integer value (not object).
     __ StoreFieldToOffset(R1, R0, Context::num_variables_offset(), kNoPP);
 
-    // Setup isolate field.
-    // Load Isolate pointer into R2.
-    // R0: new object.
-    // R1: number of context variables.
-    __ LoadIsolate(R2, kNoPP);
-    // R2: isolate, not an object.
-    __ StoreFieldToOffset(R2, R0, Context::isolate_offset(), kNoPP);
-
     // Setup the parent field.
     // R0: new object.
     // R1: number of context variables.
@@ -1836,7 +1818,7 @@
     Assembler* assembler) {
   // Check single stepping.
   Label stepping, done_stepping;
-  __ LoadFieldFromOffset(R1, CTX, Context::isolate_offset(), kNoPP);
+  __ LoadIsolate(R1, kNoPP);
   __ LoadFromOffset(
       R1, R1, Isolate::single_step_offset(), kNoPP, kUnsignedByte);
   __ CompareImmediate(R1, 0, kNoPP);
@@ -2088,7 +2070,7 @@
     Assembler* assembler) {
   // Check single stepping.
   Label stepping, done_stepping;
-  __ LoadFieldFromOffset(R1, CTX, Context::isolate_offset(), kNoPP);
+  __ LoadIsolate(R1, kNoPP);
   __ LoadFromOffset(
       R1, R1, Isolate::single_step_offset(), kNoPP, kUnsignedByte);
   __ CompareImmediate(R1, 0, kNoPP);
diff --git a/runtime/vm/stub_code_arm64_test.cc b/runtime/vm/stub_code_arm64_test.cc
index 1011567..94da954 100644
--- a/runtime/vm/stub_code_arm64_test.cc
+++ b/runtime/vm/stub_code_arm64_test.cc
@@ -45,7 +45,6 @@
   const Smi& smi1 = Smi::ZoneHandle(Smi::New(value1));
   const Smi& smi2 = Smi::ZoneHandle(Smi::New(value2));
   const Context& context = Context::ZoneHandle(Context::New(0, Heap::kOld));
-  ASSERT(context.isolate() == Isolate::Current());
   __ EnterDartFrame(0);
   __ LoadObject(CTX, context, PP);
   __ PushObject(Object::null_object(), PP);  // Push Null obj for return value.
diff --git a/runtime/vm/stub_code_arm_test.cc b/runtime/vm/stub_code_arm_test.cc
index 5fa5b2a..9cd96ab 100644
--- a/runtime/vm/stub_code_arm_test.cc
+++ b/runtime/vm/stub_code_arm_test.cc
@@ -45,7 +45,6 @@
   const Smi& smi1 = Smi::ZoneHandle(Smi::New(value1));
   const Smi& smi2 = Smi::ZoneHandle(Smi::New(value2));
   const Context& context = Context::ZoneHandle(Context::New(0, Heap::kOld));
-  ASSERT(context.isolate() == Isolate::Current());
   __ EnterDartFrame(0);
   __ LoadObject(CTX, context);
   __ PushObject(Object::null_object());  // Push Null object for return value.
diff --git a/runtime/vm/stub_code_ia32.cc b/runtime/vm/stub_code_ia32.cc
index 9898d44..5b336a4 100644
--- a/runtime/vm/stub_code_ia32.cc
+++ b/runtime/vm/stub_code_ia32.cc
@@ -47,8 +47,7 @@
 
   __ EnterFrame(0);
 
-  // Load current Isolate pointer from Context structure into EAX.
-  __ movl(EAX, FieldAddress(CTX, Context::isolate_offset()));
+  __ LoadIsolate(EAX);
 
   // Save exit frame information to enable stack walking as we are about
   // to transition to Dart VM C++ code.
@@ -168,8 +167,7 @@
 
   __ EnterFrame(0);
 
-  // Load current Isolate pointer from Context structure into EDI.
-  __ movl(EDI, FieldAddress(CTX, Context::isolate_offset()));
+  __ LoadIsolate(EDI);
 
   // Save exit frame information to enable stack walking as we are about
   // to transition to dart VM code.
@@ -273,8 +271,7 @@
 
   __ EnterFrame(0);
 
-  // Load current Isolate pointer from Context structure into EDI.
-  __ movl(EDI, FieldAddress(CTX, Context::isolate_offset()));
+  __ LoadIsolate(EDI);
 
   // Save exit frame information to enable stack walking as we are about
   // to transition to dart VM code.
@@ -882,10 +879,6 @@
   // Call the dart code entrypoint.
   __ call(Address(EBP, kEntryPointOffset));
 
-  // Reread the Context pointer.
-  __ movl(CTX, Address(EBP, kNewContextOffset));
-  __ movl(CTX, Address(CTX, VMHandles::kOffsetOfRawPtrInHandle));
-
   // Reread the arguments descriptor array to obtain the number of passed
   // arguments.
   __ movl(EDX, Address(EBP, kArgumentsDescOffset));
@@ -894,7 +887,7 @@
   // Get rid of arguments pushed on the stack.
   __ leal(ESP, Address(ESP, EDX, TIMES_2, 0));  // EDX is a Smi.
 
-  // Load Isolate pointer into CTX. Drop Context.
+  // Load Isolate pointer into CTX.
   __ LoadIsolate(CTX);
 
   // Restore the saved Context pointer into the Isolate structure.
@@ -995,13 +988,6 @@
     // EDX: number of context variables as integer value (not object).
     __ movl(FieldAddress(EAX, Context::num_variables_offset()), EDX);
 
-    // Setup isolate field.
-    // Load Isolate pointer from Context structure into EBX.
-    // EAX: new object.
-    // EDX: number of context variables.
-    __ movl(FieldAddress(EAX, Context::isolate_offset()),
-            Immediate(reinterpret_cast<int32_t>(isolate)));
-
     const Immediate& raw_null =
         Immediate(reinterpret_cast<intptr_t>(Object::null()));
     // Setup the parent field.
@@ -1794,7 +1780,7 @@
 void StubCode::GenerateDebugStepCheckStub(Assembler* assembler) {
   // Check single stepping.
   Label stepping, done_stepping;
-  __ movl(EAX, FieldAddress(CTX, Context::isolate_offset()));
+  __ LoadIsolate(EAX);
   __ movzxb(EAX, Address(EAX, Isolate::single_step_offset()));
   __ cmpl(EAX, Immediate(0));
   __ j(NOT_EQUAL, &stepping, Assembler::kNearJump);
@@ -2056,7 +2042,7 @@
     Assembler* assembler) {
   // Check single stepping.
   Label stepping, done_stepping;
-  __ movl(EAX, FieldAddress(CTX, Context::isolate_offset()));
+  __ LoadIsolate(EAX);
   __ movzxb(EAX, Address(EAX, Isolate::single_step_offset()));
   __ cmpl(EAX, Immediate(0));
   __ j(NOT_EQUAL, &stepping);
diff --git a/runtime/vm/stub_code_ia32_test.cc b/runtime/vm/stub_code_ia32_test.cc
index baf8f15..468a607 100644
--- a/runtime/vm/stub_code_ia32_test.cc
+++ b/runtime/vm/stub_code_ia32_test.cc
@@ -45,7 +45,6 @@
   const Smi& smi1 = Smi::ZoneHandle(Smi::New(value1));
   const Smi& smi2 = Smi::ZoneHandle(Smi::New(value2));
   const Context& context = Context::ZoneHandle(Context::New(0, Heap::kOld));
-  ASSERT(context.isolate() == Isolate::Current());
   __ enter(Immediate(0));
   __ LoadObject(CTX, context);
   __ PushObject(Object::null_object());  // Push Null object for return value.
diff --git a/runtime/vm/stub_code_mips.cc b/runtime/vm/stub_code_mips.cc
index a500fa8..9cfd32f 100644
--- a/runtime/vm/stub_code_mips.cc
+++ b/runtime/vm/stub_code_mips.cc
@@ -48,8 +48,7 @@
   __ sw(FP, Address(SP, 0 * kWordSize));
   __ mov(FP, SP);
 
-  // Load current Isolate pointer from Context structure into A0.
-  __ lw(A0, FieldAddress(CTX, Context::isolate_offset()));
+  __ LoadIsolate(A0);
 
   // Save exit frame information to enable stack walking as we are about
   // to transition to Dart VM C++ code.
@@ -174,8 +173,7 @@
   __ sw(FP, Address(SP, 0 * kWordSize));
   __ mov(FP, SP);
 
-  // Load current Isolate pointer from Context structure into A0.
-  __ lw(A0, FieldAddress(CTX, Context::isolate_offset()));
+  __ LoadIsolate(A0);
 
   // Save exit frame information to enable stack walking as we are about
   // to transition to native code.
@@ -289,8 +287,7 @@
   __ sw(FP, Address(SP, 0 * kWordSize));
   __ mov(FP, SP);
 
-  // Load current Isolate pointer from Context structure into A0.
-  __ lw(A0, FieldAddress(CTX, Context::isolate_offset()));
+  __ LoadIsolate(A0);
 
   // Save exit frame information to enable stack walking as we are about
   // to transition to native code.
@@ -873,8 +870,6 @@
 
   // The new context, saved vm tag, the top exit frame, and the old context.
   const intptr_t kPreservedContextSlots = 4;
-  const intptr_t kNewContextOffsetFromFp =
-      -(1 + kAbiPreservedCpuRegCount + kAbiPreservedFpuRegCount) * kWordSize;
   const intptr_t kPreservedRegSpace =
       kWordSize * (kAbiPreservedCpuRegCount + kAbiPreservedFpuRegCount +
                    kPreservedContextSlots);
@@ -976,14 +971,10 @@
   __ jalr(A0);  // S4 is the arguments descriptor array.
   __ TraceSimMsg("InvokeDartCodeStub return");
 
-  // Read the saved new Context pointer.
-  __ lw(CTX, Address(FP, kNewContextOffsetFromFp));
-  __ lw(CTX, Address(CTX, VMHandles::kOffsetOfRawPtrInHandle));
-
   // Get rid of arguments pushed on the stack.
   __ AddImmediate(SP, FP, kSavedContextSlotFromEntryFp * kWordSize);
 
-  // Load Isolate pointer into CTX. Drop Context.
+  // Load Isolate pointer into CTX.
   __ LoadIsolate(CTX);
 
   // Restore the current VMTag from the stack.
@@ -1097,13 +1088,6 @@
     // T1: number of context variables as integer value (not object).
     __ sw(T1, FieldAddress(V0, Context::num_variables_offset()));
 
-    // Setup isolate field.
-    // V0: new object.
-    // T1: number of context variables.
-    // T2: isolate, not an object.
-    __ LoadIsolate(T2);
-    __ sw(T2, FieldAddress(V0, Context::isolate_offset()));
-
     __ LoadImmediate(T7, reinterpret_cast<intptr_t>(Object::null()));
 
     // Initialize the context variables.
@@ -1939,7 +1923,7 @@
 void StubCode::GenerateDebugStepCheckStub(Assembler* assembler) {
   // Check single stepping.
   Label stepping, done_stepping;
-  __ lw(T0, FieldAddress(CTX, Context::isolate_offset()));
+  __ LoadIsolate(T0);
   __ lbu(T0, Address(T0, Isolate::single_step_offset()));
   __ BranchNotEqual(T0, Immediate(0), &stepping);
   __ Bind(&done_stepping);
@@ -2228,7 +2212,7 @@
     Assembler* assembler) {
   // Check single stepping.
   Label stepping, done_stepping;
-  __ lw(T0, FieldAddress(CTX, Context::isolate_offset()));
+  __ LoadIsolate(T0);
   __ lbu(T0, Address(T0, Isolate::single_step_offset()));
   __ BranchNotEqual(T0, Immediate(0), &stepping);
   __ Bind(&done_stepping);
diff --git a/runtime/vm/stub_code_mips_test.cc b/runtime/vm/stub_code_mips_test.cc
index 00c5112..5582ec5 100644
--- a/runtime/vm/stub_code_mips_test.cc
+++ b/runtime/vm/stub_code_mips_test.cc
@@ -45,7 +45,6 @@
   const Smi& smi1 = Smi::ZoneHandle(Smi::New(value1));
   const Smi& smi2 = Smi::ZoneHandle(Smi::New(value2));
   const Context& context = Context::ZoneHandle(Context::New(0, Heap::kOld));
-  ASSERT(context.isolate() == Isolate::Current());
   __ EnterDartFrame(0);
   __ LoadObject(CTX, context);
   __ PushObject(Object::null_object());  // Push Null object for return value.
diff --git a/runtime/vm/stub_code_x64.cc b/runtime/vm/stub_code_x64.cc
index d4bc732..7be3f88 100644
--- a/runtime/vm/stub_code_x64.cc
+++ b/runtime/vm/stub_code_x64.cc
@@ -44,8 +44,7 @@
 
   __ EnterFrame(0);
 
-  // Load current Isolate pointer from Context structure into RAX.
-  __ movq(RAX, FieldAddress(CTX, Context::isolate_offset()));
+  __ LoadIsolate(RAX);
 
   // Save exit frame information to enable stack walking as we are about
   // to transition to Dart VM C++ code.
@@ -156,8 +155,7 @@
 
   __ EnterFrame(0);
 
-  // Load current Isolate pointer from Context structure into R8.
-  __ movq(R8, FieldAddress(CTX, Context::isolate_offset()));
+  __ LoadIsolate(R8);
 
   // Save exit frame information to enable stack walking as we are about
   // to transition to native code.
@@ -245,8 +243,7 @@
 
   __ EnterFrame(0);
 
-  // Load current Isolate pointer from Context structure into R8.
-  __ movq(R8, FieldAddress(CTX, Context::isolate_offset()));
+  __ LoadIsolate(R8);
 
   // Save exit frame information to enable stack walking as we are about
   // to transition to native code.
@@ -750,7 +747,6 @@
   // Save arguments descriptor array and new context.
   const intptr_t kArgumentsDescOffset = -(kInitialOffset) * kWordSize;
   __ pushq(kArgDescReg);
-  const intptr_t kNewContextOffset = -(kInitialOffset + 1) * kWordSize;
   __ pushq(kNewContextReg);
 
   // Save C++ ABI callee-saved registers.
@@ -868,10 +864,6 @@
   // Call the Dart code entrypoint.
   __ call(kEntryPointReg);  // R10 is the arguments descriptor array.
 
-  // Restore CTX from the saved context handle.
-  __ movq(CTX, Address(RBP, kNewContextOffset));
-  __ movq(CTX, Address(CTX, VMHandles::kOffsetOfRawPtrInHandle));
-
   // Read the saved arguments descriptor array to obtain the number of passed
   // arguments.
   __ movq(kArgDescReg, Address(RBP, kArgumentsDescOffset));
@@ -979,13 +971,6 @@
     // R10: number of context variables as integer value (not object).
     __ movq(FieldAddress(RAX, Context::num_variables_offset()), R10);
 
-    // Setup isolate field.
-    // RAX: new object.
-    // R10: number of context variables.
-    // R13: Isolate, not an object.
-    __ LoadIsolate(R13);
-    __ movq(FieldAddress(RAX, Context::isolate_offset()), R13);
-
     // Setup the parent field.
     // RAX: new object.
     // R10: number of context variables.
@@ -1754,7 +1739,7 @@
 void StubCode::GenerateDebugStepCheckStub(Assembler* assembler) {
   // Check single stepping.
   Label stepping, done_stepping;
-  __ movq(RAX, FieldAddress(CTX, Context::isolate_offset()));
+  __ LoadIsolate(RAX);
   __ movzxb(RAX, Address(RAX, Isolate::single_step_offset()));
   __ cmpq(RAX, Immediate(0));
   __ j(NOT_EQUAL, &stepping, Assembler::kNearJump);
@@ -2021,7 +2006,7 @@
     Assembler* assembler) {
   // Check single stepping.
   Label stepping, done_stepping;
-  __ movq(RAX, FieldAddress(CTX, Context::isolate_offset()));
+  __ LoadIsolate(RAX);
   __ movzxb(RAX, Address(RAX, Isolate::single_step_offset()));
   __ cmpq(RAX, Immediate(0));
   __ j(NOT_EQUAL, &stepping);
diff --git a/runtime/vm/stub_code_x64_test.cc b/runtime/vm/stub_code_x64_test.cc
index fb70f91..bff9297 100644
--- a/runtime/vm/stub_code_x64_test.cc
+++ b/runtime/vm/stub_code_x64_test.cc
@@ -45,7 +45,6 @@
   const Smi& smi1 = Smi::ZoneHandle(Smi::New(value1));
   const Smi& smi2 = Smi::ZoneHandle(Smi::New(value2));
   const Context& context = Context::ZoneHandle(Context::New(0, Heap::kOld));
-  ASSERT(context.isolate() == Isolate::Current());
   __ EnterStubFrame(true);
   __ LoadObject(CTX, context, PP);
   __ PushObject(Object::null_object(), PP);  // Push Null obj for return value.
diff --git a/runtime/vm/symbols.h b/runtime/vm/symbols.h
index feb8a24..2a013e9 100644
--- a/runtime/vm/symbols.h
+++ b/runtime/vm/symbols.h
@@ -89,6 +89,8 @@
   V(CompleterCompleteError, "completeError")                                   \
   V(CompleterConstructor, "Completer.")                                        \
   V(CompleterFuture, "future")                                                 \
+  V(StreamIterator, "StreamIterator")                                          \
+  V(StreamIteratorConstructor, "StreamIterator.")                              \
   V(Native, "native")                                                          \
   V(Class, "Class")                                                            \
   V(Null, "Null")                                                              \
diff --git a/runtime/vm/vm.gypi b/runtime/vm/vm.gypi
index 43d82d2..84ce2357 100644
--- a/runtime/vm/vm.gypi
+++ b/runtime/vm/vm.gypi
@@ -62,6 +62,7 @@
             'libraries': [
               '-lpthread',
               '-lrt',
+              '-ldl',
             ],
           },
         }],
@@ -70,6 +71,7 @@
             'libraries': [
               '-lpthread',
               '-lrt',
+              '-ldl',
             ],
           },
         }],
diff --git a/runtime/vm/vm_sources.gypi b/runtime/vm/vm_sources.gypi
index 30915cd..a490cdd 100644
--- a/runtime/vm/vm_sources.gypi
+++ b/runtime/vm/vm_sources.gypi
@@ -40,6 +40,7 @@
     'atomic_android.h',
     'atomic_linux.h',
     'atomic_macos.h',
+    'atomic_simulator.h',
     'atomic_win.h',
     'base_isolate.h',
     'benchmark_test.cc',
diff --git a/sdk/lib/_blink/dartium/_blink_dartium.dart b/sdk/lib/_blink/dartium/_blink_dartium.dart
index 6f6f0a5..acbe820 100644
--- a/sdk/lib/_blink/dartium/_blink_dartium.dart
+++ b/sdk/lib/_blink/dartium/_blink_dartium.dart
@@ -1,9117 +1,30426 @@
-/**
- * This library provides entry points to the native Blink code which backs
- * up the dart:html library.
- */
-library dart.dom._blink;
-
 // Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// DO NOT EDIT
-// Auto-generated dart:_blink library.
+// WARNING: Do not edit - generated code.
+library dart.dom._blink;
 
+// This is a place to put custom renames if we need them.
+final resolverMap = {
+};
 
+dynamic _resolver(String s) native "blinkInstanceResolver";
 
+dynamic resolver(String s) {
+  String className = s;
+  if (resolverMap.containsKey(s))
+    className = resolverMap[s];
+  return _resolver(className);
+}
 
 class BlinkANGLEInstancedArrays {
-  static drawArraysInstancedANGLE_Callback_4(mthis, mode, first, count, primcount) native "ANGLEInstancedArrays_drawArraysInstancedANGLE_Callback";
+  static final instance = new BlinkANGLEInstancedArrays();
 
-  static drawElementsInstancedANGLE_Callback_5(mthis, mode, count, type, offset, primcount) native "ANGLEInstancedArrays_drawElementsInstancedANGLE_Callback";
+  static drawArraysInstancedANGLE_Callback_2(mthis, __arg_0, __arg_1) native "ANGLEInstancedArrays_drawArraysInstancedANGLE_Callback";
+  drawArraysInstancedANGLE_Callback_2_(mthis, __arg_0, __arg_1) => drawArraysInstancedANGLE_Callback_2(mthis, __arg_0, __arg_1);
 
-  static vertexAttribDivisorANGLE_Callback_2(mthis, index, divisor) native "ANGLEInstancedArrays_vertexAttribDivisorANGLE_Callback";
+  static drawArraysInstancedANGLE_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "ANGLEInstancedArrays_drawArraysInstancedANGLE_Callback";
+  drawArraysInstancedANGLE_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => drawArraysInstancedANGLE_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static drawArraysInstancedANGLE_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "ANGLEInstancedArrays_drawArraysInstancedANGLE_Callback";
+  drawArraysInstancedANGLE_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => drawArraysInstancedANGLE_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static drawArraysInstancedANGLE_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "ANGLEInstancedArrays_drawArraysInstancedANGLE_Callback";
+  drawArraysInstancedANGLE_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => drawArraysInstancedANGLE_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static drawArraysInstancedANGLE_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "ANGLEInstancedArrays_drawArraysInstancedANGLE_Callback";
+  drawArraysInstancedANGLE_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => drawArraysInstancedANGLE_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static drawElementsInstancedANGLE_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "ANGLEInstancedArrays_drawElementsInstancedANGLE_Callback";
+  drawElementsInstancedANGLE_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => drawElementsInstancedANGLE_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static drawElementsInstancedANGLE_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "ANGLEInstancedArrays_drawElementsInstancedANGLE_Callback";
+  drawElementsInstancedANGLE_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => drawElementsInstancedANGLE_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static drawElementsInstancedANGLE_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "ANGLEInstancedArrays_drawElementsInstancedANGLE_Callback";
+  drawElementsInstancedANGLE_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => drawElementsInstancedANGLE_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static drawElementsInstancedANGLE_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "ANGLEInstancedArrays_drawElementsInstancedANGLE_Callback";
+  drawElementsInstancedANGLE_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => drawElementsInstancedANGLE_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static drawElementsInstancedANGLE_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) native "ANGLEInstancedArrays_drawElementsInstancedANGLE_Callback";
+  drawElementsInstancedANGLE_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => drawElementsInstancedANGLE_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6);
+
+  static vertexAttribDivisorANGLE_Callback_0(mthis) native "ANGLEInstancedArrays_vertexAttribDivisorANGLE_Callback";
+  vertexAttribDivisorANGLE_Callback_0_(mthis) => vertexAttribDivisorANGLE_Callback_0(mthis);
+
+  static vertexAttribDivisorANGLE_Callback_1(mthis, __arg_0) native "ANGLEInstancedArrays_vertexAttribDivisorANGLE_Callback";
+  vertexAttribDivisorANGLE_Callback_1_(mthis, __arg_0) => vertexAttribDivisorANGLE_Callback_1(mthis, __arg_0);
+
+  static vertexAttribDivisorANGLE_Callback_2(mthis, __arg_0, __arg_1) native "ANGLEInstancedArrays_vertexAttribDivisorANGLE_Callback";
+  vertexAttribDivisorANGLE_Callback_2_(mthis, __arg_0, __arg_1) => vertexAttribDivisorANGLE_Callback_2(mthis, __arg_0, __arg_1);
+
+  static vertexAttribDivisorANGLE_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "ANGLEInstancedArrays_vertexAttribDivisorANGLE_Callback";
+  vertexAttribDivisorANGLE_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => vertexAttribDivisorANGLE_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static vertexAttribDivisorANGLE_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "ANGLEInstancedArrays_vertexAttribDivisorANGLE_Callback";
+  vertexAttribDivisorANGLE_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => vertexAttribDivisorANGLE_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
 }
 
-class BlinkAbstractWorker {}
+class BlinkAnalyserNode extends BlinkAudioNode {
+  static final instance = new BlinkAnalyserNode();
 
-class BlinkEventTarget {
-  static addEventListener_Callback_3(mthis, type, listener, useCapture) native "EventTarget_addEventListener_Callback";
-
-  static addEventListener_Callback_2(mthis, type, listener) native "EventTarget_addEventListener_Callback";
-
-  static addEventListener_Callback_1(mthis, type) native "EventTarget_addEventListener_Callback";
-
-  static addEventListener_Callback(mthis) native "EventTarget_addEventListener_Callback";
-
-  static dispatchEvent_Callback_1(mthis, event) native "EventTarget_dispatchEvent_Callback";
-
-  static removeEventListener_Callback_3(mthis, type, listener, useCapture) native "EventTarget_removeEventListener_Callback";
-
-  static removeEventListener_Callback_2(mthis, type, listener) native "EventTarget_removeEventListener_Callback";
-
-  static removeEventListener_Callback_1(mthis, type) native "EventTarget_removeEventListener_Callback";
-
-  static removeEventListener_Callback(mthis) native "EventTarget_removeEventListener_Callback";
-}
-
-class BlinkAudioNode {
-  static channelCount_Getter(mthis) native "AudioNode_channelCount_Getter";
-
-  static channelCount_Setter(mthis, value) native "AudioNode_channelCount_Setter";
-
-  static channelCountMode_Getter(mthis) native "AudioNode_channelCountMode_Getter";
-
-  static channelCountMode_Setter(mthis, value) native "AudioNode_channelCountMode_Setter";
-
-  static channelInterpretation_Getter(mthis) native "AudioNode_channelInterpretation_Getter";
-
-  static channelInterpretation_Setter(mthis, value) native "AudioNode_channelInterpretation_Setter";
-
-  static context_Getter(mthis) native "AudioNode_context_Getter";
-
-  static numberOfInputs_Getter(mthis) native "AudioNode_numberOfInputs_Getter";
-
-  static numberOfOutputs_Getter(mthis) native "AudioNode_numberOfOutputs_Getter";
-
-  static connect_Callback_3(mthis, destination, output, input) native "AudioNode_connect_Callback";
-
-  static connect_Callback_2(mthis, destination, output) native "AudioNode_connect_Callback";
-
-  static disconnect_Callback_1(mthis, output) native "AudioNode_disconnect_Callback";
-}
-
-class BlinkAnalyserNode {
   static fftSize_Getter(mthis) native "AnalyserNode_fftSize_Getter";
+  fftSize_Getter_(mthis) => fftSize_Getter(mthis);
 
-  static fftSize_Setter(mthis, value) native "AnalyserNode_fftSize_Setter";
+  static fftSize_Setter(mthis, __arg_0) native "AnalyserNode_fftSize_Setter";
+  fftSize_Setter_(mthis, __arg_0) => fftSize_Setter(mthis, __arg_0);
 
   static frequencyBinCount_Getter(mthis) native "AnalyserNode_frequencyBinCount_Getter";
+  frequencyBinCount_Getter_(mthis) => frequencyBinCount_Getter(mthis);
+
+  static getByteFrequencyData_Callback_0(mthis) native "AnalyserNode_getByteFrequencyData_Callback";
+  getByteFrequencyData_Callback_0_(mthis) => getByteFrequencyData_Callback_0(mthis);
+
+  static getByteFrequencyData_Callback_1(mthis, __arg_0) native "AnalyserNode_getByteFrequencyData_Callback";
+  getByteFrequencyData_Callback_1_(mthis, __arg_0) => getByteFrequencyData_Callback_1(mthis, __arg_0);
+
+  static getByteFrequencyData_Callback_2(mthis, __arg_0, __arg_1) native "AnalyserNode_getByteFrequencyData_Callback";
+  getByteFrequencyData_Callback_2_(mthis, __arg_0, __arg_1) => getByteFrequencyData_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getByteFrequencyData_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "AnalyserNode_getByteFrequencyData_Callback";
+  getByteFrequencyData_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getByteFrequencyData_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static getByteTimeDomainData_Callback_0(mthis) native "AnalyserNode_getByteTimeDomainData_Callback";
+  getByteTimeDomainData_Callback_0_(mthis) => getByteTimeDomainData_Callback_0(mthis);
+
+  static getByteTimeDomainData_Callback_1(mthis, __arg_0) native "AnalyserNode_getByteTimeDomainData_Callback";
+  getByteTimeDomainData_Callback_1_(mthis, __arg_0) => getByteTimeDomainData_Callback_1(mthis, __arg_0);
+
+  static getByteTimeDomainData_Callback_2(mthis, __arg_0, __arg_1) native "AnalyserNode_getByteTimeDomainData_Callback";
+  getByteTimeDomainData_Callback_2_(mthis, __arg_0, __arg_1) => getByteTimeDomainData_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getByteTimeDomainData_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "AnalyserNode_getByteTimeDomainData_Callback";
+  getByteTimeDomainData_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getByteTimeDomainData_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static getFloatFrequencyData_Callback_0(mthis) native "AnalyserNode_getFloatFrequencyData_Callback";
+  getFloatFrequencyData_Callback_0_(mthis) => getFloatFrequencyData_Callback_0(mthis);
+
+  static getFloatFrequencyData_Callback_1(mthis, __arg_0) native "AnalyserNode_getFloatFrequencyData_Callback";
+  getFloatFrequencyData_Callback_1_(mthis, __arg_0) => getFloatFrequencyData_Callback_1(mthis, __arg_0);
+
+  static getFloatFrequencyData_Callback_2(mthis, __arg_0, __arg_1) native "AnalyserNode_getFloatFrequencyData_Callback";
+  getFloatFrequencyData_Callback_2_(mthis, __arg_0, __arg_1) => getFloatFrequencyData_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getFloatFrequencyData_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "AnalyserNode_getFloatFrequencyData_Callback";
+  getFloatFrequencyData_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getFloatFrequencyData_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static getFloatTimeDomainData_Callback_0(mthis) native "AnalyserNode_getFloatTimeDomainData_Callback";
+  getFloatTimeDomainData_Callback_0_(mthis) => getFloatTimeDomainData_Callback_0(mthis);
+
+  static getFloatTimeDomainData_Callback_1(mthis, __arg_0) native "AnalyserNode_getFloatTimeDomainData_Callback";
+  getFloatTimeDomainData_Callback_1_(mthis, __arg_0) => getFloatTimeDomainData_Callback_1(mthis, __arg_0);
+
+  static getFloatTimeDomainData_Callback_2(mthis, __arg_0, __arg_1) native "AnalyserNode_getFloatTimeDomainData_Callback";
+  getFloatTimeDomainData_Callback_2_(mthis, __arg_0, __arg_1) => getFloatTimeDomainData_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getFloatTimeDomainData_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "AnalyserNode_getFloatTimeDomainData_Callback";
+  getFloatTimeDomainData_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getFloatTimeDomainData_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
   static maxDecibels_Getter(mthis) native "AnalyserNode_maxDecibels_Getter";
+  maxDecibels_Getter_(mthis) => maxDecibels_Getter(mthis);
 
-  static maxDecibels_Setter(mthis, value) native "AnalyserNode_maxDecibels_Setter";
+  static maxDecibels_Setter(mthis, __arg_0) native "AnalyserNode_maxDecibels_Setter";
+  maxDecibels_Setter_(mthis, __arg_0) => maxDecibels_Setter(mthis, __arg_0);
 
   static minDecibels_Getter(mthis) native "AnalyserNode_minDecibels_Getter";
+  minDecibels_Getter_(mthis) => minDecibels_Getter(mthis);
 
-  static minDecibels_Setter(mthis, value) native "AnalyserNode_minDecibels_Setter";
+  static minDecibels_Setter(mthis, __arg_0) native "AnalyserNode_minDecibels_Setter";
+  minDecibels_Setter_(mthis, __arg_0) => minDecibels_Setter(mthis, __arg_0);
 
   static smoothingTimeConstant_Getter(mthis) native "AnalyserNode_smoothingTimeConstant_Getter";
+  smoothingTimeConstant_Getter_(mthis) => smoothingTimeConstant_Getter(mthis);
 
-  static smoothingTimeConstant_Setter(mthis, value) native "AnalyserNode_smoothingTimeConstant_Setter";
+  static smoothingTimeConstant_Setter(mthis, __arg_0) native "AnalyserNode_smoothingTimeConstant_Setter";
+  smoothingTimeConstant_Setter_(mthis, __arg_0) => smoothingTimeConstant_Setter(mthis, __arg_0);
 
-  static getByteFrequencyData_Callback_1(mthis, array) native "AnalyserNode_getByteFrequencyData_Callback";
+}
 
-  static getByteTimeDomainData_Callback_1(mthis, array) native "AnalyserNode_getByteTimeDomainData_Callback";
+class BlinkAnimation extends BlinkAnimationNode {
+  static final instance = new BlinkAnimation();
 
-  static getFloatFrequencyData_Callback_1(mthis, array) native "AnalyserNode_getFloatFrequencyData_Callback";
+  static constructorCallback_0() native "Animation_constructorCallback";
+  constructorCallback_0_() => constructorCallback_0();
 
-  static getFloatTimeDomainData_Callback_1(mthis, array) native "AnalyserNode_getFloatTimeDomainData_Callback";
+  static constructorCallback_1(__arg_0) native "Animation_constructorCallback";
+  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+
+  static constructorCallback_2(__arg_0, __arg_1) native "Animation_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+
+  static constructorCallback_3(__arg_0, __arg_1, __arg_2) native "Animation_constructorCallback";
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => constructorCallback_3(__arg_0, __arg_1, __arg_2);
+
+  static constructorCallback_4(__arg_0, __arg_1, __arg_2, __arg_3) native "Animation_constructorCallback";
+  constructorCallback_4_(__arg_0, __arg_1, __arg_2, __arg_3) => constructorCallback_4(__arg_0, __arg_1, __arg_2, __arg_3);
+
+  static constructorCallback_5(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "Animation_constructorCallback";
+  constructorCallback_5_(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => constructorCallback_5(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+}
+
+class BlinkAnimationEffect {
+  static final instance = new BlinkAnimationEffect();
+
 }
 
 class BlinkAnimationNode {
+  static final instance = new BlinkAnimationNode();
+
   static activeDuration_Getter(mthis) native "AnimationNode_activeDuration_Getter";
+  activeDuration_Getter_(mthis) => activeDuration_Getter(mthis);
 
   static currentIteration_Getter(mthis) native "AnimationNode_currentIteration_Getter";
+  currentIteration_Getter_(mthis) => currentIteration_Getter(mthis);
 
   static duration_Getter(mthis) native "AnimationNode_duration_Getter";
+  duration_Getter_(mthis) => duration_Getter(mthis);
 
   static endTime_Getter(mthis) native "AnimationNode_endTime_Getter";
+  endTime_Getter_(mthis) => endTime_Getter(mthis);
 
   static localTime_Getter(mthis) native "AnimationNode_localTime_Getter";
+  localTime_Getter_(mthis) => localTime_Getter(mthis);
 
   static player_Getter(mthis) native "AnimationNode_player_Getter";
+  player_Getter_(mthis) => player_Getter(mthis);
 
   static startTime_Getter(mthis) native "AnimationNode_startTime_Getter";
+  startTime_Getter_(mthis) => startTime_Getter(mthis);
 
   static timing_Getter(mthis) native "AnimationNode_timing_Getter";
+  timing_Getter_(mthis) => timing_Getter(mthis);
+
 }
 
-class BlinkAnimation {
-  static constructorCallback_2(target, keyframes) native "Animation_constructorCallback";
+class BlinkAnimationPlayer extends BlinkEventTarget {
+  static final instance = new BlinkAnimationPlayer();
 
-  static constructorCallback_3(target, keyframes, timingInput) native "Animation_constructorCallback";
-}
+  static cancel_Callback_0(mthis) native "AnimationPlayer_cancel_Callback";
+  cancel_Callback_0_(mthis) => cancel_Callback_0(mthis);
 
-class BlinkAnimationEffect {}
+  static cancel_Callback_1(mthis, __arg_0) native "AnimationPlayer_cancel_Callback";
+  cancel_Callback_1_(mthis, __arg_0) => cancel_Callback_1(mthis, __arg_0);
 
-class BlinkAnimationPlayer {
+  static cancel_Callback_2(mthis, __arg_0, __arg_1) native "AnimationPlayer_cancel_Callback";
+  cancel_Callback_2_(mthis, __arg_0, __arg_1) => cancel_Callback_2(mthis, __arg_0, __arg_1);
+
   static currentTime_Getter(mthis) native "AnimationPlayer_currentTime_Getter";
+  currentTime_Getter_(mthis) => currentTime_Getter(mthis);
 
-  static currentTime_Setter(mthis, value) native "AnimationPlayer_currentTime_Setter";
+  static currentTime_Setter(mthis, __arg_0) native "AnimationPlayer_currentTime_Setter";
+  currentTime_Setter_(mthis, __arg_0) => currentTime_Setter(mthis, __arg_0);
+
+  static finish_Callback_0(mthis) native "AnimationPlayer_finish_Callback";
+  finish_Callback_0_(mthis) => finish_Callback_0(mthis);
+
+  static finish_Callback_1(mthis, __arg_0) native "AnimationPlayer_finish_Callback";
+  finish_Callback_1_(mthis, __arg_0) => finish_Callback_1(mthis, __arg_0);
+
+  static finish_Callback_2(mthis, __arg_0, __arg_1) native "AnimationPlayer_finish_Callback";
+  finish_Callback_2_(mthis, __arg_0, __arg_1) => finish_Callback_2(mthis, __arg_0, __arg_1);
 
   static finished_Getter(mthis) native "AnimationPlayer_finished_Getter";
+  finished_Getter_(mthis) => finished_Getter(mthis);
+
+  static onfinish_Getter(mthis) native "AnimationPlayer_onfinish_Getter";
+  onfinish_Getter_(mthis) => onfinish_Getter(mthis);
+
+  static onfinish_Setter(mthis, __arg_0) native "AnimationPlayer_onfinish_Setter";
+  onfinish_Setter_(mthis, __arg_0) => onfinish_Setter(mthis, __arg_0);
+
+  static pause_Callback_0(mthis) native "AnimationPlayer_pause_Callback";
+  pause_Callback_0_(mthis) => pause_Callback_0(mthis);
+
+  static pause_Callback_1(mthis, __arg_0) native "AnimationPlayer_pause_Callback";
+  pause_Callback_1_(mthis, __arg_0) => pause_Callback_1(mthis, __arg_0);
+
+  static pause_Callback_2(mthis, __arg_0, __arg_1) native "AnimationPlayer_pause_Callback";
+  pause_Callback_2_(mthis, __arg_0, __arg_1) => pause_Callback_2(mthis, __arg_0, __arg_1);
 
   static paused_Getter(mthis) native "AnimationPlayer_paused_Getter";
+  paused_Getter_(mthis) => paused_Getter(mthis);
+
+  static play_Callback_0(mthis) native "AnimationPlayer_play_Callback";
+  play_Callback_0_(mthis) => play_Callback_0(mthis);
+
+  static play_Callback_1(mthis, __arg_0) native "AnimationPlayer_play_Callback";
+  play_Callback_1_(mthis, __arg_0) => play_Callback_1(mthis, __arg_0);
+
+  static play_Callback_2(mthis, __arg_0, __arg_1) native "AnimationPlayer_play_Callback";
+  play_Callback_2_(mthis, __arg_0, __arg_1) => play_Callback_2(mthis, __arg_0, __arg_1);
 
   static playbackRate_Getter(mthis) native "AnimationPlayer_playbackRate_Getter";
+  playbackRate_Getter_(mthis) => playbackRate_Getter(mthis);
 
-  static playbackRate_Setter(mthis, value) native "AnimationPlayer_playbackRate_Setter";
+  static playbackRate_Setter(mthis, __arg_0) native "AnimationPlayer_playbackRate_Setter";
+  playbackRate_Setter_(mthis, __arg_0) => playbackRate_Setter(mthis, __arg_0);
+
+  static reverse_Callback_0(mthis) native "AnimationPlayer_reverse_Callback";
+  reverse_Callback_0_(mthis) => reverse_Callback_0(mthis);
+
+  static reverse_Callback_1(mthis, __arg_0) native "AnimationPlayer_reverse_Callback";
+  reverse_Callback_1_(mthis, __arg_0) => reverse_Callback_1(mthis, __arg_0);
+
+  static reverse_Callback_2(mthis, __arg_0, __arg_1) native "AnimationPlayer_reverse_Callback";
+  reverse_Callback_2_(mthis, __arg_0, __arg_1) => reverse_Callback_2(mthis, __arg_0, __arg_1);
 
   static source_Getter(mthis) native "AnimationPlayer_source_Getter";
+  source_Getter_(mthis) => source_Getter(mthis);
 
-  static source_Setter(mthis, value) native "AnimationPlayer_source_Setter";
+  static source_Setter(mthis, __arg_0) native "AnimationPlayer_source_Setter";
+  source_Setter_(mthis, __arg_0) => source_Setter(mthis, __arg_0);
 
   static startTime_Getter(mthis) native "AnimationPlayer_startTime_Getter";
+  startTime_Getter_(mthis) => startTime_Getter(mthis);
 
-  static startTime_Setter(mthis, value) native "AnimationPlayer_startTime_Setter";
+  static startTime_Setter(mthis, __arg_0) native "AnimationPlayer_startTime_Setter";
+  startTime_Setter_(mthis, __arg_0) => startTime_Setter(mthis, __arg_0);
 
-  static cancel_Callback(mthis) native "AnimationPlayer_cancel_Callback";
-
-  static finish_Callback(mthis) native "AnimationPlayer_finish_Callback";
-
-  static pause_Callback(mthis) native "AnimationPlayer_pause_Callback";
-
-  static play_Callback(mthis) native "AnimationPlayer_play_Callback";
-
-  static reverse_Callback(mthis) native "AnimationPlayer_reverse_Callback";
 }
 
-class BlinkEvent {
-  static constructorCallback(type, options) native "Event_constructorCallback";
+class BlinkAnimationPlayerEvent extends BlinkEvent {
+  static final instance = new BlinkAnimationPlayerEvent();
 
-  static bubbles_Getter(mthis) native "Event_bubbles_Getter";
-
-  static cancelable_Getter(mthis) native "Event_cancelable_Getter";
-
-  static clipboardData_Getter(mthis) native "Event_clipboardData_Getter";
-
-  static currentTarget_Getter(mthis) native "Event_currentTarget_Getter";
-
-  static defaultPrevented_Getter(mthis) native "Event_defaultPrevented_Getter";
-
-  static eventPhase_Getter(mthis) native "Event_eventPhase_Getter";
-
-  static path_Getter(mthis) native "Event_path_Getter";
-
-  static target_Getter(mthis) native "Event_target_Getter";
-
-  static timeStamp_Getter(mthis) native "Event_timeStamp_Getter";
-
-  static type_Getter(mthis) native "Event_type_Getter";
-
-  static initEvent_Callback_3(mthis, eventTypeArg, canBubbleArg, cancelableArg) native "Event_initEvent_Callback";
-
-  static preventDefault_Callback(mthis) native "Event_preventDefault_Callback";
-
-  static stopImmediatePropagation_Callback(mthis) native "Event_stopImmediatePropagation_Callback";
-
-  static stopPropagation_Callback(mthis) native "Event_stopPropagation_Callback";
-}
-
-class BlinkAnimationPlayerEvent {
-  static constructorCallback(type, options) native "AnimationPlayerEvent_constructorCallback";
+  static constructorCallback_2(__arg_0, __arg_1) native "AnimationPlayerEvent_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
 
   static currentTime_Getter(mthis) native "AnimationPlayerEvent_currentTime_Getter";
+  currentTime_Getter_(mthis) => currentTime_Getter(mthis);
 
   static timelineTime_Getter(mthis) native "AnimationPlayerEvent_timelineTime_Getter";
+  timelineTime_Getter_(mthis) => timelineTime_Getter(mthis);
+
 }
 
 class BlinkAnimationTimeline {
+  static final instance = new BlinkAnimationTimeline();
+
   static currentTime_Getter(mthis) native "AnimationTimeline_currentTime_Getter";
+  currentTime_Getter_(mthis) => currentTime_Getter(mthis);
 
-  static getAnimationPlayers_Callback(mthis) native "AnimationTimeline_getAnimationPlayers_Callback";
+  static getAnimationPlayers_Callback_0(mthis) native "AnimationTimeline_getAnimationPlayers_Callback";
+  getAnimationPlayers_Callback_0_(mthis) => getAnimationPlayers_Callback_0(mthis);
 
-  static play_Callback_1(mthis, source) native "AnimationTimeline_play_Callback";
+  static getAnimationPlayers_Callback_1(mthis, __arg_0) native "AnimationTimeline_getAnimationPlayers_Callback";
+  getAnimationPlayers_Callback_1_(mthis, __arg_0) => getAnimationPlayers_Callback_1(mthis, __arg_0);
+
+  static getAnimationPlayers_Callback_2(mthis, __arg_0, __arg_1) native "AnimationTimeline_getAnimationPlayers_Callback";
+  getAnimationPlayers_Callback_2_(mthis, __arg_0, __arg_1) => getAnimationPlayers_Callback_2(mthis, __arg_0, __arg_1);
+
+  static play_Callback_0(mthis) native "AnimationTimeline_play_Callback";
+  play_Callback_0_(mthis) => play_Callback_0(mthis);
+
+  static play_Callback_1(mthis, __arg_0) native "AnimationTimeline_play_Callback";
+  play_Callback_1_(mthis, __arg_0) => play_Callback_1(mthis, __arg_0);
+
+  static play_Callback_2(mthis, __arg_0, __arg_1) native "AnimationTimeline_play_Callback";
+  play_Callback_2_(mthis, __arg_0, __arg_1) => play_Callback_2(mthis, __arg_0, __arg_1);
+
+  static play_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "AnimationTimeline_play_Callback";
+  play_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => play_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
 }
 
-class BlinkApplicationCache {
+class BlinkApplicationCache extends BlinkEventTarget {
+  static final instance = new BlinkApplicationCache();
+
+  static abort_Callback_0(mthis) native "ApplicationCache_abort_Callback";
+  abort_Callback_0_(mthis) => abort_Callback_0(mthis);
+
+  static abort_Callback_1(mthis, __arg_0) native "ApplicationCache_abort_Callback";
+  abort_Callback_1_(mthis, __arg_0) => abort_Callback_1(mthis, __arg_0);
+
+  static abort_Callback_2(mthis, __arg_0, __arg_1) native "ApplicationCache_abort_Callback";
+  abort_Callback_2_(mthis, __arg_0, __arg_1) => abort_Callback_2(mthis, __arg_0, __arg_1);
+
+  static oncached_Getter(mthis) native "ApplicationCache_oncached_Getter";
+  oncached_Getter_(mthis) => oncached_Getter(mthis);
+
+  static oncached_Setter(mthis, __arg_0) native "ApplicationCache_oncached_Setter";
+  oncached_Setter_(mthis, __arg_0) => oncached_Setter(mthis, __arg_0);
+
+  static onchecking_Getter(mthis) native "ApplicationCache_onchecking_Getter";
+  onchecking_Getter_(mthis) => onchecking_Getter(mthis);
+
+  static onchecking_Setter(mthis, __arg_0) native "ApplicationCache_onchecking_Setter";
+  onchecking_Setter_(mthis, __arg_0) => onchecking_Setter(mthis, __arg_0);
+
+  static ondownloading_Getter(mthis) native "ApplicationCache_ondownloading_Getter";
+  ondownloading_Getter_(mthis) => ondownloading_Getter(mthis);
+
+  static ondownloading_Setter(mthis, __arg_0) native "ApplicationCache_ondownloading_Setter";
+  ondownloading_Setter_(mthis, __arg_0) => ondownloading_Setter(mthis, __arg_0);
+
+  static onerror_Getter(mthis) native "ApplicationCache_onerror_Getter";
+  onerror_Getter_(mthis) => onerror_Getter(mthis);
+
+  static onerror_Setter(mthis, __arg_0) native "ApplicationCache_onerror_Setter";
+  onerror_Setter_(mthis, __arg_0) => onerror_Setter(mthis, __arg_0);
+
+  static onnoupdate_Getter(mthis) native "ApplicationCache_onnoupdate_Getter";
+  onnoupdate_Getter_(mthis) => onnoupdate_Getter(mthis);
+
+  static onnoupdate_Setter(mthis, __arg_0) native "ApplicationCache_onnoupdate_Setter";
+  onnoupdate_Setter_(mthis, __arg_0) => onnoupdate_Setter(mthis, __arg_0);
+
+  static onobsolete_Getter(mthis) native "ApplicationCache_onobsolete_Getter";
+  onobsolete_Getter_(mthis) => onobsolete_Getter(mthis);
+
+  static onobsolete_Setter(mthis, __arg_0) native "ApplicationCache_onobsolete_Setter";
+  onobsolete_Setter_(mthis, __arg_0) => onobsolete_Setter(mthis, __arg_0);
+
+  static onprogress_Getter(mthis) native "ApplicationCache_onprogress_Getter";
+  onprogress_Getter_(mthis) => onprogress_Getter(mthis);
+
+  static onprogress_Setter(mthis, __arg_0) native "ApplicationCache_onprogress_Setter";
+  onprogress_Setter_(mthis, __arg_0) => onprogress_Setter(mthis, __arg_0);
+
+  static onupdateready_Getter(mthis) native "ApplicationCache_onupdateready_Getter";
+  onupdateready_Getter_(mthis) => onupdateready_Getter(mthis);
+
+  static onupdateready_Setter(mthis, __arg_0) native "ApplicationCache_onupdateready_Setter";
+  onupdateready_Setter_(mthis, __arg_0) => onupdateready_Setter(mthis, __arg_0);
+
   static status_Getter(mthis) native "ApplicationCache_status_Getter";
+  status_Getter_(mthis) => status_Getter(mthis);
 
-  static abort_Callback(mthis) native "ApplicationCache_abort_Callback";
+  static swapCache_Callback_0(mthis) native "ApplicationCache_swapCache_Callback";
+  swapCache_Callback_0_(mthis) => swapCache_Callback_0(mthis);
 
-  static swapCache_Callback(mthis) native "ApplicationCache_swapCache_Callback";
+  static swapCache_Callback_1(mthis, __arg_0) native "ApplicationCache_swapCache_Callback";
+  swapCache_Callback_1_(mthis, __arg_0) => swapCache_Callback_1(mthis, __arg_0);
 
-  static update_Callback(mthis) native "ApplicationCache_update_Callback";
+  static swapCache_Callback_2(mthis, __arg_0, __arg_1) native "ApplicationCache_swapCache_Callback";
+  swapCache_Callback_2_(mthis, __arg_0, __arg_1) => swapCache_Callback_2(mthis, __arg_0, __arg_1);
+
+  static update_Callback_0(mthis) native "ApplicationCache_update_Callback";
+  update_Callback_0_(mthis) => update_Callback_0(mthis);
+
+  static update_Callback_1(mthis, __arg_0) native "ApplicationCache_update_Callback";
+  update_Callback_1_(mthis, __arg_0) => update_Callback_1(mthis, __arg_0);
+
+  static update_Callback_2(mthis, __arg_0, __arg_1) native "ApplicationCache_update_Callback";
+  update_Callback_2_(mthis, __arg_0, __arg_1) => update_Callback_2(mthis, __arg_0, __arg_1);
+
 }
 
-class BlinkApplicationCacheErrorEvent {
-  static constructorCallback(type, options) native "ApplicationCacheErrorEvent_constructorCallback";
+class BlinkApplicationCacheErrorEvent extends BlinkEvent {
+  static final instance = new BlinkApplicationCacheErrorEvent();
+
+  static constructorCallback_2(__arg_0, __arg_1) native "ApplicationCacheErrorEvent_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
 
   static message_Getter(mthis) native "ApplicationCacheErrorEvent_message_Getter";
+  message_Getter_(mthis) => message_Getter(mthis);
 
   static reason_Getter(mthis) native "ApplicationCacheErrorEvent_reason_Getter";
+  reason_Getter_(mthis) => reason_Getter(mthis);
 
   static status_Getter(mthis) native "ApplicationCacheErrorEvent_status_Getter";
+  status_Getter_(mthis) => status_Getter(mthis);
 
   static url_Getter(mthis) native "ApplicationCacheErrorEvent_url_Getter";
+  url_Getter_(mthis) => url_Getter(mthis);
+
 }
 
-class BlinkNode {
-  static baseURI_Getter(mthis) native "Node_baseURI_Getter";
+class BlinkAttr extends BlinkNode {
+  static final instance = new BlinkAttr();
 
-  static childNodes_Getter(mthis) native "Node_childNodes_Getter";
-
-  static firstChild_Getter(mthis) native "Node_firstChild_Getter";
-
-  static lastChild_Getter(mthis) native "Node_lastChild_Getter";
-
-  static localName_Getter(mthis) native "Node_localName_Getter";
-
-  static namespaceURI_Getter(mthis) native "Node_namespaceURI_Getter";
-
-  static nextSibling_Getter(mthis) native "Node_nextSibling_Getter";
-
-  static nodeName_Getter(mthis) native "Node_nodeName_Getter";
-
-  static nodeType_Getter(mthis) native "Node_nodeType_Getter";
-
-  static nodeValue_Getter(mthis) native "Node_nodeValue_Getter";
-
-  static ownerDocument_Getter(mthis) native "Node_ownerDocument_Getter";
-
-  static parentElement_Getter(mthis) native "Node_parentElement_Getter";
-
-  static parentNode_Getter(mthis) native "Node_parentNode_Getter";
-
-  static previousSibling_Getter(mthis) native "Node_previousSibling_Getter";
-
-  static textContent_Getter(mthis) native "Node_textContent_Getter";
-
-  static textContent_Setter(mthis, value) native "Node_textContent_Setter";
-
-  static appendChild_Callback_1(mthis, newChild) native "Node_appendChild_Callback";
-
-  static cloneNode_Callback_1(mthis, deep) native "Node_cloneNode_Callback";
-
-  static contains_Callback_1(mthis, other) native "Node_contains_Callback";
-
-  static hasChildNodes_Callback(mthis) native "Node_hasChildNodes_Callback";
-
-  static insertBefore_Callback_2(mthis, newChild, refChild) native "Node_insertBefore_Callback";
-
-  static removeChild_Callback_1(mthis, oldChild) native "Node_removeChild_Callback";
-
-  static replaceChild_Callback_2(mthis, newChild, oldChild) native "Node_replaceChild_Callback";
-}
-
-class BlinkAttr {
   static localName_Getter(mthis) native "Attr_localName_Getter";
+  localName_Getter_(mthis) => localName_Getter(mthis);
 
   static name_Getter(mthis) native "Attr_name_Getter";
+  name_Getter_(mthis) => name_Getter(mthis);
 
   static namespaceURI_Getter(mthis) native "Attr_namespaceURI_Getter";
+  namespaceURI_Getter_(mthis) => namespaceURI_Getter(mthis);
 
   static nodeValue_Getter(mthis) native "Attr_nodeValue_Getter";
+  nodeValue_Getter_(mthis) => nodeValue_Getter(mthis);
+
+  static nodeValue_Setter(mthis, __arg_0) native "Attr_nodeValue_Setter";
+  nodeValue_Setter_(mthis, __arg_0) => nodeValue_Setter(mthis, __arg_0);
+
+  static ownerElement_Getter(mthis) native "Attr_ownerElement_Getter";
+  ownerElement_Getter_(mthis) => ownerElement_Getter(mthis);
+
+  static prefix_Getter(mthis) native "Attr_prefix_Getter";
+  prefix_Getter_(mthis) => prefix_Getter(mthis);
+
+  static specified_Getter(mthis) native "Attr_specified_Getter";
+  specified_Getter_(mthis) => specified_Getter(mthis);
 
   static textContent_Getter(mthis) native "Attr_textContent_Getter";
+  textContent_Getter_(mthis) => textContent_Getter(mthis);
 
-  static textContent_Setter(mthis, value) native "Attr_textContent_Setter";
+  static textContent_Setter(mthis, __arg_0) native "Attr_textContent_Setter";
+  textContent_Setter_(mthis, __arg_0) => textContent_Setter(mthis, __arg_0);
 
   static value_Getter(mthis) native "Attr_value_Getter";
+  value_Getter_(mthis) => value_Getter(mthis);
 
-  static value_Setter(mthis, value) native "Attr_value_Setter";
+  static value_Setter(mthis, __arg_0) native "Attr_value_Setter";
+  value_Setter_(mthis, __arg_0) => value_Setter(mthis, __arg_0);
+
 }
 
 class BlinkAudioBuffer {
+  static final instance = new BlinkAudioBuffer();
+
   static duration_Getter(mthis) native "AudioBuffer_duration_Getter";
+  duration_Getter_(mthis) => duration_Getter(mthis);
+
+  static getChannelData_Callback_0(mthis) native "AudioBuffer_getChannelData_Callback";
+  getChannelData_Callback_0_(mthis) => getChannelData_Callback_0(mthis);
+
+  static getChannelData_Callback_1(mthis, __arg_0) native "AudioBuffer_getChannelData_Callback";
+  getChannelData_Callback_1_(mthis, __arg_0) => getChannelData_Callback_1(mthis, __arg_0);
+
+  static getChannelData_Callback_2(mthis, __arg_0, __arg_1) native "AudioBuffer_getChannelData_Callback";
+  getChannelData_Callback_2_(mthis, __arg_0, __arg_1) => getChannelData_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getChannelData_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "AudioBuffer_getChannelData_Callback";
+  getChannelData_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getChannelData_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
   static length_Getter(mthis) native "AudioBuffer_length_Getter";
+  length_Getter_(mthis) => length_Getter(mthis);
 
   static numberOfChannels_Getter(mthis) native "AudioBuffer_numberOfChannels_Getter";
+  numberOfChannels_Getter_(mthis) => numberOfChannels_Getter(mthis);
 
   static sampleRate_Getter(mthis) native "AudioBuffer_sampleRate_Getter";
+  sampleRate_Getter_(mthis) => sampleRate_Getter(mthis);
 
-  static getChannelData_Callback_1(mthis, channelIndex) native "AudioBuffer_getChannelData_Callback";
 }
 
-class BlinkAudioSourceNode {}
+class BlinkAudioBufferSourceNode extends BlinkAudioSourceNode {
+  static final instance = new BlinkAudioBufferSourceNode();
 
-class BlinkAudioBufferSourceNode {
   static buffer_Getter(mthis) native "AudioBufferSourceNode_buffer_Getter";
+  buffer_Getter_(mthis) => buffer_Getter(mthis);
 
-  static buffer_Setter(mthis, value) native "AudioBufferSourceNode_buffer_Setter";
-
-  static loop_Getter(mthis) native "AudioBufferSourceNode_loop_Getter";
-
-  static loop_Setter(mthis, value) native "AudioBufferSourceNode_loop_Setter";
+  static buffer_Setter(mthis, __arg_0) native "AudioBufferSourceNode_buffer_Setter";
+  buffer_Setter_(mthis, __arg_0) => buffer_Setter(mthis, __arg_0);
 
   static loopEnd_Getter(mthis) native "AudioBufferSourceNode_loopEnd_Getter";
+  loopEnd_Getter_(mthis) => loopEnd_Getter(mthis);
 
-  static loopEnd_Setter(mthis, value) native "AudioBufferSourceNode_loopEnd_Setter";
+  static loopEnd_Setter(mthis, __arg_0) native "AudioBufferSourceNode_loopEnd_Setter";
+  loopEnd_Setter_(mthis, __arg_0) => loopEnd_Setter(mthis, __arg_0);
 
   static loopStart_Getter(mthis) native "AudioBufferSourceNode_loopStart_Getter";
+  loopStart_Getter_(mthis) => loopStart_Getter(mthis);
 
-  static loopStart_Setter(mthis, value) native "AudioBufferSourceNode_loopStart_Setter";
+  static loopStart_Setter(mthis, __arg_0) native "AudioBufferSourceNode_loopStart_Setter";
+  loopStart_Setter_(mthis, __arg_0) => loopStart_Setter(mthis, __arg_0);
+
+  static loop_Getter(mthis) native "AudioBufferSourceNode_loop_Getter";
+  loop_Getter_(mthis) => loop_Getter(mthis);
+
+  static loop_Setter(mthis, __arg_0) native "AudioBufferSourceNode_loop_Setter";
+  loop_Setter_(mthis, __arg_0) => loop_Setter(mthis, __arg_0);
+
+  static onended_Getter(mthis) native "AudioBufferSourceNode_onended_Getter";
+  onended_Getter_(mthis) => onended_Getter(mthis);
+
+  static onended_Setter(mthis, __arg_0) native "AudioBufferSourceNode_onended_Setter";
+  onended_Setter_(mthis, __arg_0) => onended_Setter(mthis, __arg_0);
 
   static playbackRate_Getter(mthis) native "AudioBufferSourceNode_playbackRate_Getter";
+  playbackRate_Getter_(mthis) => playbackRate_Getter(mthis);
 
-  static start_Callback_3(mthis, when, grainOffset, grainDuration) native "AudioBufferSourceNode_start_Callback";
+  static start_Callback_0(mthis) native "AudioBufferSourceNode_start_Callback";
+  start_Callback_0_(mthis) => start_Callback_0(mthis);
 
-  static start_Callback_2(mthis, when, grainOffset) native "AudioBufferSourceNode_start_Callback";
+  static start_Callback_1(mthis, __arg_0) native "AudioBufferSourceNode_start_Callback";
+  start_Callback_1_(mthis, __arg_0) => start_Callback_1(mthis, __arg_0);
 
-  static start_Callback_1(mthis, when) native "AudioBufferSourceNode_start_Callback";
+  static start_Callback_2(mthis, __arg_0, __arg_1) native "AudioBufferSourceNode_start_Callback";
+  start_Callback_2_(mthis, __arg_0, __arg_1) => start_Callback_2(mthis, __arg_0, __arg_1);
 
-  static start_Callback(mthis) native "AudioBufferSourceNode_start_Callback";
+  static start_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "AudioBufferSourceNode_start_Callback";
+  start_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => start_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
-  static stop_Callback_1(mthis, when) native "AudioBufferSourceNode_stop_Callback";
+  static start_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "AudioBufferSourceNode_start_Callback";
+  start_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => start_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
 
-  static stop_Callback(mthis) native "AudioBufferSourceNode_stop_Callback";
+  static start_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "AudioBufferSourceNode_start_Callback";
+  start_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => start_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static stop_Callback_0(mthis) native "AudioBufferSourceNode_stop_Callback";
+  stop_Callback_0_(mthis) => stop_Callback_0(mthis);
+
+  static stop_Callback_1(mthis, __arg_0) native "AudioBufferSourceNode_stop_Callback";
+  stop_Callback_1_(mthis, __arg_0) => stop_Callback_1(mthis, __arg_0);
+
+  static stop_Callback_2(mthis, __arg_0, __arg_1) native "AudioBufferSourceNode_stop_Callback";
+  stop_Callback_2_(mthis, __arg_0, __arg_1) => stop_Callback_2(mthis, __arg_0, __arg_1);
+
+  static stop_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "AudioBufferSourceNode_stop_Callback";
+  stop_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => stop_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
 }
 
-class BlinkAudioContext {
-  static constructorCallback() native "AudioContext_constructorCallback";
+class BlinkAudioContext extends BlinkEventTarget {
+  static final instance = new BlinkAudioContext();
+
+  static constructorCallback_0() native "AudioContext_constructorCallback";
+  constructorCallback_0_() => constructorCallback_0();
+
+  static constructorCallback_1(__arg_0) native "AudioContext_constructorCallback";
+  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+
+  static constructorCallback_2(__arg_0, __arg_1) native "AudioContext_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+
+  static createAnalyser_Callback_0(mthis) native "AudioContext_createAnalyser_Callback";
+  createAnalyser_Callback_0_(mthis) => createAnalyser_Callback_0(mthis);
+
+  static createAnalyser_Callback_1(mthis, __arg_0) native "AudioContext_createAnalyser_Callback";
+  createAnalyser_Callback_1_(mthis, __arg_0) => createAnalyser_Callback_1(mthis, __arg_0);
+
+  static createAnalyser_Callback_2(mthis, __arg_0, __arg_1) native "AudioContext_createAnalyser_Callback";
+  createAnalyser_Callback_2_(mthis, __arg_0, __arg_1) => createAnalyser_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createBiquadFilter_Callback_0(mthis) native "AudioContext_createBiquadFilter_Callback";
+  createBiquadFilter_Callback_0_(mthis) => createBiquadFilter_Callback_0(mthis);
+
+  static createBiquadFilter_Callback_1(mthis, __arg_0) native "AudioContext_createBiquadFilter_Callback";
+  createBiquadFilter_Callback_1_(mthis, __arg_0) => createBiquadFilter_Callback_1(mthis, __arg_0);
+
+  static createBiquadFilter_Callback_2(mthis, __arg_0, __arg_1) native "AudioContext_createBiquadFilter_Callback";
+  createBiquadFilter_Callback_2_(mthis, __arg_0, __arg_1) => createBiquadFilter_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createBufferSource_Callback_0(mthis) native "AudioContext_createBufferSource_Callback";
+  createBufferSource_Callback_0_(mthis) => createBufferSource_Callback_0(mthis);
+
+  static createBufferSource_Callback_1(mthis, __arg_0) native "AudioContext_createBufferSource_Callback";
+  createBufferSource_Callback_1_(mthis, __arg_0) => createBufferSource_Callback_1(mthis, __arg_0);
+
+  static createBufferSource_Callback_2(mthis, __arg_0, __arg_1) native "AudioContext_createBufferSource_Callback";
+  createBufferSource_Callback_2_(mthis, __arg_0, __arg_1) => createBufferSource_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createBuffer_Callback_1(mthis, __arg_0) native "AudioContext_createBuffer_Callback";
+  createBuffer_Callback_1_(mthis, __arg_0) => createBuffer_Callback_1(mthis, __arg_0);
+
+  static createBuffer_Callback_2(mthis, __arg_0, __arg_1) native "AudioContext_createBuffer_Callback";
+  createBuffer_Callback_2_(mthis, __arg_0, __arg_1) => createBuffer_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createBuffer_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "AudioContext_createBuffer_Callback";
+  createBuffer_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => createBuffer_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static createBuffer_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "AudioContext_createBuffer_Callback";
+  createBuffer_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => createBuffer_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static createBuffer_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "AudioContext_createBuffer_Callback";
+  createBuffer_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => createBuffer_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static createChannelMerger_Callback_0(mthis) native "AudioContext_createChannelMerger_Callback";
+  createChannelMerger_Callback_0_(mthis) => createChannelMerger_Callback_0(mthis);
+
+  static createChannelMerger_Callback_1(mthis, __arg_0) native "AudioContext_createChannelMerger_Callback";
+  createChannelMerger_Callback_1_(mthis, __arg_0) => createChannelMerger_Callback_1(mthis, __arg_0);
+
+  static createChannelMerger_Callback_2(mthis, __arg_0, __arg_1) native "AudioContext_createChannelMerger_Callback";
+  createChannelMerger_Callback_2_(mthis, __arg_0, __arg_1) => createChannelMerger_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createChannelMerger_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "AudioContext_createChannelMerger_Callback";
+  createChannelMerger_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => createChannelMerger_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static createChannelSplitter_Callback_0(mthis) native "AudioContext_createChannelSplitter_Callback";
+  createChannelSplitter_Callback_0_(mthis) => createChannelSplitter_Callback_0(mthis);
+
+  static createChannelSplitter_Callback_1(mthis, __arg_0) native "AudioContext_createChannelSplitter_Callback";
+  createChannelSplitter_Callback_1_(mthis, __arg_0) => createChannelSplitter_Callback_1(mthis, __arg_0);
+
+  static createChannelSplitter_Callback_2(mthis, __arg_0, __arg_1) native "AudioContext_createChannelSplitter_Callback";
+  createChannelSplitter_Callback_2_(mthis, __arg_0, __arg_1) => createChannelSplitter_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createChannelSplitter_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "AudioContext_createChannelSplitter_Callback";
+  createChannelSplitter_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => createChannelSplitter_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static createConvolver_Callback_0(mthis) native "AudioContext_createConvolver_Callback";
+  createConvolver_Callback_0_(mthis) => createConvolver_Callback_0(mthis);
+
+  static createConvolver_Callback_1(mthis, __arg_0) native "AudioContext_createConvolver_Callback";
+  createConvolver_Callback_1_(mthis, __arg_0) => createConvolver_Callback_1(mthis, __arg_0);
+
+  static createConvolver_Callback_2(mthis, __arg_0, __arg_1) native "AudioContext_createConvolver_Callback";
+  createConvolver_Callback_2_(mthis, __arg_0, __arg_1) => createConvolver_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createDelay_Callback_0(mthis) native "AudioContext_createDelay_Callback";
+  createDelay_Callback_0_(mthis) => createDelay_Callback_0(mthis);
+
+  static createDelay_Callback_1(mthis, __arg_0) native "AudioContext_createDelay_Callback";
+  createDelay_Callback_1_(mthis, __arg_0) => createDelay_Callback_1(mthis, __arg_0);
+
+  static createDelay_Callback_2(mthis, __arg_0, __arg_1) native "AudioContext_createDelay_Callback";
+  createDelay_Callback_2_(mthis, __arg_0, __arg_1) => createDelay_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createDelay_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "AudioContext_createDelay_Callback";
+  createDelay_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => createDelay_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static createDynamicsCompressor_Callback_0(mthis) native "AudioContext_createDynamicsCompressor_Callback";
+  createDynamicsCompressor_Callback_0_(mthis) => createDynamicsCompressor_Callback_0(mthis);
+
+  static createDynamicsCompressor_Callback_1(mthis, __arg_0) native "AudioContext_createDynamicsCompressor_Callback";
+  createDynamicsCompressor_Callback_1_(mthis, __arg_0) => createDynamicsCompressor_Callback_1(mthis, __arg_0);
+
+  static createDynamicsCompressor_Callback_2(mthis, __arg_0, __arg_1) native "AudioContext_createDynamicsCompressor_Callback";
+  createDynamicsCompressor_Callback_2_(mthis, __arg_0, __arg_1) => createDynamicsCompressor_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createGain_Callback_0(mthis) native "AudioContext_createGain_Callback";
+  createGain_Callback_0_(mthis) => createGain_Callback_0(mthis);
+
+  static createGain_Callback_1(mthis, __arg_0) native "AudioContext_createGain_Callback";
+  createGain_Callback_1_(mthis, __arg_0) => createGain_Callback_1(mthis, __arg_0);
+
+  static createGain_Callback_2(mthis, __arg_0, __arg_1) native "AudioContext_createGain_Callback";
+  createGain_Callback_2_(mthis, __arg_0, __arg_1) => createGain_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createMediaElementSource_Callback_0(mthis) native "AudioContext_createMediaElementSource_Callback";
+  createMediaElementSource_Callback_0_(mthis) => createMediaElementSource_Callback_0(mthis);
+
+  static createMediaElementSource_Callback_1(mthis, __arg_0) native "AudioContext_createMediaElementSource_Callback";
+  createMediaElementSource_Callback_1_(mthis, __arg_0) => createMediaElementSource_Callback_1(mthis, __arg_0);
+
+  static createMediaElementSource_Callback_2(mthis, __arg_0, __arg_1) native "AudioContext_createMediaElementSource_Callback";
+  createMediaElementSource_Callback_2_(mthis, __arg_0, __arg_1) => createMediaElementSource_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createMediaElementSource_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "AudioContext_createMediaElementSource_Callback";
+  createMediaElementSource_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => createMediaElementSource_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static createMediaStreamDestination_Callback_0(mthis) native "AudioContext_createMediaStreamDestination_Callback";
+  createMediaStreamDestination_Callback_0_(mthis) => createMediaStreamDestination_Callback_0(mthis);
+
+  static createMediaStreamDestination_Callback_1(mthis, __arg_0) native "AudioContext_createMediaStreamDestination_Callback";
+  createMediaStreamDestination_Callback_1_(mthis, __arg_0) => createMediaStreamDestination_Callback_1(mthis, __arg_0);
+
+  static createMediaStreamDestination_Callback_2(mthis, __arg_0, __arg_1) native "AudioContext_createMediaStreamDestination_Callback";
+  createMediaStreamDestination_Callback_2_(mthis, __arg_0, __arg_1) => createMediaStreamDestination_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createMediaStreamSource_Callback_0(mthis) native "AudioContext_createMediaStreamSource_Callback";
+  createMediaStreamSource_Callback_0_(mthis) => createMediaStreamSource_Callback_0(mthis);
+
+  static createMediaStreamSource_Callback_1(mthis, __arg_0) native "AudioContext_createMediaStreamSource_Callback";
+  createMediaStreamSource_Callback_1_(mthis, __arg_0) => createMediaStreamSource_Callback_1(mthis, __arg_0);
+
+  static createMediaStreamSource_Callback_2(mthis, __arg_0, __arg_1) native "AudioContext_createMediaStreamSource_Callback";
+  createMediaStreamSource_Callback_2_(mthis, __arg_0, __arg_1) => createMediaStreamSource_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createMediaStreamSource_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "AudioContext_createMediaStreamSource_Callback";
+  createMediaStreamSource_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => createMediaStreamSource_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static createOscillator_Callback_0(mthis) native "AudioContext_createOscillator_Callback";
+  createOscillator_Callback_0_(mthis) => createOscillator_Callback_0(mthis);
+
+  static createOscillator_Callback_1(mthis, __arg_0) native "AudioContext_createOscillator_Callback";
+  createOscillator_Callback_1_(mthis, __arg_0) => createOscillator_Callback_1(mthis, __arg_0);
+
+  static createOscillator_Callback_2(mthis, __arg_0, __arg_1) native "AudioContext_createOscillator_Callback";
+  createOscillator_Callback_2_(mthis, __arg_0, __arg_1) => createOscillator_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createPanner_Callback_0(mthis) native "AudioContext_createPanner_Callback";
+  createPanner_Callback_0_(mthis) => createPanner_Callback_0(mthis);
+
+  static createPanner_Callback_1(mthis, __arg_0) native "AudioContext_createPanner_Callback";
+  createPanner_Callback_1_(mthis, __arg_0) => createPanner_Callback_1(mthis, __arg_0);
+
+  static createPanner_Callback_2(mthis, __arg_0, __arg_1) native "AudioContext_createPanner_Callback";
+  createPanner_Callback_2_(mthis, __arg_0, __arg_1) => createPanner_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createPeriodicWave_Callback_0(mthis) native "AudioContext_createPeriodicWave_Callback";
+  createPeriodicWave_Callback_0_(mthis) => createPeriodicWave_Callback_0(mthis);
+
+  static createPeriodicWave_Callback_1(mthis, __arg_0) native "AudioContext_createPeriodicWave_Callback";
+  createPeriodicWave_Callback_1_(mthis, __arg_0) => createPeriodicWave_Callback_1(mthis, __arg_0);
+
+  static createPeriodicWave_Callback_2(mthis, __arg_0, __arg_1) native "AudioContext_createPeriodicWave_Callback";
+  createPeriodicWave_Callback_2_(mthis, __arg_0, __arg_1) => createPeriodicWave_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createPeriodicWave_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "AudioContext_createPeriodicWave_Callback";
+  createPeriodicWave_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => createPeriodicWave_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static createPeriodicWave_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "AudioContext_createPeriodicWave_Callback";
+  createPeriodicWave_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => createPeriodicWave_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static createScriptProcessor_Callback_0(mthis) native "AudioContext_createScriptProcessor_Callback";
+  createScriptProcessor_Callback_0_(mthis) => createScriptProcessor_Callback_0(mthis);
+
+  static createScriptProcessor_Callback_1(mthis, __arg_0) native "AudioContext_createScriptProcessor_Callback";
+  createScriptProcessor_Callback_1_(mthis, __arg_0) => createScriptProcessor_Callback_1(mthis, __arg_0);
+
+  static createScriptProcessor_Callback_2(mthis, __arg_0, __arg_1) native "AudioContext_createScriptProcessor_Callback";
+  createScriptProcessor_Callback_2_(mthis, __arg_0, __arg_1) => createScriptProcessor_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createScriptProcessor_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "AudioContext_createScriptProcessor_Callback";
+  createScriptProcessor_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => createScriptProcessor_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static createScriptProcessor_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "AudioContext_createScriptProcessor_Callback";
+  createScriptProcessor_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => createScriptProcessor_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static createScriptProcessor_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "AudioContext_createScriptProcessor_Callback";
+  createScriptProcessor_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => createScriptProcessor_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static createWaveShaper_Callback_0(mthis) native "AudioContext_createWaveShaper_Callback";
+  createWaveShaper_Callback_0_(mthis) => createWaveShaper_Callback_0(mthis);
+
+  static createWaveShaper_Callback_1(mthis, __arg_0) native "AudioContext_createWaveShaper_Callback";
+  createWaveShaper_Callback_1_(mthis, __arg_0) => createWaveShaper_Callback_1(mthis, __arg_0);
+
+  static createWaveShaper_Callback_2(mthis, __arg_0, __arg_1) native "AudioContext_createWaveShaper_Callback";
+  createWaveShaper_Callback_2_(mthis, __arg_0, __arg_1) => createWaveShaper_Callback_2(mthis, __arg_0, __arg_1);
 
   static currentTime_Getter(mthis) native "AudioContext_currentTime_Getter";
+  currentTime_Getter_(mthis) => currentTime_Getter(mthis);
+
+  static decodeAudioData_Callback_0(mthis) native "AudioContext_decodeAudioData_Callback";
+  decodeAudioData_Callback_0_(mthis) => decodeAudioData_Callback_0(mthis);
+
+  static decodeAudioData_Callback_1(mthis, __arg_0) native "AudioContext_decodeAudioData_Callback";
+  decodeAudioData_Callback_1_(mthis, __arg_0) => decodeAudioData_Callback_1(mthis, __arg_0);
+
+  static decodeAudioData_Callback_2(mthis, __arg_0, __arg_1) native "AudioContext_decodeAudioData_Callback";
+  decodeAudioData_Callback_2_(mthis, __arg_0, __arg_1) => decodeAudioData_Callback_2(mthis, __arg_0, __arg_1);
+
+  static decodeAudioData_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "AudioContext_decodeAudioData_Callback";
+  decodeAudioData_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => decodeAudioData_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static decodeAudioData_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "AudioContext_decodeAudioData_Callback";
+  decodeAudioData_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => decodeAudioData_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static decodeAudioData_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "AudioContext_decodeAudioData_Callback";
+  decodeAudioData_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => decodeAudioData_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
 
   static destination_Getter(mthis) native "AudioContext_destination_Getter";
+  destination_Getter_(mthis) => destination_Getter(mthis);
 
   static listener_Getter(mthis) native "AudioContext_listener_Getter";
+  listener_Getter_(mthis) => listener_Getter(mthis);
+
+  static oncomplete_Getter(mthis) native "AudioContext_oncomplete_Getter";
+  oncomplete_Getter_(mthis) => oncomplete_Getter(mthis);
+
+  static oncomplete_Setter(mthis, __arg_0) native "AudioContext_oncomplete_Setter";
+  oncomplete_Setter_(mthis, __arg_0) => oncomplete_Setter(mthis, __arg_0);
 
   static sampleRate_Getter(mthis) native "AudioContext_sampleRate_Getter";
+  sampleRate_Getter_(mthis) => sampleRate_Getter(mthis);
 
-  static createAnalyser_Callback(mthis) native "AudioContext_createAnalyser_Callback";
+  static startRendering_Callback_0(mthis) native "AudioContext_startRendering_Callback";
+  startRendering_Callback_0_(mthis) => startRendering_Callback_0(mthis);
 
-  static createBiquadFilter_Callback(mthis) native "AudioContext_createBiquadFilter_Callback";
+  static startRendering_Callback_1(mthis, __arg_0) native "AudioContext_startRendering_Callback";
+  startRendering_Callback_1_(mthis, __arg_0) => startRendering_Callback_1(mthis, __arg_0);
 
-  static createBuffer_Callback_3(mthis, numberOfChannels, numberOfFrames, sampleRate) native "AudioContext_createBuffer_Callback";
+  static startRendering_Callback_2(mthis, __arg_0, __arg_1) native "AudioContext_startRendering_Callback";
+  startRendering_Callback_2_(mthis, __arg_0, __arg_1) => startRendering_Callback_2(mthis, __arg_0, __arg_1);
 
-  static createBufferSource_Callback(mthis) native "AudioContext_createBufferSource_Callback";
-
-  static createChannelMerger_Callback_1(mthis, numberOfInputs) native "AudioContext_createChannelMerger_Callback";
-
-  static createChannelMerger_Callback(mthis) native "AudioContext_createChannelMerger_Callback";
-
-  static createChannelSplitter_Callback_1(mthis, numberOfOutputs) native "AudioContext_createChannelSplitter_Callback";
-
-  static createChannelSplitter_Callback(mthis) native "AudioContext_createChannelSplitter_Callback";
-
-  static createConvolver_Callback(mthis) native "AudioContext_createConvolver_Callback";
-
-  static createDelay_Callback_1(mthis, maxDelayTime) native "AudioContext_createDelay_Callback";
-
-  static createDelay_Callback(mthis) native "AudioContext_createDelay_Callback";
-
-  static createDynamicsCompressor_Callback(mthis) native "AudioContext_createDynamicsCompressor_Callback";
-
-  static createGain_Callback(mthis) native "AudioContext_createGain_Callback";
-
-  static createMediaElementSource_Callback_1(mthis, mediaElement) native "AudioContext_createMediaElementSource_Callback";
-
-  static createMediaStreamDestination_Callback(mthis) native "AudioContext_createMediaStreamDestination_Callback";
-
-  static createMediaStreamSource_Callback_1(mthis, mediaStream) native "AudioContext_createMediaStreamSource_Callback";
-
-  static createOscillator_Callback(mthis) native "AudioContext_createOscillator_Callback";
-
-  static createPanner_Callback(mthis) native "AudioContext_createPanner_Callback";
-
-  static createPeriodicWave_Callback_2(mthis, real, imag) native "AudioContext_createPeriodicWave_Callback";
-
-  static createScriptProcessor_Callback_3(mthis, bufferSize, numberOfInputChannels, numberOfOutputChannels) native "AudioContext_createScriptProcessor_Callback";
-
-  static createScriptProcessor_Callback_2(mthis, bufferSize, numberOfInputChannels) native "AudioContext_createScriptProcessor_Callback";
-
-  static createScriptProcessor_Callback_1(mthis, bufferSize) native "AudioContext_createScriptProcessor_Callback";
-
-  static createScriptProcessor_Callback(mthis) native "AudioContext_createScriptProcessor_Callback";
-
-  static createWaveShaper_Callback(mthis) native "AudioContext_createWaveShaper_Callback";
-
-  static decodeAudioData_Callback_3(mthis, audioData, successCallback, errorCallback) native "AudioContext_decodeAudioData_Callback";
-
-  static startRendering_Callback(mthis) native "AudioContext_startRendering_Callback";
 }
 
-class BlinkAudioDestinationNode {
+class BlinkAudioDestinationNode extends BlinkAudioNode {
+  static final instance = new BlinkAudioDestinationNode();
+
   static maxChannelCount_Getter(mthis) native "AudioDestinationNode_maxChannelCount_Getter";
+  maxChannelCount_Getter_(mthis) => maxChannelCount_Getter(mthis);
+
 }
 
 class BlinkAudioListener {
-  static dopplerFactor_Getter(mthis) native "AudioListener_dopplerFactor_Getter";
+  static final instance = new BlinkAudioListener();
 
-  static dopplerFactor_Setter(mthis, value) native "AudioListener_dopplerFactor_Setter";
+  static dopplerFactor_Getter(mthis) native "AudioListener_dopplerFactor_Getter";
+  dopplerFactor_Getter_(mthis) => dopplerFactor_Getter(mthis);
+
+  static dopplerFactor_Setter(mthis, __arg_0) native "AudioListener_dopplerFactor_Setter";
+  dopplerFactor_Setter_(mthis, __arg_0) => dopplerFactor_Setter(mthis, __arg_0);
+
+  static setOrientation_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "AudioListener_setOrientation_Callback";
+  setOrientation_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => setOrientation_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static setOrientation_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "AudioListener_setOrientation_Callback";
+  setOrientation_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => setOrientation_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static setOrientation_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "AudioListener_setOrientation_Callback";
+  setOrientation_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => setOrientation_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static setOrientation_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) native "AudioListener_setOrientation_Callback";
+  setOrientation_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => setOrientation_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6);
+
+  static setOrientation_Callback_8(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) native "AudioListener_setOrientation_Callback";
+  setOrientation_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => setOrientation_Callback_8(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7);
+
+  static setPosition_Callback_1(mthis, __arg_0) native "AudioListener_setPosition_Callback";
+  setPosition_Callback_1_(mthis, __arg_0) => setPosition_Callback_1(mthis, __arg_0);
+
+  static setPosition_Callback_2(mthis, __arg_0, __arg_1) native "AudioListener_setPosition_Callback";
+  setPosition_Callback_2_(mthis, __arg_0, __arg_1) => setPosition_Callback_2(mthis, __arg_0, __arg_1);
+
+  static setPosition_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "AudioListener_setPosition_Callback";
+  setPosition_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => setPosition_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static setPosition_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "AudioListener_setPosition_Callback";
+  setPosition_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => setPosition_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static setPosition_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "AudioListener_setPosition_Callback";
+  setPosition_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => setPosition_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static setVelocity_Callback_1(mthis, __arg_0) native "AudioListener_setVelocity_Callback";
+  setVelocity_Callback_1_(mthis, __arg_0) => setVelocity_Callback_1(mthis, __arg_0);
+
+  static setVelocity_Callback_2(mthis, __arg_0, __arg_1) native "AudioListener_setVelocity_Callback";
+  setVelocity_Callback_2_(mthis, __arg_0, __arg_1) => setVelocity_Callback_2(mthis, __arg_0, __arg_1);
+
+  static setVelocity_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "AudioListener_setVelocity_Callback";
+  setVelocity_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => setVelocity_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static setVelocity_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "AudioListener_setVelocity_Callback";
+  setVelocity_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => setVelocity_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static setVelocity_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "AudioListener_setVelocity_Callback";
+  setVelocity_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => setVelocity_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
 
   static speedOfSound_Getter(mthis) native "AudioListener_speedOfSound_Getter";
+  speedOfSound_Getter_(mthis) => speedOfSound_Getter(mthis);
 
-  static speedOfSound_Setter(mthis, value) native "AudioListener_speedOfSound_Setter";
+  static speedOfSound_Setter(mthis, __arg_0) native "AudioListener_speedOfSound_Setter";
+  speedOfSound_Setter_(mthis, __arg_0) => speedOfSound_Setter(mthis, __arg_0);
 
-  static setOrientation_Callback_6(mthis, x, y, z, xUp, yUp, zUp) native "AudioListener_setOrientation_Callback";
+}
 
-  static setPosition_Callback_3(mthis, x, y, z) native "AudioListener_setPosition_Callback";
+class BlinkAudioNode extends BlinkEventTarget {
+  static final instance = new BlinkAudioNode();
 
-  static setVelocity_Callback_3(mthis, x, y, z) native "AudioListener_setVelocity_Callback";
+  static channelCountMode_Getter(mthis) native "AudioNode_channelCountMode_Getter";
+  channelCountMode_Getter_(mthis) => channelCountMode_Getter(mthis);
+
+  static channelCountMode_Setter(mthis, __arg_0) native "AudioNode_channelCountMode_Setter";
+  channelCountMode_Setter_(mthis, __arg_0) => channelCountMode_Setter(mthis, __arg_0);
+
+  static channelCount_Getter(mthis) native "AudioNode_channelCount_Getter";
+  channelCount_Getter_(mthis) => channelCount_Getter(mthis);
+
+  static channelCount_Setter(mthis, __arg_0) native "AudioNode_channelCount_Setter";
+  channelCount_Setter_(mthis, __arg_0) => channelCount_Setter(mthis, __arg_0);
+
+  static channelInterpretation_Getter(mthis) native "AudioNode_channelInterpretation_Getter";
+  channelInterpretation_Getter_(mthis) => channelInterpretation_Getter(mthis);
+
+  static channelInterpretation_Setter(mthis, __arg_0) native "AudioNode_channelInterpretation_Setter";
+  channelInterpretation_Setter_(mthis, __arg_0) => channelInterpretation_Setter(mthis, __arg_0);
+
+  static connect_Callback_0(mthis) native "AudioNode_connect_Callback";
+  connect_Callback_0_(mthis) => connect_Callback_0(mthis);
+
+  static connect_Callback_1(mthis, __arg_0) native "AudioNode_connect_Callback";
+  connect_Callback_1_(mthis, __arg_0) => connect_Callback_1(mthis, __arg_0);
+
+  static connect_Callback_2(mthis, __arg_0, __arg_1) native "AudioNode_connect_Callback";
+  connect_Callback_2_(mthis, __arg_0, __arg_1) => connect_Callback_2(mthis, __arg_0, __arg_1);
+
+  static connect_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "AudioNode_connect_Callback";
+  connect_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => connect_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static connect_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "AudioNode_connect_Callback";
+  connect_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => connect_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static connect_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "AudioNode_connect_Callback";
+  connect_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => connect_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static context_Getter(mthis) native "AudioNode_context_Getter";
+  context_Getter_(mthis) => context_Getter(mthis);
+
+  static disconnect_Callback_0(mthis) native "AudioNode_disconnect_Callback";
+  disconnect_Callback_0_(mthis) => disconnect_Callback_0(mthis);
+
+  static disconnect_Callback_1(mthis, __arg_0) native "AudioNode_disconnect_Callback";
+  disconnect_Callback_1_(mthis, __arg_0) => disconnect_Callback_1(mthis, __arg_0);
+
+  static disconnect_Callback_2(mthis, __arg_0, __arg_1) native "AudioNode_disconnect_Callback";
+  disconnect_Callback_2_(mthis, __arg_0, __arg_1) => disconnect_Callback_2(mthis, __arg_0, __arg_1);
+
+  static disconnect_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "AudioNode_disconnect_Callback";
+  disconnect_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => disconnect_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static numberOfInputs_Getter(mthis) native "AudioNode_numberOfInputs_Getter";
+  numberOfInputs_Getter_(mthis) => numberOfInputs_Getter(mthis);
+
+  static numberOfOutputs_Getter(mthis) native "AudioNode_numberOfOutputs_Getter";
+  numberOfOutputs_Getter_(mthis) => numberOfOutputs_Getter(mthis);
+
 }
 
 class BlinkAudioParam {
+  static final instance = new BlinkAudioParam();
+
+  static cancelScheduledValues_Callback_0(mthis) native "AudioParam_cancelScheduledValues_Callback";
+  cancelScheduledValues_Callback_0_(mthis) => cancelScheduledValues_Callback_0(mthis);
+
+  static cancelScheduledValues_Callback_1(mthis, __arg_0) native "AudioParam_cancelScheduledValues_Callback";
+  cancelScheduledValues_Callback_1_(mthis, __arg_0) => cancelScheduledValues_Callback_1(mthis, __arg_0);
+
+  static cancelScheduledValues_Callback_2(mthis, __arg_0, __arg_1) native "AudioParam_cancelScheduledValues_Callback";
+  cancelScheduledValues_Callback_2_(mthis, __arg_0, __arg_1) => cancelScheduledValues_Callback_2(mthis, __arg_0, __arg_1);
+
+  static cancelScheduledValues_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "AudioParam_cancelScheduledValues_Callback";
+  cancelScheduledValues_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => cancelScheduledValues_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
   static defaultValue_Getter(mthis) native "AudioParam_defaultValue_Getter";
+  defaultValue_Getter_(mthis) => defaultValue_Getter(mthis);
+
+  static exponentialRampToValueAtTime_Callback_0(mthis) native "AudioParam_exponentialRampToValueAtTime_Callback";
+  exponentialRampToValueAtTime_Callback_0_(mthis) => exponentialRampToValueAtTime_Callback_0(mthis);
+
+  static exponentialRampToValueAtTime_Callback_1(mthis, __arg_0) native "AudioParam_exponentialRampToValueAtTime_Callback";
+  exponentialRampToValueAtTime_Callback_1_(mthis, __arg_0) => exponentialRampToValueAtTime_Callback_1(mthis, __arg_0);
+
+  static exponentialRampToValueAtTime_Callback_2(mthis, __arg_0, __arg_1) native "AudioParam_exponentialRampToValueAtTime_Callback";
+  exponentialRampToValueAtTime_Callback_2_(mthis, __arg_0, __arg_1) => exponentialRampToValueAtTime_Callback_2(mthis, __arg_0, __arg_1);
+
+  static exponentialRampToValueAtTime_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "AudioParam_exponentialRampToValueAtTime_Callback";
+  exponentialRampToValueAtTime_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => exponentialRampToValueAtTime_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static exponentialRampToValueAtTime_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "AudioParam_exponentialRampToValueAtTime_Callback";
+  exponentialRampToValueAtTime_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => exponentialRampToValueAtTime_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static linearRampToValueAtTime_Callback_0(mthis) native "AudioParam_linearRampToValueAtTime_Callback";
+  linearRampToValueAtTime_Callback_0_(mthis) => linearRampToValueAtTime_Callback_0(mthis);
+
+  static linearRampToValueAtTime_Callback_1(mthis, __arg_0) native "AudioParam_linearRampToValueAtTime_Callback";
+  linearRampToValueAtTime_Callback_1_(mthis, __arg_0) => linearRampToValueAtTime_Callback_1(mthis, __arg_0);
+
+  static linearRampToValueAtTime_Callback_2(mthis, __arg_0, __arg_1) native "AudioParam_linearRampToValueAtTime_Callback";
+  linearRampToValueAtTime_Callback_2_(mthis, __arg_0, __arg_1) => linearRampToValueAtTime_Callback_2(mthis, __arg_0, __arg_1);
+
+  static linearRampToValueAtTime_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "AudioParam_linearRampToValueAtTime_Callback";
+  linearRampToValueAtTime_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => linearRampToValueAtTime_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static linearRampToValueAtTime_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "AudioParam_linearRampToValueAtTime_Callback";
+  linearRampToValueAtTime_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => linearRampToValueAtTime_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static setTargetAtTime_Callback_1(mthis, __arg_0) native "AudioParam_setTargetAtTime_Callback";
+  setTargetAtTime_Callback_1_(mthis, __arg_0) => setTargetAtTime_Callback_1(mthis, __arg_0);
+
+  static setTargetAtTime_Callback_2(mthis, __arg_0, __arg_1) native "AudioParam_setTargetAtTime_Callback";
+  setTargetAtTime_Callback_2_(mthis, __arg_0, __arg_1) => setTargetAtTime_Callback_2(mthis, __arg_0, __arg_1);
+
+  static setTargetAtTime_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "AudioParam_setTargetAtTime_Callback";
+  setTargetAtTime_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => setTargetAtTime_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static setTargetAtTime_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "AudioParam_setTargetAtTime_Callback";
+  setTargetAtTime_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => setTargetAtTime_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static setTargetAtTime_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "AudioParam_setTargetAtTime_Callback";
+  setTargetAtTime_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => setTargetAtTime_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static setValueAtTime_Callback_0(mthis) native "AudioParam_setValueAtTime_Callback";
+  setValueAtTime_Callback_0_(mthis) => setValueAtTime_Callback_0(mthis);
+
+  static setValueAtTime_Callback_1(mthis, __arg_0) native "AudioParam_setValueAtTime_Callback";
+  setValueAtTime_Callback_1_(mthis, __arg_0) => setValueAtTime_Callback_1(mthis, __arg_0);
+
+  static setValueAtTime_Callback_2(mthis, __arg_0, __arg_1) native "AudioParam_setValueAtTime_Callback";
+  setValueAtTime_Callback_2_(mthis, __arg_0, __arg_1) => setValueAtTime_Callback_2(mthis, __arg_0, __arg_1);
+
+  static setValueAtTime_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "AudioParam_setValueAtTime_Callback";
+  setValueAtTime_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => setValueAtTime_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static setValueAtTime_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "AudioParam_setValueAtTime_Callback";
+  setValueAtTime_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => setValueAtTime_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static setValueCurveAtTime_Callback_1(mthis, __arg_0) native "AudioParam_setValueCurveAtTime_Callback";
+  setValueCurveAtTime_Callback_1_(mthis, __arg_0) => setValueCurveAtTime_Callback_1(mthis, __arg_0);
+
+  static setValueCurveAtTime_Callback_2(mthis, __arg_0, __arg_1) native "AudioParam_setValueCurveAtTime_Callback";
+  setValueCurveAtTime_Callback_2_(mthis, __arg_0, __arg_1) => setValueCurveAtTime_Callback_2(mthis, __arg_0, __arg_1);
+
+  static setValueCurveAtTime_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "AudioParam_setValueCurveAtTime_Callback";
+  setValueCurveAtTime_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => setValueCurveAtTime_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static setValueCurveAtTime_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "AudioParam_setValueCurveAtTime_Callback";
+  setValueCurveAtTime_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => setValueCurveAtTime_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static setValueCurveAtTime_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "AudioParam_setValueCurveAtTime_Callback";
+  setValueCurveAtTime_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => setValueCurveAtTime_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
 
   static value_Getter(mthis) native "AudioParam_value_Getter";
+  value_Getter_(mthis) => value_Getter(mthis);
 
-  static value_Setter(mthis, value) native "AudioParam_value_Setter";
+  static value_Setter(mthis, __arg_0) native "AudioParam_value_Setter";
+  value_Setter_(mthis, __arg_0) => value_Setter(mthis, __arg_0);
 
-  static cancelScheduledValues_Callback_1(mthis, startTime) native "AudioParam_cancelScheduledValues_Callback";
-
-  static exponentialRampToValueAtTime_Callback_2(mthis, value, time) native "AudioParam_exponentialRampToValueAtTime_Callback";
-
-  static linearRampToValueAtTime_Callback_2(mthis, value, time) native "AudioParam_linearRampToValueAtTime_Callback";
-
-  static setTargetAtTime_Callback_3(mthis, target, time, timeConstant) native "AudioParam_setTargetAtTime_Callback";
-
-  static setValueAtTime_Callback_2(mthis, value, time) native "AudioParam_setValueAtTime_Callback";
-
-  static setValueCurveAtTime_Callback_3(mthis, values, time, duration) native "AudioParam_setValueCurveAtTime_Callback";
 }
 
-class BlinkAudioProcessingEvent {
+class BlinkAudioProcessingEvent extends BlinkEvent {
+  static final instance = new BlinkAudioProcessingEvent();
+
   static inputBuffer_Getter(mthis) native "AudioProcessingEvent_inputBuffer_Getter";
+  inputBuffer_Getter_(mthis) => inputBuffer_Getter(mthis);
 
   static outputBuffer_Getter(mthis) native "AudioProcessingEvent_outputBuffer_Getter";
+  outputBuffer_Getter_(mthis) => outputBuffer_Getter(mthis);
 
   static playbackTime_Getter(mthis) native "AudioProcessingEvent_playbackTime_Getter";
+  playbackTime_Getter_(mthis) => playbackTime_Getter(mthis);
+
+}
+
+class BlinkAudioSourceNode extends BlinkAudioNode {
+  static final instance = new BlinkAudioSourceNode();
+
 }
 
 class BlinkAudioTrack {
-  static enabled_Getter(mthis) native "AudioTrack_enabled_Getter";
+  static final instance = new BlinkAudioTrack();
 
-  static enabled_Setter(mthis, value) native "AudioTrack_enabled_Setter";
+  static enabled_Getter(mthis) native "AudioTrack_enabled_Getter";
+  enabled_Getter_(mthis) => enabled_Getter(mthis);
+
+  static enabled_Setter(mthis, __arg_0) native "AudioTrack_enabled_Setter";
+  enabled_Setter_(mthis, __arg_0) => enabled_Setter(mthis, __arg_0);
 
   static id_Getter(mthis) native "AudioTrack_id_Getter";
+  id_Getter_(mthis) => id_Getter(mthis);
 
   static kind_Getter(mthis) native "AudioTrack_kind_Getter";
+  kind_Getter_(mthis) => kind_Getter(mthis);
 
   static label_Getter(mthis) native "AudioTrack_label_Getter";
+  label_Getter_(mthis) => label_Getter(mthis);
 
   static language_Getter(mthis) native "AudioTrack_language_Getter";
+  language_Getter_(mthis) => language_Getter(mthis);
+
 }
 
-class BlinkAudioTrackList {
+class BlinkAudioTrackList extends BlinkEventTarget {
+  static final instance = new BlinkAudioTrackList();
+
+  static $__getter___Callback_1(mthis, __arg_0) native "AudioTrackList___getter___Callback";
+  $__getter___Callback_1_(mthis, __arg_0) => $__getter___Callback_1(mthis, __arg_0);
+
+  static getTrackById_Callback_0(mthis) native "AudioTrackList_getTrackById_Callback";
+  getTrackById_Callback_0_(mthis) => getTrackById_Callback_0(mthis);
+
+  static getTrackById_Callback_1(mthis, __arg_0) native "AudioTrackList_getTrackById_Callback";
+  getTrackById_Callback_1_(mthis, __arg_0) => getTrackById_Callback_1(mthis, __arg_0);
+
+  static getTrackById_Callback_2(mthis, __arg_0, __arg_1) native "AudioTrackList_getTrackById_Callback";
+  getTrackById_Callback_2_(mthis, __arg_0, __arg_1) => getTrackById_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getTrackById_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "AudioTrackList_getTrackById_Callback";
+  getTrackById_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getTrackById_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
   static length_Getter(mthis) native "AudioTrackList_length_Getter";
+  length_Getter_(mthis) => length_Getter(mthis);
 
-  static $__getter___Callback_1(mthis, index) native "AudioTrackList___getter___Callback";
+  static onaddtrack_Getter(mthis) native "AudioTrackList_onaddtrack_Getter";
+  onaddtrack_Getter_(mthis) => onaddtrack_Getter(mthis);
 
-  static getTrackById_Callback_1(mthis, id) native "AudioTrackList_getTrackById_Callback";
+  static onaddtrack_Setter(mthis, __arg_0) native "AudioTrackList_onaddtrack_Setter";
+  onaddtrack_Setter_(mthis, __arg_0) => onaddtrack_Setter(mthis, __arg_0);
+
+  static onchange_Getter(mthis) native "AudioTrackList_onchange_Getter";
+  onchange_Getter_(mthis) => onchange_Getter(mthis);
+
+  static onchange_Setter(mthis, __arg_0) native "AudioTrackList_onchange_Setter";
+  onchange_Setter_(mthis, __arg_0) => onchange_Setter(mthis, __arg_0);
+
+  static onremovetrack_Getter(mthis) native "AudioTrackList_onremovetrack_Getter";
+  onremovetrack_Getter_(mthis) => onremovetrack_Getter(mthis);
+
+  static onremovetrack_Setter(mthis, __arg_0) native "AudioTrackList_onremovetrack_Setter";
+  onremovetrack_Setter_(mthis, __arg_0) => onremovetrack_Setter(mthis, __arg_0);
+
 }
 
-class BlinkAutocompleteErrorEvent {
-  static constructorCallback(type, options) native "AutocompleteErrorEvent_constructorCallback";
+class BlinkAutocompleteErrorEvent extends BlinkEvent {
+  static final instance = new BlinkAutocompleteErrorEvent();
+
+  static constructorCallback_2(__arg_0, __arg_1) native "AutocompleteErrorEvent_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
 
   static reason_Getter(mthis) native "AutocompleteErrorEvent_reason_Getter";
+  reason_Getter_(mthis) => reason_Getter(mthis);
+
 }
 
 class BlinkBarProp {
+  static final instance = new BlinkBarProp();
+
   static visible_Getter(mthis) native "BarProp_visible_Getter";
+  visible_Getter_(mthis) => visible_Getter(mthis);
+
 }
 
-class BlinkBatteryManager {
-  static charging_Getter(mthis) native "BatteryManager_charging_Getter";
+class BlinkBatteryManager extends BlinkEventTarget {
+  static final instance = new BlinkBatteryManager();
 
   static chargingTime_Getter(mthis) native "BatteryManager_chargingTime_Getter";
+  chargingTime_Getter_(mthis) => chargingTime_Getter(mthis);
+
+  static charging_Getter(mthis) native "BatteryManager_charging_Getter";
+  charging_Getter_(mthis) => charging_Getter(mthis);
 
   static dischargingTime_Getter(mthis) native "BatteryManager_dischargingTime_Getter";
+  dischargingTime_Getter_(mthis) => dischargingTime_Getter(mthis);
 
   static level_Getter(mthis) native "BatteryManager_level_Getter";
+  level_Getter_(mthis) => level_Getter(mthis);
+
+  static onchargingchange_Getter(mthis) native "BatteryManager_onchargingchange_Getter";
+  onchargingchange_Getter_(mthis) => onchargingchange_Getter(mthis);
+
+  static onchargingchange_Setter(mthis, __arg_0) native "BatteryManager_onchargingchange_Setter";
+  onchargingchange_Setter_(mthis, __arg_0) => onchargingchange_Setter(mthis, __arg_0);
+
+  static onchargingtimechange_Getter(mthis) native "BatteryManager_onchargingtimechange_Getter";
+  onchargingtimechange_Getter_(mthis) => onchargingtimechange_Getter(mthis);
+
+  static onchargingtimechange_Setter(mthis, __arg_0) native "BatteryManager_onchargingtimechange_Setter";
+  onchargingtimechange_Setter_(mthis, __arg_0) => onchargingtimechange_Setter(mthis, __arg_0);
+
+  static ondischargingtimechange_Getter(mthis) native "BatteryManager_ondischargingtimechange_Getter";
+  ondischargingtimechange_Getter_(mthis) => ondischargingtimechange_Getter(mthis);
+
+  static ondischargingtimechange_Setter(mthis, __arg_0) native "BatteryManager_ondischargingtimechange_Setter";
+  ondischargingtimechange_Setter_(mthis, __arg_0) => ondischargingtimechange_Setter(mthis, __arg_0);
+
+  static onlevelchange_Getter(mthis) native "BatteryManager_onlevelchange_Getter";
+  onlevelchange_Getter_(mthis) => onlevelchange_Getter(mthis);
+
+  static onlevelchange_Setter(mthis, __arg_0) native "BatteryManager_onlevelchange_Setter";
+  onlevelchange_Setter_(mthis, __arg_0) => onlevelchange_Setter(mthis, __arg_0);
+
 }
 
-class BlinkBeforeUnloadEvent {
+class BlinkBeforeUnloadEvent extends BlinkEvent {
+  static final instance = new BlinkBeforeUnloadEvent();
+
   static returnValue_Getter(mthis) native "BeforeUnloadEvent_returnValue_Getter";
+  returnValue_Getter_(mthis) => returnValue_Getter(mthis);
 
-  static returnValue_Setter(mthis, value) native "BeforeUnloadEvent_returnValue_Setter";
+  static returnValue_Setter(mthis, __arg_0) native "BeforeUnloadEvent_returnValue_Setter";
+  returnValue_Setter_(mthis, __arg_0) => returnValue_Setter(mthis, __arg_0);
+
 }
 
-class BlinkBiquadFilterNode {
+class BlinkBiquadFilterNode extends BlinkAudioNode {
+  static final instance = new BlinkBiquadFilterNode();
+
   static Q_Getter(mthis) native "BiquadFilterNode_Q_Getter";
+  Q_Getter_(mthis) => Q_Getter(mthis);
 
   static detune_Getter(mthis) native "BiquadFilterNode_detune_Getter";
+  detune_Getter_(mthis) => detune_Getter(mthis);
 
   static frequency_Getter(mthis) native "BiquadFilterNode_frequency_Getter";
+  frequency_Getter_(mthis) => frequency_Getter(mthis);
 
   static gain_Getter(mthis) native "BiquadFilterNode_gain_Getter";
+  gain_Getter_(mthis) => gain_Getter(mthis);
+
+  static getFrequencyResponse_Callback_1(mthis, __arg_0) native "BiquadFilterNode_getFrequencyResponse_Callback";
+  getFrequencyResponse_Callback_1_(mthis, __arg_0) => getFrequencyResponse_Callback_1(mthis, __arg_0);
+
+  static getFrequencyResponse_Callback_2(mthis, __arg_0, __arg_1) native "BiquadFilterNode_getFrequencyResponse_Callback";
+  getFrequencyResponse_Callback_2_(mthis, __arg_0, __arg_1) => getFrequencyResponse_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getFrequencyResponse_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "BiquadFilterNode_getFrequencyResponse_Callback";
+  getFrequencyResponse_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getFrequencyResponse_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static getFrequencyResponse_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "BiquadFilterNode_getFrequencyResponse_Callback";
+  getFrequencyResponse_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => getFrequencyResponse_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static getFrequencyResponse_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "BiquadFilterNode_getFrequencyResponse_Callback";
+  getFrequencyResponse_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => getFrequencyResponse_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
 
   static type_Getter(mthis) native "BiquadFilterNode_type_Getter";
+  type_Getter_(mthis) => type_Getter(mthis);
 
-  static type_Setter(mthis, value) native "BiquadFilterNode_type_Setter";
+  static type_Setter(mthis, __arg_0) native "BiquadFilterNode_type_Setter";
+  type_Setter_(mthis, __arg_0) => type_Setter(mthis, __arg_0);
 
-  static getFrequencyResponse_Callback_3(mthis, frequencyHz, magResponse, phaseResponse) native "BiquadFilterNode_getFrequencyResponse_Callback";
 }
 
 class BlinkBlob {
-  static constructorCallback_3(blobParts, type, endings) native "Blob_constructorCallback";
+  static final instance = new BlinkBlob();
+
+  static close_Callback_0(mthis) native "Blob_close_Callback";
+  close_Callback_0_(mthis) => close_Callback_0(mthis);
+
+  static close_Callback_1(mthis, __arg_0) native "Blob_close_Callback";
+  close_Callback_1_(mthis, __arg_0) => close_Callback_1(mthis, __arg_0);
+
+  static close_Callback_2(mthis, __arg_0, __arg_1) native "Blob_close_Callback";
+  close_Callback_2_(mthis, __arg_0, __arg_1) => close_Callback_2(mthis, __arg_0, __arg_1);
+
+  static constructorCallback_0() native "Blob_constructorCallback";
+  constructorCallback_0_() => constructorCallback_0();
+
+  static constructorCallback_1(__arg_0) native "Blob_constructorCallback";
+  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+
+  static constructorCallback_2(__arg_0, __arg_1) native "Blob_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+
+  static constructorCallback_3(__arg_0, __arg_1, __arg_2) native "Blob_constructorCallback";
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => constructorCallback_3(__arg_0, __arg_1, __arg_2);
+
+  static constructorCallback_4(__arg_0, __arg_1, __arg_2, __arg_3) native "Blob_constructorCallback";
+  constructorCallback_4_(__arg_0, __arg_1, __arg_2, __arg_3) => constructorCallback_4(__arg_0, __arg_1, __arg_2, __arg_3);
 
   static size_Getter(mthis) native "Blob_size_Getter";
+  size_Getter_(mthis) => size_Getter(mthis);
+
+  static slice_Callback_0(mthis) native "Blob_slice_Callback";
+  slice_Callback_0_(mthis) => slice_Callback_0(mthis);
+
+  static slice_Callback_1(mthis, __arg_0) native "Blob_slice_Callback";
+  slice_Callback_1_(mthis, __arg_0) => slice_Callback_1(mthis, __arg_0);
+
+  static slice_Callback_2(mthis, __arg_0, __arg_1) native "Blob_slice_Callback";
+  slice_Callback_2_(mthis, __arg_0, __arg_1) => slice_Callback_2(mthis, __arg_0, __arg_1);
+
+  static slice_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Blob_slice_Callback";
+  slice_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => slice_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static slice_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Blob_slice_Callback";
+  slice_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => slice_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static slice_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "Blob_slice_Callback";
+  slice_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => slice_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
 
   static type_Getter(mthis) native "Blob_type_Getter";
+  type_Getter_(mthis) => type_Getter(mthis);
 
-  static close_Callback(mthis) native "Blob_close_Callback";
-
-  static slice_Callback_3(mthis, start, end, contentType) native "Blob_slice_Callback";
-
-  static slice_Callback_2(mthis, start, end) native "Blob_slice_Callback";
-
-  static slice_Callback_1(mthis, start) native "Blob_slice_Callback";
-
-  static slice_Callback(mthis) native "Blob_slice_Callback";
 }
 
-class BlinkChildNode {
-  static nextElementSibling_Getter(mthis) native "ChildNode_nextElementSibling_Getter";
+class BlinkCDATASection extends BlinkText {
+  static final instance = new BlinkCDATASection();
 
-  static previousElementSibling_Getter(mthis) native "ChildNode_previousElementSibling_Getter";
-
-  static remove_Callback(mthis) native "ChildNode_remove_Callback";
 }
 
-class BlinkCharacterData {
-  static data_Getter(mthis) native "CharacterData_data_Getter";
-
-  static data_Setter(mthis, value) native "CharacterData_data_Setter";
-
-  static length_Getter(mthis) native "CharacterData_length_Getter";
-
-  static appendData_Callback_1(mthis, data) native "CharacterData_appendData_Callback";
-
-  static deleteData_Callback_2(mthis, offset, length) native "CharacterData_deleteData_Callback";
-
-  static insertData_Callback_2(mthis, offset, data) native "CharacterData_insertData_Callback";
-
-  static replaceData_Callback_3(mthis, offset, length, data) native "CharacterData_replaceData_Callback";
-
-  static substringData_Callback_2(mthis, offset, length) native "CharacterData_substringData_Callback";
-
-  static nextElementSibling_Getter(mthis) native "CharacterData_nextElementSibling_Getter";
-
-  static previousElementSibling_Getter(mthis) native "CharacterData_previousElementSibling_Getter";
-}
-
-class BlinkText {
-  static wholeText_Getter(mthis) native "Text_wholeText_Getter";
-
-  static getDestinationInsertionPoints_Callback(mthis) native "Text_getDestinationInsertionPoints_Callback";
-
-  static splitText_Callback_1(mthis, offset) native "Text_splitText_Callback";
-}
-
-class BlinkCDATASection {}
-
 class BlinkCSS {
-  static supports_Callback_2(mthis, property, value) native "CSS_supports_Callback";
+  static final instance = new BlinkCSS();
 
-  static supports_Callback_1(mthis, conditionText) native "CSS_supports_Callback";
+  static supports_Callback_0(mthis) native "CSS_supports_Callback";
+  supports_Callback_0_(mthis) => supports_Callback_0(mthis);
+
+  static supports_Callback_1(mthis, __arg_0) native "CSS_supports_Callback";
+  supports_Callback_1_(mthis, __arg_0) => supports_Callback_1(mthis, __arg_0);
+
+  static supports_Callback_2(mthis, __arg_0, __arg_1) native "CSS_supports_Callback";
+  supports_Callback_2_(mthis, __arg_0, __arg_1) => supports_Callback_2(mthis, __arg_0, __arg_1);
+
+  static supports_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "CSS_supports_Callback";
+  supports_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => supports_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static supports_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "CSS_supports_Callback";
+  supports_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => supports_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+}
+
+class BlinkCSSCharsetRule extends BlinkCSSRule {
+  static final instance = new BlinkCSSCharsetRule();
+
+  static encoding_Getter(mthis) native "CSSCharsetRule_encoding_Getter";
+  encoding_Getter_(mthis) => encoding_Getter(mthis);
+
+  static encoding_Setter(mthis, __arg_0) native "CSSCharsetRule_encoding_Setter";
+  encoding_Setter_(mthis, __arg_0) => encoding_Setter(mthis, __arg_0);
+
+}
+
+class BlinkCSSFontFaceRule extends BlinkCSSRule {
+  static final instance = new BlinkCSSFontFaceRule();
+
+  static style_Getter(mthis) native "CSSFontFaceRule_style_Getter";
+  style_Getter_(mthis) => style_Getter(mthis);
+
+}
+
+class BlinkCSSImportRule extends BlinkCSSRule {
+  static final instance = new BlinkCSSImportRule();
+
+  static href_Getter(mthis) native "CSSImportRule_href_Getter";
+  href_Getter_(mthis) => href_Getter(mthis);
+
+  static media_Getter(mthis) native "CSSImportRule_media_Getter";
+  media_Getter_(mthis) => media_Getter(mthis);
+
+  static styleSheet_Getter(mthis) native "CSSImportRule_styleSheet_Getter";
+  styleSheet_Getter_(mthis) => styleSheet_Getter(mthis);
+
+}
+
+class BlinkCSSKeyframeRule extends BlinkCSSRule {
+  static final instance = new BlinkCSSKeyframeRule();
+
+  static keyText_Getter(mthis) native "CSSKeyframeRule_keyText_Getter";
+  keyText_Getter_(mthis) => keyText_Getter(mthis);
+
+  static keyText_Setter(mthis, __arg_0) native "CSSKeyframeRule_keyText_Setter";
+  keyText_Setter_(mthis, __arg_0) => keyText_Setter(mthis, __arg_0);
+
+  static style_Getter(mthis) native "CSSKeyframeRule_style_Getter";
+  style_Getter_(mthis) => style_Getter(mthis);
+
+}
+
+class BlinkCSSKeyframesRule extends BlinkCSSRule {
+  static final instance = new BlinkCSSKeyframesRule();
+
+  static $__getter___Callback_1(mthis, __arg_0) native "CSSKeyframesRule___getter___Callback";
+  $__getter___Callback_1_(mthis, __arg_0) => $__getter___Callback_1(mthis, __arg_0);
+
+  static cssRules_Getter(mthis) native "CSSKeyframesRule_cssRules_Getter";
+  cssRules_Getter_(mthis) => cssRules_Getter(mthis);
+
+  static deleteRule_Callback_0(mthis) native "CSSKeyframesRule_deleteRule_Callback";
+  deleteRule_Callback_0_(mthis) => deleteRule_Callback_0(mthis);
+
+  static deleteRule_Callback_1(mthis, __arg_0) native "CSSKeyframesRule_deleteRule_Callback";
+  deleteRule_Callback_1_(mthis, __arg_0) => deleteRule_Callback_1(mthis, __arg_0);
+
+  static deleteRule_Callback_2(mthis, __arg_0, __arg_1) native "CSSKeyframesRule_deleteRule_Callback";
+  deleteRule_Callback_2_(mthis, __arg_0, __arg_1) => deleteRule_Callback_2(mthis, __arg_0, __arg_1);
+
+  static deleteRule_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "CSSKeyframesRule_deleteRule_Callback";
+  deleteRule_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => deleteRule_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static findRule_Callback_0(mthis) native "CSSKeyframesRule_findRule_Callback";
+  findRule_Callback_0_(mthis) => findRule_Callback_0(mthis);
+
+  static findRule_Callback_1(mthis, __arg_0) native "CSSKeyframesRule_findRule_Callback";
+  findRule_Callback_1_(mthis, __arg_0) => findRule_Callback_1(mthis, __arg_0);
+
+  static findRule_Callback_2(mthis, __arg_0, __arg_1) native "CSSKeyframesRule_findRule_Callback";
+  findRule_Callback_2_(mthis, __arg_0, __arg_1) => findRule_Callback_2(mthis, __arg_0, __arg_1);
+
+  static findRule_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "CSSKeyframesRule_findRule_Callback";
+  findRule_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => findRule_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static insertRule_Callback_0(mthis) native "CSSKeyframesRule_insertRule_Callback";
+  insertRule_Callback_0_(mthis) => insertRule_Callback_0(mthis);
+
+  static insertRule_Callback_1(mthis, __arg_0) native "CSSKeyframesRule_insertRule_Callback";
+  insertRule_Callback_1_(mthis, __arg_0) => insertRule_Callback_1(mthis, __arg_0);
+
+  static insertRule_Callback_2(mthis, __arg_0, __arg_1) native "CSSKeyframesRule_insertRule_Callback";
+  insertRule_Callback_2_(mthis, __arg_0, __arg_1) => insertRule_Callback_2(mthis, __arg_0, __arg_1);
+
+  static insertRule_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "CSSKeyframesRule_insertRule_Callback";
+  insertRule_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => insertRule_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static name_Getter(mthis) native "CSSKeyframesRule_name_Getter";
+  name_Getter_(mthis) => name_Getter(mthis);
+
+  static name_Setter(mthis, __arg_0) native "CSSKeyframesRule_name_Setter";
+  name_Setter_(mthis, __arg_0) => name_Setter(mthis, __arg_0);
+
+}
+
+class BlinkCSSMediaRule extends BlinkCSSRule {
+  static final instance = new BlinkCSSMediaRule();
+
+  static cssRules_Getter(mthis) native "CSSMediaRule_cssRules_Getter";
+  cssRules_Getter_(mthis) => cssRules_Getter(mthis);
+
+  static deleteRule_Callback_0(mthis) native "CSSMediaRule_deleteRule_Callback";
+  deleteRule_Callback_0_(mthis) => deleteRule_Callback_0(mthis);
+
+  static deleteRule_Callback_1(mthis, __arg_0) native "CSSMediaRule_deleteRule_Callback";
+  deleteRule_Callback_1_(mthis, __arg_0) => deleteRule_Callback_1(mthis, __arg_0);
+
+  static deleteRule_Callback_2(mthis, __arg_0, __arg_1) native "CSSMediaRule_deleteRule_Callback";
+  deleteRule_Callback_2_(mthis, __arg_0, __arg_1) => deleteRule_Callback_2(mthis, __arg_0, __arg_1);
+
+  static deleteRule_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "CSSMediaRule_deleteRule_Callback";
+  deleteRule_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => deleteRule_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static insertRule_Callback_0(mthis) native "CSSMediaRule_insertRule_Callback";
+  insertRule_Callback_0_(mthis) => insertRule_Callback_0(mthis);
+
+  static insertRule_Callback_1(mthis, __arg_0) native "CSSMediaRule_insertRule_Callback";
+  insertRule_Callback_1_(mthis, __arg_0) => insertRule_Callback_1(mthis, __arg_0);
+
+  static insertRule_Callback_2(mthis, __arg_0, __arg_1) native "CSSMediaRule_insertRule_Callback";
+  insertRule_Callback_2_(mthis, __arg_0, __arg_1) => insertRule_Callback_2(mthis, __arg_0, __arg_1);
+
+  static insertRule_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "CSSMediaRule_insertRule_Callback";
+  insertRule_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => insertRule_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static insertRule_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "CSSMediaRule_insertRule_Callback";
+  insertRule_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => insertRule_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static media_Getter(mthis) native "CSSMediaRule_media_Getter";
+  media_Getter_(mthis) => media_Getter(mthis);
+
+}
+
+class BlinkCSSPageRule extends BlinkCSSRule {
+  static final instance = new BlinkCSSPageRule();
+
+  static selectorText_Getter(mthis) native "CSSPageRule_selectorText_Getter";
+  selectorText_Getter_(mthis) => selectorText_Getter(mthis);
+
+  static selectorText_Setter(mthis, __arg_0) native "CSSPageRule_selectorText_Setter";
+  selectorText_Setter_(mthis, __arg_0) => selectorText_Setter(mthis, __arg_0);
+
+  static style_Getter(mthis) native "CSSPageRule_style_Getter";
+  style_Getter_(mthis) => style_Getter(mthis);
+
+}
+
+class BlinkCSSPrimitiveValue extends BlinkCSSValue {
+  static final instance = new BlinkCSSPrimitiveValue();
+
+  static getCounterValue_Callback_0(mthis) native "CSSPrimitiveValue_getCounterValue_Callback";
+  getCounterValue_Callback_0_(mthis) => getCounterValue_Callback_0(mthis);
+
+  static getCounterValue_Callback_1(mthis, __arg_0) native "CSSPrimitiveValue_getCounterValue_Callback";
+  getCounterValue_Callback_1_(mthis, __arg_0) => getCounterValue_Callback_1(mthis, __arg_0);
+
+  static getCounterValue_Callback_2(mthis, __arg_0, __arg_1) native "CSSPrimitiveValue_getCounterValue_Callback";
+  getCounterValue_Callback_2_(mthis, __arg_0, __arg_1) => getCounterValue_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getFloatValue_Callback_0(mthis) native "CSSPrimitiveValue_getFloatValue_Callback";
+  getFloatValue_Callback_0_(mthis) => getFloatValue_Callback_0(mthis);
+
+  static getFloatValue_Callback_1(mthis, __arg_0) native "CSSPrimitiveValue_getFloatValue_Callback";
+  getFloatValue_Callback_1_(mthis, __arg_0) => getFloatValue_Callback_1(mthis, __arg_0);
+
+  static getFloatValue_Callback_2(mthis, __arg_0, __arg_1) native "CSSPrimitiveValue_getFloatValue_Callback";
+  getFloatValue_Callback_2_(mthis, __arg_0, __arg_1) => getFloatValue_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getFloatValue_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "CSSPrimitiveValue_getFloatValue_Callback";
+  getFloatValue_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getFloatValue_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static getRGBColorValue_Callback_0(mthis) native "CSSPrimitiveValue_getRGBColorValue_Callback";
+  getRGBColorValue_Callback_0_(mthis) => getRGBColorValue_Callback_0(mthis);
+
+  static getRGBColorValue_Callback_1(mthis, __arg_0) native "CSSPrimitiveValue_getRGBColorValue_Callback";
+  getRGBColorValue_Callback_1_(mthis, __arg_0) => getRGBColorValue_Callback_1(mthis, __arg_0);
+
+  static getRGBColorValue_Callback_2(mthis, __arg_0, __arg_1) native "CSSPrimitiveValue_getRGBColorValue_Callback";
+  getRGBColorValue_Callback_2_(mthis, __arg_0, __arg_1) => getRGBColorValue_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getRectValue_Callback_0(mthis) native "CSSPrimitiveValue_getRectValue_Callback";
+  getRectValue_Callback_0_(mthis) => getRectValue_Callback_0(mthis);
+
+  static getRectValue_Callback_1(mthis, __arg_0) native "CSSPrimitiveValue_getRectValue_Callback";
+  getRectValue_Callback_1_(mthis, __arg_0) => getRectValue_Callback_1(mthis, __arg_0);
+
+  static getRectValue_Callback_2(mthis, __arg_0, __arg_1) native "CSSPrimitiveValue_getRectValue_Callback";
+  getRectValue_Callback_2_(mthis, __arg_0, __arg_1) => getRectValue_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getStringValue_Callback_0(mthis) native "CSSPrimitiveValue_getStringValue_Callback";
+  getStringValue_Callback_0_(mthis) => getStringValue_Callback_0(mthis);
+
+  static getStringValue_Callback_1(mthis, __arg_0) native "CSSPrimitiveValue_getStringValue_Callback";
+  getStringValue_Callback_1_(mthis, __arg_0) => getStringValue_Callback_1(mthis, __arg_0);
+
+  static getStringValue_Callback_2(mthis, __arg_0, __arg_1) native "CSSPrimitiveValue_getStringValue_Callback";
+  getStringValue_Callback_2_(mthis, __arg_0, __arg_1) => getStringValue_Callback_2(mthis, __arg_0, __arg_1);
+
+  static primitiveType_Getter(mthis) native "CSSPrimitiveValue_primitiveType_Getter";
+  primitiveType_Getter_(mthis) => primitiveType_Getter(mthis);
+
+  static setFloatValue_Callback_0(mthis) native "CSSPrimitiveValue_setFloatValue_Callback";
+  setFloatValue_Callback_0_(mthis) => setFloatValue_Callback_0(mthis);
+
+  static setFloatValue_Callback_1(mthis, __arg_0) native "CSSPrimitiveValue_setFloatValue_Callback";
+  setFloatValue_Callback_1_(mthis, __arg_0) => setFloatValue_Callback_1(mthis, __arg_0);
+
+  static setFloatValue_Callback_2(mthis, __arg_0, __arg_1) native "CSSPrimitiveValue_setFloatValue_Callback";
+  setFloatValue_Callback_2_(mthis, __arg_0, __arg_1) => setFloatValue_Callback_2(mthis, __arg_0, __arg_1);
+
+  static setFloatValue_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "CSSPrimitiveValue_setFloatValue_Callback";
+  setFloatValue_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => setFloatValue_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static setFloatValue_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "CSSPrimitiveValue_setFloatValue_Callback";
+  setFloatValue_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => setFloatValue_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static setStringValue_Callback_0(mthis) native "CSSPrimitiveValue_setStringValue_Callback";
+  setStringValue_Callback_0_(mthis) => setStringValue_Callback_0(mthis);
+
+  static setStringValue_Callback_1(mthis, __arg_0) native "CSSPrimitiveValue_setStringValue_Callback";
+  setStringValue_Callback_1_(mthis, __arg_0) => setStringValue_Callback_1(mthis, __arg_0);
+
+  static setStringValue_Callback_2(mthis, __arg_0, __arg_1) native "CSSPrimitiveValue_setStringValue_Callback";
+  setStringValue_Callback_2_(mthis, __arg_0, __arg_1) => setStringValue_Callback_2(mthis, __arg_0, __arg_1);
+
+  static setStringValue_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "CSSPrimitiveValue_setStringValue_Callback";
+  setStringValue_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => setStringValue_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static setStringValue_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "CSSPrimitiveValue_setStringValue_Callback";
+  setStringValue_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => setStringValue_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
 }
 
 class BlinkCSSRule {
-  static cssText_Getter(mthis) native "CSSRule_cssText_Getter";
+  static final instance = new BlinkCSSRule();
 
-  static cssText_Setter(mthis, value) native "CSSRule_cssText_Setter";
+  static cssText_Getter(mthis) native "CSSRule_cssText_Getter";
+  cssText_Getter_(mthis) => cssText_Getter(mthis);
+
+  static cssText_Setter(mthis, __arg_0) native "CSSRule_cssText_Setter";
+  cssText_Setter_(mthis, __arg_0) => cssText_Setter(mthis, __arg_0);
 
   static parentRule_Getter(mthis) native "CSSRule_parentRule_Getter";
+  parentRule_Getter_(mthis) => parentRule_Getter(mthis);
 
   static parentStyleSheet_Getter(mthis) native "CSSRule_parentStyleSheet_Getter";
+  parentStyleSheet_Getter_(mthis) => parentStyleSheet_Getter(mthis);
 
   static type_Getter(mthis) native "CSSRule_type_Getter";
+  type_Getter_(mthis) => type_Getter(mthis);
+
 }
 
-class BlinkCSSCharsetRule {
-  static encoding_Getter(mthis) native "CSSCharsetRule_encoding_Getter";
-
-  static encoding_Setter(mthis, value) native "CSSCharsetRule_encoding_Setter";
-}
-
-class BlinkCSSFontFaceRule {
-  static style_Getter(mthis) native "CSSFontFaceRule_style_Getter";
-}
-
-class BlinkCSSImportRule {
-  static href_Getter(mthis) native "CSSImportRule_href_Getter";
-
-  static media_Getter(mthis) native "CSSImportRule_media_Getter";
-
-  static styleSheet_Getter(mthis) native "CSSImportRule_styleSheet_Getter";
-}
-
-class BlinkCSSKeyframeRule {
-  static keyText_Getter(mthis) native "CSSKeyframeRule_keyText_Getter";
-
-  static keyText_Setter(mthis, value) native "CSSKeyframeRule_keyText_Setter";
-
-  static style_Getter(mthis) native "CSSKeyframeRule_style_Getter";
-}
-
-class BlinkCSSKeyframesRule {
-  static cssRules_Getter(mthis) native "CSSKeyframesRule_cssRules_Getter";
-
-  static name_Getter(mthis) native "CSSKeyframesRule_name_Getter";
-
-  static name_Setter(mthis, value) native "CSSKeyframesRule_name_Setter";
-
-  static $__getter___Callback_1(mthis, index) native "CSSKeyframesRule___getter___Callback";
-
-  static deleteRule_Callback_1(mthis, key) native "CSSKeyframesRule_deleteRule_Callback";
-
-  static findRule_Callback_1(mthis, key) native "CSSKeyframesRule_findRule_Callback";
-
-  static insertRule_Callback_1(mthis, rule) native "CSSKeyframesRule_insertRule_Callback";
-}
-
-class BlinkCSSMediaRule {
-  static cssRules_Getter(mthis) native "CSSMediaRule_cssRules_Getter";
-
-  static media_Getter(mthis) native "CSSMediaRule_media_Getter";
-
-  static deleteRule_Callback_1(mthis, index) native "CSSMediaRule_deleteRule_Callback";
-
-  static insertRule_Callback_2(mthis, rule, index) native "CSSMediaRule_insertRule_Callback";
-}
-
-class BlinkCSSPageRule {
-  static selectorText_Getter(mthis) native "CSSPageRule_selectorText_Getter";
-
-  static selectorText_Setter(mthis, value) native "CSSPageRule_selectorText_Setter";
-
-  static style_Getter(mthis) native "CSSPageRule_style_Getter";
-}
-
-class BlinkCSSValue {}
-
-class BlinkCSSPrimitiveValue {}
-
 class BlinkCSSRuleList {
-  static length_Getter(mthis) native "CSSRuleList_length_Getter";
+  static final instance = new BlinkCSSRuleList();
 
-  static item_Callback_1(mthis, index) native "CSSRuleList_item_Callback";
+  static $__getter___Callback_1(mthis, __arg_0) native "CSSRuleList___getter___Callback";
+  $__getter___Callback_1_(mthis, __arg_0) => $__getter___Callback_1(mthis, __arg_0);
+
+  static item_Callback_0(mthis) native "CSSRuleList_item_Callback";
+  item_Callback_0_(mthis) => item_Callback_0(mthis);
+
+  static item_Callback_1(mthis, __arg_0) native "CSSRuleList_item_Callback";
+  item_Callback_1_(mthis, __arg_0) => item_Callback_1(mthis, __arg_0);
+
+  static item_Callback_2(mthis, __arg_0, __arg_1) native "CSSRuleList_item_Callback";
+  item_Callback_2_(mthis, __arg_0, __arg_1) => item_Callback_2(mthis, __arg_0, __arg_1);
+
+  static item_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "CSSRuleList_item_Callback";
+  item_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => item_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static length_Getter(mthis) native "CSSRuleList_length_Getter";
+  length_Getter_(mthis) => length_Getter(mthis);
+
 }
 
 class BlinkCSSStyleDeclaration {
-  static cssText_Getter(mthis) native "CSSStyleDeclaration_cssText_Getter";
+  static final instance = new BlinkCSSStyleDeclaration();
 
-  static cssText_Setter(mthis, value) native "CSSStyleDeclaration_cssText_Setter";
+  static $__getter___Callback_1(mthis, __arg_0) native "CSSStyleDeclaration___getter___Callback";
+  $__getter___Callback_1_(mthis, __arg_0) => $__getter___Callback_1(mthis, __arg_0);
+
+  static $__propertyQuery___Callback_1(mthis, __arg_0) native "CSSStyleDeclaration___propertyQuery___Callback";
+  $__propertyQuery___Callback_1_(mthis, __arg_0) => $__propertyQuery___Callback_1(mthis, __arg_0);
+
+  static $__setter___Callback_2(mthis, __arg_0, __arg_1) native "CSSStyleDeclaration___setter___Callback";
+  $__setter___Callback_2_(mthis, __arg_0, __arg_1) => $__setter___Callback_2(mthis, __arg_0, __arg_1);
+
+  static cssText_Getter(mthis) native "CSSStyleDeclaration_cssText_Getter";
+  cssText_Getter_(mthis) => cssText_Getter(mthis);
+
+  static cssText_Setter(mthis, __arg_0) native "CSSStyleDeclaration_cssText_Setter";
+  cssText_Setter_(mthis, __arg_0) => cssText_Setter(mthis, __arg_0);
+
+  static getPropertyPriority_Callback_0(mthis) native "CSSStyleDeclaration_getPropertyPriority_Callback";
+  getPropertyPriority_Callback_0_(mthis) => getPropertyPriority_Callback_0(mthis);
+
+  static getPropertyPriority_Callback_1(mthis, __arg_0) native "CSSStyleDeclaration_getPropertyPriority_Callback";
+  getPropertyPriority_Callback_1_(mthis, __arg_0) => getPropertyPriority_Callback_1(mthis, __arg_0);
+
+  static getPropertyPriority_Callback_2(mthis, __arg_0, __arg_1) native "CSSStyleDeclaration_getPropertyPriority_Callback";
+  getPropertyPriority_Callback_2_(mthis, __arg_0, __arg_1) => getPropertyPriority_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getPropertyPriority_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "CSSStyleDeclaration_getPropertyPriority_Callback";
+  getPropertyPriority_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getPropertyPriority_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static getPropertyValue_Callback_0(mthis) native "CSSStyleDeclaration_getPropertyValue_Callback";
+  getPropertyValue_Callback_0_(mthis) => getPropertyValue_Callback_0(mthis);
+
+  static getPropertyValue_Callback_1(mthis, __arg_0) native "CSSStyleDeclaration_getPropertyValue_Callback";
+  getPropertyValue_Callback_1_(mthis, __arg_0) => getPropertyValue_Callback_1(mthis, __arg_0);
+
+  static getPropertyValue_Callback_2(mthis, __arg_0, __arg_1) native "CSSStyleDeclaration_getPropertyValue_Callback";
+  getPropertyValue_Callback_2_(mthis, __arg_0, __arg_1) => getPropertyValue_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getPropertyValue_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "CSSStyleDeclaration_getPropertyValue_Callback";
+  getPropertyValue_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getPropertyValue_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static item_Callback_0(mthis) native "CSSStyleDeclaration_item_Callback";
+  item_Callback_0_(mthis) => item_Callback_0(mthis);
+
+  static item_Callback_1(mthis, __arg_0) native "CSSStyleDeclaration_item_Callback";
+  item_Callback_1_(mthis, __arg_0) => item_Callback_1(mthis, __arg_0);
+
+  static item_Callback_2(mthis, __arg_0, __arg_1) native "CSSStyleDeclaration_item_Callback";
+  item_Callback_2_(mthis, __arg_0, __arg_1) => item_Callback_2(mthis, __arg_0, __arg_1);
+
+  static item_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "CSSStyleDeclaration_item_Callback";
+  item_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => item_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
   static length_Getter(mthis) native "CSSStyleDeclaration_length_Getter";
+  length_Getter_(mthis) => length_Getter(mthis);
 
   static parentRule_Getter(mthis) native "CSSStyleDeclaration_parentRule_Getter";
+  parentRule_Getter_(mthis) => parentRule_Getter(mthis);
 
-  static $__getter___Callback_1(mthis, name) native "CSSStyleDeclaration___getter___Callback";
+  static removeProperty_Callback_0(mthis) native "CSSStyleDeclaration_removeProperty_Callback";
+  removeProperty_Callback_0_(mthis) => removeProperty_Callback_0(mthis);
 
-  static $__propertyQuery___Callback_1(mthis, name) native "CSSStyleDeclaration___propertyQuery___Callback";
+  static removeProperty_Callback_1(mthis, __arg_0) native "CSSStyleDeclaration_removeProperty_Callback";
+  removeProperty_Callback_1_(mthis, __arg_0) => removeProperty_Callback_1(mthis, __arg_0);
 
-  static $__setter___Callback_2(mthis, propertyName, propertyValue) native "CSSStyleDeclaration___setter___Callback";
+  static removeProperty_Callback_2(mthis, __arg_0, __arg_1) native "CSSStyleDeclaration_removeProperty_Callback";
+  removeProperty_Callback_2_(mthis, __arg_0, __arg_1) => removeProperty_Callback_2(mthis, __arg_0, __arg_1);
 
-  static getPropertyPriority_Callback_1(mthis, propertyName) native "CSSStyleDeclaration_getPropertyPriority_Callback";
+  static removeProperty_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "CSSStyleDeclaration_removeProperty_Callback";
+  removeProperty_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => removeProperty_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
-  static getPropertyValue_Callback_1(mthis, propertyName) native "CSSStyleDeclaration_getPropertyValue_Callback";
+  static setProperty_Callback_0(mthis) native "CSSStyleDeclaration_setProperty_Callback";
+  setProperty_Callback_0_(mthis) => setProperty_Callback_0(mthis);
 
-  static item_Callback_1(mthis, index) native "CSSStyleDeclaration_item_Callback";
+  static setProperty_Callback_1(mthis, __arg_0) native "CSSStyleDeclaration_setProperty_Callback";
+  setProperty_Callback_1_(mthis, __arg_0) => setProperty_Callback_1(mthis, __arg_0);
 
-  static removeProperty_Callback_1(mthis, propertyName) native "CSSStyleDeclaration_removeProperty_Callback";
+  static setProperty_Callback_2(mthis, __arg_0, __arg_1) native "CSSStyleDeclaration_setProperty_Callback";
+  setProperty_Callback_2_(mthis, __arg_0, __arg_1) => setProperty_Callback_2(mthis, __arg_0, __arg_1);
 
-  static setProperty_Callback_3(mthis, propertyName, value, priority) native "CSSStyleDeclaration_setProperty_Callback";
+  static setProperty_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "CSSStyleDeclaration_setProperty_Callback";
+  setProperty_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => setProperty_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static setProperty_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "CSSStyleDeclaration_setProperty_Callback";
+  setProperty_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => setProperty_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static setProperty_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "CSSStyleDeclaration_setProperty_Callback";
+  setProperty_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => setProperty_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
 }
 
-class BlinkCSSStyleRule {
-  static selectorText_Getter(mthis) native "CSSStyleRule_selectorText_Getter";
+class BlinkCSSStyleRule extends BlinkCSSRule {
+  static final instance = new BlinkCSSStyleRule();
 
-  static selectorText_Setter(mthis, value) native "CSSStyleRule_selectorText_Setter";
+  static selectorText_Getter(mthis) native "CSSStyleRule_selectorText_Getter";
+  selectorText_Getter_(mthis) => selectorText_Getter(mthis);
+
+  static selectorText_Setter(mthis, __arg_0) native "CSSStyleRule_selectorText_Setter";
+  selectorText_Setter_(mthis, __arg_0) => selectorText_Setter(mthis, __arg_0);
 
   static style_Getter(mthis) native "CSSStyleRule_style_Getter";
+  style_Getter_(mthis) => style_Getter(mthis);
+
 }
 
-class BlinkStyleSheet {
-  static disabled_Getter(mthis) native "StyleSheet_disabled_Getter";
+class BlinkCSSStyleSheet extends BlinkStyleSheet {
+  static final instance = new BlinkCSSStyleSheet();
 
-  static disabled_Setter(mthis, value) native "StyleSheet_disabled_Setter";
+  static addRule_Callback_0(mthis) native "CSSStyleSheet_addRule_Callback";
+  addRule_Callback_0_(mthis) => addRule_Callback_0(mthis);
 
-  static href_Getter(mthis) native "StyleSheet_href_Getter";
+  static addRule_Callback_1(mthis, __arg_0) native "CSSStyleSheet_addRule_Callback";
+  addRule_Callback_1_(mthis, __arg_0) => addRule_Callback_1(mthis, __arg_0);
 
-  static media_Getter(mthis) native "StyleSheet_media_Getter";
+  static addRule_Callback_2(mthis, __arg_0, __arg_1) native "CSSStyleSheet_addRule_Callback";
+  addRule_Callback_2_(mthis, __arg_0, __arg_1) => addRule_Callback_2(mthis, __arg_0, __arg_1);
 
-  static ownerNode_Getter(mthis) native "StyleSheet_ownerNode_Getter";
+  static addRule_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "CSSStyleSheet_addRule_Callback";
+  addRule_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => addRule_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
-  static parentStyleSheet_Getter(mthis) native "StyleSheet_parentStyleSheet_Getter";
+  static addRule_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "CSSStyleSheet_addRule_Callback";
+  addRule_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => addRule_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
 
-  static title_Getter(mthis) native "StyleSheet_title_Getter";
+  static addRule_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "CSSStyleSheet_addRule_Callback";
+  addRule_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => addRule_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
 
-  static type_Getter(mthis) native "StyleSheet_type_Getter";
-}
-
-class BlinkCSSStyleSheet {
   static cssRules_Getter(mthis) native "CSSStyleSheet_cssRules_Getter";
+  cssRules_Getter_(mthis) => cssRules_Getter(mthis);
+
+  static deleteRule_Callback_0(mthis) native "CSSStyleSheet_deleteRule_Callback";
+  deleteRule_Callback_0_(mthis) => deleteRule_Callback_0(mthis);
+
+  static deleteRule_Callback_1(mthis, __arg_0) native "CSSStyleSheet_deleteRule_Callback";
+  deleteRule_Callback_1_(mthis, __arg_0) => deleteRule_Callback_1(mthis, __arg_0);
+
+  static deleteRule_Callback_2(mthis, __arg_0, __arg_1) native "CSSStyleSheet_deleteRule_Callback";
+  deleteRule_Callback_2_(mthis, __arg_0, __arg_1) => deleteRule_Callback_2(mthis, __arg_0, __arg_1);
+
+  static deleteRule_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "CSSStyleSheet_deleteRule_Callback";
+  deleteRule_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => deleteRule_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static insertRule_Callback_0(mthis) native "CSSStyleSheet_insertRule_Callback";
+  insertRule_Callback_0_(mthis) => insertRule_Callback_0(mthis);
+
+  static insertRule_Callback_1(mthis, __arg_0) native "CSSStyleSheet_insertRule_Callback";
+  insertRule_Callback_1_(mthis, __arg_0) => insertRule_Callback_1(mthis, __arg_0);
+
+  static insertRule_Callback_2(mthis, __arg_0, __arg_1) native "CSSStyleSheet_insertRule_Callback";
+  insertRule_Callback_2_(mthis, __arg_0, __arg_1) => insertRule_Callback_2(mthis, __arg_0, __arg_1);
+
+  static insertRule_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "CSSStyleSheet_insertRule_Callback";
+  insertRule_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => insertRule_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static insertRule_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "CSSStyleSheet_insertRule_Callback";
+  insertRule_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => insertRule_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
 
   static ownerRule_Getter(mthis) native "CSSStyleSheet_ownerRule_Getter";
+  ownerRule_Getter_(mthis) => ownerRule_Getter(mthis);
+
+  static removeRule_Callback_0(mthis) native "CSSStyleSheet_removeRule_Callback";
+  removeRule_Callback_0_(mthis) => removeRule_Callback_0(mthis);
+
+  static removeRule_Callback_1(mthis, __arg_0) native "CSSStyleSheet_removeRule_Callback";
+  removeRule_Callback_1_(mthis, __arg_0) => removeRule_Callback_1(mthis, __arg_0);
+
+  static removeRule_Callback_2(mthis, __arg_0, __arg_1) native "CSSStyleSheet_removeRule_Callback";
+  removeRule_Callback_2_(mthis, __arg_0, __arg_1) => removeRule_Callback_2(mthis, __arg_0, __arg_1);
+
+  static removeRule_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "CSSStyleSheet_removeRule_Callback";
+  removeRule_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => removeRule_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
   static rules_Getter(mthis) native "CSSStyleSheet_rules_Getter";
+  rules_Getter_(mthis) => rules_Getter(mthis);
 
-  static addRule_Callback_3(mthis, selector, style, index) native "CSSStyleSheet_addRule_Callback";
-
-  static addRule_Callback_2(mthis, selector, style) native "CSSStyleSheet_addRule_Callback";
-
-  static deleteRule_Callback_1(mthis, index) native "CSSStyleSheet_deleteRule_Callback";
-
-  static insertRule_Callback_2(mthis, rule, index) native "CSSStyleSheet_insertRule_Callback";
-
-  static insertRule_Callback_1(mthis, rule) native "CSSStyleSheet_insertRule_Callback";
-
-  static removeRule_Callback_1(mthis, index) native "CSSStyleSheet_removeRule_Callback";
 }
 
-class BlinkCSSSupportsRule {
+class BlinkCSSSupportsRule extends BlinkCSSRule {
+  static final instance = new BlinkCSSSupportsRule();
+
   static conditionText_Getter(mthis) native "CSSSupportsRule_conditionText_Getter";
+  conditionText_Getter_(mthis) => conditionText_Getter(mthis);
 
   static cssRules_Getter(mthis) native "CSSSupportsRule_cssRules_Getter";
+  cssRules_Getter_(mthis) => cssRules_Getter(mthis);
 
-  static deleteRule_Callback_1(mthis, index) native "CSSSupportsRule_deleteRule_Callback";
+  static deleteRule_Callback_0(mthis) native "CSSSupportsRule_deleteRule_Callback";
+  deleteRule_Callback_0_(mthis) => deleteRule_Callback_0(mthis);
 
-  static insertRule_Callback_2(mthis, rule, index) native "CSSSupportsRule_insertRule_Callback";
+  static deleteRule_Callback_1(mthis, __arg_0) native "CSSSupportsRule_deleteRule_Callback";
+  deleteRule_Callback_1_(mthis, __arg_0) => deleteRule_Callback_1(mthis, __arg_0);
+
+  static deleteRule_Callback_2(mthis, __arg_0, __arg_1) native "CSSSupportsRule_deleteRule_Callback";
+  deleteRule_Callback_2_(mthis, __arg_0, __arg_1) => deleteRule_Callback_2(mthis, __arg_0, __arg_1);
+
+  static deleteRule_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "CSSSupportsRule_deleteRule_Callback";
+  deleteRule_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => deleteRule_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static insertRule_Callback_0(mthis) native "CSSSupportsRule_insertRule_Callback";
+  insertRule_Callback_0_(mthis) => insertRule_Callback_0(mthis);
+
+  static insertRule_Callback_1(mthis, __arg_0) native "CSSSupportsRule_insertRule_Callback";
+  insertRule_Callback_1_(mthis, __arg_0) => insertRule_Callback_1(mthis, __arg_0);
+
+  static insertRule_Callback_2(mthis, __arg_0, __arg_1) native "CSSSupportsRule_insertRule_Callback";
+  insertRule_Callback_2_(mthis, __arg_0, __arg_1) => insertRule_Callback_2(mthis, __arg_0, __arg_1);
+
+  static insertRule_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "CSSSupportsRule_insertRule_Callback";
+  insertRule_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => insertRule_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static insertRule_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "CSSSupportsRule_insertRule_Callback";
+  insertRule_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => insertRule_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
 }
 
-class BlinkCSSUnknownRule {}
+class BlinkCSSUnknownRule extends BlinkCSSRule {
+  static final instance = new BlinkCSSUnknownRule();
 
-class BlinkCSSValueList {
+}
+
+class BlinkCSSValue {
+  static final instance = new BlinkCSSValue();
+
+  static cssText_Getter(mthis) native "CSSValue_cssText_Getter";
+  cssText_Getter_(mthis) => cssText_Getter(mthis);
+
+  static cssText_Setter(mthis, __arg_0) native "CSSValue_cssText_Setter";
+  cssText_Setter_(mthis, __arg_0) => cssText_Setter(mthis, __arg_0);
+
+  static cssValueType_Getter(mthis) native "CSSValue_cssValueType_Getter";
+  cssValueType_Getter_(mthis) => cssValueType_Getter(mthis);
+
+}
+
+class BlinkCSSValueList extends BlinkCSSValue {
+  static final instance = new BlinkCSSValueList();
+
+  static $__getter___Callback_1(mthis, __arg_0) native "CSSValueList___getter___Callback";
+  $__getter___Callback_1_(mthis, __arg_0) => $__getter___Callback_1(mthis, __arg_0);
+
+  static item_Callback_0(mthis) native "CSSValueList_item_Callback";
+  item_Callback_0_(mthis) => item_Callback_0(mthis);
+
+  static item_Callback_1(mthis, __arg_0) native "CSSValueList_item_Callback";
+  item_Callback_1_(mthis, __arg_0) => item_Callback_1(mthis, __arg_0);
+
+  static item_Callback_2(mthis, __arg_0, __arg_1) native "CSSValueList_item_Callback";
+  item_Callback_2_(mthis, __arg_0, __arg_1) => item_Callback_2(mthis, __arg_0, __arg_1);
+
+  static item_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "CSSValueList_item_Callback";
+  item_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => item_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
   static length_Getter(mthis) native "CSSValueList_length_Getter";
+  length_Getter_(mthis) => length_Getter(mthis);
 
-  static item_Callback_1(mthis, index) native "CSSValueList_item_Callback";
 }
 
-class BlinkCSSViewportRule {
+class BlinkCSSViewportRule extends BlinkCSSRule {
+  static final instance = new BlinkCSSViewportRule();
+
   static style_Getter(mthis) native "CSSViewportRule_style_Getter";
+  style_Getter_(mthis) => style_Getter(mthis);
+
 }
 
-class BlinkCache {}
+class BlinkCache {
+  static final instance = new BlinkCache();
+
+  static addAll_Callback_0(mthis) native "Cache_addAll_Callback";
+  addAll_Callback_0_(mthis) => addAll_Callback_0(mthis);
+
+  static addAll_Callback_1(mthis, __arg_0) native "Cache_addAll_Callback";
+  addAll_Callback_1_(mthis, __arg_0) => addAll_Callback_1(mthis, __arg_0);
+
+  static addAll_Callback_2(mthis, __arg_0, __arg_1) native "Cache_addAll_Callback";
+  addAll_Callback_2_(mthis, __arg_0, __arg_1) => addAll_Callback_2(mthis, __arg_0, __arg_1);
+
+  static addAll_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Cache_addAll_Callback";
+  addAll_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => addAll_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static add_Callback_0(mthis) native "Cache_add_Callback";
+  add_Callback_0_(mthis) => add_Callback_0(mthis);
+
+  static add_Callback_1(mthis, __arg_0) native "Cache_add_Callback";
+  add_Callback_1_(mthis, __arg_0) => add_Callback_1(mthis, __arg_0);
+
+  static add_Callback_2(mthis, __arg_0, __arg_1) native "Cache_add_Callback";
+  add_Callback_2_(mthis, __arg_0, __arg_1) => add_Callback_2(mthis, __arg_0, __arg_1);
+
+  static add_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Cache_add_Callback";
+  add_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => add_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static delete_Callback_0(mthis) native "Cache_delete_Callback";
+  delete_Callback_0_(mthis) => delete_Callback_0(mthis);
+
+  static delete_Callback_1(mthis, __arg_0) native "Cache_delete_Callback";
+  delete_Callback_1_(mthis, __arg_0) => delete_Callback_1(mthis, __arg_0);
+
+  static delete_Callback_2(mthis, __arg_0, __arg_1) native "Cache_delete_Callback";
+  delete_Callback_2_(mthis, __arg_0, __arg_1) => delete_Callback_2(mthis, __arg_0, __arg_1);
+
+  static delete_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Cache_delete_Callback";
+  delete_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => delete_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static delete_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Cache_delete_Callback";
+  delete_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => delete_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static keys_Callback_0(mthis) native "Cache_keys_Callback";
+  keys_Callback_0_(mthis) => keys_Callback_0(mthis);
+
+  static keys_Callback_1(mthis, __arg_0) native "Cache_keys_Callback";
+  keys_Callback_1_(mthis, __arg_0) => keys_Callback_1(mthis, __arg_0);
+
+  static keys_Callback_2(mthis, __arg_0, __arg_1) native "Cache_keys_Callback";
+  keys_Callback_2_(mthis, __arg_0, __arg_1) => keys_Callback_2(mthis, __arg_0, __arg_1);
+
+  static keys_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Cache_keys_Callback";
+  keys_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => keys_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static keys_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Cache_keys_Callback";
+  keys_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => keys_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static matchAll_Callback_0(mthis) native "Cache_matchAll_Callback";
+  matchAll_Callback_0_(mthis) => matchAll_Callback_0(mthis);
+
+  static matchAll_Callback_1(mthis, __arg_0) native "Cache_matchAll_Callback";
+  matchAll_Callback_1_(mthis, __arg_0) => matchAll_Callback_1(mthis, __arg_0);
+
+  static matchAll_Callback_2(mthis, __arg_0, __arg_1) native "Cache_matchAll_Callback";
+  matchAll_Callback_2_(mthis, __arg_0, __arg_1) => matchAll_Callback_2(mthis, __arg_0, __arg_1);
+
+  static matchAll_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Cache_matchAll_Callback";
+  matchAll_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => matchAll_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static matchAll_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Cache_matchAll_Callback";
+  matchAll_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => matchAll_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static match_Callback_0(mthis) native "Cache_match_Callback";
+  match_Callback_0_(mthis) => match_Callback_0(mthis);
+
+  static match_Callback_1(mthis, __arg_0) native "Cache_match_Callback";
+  match_Callback_1_(mthis, __arg_0) => match_Callback_1(mthis, __arg_0);
+
+  static match_Callback_2(mthis, __arg_0, __arg_1) native "Cache_match_Callback";
+  match_Callback_2_(mthis, __arg_0, __arg_1) => match_Callback_2(mthis, __arg_0, __arg_1);
+
+  static match_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Cache_match_Callback";
+  match_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => match_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static match_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Cache_match_Callback";
+  match_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => match_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static put_Callback_0(mthis) native "Cache_put_Callback";
+  put_Callback_0_(mthis) => put_Callback_0(mthis);
+
+  static put_Callback_1(mthis, __arg_0) native "Cache_put_Callback";
+  put_Callback_1_(mthis, __arg_0) => put_Callback_1(mthis, __arg_0);
+
+  static put_Callback_2(mthis, __arg_0, __arg_1) native "Cache_put_Callback";
+  put_Callback_2_(mthis, __arg_0, __arg_1) => put_Callback_2(mthis, __arg_0, __arg_1);
+
+  static put_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Cache_put_Callback";
+  put_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => put_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static put_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Cache_put_Callback";
+  put_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => put_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+}
 
 class BlinkCacheStorage {
-  static create_Callback_1(mthis, cacheName) native "CacheStorage_create_Callback";
+  static final instance = new BlinkCacheStorage();
 
-  static delete_Callback_1(mthis, cacheName) native "CacheStorage_delete_Callback";
+  static create_Callback_0(mthis) native "CacheStorage_create_Callback";
+  create_Callback_0_(mthis) => create_Callback_0(mthis);
 
-  static get_Callback_1(mthis, cacheName) native "CacheStorage_get_Callback";
+  static create_Callback_1(mthis, __arg_0) native "CacheStorage_create_Callback";
+  create_Callback_1_(mthis, __arg_0) => create_Callback_1(mthis, __arg_0);
 
-  static has_Callback_1(mthis, cacheName) native "CacheStorage_has_Callback";
+  static create_Callback_2(mthis, __arg_0, __arg_1) native "CacheStorage_create_Callback";
+  create_Callback_2_(mthis, __arg_0, __arg_1) => create_Callback_2(mthis, __arg_0, __arg_1);
 
-  static keys_Callback(mthis) native "CacheStorage_keys_Callback";
+  static create_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "CacheStorage_create_Callback";
+  create_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => create_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static delete_Callback_0(mthis) native "CacheStorage_delete_Callback";
+  delete_Callback_0_(mthis) => delete_Callback_0(mthis);
+
+  static delete_Callback_1(mthis, __arg_0) native "CacheStorage_delete_Callback";
+  delete_Callback_1_(mthis, __arg_0) => delete_Callback_1(mthis, __arg_0);
+
+  static delete_Callback_2(mthis, __arg_0, __arg_1) native "CacheStorage_delete_Callback";
+  delete_Callback_2_(mthis, __arg_0, __arg_1) => delete_Callback_2(mthis, __arg_0, __arg_1);
+
+  static delete_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "CacheStorage_delete_Callback";
+  delete_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => delete_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static get_Callback_0(mthis) native "CacheStorage_get_Callback";
+  get_Callback_0_(mthis) => get_Callback_0(mthis);
+
+  static get_Callback_1(mthis, __arg_0) native "CacheStorage_get_Callback";
+  get_Callback_1_(mthis, __arg_0) => get_Callback_1(mthis, __arg_0);
+
+  static get_Callback_2(mthis, __arg_0, __arg_1) native "CacheStorage_get_Callback";
+  get_Callback_2_(mthis, __arg_0, __arg_1) => get_Callback_2(mthis, __arg_0, __arg_1);
+
+  static get_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "CacheStorage_get_Callback";
+  get_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => get_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static has_Callback_0(mthis) native "CacheStorage_has_Callback";
+  has_Callback_0_(mthis) => has_Callback_0(mthis);
+
+  static has_Callback_1(mthis, __arg_0) native "CacheStorage_has_Callback";
+  has_Callback_1_(mthis, __arg_0) => has_Callback_1(mthis, __arg_0);
+
+  static has_Callback_2(mthis, __arg_0, __arg_1) native "CacheStorage_has_Callback";
+  has_Callback_2_(mthis, __arg_0, __arg_1) => has_Callback_2(mthis, __arg_0, __arg_1);
+
+  static has_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "CacheStorage_has_Callback";
+  has_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => has_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static keys_Callback_0(mthis) native "CacheStorage_keys_Callback";
+  keys_Callback_0_(mthis) => keys_Callback_0(mthis);
+
+  static keys_Callback_1(mthis, __arg_0) native "CacheStorage_keys_Callback";
+  keys_Callback_1_(mthis, __arg_0) => keys_Callback_1(mthis, __arg_0);
+
+  static keys_Callback_2(mthis, __arg_0, __arg_1) native "CacheStorage_keys_Callback";
+  keys_Callback_2_(mthis, __arg_0, __arg_1) => keys_Callback_2(mthis, __arg_0, __arg_1);
+
 }
 
 class BlinkCanvas2DContextAttributes {
-  static alpha_Getter(mthis) native "Canvas2DContextAttributes_alpha_Getter";
+  static final instance = new BlinkCanvas2DContextAttributes();
 
-  static alpha_Setter(mthis, value) native "Canvas2DContextAttributes_alpha_Setter";
+  static alpha_Getter(mthis) native "Canvas2DContextAttributes_alpha_Getter";
+  alpha_Getter_(mthis) => alpha_Getter(mthis);
+
+  static alpha_Setter(mthis, __arg_0) native "Canvas2DContextAttributes_alpha_Setter";
+  alpha_Setter_(mthis, __arg_0) => alpha_Setter(mthis, __arg_0);
 
   static storage_Getter(mthis) native "Canvas2DContextAttributes_storage_Getter";
+  storage_Getter_(mthis) => storage_Getter(mthis);
 
-  static storage_Setter(mthis, value) native "Canvas2DContextAttributes_storage_Setter";
+  static storage_Setter(mthis, __arg_0) native "Canvas2DContextAttributes_storage_Setter";
+  storage_Setter_(mthis, __arg_0) => storage_Setter(mthis, __arg_0);
+
 }
 
 class BlinkCanvasGradient {
-  static addColorStop_Callback_2(mthis, offset, color) native "CanvasGradient_addColorStop_Callback";
+  static final instance = new BlinkCanvasGradient();
+
+  static addColorStop_Callback_0(mthis) native "CanvasGradient_addColorStop_Callback";
+  addColorStop_Callback_0_(mthis) => addColorStop_Callback_0(mthis);
+
+  static addColorStop_Callback_1(mthis, __arg_0) native "CanvasGradient_addColorStop_Callback";
+  addColorStop_Callback_1_(mthis, __arg_0) => addColorStop_Callback_1(mthis, __arg_0);
+
+  static addColorStop_Callback_2(mthis, __arg_0, __arg_1) native "CanvasGradient_addColorStop_Callback";
+  addColorStop_Callback_2_(mthis, __arg_0, __arg_1) => addColorStop_Callback_2(mthis, __arg_0, __arg_1);
+
+  static addColorStop_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "CanvasGradient_addColorStop_Callback";
+  addColorStop_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => addColorStop_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static addColorStop_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "CanvasGradient_addColorStop_Callback";
+  addColorStop_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => addColorStop_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
 }
 
-class BlinkCanvasPathMethods {}
+class BlinkCanvasPattern {
+  static final instance = new BlinkCanvasPattern();
 
-class BlinkCanvasPattern {}
+}
 
 class BlinkCanvasRenderingContext2D {
+  static final instance = new BlinkCanvasRenderingContext2D();
+
+  static addHitRegion_Callback_0(mthis) native "CanvasRenderingContext2D_addHitRegion_Callback";
+  addHitRegion_Callback_0_(mthis) => addHitRegion_Callback_0(mthis);
+
+  static addHitRegion_Callback_1(mthis, __arg_0) native "CanvasRenderingContext2D_addHitRegion_Callback";
+  addHitRegion_Callback_1_(mthis, __arg_0) => addHitRegion_Callback_1(mthis, __arg_0);
+
+  static addHitRegion_Callback_2(mthis, __arg_0, __arg_1) native "CanvasRenderingContext2D_addHitRegion_Callback";
+  addHitRegion_Callback_2_(mthis, __arg_0, __arg_1) => addHitRegion_Callback_2(mthis, __arg_0, __arg_1);
+
+  static addHitRegion_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "CanvasRenderingContext2D_addHitRegion_Callback";
+  addHitRegion_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => addHitRegion_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static arcTo_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "CanvasRenderingContext2D_arcTo_Callback";
+  arcTo_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => arcTo_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static arcTo_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "CanvasRenderingContext2D_arcTo_Callback";
+  arcTo_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => arcTo_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static arcTo_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "CanvasRenderingContext2D_arcTo_Callback";
+  arcTo_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => arcTo_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static arcTo_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "CanvasRenderingContext2D_arcTo_Callback";
+  arcTo_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => arcTo_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static arcTo_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) native "CanvasRenderingContext2D_arcTo_Callback";
+  arcTo_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => arcTo_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6);
+
+  static arc_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "CanvasRenderingContext2D_arc_Callback";
+  arc_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => arc_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static arc_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "CanvasRenderingContext2D_arc_Callback";
+  arc_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => arc_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static arc_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "CanvasRenderingContext2D_arc_Callback";
+  arc_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => arc_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static arc_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "CanvasRenderingContext2D_arc_Callback";
+  arc_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => arc_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static arc_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) native "CanvasRenderingContext2D_arc_Callback";
+  arc_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => arc_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6);
+
+  static arc_Callback_8(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) native "CanvasRenderingContext2D_arc_Callback";
+  arc_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => arc_Callback_8(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7);
+
+  static beginPath_Callback_0(mthis) native "CanvasRenderingContext2D_beginPath_Callback";
+  beginPath_Callback_0_(mthis) => beginPath_Callback_0(mthis);
+
+  static beginPath_Callback_1(mthis, __arg_0) native "CanvasRenderingContext2D_beginPath_Callback";
+  beginPath_Callback_1_(mthis, __arg_0) => beginPath_Callback_1(mthis, __arg_0);
+
+  static beginPath_Callback_2(mthis, __arg_0, __arg_1) native "CanvasRenderingContext2D_beginPath_Callback";
+  beginPath_Callback_2_(mthis, __arg_0, __arg_1) => beginPath_Callback_2(mthis, __arg_0, __arg_1);
+
+  static bezierCurveTo_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "CanvasRenderingContext2D_bezierCurveTo_Callback";
+  bezierCurveTo_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => bezierCurveTo_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static bezierCurveTo_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "CanvasRenderingContext2D_bezierCurveTo_Callback";
+  bezierCurveTo_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => bezierCurveTo_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static bezierCurveTo_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "CanvasRenderingContext2D_bezierCurveTo_Callback";
+  bezierCurveTo_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => bezierCurveTo_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static bezierCurveTo_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) native "CanvasRenderingContext2D_bezierCurveTo_Callback";
+  bezierCurveTo_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => bezierCurveTo_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6);
+
+  static bezierCurveTo_Callback_8(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) native "CanvasRenderingContext2D_bezierCurveTo_Callback";
+  bezierCurveTo_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => bezierCurveTo_Callback_8(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7);
+
   static canvas_Getter(mthis) native "CanvasRenderingContext2D_canvas_Getter";
+  canvas_Getter_(mthis) => canvas_Getter(mthis);
+
+  static clearHitRegions_Callback_0(mthis) native "CanvasRenderingContext2D_clearHitRegions_Callback";
+  clearHitRegions_Callback_0_(mthis) => clearHitRegions_Callback_0(mthis);
+
+  static clearHitRegions_Callback_1(mthis, __arg_0) native "CanvasRenderingContext2D_clearHitRegions_Callback";
+  clearHitRegions_Callback_1_(mthis, __arg_0) => clearHitRegions_Callback_1(mthis, __arg_0);
+
+  static clearHitRegions_Callback_2(mthis, __arg_0, __arg_1) native "CanvasRenderingContext2D_clearHitRegions_Callback";
+  clearHitRegions_Callback_2_(mthis, __arg_0, __arg_1) => clearHitRegions_Callback_2(mthis, __arg_0, __arg_1);
+
+  static clearRect_Callback_2(mthis, __arg_0, __arg_1) native "CanvasRenderingContext2D_clearRect_Callback";
+  clearRect_Callback_2_(mthis, __arg_0, __arg_1) => clearRect_Callback_2(mthis, __arg_0, __arg_1);
+
+  static clearRect_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "CanvasRenderingContext2D_clearRect_Callback";
+  clearRect_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => clearRect_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static clearRect_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "CanvasRenderingContext2D_clearRect_Callback";
+  clearRect_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => clearRect_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static clearRect_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "CanvasRenderingContext2D_clearRect_Callback";
+  clearRect_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => clearRect_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static clearRect_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "CanvasRenderingContext2D_clearRect_Callback";
+  clearRect_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => clearRect_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static clip_Callback_0(mthis) native "CanvasRenderingContext2D_clip_Callback";
+  clip_Callback_0_(mthis) => clip_Callback_0(mthis);
+
+  static clip_Callback_1(mthis, __arg_0) native "CanvasRenderingContext2D_clip_Callback";
+  clip_Callback_1_(mthis, __arg_0) => clip_Callback_1(mthis, __arg_0);
+
+  static clip_Callback_2(mthis, __arg_0, __arg_1) native "CanvasRenderingContext2D_clip_Callback";
+  clip_Callback_2_(mthis, __arg_0, __arg_1) => clip_Callback_2(mthis, __arg_0, __arg_1);
+
+  static clip_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "CanvasRenderingContext2D_clip_Callback";
+  clip_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => clip_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static clip_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "CanvasRenderingContext2D_clip_Callback";
+  clip_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => clip_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static closePath_Callback_0(mthis) native "CanvasRenderingContext2D_closePath_Callback";
+  closePath_Callback_0_(mthis) => closePath_Callback_0(mthis);
+
+  static closePath_Callback_1(mthis, __arg_0) native "CanvasRenderingContext2D_closePath_Callback";
+  closePath_Callback_1_(mthis, __arg_0) => closePath_Callback_1(mthis, __arg_0);
+
+  static closePath_Callback_2(mthis, __arg_0, __arg_1) native "CanvasRenderingContext2D_closePath_Callback";
+  closePath_Callback_2_(mthis, __arg_0, __arg_1) => closePath_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createImageData_Callback_0(mthis) native "CanvasRenderingContext2D_createImageData_Callback";
+  createImageData_Callback_0_(mthis) => createImageData_Callback_0(mthis);
+
+  static createImageData_Callback_1(mthis, __arg_0) native "CanvasRenderingContext2D_createImageData_Callback";
+  createImageData_Callback_1_(mthis, __arg_0) => createImageData_Callback_1(mthis, __arg_0);
+
+  static createImageData_Callback_2(mthis, __arg_0, __arg_1) native "CanvasRenderingContext2D_createImageData_Callback";
+  createImageData_Callback_2_(mthis, __arg_0, __arg_1) => createImageData_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createImageData_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "CanvasRenderingContext2D_createImageData_Callback";
+  createImageData_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => createImageData_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static createImageData_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "CanvasRenderingContext2D_createImageData_Callback";
+  createImageData_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => createImageData_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static createLinearGradient_Callback_2(mthis, __arg_0, __arg_1) native "CanvasRenderingContext2D_createLinearGradient_Callback";
+  createLinearGradient_Callback_2_(mthis, __arg_0, __arg_1) => createLinearGradient_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createLinearGradient_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "CanvasRenderingContext2D_createLinearGradient_Callback";
+  createLinearGradient_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => createLinearGradient_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static createLinearGradient_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "CanvasRenderingContext2D_createLinearGradient_Callback";
+  createLinearGradient_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => createLinearGradient_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static createLinearGradient_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "CanvasRenderingContext2D_createLinearGradient_Callback";
+  createLinearGradient_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => createLinearGradient_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static createLinearGradient_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "CanvasRenderingContext2D_createLinearGradient_Callback";
+  createLinearGradient_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => createLinearGradient_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static createPattern_Callback_0(mthis) native "CanvasRenderingContext2D_createPattern_Callback";
+  createPattern_Callback_0_(mthis) => createPattern_Callback_0(mthis);
+
+  static createPattern_Callback_1(mthis, __arg_0) native "CanvasRenderingContext2D_createPattern_Callback";
+  createPattern_Callback_1_(mthis, __arg_0) => createPattern_Callback_1(mthis, __arg_0);
+
+  static createPattern_Callback_2(mthis, __arg_0, __arg_1) native "CanvasRenderingContext2D_createPattern_Callback";
+  createPattern_Callback_2_(mthis, __arg_0, __arg_1) => createPattern_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createPattern_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "CanvasRenderingContext2D_createPattern_Callback";
+  createPattern_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => createPattern_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static createPattern_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "CanvasRenderingContext2D_createPattern_Callback";
+  createPattern_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => createPattern_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static createRadialGradient_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "CanvasRenderingContext2D_createRadialGradient_Callback";
+  createRadialGradient_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => createRadialGradient_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static createRadialGradient_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "CanvasRenderingContext2D_createRadialGradient_Callback";
+  createRadialGradient_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => createRadialGradient_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static createRadialGradient_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "CanvasRenderingContext2D_createRadialGradient_Callback";
+  createRadialGradient_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => createRadialGradient_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static createRadialGradient_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) native "CanvasRenderingContext2D_createRadialGradient_Callback";
+  createRadialGradient_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => createRadialGradient_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6);
+
+  static createRadialGradient_Callback_8(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) native "CanvasRenderingContext2D_createRadialGradient_Callback";
+  createRadialGradient_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => createRadialGradient_Callback_8(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7);
 
   static currentTransform_Getter(mthis) native "CanvasRenderingContext2D_currentTransform_Getter";
+  currentTransform_Getter_(mthis) => currentTransform_Getter(mthis);
 
-  static currentTransform_Setter(mthis, value) native "CanvasRenderingContext2D_currentTransform_Setter";
+  static currentTransform_Setter(mthis, __arg_0) native "CanvasRenderingContext2D_currentTransform_Setter";
+  currentTransform_Setter_(mthis, __arg_0) => currentTransform_Setter(mthis, __arg_0);
+
+  static drawFocusIfNeeded_Callback_0(mthis) native "CanvasRenderingContext2D_drawFocusIfNeeded_Callback";
+  drawFocusIfNeeded_Callback_0_(mthis) => drawFocusIfNeeded_Callback_0(mthis);
+
+  static drawFocusIfNeeded_Callback_1(mthis, __arg_0) native "CanvasRenderingContext2D_drawFocusIfNeeded_Callback";
+  drawFocusIfNeeded_Callback_1_(mthis, __arg_0) => drawFocusIfNeeded_Callback_1(mthis, __arg_0);
+
+  static drawFocusIfNeeded_Callback_2(mthis, __arg_0, __arg_1) native "CanvasRenderingContext2D_drawFocusIfNeeded_Callback";
+  drawFocusIfNeeded_Callback_2_(mthis, __arg_0, __arg_1) => drawFocusIfNeeded_Callback_2(mthis, __arg_0, __arg_1);
+
+  static drawFocusIfNeeded_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "CanvasRenderingContext2D_drawFocusIfNeeded_Callback";
+  drawFocusIfNeeded_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => drawFocusIfNeeded_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static drawFocusIfNeeded_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "CanvasRenderingContext2D_drawFocusIfNeeded_Callback";
+  drawFocusIfNeeded_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => drawFocusIfNeeded_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static drawImage_Callback_1(mthis, __arg_0) native "CanvasRenderingContext2D_drawImage_Callback";
+  drawImage_Callback_1_(mthis, __arg_0) => drawImage_Callback_1(mthis, __arg_0);
+
+  static drawImage_Callback_10(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9) native "CanvasRenderingContext2D_drawImage_Callback";
+  drawImage_Callback_10_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9) => drawImage_Callback_10(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9);
+
+  static drawImage_Callback_11(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10) native "CanvasRenderingContext2D_drawImage_Callback";
+  drawImage_Callback_11_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10) => drawImage_Callback_11(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10);
+
+  static drawImage_Callback_2(mthis, __arg_0, __arg_1) native "CanvasRenderingContext2D_drawImage_Callback";
+  drawImage_Callback_2_(mthis, __arg_0, __arg_1) => drawImage_Callback_2(mthis, __arg_0, __arg_1);
+
+  static drawImage_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "CanvasRenderingContext2D_drawImage_Callback";
+  drawImage_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => drawImage_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static drawImage_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "CanvasRenderingContext2D_drawImage_Callback";
+  drawImage_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => drawImage_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static drawImage_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "CanvasRenderingContext2D_drawImage_Callback";
+  drawImage_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => drawImage_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static drawImage_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "CanvasRenderingContext2D_drawImage_Callback";
+  drawImage_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => drawImage_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static drawImage_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) native "CanvasRenderingContext2D_drawImage_Callback";
+  drawImage_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => drawImage_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6);
+
+  static drawImage_Callback_8(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) native "CanvasRenderingContext2D_drawImage_Callback";
+  drawImage_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => drawImage_Callback_8(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7);
+
+  static drawImage_Callback_9(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) native "CanvasRenderingContext2D_drawImage_Callback";
+  drawImage_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => drawImage_Callback_9(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8);
+
+  static ellipse_Callback_10(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9) native "CanvasRenderingContext2D_ellipse_Callback";
+  ellipse_Callback_10_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9) => ellipse_Callback_10(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9);
+
+  static ellipse_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "CanvasRenderingContext2D_ellipse_Callback";
+  ellipse_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => ellipse_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static ellipse_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "CanvasRenderingContext2D_ellipse_Callback";
+  ellipse_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => ellipse_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static ellipse_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) native "CanvasRenderingContext2D_ellipse_Callback";
+  ellipse_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => ellipse_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6);
+
+  static ellipse_Callback_8(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) native "CanvasRenderingContext2D_ellipse_Callback";
+  ellipse_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => ellipse_Callback_8(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7);
+
+  static ellipse_Callback_9(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) native "CanvasRenderingContext2D_ellipse_Callback";
+  ellipse_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => ellipse_Callback_9(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8);
+
+  static fillRect_Callback_2(mthis, __arg_0, __arg_1) native "CanvasRenderingContext2D_fillRect_Callback";
+  fillRect_Callback_2_(mthis, __arg_0, __arg_1) => fillRect_Callback_2(mthis, __arg_0, __arg_1);
+
+  static fillRect_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "CanvasRenderingContext2D_fillRect_Callback";
+  fillRect_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => fillRect_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static fillRect_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "CanvasRenderingContext2D_fillRect_Callback";
+  fillRect_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => fillRect_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static fillRect_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "CanvasRenderingContext2D_fillRect_Callback";
+  fillRect_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => fillRect_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static fillRect_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "CanvasRenderingContext2D_fillRect_Callback";
+  fillRect_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => fillRect_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
 
   static fillStyle_Getter(mthis) native "CanvasRenderingContext2D_fillStyle_Getter";
+  fillStyle_Getter_(mthis) => fillStyle_Getter(mthis);
 
-  static fillStyle_Setter(mthis, value) native "CanvasRenderingContext2D_fillStyle_Setter";
+  static fillStyle_Setter(mthis, __arg_0) native "CanvasRenderingContext2D_fillStyle_Setter";
+  fillStyle_Setter_(mthis, __arg_0) => fillStyle_Setter(mthis, __arg_0);
+
+  static fillText_Callback_1(mthis, __arg_0) native "CanvasRenderingContext2D_fillText_Callback";
+  fillText_Callback_1_(mthis, __arg_0) => fillText_Callback_1(mthis, __arg_0);
+
+  static fillText_Callback_2(mthis, __arg_0, __arg_1) native "CanvasRenderingContext2D_fillText_Callback";
+  fillText_Callback_2_(mthis, __arg_0, __arg_1) => fillText_Callback_2(mthis, __arg_0, __arg_1);
+
+  static fillText_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "CanvasRenderingContext2D_fillText_Callback";
+  fillText_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => fillText_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static fillText_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "CanvasRenderingContext2D_fillText_Callback";
+  fillText_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => fillText_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static fillText_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "CanvasRenderingContext2D_fillText_Callback";
+  fillText_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => fillText_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static fillText_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "CanvasRenderingContext2D_fillText_Callback";
+  fillText_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => fillText_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static fill_Callback_0(mthis) native "CanvasRenderingContext2D_fill_Callback";
+  fill_Callback_0_(mthis) => fill_Callback_0(mthis);
+
+  static fill_Callback_1(mthis, __arg_0) native "CanvasRenderingContext2D_fill_Callback";
+  fill_Callback_1_(mthis, __arg_0) => fill_Callback_1(mthis, __arg_0);
+
+  static fill_Callback_2(mthis, __arg_0, __arg_1) native "CanvasRenderingContext2D_fill_Callback";
+  fill_Callback_2_(mthis, __arg_0, __arg_1) => fill_Callback_2(mthis, __arg_0, __arg_1);
+
+  static fill_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "CanvasRenderingContext2D_fill_Callback";
+  fill_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => fill_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static fill_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "CanvasRenderingContext2D_fill_Callback";
+  fill_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => fill_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
 
   static font_Getter(mthis) native "CanvasRenderingContext2D_font_Getter";
+  font_Getter_(mthis) => font_Getter(mthis);
 
-  static font_Setter(mthis, value) native "CanvasRenderingContext2D_font_Setter";
+  static font_Setter(mthis, __arg_0) native "CanvasRenderingContext2D_font_Setter";
+  font_Setter_(mthis, __arg_0) => font_Setter(mthis, __arg_0);
+
+  static getContextAttributes_Callback_0(mthis) native "CanvasRenderingContext2D_getContextAttributes_Callback";
+  getContextAttributes_Callback_0_(mthis) => getContextAttributes_Callback_0(mthis);
+
+  static getContextAttributes_Callback_1(mthis, __arg_0) native "CanvasRenderingContext2D_getContextAttributes_Callback";
+  getContextAttributes_Callback_1_(mthis, __arg_0) => getContextAttributes_Callback_1(mthis, __arg_0);
+
+  static getContextAttributes_Callback_2(mthis, __arg_0, __arg_1) native "CanvasRenderingContext2D_getContextAttributes_Callback";
+  getContextAttributes_Callback_2_(mthis, __arg_0, __arg_1) => getContextAttributes_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getImageData_Callback_2(mthis, __arg_0, __arg_1) native "CanvasRenderingContext2D_getImageData_Callback";
+  getImageData_Callback_2_(mthis, __arg_0, __arg_1) => getImageData_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getImageData_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "CanvasRenderingContext2D_getImageData_Callback";
+  getImageData_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getImageData_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static getImageData_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "CanvasRenderingContext2D_getImageData_Callback";
+  getImageData_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => getImageData_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static getImageData_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "CanvasRenderingContext2D_getImageData_Callback";
+  getImageData_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => getImageData_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static getImageData_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "CanvasRenderingContext2D_getImageData_Callback";
+  getImageData_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => getImageData_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static getLineDash_Callback_0(mthis) native "CanvasRenderingContext2D_getLineDash_Callback";
+  getLineDash_Callback_0_(mthis) => getLineDash_Callback_0(mthis);
+
+  static getLineDash_Callback_1(mthis, __arg_0) native "CanvasRenderingContext2D_getLineDash_Callback";
+  getLineDash_Callback_1_(mthis, __arg_0) => getLineDash_Callback_1(mthis, __arg_0);
+
+  static getLineDash_Callback_2(mthis, __arg_0, __arg_1) native "CanvasRenderingContext2D_getLineDash_Callback";
+  getLineDash_Callback_2_(mthis, __arg_0, __arg_1) => getLineDash_Callback_2(mthis, __arg_0, __arg_1);
 
   static globalAlpha_Getter(mthis) native "CanvasRenderingContext2D_globalAlpha_Getter";
+  globalAlpha_Getter_(mthis) => globalAlpha_Getter(mthis);
 
-  static globalAlpha_Setter(mthis, value) native "CanvasRenderingContext2D_globalAlpha_Setter";
+  static globalAlpha_Setter(mthis, __arg_0) native "CanvasRenderingContext2D_globalAlpha_Setter";
+  globalAlpha_Setter_(mthis, __arg_0) => globalAlpha_Setter(mthis, __arg_0);
 
   static globalCompositeOperation_Getter(mthis) native "CanvasRenderingContext2D_globalCompositeOperation_Getter";
+  globalCompositeOperation_Getter_(mthis) => globalCompositeOperation_Getter(mthis);
 
-  static globalCompositeOperation_Setter(mthis, value) native "CanvasRenderingContext2D_globalCompositeOperation_Setter";
+  static globalCompositeOperation_Setter(mthis, __arg_0) native "CanvasRenderingContext2D_globalCompositeOperation_Setter";
+  globalCompositeOperation_Setter_(mthis, __arg_0) => globalCompositeOperation_Setter(mthis, __arg_0);
 
   static imageSmoothingEnabled_Getter(mthis) native "CanvasRenderingContext2D_imageSmoothingEnabled_Getter";
+  imageSmoothingEnabled_Getter_(mthis) => imageSmoothingEnabled_Getter(mthis);
 
-  static imageSmoothingEnabled_Setter(mthis, value) native "CanvasRenderingContext2D_imageSmoothingEnabled_Setter";
+  static imageSmoothingEnabled_Setter(mthis, __arg_0) native "CanvasRenderingContext2D_imageSmoothingEnabled_Setter";
+  imageSmoothingEnabled_Setter_(mthis, __arg_0) => imageSmoothingEnabled_Setter(mthis, __arg_0);
+
+  static isContextLost_Callback_0(mthis) native "CanvasRenderingContext2D_isContextLost_Callback";
+  isContextLost_Callback_0_(mthis) => isContextLost_Callback_0(mthis);
+
+  static isContextLost_Callback_1(mthis, __arg_0) native "CanvasRenderingContext2D_isContextLost_Callback";
+  isContextLost_Callback_1_(mthis, __arg_0) => isContextLost_Callback_1(mthis, __arg_0);
+
+  static isContextLost_Callback_2(mthis, __arg_0, __arg_1) native "CanvasRenderingContext2D_isContextLost_Callback";
+  isContextLost_Callback_2_(mthis, __arg_0, __arg_1) => isContextLost_Callback_2(mthis, __arg_0, __arg_1);
+
+  static isPointInPath_Callback_0(mthis) native "CanvasRenderingContext2D_isPointInPath_Callback";
+  isPointInPath_Callback_0_(mthis) => isPointInPath_Callback_0(mthis);
+
+  static isPointInPath_Callback_1(mthis, __arg_0) native "CanvasRenderingContext2D_isPointInPath_Callback";
+  isPointInPath_Callback_1_(mthis, __arg_0) => isPointInPath_Callback_1(mthis, __arg_0);
+
+  static isPointInPath_Callback_2(mthis, __arg_0, __arg_1) native "CanvasRenderingContext2D_isPointInPath_Callback";
+  isPointInPath_Callback_2_(mthis, __arg_0, __arg_1) => isPointInPath_Callback_2(mthis, __arg_0, __arg_1);
+
+  static isPointInPath_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "CanvasRenderingContext2D_isPointInPath_Callback";
+  isPointInPath_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => isPointInPath_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static isPointInPath_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "CanvasRenderingContext2D_isPointInPath_Callback";
+  isPointInPath_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => isPointInPath_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static isPointInPath_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "CanvasRenderingContext2D_isPointInPath_Callback";
+  isPointInPath_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => isPointInPath_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static isPointInPath_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "CanvasRenderingContext2D_isPointInPath_Callback";
+  isPointInPath_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => isPointInPath_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static isPointInStroke_Callback_0(mthis) native "CanvasRenderingContext2D_isPointInStroke_Callback";
+  isPointInStroke_Callback_0_(mthis) => isPointInStroke_Callback_0(mthis);
+
+  static isPointInStroke_Callback_1(mthis, __arg_0) native "CanvasRenderingContext2D_isPointInStroke_Callback";
+  isPointInStroke_Callback_1_(mthis, __arg_0) => isPointInStroke_Callback_1(mthis, __arg_0);
+
+  static isPointInStroke_Callback_2(mthis, __arg_0, __arg_1) native "CanvasRenderingContext2D_isPointInStroke_Callback";
+  isPointInStroke_Callback_2_(mthis, __arg_0, __arg_1) => isPointInStroke_Callback_2(mthis, __arg_0, __arg_1);
+
+  static isPointInStroke_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "CanvasRenderingContext2D_isPointInStroke_Callback";
+  isPointInStroke_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => isPointInStroke_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static isPointInStroke_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "CanvasRenderingContext2D_isPointInStroke_Callback";
+  isPointInStroke_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => isPointInStroke_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static isPointInStroke_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "CanvasRenderingContext2D_isPointInStroke_Callback";
+  isPointInStroke_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => isPointInStroke_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
 
   static lineCap_Getter(mthis) native "CanvasRenderingContext2D_lineCap_Getter";
+  lineCap_Getter_(mthis) => lineCap_Getter(mthis);
 
-  static lineCap_Setter(mthis, value) native "CanvasRenderingContext2D_lineCap_Setter";
+  static lineCap_Setter(mthis, __arg_0) native "CanvasRenderingContext2D_lineCap_Setter";
+  lineCap_Setter_(mthis, __arg_0) => lineCap_Setter(mthis, __arg_0);
 
   static lineDashOffset_Getter(mthis) native "CanvasRenderingContext2D_lineDashOffset_Getter";
+  lineDashOffset_Getter_(mthis) => lineDashOffset_Getter(mthis);
 
-  static lineDashOffset_Setter(mthis, value) native "CanvasRenderingContext2D_lineDashOffset_Setter";
+  static lineDashOffset_Setter(mthis, __arg_0) native "CanvasRenderingContext2D_lineDashOffset_Setter";
+  lineDashOffset_Setter_(mthis, __arg_0) => lineDashOffset_Setter(mthis, __arg_0);
 
   static lineJoin_Getter(mthis) native "CanvasRenderingContext2D_lineJoin_Getter";
+  lineJoin_Getter_(mthis) => lineJoin_Getter(mthis);
 
-  static lineJoin_Setter(mthis, value) native "CanvasRenderingContext2D_lineJoin_Setter";
+  static lineJoin_Setter(mthis, __arg_0) native "CanvasRenderingContext2D_lineJoin_Setter";
+  lineJoin_Setter_(mthis, __arg_0) => lineJoin_Setter(mthis, __arg_0);
+
+  static lineTo_Callback_0(mthis) native "CanvasRenderingContext2D_lineTo_Callback";
+  lineTo_Callback_0_(mthis) => lineTo_Callback_0(mthis);
+
+  static lineTo_Callback_1(mthis, __arg_0) native "CanvasRenderingContext2D_lineTo_Callback";
+  lineTo_Callback_1_(mthis, __arg_0) => lineTo_Callback_1(mthis, __arg_0);
+
+  static lineTo_Callback_2(mthis, __arg_0, __arg_1) native "CanvasRenderingContext2D_lineTo_Callback";
+  lineTo_Callback_2_(mthis, __arg_0, __arg_1) => lineTo_Callback_2(mthis, __arg_0, __arg_1);
+
+  static lineTo_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "CanvasRenderingContext2D_lineTo_Callback";
+  lineTo_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => lineTo_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static lineTo_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "CanvasRenderingContext2D_lineTo_Callback";
+  lineTo_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => lineTo_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
 
   static lineWidth_Getter(mthis) native "CanvasRenderingContext2D_lineWidth_Getter";
+  lineWidth_Getter_(mthis) => lineWidth_Getter(mthis);
 
-  static lineWidth_Setter(mthis, value) native "CanvasRenderingContext2D_lineWidth_Setter";
+  static lineWidth_Setter(mthis, __arg_0) native "CanvasRenderingContext2D_lineWidth_Setter";
+  lineWidth_Setter_(mthis, __arg_0) => lineWidth_Setter(mthis, __arg_0);
+
+  static measureText_Callback_0(mthis) native "CanvasRenderingContext2D_measureText_Callback";
+  measureText_Callback_0_(mthis) => measureText_Callback_0(mthis);
+
+  static measureText_Callback_1(mthis, __arg_0) native "CanvasRenderingContext2D_measureText_Callback";
+  measureText_Callback_1_(mthis, __arg_0) => measureText_Callback_1(mthis, __arg_0);
+
+  static measureText_Callback_2(mthis, __arg_0, __arg_1) native "CanvasRenderingContext2D_measureText_Callback";
+  measureText_Callback_2_(mthis, __arg_0, __arg_1) => measureText_Callback_2(mthis, __arg_0, __arg_1);
+
+  static measureText_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "CanvasRenderingContext2D_measureText_Callback";
+  measureText_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => measureText_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
   static miterLimit_Getter(mthis) native "CanvasRenderingContext2D_miterLimit_Getter";
+  miterLimit_Getter_(mthis) => miterLimit_Getter(mthis);
 
-  static miterLimit_Setter(mthis, value) native "CanvasRenderingContext2D_miterLimit_Setter";
+  static miterLimit_Setter(mthis, __arg_0) native "CanvasRenderingContext2D_miterLimit_Setter";
+  miterLimit_Setter_(mthis, __arg_0) => miterLimit_Setter(mthis, __arg_0);
+
+  static moveTo_Callback_0(mthis) native "CanvasRenderingContext2D_moveTo_Callback";
+  moveTo_Callback_0_(mthis) => moveTo_Callback_0(mthis);
+
+  static moveTo_Callback_1(mthis, __arg_0) native "CanvasRenderingContext2D_moveTo_Callback";
+  moveTo_Callback_1_(mthis, __arg_0) => moveTo_Callback_1(mthis, __arg_0);
+
+  static moveTo_Callback_2(mthis, __arg_0, __arg_1) native "CanvasRenderingContext2D_moveTo_Callback";
+  moveTo_Callback_2_(mthis, __arg_0, __arg_1) => moveTo_Callback_2(mthis, __arg_0, __arg_1);
+
+  static moveTo_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "CanvasRenderingContext2D_moveTo_Callback";
+  moveTo_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => moveTo_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static moveTo_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "CanvasRenderingContext2D_moveTo_Callback";
+  moveTo_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => moveTo_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static putImageData_Callback_1(mthis, __arg_0) native "CanvasRenderingContext2D_putImageData_Callback";
+  putImageData_Callback_1_(mthis, __arg_0) => putImageData_Callback_1(mthis, __arg_0);
+
+  static putImageData_Callback_2(mthis, __arg_0, __arg_1) native "CanvasRenderingContext2D_putImageData_Callback";
+  putImageData_Callback_2_(mthis, __arg_0, __arg_1) => putImageData_Callback_2(mthis, __arg_0, __arg_1);
+
+  static putImageData_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "CanvasRenderingContext2D_putImageData_Callback";
+  putImageData_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => putImageData_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static putImageData_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "CanvasRenderingContext2D_putImageData_Callback";
+  putImageData_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => putImageData_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static putImageData_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "CanvasRenderingContext2D_putImageData_Callback";
+  putImageData_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => putImageData_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static putImageData_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "CanvasRenderingContext2D_putImageData_Callback";
+  putImageData_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => putImageData_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static putImageData_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) native "CanvasRenderingContext2D_putImageData_Callback";
+  putImageData_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => putImageData_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6);
+
+  static putImageData_Callback_8(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) native "CanvasRenderingContext2D_putImageData_Callback";
+  putImageData_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => putImageData_Callback_8(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7);
+
+  static putImageData_Callback_9(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) native "CanvasRenderingContext2D_putImageData_Callback";
+  putImageData_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => putImageData_Callback_9(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8);
+
+  static quadraticCurveTo_Callback_2(mthis, __arg_0, __arg_1) native "CanvasRenderingContext2D_quadraticCurveTo_Callback";
+  quadraticCurveTo_Callback_2_(mthis, __arg_0, __arg_1) => quadraticCurveTo_Callback_2(mthis, __arg_0, __arg_1);
+
+  static quadraticCurveTo_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "CanvasRenderingContext2D_quadraticCurveTo_Callback";
+  quadraticCurveTo_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => quadraticCurveTo_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static quadraticCurveTo_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "CanvasRenderingContext2D_quadraticCurveTo_Callback";
+  quadraticCurveTo_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => quadraticCurveTo_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static quadraticCurveTo_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "CanvasRenderingContext2D_quadraticCurveTo_Callback";
+  quadraticCurveTo_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => quadraticCurveTo_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static quadraticCurveTo_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "CanvasRenderingContext2D_quadraticCurveTo_Callback";
+  quadraticCurveTo_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => quadraticCurveTo_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static rect_Callback_2(mthis, __arg_0, __arg_1) native "CanvasRenderingContext2D_rect_Callback";
+  rect_Callback_2_(mthis, __arg_0, __arg_1) => rect_Callback_2(mthis, __arg_0, __arg_1);
+
+  static rect_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "CanvasRenderingContext2D_rect_Callback";
+  rect_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => rect_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static rect_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "CanvasRenderingContext2D_rect_Callback";
+  rect_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => rect_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static rect_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "CanvasRenderingContext2D_rect_Callback";
+  rect_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => rect_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static rect_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "CanvasRenderingContext2D_rect_Callback";
+  rect_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => rect_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static removeHitRegion_Callback_0(mthis) native "CanvasRenderingContext2D_removeHitRegion_Callback";
+  removeHitRegion_Callback_0_(mthis) => removeHitRegion_Callback_0(mthis);
+
+  static removeHitRegion_Callback_1(mthis, __arg_0) native "CanvasRenderingContext2D_removeHitRegion_Callback";
+  removeHitRegion_Callback_1_(mthis, __arg_0) => removeHitRegion_Callback_1(mthis, __arg_0);
+
+  static removeHitRegion_Callback_2(mthis, __arg_0, __arg_1) native "CanvasRenderingContext2D_removeHitRegion_Callback";
+  removeHitRegion_Callback_2_(mthis, __arg_0, __arg_1) => removeHitRegion_Callback_2(mthis, __arg_0, __arg_1);
+
+  static removeHitRegion_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "CanvasRenderingContext2D_removeHitRegion_Callback";
+  removeHitRegion_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => removeHitRegion_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static resetTransform_Callback_0(mthis) native "CanvasRenderingContext2D_resetTransform_Callback";
+  resetTransform_Callback_0_(mthis) => resetTransform_Callback_0(mthis);
+
+  static resetTransform_Callback_1(mthis, __arg_0) native "CanvasRenderingContext2D_resetTransform_Callback";
+  resetTransform_Callback_1_(mthis, __arg_0) => resetTransform_Callback_1(mthis, __arg_0);
+
+  static resetTransform_Callback_2(mthis, __arg_0, __arg_1) native "CanvasRenderingContext2D_resetTransform_Callback";
+  resetTransform_Callback_2_(mthis, __arg_0, __arg_1) => resetTransform_Callback_2(mthis, __arg_0, __arg_1);
+
+  static restore_Callback_0(mthis) native "CanvasRenderingContext2D_restore_Callback";
+  restore_Callback_0_(mthis) => restore_Callback_0(mthis);
+
+  static restore_Callback_1(mthis, __arg_0) native "CanvasRenderingContext2D_restore_Callback";
+  restore_Callback_1_(mthis, __arg_0) => restore_Callback_1(mthis, __arg_0);
+
+  static restore_Callback_2(mthis, __arg_0, __arg_1) native "CanvasRenderingContext2D_restore_Callback";
+  restore_Callback_2_(mthis, __arg_0, __arg_1) => restore_Callback_2(mthis, __arg_0, __arg_1);
+
+  static rotate_Callback_0(mthis) native "CanvasRenderingContext2D_rotate_Callback";
+  rotate_Callback_0_(mthis) => rotate_Callback_0(mthis);
+
+  static rotate_Callback_1(mthis, __arg_0) native "CanvasRenderingContext2D_rotate_Callback";
+  rotate_Callback_1_(mthis, __arg_0) => rotate_Callback_1(mthis, __arg_0);
+
+  static rotate_Callback_2(mthis, __arg_0, __arg_1) native "CanvasRenderingContext2D_rotate_Callback";
+  rotate_Callback_2_(mthis, __arg_0, __arg_1) => rotate_Callback_2(mthis, __arg_0, __arg_1);
+
+  static rotate_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "CanvasRenderingContext2D_rotate_Callback";
+  rotate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => rotate_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static save_Callback_0(mthis) native "CanvasRenderingContext2D_save_Callback";
+  save_Callback_0_(mthis) => save_Callback_0(mthis);
+
+  static save_Callback_1(mthis, __arg_0) native "CanvasRenderingContext2D_save_Callback";
+  save_Callback_1_(mthis, __arg_0) => save_Callback_1(mthis, __arg_0);
+
+  static save_Callback_2(mthis, __arg_0, __arg_1) native "CanvasRenderingContext2D_save_Callback";
+  save_Callback_2_(mthis, __arg_0, __arg_1) => save_Callback_2(mthis, __arg_0, __arg_1);
+
+  static scale_Callback_0(mthis) native "CanvasRenderingContext2D_scale_Callback";
+  scale_Callback_0_(mthis) => scale_Callback_0(mthis);
+
+  static scale_Callback_1(mthis, __arg_0) native "CanvasRenderingContext2D_scale_Callback";
+  scale_Callback_1_(mthis, __arg_0) => scale_Callback_1(mthis, __arg_0);
+
+  static scale_Callback_2(mthis, __arg_0, __arg_1) native "CanvasRenderingContext2D_scale_Callback";
+  scale_Callback_2_(mthis, __arg_0, __arg_1) => scale_Callback_2(mthis, __arg_0, __arg_1);
+
+  static scale_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "CanvasRenderingContext2D_scale_Callback";
+  scale_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => scale_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static scale_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "CanvasRenderingContext2D_scale_Callback";
+  scale_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => scale_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static scrollPathIntoView_Callback_0(mthis) native "CanvasRenderingContext2D_scrollPathIntoView_Callback";
+  scrollPathIntoView_Callback_0_(mthis) => scrollPathIntoView_Callback_0(mthis);
+
+  static scrollPathIntoView_Callback_1(mthis, __arg_0) native "CanvasRenderingContext2D_scrollPathIntoView_Callback";
+  scrollPathIntoView_Callback_1_(mthis, __arg_0) => scrollPathIntoView_Callback_1(mthis, __arg_0);
+
+  static scrollPathIntoView_Callback_2(mthis, __arg_0, __arg_1) native "CanvasRenderingContext2D_scrollPathIntoView_Callback";
+  scrollPathIntoView_Callback_2_(mthis, __arg_0, __arg_1) => scrollPathIntoView_Callback_2(mthis, __arg_0, __arg_1);
+
+  static scrollPathIntoView_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "CanvasRenderingContext2D_scrollPathIntoView_Callback";
+  scrollPathIntoView_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => scrollPathIntoView_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static setLineDash_Callback_0(mthis) native "CanvasRenderingContext2D_setLineDash_Callback";
+  setLineDash_Callback_0_(mthis) => setLineDash_Callback_0(mthis);
+
+  static setLineDash_Callback_1(mthis, __arg_0) native "CanvasRenderingContext2D_setLineDash_Callback";
+  setLineDash_Callback_1_(mthis, __arg_0) => setLineDash_Callback_1(mthis, __arg_0);
+
+  static setLineDash_Callback_2(mthis, __arg_0, __arg_1) native "CanvasRenderingContext2D_setLineDash_Callback";
+  setLineDash_Callback_2_(mthis, __arg_0, __arg_1) => setLineDash_Callback_2(mthis, __arg_0, __arg_1);
+
+  static setLineDash_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "CanvasRenderingContext2D_setLineDash_Callback";
+  setLineDash_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => setLineDash_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static setTransform_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "CanvasRenderingContext2D_setTransform_Callback";
+  setTransform_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => setTransform_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static setTransform_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "CanvasRenderingContext2D_setTransform_Callback";
+  setTransform_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => setTransform_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static setTransform_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "CanvasRenderingContext2D_setTransform_Callback";
+  setTransform_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => setTransform_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static setTransform_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) native "CanvasRenderingContext2D_setTransform_Callback";
+  setTransform_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => setTransform_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6);
+
+  static setTransform_Callback_8(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) native "CanvasRenderingContext2D_setTransform_Callback";
+  setTransform_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => setTransform_Callback_8(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7);
 
   static shadowBlur_Getter(mthis) native "CanvasRenderingContext2D_shadowBlur_Getter";
+  shadowBlur_Getter_(mthis) => shadowBlur_Getter(mthis);
 
-  static shadowBlur_Setter(mthis, value) native "CanvasRenderingContext2D_shadowBlur_Setter";
+  static shadowBlur_Setter(mthis, __arg_0) native "CanvasRenderingContext2D_shadowBlur_Setter";
+  shadowBlur_Setter_(mthis, __arg_0) => shadowBlur_Setter(mthis, __arg_0);
 
   static shadowColor_Getter(mthis) native "CanvasRenderingContext2D_shadowColor_Getter";
+  shadowColor_Getter_(mthis) => shadowColor_Getter(mthis);
 
-  static shadowColor_Setter(mthis, value) native "CanvasRenderingContext2D_shadowColor_Setter";
+  static shadowColor_Setter(mthis, __arg_0) native "CanvasRenderingContext2D_shadowColor_Setter";
+  shadowColor_Setter_(mthis, __arg_0) => shadowColor_Setter(mthis, __arg_0);
 
   static shadowOffsetX_Getter(mthis) native "CanvasRenderingContext2D_shadowOffsetX_Getter";
+  shadowOffsetX_Getter_(mthis) => shadowOffsetX_Getter(mthis);
 
-  static shadowOffsetX_Setter(mthis, value) native "CanvasRenderingContext2D_shadowOffsetX_Setter";
+  static shadowOffsetX_Setter(mthis, __arg_0) native "CanvasRenderingContext2D_shadowOffsetX_Setter";
+  shadowOffsetX_Setter_(mthis, __arg_0) => shadowOffsetX_Setter(mthis, __arg_0);
 
   static shadowOffsetY_Getter(mthis) native "CanvasRenderingContext2D_shadowOffsetY_Getter";
+  shadowOffsetY_Getter_(mthis) => shadowOffsetY_Getter(mthis);
 
-  static shadowOffsetY_Setter(mthis, value) native "CanvasRenderingContext2D_shadowOffsetY_Setter";
+  static shadowOffsetY_Setter(mthis, __arg_0) native "CanvasRenderingContext2D_shadowOffsetY_Setter";
+  shadowOffsetY_Setter_(mthis, __arg_0) => shadowOffsetY_Setter(mthis, __arg_0);
+
+  static strokeRect_Callback_2(mthis, __arg_0, __arg_1) native "CanvasRenderingContext2D_strokeRect_Callback";
+  strokeRect_Callback_2_(mthis, __arg_0, __arg_1) => strokeRect_Callback_2(mthis, __arg_0, __arg_1);
+
+  static strokeRect_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "CanvasRenderingContext2D_strokeRect_Callback";
+  strokeRect_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => strokeRect_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static strokeRect_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "CanvasRenderingContext2D_strokeRect_Callback";
+  strokeRect_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => strokeRect_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static strokeRect_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "CanvasRenderingContext2D_strokeRect_Callback";
+  strokeRect_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => strokeRect_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static strokeRect_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "CanvasRenderingContext2D_strokeRect_Callback";
+  strokeRect_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => strokeRect_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
 
   static strokeStyle_Getter(mthis) native "CanvasRenderingContext2D_strokeStyle_Getter";
+  strokeStyle_Getter_(mthis) => strokeStyle_Getter(mthis);
 
-  static strokeStyle_Setter(mthis, value) native "CanvasRenderingContext2D_strokeStyle_Setter";
+  static strokeStyle_Setter(mthis, __arg_0) native "CanvasRenderingContext2D_strokeStyle_Setter";
+  strokeStyle_Setter_(mthis, __arg_0) => strokeStyle_Setter(mthis, __arg_0);
+
+  static strokeText_Callback_1(mthis, __arg_0) native "CanvasRenderingContext2D_strokeText_Callback";
+  strokeText_Callback_1_(mthis, __arg_0) => strokeText_Callback_1(mthis, __arg_0);
+
+  static strokeText_Callback_2(mthis, __arg_0, __arg_1) native "CanvasRenderingContext2D_strokeText_Callback";
+  strokeText_Callback_2_(mthis, __arg_0, __arg_1) => strokeText_Callback_2(mthis, __arg_0, __arg_1);
+
+  static strokeText_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "CanvasRenderingContext2D_strokeText_Callback";
+  strokeText_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => strokeText_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static strokeText_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "CanvasRenderingContext2D_strokeText_Callback";
+  strokeText_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => strokeText_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static strokeText_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "CanvasRenderingContext2D_strokeText_Callback";
+  strokeText_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => strokeText_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static strokeText_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "CanvasRenderingContext2D_strokeText_Callback";
+  strokeText_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => strokeText_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static stroke_Callback_0(mthis) native "CanvasRenderingContext2D_stroke_Callback";
+  stroke_Callback_0_(mthis) => stroke_Callback_0(mthis);
+
+  static stroke_Callback_1(mthis, __arg_0) native "CanvasRenderingContext2D_stroke_Callback";
+  stroke_Callback_1_(mthis, __arg_0) => stroke_Callback_1(mthis, __arg_0);
+
+  static stroke_Callback_2(mthis, __arg_0, __arg_1) native "CanvasRenderingContext2D_stroke_Callback";
+  stroke_Callback_2_(mthis, __arg_0, __arg_1) => stroke_Callback_2(mthis, __arg_0, __arg_1);
+
+  static stroke_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "CanvasRenderingContext2D_stroke_Callback";
+  stroke_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => stroke_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
   static textAlign_Getter(mthis) native "CanvasRenderingContext2D_textAlign_Getter";
+  textAlign_Getter_(mthis) => textAlign_Getter(mthis);
 
-  static textAlign_Setter(mthis, value) native "CanvasRenderingContext2D_textAlign_Setter";
+  static textAlign_Setter(mthis, __arg_0) native "CanvasRenderingContext2D_textAlign_Setter";
+  textAlign_Setter_(mthis, __arg_0) => textAlign_Setter(mthis, __arg_0);
 
   static textBaseline_Getter(mthis) native "CanvasRenderingContext2D_textBaseline_Getter";
+  textBaseline_Getter_(mthis) => textBaseline_Getter(mthis);
 
-  static textBaseline_Setter(mthis, value) native "CanvasRenderingContext2D_textBaseline_Setter";
+  static textBaseline_Setter(mthis, __arg_0) native "CanvasRenderingContext2D_textBaseline_Setter";
+  textBaseline_Setter_(mthis, __arg_0) => textBaseline_Setter(mthis, __arg_0);
 
-  static addHitRegion_Callback_1(mthis, options) native "CanvasRenderingContext2D_addHitRegion_Callback";
+  static transform_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "CanvasRenderingContext2D_transform_Callback";
+  transform_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => transform_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
 
-  static addHitRegion_Callback(mthis) native "CanvasRenderingContext2D_addHitRegion_Callback";
+  static transform_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "CanvasRenderingContext2D_transform_Callback";
+  transform_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => transform_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
 
-  static beginPath_Callback(mthis) native "CanvasRenderingContext2D_beginPath_Callback";
+  static transform_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "CanvasRenderingContext2D_transform_Callback";
+  transform_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => transform_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
 
-  static clearHitRegions_Callback(mthis) native "CanvasRenderingContext2D_clearHitRegions_Callback";
+  static transform_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) native "CanvasRenderingContext2D_transform_Callback";
+  transform_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => transform_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6);
 
-  static clearRect_Callback_4(mthis, x, y, width, height) native "CanvasRenderingContext2D_clearRect_Callback";
+  static transform_Callback_8(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) native "CanvasRenderingContext2D_transform_Callback";
+  transform_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => transform_Callback_8(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7);
 
-  static clip_Callback(mthis) native "CanvasRenderingContext2D_clip_Callback";
+  static translate_Callback_0(mthis) native "CanvasRenderingContext2D_translate_Callback";
+  translate_Callback_0_(mthis) => translate_Callback_0(mthis);
 
-  static clip_Callback_1(mthis, path_OR_winding) native "CanvasRenderingContext2D_clip_Callback";
+  static translate_Callback_1(mthis, __arg_0) native "CanvasRenderingContext2D_translate_Callback";
+  translate_Callback_1_(mthis, __arg_0) => translate_Callback_1(mthis, __arg_0);
 
-  static clip_Callback_2(mthis, path_OR_winding, winding) native "CanvasRenderingContext2D_clip_Callback";
+  static translate_Callback_2(mthis, __arg_0, __arg_1) native "CanvasRenderingContext2D_translate_Callback";
+  translate_Callback_2_(mthis, __arg_0, __arg_1) => translate_Callback_2(mthis, __arg_0, __arg_1);
 
-  static createImageData_Callback_2(mthis, sw, sh) native "CanvasRenderingContext2D_createImageData_Callback";
+  static translate_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "CanvasRenderingContext2D_translate_Callback";
+  translate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => translate_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
-  static createImageData_Callback_1(mthis, imagedata) native "CanvasRenderingContext2D_createImageData_Callback";
+  static translate_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "CanvasRenderingContext2D_translate_Callback";
+  translate_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => translate_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
 
-  static createLinearGradient_Callback_4(mthis, x0, y0, x1, y1) native "CanvasRenderingContext2D_createLinearGradient_Callback";
-
-  static createPattern_Callback_2(mthis, canvas_OR_image, repetitionType) native "CanvasRenderingContext2D_createPattern_Callback";
-
-  static createRadialGradient_Callback_6(mthis, x0, y0, r0, x1, y1, r1) native "CanvasRenderingContext2D_createRadialGradient_Callback";
-
-  static drawFocusIfNeeded_Callback_1(mthis, element_OR_path) native "CanvasRenderingContext2D_drawFocusIfNeeded_Callback";
-
-  static drawFocusIfNeeded_Callback_2(mthis, element_OR_path, element) native "CanvasRenderingContext2D_drawFocusIfNeeded_Callback";
-
-  static drawImage_Callback_3(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y) native "CanvasRenderingContext2D_drawImage_Callback";
-
-  static drawImage_Callback_5(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh) native "CanvasRenderingContext2D_drawImage_Callback";
-
-  static drawImage_Callback_9(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) native "CanvasRenderingContext2D_drawImage_Callback";
-
-  static fill_Callback(mthis) native "CanvasRenderingContext2D_fill_Callback";
-
-  static fill_Callback_1(mthis, path_OR_winding) native "CanvasRenderingContext2D_fill_Callback";
-
-  static fill_Callback_2(mthis, path_OR_winding, winding) native "CanvasRenderingContext2D_fill_Callback";
-
-  static fillRect_Callback_4(mthis, x, y, width, height) native "CanvasRenderingContext2D_fillRect_Callback";
-
-  static fillText_Callback_4(mthis, text, x, y, maxWidth) native "CanvasRenderingContext2D_fillText_Callback";
-
-  static fillText_Callback_3(mthis, text, x, y) native "CanvasRenderingContext2D_fillText_Callback";
-
-  static getContextAttributes_Callback(mthis) native "CanvasRenderingContext2D_getContextAttributes_Callback";
-
-  static getImageData_Callback_4(mthis, sx, sy, sw, sh) native "CanvasRenderingContext2D_getImageData_Callback";
-
-  static getLineDash_Callback(mthis) native "CanvasRenderingContext2D_getLineDash_Callback";
-
-  static isContextLost_Callback(mthis) native "CanvasRenderingContext2D_isContextLost_Callback";
-
-  static isPointInPath_Callback_2(mthis, path_OR_x, x_OR_y) native "CanvasRenderingContext2D_isPointInPath_Callback";
-
-  static isPointInPath_Callback_3(mthis, path_OR_x, x_OR_y, winding_OR_y) native "CanvasRenderingContext2D_isPointInPath_Callback";
-
-  static isPointInPath_Callback_4(mthis, path_OR_x, x_OR_y, winding_OR_y, winding) native "CanvasRenderingContext2D_isPointInPath_Callback";
-
-  static isPointInStroke_Callback_2(mthis, path_OR_x, x_OR_y) native "CanvasRenderingContext2D_isPointInStroke_Callback";
-
-  static isPointInStroke_Callback_3(mthis, path_OR_x, x_OR_y, y) native "CanvasRenderingContext2D_isPointInStroke_Callback";
-
-  static measureText_Callback_1(mthis, text) native "CanvasRenderingContext2D_measureText_Callback";
-
-  static putImageData_Callback_3(mthis, imagedata, dx, dy) native "CanvasRenderingContext2D_putImageData_Callback";
-
-  static putImageData_Callback_7(mthis, imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight) native "CanvasRenderingContext2D_putImageData_Callback";
-
-  static removeHitRegion_Callback_1(mthis, id) native "CanvasRenderingContext2D_removeHitRegion_Callback";
-
-  static resetTransform_Callback(mthis) native "CanvasRenderingContext2D_resetTransform_Callback";
-
-  static restore_Callback(mthis) native "CanvasRenderingContext2D_restore_Callback";
-
-  static rotate_Callback_1(mthis, angle) native "CanvasRenderingContext2D_rotate_Callback";
-
-  static save_Callback(mthis) native "CanvasRenderingContext2D_save_Callback";
-
-  static scale_Callback_2(mthis, x, y) native "CanvasRenderingContext2D_scale_Callback";
-
-  static scrollPathIntoView_Callback_1(mthis, path) native "CanvasRenderingContext2D_scrollPathIntoView_Callback";
-
-  static scrollPathIntoView_Callback(mthis) native "CanvasRenderingContext2D_scrollPathIntoView_Callback";
-
-  static setLineDash_Callback_1(mthis, dash) native "CanvasRenderingContext2D_setLineDash_Callback";
-
-  static setTransform_Callback_6(mthis, a, b, c, d, e, f) native "CanvasRenderingContext2D_setTransform_Callback";
-
-  static stroke_Callback(mthis) native "CanvasRenderingContext2D_stroke_Callback";
-
-  static stroke_Callback_1(mthis, path) native "CanvasRenderingContext2D_stroke_Callback";
-
-  static strokeRect_Callback_4(mthis, x, y, width, height) native "CanvasRenderingContext2D_strokeRect_Callback";
-
-  static strokeText_Callback_4(mthis, text, x, y, maxWidth) native "CanvasRenderingContext2D_strokeText_Callback";
-
-  static strokeText_Callback_3(mthis, text, x, y) native "CanvasRenderingContext2D_strokeText_Callback";
-
-  static transform_Callback_6(mthis, a, b, c, d, e, f) native "CanvasRenderingContext2D_transform_Callback";
-
-  static translate_Callback_2(mthis, x, y) native "CanvasRenderingContext2D_translate_Callback";
-
-  static arc_Callback_6(mthis, x, y, radius, startAngle, endAngle, anticlockwise) native "CanvasRenderingContext2D_arc_Callback";
-
-  static arcTo_Callback_5(mthis, x1, y1, x2, y2, radius) native "CanvasRenderingContext2D_arcTo_Callback";
-
-  static bezierCurveTo_Callback_6(mthis, cp1x, cp1y, cp2x, cp2y, x, y) native "CanvasRenderingContext2D_bezierCurveTo_Callback";
-
-  static closePath_Callback(mthis) native "CanvasRenderingContext2D_closePath_Callback";
-
-  static ellipse_Callback_8(mthis, x, y, radiusX, radiusY, rotation, startAngle, endAngle, anticlockwise) native "CanvasRenderingContext2D_ellipse_Callback";
-
-  static lineTo_Callback_2(mthis, x, y) native "CanvasRenderingContext2D_lineTo_Callback";
-
-  static moveTo_Callback_2(mthis, x, y) native "CanvasRenderingContext2D_moveTo_Callback";
-
-  static quadraticCurveTo_Callback_4(mthis, cpx, cpy, x, y) native "CanvasRenderingContext2D_quadraticCurveTo_Callback";
-
-  static rect_Callback_4(mthis, x, y, width, height) native "CanvasRenderingContext2D_rect_Callback";
 }
 
-class BlinkChannelMergerNode {}
+class BlinkChannelMergerNode extends BlinkAudioNode {
+  static final instance = new BlinkChannelMergerNode();
 
-class BlinkChannelSplitterNode {}
-
-class BlinkGeofencingRegion {
-  static id_Getter(mthis) native "GeofencingRegion_id_Getter";
 }
 
-class BlinkCircularRegion {
-  static constructorCallback_1(init) native "CircularRegion_constructorCallback";
+class BlinkChannelSplitterNode extends BlinkAudioNode {
+  static final instance = new BlinkChannelSplitterNode();
+
+}
+
+class BlinkCharacterData extends BlinkNode {
+  static final instance = new BlinkCharacterData();
+
+  static appendData_Callback_0(mthis) native "CharacterData_appendData_Callback";
+  appendData_Callback_0_(mthis) => appendData_Callback_0(mthis);
+
+  static appendData_Callback_1(mthis, __arg_0) native "CharacterData_appendData_Callback";
+  appendData_Callback_1_(mthis, __arg_0) => appendData_Callback_1(mthis, __arg_0);
+
+  static appendData_Callback_2(mthis, __arg_0, __arg_1) native "CharacterData_appendData_Callback";
+  appendData_Callback_2_(mthis, __arg_0, __arg_1) => appendData_Callback_2(mthis, __arg_0, __arg_1);
+
+  static appendData_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "CharacterData_appendData_Callback";
+  appendData_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => appendData_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static data_Getter(mthis) native "CharacterData_data_Getter";
+  data_Getter_(mthis) => data_Getter(mthis);
+
+  static data_Setter(mthis, __arg_0) native "CharacterData_data_Setter";
+  data_Setter_(mthis, __arg_0) => data_Setter(mthis, __arg_0);
+
+  static deleteData_Callback_0(mthis) native "CharacterData_deleteData_Callback";
+  deleteData_Callback_0_(mthis) => deleteData_Callback_0(mthis);
+
+  static deleteData_Callback_1(mthis, __arg_0) native "CharacterData_deleteData_Callback";
+  deleteData_Callback_1_(mthis, __arg_0) => deleteData_Callback_1(mthis, __arg_0);
+
+  static deleteData_Callback_2(mthis, __arg_0, __arg_1) native "CharacterData_deleteData_Callback";
+  deleteData_Callback_2_(mthis, __arg_0, __arg_1) => deleteData_Callback_2(mthis, __arg_0, __arg_1);
+
+  static deleteData_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "CharacterData_deleteData_Callback";
+  deleteData_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => deleteData_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static deleteData_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "CharacterData_deleteData_Callback";
+  deleteData_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => deleteData_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static insertData_Callback_0(mthis) native "CharacterData_insertData_Callback";
+  insertData_Callback_0_(mthis) => insertData_Callback_0(mthis);
+
+  static insertData_Callback_1(mthis, __arg_0) native "CharacterData_insertData_Callback";
+  insertData_Callback_1_(mthis, __arg_0) => insertData_Callback_1(mthis, __arg_0);
+
+  static insertData_Callback_2(mthis, __arg_0, __arg_1) native "CharacterData_insertData_Callback";
+  insertData_Callback_2_(mthis, __arg_0, __arg_1) => insertData_Callback_2(mthis, __arg_0, __arg_1);
+
+  static insertData_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "CharacterData_insertData_Callback";
+  insertData_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => insertData_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static insertData_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "CharacterData_insertData_Callback";
+  insertData_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => insertData_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static length_Getter(mthis) native "CharacterData_length_Getter";
+  length_Getter_(mthis) => length_Getter(mthis);
+
+  static nextElementSibling_Getter(mthis) native "CharacterData_nextElementSibling_Getter";
+  nextElementSibling_Getter_(mthis) => nextElementSibling_Getter(mthis);
+
+  static previousElementSibling_Getter(mthis) native "CharacterData_previousElementSibling_Getter";
+  previousElementSibling_Getter_(mthis) => previousElementSibling_Getter(mthis);
+
+  static replaceData_Callback_1(mthis, __arg_0) native "CharacterData_replaceData_Callback";
+  replaceData_Callback_1_(mthis, __arg_0) => replaceData_Callback_1(mthis, __arg_0);
+
+  static replaceData_Callback_2(mthis, __arg_0, __arg_1) native "CharacterData_replaceData_Callback";
+  replaceData_Callback_2_(mthis, __arg_0, __arg_1) => replaceData_Callback_2(mthis, __arg_0, __arg_1);
+
+  static replaceData_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "CharacterData_replaceData_Callback";
+  replaceData_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => replaceData_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static replaceData_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "CharacterData_replaceData_Callback";
+  replaceData_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => replaceData_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static replaceData_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "CharacterData_replaceData_Callback";
+  replaceData_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => replaceData_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static substringData_Callback_0(mthis) native "CharacterData_substringData_Callback";
+  substringData_Callback_0_(mthis) => substringData_Callback_0(mthis);
+
+  static substringData_Callback_1(mthis, __arg_0) native "CharacterData_substringData_Callback";
+  substringData_Callback_1_(mthis, __arg_0) => substringData_Callback_1(mthis, __arg_0);
+
+  static substringData_Callback_2(mthis, __arg_0, __arg_1) native "CharacterData_substringData_Callback";
+  substringData_Callback_2_(mthis, __arg_0, __arg_1) => substringData_Callback_2(mthis, __arg_0, __arg_1);
+
+  static substringData_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "CharacterData_substringData_Callback";
+  substringData_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => substringData_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static substringData_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "CharacterData_substringData_Callback";
+  substringData_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => substringData_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+}
+
+class BlinkCircularRegion extends BlinkGeofencingRegion {
+  static final instance = new BlinkCircularRegion();
+
+  static constructorCallback_0() native "CircularRegion_constructorCallback";
+  constructorCallback_0_() => constructorCallback_0();
+
+  static constructorCallback_1(__arg_0) native "CircularRegion_constructorCallback";
+  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+
+  static constructorCallback_2(__arg_0, __arg_1) native "CircularRegion_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+
+  static constructorCallback_3(__arg_0, __arg_1, __arg_2) native "CircularRegion_constructorCallback";
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => constructorCallback_3(__arg_0, __arg_1, __arg_2);
 
   static latitude_Getter(mthis) native "CircularRegion_latitude_Getter";
+  latitude_Getter_(mthis) => latitude_Getter(mthis);
 
   static longitude_Getter(mthis) native "CircularRegion_longitude_Getter";
+  longitude_Getter_(mthis) => longitude_Getter(mthis);
 
   static radius_Getter(mthis) native "CircularRegion_radius_Getter";
+  radius_Getter_(mthis) => radius_Getter(mthis);
+
 }
 
 class BlinkClientRect {
+  static final instance = new BlinkClientRect();
+
   static bottom_Getter(mthis) native "ClientRect_bottom_Getter";
+  bottom_Getter_(mthis) => bottom_Getter(mthis);
 
   static height_Getter(mthis) native "ClientRect_height_Getter";
+  height_Getter_(mthis) => height_Getter(mthis);
 
   static left_Getter(mthis) native "ClientRect_left_Getter";
+  left_Getter_(mthis) => left_Getter(mthis);
 
   static right_Getter(mthis) native "ClientRect_right_Getter";
+  right_Getter_(mthis) => right_Getter(mthis);
 
   static top_Getter(mthis) native "ClientRect_top_Getter";
+  top_Getter_(mthis) => top_Getter(mthis);
 
   static width_Getter(mthis) native "ClientRect_width_Getter";
+  width_Getter_(mthis) => width_Getter(mthis);
+
 }
 
 class BlinkClientRectList {
-  static length_Getter(mthis) native "ClientRectList_length_Getter";
+  static final instance = new BlinkClientRectList();
 
-  static item_Callback_1(mthis, index) native "ClientRectList_item_Callback";
+  static $__getter___Callback_1(mthis, __arg_0) native "ClientRectList___getter___Callback";
+  $__getter___Callback_1_(mthis, __arg_0) => $__getter___Callback_1(mthis, __arg_0);
+
+  static item_Callback_0(mthis) native "ClientRectList_item_Callback";
+  item_Callback_0_(mthis) => item_Callback_0(mthis);
+
+  static item_Callback_1(mthis, __arg_0) native "ClientRectList_item_Callback";
+  item_Callback_1_(mthis, __arg_0) => item_Callback_1(mthis, __arg_0);
+
+  static item_Callback_2(mthis, __arg_0, __arg_1) native "ClientRectList_item_Callback";
+  item_Callback_2_(mthis, __arg_0, __arg_1) => item_Callback_2(mthis, __arg_0, __arg_1);
+
+  static item_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "ClientRectList_item_Callback";
+  item_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => item_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static length_Getter(mthis) native "ClientRectList_length_Getter";
+  length_Getter_(mthis) => length_Getter(mthis);
+
 }
 
-class BlinkCloseEvent {
-  static constructorCallback(type, options) native "CloseEvent_constructorCallback";
+class BlinkCloseEvent extends BlinkEvent {
+  static final instance = new BlinkCloseEvent();
 
   static code_Getter(mthis) native "CloseEvent_code_Getter";
+  code_Getter_(mthis) => code_Getter(mthis);
+
+  static constructorCallback_2(__arg_0, __arg_1) native "CloseEvent_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
 
   static reason_Getter(mthis) native "CloseEvent_reason_Getter";
+  reason_Getter_(mthis) => reason_Getter(mthis);
 
   static wasClean_Getter(mthis) native "CloseEvent_wasClean_Getter";
+  wasClean_Getter_(mthis) => wasClean_Getter(mthis);
+
 }
 
-class BlinkComment {
-  static constructorCallback_1(data) native "Comment_constructorCallback";
+class BlinkComment extends BlinkCharacterData {
+  static final instance = new BlinkComment();
 
-  static constructorCallback() native "Comment_constructorCallback";
+  static constructorCallback_0() native "Comment_constructorCallback";
+  constructorCallback_0_() => constructorCallback_0();
+
+  static constructorCallback_1(__arg_0) native "Comment_constructorCallback";
+  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+
+  static constructorCallback_2(__arg_0, __arg_1) native "Comment_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+
+  static constructorCallback_3(__arg_0, __arg_1, __arg_2) native "Comment_constructorCallback";
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => constructorCallback_3(__arg_0, __arg_1, __arg_2);
+
 }
 
-class BlinkUIEvent {
-  static constructorCallback(type, options) native "UIEvent_constructorCallback";
-
-  static charCode_Getter(mthis) native "UIEvent_charCode_Getter";
-
-  static detail_Getter(mthis) native "UIEvent_detail_Getter";
-
-  static keyCode_Getter(mthis) native "UIEvent_keyCode_Getter";
-
-  static layerX_Getter(mthis) native "UIEvent_layerX_Getter";
-
-  static layerY_Getter(mthis) native "UIEvent_layerY_Getter";
-
-  static pageX_Getter(mthis) native "UIEvent_pageX_Getter";
-
-  static pageY_Getter(mthis) native "UIEvent_pageY_Getter";
-
-  static view_Getter(mthis) native "UIEvent_view_Getter";
-
-  static which_Getter(mthis) native "UIEvent_which_Getter";
-
-  static initUIEvent_Callback_5(mthis, type, canBubble, cancelable, view, detail) native "UIEvent_initUIEvent_Callback";
-}
-
-class BlinkCompositionEvent {
-  static constructorCallback(type, options) native "CompositionEvent_constructorCallback";
+class BlinkCompositionEvent extends BlinkUIEvent {
+  static final instance = new BlinkCompositionEvent();
 
   static activeSegmentEnd_Getter(mthis) native "CompositionEvent_activeSegmentEnd_Getter";
+  activeSegmentEnd_Getter_(mthis) => activeSegmentEnd_Getter(mthis);
 
   static activeSegmentStart_Getter(mthis) native "CompositionEvent_activeSegmentStart_Getter";
+  activeSegmentStart_Getter_(mthis) => activeSegmentStart_Getter(mthis);
+
+  static constructorCallback_2(__arg_0, __arg_1) native "CompositionEvent_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
 
   static data_Getter(mthis) native "CompositionEvent_data_Getter";
+  data_Getter_(mthis) => data_Getter(mthis);
 
-  static getSegments_Callback(mthis) native "CompositionEvent_getSegments_Callback";
+  static getSegments_Callback_0(mthis) native "CompositionEvent_getSegments_Callback";
+  getSegments_Callback_0_(mthis) => getSegments_Callback_0(mthis);
 
-  static initCompositionEvent_Callback_5(mthis, typeArg, canBubbleArg, cancelableArg, viewArg, dataArg) native "CompositionEvent_initCompositionEvent_Callback";
+  static getSegments_Callback_1(mthis, __arg_0) native "CompositionEvent_getSegments_Callback";
+  getSegments_Callback_1_(mthis, __arg_0) => getSegments_Callback_1(mthis, __arg_0);
+
+  static getSegments_Callback_2(mthis, __arg_0, __arg_1) native "CompositionEvent_getSegments_Callback";
+  getSegments_Callback_2_(mthis, __arg_0, __arg_1) => getSegments_Callback_2(mthis, __arg_0, __arg_1);
+
+  static initCompositionEvent_Callback_0(mthis) native "CompositionEvent_initCompositionEvent_Callback";
+  initCompositionEvent_Callback_0_(mthis) => initCompositionEvent_Callback_0(mthis);
+
+  static initCompositionEvent_Callback_1(mthis, __arg_0) native "CompositionEvent_initCompositionEvent_Callback";
+  initCompositionEvent_Callback_1_(mthis, __arg_0) => initCompositionEvent_Callback_1(mthis, __arg_0);
+
+  static initCompositionEvent_Callback_2(mthis, __arg_0, __arg_1) native "CompositionEvent_initCompositionEvent_Callback";
+  initCompositionEvent_Callback_2_(mthis, __arg_0, __arg_1) => initCompositionEvent_Callback_2(mthis, __arg_0, __arg_1);
+
+  static initCompositionEvent_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "CompositionEvent_initCompositionEvent_Callback";
+  initCompositionEvent_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => initCompositionEvent_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static initCompositionEvent_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "CompositionEvent_initCompositionEvent_Callback";
+  initCompositionEvent_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => initCompositionEvent_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static initCompositionEvent_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "CompositionEvent_initCompositionEvent_Callback";
+  initCompositionEvent_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => initCompositionEvent_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static initCompositionEvent_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "CompositionEvent_initCompositionEvent_Callback";
+  initCompositionEvent_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => initCompositionEvent_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static initCompositionEvent_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) native "CompositionEvent_initCompositionEvent_Callback";
+  initCompositionEvent_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => initCompositionEvent_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6);
+
+}
+
+class BlinkConsole extends BlinkConsoleBase {
+  static final instance = new BlinkConsole();
+
+  static memory_Getter(mthis) native "Console_memory_Getter";
+  memory_Getter_(mthis) => memory_Getter(mthis);
+
 }
 
 class BlinkConsoleBase {
-  static assert_Callback_2(mthis, condition, arg) native "ConsoleBase_assert_Callback";
+  static final instance = new BlinkConsoleBase();
 
-  static clear_Callback_1(mthis, arg) native "ConsoleBase_clear_Callback";
+  static assert_Callback_0(mthis) native "ConsoleBase_assert_Callback";
+  assert_Callback_0_(mthis) => assert_Callback_0(mthis);
 
-  static count_Callback_1(mthis, arg) native "ConsoleBase_count_Callback";
+  static assert_Callback_1(mthis, __arg_0) native "ConsoleBase_assert_Callback";
+  assert_Callback_1_(mthis, __arg_0) => assert_Callback_1(mthis, __arg_0);
 
-  static debug_Callback_1(mthis, arg) native "ConsoleBase_debug_Callback";
+  static assert_Callback_2(mthis, __arg_0, __arg_1) native "ConsoleBase_assert_Callback";
+  assert_Callback_2_(mthis, __arg_0, __arg_1) => assert_Callback_2(mthis, __arg_0, __arg_1);
 
-  static dir_Callback_1(mthis, arg) native "ConsoleBase_dir_Callback";
+  static assert_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "ConsoleBase_assert_Callback";
+  assert_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => assert_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
-  static dirxml_Callback_1(mthis, arg) native "ConsoleBase_dirxml_Callback";
+  static clear_Callback_0(mthis) native "ConsoleBase_clear_Callback";
+  clear_Callback_0_(mthis) => clear_Callback_0(mthis);
 
-  static error_Callback_1(mthis, arg) native "ConsoleBase_error_Callback";
+  static clear_Callback_1(mthis, __arg_0) native "ConsoleBase_clear_Callback";
+  clear_Callback_1_(mthis, __arg_0) => clear_Callback_1(mthis, __arg_0);
 
-  static group_Callback_1(mthis, arg) native "ConsoleBase_group_Callback";
+  static clear_Callback_2(mthis, __arg_0, __arg_1) native "ConsoleBase_clear_Callback";
+  clear_Callback_2_(mthis, __arg_0, __arg_1) => clear_Callback_2(mthis, __arg_0, __arg_1);
 
-  static groupCollapsed_Callback_1(mthis, arg) native "ConsoleBase_groupCollapsed_Callback";
+  static count_Callback_0(mthis) native "ConsoleBase_count_Callback";
+  count_Callback_0_(mthis) => count_Callback_0(mthis);
 
-  static groupEnd_Callback(mthis) native "ConsoleBase_groupEnd_Callback";
+  static count_Callback_1(mthis, __arg_0) native "ConsoleBase_count_Callback";
+  count_Callback_1_(mthis, __arg_0) => count_Callback_1(mthis, __arg_0);
 
-  static info_Callback_1(mthis, arg) native "ConsoleBase_info_Callback";
+  static count_Callback_2(mthis, __arg_0, __arg_1) native "ConsoleBase_count_Callback";
+  count_Callback_2_(mthis, __arg_0, __arg_1) => count_Callback_2(mthis, __arg_0, __arg_1);
 
-  static log_Callback_1(mthis, arg) native "ConsoleBase_log_Callback";
+  static debug_Callback_0(mthis) native "ConsoleBase_debug_Callback";
+  debug_Callback_0_(mthis) => debug_Callback_0(mthis);
 
-  static markTimeline_Callback_1(mthis, title) native "ConsoleBase_markTimeline_Callback";
+  static debug_Callback_1(mthis, __arg_0) native "ConsoleBase_debug_Callback";
+  debug_Callback_1_(mthis, __arg_0) => debug_Callback_1(mthis, __arg_0);
 
-  static profile_Callback_1(mthis, title) native "ConsoleBase_profile_Callback";
+  static debug_Callback_2(mthis, __arg_0, __arg_1) native "ConsoleBase_debug_Callback";
+  debug_Callback_2_(mthis, __arg_0, __arg_1) => debug_Callback_2(mthis, __arg_0, __arg_1);
 
-  static profileEnd_Callback_1(mthis, title) native "ConsoleBase_profileEnd_Callback";
+  static dir_Callback_0(mthis) native "ConsoleBase_dir_Callback";
+  dir_Callback_0_(mthis) => dir_Callback_0(mthis);
 
-  static table_Callback_1(mthis, arg) native "ConsoleBase_table_Callback";
+  static dir_Callback_1(mthis, __arg_0) native "ConsoleBase_dir_Callback";
+  dir_Callback_1_(mthis, __arg_0) => dir_Callback_1(mthis, __arg_0);
 
-  static time_Callback_1(mthis, title) native "ConsoleBase_time_Callback";
+  static dir_Callback_2(mthis, __arg_0, __arg_1) native "ConsoleBase_dir_Callback";
+  dir_Callback_2_(mthis, __arg_0, __arg_1) => dir_Callback_2(mthis, __arg_0, __arg_1);
 
-  static timeEnd_Callback_1(mthis, title) native "ConsoleBase_timeEnd_Callback";
+  static dirxml_Callback_0(mthis) native "ConsoleBase_dirxml_Callback";
+  dirxml_Callback_0_(mthis) => dirxml_Callback_0(mthis);
 
-  static timeStamp_Callback_1(mthis, title) native "ConsoleBase_timeStamp_Callback";
+  static dirxml_Callback_1(mthis, __arg_0) native "ConsoleBase_dirxml_Callback";
+  dirxml_Callback_1_(mthis, __arg_0) => dirxml_Callback_1(mthis, __arg_0);
 
-  static timeline_Callback_1(mthis, title) native "ConsoleBase_timeline_Callback";
+  static dirxml_Callback_2(mthis, __arg_0, __arg_1) native "ConsoleBase_dirxml_Callback";
+  dirxml_Callback_2_(mthis, __arg_0, __arg_1) => dirxml_Callback_2(mthis, __arg_0, __arg_1);
 
-  static timelineEnd_Callback_1(mthis, title) native "ConsoleBase_timelineEnd_Callback";
+  static error_Callback_0(mthis) native "ConsoleBase_error_Callback";
+  error_Callback_0_(mthis) => error_Callback_0(mthis);
 
-  static trace_Callback_1(mthis, arg) native "ConsoleBase_trace_Callback";
+  static error_Callback_1(mthis, __arg_0) native "ConsoleBase_error_Callback";
+  error_Callback_1_(mthis, __arg_0) => error_Callback_1(mthis, __arg_0);
 
-  static warn_Callback_1(mthis, arg) native "ConsoleBase_warn_Callback";
+  static error_Callback_2(mthis, __arg_0, __arg_1) native "ConsoleBase_error_Callback";
+  error_Callback_2_(mthis, __arg_0, __arg_1) => error_Callback_2(mthis, __arg_0, __arg_1);
+
+  static groupCollapsed_Callback_0(mthis) native "ConsoleBase_groupCollapsed_Callback";
+  groupCollapsed_Callback_0_(mthis) => groupCollapsed_Callback_0(mthis);
+
+  static groupCollapsed_Callback_1(mthis, __arg_0) native "ConsoleBase_groupCollapsed_Callback";
+  groupCollapsed_Callback_1_(mthis, __arg_0) => groupCollapsed_Callback_1(mthis, __arg_0);
+
+  static groupCollapsed_Callback_2(mthis, __arg_0, __arg_1) native "ConsoleBase_groupCollapsed_Callback";
+  groupCollapsed_Callback_2_(mthis, __arg_0, __arg_1) => groupCollapsed_Callback_2(mthis, __arg_0, __arg_1);
+
+  static groupEnd_Callback_0(mthis) native "ConsoleBase_groupEnd_Callback";
+  groupEnd_Callback_0_(mthis) => groupEnd_Callback_0(mthis);
+
+  static groupEnd_Callback_1(mthis, __arg_0) native "ConsoleBase_groupEnd_Callback";
+  groupEnd_Callback_1_(mthis, __arg_0) => groupEnd_Callback_1(mthis, __arg_0);
+
+  static groupEnd_Callback_2(mthis, __arg_0, __arg_1) native "ConsoleBase_groupEnd_Callback";
+  groupEnd_Callback_2_(mthis, __arg_0, __arg_1) => groupEnd_Callback_2(mthis, __arg_0, __arg_1);
+
+  static group_Callback_0(mthis) native "ConsoleBase_group_Callback";
+  group_Callback_0_(mthis) => group_Callback_0(mthis);
+
+  static group_Callback_1(mthis, __arg_0) native "ConsoleBase_group_Callback";
+  group_Callback_1_(mthis, __arg_0) => group_Callback_1(mthis, __arg_0);
+
+  static group_Callback_2(mthis, __arg_0, __arg_1) native "ConsoleBase_group_Callback";
+  group_Callback_2_(mthis, __arg_0, __arg_1) => group_Callback_2(mthis, __arg_0, __arg_1);
+
+  static info_Callback_0(mthis) native "ConsoleBase_info_Callback";
+  info_Callback_0_(mthis) => info_Callback_0(mthis);
+
+  static info_Callback_1(mthis, __arg_0) native "ConsoleBase_info_Callback";
+  info_Callback_1_(mthis, __arg_0) => info_Callback_1(mthis, __arg_0);
+
+  static info_Callback_2(mthis, __arg_0, __arg_1) native "ConsoleBase_info_Callback";
+  info_Callback_2_(mthis, __arg_0, __arg_1) => info_Callback_2(mthis, __arg_0, __arg_1);
+
+  static log_Callback_0(mthis) native "ConsoleBase_log_Callback";
+  log_Callback_0_(mthis) => log_Callback_0(mthis);
+
+  static log_Callback_1(mthis, __arg_0) native "ConsoleBase_log_Callback";
+  log_Callback_1_(mthis, __arg_0) => log_Callback_1(mthis, __arg_0);
+
+  static log_Callback_2(mthis, __arg_0, __arg_1) native "ConsoleBase_log_Callback";
+  log_Callback_2_(mthis, __arg_0, __arg_1) => log_Callback_2(mthis, __arg_0, __arg_1);
+
+  static markTimeline_Callback_0(mthis) native "ConsoleBase_markTimeline_Callback";
+  markTimeline_Callback_0_(mthis) => markTimeline_Callback_0(mthis);
+
+  static markTimeline_Callback_1(mthis, __arg_0) native "ConsoleBase_markTimeline_Callback";
+  markTimeline_Callback_1_(mthis, __arg_0) => markTimeline_Callback_1(mthis, __arg_0);
+
+  static markTimeline_Callback_2(mthis, __arg_0, __arg_1) native "ConsoleBase_markTimeline_Callback";
+  markTimeline_Callback_2_(mthis, __arg_0, __arg_1) => markTimeline_Callback_2(mthis, __arg_0, __arg_1);
+
+  static markTimeline_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "ConsoleBase_markTimeline_Callback";
+  markTimeline_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => markTimeline_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static profileEnd_Callback_0(mthis) native "ConsoleBase_profileEnd_Callback";
+  profileEnd_Callback_0_(mthis) => profileEnd_Callback_0(mthis);
+
+  static profileEnd_Callback_1(mthis, __arg_0) native "ConsoleBase_profileEnd_Callback";
+  profileEnd_Callback_1_(mthis, __arg_0) => profileEnd_Callback_1(mthis, __arg_0);
+
+  static profileEnd_Callback_2(mthis, __arg_0, __arg_1) native "ConsoleBase_profileEnd_Callback";
+  profileEnd_Callback_2_(mthis, __arg_0, __arg_1) => profileEnd_Callback_2(mthis, __arg_0, __arg_1);
+
+  static profileEnd_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "ConsoleBase_profileEnd_Callback";
+  profileEnd_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => profileEnd_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static profile_Callback_0(mthis) native "ConsoleBase_profile_Callback";
+  profile_Callback_0_(mthis) => profile_Callback_0(mthis);
+
+  static profile_Callback_1(mthis, __arg_0) native "ConsoleBase_profile_Callback";
+  profile_Callback_1_(mthis, __arg_0) => profile_Callback_1(mthis, __arg_0);
+
+  static profile_Callback_2(mthis, __arg_0, __arg_1) native "ConsoleBase_profile_Callback";
+  profile_Callback_2_(mthis, __arg_0, __arg_1) => profile_Callback_2(mthis, __arg_0, __arg_1);
+
+  static profile_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "ConsoleBase_profile_Callback";
+  profile_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => profile_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static table_Callback_0(mthis) native "ConsoleBase_table_Callback";
+  table_Callback_0_(mthis) => table_Callback_0(mthis);
+
+  static table_Callback_1(mthis, __arg_0) native "ConsoleBase_table_Callback";
+  table_Callback_1_(mthis, __arg_0) => table_Callback_1(mthis, __arg_0);
+
+  static table_Callback_2(mthis, __arg_0, __arg_1) native "ConsoleBase_table_Callback";
+  table_Callback_2_(mthis, __arg_0, __arg_1) => table_Callback_2(mthis, __arg_0, __arg_1);
+
+  static timeEnd_Callback_0(mthis) native "ConsoleBase_timeEnd_Callback";
+  timeEnd_Callback_0_(mthis) => timeEnd_Callback_0(mthis);
+
+  static timeEnd_Callback_1(mthis, __arg_0) native "ConsoleBase_timeEnd_Callback";
+  timeEnd_Callback_1_(mthis, __arg_0) => timeEnd_Callback_1(mthis, __arg_0);
+
+  static timeEnd_Callback_2(mthis, __arg_0, __arg_1) native "ConsoleBase_timeEnd_Callback";
+  timeEnd_Callback_2_(mthis, __arg_0, __arg_1) => timeEnd_Callback_2(mthis, __arg_0, __arg_1);
+
+  static timeEnd_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "ConsoleBase_timeEnd_Callback";
+  timeEnd_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => timeEnd_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static timeStamp_Callback_0(mthis) native "ConsoleBase_timeStamp_Callback";
+  timeStamp_Callback_0_(mthis) => timeStamp_Callback_0(mthis);
+
+  static timeStamp_Callback_1(mthis, __arg_0) native "ConsoleBase_timeStamp_Callback";
+  timeStamp_Callback_1_(mthis, __arg_0) => timeStamp_Callback_1(mthis, __arg_0);
+
+  static timeStamp_Callback_2(mthis, __arg_0, __arg_1) native "ConsoleBase_timeStamp_Callback";
+  timeStamp_Callback_2_(mthis, __arg_0, __arg_1) => timeStamp_Callback_2(mthis, __arg_0, __arg_1);
+
+  static timeStamp_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "ConsoleBase_timeStamp_Callback";
+  timeStamp_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => timeStamp_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static time_Callback_0(mthis) native "ConsoleBase_time_Callback";
+  time_Callback_0_(mthis) => time_Callback_0(mthis);
+
+  static time_Callback_1(mthis, __arg_0) native "ConsoleBase_time_Callback";
+  time_Callback_1_(mthis, __arg_0) => time_Callback_1(mthis, __arg_0);
+
+  static time_Callback_2(mthis, __arg_0, __arg_1) native "ConsoleBase_time_Callback";
+  time_Callback_2_(mthis, __arg_0, __arg_1) => time_Callback_2(mthis, __arg_0, __arg_1);
+
+  static time_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "ConsoleBase_time_Callback";
+  time_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => time_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static timelineEnd_Callback_0(mthis) native "ConsoleBase_timelineEnd_Callback";
+  timelineEnd_Callback_0_(mthis) => timelineEnd_Callback_0(mthis);
+
+  static timelineEnd_Callback_1(mthis, __arg_0) native "ConsoleBase_timelineEnd_Callback";
+  timelineEnd_Callback_1_(mthis, __arg_0) => timelineEnd_Callback_1(mthis, __arg_0);
+
+  static timelineEnd_Callback_2(mthis, __arg_0, __arg_1) native "ConsoleBase_timelineEnd_Callback";
+  timelineEnd_Callback_2_(mthis, __arg_0, __arg_1) => timelineEnd_Callback_2(mthis, __arg_0, __arg_1);
+
+  static timelineEnd_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "ConsoleBase_timelineEnd_Callback";
+  timelineEnd_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => timelineEnd_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static timeline_Callback_0(mthis) native "ConsoleBase_timeline_Callback";
+  timeline_Callback_0_(mthis) => timeline_Callback_0(mthis);
+
+  static timeline_Callback_1(mthis, __arg_0) native "ConsoleBase_timeline_Callback";
+  timeline_Callback_1_(mthis, __arg_0) => timeline_Callback_1(mthis, __arg_0);
+
+  static timeline_Callback_2(mthis, __arg_0, __arg_1) native "ConsoleBase_timeline_Callback";
+  timeline_Callback_2_(mthis, __arg_0, __arg_1) => timeline_Callback_2(mthis, __arg_0, __arg_1);
+
+  static timeline_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "ConsoleBase_timeline_Callback";
+  timeline_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => timeline_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static trace_Callback_0(mthis) native "ConsoleBase_trace_Callback";
+  trace_Callback_0_(mthis) => trace_Callback_0(mthis);
+
+  static trace_Callback_1(mthis, __arg_0) native "ConsoleBase_trace_Callback";
+  trace_Callback_1_(mthis, __arg_0) => trace_Callback_1(mthis, __arg_0);
+
+  static trace_Callback_2(mthis, __arg_0, __arg_1) native "ConsoleBase_trace_Callback";
+  trace_Callback_2_(mthis, __arg_0, __arg_1) => trace_Callback_2(mthis, __arg_0, __arg_1);
+
+  static warn_Callback_0(mthis) native "ConsoleBase_warn_Callback";
+  warn_Callback_0_(mthis) => warn_Callback_0(mthis);
+
+  static warn_Callback_1(mthis, __arg_0) native "ConsoleBase_warn_Callback";
+  warn_Callback_1_(mthis, __arg_0) => warn_Callback_1(mthis, __arg_0);
+
+  static warn_Callback_2(mthis, __arg_0, __arg_1) native "ConsoleBase_warn_Callback";
+  warn_Callback_2_(mthis, __arg_0, __arg_1) => warn_Callback_2(mthis, __arg_0, __arg_1);
+
 }
 
-class BlinkConsole {
-  static memory_Getter(mthis) native "Console_memory_Getter";
-}
+class BlinkConvolverNode extends BlinkAudioNode {
+  static final instance = new BlinkConvolverNode();
 
-class BlinkConvolverNode {
   static buffer_Getter(mthis) native "ConvolverNode_buffer_Getter";
+  buffer_Getter_(mthis) => buffer_Getter(mthis);
 
-  static buffer_Setter(mthis, value) native "ConvolverNode_buffer_Setter";
+  static buffer_Setter(mthis, __arg_0) native "ConvolverNode_buffer_Setter";
+  buffer_Setter_(mthis, __arg_0) => buffer_Setter(mthis, __arg_0);
 
   static normalize_Getter(mthis) native "ConvolverNode_normalize_Getter";
+  normalize_Getter_(mthis) => normalize_Getter(mthis);
 
-  static normalize_Setter(mthis, value) native "ConvolverNode_normalize_Setter";
+  static normalize_Setter(mthis, __arg_0) native "ConvolverNode_normalize_Setter";
+  normalize_Setter_(mthis, __arg_0) => normalize_Setter(mthis, __arg_0);
+
 }
 
 class BlinkCoordinates {
-  static accuracy_Getter(mthis) native "Coordinates_accuracy_Getter";
+  static final instance = new BlinkCoordinates();
 
-  static altitude_Getter(mthis) native "Coordinates_altitude_Getter";
+  static accuracy_Getter(mthis) native "Coordinates_accuracy_Getter";
+  accuracy_Getter_(mthis) => accuracy_Getter(mthis);
 
   static altitudeAccuracy_Getter(mthis) native "Coordinates_altitudeAccuracy_Getter";
+  altitudeAccuracy_Getter_(mthis) => altitudeAccuracy_Getter(mthis);
+
+  static altitude_Getter(mthis) native "Coordinates_altitude_Getter";
+  altitude_Getter_(mthis) => altitude_Getter(mthis);
 
   static heading_Getter(mthis) native "Coordinates_heading_Getter";
+  heading_Getter_(mthis) => heading_Getter(mthis);
 
   static latitude_Getter(mthis) native "Coordinates_latitude_Getter";
+  latitude_Getter_(mthis) => latitude_Getter(mthis);
 
   static longitude_Getter(mthis) native "Coordinates_longitude_Getter";
+  longitude_Getter_(mthis) => longitude_Getter(mthis);
 
   static speed_Getter(mthis) native "Coordinates_speed_Getter";
+  speed_Getter_(mthis) => speed_Getter(mthis);
+
 }
 
-class BlinkCounter {}
+class BlinkCounter {
+  static final instance = new BlinkCounter();
+
+  static identifier_Getter(mthis) native "Counter_identifier_Getter";
+  identifier_Getter_(mthis) => identifier_Getter(mthis);
+
+  static listStyle_Getter(mthis) native "Counter_listStyle_Getter";
+  listStyle_Getter_(mthis) => listStyle_Getter(mthis);
+
+  static separator_Getter(mthis) native "Counter_separator_Getter";
+  separator_Getter_(mthis) => separator_Getter(mthis);
+
+}
 
 class BlinkCredential {
+  static final instance = new BlinkCredential();
+
   static avatarURL_Getter(mthis) native "Credential_avatarURL_Getter";
+  avatarURL_Getter_(mthis) => avatarURL_Getter(mthis);
 
   static id_Getter(mthis) native "Credential_id_Getter";
+  id_Getter_(mthis) => id_Getter(mthis);
 
   static name_Getter(mthis) native "Credential_name_Getter";
+  name_Getter_(mthis) => name_Getter(mthis);
+
 }
 
 class BlinkCredentialsContainer {
-  static notifyFailedSignIn_Callback_1(mthis, credential) native "CredentialsContainer_notifyFailedSignIn_Callback";
+  static final instance = new BlinkCredentialsContainer();
 
-  static notifyFailedSignIn_Callback(mthis) native "CredentialsContainer_notifyFailedSignIn_Callback";
+  static notifyFailedSignIn_Callback_0(mthis) native "CredentialsContainer_notifyFailedSignIn_Callback";
+  notifyFailedSignIn_Callback_0_(mthis) => notifyFailedSignIn_Callback_0(mthis);
 
-  static notifySignedIn_Callback_1(mthis, credential) native "CredentialsContainer_notifySignedIn_Callback";
+  static notifyFailedSignIn_Callback_1(mthis, __arg_0) native "CredentialsContainer_notifyFailedSignIn_Callback";
+  notifyFailedSignIn_Callback_1_(mthis, __arg_0) => notifyFailedSignIn_Callback_1(mthis, __arg_0);
 
-  static notifySignedIn_Callback(mthis) native "CredentialsContainer_notifySignedIn_Callback";
+  static notifyFailedSignIn_Callback_2(mthis, __arg_0, __arg_1) native "CredentialsContainer_notifyFailedSignIn_Callback";
+  notifyFailedSignIn_Callback_2_(mthis, __arg_0, __arg_1) => notifyFailedSignIn_Callback_2(mthis, __arg_0, __arg_1);
 
-  static notifySignedOut_Callback(mthis) native "CredentialsContainer_notifySignedOut_Callback";
+  static notifyFailedSignIn_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "CredentialsContainer_notifyFailedSignIn_Callback";
+  notifyFailedSignIn_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => notifyFailedSignIn_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
-  static request_Callback_1(mthis, options) native "CredentialsContainer_request_Callback";
+  static notifySignedIn_Callback_0(mthis) native "CredentialsContainer_notifySignedIn_Callback";
+  notifySignedIn_Callback_0_(mthis) => notifySignedIn_Callback_0(mthis);
 
-  static request_Callback(mthis) native "CredentialsContainer_request_Callback";
+  static notifySignedIn_Callback_1(mthis, __arg_0) native "CredentialsContainer_notifySignedIn_Callback";
+  notifySignedIn_Callback_1_(mthis, __arg_0) => notifySignedIn_Callback_1(mthis, __arg_0);
+
+  static notifySignedIn_Callback_2(mthis, __arg_0, __arg_1) native "CredentialsContainer_notifySignedIn_Callback";
+  notifySignedIn_Callback_2_(mthis, __arg_0, __arg_1) => notifySignedIn_Callback_2(mthis, __arg_0, __arg_1);
+
+  static notifySignedIn_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "CredentialsContainer_notifySignedIn_Callback";
+  notifySignedIn_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => notifySignedIn_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static notifySignedOut_Callback_0(mthis) native "CredentialsContainer_notifySignedOut_Callback";
+  notifySignedOut_Callback_0_(mthis) => notifySignedOut_Callback_0(mthis);
+
+  static notifySignedOut_Callback_1(mthis, __arg_0) native "CredentialsContainer_notifySignedOut_Callback";
+  notifySignedOut_Callback_1_(mthis, __arg_0) => notifySignedOut_Callback_1(mthis, __arg_0);
+
+  static notifySignedOut_Callback_2(mthis, __arg_0, __arg_1) native "CredentialsContainer_notifySignedOut_Callback";
+  notifySignedOut_Callback_2_(mthis, __arg_0, __arg_1) => notifySignedOut_Callback_2(mthis, __arg_0, __arg_1);
+
+  static request_Callback_0(mthis) native "CredentialsContainer_request_Callback";
+  request_Callback_0_(mthis) => request_Callback_0(mthis);
+
+  static request_Callback_1(mthis, __arg_0) native "CredentialsContainer_request_Callback";
+  request_Callback_1_(mthis, __arg_0) => request_Callback_1(mthis, __arg_0);
+
+  static request_Callback_2(mthis, __arg_0, __arg_1) native "CredentialsContainer_request_Callback";
+  request_Callback_2_(mthis, __arg_0, __arg_1) => request_Callback_2(mthis, __arg_0, __arg_1);
+
+  static request_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "CredentialsContainer_request_Callback";
+  request_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => request_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
 }
 
 class BlinkCrypto {
-  static subtle_Getter(mthis) native "Crypto_subtle_Getter";
+  static final instance = new BlinkCrypto();
 
-  static getRandomValues_Callback_1(mthis, array) native "Crypto_getRandomValues_Callback";
+  static getRandomValues_Callback_0(mthis) native "Crypto_getRandomValues_Callback";
+  getRandomValues_Callback_0_(mthis) => getRandomValues_Callback_0(mthis);
+
+  static getRandomValues_Callback_1(mthis, __arg_0) native "Crypto_getRandomValues_Callback";
+  getRandomValues_Callback_1_(mthis, __arg_0) => getRandomValues_Callback_1(mthis, __arg_0);
+
+  static getRandomValues_Callback_2(mthis, __arg_0, __arg_1) native "Crypto_getRandomValues_Callback";
+  getRandomValues_Callback_2_(mthis, __arg_0, __arg_1) => getRandomValues_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getRandomValues_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Crypto_getRandomValues_Callback";
+  getRandomValues_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getRandomValues_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static subtle_Getter(mthis) native "Crypto_subtle_Getter";
+  subtle_Getter_(mthis) => subtle_Getter(mthis);
+
 }
 
 class BlinkCryptoKey {
+  static final instance = new BlinkCryptoKey();
+
   static algorithm_Getter(mthis) native "CryptoKey_algorithm_Getter";
+  algorithm_Getter_(mthis) => algorithm_Getter(mthis);
 
   static extractable_Getter(mthis) native "CryptoKey_extractable_Getter";
+  extractable_Getter_(mthis) => extractable_Getter(mthis);
 
   static type_Getter(mthis) native "CryptoKey_type_Getter";
+  type_Getter_(mthis) => type_Getter(mthis);
 
   static usages_Getter(mthis) native "CryptoKey_usages_Getter";
+  usages_Getter_(mthis) => usages_Getter(mthis);
+
 }
 
-class BlinkCustomEvent {
-  static constructorCallback(type, options) native "CustomEvent_constructorCallback";
+class BlinkCustomEvent extends BlinkEvent {
+  static final instance = new BlinkCustomEvent();
+
+  static constructorCallback_2(__arg_0, __arg_1) native "CustomEvent_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
 
   static detail_Getter(mthis) native "CustomEvent_detail_Getter";
+  detail_Getter_(mthis) => detail_Getter(mthis);
 
-  static initCustomEvent_Callback_4(mthis, typeArg, canBubbleArg, cancelableArg, detailArg) native "CustomEvent_initCustomEvent_Callback";
+  static initCustomEvent_Callback_0(mthis) native "CustomEvent_initCustomEvent_Callback";
+  initCustomEvent_Callback_0_(mthis) => initCustomEvent_Callback_0(mthis);
+
+  static initCustomEvent_Callback_1(mthis, __arg_0) native "CustomEvent_initCustomEvent_Callback";
+  initCustomEvent_Callback_1_(mthis, __arg_0) => initCustomEvent_Callback_1(mthis, __arg_0);
+
+  static initCustomEvent_Callback_2(mthis, __arg_0, __arg_1) native "CustomEvent_initCustomEvent_Callback";
+  initCustomEvent_Callback_2_(mthis, __arg_0, __arg_1) => initCustomEvent_Callback_2(mthis, __arg_0, __arg_1);
+
+  static initCustomEvent_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "CustomEvent_initCustomEvent_Callback";
+  initCustomEvent_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => initCustomEvent_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static initCustomEvent_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "CustomEvent_initCustomEvent_Callback";
+  initCustomEvent_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => initCustomEvent_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static initCustomEvent_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "CustomEvent_initCustomEvent_Callback";
+  initCustomEvent_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => initCustomEvent_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static initCustomEvent_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "CustomEvent_initCustomEvent_Callback";
+  initCustomEvent_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => initCustomEvent_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
 }
 
 class BlinkDOMError {
-  static constructorCallback_2(name, message) native "DOMError_constructorCallback";
+  static final instance = new BlinkDOMError();
+
+  static constructorCallback_0() native "DOMError_constructorCallback";
+  constructorCallback_0_() => constructorCallback_0();
+
+  static constructorCallback_1(__arg_0) native "DOMError_constructorCallback";
+  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+
+  static constructorCallback_2(__arg_0, __arg_1) native "DOMError_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+
+  static constructorCallback_3(__arg_0, __arg_1, __arg_2) native "DOMError_constructorCallback";
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => constructorCallback_3(__arg_0, __arg_1, __arg_2);
+
+  static constructorCallback_4(__arg_0, __arg_1, __arg_2, __arg_3) native "DOMError_constructorCallback";
+  constructorCallback_4_(__arg_0, __arg_1, __arg_2, __arg_3) => constructorCallback_4(__arg_0, __arg_1, __arg_2, __arg_3);
 
   static message_Getter(mthis) native "DOMError_message_Getter";
+  message_Getter_(mthis) => message_Getter(mthis);
 
   static name_Getter(mthis) native "DOMError_name_Getter";
+  name_Getter_(mthis) => name_Getter(mthis);
+
 }
 
 class BlinkDOMException {
+  static final instance = new BlinkDOMException();
+
   static message_Getter(mthis) native "DOMException_message_Getter";
+  message_Getter_(mthis) => message_Getter(mthis);
 
   static name_Getter(mthis) native "DOMException_name_Getter";
+  name_Getter_(mthis) => name_Getter(mthis);
 
-  static toString_Callback(mthis) native "DOMException_toString_Callback";
+  static toString_Callback_0(mthis) native "DOMException_toString_Callback";
+  toString_Callback_0_(mthis) => toString_Callback_0(mthis);
+
+  static toString_Callback_1(mthis, __arg_0) native "DOMException_toString_Callback";
+  toString_Callback_1_(mthis, __arg_0) => toString_Callback_1(mthis, __arg_0);
+
+  static toString_Callback_2(mthis, __arg_0, __arg_1) native "DOMException_toString_Callback";
+  toString_Callback_2_(mthis, __arg_0, __arg_1) => toString_Callback_2(mthis, __arg_0, __arg_1);
+
 }
 
 class BlinkDOMFileSystem {
+  static final instance = new BlinkDOMFileSystem();
+
   static name_Getter(mthis) native "DOMFileSystem_name_Getter";
+  name_Getter_(mthis) => name_Getter(mthis);
 
   static root_Getter(mthis) native "DOMFileSystem_root_Getter";
+  root_Getter_(mthis) => root_Getter(mthis);
+
 }
 
-class BlinkDOMFileSystemSync {}
+class BlinkDOMFileSystemSync {
+  static final instance = new BlinkDOMFileSystemSync();
+
+  static name_Getter(mthis) native "DOMFileSystemSync_name_Getter";
+  name_Getter_(mthis) => name_Getter(mthis);
+
+  static root_Getter(mthis) native "DOMFileSystemSync_root_Getter";
+  root_Getter_(mthis) => root_Getter(mthis);
+
+}
 
 class BlinkDOMImplementation {
-  static createDocument_Callback_3(mthis, namespaceURI, qualifiedName, doctype) native "DOMImplementation_createDocument_Callback";
+  static final instance = new BlinkDOMImplementation();
 
-  static createDocumentType_Callback_3(mthis, qualifiedName, publicId, systemId) native "DOMImplementation_createDocumentType_Callback";
+  static createDocumentType_Callback_1(mthis, __arg_0) native "DOMImplementation_createDocumentType_Callback";
+  createDocumentType_Callback_1_(mthis, __arg_0) => createDocumentType_Callback_1(mthis, __arg_0);
 
-  static createHTMLDocument_Callback_1(mthis, title) native "DOMImplementation_createHTMLDocument_Callback";
+  static createDocumentType_Callback_2(mthis, __arg_0, __arg_1) native "DOMImplementation_createDocumentType_Callback";
+  createDocumentType_Callback_2_(mthis, __arg_0, __arg_1) => createDocumentType_Callback_2(mthis, __arg_0, __arg_1);
 
-  static hasFeature_Callback_2(mthis, feature, version) native "DOMImplementation_hasFeature_Callback";
+  static createDocumentType_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "DOMImplementation_createDocumentType_Callback";
+  createDocumentType_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => createDocumentType_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static createDocumentType_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "DOMImplementation_createDocumentType_Callback";
+  createDocumentType_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => createDocumentType_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static createDocumentType_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "DOMImplementation_createDocumentType_Callback";
+  createDocumentType_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => createDocumentType_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static createDocument_Callback_0(mthis) native "DOMImplementation_createDocument_Callback";
+  createDocument_Callback_0_(mthis) => createDocument_Callback_0(mthis);
+
+  static createDocument_Callback_1(mthis, __arg_0) native "DOMImplementation_createDocument_Callback";
+  createDocument_Callback_1_(mthis, __arg_0) => createDocument_Callback_1(mthis, __arg_0);
+
+  static createDocument_Callback_2(mthis, __arg_0, __arg_1) native "DOMImplementation_createDocument_Callback";
+  createDocument_Callback_2_(mthis, __arg_0, __arg_1) => createDocument_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createDocument_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "DOMImplementation_createDocument_Callback";
+  createDocument_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => createDocument_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static createDocument_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "DOMImplementation_createDocument_Callback";
+  createDocument_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => createDocument_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static createDocument_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "DOMImplementation_createDocument_Callback";
+  createDocument_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => createDocument_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static createHTMLDocument_Callback_0(mthis) native "DOMImplementation_createHTMLDocument_Callback";
+  createHTMLDocument_Callback_0_(mthis) => createHTMLDocument_Callback_0(mthis);
+
+  static createHTMLDocument_Callback_1(mthis, __arg_0) native "DOMImplementation_createHTMLDocument_Callback";
+  createHTMLDocument_Callback_1_(mthis, __arg_0) => createHTMLDocument_Callback_1(mthis, __arg_0);
+
+  static createHTMLDocument_Callback_2(mthis, __arg_0, __arg_1) native "DOMImplementation_createHTMLDocument_Callback";
+  createHTMLDocument_Callback_2_(mthis, __arg_0, __arg_1) => createHTMLDocument_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createHTMLDocument_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "DOMImplementation_createHTMLDocument_Callback";
+  createHTMLDocument_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => createHTMLDocument_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static hasFeature_Callback_0(mthis) native "DOMImplementation_hasFeature_Callback";
+  hasFeature_Callback_0_(mthis) => hasFeature_Callback_0(mthis);
+
+  static hasFeature_Callback_1(mthis, __arg_0) native "DOMImplementation_hasFeature_Callback";
+  hasFeature_Callback_1_(mthis, __arg_0) => hasFeature_Callback_1(mthis, __arg_0);
+
+  static hasFeature_Callback_2(mthis, __arg_0, __arg_1) native "DOMImplementation_hasFeature_Callback";
+  hasFeature_Callback_2_(mthis, __arg_0, __arg_1) => hasFeature_Callback_2(mthis, __arg_0, __arg_1);
+
+  static hasFeature_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "DOMImplementation_hasFeature_Callback";
+  hasFeature_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => hasFeature_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static hasFeature_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "DOMImplementation_hasFeature_Callback";
+  hasFeature_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => hasFeature_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+}
+
+class BlinkDOMMatrix extends BlinkDOMMatrixReadOnly {
+  static final instance = new BlinkDOMMatrix();
+
+  static a_Getter(mthis) native "DOMMatrix_a_Getter";
+  a_Getter_(mthis) => a_Getter(mthis);
+
+  static a_Setter(mthis, __arg_0) native "DOMMatrix_a_Setter";
+  a_Setter_(mthis, __arg_0) => a_Setter(mthis, __arg_0);
+
+  static b_Getter(mthis) native "DOMMatrix_b_Getter";
+  b_Getter_(mthis) => b_Getter(mthis);
+
+  static b_Setter(mthis, __arg_0) native "DOMMatrix_b_Setter";
+  b_Setter_(mthis, __arg_0) => b_Setter(mthis, __arg_0);
+
+  static c_Getter(mthis) native "DOMMatrix_c_Getter";
+  c_Getter_(mthis) => c_Getter(mthis);
+
+  static c_Setter(mthis, __arg_0) native "DOMMatrix_c_Setter";
+  c_Setter_(mthis, __arg_0) => c_Setter(mthis, __arg_0);
+
+  static constructorCallback_0() native "DOMMatrix_constructorCallback";
+  constructorCallback_0_() => constructorCallback_0();
+
+  static constructorCallback_1(__arg_0) native "DOMMatrix_constructorCallback";
+  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+
+  static constructorCallback_2(__arg_0, __arg_1) native "DOMMatrix_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+
+  static constructorCallback_3(__arg_0, __arg_1, __arg_2) native "DOMMatrix_constructorCallback";
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => constructorCallback_3(__arg_0, __arg_1, __arg_2);
+
+  static d_Getter(mthis) native "DOMMatrix_d_Getter";
+  d_Getter_(mthis) => d_Getter(mthis);
+
+  static d_Setter(mthis, __arg_0) native "DOMMatrix_d_Setter";
+  d_Setter_(mthis, __arg_0) => d_Setter(mthis, __arg_0);
+
+  static e_Getter(mthis) native "DOMMatrix_e_Getter";
+  e_Getter_(mthis) => e_Getter(mthis);
+
+  static e_Setter(mthis, __arg_0) native "DOMMatrix_e_Setter";
+  e_Setter_(mthis, __arg_0) => e_Setter(mthis, __arg_0);
+
+  static f_Getter(mthis) native "DOMMatrix_f_Getter";
+  f_Getter_(mthis) => f_Getter(mthis);
+
+  static f_Setter(mthis, __arg_0) native "DOMMatrix_f_Setter";
+  f_Setter_(mthis, __arg_0) => f_Setter(mthis, __arg_0);
+
+  static m11_Getter(mthis) native "DOMMatrix_m11_Getter";
+  m11_Getter_(mthis) => m11_Getter(mthis);
+
+  static m11_Setter(mthis, __arg_0) native "DOMMatrix_m11_Setter";
+  m11_Setter_(mthis, __arg_0) => m11_Setter(mthis, __arg_0);
+
+  static m12_Getter(mthis) native "DOMMatrix_m12_Getter";
+  m12_Getter_(mthis) => m12_Getter(mthis);
+
+  static m12_Setter(mthis, __arg_0) native "DOMMatrix_m12_Setter";
+  m12_Setter_(mthis, __arg_0) => m12_Setter(mthis, __arg_0);
+
+  static m13_Getter(mthis) native "DOMMatrix_m13_Getter";
+  m13_Getter_(mthis) => m13_Getter(mthis);
+
+  static m13_Setter(mthis, __arg_0) native "DOMMatrix_m13_Setter";
+  m13_Setter_(mthis, __arg_0) => m13_Setter(mthis, __arg_0);
+
+  static m14_Getter(mthis) native "DOMMatrix_m14_Getter";
+  m14_Getter_(mthis) => m14_Getter(mthis);
+
+  static m14_Setter(mthis, __arg_0) native "DOMMatrix_m14_Setter";
+  m14_Setter_(mthis, __arg_0) => m14_Setter(mthis, __arg_0);
+
+  static m21_Getter(mthis) native "DOMMatrix_m21_Getter";
+  m21_Getter_(mthis) => m21_Getter(mthis);
+
+  static m21_Setter(mthis, __arg_0) native "DOMMatrix_m21_Setter";
+  m21_Setter_(mthis, __arg_0) => m21_Setter(mthis, __arg_0);
+
+  static m22_Getter(mthis) native "DOMMatrix_m22_Getter";
+  m22_Getter_(mthis) => m22_Getter(mthis);
+
+  static m22_Setter(mthis, __arg_0) native "DOMMatrix_m22_Setter";
+  m22_Setter_(mthis, __arg_0) => m22_Setter(mthis, __arg_0);
+
+  static m23_Getter(mthis) native "DOMMatrix_m23_Getter";
+  m23_Getter_(mthis) => m23_Getter(mthis);
+
+  static m23_Setter(mthis, __arg_0) native "DOMMatrix_m23_Setter";
+  m23_Setter_(mthis, __arg_0) => m23_Setter(mthis, __arg_0);
+
+  static m24_Getter(mthis) native "DOMMatrix_m24_Getter";
+  m24_Getter_(mthis) => m24_Getter(mthis);
+
+  static m24_Setter(mthis, __arg_0) native "DOMMatrix_m24_Setter";
+  m24_Setter_(mthis, __arg_0) => m24_Setter(mthis, __arg_0);
+
+  static m31_Getter(mthis) native "DOMMatrix_m31_Getter";
+  m31_Getter_(mthis) => m31_Getter(mthis);
+
+  static m31_Setter(mthis, __arg_0) native "DOMMatrix_m31_Setter";
+  m31_Setter_(mthis, __arg_0) => m31_Setter(mthis, __arg_0);
+
+  static m32_Getter(mthis) native "DOMMatrix_m32_Getter";
+  m32_Getter_(mthis) => m32_Getter(mthis);
+
+  static m32_Setter(mthis, __arg_0) native "DOMMatrix_m32_Setter";
+  m32_Setter_(mthis, __arg_0) => m32_Setter(mthis, __arg_0);
+
+  static m33_Getter(mthis) native "DOMMatrix_m33_Getter";
+  m33_Getter_(mthis) => m33_Getter(mthis);
+
+  static m33_Setter(mthis, __arg_0) native "DOMMatrix_m33_Setter";
+  m33_Setter_(mthis, __arg_0) => m33_Setter(mthis, __arg_0);
+
+  static m34_Getter(mthis) native "DOMMatrix_m34_Getter";
+  m34_Getter_(mthis) => m34_Getter(mthis);
+
+  static m34_Setter(mthis, __arg_0) native "DOMMatrix_m34_Setter";
+  m34_Setter_(mthis, __arg_0) => m34_Setter(mthis, __arg_0);
+
+  static m41_Getter(mthis) native "DOMMatrix_m41_Getter";
+  m41_Getter_(mthis) => m41_Getter(mthis);
+
+  static m41_Setter(mthis, __arg_0) native "DOMMatrix_m41_Setter";
+  m41_Setter_(mthis, __arg_0) => m41_Setter(mthis, __arg_0);
+
+  static m42_Getter(mthis) native "DOMMatrix_m42_Getter";
+  m42_Getter_(mthis) => m42_Getter(mthis);
+
+  static m42_Setter(mthis, __arg_0) native "DOMMatrix_m42_Setter";
+  m42_Setter_(mthis, __arg_0) => m42_Setter(mthis, __arg_0);
+
+  static m43_Getter(mthis) native "DOMMatrix_m43_Getter";
+  m43_Getter_(mthis) => m43_Getter(mthis);
+
+  static m43_Setter(mthis, __arg_0) native "DOMMatrix_m43_Setter";
+  m43_Setter_(mthis, __arg_0) => m43_Setter(mthis, __arg_0);
+
+  static m44_Getter(mthis) native "DOMMatrix_m44_Getter";
+  m44_Getter_(mthis) => m44_Getter(mthis);
+
+  static m44_Setter(mthis, __arg_0) native "DOMMatrix_m44_Setter";
+  m44_Setter_(mthis, __arg_0) => m44_Setter(mthis, __arg_0);
+
 }
 
 class BlinkDOMMatrixReadOnly {
+  static final instance = new BlinkDOMMatrixReadOnly();
+
   static a_Getter(mthis) native "DOMMatrixReadOnly_a_Getter";
+  a_Getter_(mthis) => a_Getter(mthis);
 
   static b_Getter(mthis) native "DOMMatrixReadOnly_b_Getter";
+  b_Getter_(mthis) => b_Getter(mthis);
 
   static c_Getter(mthis) native "DOMMatrixReadOnly_c_Getter";
+  c_Getter_(mthis) => c_Getter(mthis);
 
   static d_Getter(mthis) native "DOMMatrixReadOnly_d_Getter";
+  d_Getter_(mthis) => d_Getter(mthis);
 
   static e_Getter(mthis) native "DOMMatrixReadOnly_e_Getter";
+  e_Getter_(mthis) => e_Getter(mthis);
 
   static f_Getter(mthis) native "DOMMatrixReadOnly_f_Getter";
+  f_Getter_(mthis) => f_Getter(mthis);
 
   static is2D_Getter(mthis) native "DOMMatrixReadOnly_is2D_Getter";
+  is2D_Getter_(mthis) => is2D_Getter(mthis);
 
   static isIdentity_Getter(mthis) native "DOMMatrixReadOnly_isIdentity_Getter";
+  isIdentity_Getter_(mthis) => isIdentity_Getter(mthis);
 
   static m11_Getter(mthis) native "DOMMatrixReadOnly_m11_Getter";
+  m11_Getter_(mthis) => m11_Getter(mthis);
 
   static m12_Getter(mthis) native "DOMMatrixReadOnly_m12_Getter";
+  m12_Getter_(mthis) => m12_Getter(mthis);
 
   static m13_Getter(mthis) native "DOMMatrixReadOnly_m13_Getter";
+  m13_Getter_(mthis) => m13_Getter(mthis);
 
   static m14_Getter(mthis) native "DOMMatrixReadOnly_m14_Getter";
+  m14_Getter_(mthis) => m14_Getter(mthis);
 
   static m21_Getter(mthis) native "DOMMatrixReadOnly_m21_Getter";
+  m21_Getter_(mthis) => m21_Getter(mthis);
 
   static m22_Getter(mthis) native "DOMMatrixReadOnly_m22_Getter";
+  m22_Getter_(mthis) => m22_Getter(mthis);
 
   static m23_Getter(mthis) native "DOMMatrixReadOnly_m23_Getter";
+  m23_Getter_(mthis) => m23_Getter(mthis);
 
   static m24_Getter(mthis) native "DOMMatrixReadOnly_m24_Getter";
+  m24_Getter_(mthis) => m24_Getter(mthis);
 
   static m31_Getter(mthis) native "DOMMatrixReadOnly_m31_Getter";
+  m31_Getter_(mthis) => m31_Getter(mthis);
 
   static m32_Getter(mthis) native "DOMMatrixReadOnly_m32_Getter";
+  m32_Getter_(mthis) => m32_Getter(mthis);
 
   static m33_Getter(mthis) native "DOMMatrixReadOnly_m33_Getter";
+  m33_Getter_(mthis) => m33_Getter(mthis);
 
   static m34_Getter(mthis) native "DOMMatrixReadOnly_m34_Getter";
+  m34_Getter_(mthis) => m34_Getter(mthis);
 
   static m41_Getter(mthis) native "DOMMatrixReadOnly_m41_Getter";
+  m41_Getter_(mthis) => m41_Getter(mthis);
 
   static m42_Getter(mthis) native "DOMMatrixReadOnly_m42_Getter";
+  m42_Getter_(mthis) => m42_Getter(mthis);
 
   static m43_Getter(mthis) native "DOMMatrixReadOnly_m43_Getter";
+  m43_Getter_(mthis) => m43_Getter(mthis);
 
   static m44_Getter(mthis) native "DOMMatrixReadOnly_m44_Getter";
-}
+  m44_Getter_(mthis) => m44_Getter(mthis);
 
-class BlinkDOMMatrix {
-  static constructorCallback() native "DOMMatrix_constructorCallback";
-
-  static constructorCallback_1(other) native "DOMMatrix_constructorCallback";
-
-  static a_Getter(mthis) native "DOMMatrix_a_Getter";
-
-  static a_Setter(mthis, value) native "DOMMatrix_a_Setter";
-
-  static b_Getter(mthis) native "DOMMatrix_b_Getter";
-
-  static b_Setter(mthis, value) native "DOMMatrix_b_Setter";
-
-  static c_Getter(mthis) native "DOMMatrix_c_Getter";
-
-  static c_Setter(mthis, value) native "DOMMatrix_c_Setter";
-
-  static d_Getter(mthis) native "DOMMatrix_d_Getter";
-
-  static d_Setter(mthis, value) native "DOMMatrix_d_Setter";
-
-  static e_Getter(mthis) native "DOMMatrix_e_Getter";
-
-  static e_Setter(mthis, value) native "DOMMatrix_e_Setter";
-
-  static f_Getter(mthis) native "DOMMatrix_f_Getter";
-
-  static f_Setter(mthis, value) native "DOMMatrix_f_Setter";
-
-  static m11_Getter(mthis) native "DOMMatrix_m11_Getter";
-
-  static m11_Setter(mthis, value) native "DOMMatrix_m11_Setter";
-
-  static m12_Getter(mthis) native "DOMMatrix_m12_Getter";
-
-  static m12_Setter(mthis, value) native "DOMMatrix_m12_Setter";
-
-  static m13_Getter(mthis) native "DOMMatrix_m13_Getter";
-
-  static m13_Setter(mthis, value) native "DOMMatrix_m13_Setter";
-
-  static m14_Getter(mthis) native "DOMMatrix_m14_Getter";
-
-  static m14_Setter(mthis, value) native "DOMMatrix_m14_Setter";
-
-  static m21_Getter(mthis) native "DOMMatrix_m21_Getter";
-
-  static m21_Setter(mthis, value) native "DOMMatrix_m21_Setter";
-
-  static m22_Getter(mthis) native "DOMMatrix_m22_Getter";
-
-  static m22_Setter(mthis, value) native "DOMMatrix_m22_Setter";
-
-  static m23_Getter(mthis) native "DOMMatrix_m23_Getter";
-
-  static m23_Setter(mthis, value) native "DOMMatrix_m23_Setter";
-
-  static m24_Getter(mthis) native "DOMMatrix_m24_Getter";
-
-  static m24_Setter(mthis, value) native "DOMMatrix_m24_Setter";
-
-  static m31_Getter(mthis) native "DOMMatrix_m31_Getter";
-
-  static m31_Setter(mthis, value) native "DOMMatrix_m31_Setter";
-
-  static m32_Getter(mthis) native "DOMMatrix_m32_Getter";
-
-  static m32_Setter(mthis, value) native "DOMMatrix_m32_Setter";
-
-  static m33_Getter(mthis) native "DOMMatrix_m33_Getter";
-
-  static m33_Setter(mthis, value) native "DOMMatrix_m33_Setter";
-
-  static m34_Getter(mthis) native "DOMMatrix_m34_Getter";
-
-  static m34_Setter(mthis, value) native "DOMMatrix_m34_Setter";
-
-  static m41_Getter(mthis) native "DOMMatrix_m41_Getter";
-
-  static m41_Setter(mthis, value) native "DOMMatrix_m41_Setter";
-
-  static m42_Getter(mthis) native "DOMMatrix_m42_Getter";
-
-  static m42_Setter(mthis, value) native "DOMMatrix_m42_Setter";
-
-  static m43_Getter(mthis) native "DOMMatrix_m43_Getter";
-
-  static m43_Setter(mthis, value) native "DOMMatrix_m43_Setter";
-
-  static m44_Getter(mthis) native "DOMMatrix_m44_Getter";
-
-  static m44_Setter(mthis, value) native "DOMMatrix_m44_Setter";
 }
 
 class BlinkDOMParser {
-  static constructorCallback() native "DOMParser_constructorCallback";
+  static final instance = new BlinkDOMParser();
 
-  static parseFromString_Callback_2(mthis, str, contentType) native "DOMParser_parseFromString_Callback";
+  static constructorCallback_0() native "DOMParser_constructorCallback";
+  constructorCallback_0_() => constructorCallback_0();
+
+  static constructorCallback_1(__arg_0) native "DOMParser_constructorCallback";
+  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+
+  static constructorCallback_2(__arg_0, __arg_1) native "DOMParser_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+
+  static parseFromString_Callback_0(mthis) native "DOMParser_parseFromString_Callback";
+  parseFromString_Callback_0_(mthis) => parseFromString_Callback_0(mthis);
+
+  static parseFromString_Callback_1(mthis, __arg_0) native "DOMParser_parseFromString_Callback";
+  parseFromString_Callback_1_(mthis, __arg_0) => parseFromString_Callback_1(mthis, __arg_0);
+
+  static parseFromString_Callback_2(mthis, __arg_0, __arg_1) native "DOMParser_parseFromString_Callback";
+  parseFromString_Callback_2_(mthis, __arg_0, __arg_1) => parseFromString_Callback_2(mthis, __arg_0, __arg_1);
+
+  static parseFromString_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "DOMParser_parseFromString_Callback";
+  parseFromString_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => parseFromString_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static parseFromString_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "DOMParser_parseFromString_Callback";
+  parseFromString_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => parseFromString_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+}
+
+class BlinkDOMPoint extends BlinkDOMPointReadOnly {
+  static final instance = new BlinkDOMPoint();
+
+  static constructorCallback_0() native "DOMPoint_constructorCallback";
+  constructorCallback_0_() => constructorCallback_0();
+
+  static constructorCallback_1(__arg_0) native "DOMPoint_constructorCallback";
+  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+
+  static constructorCallback_2(__arg_0, __arg_1) native "DOMPoint_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+
+  static constructorCallback_3(__arg_0, __arg_1, __arg_2) native "DOMPoint_constructorCallback";
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => constructorCallback_3(__arg_0, __arg_1, __arg_2);
+
+  static constructorCallback_4(__arg_0, __arg_1, __arg_2, __arg_3) native "DOMPoint_constructorCallback";
+  constructorCallback_4_(__arg_0, __arg_1, __arg_2, __arg_3) => constructorCallback_4(__arg_0, __arg_1, __arg_2, __arg_3);
+
+  static constructorCallback_5(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "DOMPoint_constructorCallback";
+  constructorCallback_5_(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => constructorCallback_5(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static constructorCallback_6(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "DOMPoint_constructorCallback";
+  constructorCallback_6_(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => constructorCallback_6(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static w_Getter(mthis) native "DOMPoint_w_Getter";
+  w_Getter_(mthis) => w_Getter(mthis);
+
+  static w_Setter(mthis, __arg_0) native "DOMPoint_w_Setter";
+  w_Setter_(mthis, __arg_0) => w_Setter(mthis, __arg_0);
+
+  static x_Getter(mthis) native "DOMPoint_x_Getter";
+  x_Getter_(mthis) => x_Getter(mthis);
+
+  static x_Setter(mthis, __arg_0) native "DOMPoint_x_Setter";
+  x_Setter_(mthis, __arg_0) => x_Setter(mthis, __arg_0);
+
+  static y_Getter(mthis) native "DOMPoint_y_Getter";
+  y_Getter_(mthis) => y_Getter(mthis);
+
+  static y_Setter(mthis, __arg_0) native "DOMPoint_y_Setter";
+  y_Setter_(mthis, __arg_0) => y_Setter(mthis, __arg_0);
+
+  static z_Getter(mthis) native "DOMPoint_z_Getter";
+  z_Getter_(mthis) => z_Getter(mthis);
+
+  static z_Setter(mthis, __arg_0) native "DOMPoint_z_Setter";
+  z_Setter_(mthis, __arg_0) => z_Setter(mthis, __arg_0);
+
 }
 
 class BlinkDOMPointReadOnly {
-  static constructorCallback_4(x, y, z, w) native "DOMPointReadOnly_constructorCallback";
+  static final instance = new BlinkDOMPointReadOnly();
+
+  static constructorCallback_2(__arg_0, __arg_1) native "DOMPointReadOnly_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+
+  static constructorCallback_3(__arg_0, __arg_1, __arg_2) native "DOMPointReadOnly_constructorCallback";
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => constructorCallback_3(__arg_0, __arg_1, __arg_2);
+
+  static constructorCallback_4(__arg_0, __arg_1, __arg_2, __arg_3) native "DOMPointReadOnly_constructorCallback";
+  constructorCallback_4_(__arg_0, __arg_1, __arg_2, __arg_3) => constructorCallback_4(__arg_0, __arg_1, __arg_2, __arg_3);
+
+  static constructorCallback_5(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "DOMPointReadOnly_constructorCallback";
+  constructorCallback_5_(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => constructorCallback_5(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static constructorCallback_6(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "DOMPointReadOnly_constructorCallback";
+  constructorCallback_6_(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => constructorCallback_6(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
 
   static w_Getter(mthis) native "DOMPointReadOnly_w_Getter";
+  w_Getter_(mthis) => w_Getter(mthis);
 
   static x_Getter(mthis) native "DOMPointReadOnly_x_Getter";
+  x_Getter_(mthis) => x_Getter(mthis);
 
   static y_Getter(mthis) native "DOMPointReadOnly_y_Getter";
+  y_Getter_(mthis) => y_Getter(mthis);
 
   static z_Getter(mthis) native "DOMPointReadOnly_z_Getter";
+  z_Getter_(mthis) => z_Getter(mthis);
+
 }
 
-class BlinkDOMPoint {
-  static constructorCallback() native "DOMPoint_constructorCallback";
+class BlinkDOMRect extends BlinkDOMRectReadOnly {
+  static final instance = new BlinkDOMRect();
 
-  static constructorCallback_1(point_OR_x) native "DOMPoint_constructorCallback";
+  static constructorCallback_0() native "DOMRect_constructorCallback";
+  constructorCallback_0_() => constructorCallback_0();
 
-  static constructorCallback_2(point_OR_x, y) native "DOMPoint_constructorCallback";
+  static constructorCallback_1(__arg_0) native "DOMRect_constructorCallback";
+  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
 
-  static constructorCallback_3(point_OR_x, y, z) native "DOMPoint_constructorCallback";
+  static constructorCallback_2(__arg_0, __arg_1) native "DOMRect_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
 
-  static constructorCallback_4(point_OR_x, y, z, w) native "DOMPoint_constructorCallback";
+  static constructorCallback_3(__arg_0, __arg_1, __arg_2) native "DOMRect_constructorCallback";
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => constructorCallback_3(__arg_0, __arg_1, __arg_2);
 
-  static w_Getter(mthis) native "DOMPoint_w_Getter";
+  static constructorCallback_4(__arg_0, __arg_1, __arg_2, __arg_3) native "DOMRect_constructorCallback";
+  constructorCallback_4_(__arg_0, __arg_1, __arg_2, __arg_3) => constructorCallback_4(__arg_0, __arg_1, __arg_2, __arg_3);
 
-  static w_Setter(mthis, value) native "DOMPoint_w_Setter";
+  static constructorCallback_5(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "DOMRect_constructorCallback";
+  constructorCallback_5_(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => constructorCallback_5(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
 
-  static x_Getter(mthis) native "DOMPoint_x_Getter";
+  static constructorCallback_6(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "DOMRect_constructorCallback";
+  constructorCallback_6_(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => constructorCallback_6(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
 
-  static x_Setter(mthis, value) native "DOMPoint_x_Setter";
+  static height_Getter(mthis) native "DOMRect_height_Getter";
+  height_Getter_(mthis) => height_Getter(mthis);
 
-  static y_Getter(mthis) native "DOMPoint_y_Getter";
+  static height_Setter(mthis, __arg_0) native "DOMRect_height_Setter";
+  height_Setter_(mthis, __arg_0) => height_Setter(mthis, __arg_0);
 
-  static y_Setter(mthis, value) native "DOMPoint_y_Setter";
+  static width_Getter(mthis) native "DOMRect_width_Getter";
+  width_Getter_(mthis) => width_Getter(mthis);
 
-  static z_Getter(mthis) native "DOMPoint_z_Getter";
+  static width_Setter(mthis, __arg_0) native "DOMRect_width_Setter";
+  width_Setter_(mthis, __arg_0) => width_Setter(mthis, __arg_0);
 
-  static z_Setter(mthis, value) native "DOMPoint_z_Setter";
+  static x_Getter(mthis) native "DOMRect_x_Getter";
+  x_Getter_(mthis) => x_Getter(mthis);
+
+  static x_Setter(mthis, __arg_0) native "DOMRect_x_Setter";
+  x_Setter_(mthis, __arg_0) => x_Setter(mthis, __arg_0);
+
+  static y_Getter(mthis) native "DOMRect_y_Getter";
+  y_Getter_(mthis) => y_Getter(mthis);
+
+  static y_Setter(mthis, __arg_0) native "DOMRect_y_Setter";
+  y_Setter_(mthis, __arg_0) => y_Setter(mthis, __arg_0);
+
 }
 
 class BlinkDOMRectReadOnly {
-  static constructorCallback_4(x, y, width, height) native "DOMRectReadOnly_constructorCallback";
+  static final instance = new BlinkDOMRectReadOnly();
 
   static bottom_Getter(mthis) native "DOMRectReadOnly_bottom_Getter";
+  bottom_Getter_(mthis) => bottom_Getter(mthis);
+
+  static constructorCallback_2(__arg_0, __arg_1) native "DOMRectReadOnly_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+
+  static constructorCallback_3(__arg_0, __arg_1, __arg_2) native "DOMRectReadOnly_constructorCallback";
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => constructorCallback_3(__arg_0, __arg_1, __arg_2);
+
+  static constructorCallback_4(__arg_0, __arg_1, __arg_2, __arg_3) native "DOMRectReadOnly_constructorCallback";
+  constructorCallback_4_(__arg_0, __arg_1, __arg_2, __arg_3) => constructorCallback_4(__arg_0, __arg_1, __arg_2, __arg_3);
+
+  static constructorCallback_5(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "DOMRectReadOnly_constructorCallback";
+  constructorCallback_5_(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => constructorCallback_5(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static constructorCallback_6(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "DOMRectReadOnly_constructorCallback";
+  constructorCallback_6_(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => constructorCallback_6(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
 
   static height_Getter(mthis) native "DOMRectReadOnly_height_Getter";
+  height_Getter_(mthis) => height_Getter(mthis);
 
   static left_Getter(mthis) native "DOMRectReadOnly_left_Getter";
+  left_Getter_(mthis) => left_Getter(mthis);
 
   static right_Getter(mthis) native "DOMRectReadOnly_right_Getter";
+  right_Getter_(mthis) => right_Getter(mthis);
 
   static top_Getter(mthis) native "DOMRectReadOnly_top_Getter";
+  top_Getter_(mthis) => top_Getter(mthis);
 
   static width_Getter(mthis) native "DOMRectReadOnly_width_Getter";
+  width_Getter_(mthis) => width_Getter(mthis);
 
   static x_Getter(mthis) native "DOMRectReadOnly_x_Getter";
+  x_Getter_(mthis) => x_Getter(mthis);
 
   static y_Getter(mthis) native "DOMRectReadOnly_y_Getter";
+  y_Getter_(mthis) => y_Getter(mthis);
+
 }
 
-class BlinkDOMRect {
-  static constructorCallback_4(x, y, width, height) native "DOMRect_constructorCallback";
+class BlinkDOMSettableTokenList extends BlinkDOMTokenList {
+  static final instance = new BlinkDOMSettableTokenList();
 
-  static constructorCallback_3(x, y, width) native "DOMRect_constructorCallback";
+  static $__getter___Callback_1(mthis, __arg_0) native "DOMSettableTokenList___getter___Callback";
+  $__getter___Callback_1_(mthis, __arg_0) => $__getter___Callback_1(mthis, __arg_0);
 
-  static constructorCallback_2(x, y) native "DOMRect_constructorCallback";
-
-  static constructorCallback_1(x) native "DOMRect_constructorCallback";
-
-  static constructorCallback() native "DOMRect_constructorCallback";
-
-  static height_Getter(mthis) native "DOMRect_height_Getter";
-
-  static height_Setter(mthis, value) native "DOMRect_height_Setter";
-
-  static width_Getter(mthis) native "DOMRect_width_Getter";
-
-  static width_Setter(mthis, value) native "DOMRect_width_Setter";
-
-  static x_Getter(mthis) native "DOMRect_x_Getter";
-
-  static x_Setter(mthis, value) native "DOMRect_x_Setter";
-
-  static y_Getter(mthis) native "DOMRect_y_Getter";
-
-  static y_Setter(mthis, value) native "DOMRect_y_Setter";
-}
-
-class BlinkDOMTokenList {
-  static length_Getter(mthis) native "DOMTokenList_length_Getter";
-
-  static add_Callback_1(mthis, tokens) native "DOMTokenList_add_Callback";
-
-  static contains_Callback_1(mthis, token) native "DOMTokenList_contains_Callback";
-
-  static item_Callback_1(mthis, index) native "DOMTokenList_item_Callback";
-
-  static remove_Callback_1(mthis, tokens) native "DOMTokenList_remove_Callback";
-
-  static toggle_Callback_2(mthis, token, force) native "DOMTokenList_toggle_Callback";
-
-  static toggle_Callback_1(mthis, token) native "DOMTokenList_toggle_Callback";
-}
-
-class BlinkDOMSettableTokenList {
   static value_Getter(mthis) native "DOMSettableTokenList_value_Getter";
+  value_Getter_(mthis) => value_Getter(mthis);
 
-  static value_Setter(mthis, value) native "DOMSettableTokenList_value_Setter";
+  static value_Setter(mthis, __arg_0) native "DOMSettableTokenList_value_Setter";
+  value_Setter_(mthis, __arg_0) => value_Setter(mthis, __arg_0);
 
-  static $__getter___Callback_1(mthis, index) native "DOMSettableTokenList___getter___Callback";
 }
 
 class BlinkDOMStringList {
+  static final instance = new BlinkDOMStringList();
+
+  static $__getter___Callback_1(mthis, __arg_0) native "DOMStringList___getter___Callback";
+  $__getter___Callback_1_(mthis, __arg_0) => $__getter___Callback_1(mthis, __arg_0);
+
+  static contains_Callback_0(mthis) native "DOMStringList_contains_Callback";
+  contains_Callback_0_(mthis) => contains_Callback_0(mthis);
+
+  static contains_Callback_1(mthis, __arg_0) native "DOMStringList_contains_Callback";
+  contains_Callback_1_(mthis, __arg_0) => contains_Callback_1(mthis, __arg_0);
+
+  static contains_Callback_2(mthis, __arg_0, __arg_1) native "DOMStringList_contains_Callback";
+  contains_Callback_2_(mthis, __arg_0, __arg_1) => contains_Callback_2(mthis, __arg_0, __arg_1);
+
+  static contains_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "DOMStringList_contains_Callback";
+  contains_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => contains_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static item_Callback_0(mthis) native "DOMStringList_item_Callback";
+  item_Callback_0_(mthis) => item_Callback_0(mthis);
+
+  static item_Callback_1(mthis, __arg_0) native "DOMStringList_item_Callback";
+  item_Callback_1_(mthis, __arg_0) => item_Callback_1(mthis, __arg_0);
+
+  static item_Callback_2(mthis, __arg_0, __arg_1) native "DOMStringList_item_Callback";
+  item_Callback_2_(mthis, __arg_0, __arg_1) => item_Callback_2(mthis, __arg_0, __arg_1);
+
+  static item_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "DOMStringList_item_Callback";
+  item_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => item_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
   static length_Getter(mthis) native "DOMStringList_length_Getter";
+  length_Getter_(mthis) => length_Getter(mthis);
 
-  static contains_Callback_1(mthis, string) native "DOMStringList_contains_Callback";
-
-  static item_Callback_1(mthis, index) native "DOMStringList_item_Callback";
 }
 
 class BlinkDOMStringMap {
-  static $__delete___Callback_1(mthis, index_OR_name) native "DOMStringMap___delete___Callback";
+  static final instance = new BlinkDOMStringMap();
 
-  static $__getter___Callback_1(mthis, index_OR_name) native "DOMStringMap___getter___Callback";
+  static $__delete___Callback_1(mthis, __arg_0) native "DOMStringMap___delete___Callback";
+  $__delete___Callback_1_(mthis, __arg_0) => $__delete___Callback_1(mthis, __arg_0);
 
-  static $__setter___Callback_2(mthis, index_OR_name, value) native "DOMStringMap___setter___Callback";
+  static $__getter___Callback_1(mthis, __arg_0) native "DOMStringMap___getter___Callback";
+  $__getter___Callback_1_(mthis, __arg_0) => $__getter___Callback_1(mthis, __arg_0);
+
+  static $__setter___Callback_2(mthis, __arg_0, __arg_1) native "DOMStringMap___setter___Callback";
+  $__setter___Callback_2_(mthis, __arg_0, __arg_1) => $__setter___Callback_2(mthis, __arg_0, __arg_1);
+
+}
+
+class BlinkDOMTokenList {
+  static final instance = new BlinkDOMTokenList();
+
+  static $__getter___Callback_1(mthis, __arg_0) native "DOMTokenList___getter___Callback";
+  $__getter___Callback_1_(mthis, __arg_0) => $__getter___Callback_1(mthis, __arg_0);
+
+  static add_Callback_0(mthis) native "DOMTokenList_add_Callback";
+  add_Callback_0_(mthis) => add_Callback_0(mthis);
+
+  static add_Callback_1(mthis, __arg_0) native "DOMTokenList_add_Callback";
+  add_Callback_1_(mthis, __arg_0) => add_Callback_1(mthis, __arg_0);
+
+  static add_Callback_2(mthis, __arg_0, __arg_1) native "DOMTokenList_add_Callback";
+  add_Callback_2_(mthis, __arg_0, __arg_1) => add_Callback_2(mthis, __arg_0, __arg_1);
+
+  static add_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "DOMTokenList_add_Callback";
+  add_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => add_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static contains_Callback_0(mthis) native "DOMTokenList_contains_Callback";
+  contains_Callback_0_(mthis) => contains_Callback_0(mthis);
+
+  static contains_Callback_1(mthis, __arg_0) native "DOMTokenList_contains_Callback";
+  contains_Callback_1_(mthis, __arg_0) => contains_Callback_1(mthis, __arg_0);
+
+  static contains_Callback_2(mthis, __arg_0, __arg_1) native "DOMTokenList_contains_Callback";
+  contains_Callback_2_(mthis, __arg_0, __arg_1) => contains_Callback_2(mthis, __arg_0, __arg_1);
+
+  static contains_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "DOMTokenList_contains_Callback";
+  contains_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => contains_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static item_Callback_0(mthis) native "DOMTokenList_item_Callback";
+  item_Callback_0_(mthis) => item_Callback_0(mthis);
+
+  static item_Callback_1(mthis, __arg_0) native "DOMTokenList_item_Callback";
+  item_Callback_1_(mthis, __arg_0) => item_Callback_1(mthis, __arg_0);
+
+  static item_Callback_2(mthis, __arg_0, __arg_1) native "DOMTokenList_item_Callback";
+  item_Callback_2_(mthis, __arg_0, __arg_1) => item_Callback_2(mthis, __arg_0, __arg_1);
+
+  static item_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "DOMTokenList_item_Callback";
+  item_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => item_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static length_Getter(mthis) native "DOMTokenList_length_Getter";
+  length_Getter_(mthis) => length_Getter(mthis);
+
+  static remove_Callback_0(mthis) native "DOMTokenList_remove_Callback";
+  remove_Callback_0_(mthis) => remove_Callback_0(mthis);
+
+  static remove_Callback_1(mthis, __arg_0) native "DOMTokenList_remove_Callback";
+  remove_Callback_1_(mthis, __arg_0) => remove_Callback_1(mthis, __arg_0);
+
+  static remove_Callback_2(mthis, __arg_0, __arg_1) native "DOMTokenList_remove_Callback";
+  remove_Callback_2_(mthis, __arg_0, __arg_1) => remove_Callback_2(mthis, __arg_0, __arg_1);
+
+  static remove_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "DOMTokenList_remove_Callback";
+  remove_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => remove_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static toggle_Callback_0(mthis) native "DOMTokenList_toggle_Callback";
+  toggle_Callback_0_(mthis) => toggle_Callback_0(mthis);
+
+  static toggle_Callback_1(mthis, __arg_0) native "DOMTokenList_toggle_Callback";
+  toggle_Callback_1_(mthis, __arg_0) => toggle_Callback_1(mthis, __arg_0);
+
+  static toggle_Callback_2(mthis, __arg_0, __arg_1) native "DOMTokenList_toggle_Callback";
+  toggle_Callback_2_(mthis, __arg_0, __arg_1) => toggle_Callback_2(mthis, __arg_0, __arg_1);
+
+  static toggle_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "DOMTokenList_toggle_Callback";
+  toggle_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => toggle_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static toggle_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "DOMTokenList_toggle_Callback";
+  toggle_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => toggle_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
 }
 
 class BlinkDataTransfer {
-  static dropEffect_Getter(mthis) native "DataTransfer_dropEffect_Getter";
+  static final instance = new BlinkDataTransfer();
 
-  static dropEffect_Setter(mthis, value) native "DataTransfer_dropEffect_Setter";
+  static clearData_Callback_0(mthis) native "DataTransfer_clearData_Callback";
+  clearData_Callback_0_(mthis) => clearData_Callback_0(mthis);
+
+  static clearData_Callback_1(mthis, __arg_0) native "DataTransfer_clearData_Callback";
+  clearData_Callback_1_(mthis, __arg_0) => clearData_Callback_1(mthis, __arg_0);
+
+  static clearData_Callback_2(mthis, __arg_0, __arg_1) native "DataTransfer_clearData_Callback";
+  clearData_Callback_2_(mthis, __arg_0, __arg_1) => clearData_Callback_2(mthis, __arg_0, __arg_1);
+
+  static clearData_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "DataTransfer_clearData_Callback";
+  clearData_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => clearData_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static dropEffect_Getter(mthis) native "DataTransfer_dropEffect_Getter";
+  dropEffect_Getter_(mthis) => dropEffect_Getter(mthis);
+
+  static dropEffect_Setter(mthis, __arg_0) native "DataTransfer_dropEffect_Setter";
+  dropEffect_Setter_(mthis, __arg_0) => dropEffect_Setter(mthis, __arg_0);
 
   static effectAllowed_Getter(mthis) native "DataTransfer_effectAllowed_Getter";
+  effectAllowed_Getter_(mthis) => effectAllowed_Getter(mthis);
 
-  static effectAllowed_Setter(mthis, value) native "DataTransfer_effectAllowed_Setter";
+  static effectAllowed_Setter(mthis, __arg_0) native "DataTransfer_effectAllowed_Setter";
+  effectAllowed_Setter_(mthis, __arg_0) => effectAllowed_Setter(mthis, __arg_0);
 
   static files_Getter(mthis) native "DataTransfer_files_Getter";
+  files_Getter_(mthis) => files_Getter(mthis);
+
+  static getData_Callback_0(mthis) native "DataTransfer_getData_Callback";
+  getData_Callback_0_(mthis) => getData_Callback_0(mthis);
+
+  static getData_Callback_1(mthis, __arg_0) native "DataTransfer_getData_Callback";
+  getData_Callback_1_(mthis, __arg_0) => getData_Callback_1(mthis, __arg_0);
+
+  static getData_Callback_2(mthis, __arg_0, __arg_1) native "DataTransfer_getData_Callback";
+  getData_Callback_2_(mthis, __arg_0, __arg_1) => getData_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getData_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "DataTransfer_getData_Callback";
+  getData_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getData_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
   static items_Getter(mthis) native "DataTransfer_items_Getter";
+  items_Getter_(mthis) => items_Getter(mthis);
+
+  static setData_Callback_0(mthis) native "DataTransfer_setData_Callback";
+  setData_Callback_0_(mthis) => setData_Callback_0(mthis);
+
+  static setData_Callback_1(mthis, __arg_0) native "DataTransfer_setData_Callback";
+  setData_Callback_1_(mthis, __arg_0) => setData_Callback_1(mthis, __arg_0);
+
+  static setData_Callback_2(mthis, __arg_0, __arg_1) native "DataTransfer_setData_Callback";
+  setData_Callback_2_(mthis, __arg_0, __arg_1) => setData_Callback_2(mthis, __arg_0, __arg_1);
+
+  static setData_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "DataTransfer_setData_Callback";
+  setData_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => setData_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static setData_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "DataTransfer_setData_Callback";
+  setData_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => setData_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static setDragImage_Callback_1(mthis, __arg_0) native "DataTransfer_setDragImage_Callback";
+  setDragImage_Callback_1_(mthis, __arg_0) => setDragImage_Callback_1(mthis, __arg_0);
+
+  static setDragImage_Callback_2(mthis, __arg_0, __arg_1) native "DataTransfer_setDragImage_Callback";
+  setDragImage_Callback_2_(mthis, __arg_0, __arg_1) => setDragImage_Callback_2(mthis, __arg_0, __arg_1);
+
+  static setDragImage_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "DataTransfer_setDragImage_Callback";
+  setDragImage_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => setDragImage_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static setDragImage_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "DataTransfer_setDragImage_Callback";
+  setDragImage_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => setDragImage_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static setDragImage_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "DataTransfer_setDragImage_Callback";
+  setDragImage_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => setDragImage_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
 
   static types_Getter(mthis) native "DataTransfer_types_Getter";
+  types_Getter_(mthis) => types_Getter(mthis);
 
-  static clearData_Callback_1(mthis, type) native "DataTransfer_clearData_Callback";
-
-  static clearData_Callback(mthis) native "DataTransfer_clearData_Callback";
-
-  static getData_Callback_1(mthis, type) native "DataTransfer_getData_Callback";
-
-  static setData_Callback_2(mthis, type, data) native "DataTransfer_setData_Callback";
-
-  static setDragImage_Callback_3(mthis, image, x, y) native "DataTransfer_setDragImage_Callback";
 }
 
 class BlinkDataTransferItem {
+  static final instance = new BlinkDataTransferItem();
+
+  static getAsFile_Callback_0(mthis) native "DataTransferItem_getAsFile_Callback";
+  getAsFile_Callback_0_(mthis) => getAsFile_Callback_0(mthis);
+
+  static getAsFile_Callback_1(mthis, __arg_0) native "DataTransferItem_getAsFile_Callback";
+  getAsFile_Callback_1_(mthis, __arg_0) => getAsFile_Callback_1(mthis, __arg_0);
+
+  static getAsFile_Callback_2(mthis, __arg_0, __arg_1) native "DataTransferItem_getAsFile_Callback";
+  getAsFile_Callback_2_(mthis, __arg_0, __arg_1) => getAsFile_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getAsString_Callback_0(mthis) native "DataTransferItem_getAsString_Callback";
+  getAsString_Callback_0_(mthis) => getAsString_Callback_0(mthis);
+
+  static getAsString_Callback_1(mthis, __arg_0) native "DataTransferItem_getAsString_Callback";
+  getAsString_Callback_1_(mthis, __arg_0) => getAsString_Callback_1(mthis, __arg_0);
+
+  static getAsString_Callback_2(mthis, __arg_0, __arg_1) native "DataTransferItem_getAsString_Callback";
+  getAsString_Callback_2_(mthis, __arg_0, __arg_1) => getAsString_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getAsString_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "DataTransferItem_getAsString_Callback";
+  getAsString_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getAsString_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
   static kind_Getter(mthis) native "DataTransferItem_kind_Getter";
+  kind_Getter_(mthis) => kind_Getter(mthis);
 
   static type_Getter(mthis) native "DataTransferItem_type_Getter";
+  type_Getter_(mthis) => type_Getter(mthis);
 
-  static getAsFile_Callback(mthis) native "DataTransferItem_getAsFile_Callback";
+  static webkitGetAsEntry_Callback_0(mthis) native "DataTransferItem_webkitGetAsEntry_Callback";
+  webkitGetAsEntry_Callback_0_(mthis) => webkitGetAsEntry_Callback_0(mthis);
 
-  static getAsString_Callback_1(mthis, callback) native "DataTransferItem_getAsString_Callback";
+  static webkitGetAsEntry_Callback_1(mthis, __arg_0) native "DataTransferItem_webkitGetAsEntry_Callback";
+  webkitGetAsEntry_Callback_1_(mthis, __arg_0) => webkitGetAsEntry_Callback_1(mthis, __arg_0);
 
-  static webkitGetAsEntry_Callback(mthis) native "DataTransferItem_webkitGetAsEntry_Callback";
+  static webkitGetAsEntry_Callback_2(mthis, __arg_0, __arg_1) native "DataTransferItem_webkitGetAsEntry_Callback";
+  webkitGetAsEntry_Callback_2_(mthis, __arg_0, __arg_1) => webkitGetAsEntry_Callback_2(mthis, __arg_0, __arg_1);
+
 }
 
 class BlinkDataTransferItemList {
+  static final instance = new BlinkDataTransferItemList();
+
+  static $__getter___Callback_1(mthis, __arg_0) native "DataTransferItemList___getter___Callback";
+  $__getter___Callback_1_(mthis, __arg_0) => $__getter___Callback_1(mthis, __arg_0);
+
+  static add_Callback_0(mthis) native "DataTransferItemList_add_Callback";
+  add_Callback_0_(mthis) => add_Callback_0(mthis);
+
+  static add_Callback_1(mthis, __arg_0) native "DataTransferItemList_add_Callback";
+  add_Callback_1_(mthis, __arg_0) => add_Callback_1(mthis, __arg_0);
+
+  static add_Callback_2(mthis, __arg_0, __arg_1) native "DataTransferItemList_add_Callback";
+  add_Callback_2_(mthis, __arg_0, __arg_1) => add_Callback_2(mthis, __arg_0, __arg_1);
+
+  static add_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "DataTransferItemList_add_Callback";
+  add_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => add_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static add_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "DataTransferItemList_add_Callback";
+  add_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => add_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static clear_Callback_0(mthis) native "DataTransferItemList_clear_Callback";
+  clear_Callback_0_(mthis) => clear_Callback_0(mthis);
+
+  static clear_Callback_1(mthis, __arg_0) native "DataTransferItemList_clear_Callback";
+  clear_Callback_1_(mthis, __arg_0) => clear_Callback_1(mthis, __arg_0);
+
+  static clear_Callback_2(mthis, __arg_0, __arg_1) native "DataTransferItemList_clear_Callback";
+  clear_Callback_2_(mthis, __arg_0, __arg_1) => clear_Callback_2(mthis, __arg_0, __arg_1);
+
   static length_Getter(mthis) native "DataTransferItemList_length_Getter";
+  length_Getter_(mthis) => length_Getter(mthis);
 
-  static $__getter___Callback_1(mthis, index) native "DataTransferItemList___getter___Callback";
+  static remove_Callback_0(mthis) native "DataTransferItemList_remove_Callback";
+  remove_Callback_0_(mthis) => remove_Callback_0(mthis);
 
-  static add_Callback_2(mthis, data_OR_file, type) native "DataTransferItemList_add_Callback";
+  static remove_Callback_1(mthis, __arg_0) native "DataTransferItemList_remove_Callback";
+  remove_Callback_1_(mthis, __arg_0) => remove_Callback_1(mthis, __arg_0);
 
-  static add_Callback_1(mthis, data_OR_file) native "DataTransferItemList_add_Callback";
+  static remove_Callback_2(mthis, __arg_0, __arg_1) native "DataTransferItemList_remove_Callback";
+  remove_Callback_2_(mthis, __arg_0, __arg_1) => remove_Callback_2(mthis, __arg_0, __arg_1);
 
-  static clear_Callback(mthis) native "DataTransferItemList_clear_Callback";
+  static remove_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "DataTransferItemList_remove_Callback";
+  remove_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => remove_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
-  static remove_Callback_1(mthis, index) native "DataTransferItemList_remove_Callback";
 }
 
 class BlinkDatabase {
+  static final instance = new BlinkDatabase();
+
+  static changeVersion_Callback_0(mthis) native "Database_changeVersion_Callback";
+  changeVersion_Callback_0_(mthis) => changeVersion_Callback_0(mthis);
+
+  static changeVersion_Callback_1(mthis, __arg_0) native "Database_changeVersion_Callback";
+  changeVersion_Callback_1_(mthis, __arg_0) => changeVersion_Callback_1(mthis, __arg_0);
+
+  static changeVersion_Callback_2(mthis, __arg_0, __arg_1) native "Database_changeVersion_Callback";
+  changeVersion_Callback_2_(mthis, __arg_0, __arg_1) => changeVersion_Callback_2(mthis, __arg_0, __arg_1);
+
+  static changeVersion_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Database_changeVersion_Callback";
+  changeVersion_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => changeVersion_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static changeVersion_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Database_changeVersion_Callback";
+  changeVersion_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => changeVersion_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static changeVersion_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "Database_changeVersion_Callback";
+  changeVersion_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => changeVersion_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static changeVersion_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "Database_changeVersion_Callback";
+  changeVersion_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => changeVersion_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static changeVersion_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) native "Database_changeVersion_Callback";
+  changeVersion_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => changeVersion_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6);
+
+  static readTransaction_Callback_0(mthis) native "Database_readTransaction_Callback";
+  readTransaction_Callback_0_(mthis) => readTransaction_Callback_0(mthis);
+
+  static readTransaction_Callback_1(mthis, __arg_0) native "Database_readTransaction_Callback";
+  readTransaction_Callback_1_(mthis, __arg_0) => readTransaction_Callback_1(mthis, __arg_0);
+
+  static readTransaction_Callback_2(mthis, __arg_0, __arg_1) native "Database_readTransaction_Callback";
+  readTransaction_Callback_2_(mthis, __arg_0, __arg_1) => readTransaction_Callback_2(mthis, __arg_0, __arg_1);
+
+  static readTransaction_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Database_readTransaction_Callback";
+  readTransaction_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => readTransaction_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static readTransaction_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Database_readTransaction_Callback";
+  readTransaction_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => readTransaction_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static readTransaction_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "Database_readTransaction_Callback";
+  readTransaction_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => readTransaction_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static transaction_Callback_0(mthis) native "Database_transaction_Callback";
+  transaction_Callback_0_(mthis) => transaction_Callback_0(mthis);
+
+  static transaction_Callback_1(mthis, __arg_0) native "Database_transaction_Callback";
+  transaction_Callback_1_(mthis, __arg_0) => transaction_Callback_1(mthis, __arg_0);
+
+  static transaction_Callback_2(mthis, __arg_0, __arg_1) native "Database_transaction_Callback";
+  transaction_Callback_2_(mthis, __arg_0, __arg_1) => transaction_Callback_2(mthis, __arg_0, __arg_1);
+
+  static transaction_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Database_transaction_Callback";
+  transaction_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => transaction_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static transaction_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Database_transaction_Callback";
+  transaction_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => transaction_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static transaction_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "Database_transaction_Callback";
+  transaction_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => transaction_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
   static version_Getter(mthis) native "Database_version_Getter";
+  version_Getter_(mthis) => version_Getter(mthis);
 
-  static changeVersion_Callback_5(mthis, oldVersion, newVersion, callback, errorCallback, successCallback) native "Database_changeVersion_Callback";
-
-  static changeVersion_Callback_4(mthis, oldVersion, newVersion, callback, errorCallback) native "Database_changeVersion_Callback";
-
-  static changeVersion_Callback_3(mthis, oldVersion, newVersion, callback) native "Database_changeVersion_Callback";
-
-  static changeVersion_Callback_2(mthis, oldVersion, newVersion) native "Database_changeVersion_Callback";
-
-  static readTransaction_Callback_3(mthis, callback, errorCallback, successCallback) native "Database_readTransaction_Callback";
-
-  static readTransaction_Callback_2(mthis, callback, errorCallback) native "Database_readTransaction_Callback";
-
-  static readTransaction_Callback_1(mthis, callback) native "Database_readTransaction_Callback";
-
-  static transaction_Callback_3(mthis, callback, errorCallback, successCallback) native "Database_transaction_Callback";
-
-  static transaction_Callback_2(mthis, callback, errorCallback) native "Database_transaction_Callback";
-
-  static transaction_Callback_1(mthis, callback) native "Database_transaction_Callback";
 }
 
-class BlinkDatabaseSync {}
+class BlinkDatabaseSync {
+  static final instance = new BlinkDatabaseSync();
 
-class BlinkWindowBase64 {
-  static atob_Callback_1(mthis, string) native "WindowBase64_atob_Callback";
+  static changeVersion_Callback_0(mthis) native "DatabaseSync_changeVersion_Callback";
+  changeVersion_Callback_0_(mthis) => changeVersion_Callback_0(mthis);
 
-  static btoa_Callback_1(mthis, string) native "WindowBase64_btoa_Callback";
+  static changeVersion_Callback_1(mthis, __arg_0) native "DatabaseSync_changeVersion_Callback";
+  changeVersion_Callback_1_(mthis, __arg_0) => changeVersion_Callback_1(mthis, __arg_0);
+
+  static changeVersion_Callback_2(mthis, __arg_0, __arg_1) native "DatabaseSync_changeVersion_Callback";
+  changeVersion_Callback_2_(mthis, __arg_0, __arg_1) => changeVersion_Callback_2(mthis, __arg_0, __arg_1);
+
+  static changeVersion_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "DatabaseSync_changeVersion_Callback";
+  changeVersion_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => changeVersion_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static changeVersion_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "DatabaseSync_changeVersion_Callback";
+  changeVersion_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => changeVersion_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static changeVersion_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "DatabaseSync_changeVersion_Callback";
+  changeVersion_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => changeVersion_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static lastErrorMessage_Getter(mthis) native "DatabaseSync_lastErrorMessage_Getter";
+  lastErrorMessage_Getter_(mthis) => lastErrorMessage_Getter(mthis);
+
+  static readTransaction_Callback_0(mthis) native "DatabaseSync_readTransaction_Callback";
+  readTransaction_Callback_0_(mthis) => readTransaction_Callback_0(mthis);
+
+  static readTransaction_Callback_1(mthis, __arg_0) native "DatabaseSync_readTransaction_Callback";
+  readTransaction_Callback_1_(mthis, __arg_0) => readTransaction_Callback_1(mthis, __arg_0);
+
+  static readTransaction_Callback_2(mthis, __arg_0, __arg_1) native "DatabaseSync_readTransaction_Callback";
+  readTransaction_Callback_2_(mthis, __arg_0, __arg_1) => readTransaction_Callback_2(mthis, __arg_0, __arg_1);
+
+  static readTransaction_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "DatabaseSync_readTransaction_Callback";
+  readTransaction_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => readTransaction_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static transaction_Callback_0(mthis) native "DatabaseSync_transaction_Callback";
+  transaction_Callback_0_(mthis) => transaction_Callback_0(mthis);
+
+  static transaction_Callback_1(mthis, __arg_0) native "DatabaseSync_transaction_Callback";
+  transaction_Callback_1_(mthis, __arg_0) => transaction_Callback_1(mthis, __arg_0);
+
+  static transaction_Callback_2(mthis, __arg_0, __arg_1) native "DatabaseSync_transaction_Callback";
+  transaction_Callback_2_(mthis, __arg_0, __arg_1) => transaction_Callback_2(mthis, __arg_0, __arg_1);
+
+  static transaction_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "DatabaseSync_transaction_Callback";
+  transaction_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => transaction_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static version_Getter(mthis) native "DatabaseSync_version_Getter";
+  version_Getter_(mthis) => version_Getter(mthis);
+
 }
 
-class BlinkWindowTimers {
-  static clearInterval_Callback_1(mthis, handle) native "WindowTimers_clearInterval_Callback";
+class BlinkDedicatedWorkerGlobalScope extends BlinkWorkerGlobalScope {
+  static final instance = new BlinkDedicatedWorkerGlobalScope();
 
-  static clearTimeout_Callback_1(mthis, handle) native "WindowTimers_clearTimeout_Callback";
+  static onmessage_Getter(mthis) native "DedicatedWorkerGlobalScope_onmessage_Getter";
+  onmessage_Getter_(mthis) => onmessage_Getter(mthis);
 
-  static setInterval_Callback_2(mthis, handler, timeout) native "WindowTimers_setInterval_Callback";
+  static onmessage_Setter(mthis, __arg_0) native "DedicatedWorkerGlobalScope_onmessage_Setter";
+  onmessage_Setter_(mthis, __arg_0) => onmessage_Setter(mthis, __arg_0);
 
-  static setTimeout_Callback_2(mthis, handler, timeout) native "WindowTimers_setTimeout_Callback";
+  static postMessage_Callback_0(mthis) native "DedicatedWorkerGlobalScope_postMessage_Callback";
+  postMessage_Callback_0_(mthis) => postMessage_Callback_0(mthis);
+
+  static postMessage_Callback_1(mthis, __arg_0) native "DedicatedWorkerGlobalScope_postMessage_Callback";
+  postMessage_Callback_1_(mthis, __arg_0) => postMessage_Callback_1(mthis, __arg_0);
+
+  static postMessage_Callback_2(mthis, __arg_0, __arg_1) native "DedicatedWorkerGlobalScope_postMessage_Callback";
+  postMessage_Callback_2_(mthis, __arg_0, __arg_1) => postMessage_Callback_2(mthis, __arg_0, __arg_1);
+
+  static postMessage_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "DedicatedWorkerGlobalScope_postMessage_Callback";
+  postMessage_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => postMessage_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static postMessage_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "DedicatedWorkerGlobalScope_postMessage_Callback";
+  postMessage_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => postMessage_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
 }
 
-class BlinkWorkerGlobalScope {
-  static console_Getter(mthis) native "WorkerGlobalScope_console_Getter";
+class BlinkDelayNode extends BlinkAudioNode {
+  static final instance = new BlinkDelayNode();
 
-  static crypto_Getter(mthis) native "WorkerGlobalScope_crypto_Getter";
-
-  static indexedDB_Getter(mthis) native "WorkerGlobalScope_indexedDB_Getter";
-
-  static location_Getter(mthis) native "WorkerGlobalScope_location_Getter";
-
-  static navigator_Getter(mthis) native "WorkerGlobalScope_navigator_Getter";
-
-  static performance_Getter(mthis) native "WorkerGlobalScope_performance_Getter";
-
-  static self_Getter(mthis) native "WorkerGlobalScope_self_Getter";
-
-  static close_Callback(mthis) native "WorkerGlobalScope_close_Callback";
-
-  static importScripts_Callback_1(mthis, urls) native "WorkerGlobalScope_importScripts_Callback";
-
-  static openDatabase_Callback_5(mthis, name, version, displayName, estimatedSize, creationCallback) native "WorkerGlobalScope_openDatabase_Callback";
-
-  static openDatabase_Callback_4(mthis, name, version, displayName, estimatedSize) native "WorkerGlobalScope_openDatabase_Callback";
-
-  static openDatabaseSync_Callback_5(mthis, name, version, displayName, estimatedSize, creationCallback) native "WorkerGlobalScope_openDatabaseSync_Callback";
-
-  static openDatabaseSync_Callback_4(mthis, name, version, displayName, estimatedSize) native "WorkerGlobalScope_openDatabaseSync_Callback";
-
-  static webkitRequestFileSystem_Callback_4(mthis, type, size, successCallback, errorCallback) native "WorkerGlobalScope_webkitRequestFileSystem_Callback";
-
-  static webkitRequestFileSystem_Callback_3(mthis, type, size, successCallback) native "WorkerGlobalScope_webkitRequestFileSystem_Callback";
-
-  static webkitRequestFileSystem_Callback_2(mthis, type, size) native "WorkerGlobalScope_webkitRequestFileSystem_Callback";
-
-  static webkitRequestFileSystemSync_Callback_2(mthis, type, size) native "WorkerGlobalScope_webkitRequestFileSystemSync_Callback";
-
-  static webkitResolveLocalFileSystemSyncURL_Callback_1(mthis, url) native "WorkerGlobalScope_webkitResolveLocalFileSystemSyncURL_Callback";
-
-  static webkitResolveLocalFileSystemURL_Callback_3(mthis, url, successCallback, errorCallback) native "WorkerGlobalScope_webkitResolveLocalFileSystemURL_Callback";
-
-  static webkitResolveLocalFileSystemURL_Callback_2(mthis, url, successCallback) native "WorkerGlobalScope_webkitResolveLocalFileSystemURL_Callback";
-
-  static atob_Callback_1(mthis, string) native "WorkerGlobalScope_atob_Callback";
-
-  static btoa_Callback_1(mthis, string) native "WorkerGlobalScope_btoa_Callback";
-
-  static clearInterval_Callback_1(mthis, handle) native "WorkerGlobalScope_clearInterval_Callback";
-
-  static clearTimeout_Callback_1(mthis, handle) native "WorkerGlobalScope_clearTimeout_Callback";
-
-  static setInterval_Callback_2(mthis, handler, timeout) native "WorkerGlobalScope_setInterval_Callback";
-
-  static setTimeout_Callback_2(mthis, handler, timeout) native "WorkerGlobalScope_setTimeout_Callback";
-}
-
-class BlinkDedicatedWorkerGlobalScope {
-  static postMessage_Callback_2(mthis, message, transfer) native "DedicatedWorkerGlobalScope_postMessage_Callback";
-}
-
-class BlinkDelayNode {
   static delayTime_Getter(mthis) native "DelayNode_delayTime_Getter";
+  delayTime_Getter_(mthis) => delayTime_Getter(mthis);
+
 }
 
 class BlinkDeprecatedStorageInfo {
-  static queryUsageAndQuota_Callback_3(mthis, storageType, usageCallback, errorCallback) native "DeprecatedStorageInfo_queryUsageAndQuota_Callback";
+  static final instance = new BlinkDeprecatedStorageInfo();
 
-  static queryUsageAndQuota_Callback_2(mthis, storageType, usageCallback) native "DeprecatedStorageInfo_queryUsageAndQuota_Callback";
+  static queryUsageAndQuota_Callback_0(mthis) native "DeprecatedStorageInfo_queryUsageAndQuota_Callback";
+  queryUsageAndQuota_Callback_0_(mthis) => queryUsageAndQuota_Callback_0(mthis);
 
-  static queryUsageAndQuota_Callback_1(mthis, storageType) native "DeprecatedStorageInfo_queryUsageAndQuota_Callback";
+  static queryUsageAndQuota_Callback_1(mthis, __arg_0) native "DeprecatedStorageInfo_queryUsageAndQuota_Callback";
+  queryUsageAndQuota_Callback_1_(mthis, __arg_0) => queryUsageAndQuota_Callback_1(mthis, __arg_0);
 
-  static requestQuota_Callback_4(mthis, storageType, newQuotaInBytes, quotaCallback, errorCallback) native "DeprecatedStorageInfo_requestQuota_Callback";
+  static queryUsageAndQuota_Callback_2(mthis, __arg_0, __arg_1) native "DeprecatedStorageInfo_queryUsageAndQuota_Callback";
+  queryUsageAndQuota_Callback_2_(mthis, __arg_0, __arg_1) => queryUsageAndQuota_Callback_2(mthis, __arg_0, __arg_1);
 
-  static requestQuota_Callback_3(mthis, storageType, newQuotaInBytes, quotaCallback) native "DeprecatedStorageInfo_requestQuota_Callback";
+  static queryUsageAndQuota_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "DeprecatedStorageInfo_queryUsageAndQuota_Callback";
+  queryUsageAndQuota_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => queryUsageAndQuota_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
-  static requestQuota_Callback_2(mthis, storageType, newQuotaInBytes) native "DeprecatedStorageInfo_requestQuota_Callback";
+  static queryUsageAndQuota_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "DeprecatedStorageInfo_queryUsageAndQuota_Callback";
+  queryUsageAndQuota_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => queryUsageAndQuota_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static queryUsageAndQuota_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "DeprecatedStorageInfo_queryUsageAndQuota_Callback";
+  queryUsageAndQuota_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => queryUsageAndQuota_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static requestQuota_Callback_0(mthis) native "DeprecatedStorageInfo_requestQuota_Callback";
+  requestQuota_Callback_0_(mthis) => requestQuota_Callback_0(mthis);
+
+  static requestQuota_Callback_1(mthis, __arg_0) native "DeprecatedStorageInfo_requestQuota_Callback";
+  requestQuota_Callback_1_(mthis, __arg_0) => requestQuota_Callback_1(mthis, __arg_0);
+
+  static requestQuota_Callback_2(mthis, __arg_0, __arg_1) native "DeprecatedStorageInfo_requestQuota_Callback";
+  requestQuota_Callback_2_(mthis, __arg_0, __arg_1) => requestQuota_Callback_2(mthis, __arg_0, __arg_1);
+
+  static requestQuota_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "DeprecatedStorageInfo_requestQuota_Callback";
+  requestQuota_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => requestQuota_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static requestQuota_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "DeprecatedStorageInfo_requestQuota_Callback";
+  requestQuota_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => requestQuota_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static requestQuota_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "DeprecatedStorageInfo_requestQuota_Callback";
+  requestQuota_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => requestQuota_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static requestQuota_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "DeprecatedStorageInfo_requestQuota_Callback";
+  requestQuota_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => requestQuota_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
 }
 
 class BlinkDeprecatedStorageQuota {
-  static queryUsageAndQuota_Callback_2(mthis, usageCallback, errorCallback) native "DeprecatedStorageQuota_queryUsageAndQuota_Callback";
+  static final instance = new BlinkDeprecatedStorageQuota();
 
-  static queryUsageAndQuota_Callback_1(mthis, usageCallback) native "DeprecatedStorageQuota_queryUsageAndQuota_Callback";
+  static queryUsageAndQuota_Callback_0(mthis) native "DeprecatedStorageQuota_queryUsageAndQuota_Callback";
+  queryUsageAndQuota_Callback_0_(mthis) => queryUsageAndQuota_Callback_0(mthis);
 
-  static requestQuota_Callback_3(mthis, newQuotaInBytes, quotaCallback, errorCallback) native "DeprecatedStorageQuota_requestQuota_Callback";
+  static queryUsageAndQuota_Callback_1(mthis, __arg_0) native "DeprecatedStorageQuota_queryUsageAndQuota_Callback";
+  queryUsageAndQuota_Callback_1_(mthis, __arg_0) => queryUsageAndQuota_Callback_1(mthis, __arg_0);
 
-  static requestQuota_Callback_2(mthis, newQuotaInBytes, quotaCallback) native "DeprecatedStorageQuota_requestQuota_Callback";
+  static queryUsageAndQuota_Callback_2(mthis, __arg_0, __arg_1) native "DeprecatedStorageQuota_queryUsageAndQuota_Callback";
+  queryUsageAndQuota_Callback_2_(mthis, __arg_0, __arg_1) => queryUsageAndQuota_Callback_2(mthis, __arg_0, __arg_1);
 
-  static requestQuota_Callback_1(mthis, newQuotaInBytes) native "DeprecatedStorageQuota_requestQuota_Callback";
+  static queryUsageAndQuota_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "DeprecatedStorageQuota_queryUsageAndQuota_Callback";
+  queryUsageAndQuota_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => queryUsageAndQuota_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static queryUsageAndQuota_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "DeprecatedStorageQuota_queryUsageAndQuota_Callback";
+  queryUsageAndQuota_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => queryUsageAndQuota_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static requestQuota_Callback_0(mthis) native "DeprecatedStorageQuota_requestQuota_Callback";
+  requestQuota_Callback_0_(mthis) => requestQuota_Callback_0(mthis);
+
+  static requestQuota_Callback_1(mthis, __arg_0) native "DeprecatedStorageQuota_requestQuota_Callback";
+  requestQuota_Callback_1_(mthis, __arg_0) => requestQuota_Callback_1(mthis, __arg_0);
+
+  static requestQuota_Callback_2(mthis, __arg_0, __arg_1) native "DeprecatedStorageQuota_requestQuota_Callback";
+  requestQuota_Callback_2_(mthis, __arg_0, __arg_1) => requestQuota_Callback_2(mthis, __arg_0, __arg_1);
+
+  static requestQuota_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "DeprecatedStorageQuota_requestQuota_Callback";
+  requestQuota_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => requestQuota_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static requestQuota_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "DeprecatedStorageQuota_requestQuota_Callback";
+  requestQuota_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => requestQuota_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static requestQuota_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "DeprecatedStorageQuota_requestQuota_Callback";
+  requestQuota_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => requestQuota_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
 }
 
 class BlinkDeviceAcceleration {
+  static final instance = new BlinkDeviceAcceleration();
+
   static x_Getter(mthis) native "DeviceAcceleration_x_Getter";
+  x_Getter_(mthis) => x_Getter(mthis);
 
   static y_Getter(mthis) native "DeviceAcceleration_y_Getter";
+  y_Getter_(mthis) => y_Getter(mthis);
 
   static z_Getter(mthis) native "DeviceAcceleration_z_Getter";
+  z_Getter_(mthis) => z_Getter(mthis);
+
 }
 
-class BlinkDeviceLightEvent {
-  static constructorCallback(type, options) native "DeviceLightEvent_constructorCallback";
+class BlinkDeviceLightEvent extends BlinkEvent {
+  static final instance = new BlinkDeviceLightEvent();
+
+  static constructorCallback_2(__arg_0, __arg_1) native "DeviceLightEvent_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
 
   static value_Getter(mthis) native "DeviceLightEvent_value_Getter";
+  value_Getter_(mthis) => value_Getter(mthis);
+
 }
 
-class BlinkDeviceMotionEvent {
-  static acceleration_Getter(mthis) native "DeviceMotionEvent_acceleration_Getter";
+class BlinkDeviceMotionEvent extends BlinkEvent {
+  static final instance = new BlinkDeviceMotionEvent();
 
   static accelerationIncludingGravity_Getter(mthis) native "DeviceMotionEvent_accelerationIncludingGravity_Getter";
+  accelerationIncludingGravity_Getter_(mthis) => accelerationIncludingGravity_Getter(mthis);
+
+  static acceleration_Getter(mthis) native "DeviceMotionEvent_acceleration_Getter";
+  acceleration_Getter_(mthis) => acceleration_Getter(mthis);
+
+  static initDeviceMotionEvent_Callback_0(mthis) native "DeviceMotionEvent_initDeviceMotionEvent_Callback";
+  initDeviceMotionEvent_Callback_0_(mthis) => initDeviceMotionEvent_Callback_0(mthis);
+
+  static initDeviceMotionEvent_Callback_1(mthis, __arg_0) native "DeviceMotionEvent_initDeviceMotionEvent_Callback";
+  initDeviceMotionEvent_Callback_1_(mthis, __arg_0) => initDeviceMotionEvent_Callback_1(mthis, __arg_0);
+
+  static initDeviceMotionEvent_Callback_2(mthis, __arg_0, __arg_1) native "DeviceMotionEvent_initDeviceMotionEvent_Callback";
+  initDeviceMotionEvent_Callback_2_(mthis, __arg_0, __arg_1) => initDeviceMotionEvent_Callback_2(mthis, __arg_0, __arg_1);
+
+  static initDeviceMotionEvent_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "DeviceMotionEvent_initDeviceMotionEvent_Callback";
+  initDeviceMotionEvent_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => initDeviceMotionEvent_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static initDeviceMotionEvent_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "DeviceMotionEvent_initDeviceMotionEvent_Callback";
+  initDeviceMotionEvent_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => initDeviceMotionEvent_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static initDeviceMotionEvent_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "DeviceMotionEvent_initDeviceMotionEvent_Callback";
+  initDeviceMotionEvent_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => initDeviceMotionEvent_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static initDeviceMotionEvent_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "DeviceMotionEvent_initDeviceMotionEvent_Callback";
+  initDeviceMotionEvent_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => initDeviceMotionEvent_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static initDeviceMotionEvent_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) native "DeviceMotionEvent_initDeviceMotionEvent_Callback";
+  initDeviceMotionEvent_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => initDeviceMotionEvent_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6);
+
+  static initDeviceMotionEvent_Callback_8(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) native "DeviceMotionEvent_initDeviceMotionEvent_Callback";
+  initDeviceMotionEvent_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => initDeviceMotionEvent_Callback_8(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7);
+
+  static initDeviceMotionEvent_Callback_9(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) native "DeviceMotionEvent_initDeviceMotionEvent_Callback";
+  initDeviceMotionEvent_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => initDeviceMotionEvent_Callback_9(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8);
 
   static interval_Getter(mthis) native "DeviceMotionEvent_interval_Getter";
+  interval_Getter_(mthis) => interval_Getter(mthis);
 
   static rotationRate_Getter(mthis) native "DeviceMotionEvent_rotationRate_Getter";
+  rotationRate_Getter_(mthis) => rotationRate_Getter(mthis);
 
-  static initDeviceMotionEvent_Callback_7(mthis, type, bubbles, cancelable, acceleration, accelerationIncludingGravity, rotationRate, interval) native "DeviceMotionEvent_initDeviceMotionEvent_Callback";
 }
 
-class BlinkDeviceOrientationEvent {
+class BlinkDeviceOrientationEvent extends BlinkEvent {
+  static final instance = new BlinkDeviceOrientationEvent();
+
   static absolute_Getter(mthis) native "DeviceOrientationEvent_absolute_Getter";
+  absolute_Getter_(mthis) => absolute_Getter(mthis);
 
   static alpha_Getter(mthis) native "DeviceOrientationEvent_alpha_Getter";
+  alpha_Getter_(mthis) => alpha_Getter(mthis);
 
   static beta_Getter(mthis) native "DeviceOrientationEvent_beta_Getter";
+  beta_Getter_(mthis) => beta_Getter(mthis);
 
   static gamma_Getter(mthis) native "DeviceOrientationEvent_gamma_Getter";
+  gamma_Getter_(mthis) => gamma_Getter(mthis);
 
-  static initDeviceOrientationEvent_Callback_7(mthis, type, bubbles, cancelable, alpha, beta, gamma, absolute) native "DeviceOrientationEvent_initDeviceOrientationEvent_Callback";
+  static initDeviceOrientationEvent_Callback_0(mthis) native "DeviceOrientationEvent_initDeviceOrientationEvent_Callback";
+  initDeviceOrientationEvent_Callback_0_(mthis) => initDeviceOrientationEvent_Callback_0(mthis);
+
+  static initDeviceOrientationEvent_Callback_1(mthis, __arg_0) native "DeviceOrientationEvent_initDeviceOrientationEvent_Callback";
+  initDeviceOrientationEvent_Callback_1_(mthis, __arg_0) => initDeviceOrientationEvent_Callback_1(mthis, __arg_0);
+
+  static initDeviceOrientationEvent_Callback_2(mthis, __arg_0, __arg_1) native "DeviceOrientationEvent_initDeviceOrientationEvent_Callback";
+  initDeviceOrientationEvent_Callback_2_(mthis, __arg_0, __arg_1) => initDeviceOrientationEvent_Callback_2(mthis, __arg_0, __arg_1);
+
+  static initDeviceOrientationEvent_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "DeviceOrientationEvent_initDeviceOrientationEvent_Callback";
+  initDeviceOrientationEvent_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => initDeviceOrientationEvent_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static initDeviceOrientationEvent_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "DeviceOrientationEvent_initDeviceOrientationEvent_Callback";
+  initDeviceOrientationEvent_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => initDeviceOrientationEvent_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static initDeviceOrientationEvent_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "DeviceOrientationEvent_initDeviceOrientationEvent_Callback";
+  initDeviceOrientationEvent_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => initDeviceOrientationEvent_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static initDeviceOrientationEvent_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "DeviceOrientationEvent_initDeviceOrientationEvent_Callback";
+  initDeviceOrientationEvent_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => initDeviceOrientationEvent_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static initDeviceOrientationEvent_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) native "DeviceOrientationEvent_initDeviceOrientationEvent_Callback";
+  initDeviceOrientationEvent_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => initDeviceOrientationEvent_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6);
+
+  static initDeviceOrientationEvent_Callback_8(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) native "DeviceOrientationEvent_initDeviceOrientationEvent_Callback";
+  initDeviceOrientationEvent_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => initDeviceOrientationEvent_Callback_8(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7);
+
+  static initDeviceOrientationEvent_Callback_9(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) native "DeviceOrientationEvent_initDeviceOrientationEvent_Callback";
+  initDeviceOrientationEvent_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => initDeviceOrientationEvent_Callback_9(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8);
+
 }
 
 class BlinkDeviceRotationRate {
+  static final instance = new BlinkDeviceRotationRate();
+
   static alpha_Getter(mthis) native "DeviceRotationRate_alpha_Getter";
+  alpha_Getter_(mthis) => alpha_Getter(mthis);
 
   static beta_Getter(mthis) native "DeviceRotationRate_beta_Getter";
+  beta_Getter_(mthis) => beta_Getter(mthis);
 
   static gamma_Getter(mthis) native "DeviceRotationRate_gamma_Getter";
+  gamma_Getter_(mthis) => gamma_Getter(mthis);
+
+}
+
+class BlinkDirectoryEntry extends BlinkEntry {
+  static final instance = new BlinkDirectoryEntry();
+
+  static createReader_Callback_0(mthis) native "DirectoryEntry_createReader_Callback";
+  createReader_Callback_0_(mthis) => createReader_Callback_0(mthis);
+
+  static createReader_Callback_1(mthis, __arg_0) native "DirectoryEntry_createReader_Callback";
+  createReader_Callback_1_(mthis, __arg_0) => createReader_Callback_1(mthis, __arg_0);
+
+  static createReader_Callback_2(mthis, __arg_0, __arg_1) native "DirectoryEntry_createReader_Callback";
+  createReader_Callback_2_(mthis, __arg_0, __arg_1) => createReader_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getDirectory_Callback_0(mthis) native "DirectoryEntry_getDirectory_Callback";
+  getDirectory_Callback_0_(mthis) => getDirectory_Callback_0(mthis);
+
+  static getDirectory_Callback_1(mthis, __arg_0) native "DirectoryEntry_getDirectory_Callback";
+  getDirectory_Callback_1_(mthis, __arg_0) => getDirectory_Callback_1(mthis, __arg_0);
+
+  static getDirectory_Callback_2(mthis, __arg_0, __arg_1) native "DirectoryEntry_getDirectory_Callback";
+  getDirectory_Callback_2_(mthis, __arg_0, __arg_1) => getDirectory_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getDirectory_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "DirectoryEntry_getDirectory_Callback";
+  getDirectory_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getDirectory_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static getDirectory_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "DirectoryEntry_getDirectory_Callback";
+  getDirectory_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => getDirectory_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static getDirectory_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "DirectoryEntry_getDirectory_Callback";
+  getDirectory_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => getDirectory_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static getDirectory_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "DirectoryEntry_getDirectory_Callback";
+  getDirectory_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => getDirectory_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static getFile_Callback_0(mthis) native "DirectoryEntry_getFile_Callback";
+  getFile_Callback_0_(mthis) => getFile_Callback_0(mthis);
+
+  static getFile_Callback_1(mthis, __arg_0) native "DirectoryEntry_getFile_Callback";
+  getFile_Callback_1_(mthis, __arg_0) => getFile_Callback_1(mthis, __arg_0);
+
+  static getFile_Callback_2(mthis, __arg_0, __arg_1) native "DirectoryEntry_getFile_Callback";
+  getFile_Callback_2_(mthis, __arg_0, __arg_1) => getFile_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getFile_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "DirectoryEntry_getFile_Callback";
+  getFile_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getFile_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static getFile_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "DirectoryEntry_getFile_Callback";
+  getFile_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => getFile_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static getFile_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "DirectoryEntry_getFile_Callback";
+  getFile_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => getFile_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static getFile_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "DirectoryEntry_getFile_Callback";
+  getFile_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => getFile_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static removeRecursively_Callback_0(mthis) native "DirectoryEntry_removeRecursively_Callback";
+  removeRecursively_Callback_0_(mthis) => removeRecursively_Callback_0(mthis);
+
+  static removeRecursively_Callback_1(mthis, __arg_0) native "DirectoryEntry_removeRecursively_Callback";
+  removeRecursively_Callback_1_(mthis, __arg_0) => removeRecursively_Callback_1(mthis, __arg_0);
+
+  static removeRecursively_Callback_2(mthis, __arg_0, __arg_1) native "DirectoryEntry_removeRecursively_Callback";
+  removeRecursively_Callback_2_(mthis, __arg_0, __arg_1) => removeRecursively_Callback_2(mthis, __arg_0, __arg_1);
+
+  static removeRecursively_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "DirectoryEntry_removeRecursively_Callback";
+  removeRecursively_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => removeRecursively_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static removeRecursively_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "DirectoryEntry_removeRecursively_Callback";
+  removeRecursively_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => removeRecursively_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+}
+
+class BlinkDirectoryEntrySync extends BlinkEntrySync {
+  static final instance = new BlinkDirectoryEntrySync();
+
+  static createReader_Callback_0(mthis) native "DirectoryEntrySync_createReader_Callback";
+  createReader_Callback_0_(mthis) => createReader_Callback_0(mthis);
+
+  static createReader_Callback_1(mthis, __arg_0) native "DirectoryEntrySync_createReader_Callback";
+  createReader_Callback_1_(mthis, __arg_0) => createReader_Callback_1(mthis, __arg_0);
+
+  static createReader_Callback_2(mthis, __arg_0, __arg_1) native "DirectoryEntrySync_createReader_Callback";
+  createReader_Callback_2_(mthis, __arg_0, __arg_1) => createReader_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getDirectory_Callback_0(mthis) native "DirectoryEntrySync_getDirectory_Callback";
+  getDirectory_Callback_0_(mthis) => getDirectory_Callback_0(mthis);
+
+  static getDirectory_Callback_1(mthis, __arg_0) native "DirectoryEntrySync_getDirectory_Callback";
+  getDirectory_Callback_1_(mthis, __arg_0) => getDirectory_Callback_1(mthis, __arg_0);
+
+  static getDirectory_Callback_2(mthis, __arg_0, __arg_1) native "DirectoryEntrySync_getDirectory_Callback";
+  getDirectory_Callback_2_(mthis, __arg_0, __arg_1) => getDirectory_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getDirectory_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "DirectoryEntrySync_getDirectory_Callback";
+  getDirectory_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getDirectory_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static getDirectory_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "DirectoryEntrySync_getDirectory_Callback";
+  getDirectory_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => getDirectory_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static getFile_Callback_0(mthis) native "DirectoryEntrySync_getFile_Callback";
+  getFile_Callback_0_(mthis) => getFile_Callback_0(mthis);
+
+  static getFile_Callback_1(mthis, __arg_0) native "DirectoryEntrySync_getFile_Callback";
+  getFile_Callback_1_(mthis, __arg_0) => getFile_Callback_1(mthis, __arg_0);
+
+  static getFile_Callback_2(mthis, __arg_0, __arg_1) native "DirectoryEntrySync_getFile_Callback";
+  getFile_Callback_2_(mthis, __arg_0, __arg_1) => getFile_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getFile_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "DirectoryEntrySync_getFile_Callback";
+  getFile_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getFile_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static getFile_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "DirectoryEntrySync_getFile_Callback";
+  getFile_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => getFile_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static removeRecursively_Callback_0(mthis) native "DirectoryEntrySync_removeRecursively_Callback";
+  removeRecursively_Callback_0_(mthis) => removeRecursively_Callback_0(mthis);
+
+  static removeRecursively_Callback_1(mthis, __arg_0) native "DirectoryEntrySync_removeRecursively_Callback";
+  removeRecursively_Callback_1_(mthis, __arg_0) => removeRecursively_Callback_1(mthis, __arg_0);
+
+  static removeRecursively_Callback_2(mthis, __arg_0, __arg_1) native "DirectoryEntrySync_removeRecursively_Callback";
+  removeRecursively_Callback_2_(mthis, __arg_0, __arg_1) => removeRecursively_Callback_2(mthis, __arg_0, __arg_1);
+
+}
+
+class BlinkDirectoryReader {
+  static final instance = new BlinkDirectoryReader();
+
+  static readEntries_Callback_0(mthis) native "DirectoryReader_readEntries_Callback";
+  readEntries_Callback_0_(mthis) => readEntries_Callback_0(mthis);
+
+  static readEntries_Callback_1(mthis, __arg_0) native "DirectoryReader_readEntries_Callback";
+  readEntries_Callback_1_(mthis, __arg_0) => readEntries_Callback_1(mthis, __arg_0);
+
+  static readEntries_Callback_2(mthis, __arg_0, __arg_1) native "DirectoryReader_readEntries_Callback";
+  readEntries_Callback_2_(mthis, __arg_0, __arg_1) => readEntries_Callback_2(mthis, __arg_0, __arg_1);
+
+  static readEntries_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "DirectoryReader_readEntries_Callback";
+  readEntries_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => readEntries_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static readEntries_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "DirectoryReader_readEntries_Callback";
+  readEntries_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => readEntries_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+}
+
+class BlinkDirectoryReaderSync {
+  static final instance = new BlinkDirectoryReaderSync();
+
+  static readEntries_Callback_0(mthis) native "DirectoryReaderSync_readEntries_Callback";
+  readEntries_Callback_0_(mthis) => readEntries_Callback_0(mthis);
+
+  static readEntries_Callback_1(mthis, __arg_0) native "DirectoryReaderSync_readEntries_Callback";
+  readEntries_Callback_1_(mthis, __arg_0) => readEntries_Callback_1(mthis, __arg_0);
+
+  static readEntries_Callback_2(mthis, __arg_0, __arg_1) native "DirectoryReaderSync_readEntries_Callback";
+  readEntries_Callback_2_(mthis, __arg_0, __arg_1) => readEntries_Callback_2(mthis, __arg_0, __arg_1);
+
+}
+
+class BlinkDocument extends BlinkNode {
+  static final instance = new BlinkDocument();
+
+  static URL_Getter(mthis) native "Document_URL_Getter";
+  URL_Getter_(mthis) => URL_Getter(mthis);
+
+  static activeElement_Getter(mthis) native "Document_activeElement_Getter";
+  activeElement_Getter_(mthis) => activeElement_Getter(mthis);
+
+  static adoptNode_Callback_0(mthis) native "Document_adoptNode_Callback";
+  adoptNode_Callback_0_(mthis) => adoptNode_Callback_0(mthis);
+
+  static adoptNode_Callback_1(mthis, __arg_0) native "Document_adoptNode_Callback";
+  adoptNode_Callback_1_(mthis, __arg_0) => adoptNode_Callback_1(mthis, __arg_0);
+
+  static adoptNode_Callback_2(mthis, __arg_0, __arg_1) native "Document_adoptNode_Callback";
+  adoptNode_Callback_2_(mthis, __arg_0, __arg_1) => adoptNode_Callback_2(mthis, __arg_0, __arg_1);
+
+  static adoptNode_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Document_adoptNode_Callback";
+  adoptNode_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => adoptNode_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static anchors_Getter(mthis) native "Document_anchors_Getter";
+  anchors_Getter_(mthis) => anchors_Getter(mthis);
+
+  static body_Getter(mthis) native "Document_body_Getter";
+  body_Getter_(mthis) => body_Getter(mthis);
+
+  static body_Setter(mthis, __arg_0) native "Document_body_Setter";
+  body_Setter_(mthis, __arg_0) => body_Setter(mthis, __arg_0);
+
+  static caretRangeFromPoint_Callback_0(mthis) native "Document_caretRangeFromPoint_Callback";
+  caretRangeFromPoint_Callback_0_(mthis) => caretRangeFromPoint_Callback_0(mthis);
+
+  static caretRangeFromPoint_Callback_1(mthis, __arg_0) native "Document_caretRangeFromPoint_Callback";
+  caretRangeFromPoint_Callback_1_(mthis, __arg_0) => caretRangeFromPoint_Callback_1(mthis, __arg_0);
+
+  static caretRangeFromPoint_Callback_2(mthis, __arg_0, __arg_1) native "Document_caretRangeFromPoint_Callback";
+  caretRangeFromPoint_Callback_2_(mthis, __arg_0, __arg_1) => caretRangeFromPoint_Callback_2(mthis, __arg_0, __arg_1);
+
+  static caretRangeFromPoint_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Document_caretRangeFromPoint_Callback";
+  caretRangeFromPoint_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => caretRangeFromPoint_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static caretRangeFromPoint_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Document_caretRangeFromPoint_Callback";
+  caretRangeFromPoint_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => caretRangeFromPoint_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static characterSet_Getter(mthis) native "Document_characterSet_Getter";
+  characterSet_Getter_(mthis) => characterSet_Getter(mthis);
+
+  static charset_Getter(mthis) native "Document_charset_Getter";
+  charset_Getter_(mthis) => charset_Getter(mthis);
+
+  static charset_Setter(mthis, __arg_0) native "Document_charset_Setter";
+  charset_Setter_(mthis, __arg_0) => charset_Setter(mthis, __arg_0);
+
+  static childElementCount_Getter(mthis) native "Document_childElementCount_Getter";
+  childElementCount_Getter_(mthis) => childElementCount_Getter(mthis);
+
+  static children_Getter(mthis) native "Document_children_Getter";
+  children_Getter_(mthis) => children_Getter(mthis);
+
+  static compatMode_Getter(mthis) native "Document_compatMode_Getter";
+  compatMode_Getter_(mthis) => compatMode_Getter(mthis);
+
+  static contentType_Getter(mthis) native "Document_contentType_Getter";
+  contentType_Getter_(mthis) => contentType_Getter(mthis);
+
+  static cookie_Getter(mthis) native "Document_cookie_Getter";
+  cookie_Getter_(mthis) => cookie_Getter(mthis);
+
+  static cookie_Setter(mthis, __arg_0) native "Document_cookie_Setter";
+  cookie_Setter_(mthis, __arg_0) => cookie_Setter(mthis, __arg_0);
+
+  static createCDATASection_Callback_0(mthis) native "Document_createCDATASection_Callback";
+  createCDATASection_Callback_0_(mthis) => createCDATASection_Callback_0(mthis);
+
+  static createCDATASection_Callback_1(mthis, __arg_0) native "Document_createCDATASection_Callback";
+  createCDATASection_Callback_1_(mthis, __arg_0) => createCDATASection_Callback_1(mthis, __arg_0);
+
+  static createCDATASection_Callback_2(mthis, __arg_0, __arg_1) native "Document_createCDATASection_Callback";
+  createCDATASection_Callback_2_(mthis, __arg_0, __arg_1) => createCDATASection_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createCDATASection_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Document_createCDATASection_Callback";
+  createCDATASection_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => createCDATASection_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static createDocumentFragment_Callback_0(mthis) native "Document_createDocumentFragment_Callback";
+  createDocumentFragment_Callback_0_(mthis) => createDocumentFragment_Callback_0(mthis);
+
+  static createDocumentFragment_Callback_1(mthis, __arg_0) native "Document_createDocumentFragment_Callback";
+  createDocumentFragment_Callback_1_(mthis, __arg_0) => createDocumentFragment_Callback_1(mthis, __arg_0);
+
+  static createDocumentFragment_Callback_2(mthis, __arg_0, __arg_1) native "Document_createDocumentFragment_Callback";
+  createDocumentFragment_Callback_2_(mthis, __arg_0, __arg_1) => createDocumentFragment_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createElementNS_Callback_0(mthis) native "Document_createElementNS_Callback";
+  createElementNS_Callback_0_(mthis) => createElementNS_Callback_0(mthis);
+
+  static createElementNS_Callback_1(mthis, __arg_0) native "Document_createElementNS_Callback";
+  createElementNS_Callback_1_(mthis, __arg_0) => createElementNS_Callback_1(mthis, __arg_0);
+
+  static createElementNS_Callback_2(mthis, __arg_0, __arg_1) native "Document_createElementNS_Callback";
+  createElementNS_Callback_2_(mthis, __arg_0, __arg_1) => createElementNS_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createElementNS_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Document_createElementNS_Callback";
+  createElementNS_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => createElementNS_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static createElementNS_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Document_createElementNS_Callback";
+  createElementNS_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => createElementNS_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static createElementNS_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "Document_createElementNS_Callback";
+  createElementNS_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => createElementNS_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static createElement_Callback_0(mthis) native "Document_createElement_Callback";
+  createElement_Callback_0_(mthis) => createElement_Callback_0(mthis);
+
+  static createElement_Callback_1(mthis, __arg_0) native "Document_createElement_Callback";
+  createElement_Callback_1_(mthis, __arg_0) => createElement_Callback_1(mthis, __arg_0);
+
+  static createElement_Callback_2(mthis, __arg_0, __arg_1) native "Document_createElement_Callback";
+  createElement_Callback_2_(mthis, __arg_0, __arg_1) => createElement_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createElement_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Document_createElement_Callback";
+  createElement_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => createElement_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static createElement_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Document_createElement_Callback";
+  createElement_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => createElement_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static createEvent_Callback_0(mthis) native "Document_createEvent_Callback";
+  createEvent_Callback_0_(mthis) => createEvent_Callback_0(mthis);
+
+  static createEvent_Callback_1(mthis, __arg_0) native "Document_createEvent_Callback";
+  createEvent_Callback_1_(mthis, __arg_0) => createEvent_Callback_1(mthis, __arg_0);
+
+  static createEvent_Callback_2(mthis, __arg_0, __arg_1) native "Document_createEvent_Callback";
+  createEvent_Callback_2_(mthis, __arg_0, __arg_1) => createEvent_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createEvent_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Document_createEvent_Callback";
+  createEvent_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => createEvent_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static createNodeIterator_Callback_0(mthis) native "Document_createNodeIterator_Callback";
+  createNodeIterator_Callback_0_(mthis) => createNodeIterator_Callback_0(mthis);
+
+  static createNodeIterator_Callback_1(mthis, __arg_0) native "Document_createNodeIterator_Callback";
+  createNodeIterator_Callback_1_(mthis, __arg_0) => createNodeIterator_Callback_1(mthis, __arg_0);
+
+  static createNodeIterator_Callback_2(mthis, __arg_0, __arg_1) native "Document_createNodeIterator_Callback";
+  createNodeIterator_Callback_2_(mthis, __arg_0, __arg_1) => createNodeIterator_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createNodeIterator_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Document_createNodeIterator_Callback";
+  createNodeIterator_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => createNodeIterator_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static createNodeIterator_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Document_createNodeIterator_Callback";
+  createNodeIterator_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => createNodeIterator_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static createNodeIterator_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "Document_createNodeIterator_Callback";
+  createNodeIterator_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => createNodeIterator_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static createRange_Callback_0(mthis) native "Document_createRange_Callback";
+  createRange_Callback_0_(mthis) => createRange_Callback_0(mthis);
+
+  static createRange_Callback_1(mthis, __arg_0) native "Document_createRange_Callback";
+  createRange_Callback_1_(mthis, __arg_0) => createRange_Callback_1(mthis, __arg_0);
+
+  static createRange_Callback_2(mthis, __arg_0, __arg_1) native "Document_createRange_Callback";
+  createRange_Callback_2_(mthis, __arg_0, __arg_1) => createRange_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createTextNode_Callback_0(mthis) native "Document_createTextNode_Callback";
+  createTextNode_Callback_0_(mthis) => createTextNode_Callback_0(mthis);
+
+  static createTextNode_Callback_1(mthis, __arg_0) native "Document_createTextNode_Callback";
+  createTextNode_Callback_1_(mthis, __arg_0) => createTextNode_Callback_1(mthis, __arg_0);
+
+  static createTextNode_Callback_2(mthis, __arg_0, __arg_1) native "Document_createTextNode_Callback";
+  createTextNode_Callback_2_(mthis, __arg_0, __arg_1) => createTextNode_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createTextNode_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Document_createTextNode_Callback";
+  createTextNode_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => createTextNode_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static createTouchList_Callback_0(mthis) native "Document_createTouchList_Callback";
+  createTouchList_Callback_0_(mthis) => createTouchList_Callback_0(mthis);
+
+  static createTouchList_Callback_1(mthis, __arg_0) native "Document_createTouchList_Callback";
+  createTouchList_Callback_1_(mthis, __arg_0) => createTouchList_Callback_1(mthis, __arg_0);
+
+  static createTouchList_Callback_2(mthis, __arg_0, __arg_1) native "Document_createTouchList_Callback";
+  createTouchList_Callback_2_(mthis, __arg_0, __arg_1) => createTouchList_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createTouchList_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Document_createTouchList_Callback";
+  createTouchList_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => createTouchList_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static createTouch_Callback_0(mthis) native "Document_createTouch_Callback";
+  createTouch_Callback_0_(mthis) => createTouch_Callback_0(mthis);
+
+  static createTouch_Callback_1(mthis, __arg_0) native "Document_createTouch_Callback";
+  createTouch_Callback_1_(mthis, __arg_0) => createTouch_Callback_1(mthis, __arg_0);
+
+  static createTouch_Callback_10(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9) native "Document_createTouch_Callback";
+  createTouch_Callback_10_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9) => createTouch_Callback_10(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9);
+
+  static createTouch_Callback_11(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10) native "Document_createTouch_Callback";
+  createTouch_Callback_11_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10) => createTouch_Callback_11(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10);
+
+  static createTouch_Callback_12(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11) native "Document_createTouch_Callback";
+  createTouch_Callback_12_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11) => createTouch_Callback_12(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11);
+
+  static createTouch_Callback_13(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11, __arg_12) native "Document_createTouch_Callback";
+  createTouch_Callback_13_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11, __arg_12) => createTouch_Callback_13(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11, __arg_12);
+
+  static createTouch_Callback_2(mthis, __arg_0, __arg_1) native "Document_createTouch_Callback";
+  createTouch_Callback_2_(mthis, __arg_0, __arg_1) => createTouch_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createTouch_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Document_createTouch_Callback";
+  createTouch_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => createTouch_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static createTouch_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Document_createTouch_Callback";
+  createTouch_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => createTouch_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static createTouch_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "Document_createTouch_Callback";
+  createTouch_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => createTouch_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static createTouch_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "Document_createTouch_Callback";
+  createTouch_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => createTouch_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static createTouch_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) native "Document_createTouch_Callback";
+  createTouch_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => createTouch_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6);
+
+  static createTouch_Callback_8(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) native "Document_createTouch_Callback";
+  createTouch_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => createTouch_Callback_8(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7);
+
+  static createTouch_Callback_9(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) native "Document_createTouch_Callback";
+  createTouch_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => createTouch_Callback_9(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8);
+
+  static createTreeWalker_Callback_0(mthis) native "Document_createTreeWalker_Callback";
+  createTreeWalker_Callback_0_(mthis) => createTreeWalker_Callback_0(mthis);
+
+  static createTreeWalker_Callback_1(mthis, __arg_0) native "Document_createTreeWalker_Callback";
+  createTreeWalker_Callback_1_(mthis, __arg_0) => createTreeWalker_Callback_1(mthis, __arg_0);
+
+  static createTreeWalker_Callback_2(mthis, __arg_0, __arg_1) native "Document_createTreeWalker_Callback";
+  createTreeWalker_Callback_2_(mthis, __arg_0, __arg_1) => createTreeWalker_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createTreeWalker_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Document_createTreeWalker_Callback";
+  createTreeWalker_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => createTreeWalker_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static createTreeWalker_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Document_createTreeWalker_Callback";
+  createTreeWalker_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => createTreeWalker_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static createTreeWalker_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "Document_createTreeWalker_Callback";
+  createTreeWalker_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => createTreeWalker_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static currentScript_Getter(mthis) native "Document_currentScript_Getter";
+  currentScript_Getter_(mthis) => currentScript_Getter(mthis);
+
+  static defaultCharset_Getter(mthis) native "Document_defaultCharset_Getter";
+  defaultCharset_Getter_(mthis) => defaultCharset_Getter(mthis);
+
+  static defaultView_Getter(mthis) native "Document_defaultView_Getter";
+  defaultView_Getter_(mthis) => defaultView_Getter(mthis);
+
+  static doctype_Getter(mthis) native "Document_doctype_Getter";
+  doctype_Getter_(mthis) => doctype_Getter(mthis);
+
+  static documentElement_Getter(mthis) native "Document_documentElement_Getter";
+  documentElement_Getter_(mthis) => documentElement_Getter(mthis);
+
+  static documentURI_Getter(mthis) native "Document_documentURI_Getter";
+  documentURI_Getter_(mthis) => documentURI_Getter(mthis);
+
+  static domain_Getter(mthis) native "Document_domain_Getter";
+  domain_Getter_(mthis) => domain_Getter(mthis);
+
+  static domain_Setter(mthis, __arg_0) native "Document_domain_Setter";
+  domain_Setter_(mthis, __arg_0) => domain_Setter(mthis, __arg_0);
+
+  static elementFromPoint_Callback_0(mthis) native "Document_elementFromPoint_Callback";
+  elementFromPoint_Callback_0_(mthis) => elementFromPoint_Callback_0(mthis);
+
+  static elementFromPoint_Callback_1(mthis, __arg_0) native "Document_elementFromPoint_Callback";
+  elementFromPoint_Callback_1_(mthis, __arg_0) => elementFromPoint_Callback_1(mthis, __arg_0);
+
+  static elementFromPoint_Callback_2(mthis, __arg_0, __arg_1) native "Document_elementFromPoint_Callback";
+  elementFromPoint_Callback_2_(mthis, __arg_0, __arg_1) => elementFromPoint_Callback_2(mthis, __arg_0, __arg_1);
+
+  static elementFromPoint_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Document_elementFromPoint_Callback";
+  elementFromPoint_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => elementFromPoint_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static elementFromPoint_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Document_elementFromPoint_Callback";
+  elementFromPoint_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => elementFromPoint_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static embeds_Getter(mthis) native "Document_embeds_Getter";
+  embeds_Getter_(mthis) => embeds_Getter(mthis);
+
+  static execCommand_Callback_0(mthis) native "Document_execCommand_Callback";
+  execCommand_Callback_0_(mthis) => execCommand_Callback_0(mthis);
+
+  static execCommand_Callback_1(mthis, __arg_0) native "Document_execCommand_Callback";
+  execCommand_Callback_1_(mthis, __arg_0) => execCommand_Callback_1(mthis, __arg_0);
+
+  static execCommand_Callback_2(mthis, __arg_0, __arg_1) native "Document_execCommand_Callback";
+  execCommand_Callback_2_(mthis, __arg_0, __arg_1) => execCommand_Callback_2(mthis, __arg_0, __arg_1);
+
+  static execCommand_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Document_execCommand_Callback";
+  execCommand_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => execCommand_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static execCommand_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Document_execCommand_Callback";
+  execCommand_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => execCommand_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static execCommand_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "Document_execCommand_Callback";
+  execCommand_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => execCommand_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static exitFullscreen_Callback_0(mthis) native "Document_exitFullscreen_Callback";
+  exitFullscreen_Callback_0_(mthis) => exitFullscreen_Callback_0(mthis);
+
+  static exitFullscreen_Callback_1(mthis, __arg_0) native "Document_exitFullscreen_Callback";
+  exitFullscreen_Callback_1_(mthis, __arg_0) => exitFullscreen_Callback_1(mthis, __arg_0);
+
+  static exitFullscreen_Callback_2(mthis, __arg_0, __arg_1) native "Document_exitFullscreen_Callback";
+  exitFullscreen_Callback_2_(mthis, __arg_0, __arg_1) => exitFullscreen_Callback_2(mthis, __arg_0, __arg_1);
+
+  static exitPointerLock_Callback_0(mthis) native "Document_exitPointerLock_Callback";
+  exitPointerLock_Callback_0_(mthis) => exitPointerLock_Callback_0(mthis);
+
+  static exitPointerLock_Callback_1(mthis, __arg_0) native "Document_exitPointerLock_Callback";
+  exitPointerLock_Callback_1_(mthis, __arg_0) => exitPointerLock_Callback_1(mthis, __arg_0);
+
+  static exitPointerLock_Callback_2(mthis, __arg_0, __arg_1) native "Document_exitPointerLock_Callback";
+  exitPointerLock_Callback_2_(mthis, __arg_0, __arg_1) => exitPointerLock_Callback_2(mthis, __arg_0, __arg_1);
+
+  static firstElementChild_Getter(mthis) native "Document_firstElementChild_Getter";
+  firstElementChild_Getter_(mthis) => firstElementChild_Getter(mthis);
+
+  static fonts_Getter(mthis) native "Document_fonts_Getter";
+  fonts_Getter_(mthis) => fonts_Getter(mthis);
+
+  static forms_Getter(mthis) native "Document_forms_Getter";
+  forms_Getter_(mthis) => forms_Getter(mthis);
+
+  static fullscreenElement_Getter(mthis) native "Document_fullscreenElement_Getter";
+  fullscreenElement_Getter_(mthis) => fullscreenElement_Getter(mthis);
+
+  static fullscreenEnabled_Getter(mthis) native "Document_fullscreenEnabled_Getter";
+  fullscreenEnabled_Getter_(mthis) => fullscreenEnabled_Getter(mthis);
+
+  static getCSSCanvasContext_Callback_2(mthis, __arg_0, __arg_1) native "Document_getCSSCanvasContext_Callback";
+  getCSSCanvasContext_Callback_2_(mthis, __arg_0, __arg_1) => getCSSCanvasContext_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getCSSCanvasContext_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Document_getCSSCanvasContext_Callback";
+  getCSSCanvasContext_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getCSSCanvasContext_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static getCSSCanvasContext_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Document_getCSSCanvasContext_Callback";
+  getCSSCanvasContext_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => getCSSCanvasContext_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static getCSSCanvasContext_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "Document_getCSSCanvasContext_Callback";
+  getCSSCanvasContext_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => getCSSCanvasContext_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static getCSSCanvasContext_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "Document_getCSSCanvasContext_Callback";
+  getCSSCanvasContext_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => getCSSCanvasContext_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static getElementById_Callback_0(mthis) native "Document_getElementById_Callback";
+  getElementById_Callback_0_(mthis) => getElementById_Callback_0(mthis);
+
+  static getElementById_Callback_1(mthis, __arg_0) native "Document_getElementById_Callback";
+  getElementById_Callback_1_(mthis, __arg_0) => getElementById_Callback_1(mthis, __arg_0);
+
+  static getElementById_Callback_2(mthis, __arg_0, __arg_1) native "Document_getElementById_Callback";
+  getElementById_Callback_2_(mthis, __arg_0, __arg_1) => getElementById_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getElementById_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Document_getElementById_Callback";
+  getElementById_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getElementById_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static getElementsByClassName_Callback_0(mthis) native "Document_getElementsByClassName_Callback";
+  getElementsByClassName_Callback_0_(mthis) => getElementsByClassName_Callback_0(mthis);
+
+  static getElementsByClassName_Callback_1(mthis, __arg_0) native "Document_getElementsByClassName_Callback";
+  getElementsByClassName_Callback_1_(mthis, __arg_0) => getElementsByClassName_Callback_1(mthis, __arg_0);
+
+  static getElementsByClassName_Callback_2(mthis, __arg_0, __arg_1) native "Document_getElementsByClassName_Callback";
+  getElementsByClassName_Callback_2_(mthis, __arg_0, __arg_1) => getElementsByClassName_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getElementsByClassName_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Document_getElementsByClassName_Callback";
+  getElementsByClassName_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getElementsByClassName_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static getElementsByName_Callback_0(mthis) native "Document_getElementsByName_Callback";
+  getElementsByName_Callback_0_(mthis) => getElementsByName_Callback_0(mthis);
+
+  static getElementsByName_Callback_1(mthis, __arg_0) native "Document_getElementsByName_Callback";
+  getElementsByName_Callback_1_(mthis, __arg_0) => getElementsByName_Callback_1(mthis, __arg_0);
+
+  static getElementsByName_Callback_2(mthis, __arg_0, __arg_1) native "Document_getElementsByName_Callback";
+  getElementsByName_Callback_2_(mthis, __arg_0, __arg_1) => getElementsByName_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getElementsByName_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Document_getElementsByName_Callback";
+  getElementsByName_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getElementsByName_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static getElementsByTagName_Callback_0(mthis) native "Document_getElementsByTagName_Callback";
+  getElementsByTagName_Callback_0_(mthis) => getElementsByTagName_Callback_0(mthis);
+
+  static getElementsByTagName_Callback_1(mthis, __arg_0) native "Document_getElementsByTagName_Callback";
+  getElementsByTagName_Callback_1_(mthis, __arg_0) => getElementsByTagName_Callback_1(mthis, __arg_0);
+
+  static getElementsByTagName_Callback_2(mthis, __arg_0, __arg_1) native "Document_getElementsByTagName_Callback";
+  getElementsByTagName_Callback_2_(mthis, __arg_0, __arg_1) => getElementsByTagName_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getElementsByTagName_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Document_getElementsByTagName_Callback";
+  getElementsByTagName_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getElementsByTagName_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static head_Getter(mthis) native "Document_head_Getter";
+  head_Getter_(mthis) => head_Getter(mthis);
+
+  static hidden_Getter(mthis) native "Document_hidden_Getter";
+  hidden_Getter_(mthis) => hidden_Getter(mthis);
+
+  static implementation_Getter(mthis) native "Document_implementation_Getter";
+  implementation_Getter_(mthis) => implementation_Getter(mthis);
+
+  static importNode_Callback_0(mthis) native "Document_importNode_Callback";
+  importNode_Callback_0_(mthis) => importNode_Callback_0(mthis);
+
+  static importNode_Callback_1(mthis, __arg_0) native "Document_importNode_Callback";
+  importNode_Callback_1_(mthis, __arg_0) => importNode_Callback_1(mthis, __arg_0);
+
+  static importNode_Callback_2(mthis, __arg_0, __arg_1) native "Document_importNode_Callback";
+  importNode_Callback_2_(mthis, __arg_0, __arg_1) => importNode_Callback_2(mthis, __arg_0, __arg_1);
+
+  static importNode_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Document_importNode_Callback";
+  importNode_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => importNode_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static importNode_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Document_importNode_Callback";
+  importNode_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => importNode_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static inputEncoding_Getter(mthis) native "Document_inputEncoding_Getter";
+  inputEncoding_Getter_(mthis) => inputEncoding_Getter(mthis);
+
+  static lastElementChild_Getter(mthis) native "Document_lastElementChild_Getter";
+  lastElementChild_Getter_(mthis) => lastElementChild_Getter(mthis);
+
+  static lastModified_Getter(mthis) native "Document_lastModified_Getter";
+  lastModified_Getter_(mthis) => lastModified_Getter(mthis);
+
+  static links_Getter(mthis) native "Document_links_Getter";
+  links_Getter_(mthis) => links_Getter(mthis);
+
+  static onabort_Getter(mthis) native "Document_onabort_Getter";
+  onabort_Getter_(mthis) => onabort_Getter(mthis);
+
+  static onabort_Setter(mthis, __arg_0) native "Document_onabort_Setter";
+  onabort_Setter_(mthis, __arg_0) => onabort_Setter(mthis, __arg_0);
+
+  static onautocomplete_Getter(mthis) native "Document_onautocomplete_Getter";
+  onautocomplete_Getter_(mthis) => onautocomplete_Getter(mthis);
+
+  static onautocomplete_Setter(mthis, __arg_0) native "Document_onautocomplete_Setter";
+  onautocomplete_Setter_(mthis, __arg_0) => onautocomplete_Setter(mthis, __arg_0);
+
+  static onautocompleteerror_Getter(mthis) native "Document_onautocompleteerror_Getter";
+  onautocompleteerror_Getter_(mthis) => onautocompleteerror_Getter(mthis);
+
+  static onautocompleteerror_Setter(mthis, __arg_0) native "Document_onautocompleteerror_Setter";
+  onautocompleteerror_Setter_(mthis, __arg_0) => onautocompleteerror_Setter(mthis, __arg_0);
+
+  static onbeforecopy_Getter(mthis) native "Document_onbeforecopy_Getter";
+  onbeforecopy_Getter_(mthis) => onbeforecopy_Getter(mthis);
+
+  static onbeforecopy_Setter(mthis, __arg_0) native "Document_onbeforecopy_Setter";
+  onbeforecopy_Setter_(mthis, __arg_0) => onbeforecopy_Setter(mthis, __arg_0);
+
+  static onbeforecut_Getter(mthis) native "Document_onbeforecut_Getter";
+  onbeforecut_Getter_(mthis) => onbeforecut_Getter(mthis);
+
+  static onbeforecut_Setter(mthis, __arg_0) native "Document_onbeforecut_Setter";
+  onbeforecut_Setter_(mthis, __arg_0) => onbeforecut_Setter(mthis, __arg_0);
+
+  static onbeforepaste_Getter(mthis) native "Document_onbeforepaste_Getter";
+  onbeforepaste_Getter_(mthis) => onbeforepaste_Getter(mthis);
+
+  static onbeforepaste_Setter(mthis, __arg_0) native "Document_onbeforepaste_Setter";
+  onbeforepaste_Setter_(mthis, __arg_0) => onbeforepaste_Setter(mthis, __arg_0);
+
+  static onblur_Getter(mthis) native "Document_onblur_Getter";
+  onblur_Getter_(mthis) => onblur_Getter(mthis);
+
+  static onblur_Setter(mthis, __arg_0) native "Document_onblur_Setter";
+  onblur_Setter_(mthis, __arg_0) => onblur_Setter(mthis, __arg_0);
+
+  static oncancel_Getter(mthis) native "Document_oncancel_Getter";
+  oncancel_Getter_(mthis) => oncancel_Getter(mthis);
+
+  static oncancel_Setter(mthis, __arg_0) native "Document_oncancel_Setter";
+  oncancel_Setter_(mthis, __arg_0) => oncancel_Setter(mthis, __arg_0);
+
+  static oncanplay_Getter(mthis) native "Document_oncanplay_Getter";
+  oncanplay_Getter_(mthis) => oncanplay_Getter(mthis);
+
+  static oncanplay_Setter(mthis, __arg_0) native "Document_oncanplay_Setter";
+  oncanplay_Setter_(mthis, __arg_0) => oncanplay_Setter(mthis, __arg_0);
+
+  static oncanplaythrough_Getter(mthis) native "Document_oncanplaythrough_Getter";
+  oncanplaythrough_Getter_(mthis) => oncanplaythrough_Getter(mthis);
+
+  static oncanplaythrough_Setter(mthis, __arg_0) native "Document_oncanplaythrough_Setter";
+  oncanplaythrough_Setter_(mthis, __arg_0) => oncanplaythrough_Setter(mthis, __arg_0);
+
+  static onchange_Getter(mthis) native "Document_onchange_Getter";
+  onchange_Getter_(mthis) => onchange_Getter(mthis);
+
+  static onchange_Setter(mthis, __arg_0) native "Document_onchange_Setter";
+  onchange_Setter_(mthis, __arg_0) => onchange_Setter(mthis, __arg_0);
+
+  static onclick_Getter(mthis) native "Document_onclick_Getter";
+  onclick_Getter_(mthis) => onclick_Getter(mthis);
+
+  static onclick_Setter(mthis, __arg_0) native "Document_onclick_Setter";
+  onclick_Setter_(mthis, __arg_0) => onclick_Setter(mthis, __arg_0);
+
+  static onclose_Getter(mthis) native "Document_onclose_Getter";
+  onclose_Getter_(mthis) => onclose_Getter(mthis);
+
+  static onclose_Setter(mthis, __arg_0) native "Document_onclose_Setter";
+  onclose_Setter_(mthis, __arg_0) => onclose_Setter(mthis, __arg_0);
+
+  static oncontextmenu_Getter(mthis) native "Document_oncontextmenu_Getter";
+  oncontextmenu_Getter_(mthis) => oncontextmenu_Getter(mthis);
+
+  static oncontextmenu_Setter(mthis, __arg_0) native "Document_oncontextmenu_Setter";
+  oncontextmenu_Setter_(mthis, __arg_0) => oncontextmenu_Setter(mthis, __arg_0);
+
+  static oncopy_Getter(mthis) native "Document_oncopy_Getter";
+  oncopy_Getter_(mthis) => oncopy_Getter(mthis);
+
+  static oncopy_Setter(mthis, __arg_0) native "Document_oncopy_Setter";
+  oncopy_Setter_(mthis, __arg_0) => oncopy_Setter(mthis, __arg_0);
+
+  static oncuechange_Getter(mthis) native "Document_oncuechange_Getter";
+  oncuechange_Getter_(mthis) => oncuechange_Getter(mthis);
+
+  static oncuechange_Setter(mthis, __arg_0) native "Document_oncuechange_Setter";
+  oncuechange_Setter_(mthis, __arg_0) => oncuechange_Setter(mthis, __arg_0);
+
+  static oncut_Getter(mthis) native "Document_oncut_Getter";
+  oncut_Getter_(mthis) => oncut_Getter(mthis);
+
+  static oncut_Setter(mthis, __arg_0) native "Document_oncut_Setter";
+  oncut_Setter_(mthis, __arg_0) => oncut_Setter(mthis, __arg_0);
+
+  static ondblclick_Getter(mthis) native "Document_ondblclick_Getter";
+  ondblclick_Getter_(mthis) => ondblclick_Getter(mthis);
+
+  static ondblclick_Setter(mthis, __arg_0) native "Document_ondblclick_Setter";
+  ondblclick_Setter_(mthis, __arg_0) => ondblclick_Setter(mthis, __arg_0);
+
+  static ondrag_Getter(mthis) native "Document_ondrag_Getter";
+  ondrag_Getter_(mthis) => ondrag_Getter(mthis);
+
+  static ondrag_Setter(mthis, __arg_0) native "Document_ondrag_Setter";
+  ondrag_Setter_(mthis, __arg_0) => ondrag_Setter(mthis, __arg_0);
+
+  static ondragend_Getter(mthis) native "Document_ondragend_Getter";
+  ondragend_Getter_(mthis) => ondragend_Getter(mthis);
+
+  static ondragend_Setter(mthis, __arg_0) native "Document_ondragend_Setter";
+  ondragend_Setter_(mthis, __arg_0) => ondragend_Setter(mthis, __arg_0);
+
+  static ondragenter_Getter(mthis) native "Document_ondragenter_Getter";
+  ondragenter_Getter_(mthis) => ondragenter_Getter(mthis);
+
+  static ondragenter_Setter(mthis, __arg_0) native "Document_ondragenter_Setter";
+  ondragenter_Setter_(mthis, __arg_0) => ondragenter_Setter(mthis, __arg_0);
+
+  static ondragleave_Getter(mthis) native "Document_ondragleave_Getter";
+  ondragleave_Getter_(mthis) => ondragleave_Getter(mthis);
+
+  static ondragleave_Setter(mthis, __arg_0) native "Document_ondragleave_Setter";
+  ondragleave_Setter_(mthis, __arg_0) => ondragleave_Setter(mthis, __arg_0);
+
+  static ondragover_Getter(mthis) native "Document_ondragover_Getter";
+  ondragover_Getter_(mthis) => ondragover_Getter(mthis);
+
+  static ondragover_Setter(mthis, __arg_0) native "Document_ondragover_Setter";
+  ondragover_Setter_(mthis, __arg_0) => ondragover_Setter(mthis, __arg_0);
+
+  static ondragstart_Getter(mthis) native "Document_ondragstart_Getter";
+  ondragstart_Getter_(mthis) => ondragstart_Getter(mthis);
+
+  static ondragstart_Setter(mthis, __arg_0) native "Document_ondragstart_Setter";
+  ondragstart_Setter_(mthis, __arg_0) => ondragstart_Setter(mthis, __arg_0);
+
+  static ondrop_Getter(mthis) native "Document_ondrop_Getter";
+  ondrop_Getter_(mthis) => ondrop_Getter(mthis);
+
+  static ondrop_Setter(mthis, __arg_0) native "Document_ondrop_Setter";
+  ondrop_Setter_(mthis, __arg_0) => ondrop_Setter(mthis, __arg_0);
+
+  static ondurationchange_Getter(mthis) native "Document_ondurationchange_Getter";
+  ondurationchange_Getter_(mthis) => ondurationchange_Getter(mthis);
+
+  static ondurationchange_Setter(mthis, __arg_0) native "Document_ondurationchange_Setter";
+  ondurationchange_Setter_(mthis, __arg_0) => ondurationchange_Setter(mthis, __arg_0);
+
+  static onemptied_Getter(mthis) native "Document_onemptied_Getter";
+  onemptied_Getter_(mthis) => onemptied_Getter(mthis);
+
+  static onemptied_Setter(mthis, __arg_0) native "Document_onemptied_Setter";
+  onemptied_Setter_(mthis, __arg_0) => onemptied_Setter(mthis, __arg_0);
+
+  static onended_Getter(mthis) native "Document_onended_Getter";
+  onended_Getter_(mthis) => onended_Getter(mthis);
+
+  static onended_Setter(mthis, __arg_0) native "Document_onended_Setter";
+  onended_Setter_(mthis, __arg_0) => onended_Setter(mthis, __arg_0);
+
+  static onerror_Getter(mthis) native "Document_onerror_Getter";
+  onerror_Getter_(mthis) => onerror_Getter(mthis);
+
+  static onerror_Setter(mthis, __arg_0) native "Document_onerror_Setter";
+  onerror_Setter_(mthis, __arg_0) => onerror_Setter(mthis, __arg_0);
+
+  static onfocus_Getter(mthis) native "Document_onfocus_Getter";
+  onfocus_Getter_(mthis) => onfocus_Getter(mthis);
+
+  static onfocus_Setter(mthis, __arg_0) native "Document_onfocus_Setter";
+  onfocus_Setter_(mthis, __arg_0) => onfocus_Setter(mthis, __arg_0);
+
+  static onfullscreenchange_Getter(mthis) native "Document_onfullscreenchange_Getter";
+  onfullscreenchange_Getter_(mthis) => onfullscreenchange_Getter(mthis);
+
+  static onfullscreenchange_Setter(mthis, __arg_0) native "Document_onfullscreenchange_Setter";
+  onfullscreenchange_Setter_(mthis, __arg_0) => onfullscreenchange_Setter(mthis, __arg_0);
+
+  static onfullscreenerror_Getter(mthis) native "Document_onfullscreenerror_Getter";
+  onfullscreenerror_Getter_(mthis) => onfullscreenerror_Getter(mthis);
+
+  static onfullscreenerror_Setter(mthis, __arg_0) native "Document_onfullscreenerror_Setter";
+  onfullscreenerror_Setter_(mthis, __arg_0) => onfullscreenerror_Setter(mthis, __arg_0);
+
+  static oninput_Getter(mthis) native "Document_oninput_Getter";
+  oninput_Getter_(mthis) => oninput_Getter(mthis);
+
+  static oninput_Setter(mthis, __arg_0) native "Document_oninput_Setter";
+  oninput_Setter_(mthis, __arg_0) => oninput_Setter(mthis, __arg_0);
+
+  static oninvalid_Getter(mthis) native "Document_oninvalid_Getter";
+  oninvalid_Getter_(mthis) => oninvalid_Getter(mthis);
+
+  static oninvalid_Setter(mthis, __arg_0) native "Document_oninvalid_Setter";
+  oninvalid_Setter_(mthis, __arg_0) => oninvalid_Setter(mthis, __arg_0);
+
+  static onkeydown_Getter(mthis) native "Document_onkeydown_Getter";
+  onkeydown_Getter_(mthis) => onkeydown_Getter(mthis);
+
+  static onkeydown_Setter(mthis, __arg_0) native "Document_onkeydown_Setter";
+  onkeydown_Setter_(mthis, __arg_0) => onkeydown_Setter(mthis, __arg_0);
+
+  static onkeypress_Getter(mthis) native "Document_onkeypress_Getter";
+  onkeypress_Getter_(mthis) => onkeypress_Getter(mthis);
+
+  static onkeypress_Setter(mthis, __arg_0) native "Document_onkeypress_Setter";
+  onkeypress_Setter_(mthis, __arg_0) => onkeypress_Setter(mthis, __arg_0);
+
+  static onkeyup_Getter(mthis) native "Document_onkeyup_Getter";
+  onkeyup_Getter_(mthis) => onkeyup_Getter(mthis);
+
+  static onkeyup_Setter(mthis, __arg_0) native "Document_onkeyup_Setter";
+  onkeyup_Setter_(mthis, __arg_0) => onkeyup_Setter(mthis, __arg_0);
+
+  static onload_Getter(mthis) native "Document_onload_Getter";
+  onload_Getter_(mthis) => onload_Getter(mthis);
+
+  static onload_Setter(mthis, __arg_0) native "Document_onload_Setter";
+  onload_Setter_(mthis, __arg_0) => onload_Setter(mthis, __arg_0);
+
+  static onloadeddata_Getter(mthis) native "Document_onloadeddata_Getter";
+  onloadeddata_Getter_(mthis) => onloadeddata_Getter(mthis);
+
+  static onloadeddata_Setter(mthis, __arg_0) native "Document_onloadeddata_Setter";
+  onloadeddata_Setter_(mthis, __arg_0) => onloadeddata_Setter(mthis, __arg_0);
+
+  static onloadedmetadata_Getter(mthis) native "Document_onloadedmetadata_Getter";
+  onloadedmetadata_Getter_(mthis) => onloadedmetadata_Getter(mthis);
+
+  static onloadedmetadata_Setter(mthis, __arg_0) native "Document_onloadedmetadata_Setter";
+  onloadedmetadata_Setter_(mthis, __arg_0) => onloadedmetadata_Setter(mthis, __arg_0);
+
+  static onloadstart_Getter(mthis) native "Document_onloadstart_Getter";
+  onloadstart_Getter_(mthis) => onloadstart_Getter(mthis);
+
+  static onloadstart_Setter(mthis, __arg_0) native "Document_onloadstart_Setter";
+  onloadstart_Setter_(mthis, __arg_0) => onloadstart_Setter(mthis, __arg_0);
+
+  static onmousedown_Getter(mthis) native "Document_onmousedown_Getter";
+  onmousedown_Getter_(mthis) => onmousedown_Getter(mthis);
+
+  static onmousedown_Setter(mthis, __arg_0) native "Document_onmousedown_Setter";
+  onmousedown_Setter_(mthis, __arg_0) => onmousedown_Setter(mthis, __arg_0);
+
+  static onmouseenter_Getter(mthis) native "Document_onmouseenter_Getter";
+  onmouseenter_Getter_(mthis) => onmouseenter_Getter(mthis);
+
+  static onmouseenter_Setter(mthis, __arg_0) native "Document_onmouseenter_Setter";
+  onmouseenter_Setter_(mthis, __arg_0) => onmouseenter_Setter(mthis, __arg_0);
+
+  static onmouseleave_Getter(mthis) native "Document_onmouseleave_Getter";
+  onmouseleave_Getter_(mthis) => onmouseleave_Getter(mthis);
+
+  static onmouseleave_Setter(mthis, __arg_0) native "Document_onmouseleave_Setter";
+  onmouseleave_Setter_(mthis, __arg_0) => onmouseleave_Setter(mthis, __arg_0);
+
+  static onmousemove_Getter(mthis) native "Document_onmousemove_Getter";
+  onmousemove_Getter_(mthis) => onmousemove_Getter(mthis);
+
+  static onmousemove_Setter(mthis, __arg_0) native "Document_onmousemove_Setter";
+  onmousemove_Setter_(mthis, __arg_0) => onmousemove_Setter(mthis, __arg_0);
+
+  static onmouseout_Getter(mthis) native "Document_onmouseout_Getter";
+  onmouseout_Getter_(mthis) => onmouseout_Getter(mthis);
+
+  static onmouseout_Setter(mthis, __arg_0) native "Document_onmouseout_Setter";
+  onmouseout_Setter_(mthis, __arg_0) => onmouseout_Setter(mthis, __arg_0);
+
+  static onmouseover_Getter(mthis) native "Document_onmouseover_Getter";
+  onmouseover_Getter_(mthis) => onmouseover_Getter(mthis);
+
+  static onmouseover_Setter(mthis, __arg_0) native "Document_onmouseover_Setter";
+  onmouseover_Setter_(mthis, __arg_0) => onmouseover_Setter(mthis, __arg_0);
+
+  static onmouseup_Getter(mthis) native "Document_onmouseup_Getter";
+  onmouseup_Getter_(mthis) => onmouseup_Getter(mthis);
+
+  static onmouseup_Setter(mthis, __arg_0) native "Document_onmouseup_Setter";
+  onmouseup_Setter_(mthis, __arg_0) => onmouseup_Setter(mthis, __arg_0);
+
+  static onmousewheel_Getter(mthis) native "Document_onmousewheel_Getter";
+  onmousewheel_Getter_(mthis) => onmousewheel_Getter(mthis);
+
+  static onmousewheel_Setter(mthis, __arg_0) native "Document_onmousewheel_Setter";
+  onmousewheel_Setter_(mthis, __arg_0) => onmousewheel_Setter(mthis, __arg_0);
+
+  static onpaste_Getter(mthis) native "Document_onpaste_Getter";
+  onpaste_Getter_(mthis) => onpaste_Getter(mthis);
+
+  static onpaste_Setter(mthis, __arg_0) native "Document_onpaste_Setter";
+  onpaste_Setter_(mthis, __arg_0) => onpaste_Setter(mthis, __arg_0);
+
+  static onpause_Getter(mthis) native "Document_onpause_Getter";
+  onpause_Getter_(mthis) => onpause_Getter(mthis);
+
+  static onpause_Setter(mthis, __arg_0) native "Document_onpause_Setter";
+  onpause_Setter_(mthis, __arg_0) => onpause_Setter(mthis, __arg_0);
+
+  static onplay_Getter(mthis) native "Document_onplay_Getter";
+  onplay_Getter_(mthis) => onplay_Getter(mthis);
+
+  static onplay_Setter(mthis, __arg_0) native "Document_onplay_Setter";
+  onplay_Setter_(mthis, __arg_0) => onplay_Setter(mthis, __arg_0);
+
+  static onplaying_Getter(mthis) native "Document_onplaying_Getter";
+  onplaying_Getter_(mthis) => onplaying_Getter(mthis);
+
+  static onplaying_Setter(mthis, __arg_0) native "Document_onplaying_Setter";
+  onplaying_Setter_(mthis, __arg_0) => onplaying_Setter(mthis, __arg_0);
+
+  static onpointerlockchange_Getter(mthis) native "Document_onpointerlockchange_Getter";
+  onpointerlockchange_Getter_(mthis) => onpointerlockchange_Getter(mthis);
+
+  static onpointerlockchange_Setter(mthis, __arg_0) native "Document_onpointerlockchange_Setter";
+  onpointerlockchange_Setter_(mthis, __arg_0) => onpointerlockchange_Setter(mthis, __arg_0);
+
+  static onpointerlockerror_Getter(mthis) native "Document_onpointerlockerror_Getter";
+  onpointerlockerror_Getter_(mthis) => onpointerlockerror_Getter(mthis);
+
+  static onpointerlockerror_Setter(mthis, __arg_0) native "Document_onpointerlockerror_Setter";
+  onpointerlockerror_Setter_(mthis, __arg_0) => onpointerlockerror_Setter(mthis, __arg_0);
+
+  static onprogress_Getter(mthis) native "Document_onprogress_Getter";
+  onprogress_Getter_(mthis) => onprogress_Getter(mthis);
+
+  static onprogress_Setter(mthis, __arg_0) native "Document_onprogress_Setter";
+  onprogress_Setter_(mthis, __arg_0) => onprogress_Setter(mthis, __arg_0);
+
+  static onratechange_Getter(mthis) native "Document_onratechange_Getter";
+  onratechange_Getter_(mthis) => onratechange_Getter(mthis);
+
+  static onratechange_Setter(mthis, __arg_0) native "Document_onratechange_Setter";
+  onratechange_Setter_(mthis, __arg_0) => onratechange_Setter(mthis, __arg_0);
+
+  static onreadystatechange_Getter(mthis) native "Document_onreadystatechange_Getter";
+  onreadystatechange_Getter_(mthis) => onreadystatechange_Getter(mthis);
+
+  static onreadystatechange_Setter(mthis, __arg_0) native "Document_onreadystatechange_Setter";
+  onreadystatechange_Setter_(mthis, __arg_0) => onreadystatechange_Setter(mthis, __arg_0);
+
+  static onreset_Getter(mthis) native "Document_onreset_Getter";
+  onreset_Getter_(mthis) => onreset_Getter(mthis);
+
+  static onreset_Setter(mthis, __arg_0) native "Document_onreset_Setter";
+  onreset_Setter_(mthis, __arg_0) => onreset_Setter(mthis, __arg_0);
+
+  static onresize_Getter(mthis) native "Document_onresize_Getter";
+  onresize_Getter_(mthis) => onresize_Getter(mthis);
+
+  static onresize_Setter(mthis, __arg_0) native "Document_onresize_Setter";
+  onresize_Setter_(mthis, __arg_0) => onresize_Setter(mthis, __arg_0);
+
+  static onscroll_Getter(mthis) native "Document_onscroll_Getter";
+  onscroll_Getter_(mthis) => onscroll_Getter(mthis);
+
+  static onscroll_Setter(mthis, __arg_0) native "Document_onscroll_Setter";
+  onscroll_Setter_(mthis, __arg_0) => onscroll_Setter(mthis, __arg_0);
+
+  static onsearch_Getter(mthis) native "Document_onsearch_Getter";
+  onsearch_Getter_(mthis) => onsearch_Getter(mthis);
+
+  static onsearch_Setter(mthis, __arg_0) native "Document_onsearch_Setter";
+  onsearch_Setter_(mthis, __arg_0) => onsearch_Setter(mthis, __arg_0);
+
+  static onsecuritypolicyviolation_Getter(mthis) native "Document_onsecuritypolicyviolation_Getter";
+  onsecuritypolicyviolation_Getter_(mthis) => onsecuritypolicyviolation_Getter(mthis);
+
+  static onsecuritypolicyviolation_Setter(mthis, __arg_0) native "Document_onsecuritypolicyviolation_Setter";
+  onsecuritypolicyviolation_Setter_(mthis, __arg_0) => onsecuritypolicyviolation_Setter(mthis, __arg_0);
+
+  static onseeked_Getter(mthis) native "Document_onseeked_Getter";
+  onseeked_Getter_(mthis) => onseeked_Getter(mthis);
+
+  static onseeked_Setter(mthis, __arg_0) native "Document_onseeked_Setter";
+  onseeked_Setter_(mthis, __arg_0) => onseeked_Setter(mthis, __arg_0);
+
+  static onseeking_Getter(mthis) native "Document_onseeking_Getter";
+  onseeking_Getter_(mthis) => onseeking_Getter(mthis);
+
+  static onseeking_Setter(mthis, __arg_0) native "Document_onseeking_Setter";
+  onseeking_Setter_(mthis, __arg_0) => onseeking_Setter(mthis, __arg_0);
+
+  static onselect_Getter(mthis) native "Document_onselect_Getter";
+  onselect_Getter_(mthis) => onselect_Getter(mthis);
+
+  static onselect_Setter(mthis, __arg_0) native "Document_onselect_Setter";
+  onselect_Setter_(mthis, __arg_0) => onselect_Setter(mthis, __arg_0);
+
+  static onselectionchange_Getter(mthis) native "Document_onselectionchange_Getter";
+  onselectionchange_Getter_(mthis) => onselectionchange_Getter(mthis);
+
+  static onselectionchange_Setter(mthis, __arg_0) native "Document_onselectionchange_Setter";
+  onselectionchange_Setter_(mthis, __arg_0) => onselectionchange_Setter(mthis, __arg_0);
+
+  static onselectstart_Getter(mthis) native "Document_onselectstart_Getter";
+  onselectstart_Getter_(mthis) => onselectstart_Getter(mthis);
+
+  static onselectstart_Setter(mthis, __arg_0) native "Document_onselectstart_Setter";
+  onselectstart_Setter_(mthis, __arg_0) => onselectstart_Setter(mthis, __arg_0);
+
+  static onshow_Getter(mthis) native "Document_onshow_Getter";
+  onshow_Getter_(mthis) => onshow_Getter(mthis);
+
+  static onshow_Setter(mthis, __arg_0) native "Document_onshow_Setter";
+  onshow_Setter_(mthis, __arg_0) => onshow_Setter(mthis, __arg_0);
+
+  static onstalled_Getter(mthis) native "Document_onstalled_Getter";
+  onstalled_Getter_(mthis) => onstalled_Getter(mthis);
+
+  static onstalled_Setter(mthis, __arg_0) native "Document_onstalled_Setter";
+  onstalled_Setter_(mthis, __arg_0) => onstalled_Setter(mthis, __arg_0);
+
+  static onsubmit_Getter(mthis) native "Document_onsubmit_Getter";
+  onsubmit_Getter_(mthis) => onsubmit_Getter(mthis);
+
+  static onsubmit_Setter(mthis, __arg_0) native "Document_onsubmit_Setter";
+  onsubmit_Setter_(mthis, __arg_0) => onsubmit_Setter(mthis, __arg_0);
+
+  static onsuspend_Getter(mthis) native "Document_onsuspend_Getter";
+  onsuspend_Getter_(mthis) => onsuspend_Getter(mthis);
+
+  static onsuspend_Setter(mthis, __arg_0) native "Document_onsuspend_Setter";
+  onsuspend_Setter_(mthis, __arg_0) => onsuspend_Setter(mthis, __arg_0);
+
+  static ontimeupdate_Getter(mthis) native "Document_ontimeupdate_Getter";
+  ontimeupdate_Getter_(mthis) => ontimeupdate_Getter(mthis);
+
+  static ontimeupdate_Setter(mthis, __arg_0) native "Document_ontimeupdate_Setter";
+  ontimeupdate_Setter_(mthis, __arg_0) => ontimeupdate_Setter(mthis, __arg_0);
+
+  static ontoggle_Getter(mthis) native "Document_ontoggle_Getter";
+  ontoggle_Getter_(mthis) => ontoggle_Getter(mthis);
+
+  static ontoggle_Setter(mthis, __arg_0) native "Document_ontoggle_Setter";
+  ontoggle_Setter_(mthis, __arg_0) => ontoggle_Setter(mthis, __arg_0);
+
+  static ontouchcancel_Getter(mthis) native "Document_ontouchcancel_Getter";
+  ontouchcancel_Getter_(mthis) => ontouchcancel_Getter(mthis);
+
+  static ontouchcancel_Setter(mthis, __arg_0) native "Document_ontouchcancel_Setter";
+  ontouchcancel_Setter_(mthis, __arg_0) => ontouchcancel_Setter(mthis, __arg_0);
+
+  static ontouchend_Getter(mthis) native "Document_ontouchend_Getter";
+  ontouchend_Getter_(mthis) => ontouchend_Getter(mthis);
+
+  static ontouchend_Setter(mthis, __arg_0) native "Document_ontouchend_Setter";
+  ontouchend_Setter_(mthis, __arg_0) => ontouchend_Setter(mthis, __arg_0);
+
+  static ontouchmove_Getter(mthis) native "Document_ontouchmove_Getter";
+  ontouchmove_Getter_(mthis) => ontouchmove_Getter(mthis);
+
+  static ontouchmove_Setter(mthis, __arg_0) native "Document_ontouchmove_Setter";
+  ontouchmove_Setter_(mthis, __arg_0) => ontouchmove_Setter(mthis, __arg_0);
+
+  static ontouchstart_Getter(mthis) native "Document_ontouchstart_Getter";
+  ontouchstart_Getter_(mthis) => ontouchstart_Getter(mthis);
+
+  static ontouchstart_Setter(mthis, __arg_0) native "Document_ontouchstart_Setter";
+  ontouchstart_Setter_(mthis, __arg_0) => ontouchstart_Setter(mthis, __arg_0);
+
+  static onvolumechange_Getter(mthis) native "Document_onvolumechange_Getter";
+  onvolumechange_Getter_(mthis) => onvolumechange_Getter(mthis);
+
+  static onvolumechange_Setter(mthis, __arg_0) native "Document_onvolumechange_Setter";
+  onvolumechange_Setter_(mthis, __arg_0) => onvolumechange_Setter(mthis, __arg_0);
+
+  static onwaiting_Getter(mthis) native "Document_onwaiting_Getter";
+  onwaiting_Getter_(mthis) => onwaiting_Getter(mthis);
+
+  static onwaiting_Setter(mthis, __arg_0) native "Document_onwaiting_Setter";
+  onwaiting_Setter_(mthis, __arg_0) => onwaiting_Setter(mthis, __arg_0);
+
+  static onwebkitfullscreenchange_Getter(mthis) native "Document_onwebkitfullscreenchange_Getter";
+  onwebkitfullscreenchange_Getter_(mthis) => onwebkitfullscreenchange_Getter(mthis);
+
+  static onwebkitfullscreenchange_Setter(mthis, __arg_0) native "Document_onwebkitfullscreenchange_Setter";
+  onwebkitfullscreenchange_Setter_(mthis, __arg_0) => onwebkitfullscreenchange_Setter(mthis, __arg_0);
+
+  static onwebkitfullscreenerror_Getter(mthis) native "Document_onwebkitfullscreenerror_Getter";
+  onwebkitfullscreenerror_Getter_(mthis) => onwebkitfullscreenerror_Getter(mthis);
+
+  static onwebkitfullscreenerror_Setter(mthis, __arg_0) native "Document_onwebkitfullscreenerror_Setter";
+  onwebkitfullscreenerror_Setter_(mthis, __arg_0) => onwebkitfullscreenerror_Setter(mthis, __arg_0);
+
+  static onwheel_Getter(mthis) native "Document_onwheel_Getter";
+  onwheel_Getter_(mthis) => onwheel_Getter(mthis);
+
+  static onwheel_Setter(mthis, __arg_0) native "Document_onwheel_Setter";
+  onwheel_Setter_(mthis, __arg_0) => onwheel_Setter(mthis, __arg_0);
+
+  static plugins_Getter(mthis) native "Document_plugins_Getter";
+  plugins_Getter_(mthis) => plugins_Getter(mthis);
+
+  static pointerLockElement_Getter(mthis) native "Document_pointerLockElement_Getter";
+  pointerLockElement_Getter_(mthis) => pointerLockElement_Getter(mthis);
+
+  static preferredStylesheetSet_Getter(mthis) native "Document_preferredStylesheetSet_Getter";
+  preferredStylesheetSet_Getter_(mthis) => preferredStylesheetSet_Getter(mthis);
+
+  static queryCommandEnabled_Callback_0(mthis) native "Document_queryCommandEnabled_Callback";
+  queryCommandEnabled_Callback_0_(mthis) => queryCommandEnabled_Callback_0(mthis);
+
+  static queryCommandEnabled_Callback_1(mthis, __arg_0) native "Document_queryCommandEnabled_Callback";
+  queryCommandEnabled_Callback_1_(mthis, __arg_0) => queryCommandEnabled_Callback_1(mthis, __arg_0);
+
+  static queryCommandEnabled_Callback_2(mthis, __arg_0, __arg_1) native "Document_queryCommandEnabled_Callback";
+  queryCommandEnabled_Callback_2_(mthis, __arg_0, __arg_1) => queryCommandEnabled_Callback_2(mthis, __arg_0, __arg_1);
+
+  static queryCommandEnabled_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Document_queryCommandEnabled_Callback";
+  queryCommandEnabled_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => queryCommandEnabled_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static queryCommandIndeterm_Callback_0(mthis) native "Document_queryCommandIndeterm_Callback";
+  queryCommandIndeterm_Callback_0_(mthis) => queryCommandIndeterm_Callback_0(mthis);
+
+  static queryCommandIndeterm_Callback_1(mthis, __arg_0) native "Document_queryCommandIndeterm_Callback";
+  queryCommandIndeterm_Callback_1_(mthis, __arg_0) => queryCommandIndeterm_Callback_1(mthis, __arg_0);
+
+  static queryCommandIndeterm_Callback_2(mthis, __arg_0, __arg_1) native "Document_queryCommandIndeterm_Callback";
+  queryCommandIndeterm_Callback_2_(mthis, __arg_0, __arg_1) => queryCommandIndeterm_Callback_2(mthis, __arg_0, __arg_1);
+
+  static queryCommandIndeterm_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Document_queryCommandIndeterm_Callback";
+  queryCommandIndeterm_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => queryCommandIndeterm_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static queryCommandState_Callback_0(mthis) native "Document_queryCommandState_Callback";
+  queryCommandState_Callback_0_(mthis) => queryCommandState_Callback_0(mthis);
+
+  static queryCommandState_Callback_1(mthis, __arg_0) native "Document_queryCommandState_Callback";
+  queryCommandState_Callback_1_(mthis, __arg_0) => queryCommandState_Callback_1(mthis, __arg_0);
+
+  static queryCommandState_Callback_2(mthis, __arg_0, __arg_1) native "Document_queryCommandState_Callback";
+  queryCommandState_Callback_2_(mthis, __arg_0, __arg_1) => queryCommandState_Callback_2(mthis, __arg_0, __arg_1);
+
+  static queryCommandState_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Document_queryCommandState_Callback";
+  queryCommandState_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => queryCommandState_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static queryCommandSupported_Callback_0(mthis) native "Document_queryCommandSupported_Callback";
+  queryCommandSupported_Callback_0_(mthis) => queryCommandSupported_Callback_0(mthis);
+
+  static queryCommandSupported_Callback_1(mthis, __arg_0) native "Document_queryCommandSupported_Callback";
+  queryCommandSupported_Callback_1_(mthis, __arg_0) => queryCommandSupported_Callback_1(mthis, __arg_0);
+
+  static queryCommandSupported_Callback_2(mthis, __arg_0, __arg_1) native "Document_queryCommandSupported_Callback";
+  queryCommandSupported_Callback_2_(mthis, __arg_0, __arg_1) => queryCommandSupported_Callback_2(mthis, __arg_0, __arg_1);
+
+  static queryCommandSupported_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Document_queryCommandSupported_Callback";
+  queryCommandSupported_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => queryCommandSupported_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static queryCommandValue_Callback_0(mthis) native "Document_queryCommandValue_Callback";
+  queryCommandValue_Callback_0_(mthis) => queryCommandValue_Callback_0(mthis);
+
+  static queryCommandValue_Callback_1(mthis, __arg_0) native "Document_queryCommandValue_Callback";
+  queryCommandValue_Callback_1_(mthis, __arg_0) => queryCommandValue_Callback_1(mthis, __arg_0);
+
+  static queryCommandValue_Callback_2(mthis, __arg_0, __arg_1) native "Document_queryCommandValue_Callback";
+  queryCommandValue_Callback_2_(mthis, __arg_0, __arg_1) => queryCommandValue_Callback_2(mthis, __arg_0, __arg_1);
+
+  static queryCommandValue_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Document_queryCommandValue_Callback";
+  queryCommandValue_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => queryCommandValue_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static querySelectorAll_Callback_0(mthis) native "Document_querySelectorAll_Callback";
+  querySelectorAll_Callback_0_(mthis) => querySelectorAll_Callback_0(mthis);
+
+  static querySelectorAll_Callback_1(mthis, __arg_0) native "Document_querySelectorAll_Callback";
+  querySelectorAll_Callback_1_(mthis, __arg_0) => querySelectorAll_Callback_1(mthis, __arg_0);
+
+  static querySelectorAll_Callback_2(mthis, __arg_0, __arg_1) native "Document_querySelectorAll_Callback";
+  querySelectorAll_Callback_2_(mthis, __arg_0, __arg_1) => querySelectorAll_Callback_2(mthis, __arg_0, __arg_1);
+
+  static querySelectorAll_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Document_querySelectorAll_Callback";
+  querySelectorAll_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => querySelectorAll_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static querySelector_Callback_0(mthis) native "Document_querySelector_Callback";
+  querySelector_Callback_0_(mthis) => querySelector_Callback_0(mthis);
+
+  static querySelector_Callback_1(mthis, __arg_0) native "Document_querySelector_Callback";
+  querySelector_Callback_1_(mthis, __arg_0) => querySelector_Callback_1(mthis, __arg_0);
+
+  static querySelector_Callback_2(mthis, __arg_0, __arg_1) native "Document_querySelector_Callback";
+  querySelector_Callback_2_(mthis, __arg_0, __arg_1) => querySelector_Callback_2(mthis, __arg_0, __arg_1);
+
+  static querySelector_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Document_querySelector_Callback";
+  querySelector_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => querySelector_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static readyState_Getter(mthis) native "Document_readyState_Getter";
+  readyState_Getter_(mthis) => readyState_Getter(mthis);
+
+  static referrer_Getter(mthis) native "Document_referrer_Getter";
+  referrer_Getter_(mthis) => referrer_Getter(mthis);
+
+  static registerElement_Callback_0(mthis) native "Document_registerElement_Callback";
+  registerElement_Callback_0_(mthis) => registerElement_Callback_0(mthis);
+
+  static registerElement_Callback_1(mthis, __arg_0) native "Document_registerElement_Callback";
+  registerElement_Callback_1_(mthis, __arg_0) => registerElement_Callback_1(mthis, __arg_0);
+
+  static registerElement_Callback_2(mthis, __arg_0, __arg_1) native "Document_registerElement_Callback";
+  registerElement_Callback_2_(mthis, __arg_0, __arg_1) => registerElement_Callback_2(mthis, __arg_0, __arg_1);
+
+  static registerElement_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Document_registerElement_Callback";
+  registerElement_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => registerElement_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static registerElement_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Document_registerElement_Callback";
+  registerElement_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => registerElement_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static rootElement_Getter(mthis) native "Document_rootElement_Getter";
+  rootElement_Getter_(mthis) => rootElement_Getter(mthis);
+
+  static scripts_Getter(mthis) native "Document_scripts_Getter";
+  scripts_Getter_(mthis) => scripts_Getter(mthis);
+
+  static selectedStylesheetSet_Getter(mthis) native "Document_selectedStylesheetSet_Getter";
+  selectedStylesheetSet_Getter_(mthis) => selectedStylesheetSet_Getter(mthis);
+
+  static selectedStylesheetSet_Setter(mthis, __arg_0) native "Document_selectedStylesheetSet_Setter";
+  selectedStylesheetSet_Setter_(mthis, __arg_0) => selectedStylesheetSet_Setter(mthis, __arg_0);
+
+  static styleSheets_Getter(mthis) native "Document_styleSheets_Getter";
+  styleSheets_Getter_(mthis) => styleSheets_Getter(mthis);
+
+  static timeline_Getter(mthis) native "Document_timeline_Getter";
+  timeline_Getter_(mthis) => timeline_Getter(mthis);
+
+  static title_Getter(mthis) native "Document_title_Getter";
+  title_Getter_(mthis) => title_Getter(mthis);
+
+  static title_Setter(mthis, __arg_0) native "Document_title_Setter";
+  title_Setter_(mthis, __arg_0) => title_Setter(mthis, __arg_0);
+
+  static visibilityState_Getter(mthis) native "Document_visibilityState_Getter";
+  visibilityState_Getter_(mthis) => visibilityState_Getter(mthis);
+
+  static webkitCancelFullScreen_Callback_0(mthis) native "Document_webkitCancelFullScreen_Callback";
+  webkitCancelFullScreen_Callback_0_(mthis) => webkitCancelFullScreen_Callback_0(mthis);
+
+  static webkitCancelFullScreen_Callback_1(mthis, __arg_0) native "Document_webkitCancelFullScreen_Callback";
+  webkitCancelFullScreen_Callback_1_(mthis, __arg_0) => webkitCancelFullScreen_Callback_1(mthis, __arg_0);
+
+  static webkitCancelFullScreen_Callback_2(mthis, __arg_0, __arg_1) native "Document_webkitCancelFullScreen_Callback";
+  webkitCancelFullScreen_Callback_2_(mthis, __arg_0, __arg_1) => webkitCancelFullScreen_Callback_2(mthis, __arg_0, __arg_1);
+
+  static webkitExitFullscreen_Callback_0(mthis) native "Document_webkitExitFullscreen_Callback";
+  webkitExitFullscreen_Callback_0_(mthis) => webkitExitFullscreen_Callback_0(mthis);
+
+  static webkitExitFullscreen_Callback_1(mthis, __arg_0) native "Document_webkitExitFullscreen_Callback";
+  webkitExitFullscreen_Callback_1_(mthis, __arg_0) => webkitExitFullscreen_Callback_1(mthis, __arg_0);
+
+  static webkitExitFullscreen_Callback_2(mthis, __arg_0, __arg_1) native "Document_webkitExitFullscreen_Callback";
+  webkitExitFullscreen_Callback_2_(mthis, __arg_0, __arg_1) => webkitExitFullscreen_Callback_2(mthis, __arg_0, __arg_1);
+
+  static webkitFullscreenElement_Getter(mthis) native "Document_webkitFullscreenElement_Getter";
+  webkitFullscreenElement_Getter_(mthis) => webkitFullscreenElement_Getter(mthis);
+
+  static webkitFullscreenEnabled_Getter(mthis) native "Document_webkitFullscreenEnabled_Getter";
+  webkitFullscreenEnabled_Getter_(mthis) => webkitFullscreenEnabled_Getter(mthis);
+
+  static webkitHidden_Getter(mthis) native "Document_webkitHidden_Getter";
+  webkitHidden_Getter_(mthis) => webkitHidden_Getter(mthis);
+
+  static webkitIsFullScreen_Getter(mthis) native "Document_webkitIsFullScreen_Getter";
+  webkitIsFullScreen_Getter_(mthis) => webkitIsFullScreen_Getter(mthis);
+
+  static webkitVisibilityState_Getter(mthis) native "Document_webkitVisibilityState_Getter";
+  webkitVisibilityState_Getter_(mthis) => webkitVisibilityState_Getter(mthis);
+
+  static xmlEncoding_Getter(mthis) native "Document_xmlEncoding_Getter";
+  xmlEncoding_Getter_(mthis) => xmlEncoding_Getter(mthis);
+
+}
+
+class BlinkDocumentFragment extends BlinkNode {
+  static final instance = new BlinkDocumentFragment();
+
+  static childElementCount_Getter(mthis) native "DocumentFragment_childElementCount_Getter";
+  childElementCount_Getter_(mthis) => childElementCount_Getter(mthis);
+
+  static constructorCallback_0() native "DocumentFragment_constructorCallback";
+  constructorCallback_0_() => constructorCallback_0();
+
+  static constructorCallback_1(__arg_0) native "DocumentFragment_constructorCallback";
+  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+
+  static constructorCallback_2(__arg_0, __arg_1) native "DocumentFragment_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+
+  static firstElementChild_Getter(mthis) native "DocumentFragment_firstElementChild_Getter";
+  firstElementChild_Getter_(mthis) => firstElementChild_Getter(mthis);
+
+  static getElementById_Callback_0(mthis) native "DocumentFragment_getElementById_Callback";
+  getElementById_Callback_0_(mthis) => getElementById_Callback_0(mthis);
+
+  static getElementById_Callback_1(mthis, __arg_0) native "DocumentFragment_getElementById_Callback";
+  getElementById_Callback_1_(mthis, __arg_0) => getElementById_Callback_1(mthis, __arg_0);
+
+  static getElementById_Callback_2(mthis, __arg_0, __arg_1) native "DocumentFragment_getElementById_Callback";
+  getElementById_Callback_2_(mthis, __arg_0, __arg_1) => getElementById_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getElementById_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "DocumentFragment_getElementById_Callback";
+  getElementById_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getElementById_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static lastElementChild_Getter(mthis) native "DocumentFragment_lastElementChild_Getter";
+  lastElementChild_Getter_(mthis) => lastElementChild_Getter(mthis);
+
+  static querySelectorAll_Callback_0(mthis) native "DocumentFragment_querySelectorAll_Callback";
+  querySelectorAll_Callback_0_(mthis) => querySelectorAll_Callback_0(mthis);
+
+  static querySelectorAll_Callback_1(mthis, __arg_0) native "DocumentFragment_querySelectorAll_Callback";
+  querySelectorAll_Callback_1_(mthis, __arg_0) => querySelectorAll_Callback_1(mthis, __arg_0);
+
+  static querySelectorAll_Callback_2(mthis, __arg_0, __arg_1) native "DocumentFragment_querySelectorAll_Callback";
+  querySelectorAll_Callback_2_(mthis, __arg_0, __arg_1) => querySelectorAll_Callback_2(mthis, __arg_0, __arg_1);
+
+  static querySelectorAll_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "DocumentFragment_querySelectorAll_Callback";
+  querySelectorAll_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => querySelectorAll_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static querySelector_Callback_0(mthis) native "DocumentFragment_querySelector_Callback";
+  querySelector_Callback_0_(mthis) => querySelector_Callback_0(mthis);
+
+  static querySelector_Callback_1(mthis, __arg_0) native "DocumentFragment_querySelector_Callback";
+  querySelector_Callback_1_(mthis, __arg_0) => querySelector_Callback_1(mthis, __arg_0);
+
+  static querySelector_Callback_2(mthis, __arg_0, __arg_1) native "DocumentFragment_querySelector_Callback";
+  querySelector_Callback_2_(mthis, __arg_0, __arg_1) => querySelector_Callback_2(mthis, __arg_0, __arg_1);
+
+  static querySelector_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "DocumentFragment_querySelector_Callback";
+  querySelector_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => querySelector_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+}
+
+class BlinkDocumentType extends BlinkNode {
+  static final instance = new BlinkDocumentType();
+
+}
+
+class BlinkDynamicsCompressorNode extends BlinkAudioNode {
+  static final instance = new BlinkDynamicsCompressorNode();
+
+  static attack_Getter(mthis) native "DynamicsCompressorNode_attack_Getter";
+  attack_Getter_(mthis) => attack_Getter(mthis);
+
+  static knee_Getter(mthis) native "DynamicsCompressorNode_knee_Getter";
+  knee_Getter_(mthis) => knee_Getter(mthis);
+
+  static ratio_Getter(mthis) native "DynamicsCompressorNode_ratio_Getter";
+  ratio_Getter_(mthis) => ratio_Getter(mthis);
+
+  static reduction_Getter(mthis) native "DynamicsCompressorNode_reduction_Getter";
+  reduction_Getter_(mthis) => reduction_Getter(mthis);
+
+  static release_Getter(mthis) native "DynamicsCompressorNode_release_Getter";
+  release_Getter_(mthis) => release_Getter(mthis);
+
+  static threshold_Getter(mthis) native "DynamicsCompressorNode_threshold_Getter";
+  threshold_Getter_(mthis) => threshold_Getter(mthis);
+
+}
+
+class BlinkEXTBlendMinMax {
+  static final instance = new BlinkEXTBlendMinMax();
+
+}
+
+class BlinkEXTFragDepth {
+  static final instance = new BlinkEXTFragDepth();
+
+}
+
+class BlinkEXTShaderTextureLOD {
+  static final instance = new BlinkEXTShaderTextureLOD();
+
+}
+
+class BlinkEXTTextureFilterAnisotropic {
+  static final instance = new BlinkEXTTextureFilterAnisotropic();
+
+}
+
+class BlinkElement extends BlinkNode {
+  static final instance = new BlinkElement();
+
+  static animate_Callback_0(mthis) native "Element_animate_Callback";
+  animate_Callback_0_(mthis) => animate_Callback_0(mthis);
+
+  static animate_Callback_1(mthis, __arg_0) native "Element_animate_Callback";
+  animate_Callback_1_(mthis, __arg_0) => animate_Callback_1(mthis, __arg_0);
+
+  static animate_Callback_2(mthis, __arg_0, __arg_1) native "Element_animate_Callback";
+  animate_Callback_2_(mthis, __arg_0, __arg_1) => animate_Callback_2(mthis, __arg_0, __arg_1);
+
+  static animate_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Element_animate_Callback";
+  animate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => animate_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static animate_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Element_animate_Callback";
+  animate_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => animate_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static attributes_Getter(mthis) native "Element_attributes_Getter";
+  attributes_Getter_(mthis) => attributes_Getter(mthis);
+
+  static blur_Callback_0(mthis) native "Element_blur_Callback";
+  blur_Callback_0_(mthis) => blur_Callback_0(mthis);
+
+  static blur_Callback_1(mthis, __arg_0) native "Element_blur_Callback";
+  blur_Callback_1_(mthis, __arg_0) => blur_Callback_1(mthis, __arg_0);
+
+  static blur_Callback_2(mthis, __arg_0, __arg_1) native "Element_blur_Callback";
+  blur_Callback_2_(mthis, __arg_0, __arg_1) => blur_Callback_2(mthis, __arg_0, __arg_1);
+
+  static childElementCount_Getter(mthis) native "Element_childElementCount_Getter";
+  childElementCount_Getter_(mthis) => childElementCount_Getter(mthis);
+
+  static children_Getter(mthis) native "Element_children_Getter";
+  children_Getter_(mthis) => children_Getter(mthis);
+
+  static classList_Getter(mthis) native "Element_classList_Getter";
+  classList_Getter_(mthis) => classList_Getter(mthis);
+
+  static className_Getter(mthis) native "Element_className_Getter";
+  className_Getter_(mthis) => className_Getter(mthis);
+
+  static className_Setter(mthis, __arg_0) native "Element_className_Setter";
+  className_Setter_(mthis, __arg_0) => className_Setter(mthis, __arg_0);
+
+  static clientHeight_Getter(mthis) native "Element_clientHeight_Getter";
+  clientHeight_Getter_(mthis) => clientHeight_Getter(mthis);
+
+  static clientLeft_Getter(mthis) native "Element_clientLeft_Getter";
+  clientLeft_Getter_(mthis) => clientLeft_Getter(mthis);
+
+  static clientTop_Getter(mthis) native "Element_clientTop_Getter";
+  clientTop_Getter_(mthis) => clientTop_Getter(mthis);
+
+  static clientWidth_Getter(mthis) native "Element_clientWidth_Getter";
+  clientWidth_Getter_(mthis) => clientWidth_Getter(mthis);
+
+  static createShadowRoot_Callback_0(mthis) native "Element_createShadowRoot_Callback";
+  createShadowRoot_Callback_0_(mthis) => createShadowRoot_Callback_0(mthis);
+
+  static createShadowRoot_Callback_1(mthis, __arg_0) native "Element_createShadowRoot_Callback";
+  createShadowRoot_Callback_1_(mthis, __arg_0) => createShadowRoot_Callback_1(mthis, __arg_0);
+
+  static createShadowRoot_Callback_2(mthis, __arg_0, __arg_1) native "Element_createShadowRoot_Callback";
+  createShadowRoot_Callback_2_(mthis, __arg_0, __arg_1) => createShadowRoot_Callback_2(mthis, __arg_0, __arg_1);
+
+  static firstElementChild_Getter(mthis) native "Element_firstElementChild_Getter";
+  firstElementChild_Getter_(mthis) => firstElementChild_Getter(mthis);
+
+  static focus_Callback_0(mthis) native "Element_focus_Callback";
+  focus_Callback_0_(mthis) => focus_Callback_0(mthis);
+
+  static focus_Callback_1(mthis, __arg_0) native "Element_focus_Callback";
+  focus_Callback_1_(mthis, __arg_0) => focus_Callback_1(mthis, __arg_0);
+
+  static focus_Callback_2(mthis, __arg_0, __arg_1) native "Element_focus_Callback";
+  focus_Callback_2_(mthis, __arg_0, __arg_1) => focus_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getAnimationPlayers_Callback_0(mthis) native "Element_getAnimationPlayers_Callback";
+  getAnimationPlayers_Callback_0_(mthis) => getAnimationPlayers_Callback_0(mthis);
+
+  static getAnimationPlayers_Callback_1(mthis, __arg_0) native "Element_getAnimationPlayers_Callback";
+  getAnimationPlayers_Callback_1_(mthis, __arg_0) => getAnimationPlayers_Callback_1(mthis, __arg_0);
+
+  static getAnimationPlayers_Callback_2(mthis, __arg_0, __arg_1) native "Element_getAnimationPlayers_Callback";
+  getAnimationPlayers_Callback_2_(mthis, __arg_0, __arg_1) => getAnimationPlayers_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getAttributeNS_Callback_0(mthis) native "Element_getAttributeNS_Callback";
+  getAttributeNS_Callback_0_(mthis) => getAttributeNS_Callback_0(mthis);
+
+  static getAttributeNS_Callback_1(mthis, __arg_0) native "Element_getAttributeNS_Callback";
+  getAttributeNS_Callback_1_(mthis, __arg_0) => getAttributeNS_Callback_1(mthis, __arg_0);
+
+  static getAttributeNS_Callback_2(mthis, __arg_0, __arg_1) native "Element_getAttributeNS_Callback";
+  getAttributeNS_Callback_2_(mthis, __arg_0, __arg_1) => getAttributeNS_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getAttributeNS_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Element_getAttributeNS_Callback";
+  getAttributeNS_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getAttributeNS_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static getAttributeNS_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Element_getAttributeNS_Callback";
+  getAttributeNS_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => getAttributeNS_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static getAttribute_Callback_0(mthis) native "Element_getAttribute_Callback";
+  getAttribute_Callback_0_(mthis) => getAttribute_Callback_0(mthis);
+
+  static getAttribute_Callback_1(mthis, __arg_0) native "Element_getAttribute_Callback";
+  getAttribute_Callback_1_(mthis, __arg_0) => getAttribute_Callback_1(mthis, __arg_0);
+
+  static getAttribute_Callback_2(mthis, __arg_0, __arg_1) native "Element_getAttribute_Callback";
+  getAttribute_Callback_2_(mthis, __arg_0, __arg_1) => getAttribute_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getAttribute_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Element_getAttribute_Callback";
+  getAttribute_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getAttribute_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static getBoundingClientRect_Callback_0(mthis) native "Element_getBoundingClientRect_Callback";
+  getBoundingClientRect_Callback_0_(mthis) => getBoundingClientRect_Callback_0(mthis);
+
+  static getBoundingClientRect_Callback_1(mthis, __arg_0) native "Element_getBoundingClientRect_Callback";
+  getBoundingClientRect_Callback_1_(mthis, __arg_0) => getBoundingClientRect_Callback_1(mthis, __arg_0);
+
+  static getBoundingClientRect_Callback_2(mthis, __arg_0, __arg_1) native "Element_getBoundingClientRect_Callback";
+  getBoundingClientRect_Callback_2_(mthis, __arg_0, __arg_1) => getBoundingClientRect_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getClientRects_Callback_0(mthis) native "Element_getClientRects_Callback";
+  getClientRects_Callback_0_(mthis) => getClientRects_Callback_0(mthis);
+
+  static getClientRects_Callback_1(mthis, __arg_0) native "Element_getClientRects_Callback";
+  getClientRects_Callback_1_(mthis, __arg_0) => getClientRects_Callback_1(mthis, __arg_0);
+
+  static getClientRects_Callback_2(mthis, __arg_0, __arg_1) native "Element_getClientRects_Callback";
+  getClientRects_Callback_2_(mthis, __arg_0, __arg_1) => getClientRects_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getDestinationInsertionPoints_Callback_0(mthis) native "Element_getDestinationInsertionPoints_Callback";
+  getDestinationInsertionPoints_Callback_0_(mthis) => getDestinationInsertionPoints_Callback_0(mthis);
+
+  static getDestinationInsertionPoints_Callback_1(mthis, __arg_0) native "Element_getDestinationInsertionPoints_Callback";
+  getDestinationInsertionPoints_Callback_1_(mthis, __arg_0) => getDestinationInsertionPoints_Callback_1(mthis, __arg_0);
+
+  static getDestinationInsertionPoints_Callback_2(mthis, __arg_0, __arg_1) native "Element_getDestinationInsertionPoints_Callback";
+  getDestinationInsertionPoints_Callback_2_(mthis, __arg_0, __arg_1) => getDestinationInsertionPoints_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getElementsByClassName_Callback_0(mthis) native "Element_getElementsByClassName_Callback";
+  getElementsByClassName_Callback_0_(mthis) => getElementsByClassName_Callback_0(mthis);
+
+  static getElementsByClassName_Callback_1(mthis, __arg_0) native "Element_getElementsByClassName_Callback";
+  getElementsByClassName_Callback_1_(mthis, __arg_0) => getElementsByClassName_Callback_1(mthis, __arg_0);
+
+  static getElementsByClassName_Callback_2(mthis, __arg_0, __arg_1) native "Element_getElementsByClassName_Callback";
+  getElementsByClassName_Callback_2_(mthis, __arg_0, __arg_1) => getElementsByClassName_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getElementsByClassName_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Element_getElementsByClassName_Callback";
+  getElementsByClassName_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getElementsByClassName_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static getElementsByTagName_Callback_0(mthis) native "Element_getElementsByTagName_Callback";
+  getElementsByTagName_Callback_0_(mthis) => getElementsByTagName_Callback_0(mthis);
+
+  static getElementsByTagName_Callback_1(mthis, __arg_0) native "Element_getElementsByTagName_Callback";
+  getElementsByTagName_Callback_1_(mthis, __arg_0) => getElementsByTagName_Callback_1(mthis, __arg_0);
+
+  static getElementsByTagName_Callback_2(mthis, __arg_0, __arg_1) native "Element_getElementsByTagName_Callback";
+  getElementsByTagName_Callback_2_(mthis, __arg_0, __arg_1) => getElementsByTagName_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getElementsByTagName_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Element_getElementsByTagName_Callback";
+  getElementsByTagName_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getElementsByTagName_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static hasAttributeNS_Callback_0(mthis) native "Element_hasAttributeNS_Callback";
+  hasAttributeNS_Callback_0_(mthis) => hasAttributeNS_Callback_0(mthis);
+
+  static hasAttributeNS_Callback_1(mthis, __arg_0) native "Element_hasAttributeNS_Callback";
+  hasAttributeNS_Callback_1_(mthis, __arg_0) => hasAttributeNS_Callback_1(mthis, __arg_0);
+
+  static hasAttributeNS_Callback_2(mthis, __arg_0, __arg_1) native "Element_hasAttributeNS_Callback";
+  hasAttributeNS_Callback_2_(mthis, __arg_0, __arg_1) => hasAttributeNS_Callback_2(mthis, __arg_0, __arg_1);
+
+  static hasAttributeNS_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Element_hasAttributeNS_Callback";
+  hasAttributeNS_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => hasAttributeNS_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static hasAttributeNS_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Element_hasAttributeNS_Callback";
+  hasAttributeNS_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => hasAttributeNS_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static hasAttribute_Callback_0(mthis) native "Element_hasAttribute_Callback";
+  hasAttribute_Callback_0_(mthis) => hasAttribute_Callback_0(mthis);
+
+  static hasAttribute_Callback_1(mthis, __arg_0) native "Element_hasAttribute_Callback";
+  hasAttribute_Callback_1_(mthis, __arg_0) => hasAttribute_Callback_1(mthis, __arg_0);
+
+  static hasAttribute_Callback_2(mthis, __arg_0, __arg_1) native "Element_hasAttribute_Callback";
+  hasAttribute_Callback_2_(mthis, __arg_0, __arg_1) => hasAttribute_Callback_2(mthis, __arg_0, __arg_1);
+
+  static hasAttribute_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Element_hasAttribute_Callback";
+  hasAttribute_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => hasAttribute_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static hasAttributes_Callback_0(mthis) native "Element_hasAttributes_Callback";
+  hasAttributes_Callback_0_(mthis) => hasAttributes_Callback_0(mthis);
+
+  static hasAttributes_Callback_1(mthis, __arg_0) native "Element_hasAttributes_Callback";
+  hasAttributes_Callback_1_(mthis, __arg_0) => hasAttributes_Callback_1(mthis, __arg_0);
+
+  static hasAttributes_Callback_2(mthis, __arg_0, __arg_1) native "Element_hasAttributes_Callback";
+  hasAttributes_Callback_2_(mthis, __arg_0, __arg_1) => hasAttributes_Callback_2(mthis, __arg_0, __arg_1);
+
+  static id_Getter(mthis) native "Element_id_Getter";
+  id_Getter_(mthis) => id_Getter(mthis);
+
+  static id_Setter(mthis, __arg_0) native "Element_id_Setter";
+  id_Setter_(mthis, __arg_0) => id_Setter(mthis, __arg_0);
+
+  static innerHTML_Getter(mthis) native "Element_innerHTML_Getter";
+  innerHTML_Getter_(mthis) => innerHTML_Getter(mthis);
+
+  static innerHTML_Setter(mthis, __arg_0) native "Element_innerHTML_Setter";
+  innerHTML_Setter_(mthis, __arg_0) => innerHTML_Setter(mthis, __arg_0);
+
+  static insertAdjacentElement_Callback_0(mthis) native "Element_insertAdjacentElement_Callback";
+  insertAdjacentElement_Callback_0_(mthis) => insertAdjacentElement_Callback_0(mthis);
+
+  static insertAdjacentElement_Callback_1(mthis, __arg_0) native "Element_insertAdjacentElement_Callback";
+  insertAdjacentElement_Callback_1_(mthis, __arg_0) => insertAdjacentElement_Callback_1(mthis, __arg_0);
+
+  static insertAdjacentElement_Callback_2(mthis, __arg_0, __arg_1) native "Element_insertAdjacentElement_Callback";
+  insertAdjacentElement_Callback_2_(mthis, __arg_0, __arg_1) => insertAdjacentElement_Callback_2(mthis, __arg_0, __arg_1);
+
+  static insertAdjacentElement_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Element_insertAdjacentElement_Callback";
+  insertAdjacentElement_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => insertAdjacentElement_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static insertAdjacentElement_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Element_insertAdjacentElement_Callback";
+  insertAdjacentElement_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => insertAdjacentElement_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static insertAdjacentHTML_Callback_0(mthis) native "Element_insertAdjacentHTML_Callback";
+  insertAdjacentHTML_Callback_0_(mthis) => insertAdjacentHTML_Callback_0(mthis);
+
+  static insertAdjacentHTML_Callback_1(mthis, __arg_0) native "Element_insertAdjacentHTML_Callback";
+  insertAdjacentHTML_Callback_1_(mthis, __arg_0) => insertAdjacentHTML_Callback_1(mthis, __arg_0);
+
+  static insertAdjacentHTML_Callback_2(mthis, __arg_0, __arg_1) native "Element_insertAdjacentHTML_Callback";
+  insertAdjacentHTML_Callback_2_(mthis, __arg_0, __arg_1) => insertAdjacentHTML_Callback_2(mthis, __arg_0, __arg_1);
+
+  static insertAdjacentHTML_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Element_insertAdjacentHTML_Callback";
+  insertAdjacentHTML_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => insertAdjacentHTML_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static insertAdjacentHTML_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Element_insertAdjacentHTML_Callback";
+  insertAdjacentHTML_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => insertAdjacentHTML_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static insertAdjacentText_Callback_0(mthis) native "Element_insertAdjacentText_Callback";
+  insertAdjacentText_Callback_0_(mthis) => insertAdjacentText_Callback_0(mthis);
+
+  static insertAdjacentText_Callback_1(mthis, __arg_0) native "Element_insertAdjacentText_Callback";
+  insertAdjacentText_Callback_1_(mthis, __arg_0) => insertAdjacentText_Callback_1(mthis, __arg_0);
+
+  static insertAdjacentText_Callback_2(mthis, __arg_0, __arg_1) native "Element_insertAdjacentText_Callback";
+  insertAdjacentText_Callback_2_(mthis, __arg_0, __arg_1) => insertAdjacentText_Callback_2(mthis, __arg_0, __arg_1);
+
+  static insertAdjacentText_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Element_insertAdjacentText_Callback";
+  insertAdjacentText_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => insertAdjacentText_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static insertAdjacentText_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Element_insertAdjacentText_Callback";
+  insertAdjacentText_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => insertAdjacentText_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static lastElementChild_Getter(mthis) native "Element_lastElementChild_Getter";
+  lastElementChild_Getter_(mthis) => lastElementChild_Getter(mthis);
+
+  static localName_Getter(mthis) native "Element_localName_Getter";
+  localName_Getter_(mthis) => localName_Getter(mthis);
+
+  static matches_Callback_0(mthis) native "Element_matches_Callback";
+  matches_Callback_0_(mthis) => matches_Callback_0(mthis);
+
+  static matches_Callback_1(mthis, __arg_0) native "Element_matches_Callback";
+  matches_Callback_1_(mthis, __arg_0) => matches_Callback_1(mthis, __arg_0);
+
+  static matches_Callback_2(mthis, __arg_0, __arg_1) native "Element_matches_Callback";
+  matches_Callback_2_(mthis, __arg_0, __arg_1) => matches_Callback_2(mthis, __arg_0, __arg_1);
+
+  static matches_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Element_matches_Callback";
+  matches_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => matches_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static namespaceURI_Getter(mthis) native "Element_namespaceURI_Getter";
+  namespaceURI_Getter_(mthis) => namespaceURI_Getter(mthis);
+
+  static nextElementSibling_Getter(mthis) native "Element_nextElementSibling_Getter";
+  nextElementSibling_Getter_(mthis) => nextElementSibling_Getter(mthis);
+
+  static offsetHeight_Getter(mthis) native "Element_offsetHeight_Getter";
+  offsetHeight_Getter_(mthis) => offsetHeight_Getter(mthis);
+
+  static offsetLeft_Getter(mthis) native "Element_offsetLeft_Getter";
+  offsetLeft_Getter_(mthis) => offsetLeft_Getter(mthis);
+
+  static offsetParent_Getter(mthis) native "Element_offsetParent_Getter";
+  offsetParent_Getter_(mthis) => offsetParent_Getter(mthis);
+
+  static offsetTop_Getter(mthis) native "Element_offsetTop_Getter";
+  offsetTop_Getter_(mthis) => offsetTop_Getter(mthis);
+
+  static offsetWidth_Getter(mthis) native "Element_offsetWidth_Getter";
+  offsetWidth_Getter_(mthis) => offsetWidth_Getter(mthis);
+
+  static onbeforecopy_Getter(mthis) native "Element_onbeforecopy_Getter";
+  onbeforecopy_Getter_(mthis) => onbeforecopy_Getter(mthis);
+
+  static onbeforecopy_Setter(mthis, __arg_0) native "Element_onbeforecopy_Setter";
+  onbeforecopy_Setter_(mthis, __arg_0) => onbeforecopy_Setter(mthis, __arg_0);
+
+  static onbeforecut_Getter(mthis) native "Element_onbeforecut_Getter";
+  onbeforecut_Getter_(mthis) => onbeforecut_Getter(mthis);
+
+  static onbeforecut_Setter(mthis, __arg_0) native "Element_onbeforecut_Setter";
+  onbeforecut_Setter_(mthis, __arg_0) => onbeforecut_Setter(mthis, __arg_0);
+
+  static onbeforepaste_Getter(mthis) native "Element_onbeforepaste_Getter";
+  onbeforepaste_Getter_(mthis) => onbeforepaste_Getter(mthis);
+
+  static onbeforepaste_Setter(mthis, __arg_0) native "Element_onbeforepaste_Setter";
+  onbeforepaste_Setter_(mthis, __arg_0) => onbeforepaste_Setter(mthis, __arg_0);
+
+  static oncopy_Getter(mthis) native "Element_oncopy_Getter";
+  oncopy_Getter_(mthis) => oncopy_Getter(mthis);
+
+  static oncopy_Setter(mthis, __arg_0) native "Element_oncopy_Setter";
+  oncopy_Setter_(mthis, __arg_0) => oncopy_Setter(mthis, __arg_0);
+
+  static oncut_Getter(mthis) native "Element_oncut_Getter";
+  oncut_Getter_(mthis) => oncut_Getter(mthis);
+
+  static oncut_Setter(mthis, __arg_0) native "Element_oncut_Setter";
+  oncut_Setter_(mthis, __arg_0) => oncut_Setter(mthis, __arg_0);
+
+  static onpaste_Getter(mthis) native "Element_onpaste_Getter";
+  onpaste_Getter_(mthis) => onpaste_Getter(mthis);
+
+  static onpaste_Setter(mthis, __arg_0) native "Element_onpaste_Setter";
+  onpaste_Setter_(mthis, __arg_0) => onpaste_Setter(mthis, __arg_0);
+
+  static onsearch_Getter(mthis) native "Element_onsearch_Getter";
+  onsearch_Getter_(mthis) => onsearch_Getter(mthis);
+
+  static onsearch_Setter(mthis, __arg_0) native "Element_onsearch_Setter";
+  onsearch_Setter_(mthis, __arg_0) => onsearch_Setter(mthis, __arg_0);
+
+  static onselectstart_Getter(mthis) native "Element_onselectstart_Getter";
+  onselectstart_Getter_(mthis) => onselectstart_Getter(mthis);
+
+  static onselectstart_Setter(mthis, __arg_0) native "Element_onselectstart_Setter";
+  onselectstart_Setter_(mthis, __arg_0) => onselectstart_Setter(mthis, __arg_0);
+
+  static ontouchcancel_Getter(mthis) native "Element_ontouchcancel_Getter";
+  ontouchcancel_Getter_(mthis) => ontouchcancel_Getter(mthis);
+
+  static ontouchcancel_Setter(mthis, __arg_0) native "Element_ontouchcancel_Setter";
+  ontouchcancel_Setter_(mthis, __arg_0) => ontouchcancel_Setter(mthis, __arg_0);
+
+  static ontouchend_Getter(mthis) native "Element_ontouchend_Getter";
+  ontouchend_Getter_(mthis) => ontouchend_Getter(mthis);
+
+  static ontouchend_Setter(mthis, __arg_0) native "Element_ontouchend_Setter";
+  ontouchend_Setter_(mthis, __arg_0) => ontouchend_Setter(mthis, __arg_0);
+
+  static ontouchmove_Getter(mthis) native "Element_ontouchmove_Getter";
+  ontouchmove_Getter_(mthis) => ontouchmove_Getter(mthis);
+
+  static ontouchmove_Setter(mthis, __arg_0) native "Element_ontouchmove_Setter";
+  ontouchmove_Setter_(mthis, __arg_0) => ontouchmove_Setter(mthis, __arg_0);
+
+  static ontouchstart_Getter(mthis) native "Element_ontouchstart_Getter";
+  ontouchstart_Getter_(mthis) => ontouchstart_Getter(mthis);
+
+  static ontouchstart_Setter(mthis, __arg_0) native "Element_ontouchstart_Setter";
+  ontouchstart_Setter_(mthis, __arg_0) => ontouchstart_Setter(mthis, __arg_0);
+
+  static onwebkitfullscreenchange_Getter(mthis) native "Element_onwebkitfullscreenchange_Getter";
+  onwebkitfullscreenchange_Getter_(mthis) => onwebkitfullscreenchange_Getter(mthis);
+
+  static onwebkitfullscreenchange_Setter(mthis, __arg_0) native "Element_onwebkitfullscreenchange_Setter";
+  onwebkitfullscreenchange_Setter_(mthis, __arg_0) => onwebkitfullscreenchange_Setter(mthis, __arg_0);
+
+  static onwebkitfullscreenerror_Getter(mthis) native "Element_onwebkitfullscreenerror_Getter";
+  onwebkitfullscreenerror_Getter_(mthis) => onwebkitfullscreenerror_Getter(mthis);
+
+  static onwebkitfullscreenerror_Setter(mthis, __arg_0) native "Element_onwebkitfullscreenerror_Setter";
+  onwebkitfullscreenerror_Setter_(mthis, __arg_0) => onwebkitfullscreenerror_Setter(mthis, __arg_0);
+
+  static onwheel_Getter(mthis) native "Element_onwheel_Getter";
+  onwheel_Getter_(mthis) => onwheel_Getter(mthis);
+
+  static onwheel_Setter(mthis, __arg_0) native "Element_onwheel_Setter";
+  onwheel_Setter_(mthis, __arg_0) => onwheel_Setter(mthis, __arg_0);
+
+  static outerHTML_Getter(mthis) native "Element_outerHTML_Getter";
+  outerHTML_Getter_(mthis) => outerHTML_Getter(mthis);
+
+  static outerHTML_Setter(mthis, __arg_0) native "Element_outerHTML_Setter";
+  outerHTML_Setter_(mthis, __arg_0) => outerHTML_Setter(mthis, __arg_0);
+
+  static prefix_Getter(mthis) native "Element_prefix_Getter";
+  prefix_Getter_(mthis) => prefix_Getter(mthis);
+
+  static prefix_Setter(mthis, __arg_0) native "Element_prefix_Setter";
+  prefix_Setter_(mthis, __arg_0) => prefix_Setter(mthis, __arg_0);
+
+  static previousElementSibling_Getter(mthis) native "Element_previousElementSibling_Getter";
+  previousElementSibling_Getter_(mthis) => previousElementSibling_Getter(mthis);
+
+  static querySelectorAll_Callback_0(mthis) native "Element_querySelectorAll_Callback";
+  querySelectorAll_Callback_0_(mthis) => querySelectorAll_Callback_0(mthis);
+
+  static querySelectorAll_Callback_1(mthis, __arg_0) native "Element_querySelectorAll_Callback";
+  querySelectorAll_Callback_1_(mthis, __arg_0) => querySelectorAll_Callback_1(mthis, __arg_0);
+
+  static querySelectorAll_Callback_2(mthis, __arg_0, __arg_1) native "Element_querySelectorAll_Callback";
+  querySelectorAll_Callback_2_(mthis, __arg_0, __arg_1) => querySelectorAll_Callback_2(mthis, __arg_0, __arg_1);
+
+  static querySelectorAll_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Element_querySelectorAll_Callback";
+  querySelectorAll_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => querySelectorAll_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static querySelector_Callback_0(mthis) native "Element_querySelector_Callback";
+  querySelector_Callback_0_(mthis) => querySelector_Callback_0(mthis);
+
+  static querySelector_Callback_1(mthis, __arg_0) native "Element_querySelector_Callback";
+  querySelector_Callback_1_(mthis, __arg_0) => querySelector_Callback_1(mthis, __arg_0);
+
+  static querySelector_Callback_2(mthis, __arg_0, __arg_1) native "Element_querySelector_Callback";
+  querySelector_Callback_2_(mthis, __arg_0, __arg_1) => querySelector_Callback_2(mthis, __arg_0, __arg_1);
+
+  static querySelector_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Element_querySelector_Callback";
+  querySelector_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => querySelector_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static removeAttributeNS_Callback_0(mthis) native "Element_removeAttributeNS_Callback";
+  removeAttributeNS_Callback_0_(mthis) => removeAttributeNS_Callback_0(mthis);
+
+  static removeAttributeNS_Callback_1(mthis, __arg_0) native "Element_removeAttributeNS_Callback";
+  removeAttributeNS_Callback_1_(mthis, __arg_0) => removeAttributeNS_Callback_1(mthis, __arg_0);
+
+  static removeAttributeNS_Callback_2(mthis, __arg_0, __arg_1) native "Element_removeAttributeNS_Callback";
+  removeAttributeNS_Callback_2_(mthis, __arg_0, __arg_1) => removeAttributeNS_Callback_2(mthis, __arg_0, __arg_1);
+
+  static removeAttributeNS_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Element_removeAttributeNS_Callback";
+  removeAttributeNS_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => removeAttributeNS_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static removeAttributeNS_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Element_removeAttributeNS_Callback";
+  removeAttributeNS_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => removeAttributeNS_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static removeAttribute_Callback_0(mthis) native "Element_removeAttribute_Callback";
+  removeAttribute_Callback_0_(mthis) => removeAttribute_Callback_0(mthis);
+
+  static removeAttribute_Callback_1(mthis, __arg_0) native "Element_removeAttribute_Callback";
+  removeAttribute_Callback_1_(mthis, __arg_0) => removeAttribute_Callback_1(mthis, __arg_0);
+
+  static removeAttribute_Callback_2(mthis, __arg_0, __arg_1) native "Element_removeAttribute_Callback";
+  removeAttribute_Callback_2_(mthis, __arg_0, __arg_1) => removeAttribute_Callback_2(mthis, __arg_0, __arg_1);
+
+  static removeAttribute_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Element_removeAttribute_Callback";
+  removeAttribute_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => removeAttribute_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static remove_Callback_0(mthis) native "Element_remove_Callback";
+  remove_Callback_0_(mthis) => remove_Callback_0(mthis);
+
+  static remove_Callback_1(mthis, __arg_0) native "Element_remove_Callback";
+  remove_Callback_1_(mthis, __arg_0) => remove_Callback_1(mthis, __arg_0);
+
+  static remove_Callback_2(mthis, __arg_0, __arg_1) native "Element_remove_Callback";
+  remove_Callback_2_(mthis, __arg_0, __arg_1) => remove_Callback_2(mthis, __arg_0, __arg_1);
+
+  static requestFullscreen_Callback_0(mthis) native "Element_requestFullscreen_Callback";
+  requestFullscreen_Callback_0_(mthis) => requestFullscreen_Callback_0(mthis);
+
+  static requestFullscreen_Callback_1(mthis, __arg_0) native "Element_requestFullscreen_Callback";
+  requestFullscreen_Callback_1_(mthis, __arg_0) => requestFullscreen_Callback_1(mthis, __arg_0);
+
+  static requestFullscreen_Callback_2(mthis, __arg_0, __arg_1) native "Element_requestFullscreen_Callback";
+  requestFullscreen_Callback_2_(mthis, __arg_0, __arg_1) => requestFullscreen_Callback_2(mthis, __arg_0, __arg_1);
+
+  static requestPointerLock_Callback_0(mthis) native "Element_requestPointerLock_Callback";
+  requestPointerLock_Callback_0_(mthis) => requestPointerLock_Callback_0(mthis);
+
+  static requestPointerLock_Callback_1(mthis, __arg_0) native "Element_requestPointerLock_Callback";
+  requestPointerLock_Callback_1_(mthis, __arg_0) => requestPointerLock_Callback_1(mthis, __arg_0);
+
+  static requestPointerLock_Callback_2(mthis, __arg_0, __arg_1) native "Element_requestPointerLock_Callback";
+  requestPointerLock_Callback_2_(mthis, __arg_0, __arg_1) => requestPointerLock_Callback_2(mthis, __arg_0, __arg_1);
+
+  static scrollHeight_Getter(mthis) native "Element_scrollHeight_Getter";
+  scrollHeight_Getter_(mthis) => scrollHeight_Getter(mthis);
+
+  static scrollIntoViewIfNeeded_Callback_0(mthis) native "Element_scrollIntoViewIfNeeded_Callback";
+  scrollIntoViewIfNeeded_Callback_0_(mthis) => scrollIntoViewIfNeeded_Callback_0(mthis);
+
+  static scrollIntoViewIfNeeded_Callback_1(mthis, __arg_0) native "Element_scrollIntoViewIfNeeded_Callback";
+  scrollIntoViewIfNeeded_Callback_1_(mthis, __arg_0) => scrollIntoViewIfNeeded_Callback_1(mthis, __arg_0);
+
+  static scrollIntoViewIfNeeded_Callback_2(mthis, __arg_0, __arg_1) native "Element_scrollIntoViewIfNeeded_Callback";
+  scrollIntoViewIfNeeded_Callback_2_(mthis, __arg_0, __arg_1) => scrollIntoViewIfNeeded_Callback_2(mthis, __arg_0, __arg_1);
+
+  static scrollIntoViewIfNeeded_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Element_scrollIntoViewIfNeeded_Callback";
+  scrollIntoViewIfNeeded_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => scrollIntoViewIfNeeded_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static scrollIntoView_Callback_0(mthis) native "Element_scrollIntoView_Callback";
+  scrollIntoView_Callback_0_(mthis) => scrollIntoView_Callback_0(mthis);
+
+  static scrollIntoView_Callback_1(mthis, __arg_0) native "Element_scrollIntoView_Callback";
+  scrollIntoView_Callback_1_(mthis, __arg_0) => scrollIntoView_Callback_1(mthis, __arg_0);
+
+  static scrollIntoView_Callback_2(mthis, __arg_0, __arg_1) native "Element_scrollIntoView_Callback";
+  scrollIntoView_Callback_2_(mthis, __arg_0, __arg_1) => scrollIntoView_Callback_2(mthis, __arg_0, __arg_1);
+
+  static scrollIntoView_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Element_scrollIntoView_Callback";
+  scrollIntoView_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => scrollIntoView_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static scrollLeft_Getter(mthis) native "Element_scrollLeft_Getter";
+  scrollLeft_Getter_(mthis) => scrollLeft_Getter(mthis);
+
+  static scrollLeft_Setter(mthis, __arg_0) native "Element_scrollLeft_Setter";
+  scrollLeft_Setter_(mthis, __arg_0) => scrollLeft_Setter(mthis, __arg_0);
+
+  static scrollTop_Getter(mthis) native "Element_scrollTop_Getter";
+  scrollTop_Getter_(mthis) => scrollTop_Getter(mthis);
+
+  static scrollTop_Setter(mthis, __arg_0) native "Element_scrollTop_Setter";
+  scrollTop_Setter_(mthis, __arg_0) => scrollTop_Setter(mthis, __arg_0);
+
+  static scrollWidth_Getter(mthis) native "Element_scrollWidth_Getter";
+  scrollWidth_Getter_(mthis) => scrollWidth_Getter(mthis);
+
+  static setAttributeNS_Callback_1(mthis, __arg_0) native "Element_setAttributeNS_Callback";
+  setAttributeNS_Callback_1_(mthis, __arg_0) => setAttributeNS_Callback_1(mthis, __arg_0);
+
+  static setAttributeNS_Callback_2(mthis, __arg_0, __arg_1) native "Element_setAttributeNS_Callback";
+  setAttributeNS_Callback_2_(mthis, __arg_0, __arg_1) => setAttributeNS_Callback_2(mthis, __arg_0, __arg_1);
+
+  static setAttributeNS_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Element_setAttributeNS_Callback";
+  setAttributeNS_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => setAttributeNS_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static setAttributeNS_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Element_setAttributeNS_Callback";
+  setAttributeNS_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => setAttributeNS_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static setAttributeNS_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "Element_setAttributeNS_Callback";
+  setAttributeNS_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => setAttributeNS_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static setAttribute_Callback_0(mthis) native "Element_setAttribute_Callback";
+  setAttribute_Callback_0_(mthis) => setAttribute_Callback_0(mthis);
+
+  static setAttribute_Callback_1(mthis, __arg_0) native "Element_setAttribute_Callback";
+  setAttribute_Callback_1_(mthis, __arg_0) => setAttribute_Callback_1(mthis, __arg_0);
+
+  static setAttribute_Callback_2(mthis, __arg_0, __arg_1) native "Element_setAttribute_Callback";
+  setAttribute_Callback_2_(mthis, __arg_0, __arg_1) => setAttribute_Callback_2(mthis, __arg_0, __arg_1);
+
+  static setAttribute_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Element_setAttribute_Callback";
+  setAttribute_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => setAttribute_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static setAttribute_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Element_setAttribute_Callback";
+  setAttribute_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => setAttribute_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static shadowRoot_Getter(mthis) native "Element_shadowRoot_Getter";
+  shadowRoot_Getter_(mthis) => shadowRoot_Getter(mthis);
+
+  static style_Getter(mthis) native "Element_style_Getter";
+  style_Getter_(mthis) => style_Getter(mthis);
+
+  static tagName_Getter(mthis) native "Element_tagName_Getter";
+  tagName_Getter_(mthis) => tagName_Getter(mthis);
+
+  static webkitRequestFullScreen_Callback_0(mthis) native "Element_webkitRequestFullScreen_Callback";
+  webkitRequestFullScreen_Callback_0_(mthis) => webkitRequestFullScreen_Callback_0(mthis);
+
+  static webkitRequestFullScreen_Callback_1(mthis, __arg_0) native "Element_webkitRequestFullScreen_Callback";
+  webkitRequestFullScreen_Callback_1_(mthis, __arg_0) => webkitRequestFullScreen_Callback_1(mthis, __arg_0);
+
+  static webkitRequestFullScreen_Callback_2(mthis, __arg_0, __arg_1) native "Element_webkitRequestFullScreen_Callback";
+  webkitRequestFullScreen_Callback_2_(mthis, __arg_0, __arg_1) => webkitRequestFullScreen_Callback_2(mthis, __arg_0, __arg_1);
+
+  static webkitRequestFullScreen_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Element_webkitRequestFullScreen_Callback";
+  webkitRequestFullScreen_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => webkitRequestFullScreen_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static webkitRequestFullscreen_Callback_0(mthis) native "Element_webkitRequestFullscreen_Callback";
+  webkitRequestFullscreen_Callback_0_(mthis) => webkitRequestFullscreen_Callback_0(mthis);
+
+  static webkitRequestFullscreen_Callback_1(mthis, __arg_0) native "Element_webkitRequestFullscreen_Callback";
+  webkitRequestFullscreen_Callback_1_(mthis, __arg_0) => webkitRequestFullscreen_Callback_1(mthis, __arg_0);
+
+  static webkitRequestFullscreen_Callback_2(mthis, __arg_0, __arg_1) native "Element_webkitRequestFullscreen_Callback";
+  webkitRequestFullscreen_Callback_2_(mthis, __arg_0, __arg_1) => webkitRequestFullscreen_Callback_2(mthis, __arg_0, __arg_1);
+
 }
 
 class BlinkEntry {
+  static final instance = new BlinkEntry();
+
+  static copyTo_Callback_0(mthis) native "Entry_copyTo_Callback";
+  copyTo_Callback_0_(mthis) => copyTo_Callback_0(mthis);
+
+  static copyTo_Callback_1(mthis, __arg_0) native "Entry_copyTo_Callback";
+  copyTo_Callback_1_(mthis, __arg_0) => copyTo_Callback_1(mthis, __arg_0);
+
+  static copyTo_Callback_2(mthis, __arg_0, __arg_1) native "Entry_copyTo_Callback";
+  copyTo_Callback_2_(mthis, __arg_0, __arg_1) => copyTo_Callback_2(mthis, __arg_0, __arg_1);
+
+  static copyTo_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Entry_copyTo_Callback";
+  copyTo_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => copyTo_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static copyTo_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Entry_copyTo_Callback";
+  copyTo_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => copyTo_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static copyTo_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "Entry_copyTo_Callback";
+  copyTo_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => copyTo_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static copyTo_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "Entry_copyTo_Callback";
+  copyTo_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => copyTo_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
   static filesystem_Getter(mthis) native "Entry_filesystem_Getter";
+  filesystem_Getter_(mthis) => filesystem_Getter(mthis);
 
   static fullPath_Getter(mthis) native "Entry_fullPath_Getter";
+  fullPath_Getter_(mthis) => fullPath_Getter(mthis);
+
+  static getMetadata_Callback_0(mthis) native "Entry_getMetadata_Callback";
+  getMetadata_Callback_0_(mthis) => getMetadata_Callback_0(mthis);
+
+  static getMetadata_Callback_1(mthis, __arg_0) native "Entry_getMetadata_Callback";
+  getMetadata_Callback_1_(mthis, __arg_0) => getMetadata_Callback_1(mthis, __arg_0);
+
+  static getMetadata_Callback_2(mthis, __arg_0, __arg_1) native "Entry_getMetadata_Callback";
+  getMetadata_Callback_2_(mthis, __arg_0, __arg_1) => getMetadata_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getMetadata_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Entry_getMetadata_Callback";
+  getMetadata_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getMetadata_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static getMetadata_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Entry_getMetadata_Callback";
+  getMetadata_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => getMetadata_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static getParent_Callback_0(mthis) native "Entry_getParent_Callback";
+  getParent_Callback_0_(mthis) => getParent_Callback_0(mthis);
+
+  static getParent_Callback_1(mthis, __arg_0) native "Entry_getParent_Callback";
+  getParent_Callback_1_(mthis, __arg_0) => getParent_Callback_1(mthis, __arg_0);
+
+  static getParent_Callback_2(mthis, __arg_0, __arg_1) native "Entry_getParent_Callback";
+  getParent_Callback_2_(mthis, __arg_0, __arg_1) => getParent_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getParent_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Entry_getParent_Callback";
+  getParent_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getParent_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static getParent_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Entry_getParent_Callback";
+  getParent_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => getParent_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
 
   static isDirectory_Getter(mthis) native "Entry_isDirectory_Getter";
+  isDirectory_Getter_(mthis) => isDirectory_Getter(mthis);
 
   static isFile_Getter(mthis) native "Entry_isFile_Getter";
+  isFile_Getter_(mthis) => isFile_Getter(mthis);
+
+  static moveTo_Callback_0(mthis) native "Entry_moveTo_Callback";
+  moveTo_Callback_0_(mthis) => moveTo_Callback_0(mthis);
+
+  static moveTo_Callback_1(mthis, __arg_0) native "Entry_moveTo_Callback";
+  moveTo_Callback_1_(mthis, __arg_0) => moveTo_Callback_1(mthis, __arg_0);
+
+  static moveTo_Callback_2(mthis, __arg_0, __arg_1) native "Entry_moveTo_Callback";
+  moveTo_Callback_2_(mthis, __arg_0, __arg_1) => moveTo_Callback_2(mthis, __arg_0, __arg_1);
+
+  static moveTo_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Entry_moveTo_Callback";
+  moveTo_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => moveTo_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static moveTo_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Entry_moveTo_Callback";
+  moveTo_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => moveTo_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static moveTo_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "Entry_moveTo_Callback";
+  moveTo_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => moveTo_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static moveTo_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "Entry_moveTo_Callback";
+  moveTo_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => moveTo_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
 
   static name_Getter(mthis) native "Entry_name_Getter";
+  name_Getter_(mthis) => name_Getter(mthis);
 
-  static copyTo_Callback_4(mthis, parent, name, successCallback, errorCallback) native "Entry_copyTo_Callback";
+  static remove_Callback_0(mthis) native "Entry_remove_Callback";
+  remove_Callback_0_(mthis) => remove_Callback_0(mthis);
 
-  static copyTo_Callback_3(mthis, parent, name, successCallback) native "Entry_copyTo_Callback";
+  static remove_Callback_1(mthis, __arg_0) native "Entry_remove_Callback";
+  remove_Callback_1_(mthis, __arg_0) => remove_Callback_1(mthis, __arg_0);
 
-  static copyTo_Callback_2(mthis, parent, name) native "Entry_copyTo_Callback";
+  static remove_Callback_2(mthis, __arg_0, __arg_1) native "Entry_remove_Callback";
+  remove_Callback_2_(mthis, __arg_0, __arg_1) => remove_Callback_2(mthis, __arg_0, __arg_1);
 
-  static copyTo_Callback_1(mthis, parent) native "Entry_copyTo_Callback";
+  static remove_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Entry_remove_Callback";
+  remove_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => remove_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
-  static getMetadata_Callback_2(mthis, successCallback, errorCallback) native "Entry_getMetadata_Callback";
+  static remove_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Entry_remove_Callback";
+  remove_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => remove_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
 
-  static getMetadata_Callback_1(mthis, successCallback) native "Entry_getMetadata_Callback";
+  static toURL_Callback_0(mthis) native "Entry_toURL_Callback";
+  toURL_Callback_0_(mthis) => toURL_Callback_0(mthis);
 
-  static getParent_Callback_2(mthis, successCallback, errorCallback) native "Entry_getParent_Callback";
+  static toURL_Callback_1(mthis, __arg_0) native "Entry_toURL_Callback";
+  toURL_Callback_1_(mthis, __arg_0) => toURL_Callback_1(mthis, __arg_0);
 
-  static getParent_Callback_1(mthis, successCallback) native "Entry_getParent_Callback";
+  static toURL_Callback_2(mthis, __arg_0, __arg_1) native "Entry_toURL_Callback";
+  toURL_Callback_2_(mthis, __arg_0, __arg_1) => toURL_Callback_2(mthis, __arg_0, __arg_1);
 
-  static getParent_Callback(mthis) native "Entry_getParent_Callback";
-
-  static moveTo_Callback_4(mthis, parent, name, successCallback, errorCallback) native "Entry_moveTo_Callback";
-
-  static moveTo_Callback_3(mthis, parent, name, successCallback) native "Entry_moveTo_Callback";
-
-  static moveTo_Callback_2(mthis, parent, name) native "Entry_moveTo_Callback";
-
-  static moveTo_Callback_1(mthis, parent) native "Entry_moveTo_Callback";
-
-  static remove_Callback_2(mthis, successCallback, errorCallback) native "Entry_remove_Callback";
-
-  static remove_Callback_1(mthis, successCallback) native "Entry_remove_Callback";
-
-  static toURL_Callback(mthis) native "Entry_toURL_Callback";
 }
 
-class BlinkDirectoryEntry {
-  static createReader_Callback(mthis) native "DirectoryEntry_createReader_Callback";
+class BlinkEntrySync {
+  static final instance = new BlinkEntrySync();
 
-  static getDirectory_Callback_4(mthis, path, options, successCallback, errorCallback) native "DirectoryEntry_getDirectory_Callback";
+  static copyTo_Callback_0(mthis) native "EntrySync_copyTo_Callback";
+  copyTo_Callback_0_(mthis) => copyTo_Callback_0(mthis);
 
-  static getDirectory_Callback_3(mthis, path, options, successCallback) native "DirectoryEntry_getDirectory_Callback";
+  static copyTo_Callback_1(mthis, __arg_0) native "EntrySync_copyTo_Callback";
+  copyTo_Callback_1_(mthis, __arg_0) => copyTo_Callback_1(mthis, __arg_0);
 
-  static getDirectory_Callback_2(mthis, path, options) native "DirectoryEntry_getDirectory_Callback";
+  static copyTo_Callback_2(mthis, __arg_0, __arg_1) native "EntrySync_copyTo_Callback";
+  copyTo_Callback_2_(mthis, __arg_0, __arg_1) => copyTo_Callback_2(mthis, __arg_0, __arg_1);
 
-  static getDirectory_Callback_1(mthis, path) native "DirectoryEntry_getDirectory_Callback";
+  static copyTo_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "EntrySync_copyTo_Callback";
+  copyTo_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => copyTo_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
-  static getFile_Callback_4(mthis, path, options, successCallback, errorCallback) native "DirectoryEntry_getFile_Callback";
+  static copyTo_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "EntrySync_copyTo_Callback";
+  copyTo_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => copyTo_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
 
-  static getFile_Callback_3(mthis, path, options, successCallback) native "DirectoryEntry_getFile_Callback";
+  static filesystem_Getter(mthis) native "EntrySync_filesystem_Getter";
+  filesystem_Getter_(mthis) => filesystem_Getter(mthis);
 
-  static getFile_Callback_2(mthis, path, options) native "DirectoryEntry_getFile_Callback";
+  static fullPath_Getter(mthis) native "EntrySync_fullPath_Getter";
+  fullPath_Getter_(mthis) => fullPath_Getter(mthis);
 
-  static getFile_Callback_1(mthis, path) native "DirectoryEntry_getFile_Callback";
+  static getMetadata_Callback_0(mthis) native "EntrySync_getMetadata_Callback";
+  getMetadata_Callback_0_(mthis) => getMetadata_Callback_0(mthis);
 
-  static removeRecursively_Callback_2(mthis, successCallback, errorCallback) native "DirectoryEntry_removeRecursively_Callback";
+  static getMetadata_Callback_1(mthis, __arg_0) native "EntrySync_getMetadata_Callback";
+  getMetadata_Callback_1_(mthis, __arg_0) => getMetadata_Callback_1(mthis, __arg_0);
 
-  static removeRecursively_Callback_1(mthis, successCallback) native "DirectoryEntry_removeRecursively_Callback";
+  static getMetadata_Callback_2(mthis, __arg_0, __arg_1) native "EntrySync_getMetadata_Callback";
+  getMetadata_Callback_2_(mthis, __arg_0, __arg_1) => getMetadata_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getParent_Callback_0(mthis) native "EntrySync_getParent_Callback";
+  getParent_Callback_0_(mthis) => getParent_Callback_0(mthis);
+
+  static getParent_Callback_1(mthis, __arg_0) native "EntrySync_getParent_Callback";
+  getParent_Callback_1_(mthis, __arg_0) => getParent_Callback_1(mthis, __arg_0);
+
+  static getParent_Callback_2(mthis, __arg_0, __arg_1) native "EntrySync_getParent_Callback";
+  getParent_Callback_2_(mthis, __arg_0, __arg_1) => getParent_Callback_2(mthis, __arg_0, __arg_1);
+
+  static isDirectory_Getter(mthis) native "EntrySync_isDirectory_Getter";
+  isDirectory_Getter_(mthis) => isDirectory_Getter(mthis);
+
+  static isFile_Getter(mthis) native "EntrySync_isFile_Getter";
+  isFile_Getter_(mthis) => isFile_Getter(mthis);
+
+  static moveTo_Callback_0(mthis) native "EntrySync_moveTo_Callback";
+  moveTo_Callback_0_(mthis) => moveTo_Callback_0(mthis);
+
+  static moveTo_Callback_1(mthis, __arg_0) native "EntrySync_moveTo_Callback";
+  moveTo_Callback_1_(mthis, __arg_0) => moveTo_Callback_1(mthis, __arg_0);
+
+  static moveTo_Callback_2(mthis, __arg_0, __arg_1) native "EntrySync_moveTo_Callback";
+  moveTo_Callback_2_(mthis, __arg_0, __arg_1) => moveTo_Callback_2(mthis, __arg_0, __arg_1);
+
+  static moveTo_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "EntrySync_moveTo_Callback";
+  moveTo_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => moveTo_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static moveTo_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "EntrySync_moveTo_Callback";
+  moveTo_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => moveTo_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static name_Getter(mthis) native "EntrySync_name_Getter";
+  name_Getter_(mthis) => name_Getter(mthis);
+
+  static remove_Callback_0(mthis) native "EntrySync_remove_Callback";
+  remove_Callback_0_(mthis) => remove_Callback_0(mthis);
+
+  static remove_Callback_1(mthis, __arg_0) native "EntrySync_remove_Callback";
+  remove_Callback_1_(mthis, __arg_0) => remove_Callback_1(mthis, __arg_0);
+
+  static remove_Callback_2(mthis, __arg_0, __arg_1) native "EntrySync_remove_Callback";
+  remove_Callback_2_(mthis, __arg_0, __arg_1) => remove_Callback_2(mthis, __arg_0, __arg_1);
+
+  static toURL_Callback_0(mthis) native "EntrySync_toURL_Callback";
+  toURL_Callback_0_(mthis) => toURL_Callback_0(mthis);
+
+  static toURL_Callback_1(mthis, __arg_0) native "EntrySync_toURL_Callback";
+  toURL_Callback_1_(mthis, __arg_0) => toURL_Callback_1(mthis, __arg_0);
+
+  static toURL_Callback_2(mthis, __arg_0, __arg_1) native "EntrySync_toURL_Callback";
+  toURL_Callback_2_(mthis, __arg_0, __arg_1) => toURL_Callback_2(mthis, __arg_0, __arg_1);
+
 }
 
-class BlinkEntrySync {}
-
-class BlinkDirectoryEntrySync {}
-
-class BlinkDirectoryReader {
-  static readEntries_Callback_2(mthis, successCallback, errorCallback) native "DirectoryReader_readEntries_Callback";
-
-  static readEntries_Callback_1(mthis, successCallback) native "DirectoryReader_readEntries_Callback";
-}
-
-class BlinkDirectoryReaderSync {}
-
-class BlinkGlobalEventHandlers {}
-
-class BlinkParentNode {
-  static childElementCount_Getter(mthis) native "ParentNode_childElementCount_Getter";
-
-  static children_Getter(mthis) native "ParentNode_children_Getter";
-
-  static firstElementChild_Getter(mthis) native "ParentNode_firstElementChild_Getter";
-
-  static lastElementChild_Getter(mthis) native "ParentNode_lastElementChild_Getter";
-
-  static querySelector_Callback_1(mthis, selectors) native "ParentNode_querySelector_Callback";
-
-  static querySelectorAll_Callback_1(mthis, selectors) native "ParentNode_querySelectorAll_Callback";
-}
-
-class BlinkDocument {
-  static activeElement_Getter(mthis) native "Document_activeElement_Getter";
-
-  static body_Getter(mthis) native "Document_body_Getter";
-
-  static body_Setter(mthis, value) native "Document_body_Setter";
-
-  static contentType_Getter(mthis) native "Document_contentType_Getter";
-
-  static cookie_Getter(mthis) native "Document_cookie_Getter";
-
-  static cookie_Setter(mthis, value) native "Document_cookie_Setter";
-
-  static currentScript_Getter(mthis) native "Document_currentScript_Getter";
-
-  static defaultView_Getter(mthis) native "Document_defaultView_Getter";
-
-  static documentElement_Getter(mthis) native "Document_documentElement_Getter";
-
-  static domain_Getter(mthis) native "Document_domain_Getter";
-
-  static fonts_Getter(mthis) native "Document_fonts_Getter";
-
-  static fullscreenElement_Getter(mthis) native "Document_fullscreenElement_Getter";
-
-  static fullscreenEnabled_Getter(mthis) native "Document_fullscreenEnabled_Getter";
-
-  static head_Getter(mthis) native "Document_head_Getter";
-
-  static hidden_Getter(mthis) native "Document_hidden_Getter";
-
-  static implementation_Getter(mthis) native "Document_implementation_Getter";
-
-  static lastModified_Getter(mthis) native "Document_lastModified_Getter";
-
-  static pointerLockElement_Getter(mthis) native "Document_pointerLockElement_Getter";
-
-  static preferredStylesheetSet_Getter(mthis) native "Document_preferredStylesheetSet_Getter";
-
-  static readyState_Getter(mthis) native "Document_readyState_Getter";
-
-  static referrer_Getter(mthis) native "Document_referrer_Getter";
-
-  static rootElement_Getter(mthis) native "Document_rootElement_Getter";
-
-  static selectedStylesheetSet_Getter(mthis) native "Document_selectedStylesheetSet_Getter";
-
-  static selectedStylesheetSet_Setter(mthis, value) native "Document_selectedStylesheetSet_Setter";
-
-  static styleSheets_Getter(mthis) native "Document_styleSheets_Getter";
-
-  static timeline_Getter(mthis) native "Document_timeline_Getter";
-
-  static title_Getter(mthis) native "Document_title_Getter";
-
-  static title_Setter(mthis, value) native "Document_title_Setter";
-
-  static visibilityState_Getter(mthis) native "Document_visibilityState_Getter";
-
-  static webkitFullscreenElement_Getter(mthis) native "Document_webkitFullscreenElement_Getter";
-
-  static webkitFullscreenEnabled_Getter(mthis) native "Document_webkitFullscreenEnabled_Getter";
-
-  static webkitHidden_Getter(mthis) native "Document_webkitHidden_Getter";
-
-  static webkitVisibilityState_Getter(mthis) native "Document_webkitVisibilityState_Getter";
-
-  static adoptNode_Callback_1(mthis, node) native "Document_adoptNode_Callback";
-
-  static caretRangeFromPoint_Callback_2(mthis, x, y) native "Document_caretRangeFromPoint_Callback";
-
-  static createDocumentFragment_Callback(mthis) native "Document_createDocumentFragment_Callback";
-
-  static createElement_Callback_2(mthis, localName_OR_tagName, typeExtension) native "Document_createElement_Callback";
-
-  static createElementNS_Callback_3(mthis, namespaceURI, qualifiedName, typeExtension) native "Document_createElementNS_Callback";
-
-  static createEvent_Callback_1(mthis, eventType) native "Document_createEvent_Callback";
-
-  static createNodeIterator_Callback_3(mthis, root, whatToShow, filter) native "Document_createNodeIterator_Callback";
-
-  static createNodeIterator_Callback_1(mthis, root) native "Document_createNodeIterator_Callback";
-
-  static createRange_Callback(mthis) native "Document_createRange_Callback";
-
-  static createTextNode_Callback_1(mthis, data) native "Document_createTextNode_Callback";
-
-  static createTouch_Callback_11(mthis, window, target, identifier, pageX, pageY, screenX, screenY, webkitRadiusX, webkitRadiusY, webkitRotationAngle, webkitForce) native "Document_createTouch_Callback";
-
-  static createTouchList_Callback_1(mthis, touches) native "Document_createTouchList_Callback";
-
-  static createTreeWalker_Callback_3(mthis, root, whatToShow, filter) native "Document_createTreeWalker_Callback";
-
-  static createTreeWalker_Callback_1(mthis, root) native "Document_createTreeWalker_Callback";
-
-  static elementFromPoint_Callback_2(mthis, x, y) native "Document_elementFromPoint_Callback";
-
-  static execCommand_Callback_3(mthis, command, userInterface, value) native "Document_execCommand_Callback";
-
-  static exitFullscreen_Callback(mthis) native "Document_exitFullscreen_Callback";
-
-  static exitPointerLock_Callback(mthis) native "Document_exitPointerLock_Callback";
-
-  static getCSSCanvasContext_Callback_4(mthis, contextId, name, width, height) native "Document_getCSSCanvasContext_Callback";
-
-  static getElementById_Callback_1(mthis, elementId) native "Document_getElementById_Callback";
-
-  static getElementsByClassName_Callback_1(mthis, classNames) native "Document_getElementsByClassName_Callback";
-
-  static getElementsByName_Callback_1(mthis, elementName) native "Document_getElementsByName_Callback";
-
-  static getElementsByTagName_Callback_1(mthis, localName) native "Document_getElementsByTagName_Callback";
-
-  static importNode_Callback_2(mthis, node, deep) native "Document_importNode_Callback";
-
-  static importNode_Callback_1(mthis, node) native "Document_importNode_Callback";
-
-  static queryCommandEnabled_Callback_1(mthis, command) native "Document_queryCommandEnabled_Callback";
-
-  static queryCommandIndeterm_Callback_1(mthis, command) native "Document_queryCommandIndeterm_Callback";
-
-  static queryCommandState_Callback_1(mthis, command) native "Document_queryCommandState_Callback";
-
-  static queryCommandSupported_Callback_1(mthis, command) native "Document_queryCommandSupported_Callback";
-
-  static queryCommandValue_Callback_1(mthis, command) native "Document_queryCommandValue_Callback";
-
-  static webkitExitFullscreen_Callback(mthis) native "Document_webkitExitFullscreen_Callback";
-
-  static childElementCount_Getter(mthis) native "Document_childElementCount_Getter";
-
-  static children_Getter(mthis) native "Document_children_Getter";
-
-  static firstElementChild_Getter(mthis) native "Document_firstElementChild_Getter";
-
-  static lastElementChild_Getter(mthis) native "Document_lastElementChild_Getter";
-
-  static querySelector_Callback_1(mthis, selectors) native "Document_querySelector_Callback";
-
-  static querySelectorAll_Callback_1(mthis, selectors) native "Document_querySelectorAll_Callback";
-}
-
-class BlinkDocumentFragment {
-  static getElementById_Callback_1(mthis, elementId) native "DocumentFragment_getElementById_Callback";
-
-  static childElementCount_Getter(mthis) native "DocumentFragment_childElementCount_Getter";
-
-  static firstElementChild_Getter(mthis) native "DocumentFragment_firstElementChild_Getter";
-
-  static lastElementChild_Getter(mthis) native "DocumentFragment_lastElementChild_Getter";
-
-  static querySelector_Callback_1(mthis, selectors) native "DocumentFragment_querySelector_Callback";
-
-  static querySelectorAll_Callback_1(mthis, selectors) native "DocumentFragment_querySelectorAll_Callback";
-}
-
-class BlinkDocumentType {}
-
-class BlinkDynamicsCompressorNode {
-  static attack_Getter(mthis) native "DynamicsCompressorNode_attack_Getter";
-
-  static knee_Getter(mthis) native "DynamicsCompressorNode_knee_Getter";
-
-  static ratio_Getter(mthis) native "DynamicsCompressorNode_ratio_Getter";
-
-  static reduction_Getter(mthis) native "DynamicsCompressorNode_reduction_Getter";
-
-  static release_Getter(mthis) native "DynamicsCompressorNode_release_Getter";
-
-  static threshold_Getter(mthis) native "DynamicsCompressorNode_threshold_Getter";
-}
-
-class BlinkEXTBlendMinMax {}
-
-class BlinkEXTFragDepth {}
-
-class BlinkEXTShaderTextureLOD {}
-
-class BlinkEXTTextureFilterAnisotropic {}
-
-class BlinkElement {
-  static attributes_Getter(mthis) native "Element_attributes_Getter";
-
-  static className_Getter(mthis) native "Element_className_Getter";
-
-  static className_Setter(mthis, value) native "Element_className_Setter";
-
-  static clientHeight_Getter(mthis) native "Element_clientHeight_Getter";
-
-  static clientLeft_Getter(mthis) native "Element_clientLeft_Getter";
-
-  static clientTop_Getter(mthis) native "Element_clientTop_Getter";
-
-  static clientWidth_Getter(mthis) native "Element_clientWidth_Getter";
-
-  static id_Getter(mthis) native "Element_id_Getter";
-
-  static id_Setter(mthis, value) native "Element_id_Setter";
-
-  static innerHTML_Getter(mthis) native "Element_innerHTML_Getter";
-
-  static innerHTML_Setter(mthis, value) native "Element_innerHTML_Setter";
-
-  static localName_Getter(mthis) native "Element_localName_Getter";
-
-  static namespaceURI_Getter(mthis) native "Element_namespaceURI_Getter";
-
-  static offsetHeight_Getter(mthis) native "Element_offsetHeight_Getter";
-
-  static offsetLeft_Getter(mthis) native "Element_offsetLeft_Getter";
-
-  static offsetParent_Getter(mthis) native "Element_offsetParent_Getter";
-
-  static offsetTop_Getter(mthis) native "Element_offsetTop_Getter";
-
-  static offsetWidth_Getter(mthis) native "Element_offsetWidth_Getter";
-
-  static outerHTML_Getter(mthis) native "Element_outerHTML_Getter";
-
-  static scrollHeight_Getter(mthis) native "Element_scrollHeight_Getter";
-
-  static scrollLeft_Getter(mthis) native "Element_scrollLeft_Getter";
-
-  static scrollLeft_Setter(mthis, value) native "Element_scrollLeft_Setter";
-
-  static scrollTop_Getter(mthis) native "Element_scrollTop_Getter";
-
-  static scrollTop_Setter(mthis, value) native "Element_scrollTop_Setter";
-
-  static scrollWidth_Getter(mthis) native "Element_scrollWidth_Getter";
-
-  static shadowRoot_Getter(mthis) native "Element_shadowRoot_Getter";
-
-  static style_Getter(mthis) native "Element_style_Getter";
-
-  static tagName_Getter(mthis) native "Element_tagName_Getter";
-
-  static animate_Callback_2(mthis, effect, timing) native "Element_animate_Callback";
-
-  static blur_Callback(mthis) native "Element_blur_Callback";
-
-  static createShadowRoot_Callback(mthis) native "Element_createShadowRoot_Callback";
-
-  static focus_Callback(mthis) native "Element_focus_Callback";
-
-  static getAnimationPlayers_Callback(mthis) native "Element_getAnimationPlayers_Callback";
-
-  static getAttribute_Callback_1(mthis, name) native "Element_getAttribute_Callback";
-
-  static getAttributeNS_Callback_2(mthis, namespaceURI, localName) native "Element_getAttributeNS_Callback";
-
-  static getBoundingClientRect_Callback(mthis) native "Element_getBoundingClientRect_Callback";
-
-  static getClientRects_Callback(mthis) native "Element_getClientRects_Callback";
-
-  static getDestinationInsertionPoints_Callback(mthis) native "Element_getDestinationInsertionPoints_Callback";
-
-  static getElementsByClassName_Callback_1(mthis, classNames) native "Element_getElementsByClassName_Callback";
-
-  static getElementsByTagName_Callback_1(mthis, name) native "Element_getElementsByTagName_Callback";
-
-  static hasAttribute_Callback_1(mthis, name) native "Element_hasAttribute_Callback";
-
-  static hasAttributeNS_Callback_2(mthis, namespaceURI, localName) native "Element_hasAttributeNS_Callback";
-
-  static insertAdjacentElement_Callback_2(mthis, where, element) native "Element_insertAdjacentElement_Callback";
-
-  static insertAdjacentHTML_Callback_2(mthis, where, html) native "Element_insertAdjacentHTML_Callback";
-
-  static insertAdjacentText_Callback_2(mthis, where, text) native "Element_insertAdjacentText_Callback";
-
-  static matches_Callback_1(mthis, selectors) native "Element_matches_Callback";
-
-  static removeAttribute_Callback_1(mthis, name) native "Element_removeAttribute_Callback";
-
-  static removeAttributeNS_Callback_2(mthis, namespaceURI, localName) native "Element_removeAttributeNS_Callback";
-
-  static requestFullscreen_Callback(mthis) native "Element_requestFullscreen_Callback";
-
-  static requestPointerLock_Callback(mthis) native "Element_requestPointerLock_Callback";
-
-  static scrollIntoView_Callback_1(mthis, alignWithTop) native "Element_scrollIntoView_Callback";
-
-  static scrollIntoView_Callback(mthis) native "Element_scrollIntoView_Callback";
-
-  static scrollIntoViewIfNeeded_Callback_1(mthis, centerIfNeeded) native "Element_scrollIntoViewIfNeeded_Callback";
-
-  static scrollIntoViewIfNeeded_Callback(mthis) native "Element_scrollIntoViewIfNeeded_Callback";
-
-  static setAttribute_Callback_2(mthis, name, value) native "Element_setAttribute_Callback";
-
-  static setAttributeNS_Callback_3(mthis, namespaceURI, qualifiedName, value) native "Element_setAttributeNS_Callback";
-
-  static nextElementSibling_Getter(mthis) native "Element_nextElementSibling_Getter";
-
-  static previousElementSibling_Getter(mthis) native "Element_previousElementSibling_Getter";
-
-  static remove_Callback(mthis) native "Element_remove_Callback";
-
-  static childElementCount_Getter(mthis) native "Element_childElementCount_Getter";
-
-  static children_Getter(mthis) native "Element_children_Getter";
-
-  static firstElementChild_Getter(mthis) native "Element_firstElementChild_Getter";
-
-  static lastElementChild_Getter(mthis) native "Element_lastElementChild_Getter";
-
-  static querySelector_Callback_1(mthis, selectors) native "Element_querySelector_Callback";
-
-  static querySelectorAll_Callback_1(mthis, selectors) native "Element_querySelectorAll_Callback";
-}
-
-class BlinkErrorEvent {
-  static constructorCallback(type, options) native "ErrorEvent_constructorCallback";
+class BlinkErrorEvent extends BlinkEvent {
+  static final instance = new BlinkErrorEvent();
 
   static colno_Getter(mthis) native "ErrorEvent_colno_Getter";
+  colno_Getter_(mthis) => colno_Getter(mthis);
+
+  static constructorCallback_2(__arg_0, __arg_1) native "ErrorEvent_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
 
   static error_Getter(mthis) native "ErrorEvent_error_Getter";
+  error_Getter_(mthis) => error_Getter(mthis);
 
   static filename_Getter(mthis) native "ErrorEvent_filename_Getter";
+  filename_Getter_(mthis) => filename_Getter(mthis);
 
   static lineno_Getter(mthis) native "ErrorEvent_lineno_Getter";
+  lineno_Getter_(mthis) => lineno_Getter(mthis);
 
   static message_Getter(mthis) native "ErrorEvent_message_Getter";
+  message_Getter_(mthis) => message_Getter(mthis);
+
 }
 
-class BlinkEventSource {
-  static constructorCallback_2(url, eventSourceInit) native "EventSource_constructorCallback";
+class BlinkEvent {
+  static final instance = new BlinkEvent();
 
-  static constructorCallback_1(url) native "EventSource_constructorCallback";
+  static bubbles_Getter(mthis) native "Event_bubbles_Getter";
+  bubbles_Getter_(mthis) => bubbles_Getter(mthis);
+
+  static cancelBubble_Getter(mthis) native "Event_cancelBubble_Getter";
+  cancelBubble_Getter_(mthis) => cancelBubble_Getter(mthis);
+
+  static cancelBubble_Setter(mthis, __arg_0) native "Event_cancelBubble_Setter";
+  cancelBubble_Setter_(mthis, __arg_0) => cancelBubble_Setter(mthis, __arg_0);
+
+  static cancelable_Getter(mthis) native "Event_cancelable_Getter";
+  cancelable_Getter_(mthis) => cancelable_Getter(mthis);
+
+  static clipboardData_Getter(mthis) native "Event_clipboardData_Getter";
+  clipboardData_Getter_(mthis) => clipboardData_Getter(mthis);
+
+  static constructorCallback_2(__arg_0, __arg_1) native "Event_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+
+  static currentTarget_Getter(mthis) native "Event_currentTarget_Getter";
+  currentTarget_Getter_(mthis) => currentTarget_Getter(mthis);
+
+  static defaultPrevented_Getter(mthis) native "Event_defaultPrevented_Getter";
+  defaultPrevented_Getter_(mthis) => defaultPrevented_Getter(mthis);
+
+  static eventPhase_Getter(mthis) native "Event_eventPhase_Getter";
+  eventPhase_Getter_(mthis) => eventPhase_Getter(mthis);
+
+  static initEvent_Callback_0(mthis) native "Event_initEvent_Callback";
+  initEvent_Callback_0_(mthis) => initEvent_Callback_0(mthis);
+
+  static initEvent_Callback_1(mthis, __arg_0) native "Event_initEvent_Callback";
+  initEvent_Callback_1_(mthis, __arg_0) => initEvent_Callback_1(mthis, __arg_0);
+
+  static initEvent_Callback_2(mthis, __arg_0, __arg_1) native "Event_initEvent_Callback";
+  initEvent_Callback_2_(mthis, __arg_0, __arg_1) => initEvent_Callback_2(mthis, __arg_0, __arg_1);
+
+  static initEvent_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Event_initEvent_Callback";
+  initEvent_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => initEvent_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static initEvent_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Event_initEvent_Callback";
+  initEvent_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => initEvent_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static initEvent_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "Event_initEvent_Callback";
+  initEvent_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => initEvent_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static path_Getter(mthis) native "Event_path_Getter";
+  path_Getter_(mthis) => path_Getter(mthis);
+
+  static preventDefault_Callback_0(mthis) native "Event_preventDefault_Callback";
+  preventDefault_Callback_0_(mthis) => preventDefault_Callback_0(mthis);
+
+  static preventDefault_Callback_1(mthis, __arg_0) native "Event_preventDefault_Callback";
+  preventDefault_Callback_1_(mthis, __arg_0) => preventDefault_Callback_1(mthis, __arg_0);
+
+  static preventDefault_Callback_2(mthis, __arg_0, __arg_1) native "Event_preventDefault_Callback";
+  preventDefault_Callback_2_(mthis, __arg_0, __arg_1) => preventDefault_Callback_2(mthis, __arg_0, __arg_1);
+
+  static returnValue_Getter(mthis) native "Event_returnValue_Getter";
+  returnValue_Getter_(mthis) => returnValue_Getter(mthis);
+
+  static returnValue_Setter(mthis, __arg_0) native "Event_returnValue_Setter";
+  returnValue_Setter_(mthis, __arg_0) => returnValue_Setter(mthis, __arg_0);
+
+  static stopImmediatePropagation_Callback_0(mthis) native "Event_stopImmediatePropagation_Callback";
+  stopImmediatePropagation_Callback_0_(mthis) => stopImmediatePropagation_Callback_0(mthis);
+
+  static stopImmediatePropagation_Callback_1(mthis, __arg_0) native "Event_stopImmediatePropagation_Callback";
+  stopImmediatePropagation_Callback_1_(mthis, __arg_0) => stopImmediatePropagation_Callback_1(mthis, __arg_0);
+
+  static stopImmediatePropagation_Callback_2(mthis, __arg_0, __arg_1) native "Event_stopImmediatePropagation_Callback";
+  stopImmediatePropagation_Callback_2_(mthis, __arg_0, __arg_1) => stopImmediatePropagation_Callback_2(mthis, __arg_0, __arg_1);
+
+  static stopPropagation_Callback_0(mthis) native "Event_stopPropagation_Callback";
+  stopPropagation_Callback_0_(mthis) => stopPropagation_Callback_0(mthis);
+
+  static stopPropagation_Callback_1(mthis, __arg_0) native "Event_stopPropagation_Callback";
+  stopPropagation_Callback_1_(mthis, __arg_0) => stopPropagation_Callback_1(mthis, __arg_0);
+
+  static stopPropagation_Callback_2(mthis, __arg_0, __arg_1) native "Event_stopPropagation_Callback";
+  stopPropagation_Callback_2_(mthis, __arg_0, __arg_1) => stopPropagation_Callback_2(mthis, __arg_0, __arg_1);
+
+  static target_Getter(mthis) native "Event_target_Getter";
+  target_Getter_(mthis) => target_Getter(mthis);
+
+  static timeStamp_Getter(mthis) native "Event_timeStamp_Getter";
+  timeStamp_Getter_(mthis) => timeStamp_Getter(mthis);
+
+  static type_Getter(mthis) native "Event_type_Getter";
+  type_Getter_(mthis) => type_Getter(mthis);
+
+}
+
+class BlinkEventSource extends BlinkEventTarget {
+  static final instance = new BlinkEventSource();
+
+  static close_Callback_0(mthis) native "EventSource_close_Callback";
+  close_Callback_0_(mthis) => close_Callback_0(mthis);
+
+  static close_Callback_1(mthis, __arg_0) native "EventSource_close_Callback";
+  close_Callback_1_(mthis, __arg_0) => close_Callback_1(mthis, __arg_0);
+
+  static close_Callback_2(mthis, __arg_0, __arg_1) native "EventSource_close_Callback";
+  close_Callback_2_(mthis, __arg_0, __arg_1) => close_Callback_2(mthis, __arg_0, __arg_1);
+
+  static constructorCallback_0() native "EventSource_constructorCallback";
+  constructorCallback_0_() => constructorCallback_0();
+
+  static constructorCallback_1(__arg_0) native "EventSource_constructorCallback";
+  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+
+  static constructorCallback_2(__arg_0, __arg_1) native "EventSource_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+
+  static constructorCallback_3(__arg_0, __arg_1, __arg_2) native "EventSource_constructorCallback";
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => constructorCallback_3(__arg_0, __arg_1, __arg_2);
+
+  static constructorCallback_4(__arg_0, __arg_1, __arg_2, __arg_3) native "EventSource_constructorCallback";
+  constructorCallback_4_(__arg_0, __arg_1, __arg_2, __arg_3) => constructorCallback_4(__arg_0, __arg_1, __arg_2, __arg_3);
+
+  static onerror_Getter(mthis) native "EventSource_onerror_Getter";
+  onerror_Getter_(mthis) => onerror_Getter(mthis);
+
+  static onerror_Setter(mthis, __arg_0) native "EventSource_onerror_Setter";
+  onerror_Setter_(mthis, __arg_0) => onerror_Setter(mthis, __arg_0);
+
+  static onmessage_Getter(mthis) native "EventSource_onmessage_Getter";
+  onmessage_Getter_(mthis) => onmessage_Getter(mthis);
+
+  static onmessage_Setter(mthis, __arg_0) native "EventSource_onmessage_Setter";
+  onmessage_Setter_(mthis, __arg_0) => onmessage_Setter(mthis, __arg_0);
+
+  static onopen_Getter(mthis) native "EventSource_onopen_Getter";
+  onopen_Getter_(mthis) => onopen_Getter(mthis);
+
+  static onopen_Setter(mthis, __arg_0) native "EventSource_onopen_Setter";
+  onopen_Setter_(mthis, __arg_0) => onopen_Setter(mthis, __arg_0);
 
   static readyState_Getter(mthis) native "EventSource_readyState_Getter";
+  readyState_Getter_(mthis) => readyState_Getter(mthis);
 
   static url_Getter(mthis) native "EventSource_url_Getter";
+  url_Getter_(mthis) => url_Getter(mthis);
 
   static withCredentials_Getter(mthis) native "EventSource_withCredentials_Getter";
+  withCredentials_Getter_(mthis) => withCredentials_Getter(mthis);
 
-  static close_Callback(mthis) native "EventSource_close_Callback";
 }
 
-class BlinkFederatedCredential {
-  static constructorCallback_4(id, name, avatarURL, federation) native "FederatedCredential_constructorCallback";
+class BlinkEventTarget {
+  static final instance = new BlinkEventTarget();
+
+  static addEventListener_Callback_0(mthis) native "EventTarget_addEventListener_Callback";
+  addEventListener_Callback_0_(mthis) => addEventListener_Callback_0(mthis);
+
+  static addEventListener_Callback_1(mthis, __arg_0) native "EventTarget_addEventListener_Callback";
+  addEventListener_Callback_1_(mthis, __arg_0) => addEventListener_Callback_1(mthis, __arg_0);
+
+  static addEventListener_Callback_2(mthis, __arg_0, __arg_1) native "EventTarget_addEventListener_Callback";
+  addEventListener_Callback_2_(mthis, __arg_0, __arg_1) => addEventListener_Callback_2(mthis, __arg_0, __arg_1);
+
+  static addEventListener_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "EventTarget_addEventListener_Callback";
+  addEventListener_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => addEventListener_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static addEventListener_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "EventTarget_addEventListener_Callback";
+  addEventListener_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => addEventListener_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static addEventListener_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "EventTarget_addEventListener_Callback";
+  addEventListener_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => addEventListener_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static dispatchEvent_Callback_0(mthis) native "EventTarget_dispatchEvent_Callback";
+  dispatchEvent_Callback_0_(mthis) => dispatchEvent_Callback_0(mthis);
+
+  static dispatchEvent_Callback_1(mthis, __arg_0) native "EventTarget_dispatchEvent_Callback";
+  dispatchEvent_Callback_1_(mthis, __arg_0) => dispatchEvent_Callback_1(mthis, __arg_0);
+
+  static dispatchEvent_Callback_2(mthis, __arg_0, __arg_1) native "EventTarget_dispatchEvent_Callback";
+  dispatchEvent_Callback_2_(mthis, __arg_0, __arg_1) => dispatchEvent_Callback_2(mthis, __arg_0, __arg_1);
+
+  static dispatchEvent_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "EventTarget_dispatchEvent_Callback";
+  dispatchEvent_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => dispatchEvent_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static removeEventListener_Callback_0(mthis) native "EventTarget_removeEventListener_Callback";
+  removeEventListener_Callback_0_(mthis) => removeEventListener_Callback_0(mthis);
+
+  static removeEventListener_Callback_1(mthis, __arg_0) native "EventTarget_removeEventListener_Callback";
+  removeEventListener_Callback_1_(mthis, __arg_0) => removeEventListener_Callback_1(mthis, __arg_0);
+
+  static removeEventListener_Callback_2(mthis, __arg_0, __arg_1) native "EventTarget_removeEventListener_Callback";
+  removeEventListener_Callback_2_(mthis, __arg_0, __arg_1) => removeEventListener_Callback_2(mthis, __arg_0, __arg_1);
+
+  static removeEventListener_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "EventTarget_removeEventListener_Callback";
+  removeEventListener_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => removeEventListener_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static removeEventListener_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "EventTarget_removeEventListener_Callback";
+  removeEventListener_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => removeEventListener_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static removeEventListener_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "EventTarget_removeEventListener_Callback";
+  removeEventListener_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => removeEventListener_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+}
+
+class BlinkFederatedCredential extends BlinkCredential {
+  static final instance = new BlinkFederatedCredential();
+
+  static constructorCallback_2(__arg_0, __arg_1) native "FederatedCredential_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+
+  static constructorCallback_3(__arg_0, __arg_1, __arg_2) native "FederatedCredential_constructorCallback";
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => constructorCallback_3(__arg_0, __arg_1, __arg_2);
+
+  static constructorCallback_4(__arg_0, __arg_1, __arg_2, __arg_3) native "FederatedCredential_constructorCallback";
+  constructorCallback_4_(__arg_0, __arg_1, __arg_2, __arg_3) => constructorCallback_4(__arg_0, __arg_1, __arg_2, __arg_3);
+
+  static constructorCallback_5(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "FederatedCredential_constructorCallback";
+  constructorCallback_5_(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => constructorCallback_5(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static constructorCallback_6(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "FederatedCredential_constructorCallback";
+  constructorCallback_6_(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => constructorCallback_6(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
 
   static federation_Getter(mthis) native "FederatedCredential_federation_Getter";
+  federation_Getter_(mthis) => federation_Getter(mthis);
+
 }
 
 class BlinkFetchBodyStream {
-  static asArrayBuffer_Callback(mthis) native "FetchBodyStream_asArrayBuffer_Callback";
+  static final instance = new BlinkFetchBodyStream();
 
-  static asBlob_Callback(mthis) native "FetchBodyStream_asBlob_Callback";
+  static asArrayBuffer_Callback_0(mthis) native "FetchBodyStream_asArrayBuffer_Callback";
+  asArrayBuffer_Callback_0_(mthis) => asArrayBuffer_Callback_0(mthis);
 
-  static asJSON_Callback(mthis) native "FetchBodyStream_asJSON_Callback";
+  static asArrayBuffer_Callback_1(mthis, __arg_0) native "FetchBodyStream_asArrayBuffer_Callback";
+  asArrayBuffer_Callback_1_(mthis, __arg_0) => asArrayBuffer_Callback_1(mthis, __arg_0);
 
-  static asText_Callback(mthis) native "FetchBodyStream_asText_Callback";
+  static asArrayBuffer_Callback_2(mthis, __arg_0, __arg_1) native "FetchBodyStream_asArrayBuffer_Callback";
+  asArrayBuffer_Callback_2_(mthis, __arg_0, __arg_1) => asArrayBuffer_Callback_2(mthis, __arg_0, __arg_1);
+
+  static asBlob_Callback_0(mthis) native "FetchBodyStream_asBlob_Callback";
+  asBlob_Callback_0_(mthis) => asBlob_Callback_0(mthis);
+
+  static asBlob_Callback_1(mthis, __arg_0) native "FetchBodyStream_asBlob_Callback";
+  asBlob_Callback_1_(mthis, __arg_0) => asBlob_Callback_1(mthis, __arg_0);
+
+  static asBlob_Callback_2(mthis, __arg_0, __arg_1) native "FetchBodyStream_asBlob_Callback";
+  asBlob_Callback_2_(mthis, __arg_0, __arg_1) => asBlob_Callback_2(mthis, __arg_0, __arg_1);
+
+  static asJSON_Callback_0(mthis) native "FetchBodyStream_asJSON_Callback";
+  asJSON_Callback_0_(mthis) => asJSON_Callback_0(mthis);
+
+  static asJSON_Callback_1(mthis, __arg_0) native "FetchBodyStream_asJSON_Callback";
+  asJSON_Callback_1_(mthis, __arg_0) => asJSON_Callback_1(mthis, __arg_0);
+
+  static asJSON_Callback_2(mthis, __arg_0, __arg_1) native "FetchBodyStream_asJSON_Callback";
+  asJSON_Callback_2_(mthis, __arg_0, __arg_1) => asJSON_Callback_2(mthis, __arg_0, __arg_1);
+
+  static asText_Callback_0(mthis) native "FetchBodyStream_asText_Callback";
+  asText_Callback_0_(mthis) => asText_Callback_0(mthis);
+
+  static asText_Callback_1(mthis, __arg_0) native "FetchBodyStream_asText_Callback";
+  asText_Callback_1_(mthis, __arg_0) => asText_Callback_1(mthis, __arg_0);
+
+  static asText_Callback_2(mthis, __arg_0, __arg_1) native "FetchBodyStream_asText_Callback";
+  asText_Callback_2_(mthis, __arg_0, __arg_1) => asText_Callback_2(mthis, __arg_0, __arg_1);
+
 }
 
-class BlinkFetchEvent {
+class BlinkFetchEvent extends BlinkEvent {
+  static final instance = new BlinkFetchEvent();
+
   static isReload_Getter(mthis) native "FetchEvent_isReload_Getter";
+  isReload_Getter_(mthis) => isReload_Getter(mthis);
 
   static request_Getter(mthis) native "FetchEvent_request_Getter";
+  request_Getter_(mthis) => request_Getter(mthis);
 
-  static respondWith_Callback_1(mthis, value) native "FetchEvent_respondWith_Callback";
+  static respondWith_Callback_0(mthis) native "FetchEvent_respondWith_Callback";
+  respondWith_Callback_0_(mthis) => respondWith_Callback_0(mthis);
+
+  static respondWith_Callback_1(mthis, __arg_0) native "FetchEvent_respondWith_Callback";
+  respondWith_Callback_1_(mthis, __arg_0) => respondWith_Callback_1(mthis, __arg_0);
+
+  static respondWith_Callback_2(mthis, __arg_0, __arg_1) native "FetchEvent_respondWith_Callback";
+  respondWith_Callback_2_(mthis, __arg_0, __arg_1) => respondWith_Callback_2(mthis, __arg_0, __arg_1);
+
+  static respondWith_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "FetchEvent_respondWith_Callback";
+  respondWith_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => respondWith_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
 }
 
-class BlinkFile {
-  static lastModified_Getter(mthis) native "File_lastModified_Getter";
+class BlinkFile extends BlinkBlob {
+  static final instance = new BlinkFile();
+
+  static constructorCallback_0() native "File_constructorCallback";
+  constructorCallback_0_() => constructorCallback_0();
+
+  static constructorCallback_1(__arg_0) native "File_constructorCallback";
+  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+
+  static constructorCallback_2(__arg_0, __arg_1) native "File_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+
+  static constructorCallback_3(__arg_0, __arg_1, __arg_2) native "File_constructorCallback";
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => constructorCallback_3(__arg_0, __arg_1, __arg_2);
+
+  static constructorCallback_4(__arg_0, __arg_1, __arg_2, __arg_3) native "File_constructorCallback";
+  constructorCallback_4_(__arg_0, __arg_1, __arg_2, __arg_3) => constructorCallback_4(__arg_0, __arg_1, __arg_2, __arg_3);
+
+  static constructorCallback_5(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "File_constructorCallback";
+  constructorCallback_5_(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => constructorCallback_5(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
 
   static lastModifiedDate_Getter(mthis) native "File_lastModifiedDate_Getter";
+  lastModifiedDate_Getter_(mthis) => lastModifiedDate_Getter(mthis);
+
+  static lastModified_Getter(mthis) native "File_lastModified_Getter";
+  lastModified_Getter_(mthis) => lastModified_Getter(mthis);
 
   static name_Getter(mthis) native "File_name_Getter";
+  name_Getter_(mthis) => name_Getter(mthis);
 
   static webkitRelativePath_Getter(mthis) native "File_webkitRelativePath_Getter";
+  webkitRelativePath_Getter_(mthis) => webkitRelativePath_Getter(mthis);
+
 }
 
-class BlinkFileEntry {
-  static createWriter_Callback_2(mthis, successCallback, errorCallback) native "FileEntry_createWriter_Callback";
+class BlinkFileEntry extends BlinkEntry {
+  static final instance = new BlinkFileEntry();
 
-  static createWriter_Callback_1(mthis, successCallback) native "FileEntry_createWriter_Callback";
+  static createWriter_Callback_0(mthis) native "FileEntry_createWriter_Callback";
+  createWriter_Callback_0_(mthis) => createWriter_Callback_0(mthis);
 
-  static file_Callback_2(mthis, successCallback, errorCallback) native "FileEntry_file_Callback";
+  static createWriter_Callback_1(mthis, __arg_0) native "FileEntry_createWriter_Callback";
+  createWriter_Callback_1_(mthis, __arg_0) => createWriter_Callback_1(mthis, __arg_0);
 
-  static file_Callback_1(mthis, successCallback) native "FileEntry_file_Callback";
+  static createWriter_Callback_2(mthis, __arg_0, __arg_1) native "FileEntry_createWriter_Callback";
+  createWriter_Callback_2_(mthis, __arg_0, __arg_1) => createWriter_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createWriter_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "FileEntry_createWriter_Callback";
+  createWriter_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => createWriter_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static createWriter_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "FileEntry_createWriter_Callback";
+  createWriter_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => createWriter_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static file_Callback_0(mthis) native "FileEntry_file_Callback";
+  file_Callback_0_(mthis) => file_Callback_0(mthis);
+
+  static file_Callback_1(mthis, __arg_0) native "FileEntry_file_Callback";
+  file_Callback_1_(mthis, __arg_0) => file_Callback_1(mthis, __arg_0);
+
+  static file_Callback_2(mthis, __arg_0, __arg_1) native "FileEntry_file_Callback";
+  file_Callback_2_(mthis, __arg_0, __arg_1) => file_Callback_2(mthis, __arg_0, __arg_1);
+
+  static file_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "FileEntry_file_Callback";
+  file_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => file_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static file_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "FileEntry_file_Callback";
+  file_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => file_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
 }
 
-class BlinkFileEntrySync {}
+class BlinkFileEntrySync extends BlinkEntrySync {
+  static final instance = new BlinkFileEntrySync();
 
-class BlinkFileError {
+  static createWriter_Callback_0(mthis) native "FileEntrySync_createWriter_Callback";
+  createWriter_Callback_0_(mthis) => createWriter_Callback_0(mthis);
+
+  static createWriter_Callback_1(mthis, __arg_0) native "FileEntrySync_createWriter_Callback";
+  createWriter_Callback_1_(mthis, __arg_0) => createWriter_Callback_1(mthis, __arg_0);
+
+  static createWriter_Callback_2(mthis, __arg_0, __arg_1) native "FileEntrySync_createWriter_Callback";
+  createWriter_Callback_2_(mthis, __arg_0, __arg_1) => createWriter_Callback_2(mthis, __arg_0, __arg_1);
+
+  static file_Callback_0(mthis) native "FileEntrySync_file_Callback";
+  file_Callback_0_(mthis) => file_Callback_0(mthis);
+
+  static file_Callback_1(mthis, __arg_0) native "FileEntrySync_file_Callback";
+  file_Callback_1_(mthis, __arg_0) => file_Callback_1(mthis, __arg_0);
+
+  static file_Callback_2(mthis, __arg_0, __arg_1) native "FileEntrySync_file_Callback";
+  file_Callback_2_(mthis, __arg_0, __arg_1) => file_Callback_2(mthis, __arg_0, __arg_1);
+
+}
+
+class BlinkFileError extends BlinkDOMError {
+  static final instance = new BlinkFileError();
+
   static code_Getter(mthis) native "FileError_code_Getter";
+  code_Getter_(mthis) => code_Getter(mthis);
+
 }
 
 class BlinkFileList {
-  static length_Getter(mthis) native "FileList_length_Getter";
+  static final instance = new BlinkFileList();
 
-  static item_Callback_1(mthis, index) native "FileList_item_Callback";
+  static $__getter___Callback_1(mthis, __arg_0) native "FileList___getter___Callback";
+  $__getter___Callback_1_(mthis, __arg_0) => $__getter___Callback_1(mthis, __arg_0);
+
+  static item_Callback_0(mthis) native "FileList_item_Callback";
+  item_Callback_0_(mthis) => item_Callback_0(mthis);
+
+  static item_Callback_1(mthis, __arg_0) native "FileList_item_Callback";
+  item_Callback_1_(mthis, __arg_0) => item_Callback_1(mthis, __arg_0);
+
+  static item_Callback_2(mthis, __arg_0, __arg_1) native "FileList_item_Callback";
+  item_Callback_2_(mthis, __arg_0, __arg_1) => item_Callback_2(mthis, __arg_0, __arg_1);
+
+  static item_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "FileList_item_Callback";
+  item_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => item_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static length_Getter(mthis) native "FileList_length_Getter";
+  length_Getter_(mthis) => length_Getter(mthis);
+
 }
 
-class BlinkFileReader {
-  static constructorCallback() native "FileReader_constructorCallback";
+class BlinkFileReader extends BlinkEventTarget {
+  static final instance = new BlinkFileReader();
+
+  static abort_Callback_0(mthis) native "FileReader_abort_Callback";
+  abort_Callback_0_(mthis) => abort_Callback_0(mthis);
+
+  static abort_Callback_1(mthis, __arg_0) native "FileReader_abort_Callback";
+  abort_Callback_1_(mthis, __arg_0) => abort_Callback_1(mthis, __arg_0);
+
+  static abort_Callback_2(mthis, __arg_0, __arg_1) native "FileReader_abort_Callback";
+  abort_Callback_2_(mthis, __arg_0, __arg_1) => abort_Callback_2(mthis, __arg_0, __arg_1);
+
+  static constructorCallback_0() native "FileReader_constructorCallback";
+  constructorCallback_0_() => constructorCallback_0();
+
+  static constructorCallback_1(__arg_0) native "FileReader_constructorCallback";
+  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+
+  static constructorCallback_2(__arg_0, __arg_1) native "FileReader_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
 
   static error_Getter(mthis) native "FileReader_error_Getter";
+  error_Getter_(mthis) => error_Getter(mthis);
+
+  static onabort_Getter(mthis) native "FileReader_onabort_Getter";
+  onabort_Getter_(mthis) => onabort_Getter(mthis);
+
+  static onabort_Setter(mthis, __arg_0) native "FileReader_onabort_Setter";
+  onabort_Setter_(mthis, __arg_0) => onabort_Setter(mthis, __arg_0);
+
+  static onerror_Getter(mthis) native "FileReader_onerror_Getter";
+  onerror_Getter_(mthis) => onerror_Getter(mthis);
+
+  static onerror_Setter(mthis, __arg_0) native "FileReader_onerror_Setter";
+  onerror_Setter_(mthis, __arg_0) => onerror_Setter(mthis, __arg_0);
+
+  static onload_Getter(mthis) native "FileReader_onload_Getter";
+  onload_Getter_(mthis) => onload_Getter(mthis);
+
+  static onload_Setter(mthis, __arg_0) native "FileReader_onload_Setter";
+  onload_Setter_(mthis, __arg_0) => onload_Setter(mthis, __arg_0);
+
+  static onloadend_Getter(mthis) native "FileReader_onloadend_Getter";
+  onloadend_Getter_(mthis) => onloadend_Getter(mthis);
+
+  static onloadend_Setter(mthis, __arg_0) native "FileReader_onloadend_Setter";
+  onloadend_Setter_(mthis, __arg_0) => onloadend_Setter(mthis, __arg_0);
+
+  static onloadstart_Getter(mthis) native "FileReader_onloadstart_Getter";
+  onloadstart_Getter_(mthis) => onloadstart_Getter(mthis);
+
+  static onloadstart_Setter(mthis, __arg_0) native "FileReader_onloadstart_Setter";
+  onloadstart_Setter_(mthis, __arg_0) => onloadstart_Setter(mthis, __arg_0);
+
+  static onprogress_Getter(mthis) native "FileReader_onprogress_Getter";
+  onprogress_Getter_(mthis) => onprogress_Getter(mthis);
+
+  static onprogress_Setter(mthis, __arg_0) native "FileReader_onprogress_Setter";
+  onprogress_Setter_(mthis, __arg_0) => onprogress_Setter(mthis, __arg_0);
+
+  static readAsArrayBuffer_Callback_0(mthis) native "FileReader_readAsArrayBuffer_Callback";
+  readAsArrayBuffer_Callback_0_(mthis) => readAsArrayBuffer_Callback_0(mthis);
+
+  static readAsArrayBuffer_Callback_1(mthis, __arg_0) native "FileReader_readAsArrayBuffer_Callback";
+  readAsArrayBuffer_Callback_1_(mthis, __arg_0) => readAsArrayBuffer_Callback_1(mthis, __arg_0);
+
+  static readAsArrayBuffer_Callback_2(mthis, __arg_0, __arg_1) native "FileReader_readAsArrayBuffer_Callback";
+  readAsArrayBuffer_Callback_2_(mthis, __arg_0, __arg_1) => readAsArrayBuffer_Callback_2(mthis, __arg_0, __arg_1);
+
+  static readAsArrayBuffer_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "FileReader_readAsArrayBuffer_Callback";
+  readAsArrayBuffer_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => readAsArrayBuffer_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static readAsBinaryString_Callback_0(mthis) native "FileReader_readAsBinaryString_Callback";
+  readAsBinaryString_Callback_0_(mthis) => readAsBinaryString_Callback_0(mthis);
+
+  static readAsBinaryString_Callback_1(mthis, __arg_0) native "FileReader_readAsBinaryString_Callback";
+  readAsBinaryString_Callback_1_(mthis, __arg_0) => readAsBinaryString_Callback_1(mthis, __arg_0);
+
+  static readAsBinaryString_Callback_2(mthis, __arg_0, __arg_1) native "FileReader_readAsBinaryString_Callback";
+  readAsBinaryString_Callback_2_(mthis, __arg_0, __arg_1) => readAsBinaryString_Callback_2(mthis, __arg_0, __arg_1);
+
+  static readAsBinaryString_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "FileReader_readAsBinaryString_Callback";
+  readAsBinaryString_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => readAsBinaryString_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static readAsDataURL_Callback_0(mthis) native "FileReader_readAsDataURL_Callback";
+  readAsDataURL_Callback_0_(mthis) => readAsDataURL_Callback_0(mthis);
+
+  static readAsDataURL_Callback_1(mthis, __arg_0) native "FileReader_readAsDataURL_Callback";
+  readAsDataURL_Callback_1_(mthis, __arg_0) => readAsDataURL_Callback_1(mthis, __arg_0);
+
+  static readAsDataURL_Callback_2(mthis, __arg_0, __arg_1) native "FileReader_readAsDataURL_Callback";
+  readAsDataURL_Callback_2_(mthis, __arg_0, __arg_1) => readAsDataURL_Callback_2(mthis, __arg_0, __arg_1);
+
+  static readAsDataURL_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "FileReader_readAsDataURL_Callback";
+  readAsDataURL_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => readAsDataURL_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static readAsText_Callback_0(mthis) native "FileReader_readAsText_Callback";
+  readAsText_Callback_0_(mthis) => readAsText_Callback_0(mthis);
+
+  static readAsText_Callback_1(mthis, __arg_0) native "FileReader_readAsText_Callback";
+  readAsText_Callback_1_(mthis, __arg_0) => readAsText_Callback_1(mthis, __arg_0);
+
+  static readAsText_Callback_2(mthis, __arg_0, __arg_1) native "FileReader_readAsText_Callback";
+  readAsText_Callback_2_(mthis, __arg_0, __arg_1) => readAsText_Callback_2(mthis, __arg_0, __arg_1);
+
+  static readAsText_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "FileReader_readAsText_Callback";
+  readAsText_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => readAsText_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static readAsText_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "FileReader_readAsText_Callback";
+  readAsText_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => readAsText_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
 
   static readyState_Getter(mthis) native "FileReader_readyState_Getter";
+  readyState_Getter_(mthis) => readyState_Getter(mthis);
 
   static result_Getter(mthis) native "FileReader_result_Getter";
+  result_Getter_(mthis) => result_Getter(mthis);
 
-  static abort_Callback(mthis) native "FileReader_abort_Callback";
-
-  static readAsArrayBuffer_Callback_1(mthis, blob) native "FileReader_readAsArrayBuffer_Callback";
-
-  static readAsDataURL_Callback_1(mthis, blob) native "FileReader_readAsDataURL_Callback";
-
-  static readAsText_Callback_2(mthis, blob, encoding) native "FileReader_readAsText_Callback";
-
-  static readAsText_Callback_1(mthis, blob) native "FileReader_readAsText_Callback";
 }
 
 class BlinkFileReaderSync {
-  static constructorCallback() native "FileReaderSync_constructorCallback";
+  static final instance = new BlinkFileReaderSync();
+
+  static constructorCallback_0() native "FileReaderSync_constructorCallback";
+  constructorCallback_0_() => constructorCallback_0();
+
+  static constructorCallback_1(__arg_0) native "FileReaderSync_constructorCallback";
+  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+
+  static constructorCallback_2(__arg_0, __arg_1) native "FileReaderSync_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+
+  static readAsArrayBuffer_Callback_0(mthis) native "FileReaderSync_readAsArrayBuffer_Callback";
+  readAsArrayBuffer_Callback_0_(mthis) => readAsArrayBuffer_Callback_0(mthis);
+
+  static readAsArrayBuffer_Callback_1(mthis, __arg_0) native "FileReaderSync_readAsArrayBuffer_Callback";
+  readAsArrayBuffer_Callback_1_(mthis, __arg_0) => readAsArrayBuffer_Callback_1(mthis, __arg_0);
+
+  static readAsArrayBuffer_Callback_2(mthis, __arg_0, __arg_1) native "FileReaderSync_readAsArrayBuffer_Callback";
+  readAsArrayBuffer_Callback_2_(mthis, __arg_0, __arg_1) => readAsArrayBuffer_Callback_2(mthis, __arg_0, __arg_1);
+
+  static readAsArrayBuffer_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "FileReaderSync_readAsArrayBuffer_Callback";
+  readAsArrayBuffer_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => readAsArrayBuffer_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static readAsBinaryString_Callback_0(mthis) native "FileReaderSync_readAsBinaryString_Callback";
+  readAsBinaryString_Callback_0_(mthis) => readAsBinaryString_Callback_0(mthis);
+
+  static readAsBinaryString_Callback_1(mthis, __arg_0) native "FileReaderSync_readAsBinaryString_Callback";
+  readAsBinaryString_Callback_1_(mthis, __arg_0) => readAsBinaryString_Callback_1(mthis, __arg_0);
+
+  static readAsBinaryString_Callback_2(mthis, __arg_0, __arg_1) native "FileReaderSync_readAsBinaryString_Callback";
+  readAsBinaryString_Callback_2_(mthis, __arg_0, __arg_1) => readAsBinaryString_Callback_2(mthis, __arg_0, __arg_1);
+
+  static readAsBinaryString_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "FileReaderSync_readAsBinaryString_Callback";
+  readAsBinaryString_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => readAsBinaryString_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static readAsDataURL_Callback_0(mthis) native "FileReaderSync_readAsDataURL_Callback";
+  readAsDataURL_Callback_0_(mthis) => readAsDataURL_Callback_0(mthis);
+
+  static readAsDataURL_Callback_1(mthis, __arg_0) native "FileReaderSync_readAsDataURL_Callback";
+  readAsDataURL_Callback_1_(mthis, __arg_0) => readAsDataURL_Callback_1(mthis, __arg_0);
+
+  static readAsDataURL_Callback_2(mthis, __arg_0, __arg_1) native "FileReaderSync_readAsDataURL_Callback";
+  readAsDataURL_Callback_2_(mthis, __arg_0, __arg_1) => readAsDataURL_Callback_2(mthis, __arg_0, __arg_1);
+
+  static readAsDataURL_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "FileReaderSync_readAsDataURL_Callback";
+  readAsDataURL_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => readAsDataURL_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static readAsText_Callback_0(mthis) native "FileReaderSync_readAsText_Callback";
+  readAsText_Callback_0_(mthis) => readAsText_Callback_0(mthis);
+
+  static readAsText_Callback_1(mthis, __arg_0) native "FileReaderSync_readAsText_Callback";
+  readAsText_Callback_1_(mthis, __arg_0) => readAsText_Callback_1(mthis, __arg_0);
+
+  static readAsText_Callback_2(mthis, __arg_0, __arg_1) native "FileReaderSync_readAsText_Callback";
+  readAsText_Callback_2_(mthis, __arg_0, __arg_1) => readAsText_Callback_2(mthis, __arg_0, __arg_1);
+
+  static readAsText_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "FileReaderSync_readAsText_Callback";
+  readAsText_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => readAsText_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static readAsText_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "FileReaderSync_readAsText_Callback";
+  readAsText_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => readAsText_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
 }
 
-class BlinkFileWriter {
+class BlinkFileWriter extends BlinkEventTarget {
+  static final instance = new BlinkFileWriter();
+
+  static abort_Callback_0(mthis) native "FileWriter_abort_Callback";
+  abort_Callback_0_(mthis) => abort_Callback_0(mthis);
+
+  static abort_Callback_1(mthis, __arg_0) native "FileWriter_abort_Callback";
+  abort_Callback_1_(mthis, __arg_0) => abort_Callback_1(mthis, __arg_0);
+
+  static abort_Callback_2(mthis, __arg_0, __arg_1) native "FileWriter_abort_Callback";
+  abort_Callback_2_(mthis, __arg_0, __arg_1) => abort_Callback_2(mthis, __arg_0, __arg_1);
+
   static error_Getter(mthis) native "FileWriter_error_Getter";
+  error_Getter_(mthis) => error_Getter(mthis);
 
   static length_Getter(mthis) native "FileWriter_length_Getter";
+  length_Getter_(mthis) => length_Getter(mthis);
+
+  static onabort_Getter(mthis) native "FileWriter_onabort_Getter";
+  onabort_Getter_(mthis) => onabort_Getter(mthis);
+
+  static onabort_Setter(mthis, __arg_0) native "FileWriter_onabort_Setter";
+  onabort_Setter_(mthis, __arg_0) => onabort_Setter(mthis, __arg_0);
+
+  static onerror_Getter(mthis) native "FileWriter_onerror_Getter";
+  onerror_Getter_(mthis) => onerror_Getter(mthis);
+
+  static onerror_Setter(mthis, __arg_0) native "FileWriter_onerror_Setter";
+  onerror_Setter_(mthis, __arg_0) => onerror_Setter(mthis, __arg_0);
+
+  static onprogress_Getter(mthis) native "FileWriter_onprogress_Getter";
+  onprogress_Getter_(mthis) => onprogress_Getter(mthis);
+
+  static onprogress_Setter(mthis, __arg_0) native "FileWriter_onprogress_Setter";
+  onprogress_Setter_(mthis, __arg_0) => onprogress_Setter(mthis, __arg_0);
+
+  static onwrite_Getter(mthis) native "FileWriter_onwrite_Getter";
+  onwrite_Getter_(mthis) => onwrite_Getter(mthis);
+
+  static onwrite_Setter(mthis, __arg_0) native "FileWriter_onwrite_Setter";
+  onwrite_Setter_(mthis, __arg_0) => onwrite_Setter(mthis, __arg_0);
+
+  static onwriteend_Getter(mthis) native "FileWriter_onwriteend_Getter";
+  onwriteend_Getter_(mthis) => onwriteend_Getter(mthis);
+
+  static onwriteend_Setter(mthis, __arg_0) native "FileWriter_onwriteend_Setter";
+  onwriteend_Setter_(mthis, __arg_0) => onwriteend_Setter(mthis, __arg_0);
+
+  static onwritestart_Getter(mthis) native "FileWriter_onwritestart_Getter";
+  onwritestart_Getter_(mthis) => onwritestart_Getter(mthis);
+
+  static onwritestart_Setter(mthis, __arg_0) native "FileWriter_onwritestart_Setter";
+  onwritestart_Setter_(mthis, __arg_0) => onwritestart_Setter(mthis, __arg_0);
 
   static position_Getter(mthis) native "FileWriter_position_Getter";
+  position_Getter_(mthis) => position_Getter(mthis);
 
   static readyState_Getter(mthis) native "FileWriter_readyState_Getter";
+  readyState_Getter_(mthis) => readyState_Getter(mthis);
 
-  static abort_Callback(mthis) native "FileWriter_abort_Callback";
+  static seek_Callback_0(mthis) native "FileWriter_seek_Callback";
+  seek_Callback_0_(mthis) => seek_Callback_0(mthis);
 
-  static seek_Callback_1(mthis, position) native "FileWriter_seek_Callback";
+  static seek_Callback_1(mthis, __arg_0) native "FileWriter_seek_Callback";
+  seek_Callback_1_(mthis, __arg_0) => seek_Callback_1(mthis, __arg_0);
 
-  static truncate_Callback_1(mthis, size) native "FileWriter_truncate_Callback";
+  static seek_Callback_2(mthis, __arg_0, __arg_1) native "FileWriter_seek_Callback";
+  seek_Callback_2_(mthis, __arg_0, __arg_1) => seek_Callback_2(mthis, __arg_0, __arg_1);
 
-  static write_Callback_1(mthis, data) native "FileWriter_write_Callback";
+  static seek_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "FileWriter_seek_Callback";
+  seek_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => seek_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static truncate_Callback_0(mthis) native "FileWriter_truncate_Callback";
+  truncate_Callback_0_(mthis) => truncate_Callback_0(mthis);
+
+  static truncate_Callback_1(mthis, __arg_0) native "FileWriter_truncate_Callback";
+  truncate_Callback_1_(mthis, __arg_0) => truncate_Callback_1(mthis, __arg_0);
+
+  static truncate_Callback_2(mthis, __arg_0, __arg_1) native "FileWriter_truncate_Callback";
+  truncate_Callback_2_(mthis, __arg_0, __arg_1) => truncate_Callback_2(mthis, __arg_0, __arg_1);
+
+  static truncate_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "FileWriter_truncate_Callback";
+  truncate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => truncate_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static write_Callback_0(mthis) native "FileWriter_write_Callback";
+  write_Callback_0_(mthis) => write_Callback_0(mthis);
+
+  static write_Callback_1(mthis, __arg_0) native "FileWriter_write_Callback";
+  write_Callback_1_(mthis, __arg_0) => write_Callback_1(mthis, __arg_0);
+
+  static write_Callback_2(mthis, __arg_0, __arg_1) native "FileWriter_write_Callback";
+  write_Callback_2_(mthis, __arg_0, __arg_1) => write_Callback_2(mthis, __arg_0, __arg_1);
+
+  static write_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "FileWriter_write_Callback";
+  write_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => write_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
 }
 
-class BlinkFileWriterSync {}
+class BlinkFileWriterSync {
+  static final instance = new BlinkFileWriterSync();
 
-class BlinkFocusEvent {
-  static constructorCallback(type, options) native "FocusEvent_constructorCallback";
+  static length_Getter(mthis) native "FileWriterSync_length_Getter";
+  length_Getter_(mthis) => length_Getter(mthis);
+
+  static position_Getter(mthis) native "FileWriterSync_position_Getter";
+  position_Getter_(mthis) => position_Getter(mthis);
+
+  static seek_Callback_0(mthis) native "FileWriterSync_seek_Callback";
+  seek_Callback_0_(mthis) => seek_Callback_0(mthis);
+
+  static seek_Callback_1(mthis, __arg_0) native "FileWriterSync_seek_Callback";
+  seek_Callback_1_(mthis, __arg_0) => seek_Callback_1(mthis, __arg_0);
+
+  static seek_Callback_2(mthis, __arg_0, __arg_1) native "FileWriterSync_seek_Callback";
+  seek_Callback_2_(mthis, __arg_0, __arg_1) => seek_Callback_2(mthis, __arg_0, __arg_1);
+
+  static seek_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "FileWriterSync_seek_Callback";
+  seek_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => seek_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static truncate_Callback_0(mthis) native "FileWriterSync_truncate_Callback";
+  truncate_Callback_0_(mthis) => truncate_Callback_0(mthis);
+
+  static truncate_Callback_1(mthis, __arg_0) native "FileWriterSync_truncate_Callback";
+  truncate_Callback_1_(mthis, __arg_0) => truncate_Callback_1(mthis, __arg_0);
+
+  static truncate_Callback_2(mthis, __arg_0, __arg_1) native "FileWriterSync_truncate_Callback";
+  truncate_Callback_2_(mthis, __arg_0, __arg_1) => truncate_Callback_2(mthis, __arg_0, __arg_1);
+
+  static truncate_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "FileWriterSync_truncate_Callback";
+  truncate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => truncate_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static write_Callback_0(mthis) native "FileWriterSync_write_Callback";
+  write_Callback_0_(mthis) => write_Callback_0(mthis);
+
+  static write_Callback_1(mthis, __arg_0) native "FileWriterSync_write_Callback";
+  write_Callback_1_(mthis, __arg_0) => write_Callback_1(mthis, __arg_0);
+
+  static write_Callback_2(mthis, __arg_0, __arg_1) native "FileWriterSync_write_Callback";
+  write_Callback_2_(mthis, __arg_0, __arg_1) => write_Callback_2(mthis, __arg_0, __arg_1);
+
+  static write_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "FileWriterSync_write_Callback";
+  write_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => write_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+}
+
+class BlinkFocusEvent extends BlinkUIEvent {
+  static final instance = new BlinkFocusEvent();
+
+  static constructorCallback_2(__arg_0, __arg_1) native "FocusEvent_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
 
   static relatedTarget_Getter(mthis) native "FocusEvent_relatedTarget_Getter";
+  relatedTarget_Getter_(mthis) => relatedTarget_Getter(mthis);
+
 }
 
 class BlinkFontFace {
-  static constructorCallback_2(family, source) native "FontFace_constructorCallback";
+  static final instance = new BlinkFontFace();
 
-  static constructorCallback_3(family, source, descriptors) native "FontFace_constructorCallback";
+  static constructorCallback_0() native "FontFace_constructorCallback";
+  constructorCallback_0_() => constructorCallback_0();
+
+  static constructorCallback_1(__arg_0) native "FontFace_constructorCallback";
+  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+
+  static constructorCallback_2(__arg_0, __arg_1) native "FontFace_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+
+  static constructorCallback_3(__arg_0, __arg_1, __arg_2) native "FontFace_constructorCallback";
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => constructorCallback_3(__arg_0, __arg_1, __arg_2);
+
+  static constructorCallback_4(__arg_0, __arg_1, __arg_2, __arg_3) native "FontFace_constructorCallback";
+  constructorCallback_4_(__arg_0, __arg_1, __arg_2, __arg_3) => constructorCallback_4(__arg_0, __arg_1, __arg_2, __arg_3);
+
+  static constructorCallback_5(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "FontFace_constructorCallback";
+  constructorCallback_5_(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => constructorCallback_5(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
 
   static family_Getter(mthis) native "FontFace_family_Getter";
+  family_Getter_(mthis) => family_Getter(mthis);
 
-  static family_Setter(mthis, value) native "FontFace_family_Setter";
+  static family_Setter(mthis, __arg_0) native "FontFace_family_Setter";
+  family_Setter_(mthis, __arg_0) => family_Setter(mthis, __arg_0);
 
   static featureSettings_Getter(mthis) native "FontFace_featureSettings_Getter";
+  featureSettings_Getter_(mthis) => featureSettings_Getter(mthis);
 
-  static featureSettings_Setter(mthis, value) native "FontFace_featureSettings_Setter";
+  static featureSettings_Setter(mthis, __arg_0) native "FontFace_featureSettings_Setter";
+  featureSettings_Setter_(mthis, __arg_0) => featureSettings_Setter(mthis, __arg_0);
+
+  static load_Callback_0(mthis) native "FontFace_load_Callback";
+  load_Callback_0_(mthis) => load_Callback_0(mthis);
+
+  static load_Callback_1(mthis, __arg_0) native "FontFace_load_Callback";
+  load_Callback_1_(mthis, __arg_0) => load_Callback_1(mthis, __arg_0);
+
+  static load_Callback_2(mthis, __arg_0, __arg_1) native "FontFace_load_Callback";
+  load_Callback_2_(mthis, __arg_0, __arg_1) => load_Callback_2(mthis, __arg_0, __arg_1);
 
   static loaded_Getter(mthis) native "FontFace_loaded_Getter";
+  loaded_Getter_(mthis) => loaded_Getter(mthis);
 
   static status_Getter(mthis) native "FontFace_status_Getter";
+  status_Getter_(mthis) => status_Getter(mthis);
 
   static stretch_Getter(mthis) native "FontFace_stretch_Getter";
+  stretch_Getter_(mthis) => stretch_Getter(mthis);
 
-  static stretch_Setter(mthis, value) native "FontFace_stretch_Setter";
+  static stretch_Setter(mthis, __arg_0) native "FontFace_stretch_Setter";
+  stretch_Setter_(mthis, __arg_0) => stretch_Setter(mthis, __arg_0);
 
   static style_Getter(mthis) native "FontFace_style_Getter";
+  style_Getter_(mthis) => style_Getter(mthis);
 
-  static style_Setter(mthis, value) native "FontFace_style_Setter";
+  static style_Setter(mthis, __arg_0) native "FontFace_style_Setter";
+  style_Setter_(mthis, __arg_0) => style_Setter(mthis, __arg_0);
 
   static unicodeRange_Getter(mthis) native "FontFace_unicodeRange_Getter";
+  unicodeRange_Getter_(mthis) => unicodeRange_Getter(mthis);
 
-  static unicodeRange_Setter(mthis, value) native "FontFace_unicodeRange_Setter";
+  static unicodeRange_Setter(mthis, __arg_0) native "FontFace_unicodeRange_Setter";
+  unicodeRange_Setter_(mthis, __arg_0) => unicodeRange_Setter(mthis, __arg_0);
 
   static variant_Getter(mthis) native "FontFace_variant_Getter";
+  variant_Getter_(mthis) => variant_Getter(mthis);
 
-  static variant_Setter(mthis, value) native "FontFace_variant_Setter";
+  static variant_Setter(mthis, __arg_0) native "FontFace_variant_Setter";
+  variant_Setter_(mthis, __arg_0) => variant_Setter(mthis, __arg_0);
 
   static weight_Getter(mthis) native "FontFace_weight_Getter";
+  weight_Getter_(mthis) => weight_Getter(mthis);
 
-  static weight_Setter(mthis, value) native "FontFace_weight_Setter";
+  static weight_Setter(mthis, __arg_0) native "FontFace_weight_Setter";
+  weight_Setter_(mthis, __arg_0) => weight_Setter(mthis, __arg_0);
 
-  static load_Callback(mthis) native "FontFace_load_Callback";
 }
 
-class BlinkFontFaceSet {
+class BlinkFontFaceSet extends BlinkEventTarget {
+  static final instance = new BlinkFontFaceSet();
+
+  static add_Callback_0(mthis) native "FontFaceSet_add_Callback";
+  add_Callback_0_(mthis) => add_Callback_0(mthis);
+
+  static add_Callback_1(mthis, __arg_0) native "FontFaceSet_add_Callback";
+  add_Callback_1_(mthis, __arg_0) => add_Callback_1(mthis, __arg_0);
+
+  static add_Callback_2(mthis, __arg_0, __arg_1) native "FontFaceSet_add_Callback";
+  add_Callback_2_(mthis, __arg_0, __arg_1) => add_Callback_2(mthis, __arg_0, __arg_1);
+
+  static add_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "FontFaceSet_add_Callback";
+  add_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => add_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static check_Callback_0(mthis) native "FontFaceSet_check_Callback";
+  check_Callback_0_(mthis) => check_Callback_0(mthis);
+
+  static check_Callback_1(mthis, __arg_0) native "FontFaceSet_check_Callback";
+  check_Callback_1_(mthis, __arg_0) => check_Callback_1(mthis, __arg_0);
+
+  static check_Callback_2(mthis, __arg_0, __arg_1) native "FontFaceSet_check_Callback";
+  check_Callback_2_(mthis, __arg_0, __arg_1) => check_Callback_2(mthis, __arg_0, __arg_1);
+
+  static check_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "FontFaceSet_check_Callback";
+  check_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => check_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static check_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "FontFaceSet_check_Callback";
+  check_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => check_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static clear_Callback_0(mthis) native "FontFaceSet_clear_Callback";
+  clear_Callback_0_(mthis) => clear_Callback_0(mthis);
+
+  static clear_Callback_1(mthis, __arg_0) native "FontFaceSet_clear_Callback";
+  clear_Callback_1_(mthis, __arg_0) => clear_Callback_1(mthis, __arg_0);
+
+  static clear_Callback_2(mthis, __arg_0, __arg_1) native "FontFaceSet_clear_Callback";
+  clear_Callback_2_(mthis, __arg_0, __arg_1) => clear_Callback_2(mthis, __arg_0, __arg_1);
+
+  static delete_Callback_0(mthis) native "FontFaceSet_delete_Callback";
+  delete_Callback_0_(mthis) => delete_Callback_0(mthis);
+
+  static delete_Callback_1(mthis, __arg_0) native "FontFaceSet_delete_Callback";
+  delete_Callback_1_(mthis, __arg_0) => delete_Callback_1(mthis, __arg_0);
+
+  static delete_Callback_2(mthis, __arg_0, __arg_1) native "FontFaceSet_delete_Callback";
+  delete_Callback_2_(mthis, __arg_0, __arg_1) => delete_Callback_2(mthis, __arg_0, __arg_1);
+
+  static delete_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "FontFaceSet_delete_Callback";
+  delete_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => delete_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static forEach_Callback_0(mthis) native "FontFaceSet_forEach_Callback";
+  forEach_Callback_0_(mthis) => forEach_Callback_0(mthis);
+
+  static forEach_Callback_1(mthis, __arg_0) native "FontFaceSet_forEach_Callback";
+  forEach_Callback_1_(mthis, __arg_0) => forEach_Callback_1(mthis, __arg_0);
+
+  static forEach_Callback_2(mthis, __arg_0, __arg_1) native "FontFaceSet_forEach_Callback";
+  forEach_Callback_2_(mthis, __arg_0, __arg_1) => forEach_Callback_2(mthis, __arg_0, __arg_1);
+
+  static forEach_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "FontFaceSet_forEach_Callback";
+  forEach_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => forEach_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static forEach_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "FontFaceSet_forEach_Callback";
+  forEach_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => forEach_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static has_Callback_0(mthis) native "FontFaceSet_has_Callback";
+  has_Callback_0_(mthis) => has_Callback_0(mthis);
+
+  static has_Callback_1(mthis, __arg_0) native "FontFaceSet_has_Callback";
+  has_Callback_1_(mthis, __arg_0) => has_Callback_1(mthis, __arg_0);
+
+  static has_Callback_2(mthis, __arg_0, __arg_1) native "FontFaceSet_has_Callback";
+  has_Callback_2_(mthis, __arg_0, __arg_1) => has_Callback_2(mthis, __arg_0, __arg_1);
+
+  static has_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "FontFaceSet_has_Callback";
+  has_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => has_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static onloading_Getter(mthis) native "FontFaceSet_onloading_Getter";
+  onloading_Getter_(mthis) => onloading_Getter(mthis);
+
+  static onloading_Setter(mthis, __arg_0) native "FontFaceSet_onloading_Setter";
+  onloading_Setter_(mthis, __arg_0) => onloading_Setter(mthis, __arg_0);
+
+  static onloadingdone_Getter(mthis) native "FontFaceSet_onloadingdone_Getter";
+  onloadingdone_Getter_(mthis) => onloadingdone_Getter(mthis);
+
+  static onloadingdone_Setter(mthis, __arg_0) native "FontFaceSet_onloadingdone_Setter";
+  onloadingdone_Setter_(mthis, __arg_0) => onloadingdone_Setter(mthis, __arg_0);
+
+  static onloadingerror_Getter(mthis) native "FontFaceSet_onloadingerror_Getter";
+  onloadingerror_Getter_(mthis) => onloadingerror_Getter(mthis);
+
+  static onloadingerror_Setter(mthis, __arg_0) native "FontFaceSet_onloadingerror_Setter";
+  onloadingerror_Setter_(mthis, __arg_0) => onloadingerror_Setter(mthis, __arg_0);
+
   static size_Getter(mthis) native "FontFaceSet_size_Getter";
+  size_Getter_(mthis) => size_Getter(mthis);
 
   static status_Getter(mthis) native "FontFaceSet_status_Getter";
+  status_Getter_(mthis) => status_Getter(mthis);
 
-  static add_Callback_1(mthis, fontFace) native "FontFaceSet_add_Callback";
-
-  static check_Callback_2(mthis, font, text) native "FontFaceSet_check_Callback";
-
-  static clear_Callback(mthis) native "FontFaceSet_clear_Callback";
-
-  static delete_Callback_1(mthis, fontFace) native "FontFaceSet_delete_Callback";
-
-  static forEach_Callback_2(mthis, callback, thisArg) native "FontFaceSet_forEach_Callback";
-
-  static forEach_Callback_1(mthis, callback) native "FontFaceSet_forEach_Callback";
-
-  static has_Callback_1(mthis, fontFace) native "FontFaceSet_has_Callback";
 }
 
-class BlinkFontFaceSetLoadEvent {
+class BlinkFontFaceSetLoadEvent extends BlinkEvent {
+  static final instance = new BlinkFontFaceSetLoadEvent();
+
   static fontfaces_Getter(mthis) native "FontFaceSetLoadEvent_fontfaces_Getter";
+  fontfaces_Getter_(mthis) => fontfaces_Getter(mthis);
+
 }
 
 class BlinkFormData {
-  static constructorCallback_1(form) native "FormData_constructorCallback_HTMLFormElement";
+  static final instance = new BlinkFormData();
 
-  static append_Callback_2(mthis, name, value) native "FormData_append_Callback";
+  static append_Callback_0(mthis) native "FormData_append_Callback";
+  append_Callback_0_(mthis) => append_Callback_0(mthis);
 
-  static append_Callback_3(mthis, name, value, filename) native "FormData_append_Callback";
+  static append_Callback_1(mthis, __arg_0) native "FormData_append_Callback";
+  append_Callback_1_(mthis, __arg_0) => append_Callback_1(mthis, __arg_0);
+
+  static append_Callback_2(mthis, __arg_0, __arg_1) native "FormData_append_Callback";
+  append_Callback_2_(mthis, __arg_0, __arg_1) => append_Callback_2(mthis, __arg_0, __arg_1);
+
+  static append_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "FormData_append_Callback";
+  append_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => append_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static append_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "FormData_append_Callback";
+  append_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => append_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static append_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "FormData_append_Callback";
+  append_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => append_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static constructorCallback_0() native "FormData_constructorCallback";
+  constructorCallback_0_() => constructorCallback_0();
+
+  static constructorCallback_1(__arg_0) native "FormData_constructorCallback";
+  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+
+  static constructorCallback_2(__arg_0, __arg_1) native "FormData_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+
+  static constructorCallback_3(__arg_0, __arg_1, __arg_2) native "FormData_constructorCallback";
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => constructorCallback_3(__arg_0, __arg_1, __arg_2);
+
 }
 
-class BlinkGainNode {
+class BlinkGainNode extends BlinkAudioNode {
+  static final instance = new BlinkGainNode();
+
   static gain_Getter(mthis) native "GainNode_gain_Getter";
+  gain_Getter_(mthis) => gain_Getter(mthis);
+
 }
 
 class BlinkGamepad {
+  static final instance = new BlinkGamepad();
+
   static axes_Getter(mthis) native "Gamepad_axes_Getter";
+  axes_Getter_(mthis) => axes_Getter(mthis);
 
   static connected_Getter(mthis) native "Gamepad_connected_Getter";
+  connected_Getter_(mthis) => connected_Getter(mthis);
 
   static id_Getter(mthis) native "Gamepad_id_Getter";
+  id_Getter_(mthis) => id_Getter(mthis);
 
   static index_Getter(mthis) native "Gamepad_index_Getter";
+  index_Getter_(mthis) => index_Getter(mthis);
 
   static mapping_Getter(mthis) native "Gamepad_mapping_Getter";
+  mapping_Getter_(mthis) => mapping_Getter(mthis);
 
   static timestamp_Getter(mthis) native "Gamepad_timestamp_Getter";
+  timestamp_Getter_(mthis) => timestamp_Getter(mthis);
+
 }
 
 class BlinkGamepadButton {
+  static final instance = new BlinkGamepadButton();
+
   static pressed_Getter(mthis) native "GamepadButton_pressed_Getter";
+  pressed_Getter_(mthis) => pressed_Getter(mthis);
 
   static value_Getter(mthis) native "GamepadButton_value_Getter";
+  value_Getter_(mthis) => value_Getter(mthis);
+
 }
 
-class BlinkGamepadEvent {
-  static constructorCallback(type, options) native "GamepadEvent_constructorCallback";
+class BlinkGamepadEvent extends BlinkEvent {
+  static final instance = new BlinkGamepadEvent();
+
+  static constructorCallback_2(__arg_0, __arg_1) native "GamepadEvent_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
 
   static gamepad_Getter(mthis) native "GamepadEvent_gamepad_Getter";
+  gamepad_Getter_(mthis) => gamepad_Getter(mthis);
+
 }
 
 class BlinkGamepadList {
-  static length_Getter(mthis) native "GamepadList_length_Getter";
+  static final instance = new BlinkGamepadList();
 
-  static item_Callback_1(mthis, index) native "GamepadList_item_Callback";
+  static $__getter___Callback_1(mthis, __arg_0) native "GamepadList___getter___Callback";
+  $__getter___Callback_1_(mthis, __arg_0) => $__getter___Callback_1(mthis, __arg_0);
+
+  static item_Callback_0(mthis) native "GamepadList_item_Callback";
+  item_Callback_0_(mthis) => item_Callback_0(mthis);
+
+  static item_Callback_1(mthis, __arg_0) native "GamepadList_item_Callback";
+  item_Callback_1_(mthis, __arg_0) => item_Callback_1(mthis, __arg_0);
+
+  static item_Callback_2(mthis, __arg_0, __arg_1) native "GamepadList_item_Callback";
+  item_Callback_2_(mthis, __arg_0, __arg_1) => item_Callback_2(mthis, __arg_0, __arg_1);
+
+  static item_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "GamepadList_item_Callback";
+  item_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => item_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static length_Getter(mthis) native "GamepadList_length_Getter";
+  length_Getter_(mthis) => length_Getter(mthis);
+
 }
 
 class BlinkGeofencing {
-  static getRegisteredRegions_Callback(mthis) native "Geofencing_getRegisteredRegions_Callback";
+  static final instance = new BlinkGeofencing();
 
-  static registerRegion_Callback_1(mthis, region) native "Geofencing_registerRegion_Callback";
+  static getRegisteredRegions_Callback_0(mthis) native "Geofencing_getRegisteredRegions_Callback";
+  getRegisteredRegions_Callback_0_(mthis) => getRegisteredRegions_Callback_0(mthis);
 
-  static unregisterRegion_Callback_1(mthis, regionId) native "Geofencing_unregisterRegion_Callback";
+  static getRegisteredRegions_Callback_1(mthis, __arg_0) native "Geofencing_getRegisteredRegions_Callback";
+  getRegisteredRegions_Callback_1_(mthis, __arg_0) => getRegisteredRegions_Callback_1(mthis, __arg_0);
+
+  static getRegisteredRegions_Callback_2(mthis, __arg_0, __arg_1) native "Geofencing_getRegisteredRegions_Callback";
+  getRegisteredRegions_Callback_2_(mthis, __arg_0, __arg_1) => getRegisteredRegions_Callback_2(mthis, __arg_0, __arg_1);
+
+  static registerRegion_Callback_0(mthis) native "Geofencing_registerRegion_Callback";
+  registerRegion_Callback_0_(mthis) => registerRegion_Callback_0(mthis);
+
+  static registerRegion_Callback_1(mthis, __arg_0) native "Geofencing_registerRegion_Callback";
+  registerRegion_Callback_1_(mthis, __arg_0) => registerRegion_Callback_1(mthis, __arg_0);
+
+  static registerRegion_Callback_2(mthis, __arg_0, __arg_1) native "Geofencing_registerRegion_Callback";
+  registerRegion_Callback_2_(mthis, __arg_0, __arg_1) => registerRegion_Callback_2(mthis, __arg_0, __arg_1);
+
+  static registerRegion_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Geofencing_registerRegion_Callback";
+  registerRegion_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => registerRegion_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static unregisterRegion_Callback_0(mthis) native "Geofencing_unregisterRegion_Callback";
+  unregisterRegion_Callback_0_(mthis) => unregisterRegion_Callback_0(mthis);
+
+  static unregisterRegion_Callback_1(mthis, __arg_0) native "Geofencing_unregisterRegion_Callback";
+  unregisterRegion_Callback_1_(mthis, __arg_0) => unregisterRegion_Callback_1(mthis, __arg_0);
+
+  static unregisterRegion_Callback_2(mthis, __arg_0, __arg_1) native "Geofencing_unregisterRegion_Callback";
+  unregisterRegion_Callback_2_(mthis, __arg_0, __arg_1) => unregisterRegion_Callback_2(mthis, __arg_0, __arg_1);
+
+  static unregisterRegion_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Geofencing_unregisterRegion_Callback";
+  unregisterRegion_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => unregisterRegion_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+}
+
+class BlinkGeofencingRegion {
+  static final instance = new BlinkGeofencingRegion();
+
+  static id_Getter(mthis) native "GeofencingRegion_id_Getter";
+  id_Getter_(mthis) => id_Getter(mthis);
+
 }
 
 class BlinkGeolocation {
-  static clearWatch_Callback_1(mthis, watchID) native "Geolocation_clearWatch_Callback";
+  static final instance = new BlinkGeolocation();
 
-  static getCurrentPosition_Callback_3(mthis, successCallback, errorCallback, options) native "Geolocation_getCurrentPosition_Callback";
+  static clearWatch_Callback_0(mthis) native "Geolocation_clearWatch_Callback";
+  clearWatch_Callback_0_(mthis) => clearWatch_Callback_0(mthis);
 
-  static getCurrentPosition_Callback_2(mthis, successCallback, errorCallback) native "Geolocation_getCurrentPosition_Callback";
+  static clearWatch_Callback_1(mthis, __arg_0) native "Geolocation_clearWatch_Callback";
+  clearWatch_Callback_1_(mthis, __arg_0) => clearWatch_Callback_1(mthis, __arg_0);
 
-  static getCurrentPosition_Callback_1(mthis, successCallback) native "Geolocation_getCurrentPosition_Callback";
+  static clearWatch_Callback_2(mthis, __arg_0, __arg_1) native "Geolocation_clearWatch_Callback";
+  clearWatch_Callback_2_(mthis, __arg_0, __arg_1) => clearWatch_Callback_2(mthis, __arg_0, __arg_1);
 
-  static watchPosition_Callback_3(mthis, successCallback, errorCallback, options) native "Geolocation_watchPosition_Callback";
+  static clearWatch_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Geolocation_clearWatch_Callback";
+  clearWatch_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => clearWatch_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
-  static watchPosition_Callback_2(mthis, successCallback, errorCallback) native "Geolocation_watchPosition_Callback";
+  static getCurrentPosition_Callback_0(mthis) native "Geolocation_getCurrentPosition_Callback";
+  getCurrentPosition_Callback_0_(mthis) => getCurrentPosition_Callback_0(mthis);
 
-  static watchPosition_Callback_1(mthis, successCallback) native "Geolocation_watchPosition_Callback";
+  static getCurrentPosition_Callback_1(mthis, __arg_0) native "Geolocation_getCurrentPosition_Callback";
+  getCurrentPosition_Callback_1_(mthis, __arg_0) => getCurrentPosition_Callback_1(mthis, __arg_0);
+
+  static getCurrentPosition_Callback_2(mthis, __arg_0, __arg_1) native "Geolocation_getCurrentPosition_Callback";
+  getCurrentPosition_Callback_2_(mthis, __arg_0, __arg_1) => getCurrentPosition_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getCurrentPosition_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Geolocation_getCurrentPosition_Callback";
+  getCurrentPosition_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getCurrentPosition_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static getCurrentPosition_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Geolocation_getCurrentPosition_Callback";
+  getCurrentPosition_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => getCurrentPosition_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static getCurrentPosition_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "Geolocation_getCurrentPosition_Callback";
+  getCurrentPosition_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => getCurrentPosition_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static watchPosition_Callback_0(mthis) native "Geolocation_watchPosition_Callback";
+  watchPosition_Callback_0_(mthis) => watchPosition_Callback_0(mthis);
+
+  static watchPosition_Callback_1(mthis, __arg_0) native "Geolocation_watchPosition_Callback";
+  watchPosition_Callback_1_(mthis, __arg_0) => watchPosition_Callback_1(mthis, __arg_0);
+
+  static watchPosition_Callback_2(mthis, __arg_0, __arg_1) native "Geolocation_watchPosition_Callback";
+  watchPosition_Callback_2_(mthis, __arg_0, __arg_1) => watchPosition_Callback_2(mthis, __arg_0, __arg_1);
+
+  static watchPosition_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Geolocation_watchPosition_Callback";
+  watchPosition_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => watchPosition_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static watchPosition_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Geolocation_watchPosition_Callback";
+  watchPosition_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => watchPosition_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static watchPosition_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "Geolocation_watchPosition_Callback";
+  watchPosition_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => watchPosition_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
 }
 
 class BlinkGeoposition {
+  static final instance = new BlinkGeoposition();
+
   static coords_Getter(mthis) native "Geoposition_coords_Getter";
+  coords_Getter_(mthis) => coords_Getter(mthis);
 
   static timestamp_Getter(mthis) native "Geoposition_timestamp_Getter";
+  timestamp_Getter_(mthis) => timestamp_Getter(mthis);
+
 }
 
 class BlinkHTMLAllCollection {
-  static item_Callback_1(mthis, index) native "HTMLAllCollection_item_Callback";
+  static final instance = new BlinkHTMLAllCollection();
+
+  static $__getter___Callback_1(mthis, __arg_0) native "HTMLAllCollection___getter___Callback";
+  $__getter___Callback_1_(mthis, __arg_0) => $__getter___Callback_1(mthis, __arg_0);
+
+  static item_Callback_0(mthis) native "HTMLAllCollection_item_Callback";
+  item_Callback_0_(mthis) => item_Callback_0(mthis);
+
+  static item_Callback_1(mthis, __arg_0) native "HTMLAllCollection_item_Callback";
+  item_Callback_1_(mthis, __arg_0) => item_Callback_1(mthis, __arg_0);
+
+  static item_Callback_2(mthis, __arg_0, __arg_1) native "HTMLAllCollection_item_Callback";
+  item_Callback_2_(mthis, __arg_0, __arg_1) => item_Callback_2(mthis, __arg_0, __arg_1);
+
+  static item_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "HTMLAllCollection_item_Callback";
+  item_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => item_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static length_Getter(mthis) native "HTMLAllCollection_length_Getter";
+  length_Getter_(mthis) => length_Getter(mthis);
+
+  static namedItem_Callback_0(mthis) native "HTMLAllCollection_namedItem_Callback";
+  namedItem_Callback_0_(mthis) => namedItem_Callback_0(mthis);
+
+  static namedItem_Callback_1(mthis, __arg_0) native "HTMLAllCollection_namedItem_Callback";
+  namedItem_Callback_1_(mthis, __arg_0) => namedItem_Callback_1(mthis, __arg_0);
+
+  static namedItem_Callback_2(mthis, __arg_0, __arg_1) native "HTMLAllCollection_namedItem_Callback";
+  namedItem_Callback_2_(mthis, __arg_0, __arg_1) => namedItem_Callback_2(mthis, __arg_0, __arg_1);
+
+  static namedItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "HTMLAllCollection_namedItem_Callback";
+  namedItem_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => namedItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
 }
 
-class BlinkHTMLElement {
-  static contentEditable_Getter(mthis) native "HTMLElement_contentEditable_Getter";
+class BlinkHTMLAnchorElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLAnchorElement();
 
-  static contentEditable_Setter(mthis, value) native "HTMLElement_contentEditable_Setter";
-
-  static dir_Getter(mthis) native "HTMLElement_dir_Getter";
-
-  static dir_Setter(mthis, value) native "HTMLElement_dir_Setter";
-
-  static draggable_Getter(mthis) native "HTMLElement_draggable_Getter";
-
-  static draggable_Setter(mthis, value) native "HTMLElement_draggable_Setter";
-
-  static hidden_Getter(mthis) native "HTMLElement_hidden_Getter";
-
-  static hidden_Setter(mthis, value) native "HTMLElement_hidden_Setter";
-
-  static inputMethodContext_Getter(mthis) native "HTMLElement_inputMethodContext_Getter";
-
-  static isContentEditable_Getter(mthis) native "HTMLElement_isContentEditable_Getter";
-
-  static lang_Getter(mthis) native "HTMLElement_lang_Getter";
-
-  static lang_Setter(mthis, value) native "HTMLElement_lang_Setter";
-
-  static spellcheck_Getter(mthis) native "HTMLElement_spellcheck_Getter";
-
-  static spellcheck_Setter(mthis, value) native "HTMLElement_spellcheck_Setter";
-
-  static tabIndex_Getter(mthis) native "HTMLElement_tabIndex_Getter";
-
-  static tabIndex_Setter(mthis, value) native "HTMLElement_tabIndex_Setter";
-
-  static title_Getter(mthis) native "HTMLElement_title_Getter";
-
-  static title_Setter(mthis, value) native "HTMLElement_title_Setter";
-
-  static translate_Getter(mthis) native "HTMLElement_translate_Getter";
-
-  static translate_Setter(mthis, value) native "HTMLElement_translate_Setter";
-
-  static webkitdropzone_Getter(mthis) native "HTMLElement_webkitdropzone_Getter";
-
-  static webkitdropzone_Setter(mthis, value) native "HTMLElement_webkitdropzone_Setter";
-
-  static click_Callback(mthis) native "HTMLElement_click_Callback";
-}
-
-class BlinkURLUtils {
-  static hash_Getter(mthis) native "URL_hash_Getter";
-
-  static hash_Setter(mthis, value) native "URL_hash_Setter";
-
-  static host_Getter(mthis) native "URL_host_Getter";
-
-  static host_Setter(mthis, value) native "URL_host_Setter";
-
-  static hostname_Getter(mthis) native "URL_hostname_Getter";
-
-  static hostname_Setter(mthis, value) native "URL_hostname_Setter";
-
-  static href_Getter(mthis) native "URL_href_Getter";
-
-  static href_Setter(mthis, value) native "URL_href_Setter";
-
-  static origin_Getter(mthis) native "URL_origin_Getter";
-
-  static password_Getter(mthis) native "URL_password_Getter";
-
-  static password_Setter(mthis, value) native "URL_password_Setter";
-
-  static pathname_Getter(mthis) native "URL_pathname_Getter";
-
-  static pathname_Setter(mthis, value) native "URL_pathname_Setter";
-
-  static port_Getter(mthis) native "URL_port_Getter";
-
-  static port_Setter(mthis, value) native "URL_port_Setter";
-
-  static protocol_Getter(mthis) native "URL_protocol_Getter";
-
-  static protocol_Setter(mthis, value) native "URL_protocol_Setter";
-
-  static search_Getter(mthis) native "URL_search_Getter";
-
-  static search_Setter(mthis, value) native "URL_search_Setter";
-
-  static username_Getter(mthis) native "URL_username_Getter";
-
-  static username_Setter(mthis, value) native "URL_username_Setter";
-
-  static toString_Callback(mthis) native "URL_toString_Callback";
-}
-
-class BlinkHTMLAnchorElement {
   static download_Getter(mthis) native "HTMLAnchorElement_download_Getter";
+  download_Getter_(mthis) => download_Getter(mthis);
 
-  static download_Setter(mthis, value) native "HTMLAnchorElement_download_Setter";
-
-  static hreflang_Getter(mthis) native "HTMLAnchorElement_hreflang_Getter";
-
-  static hreflang_Setter(mthis, value) native "HTMLAnchorElement_hreflang_Setter";
-
-  static integrity_Getter(mthis) native "HTMLAnchorElement_integrity_Getter";
-
-  static integrity_Setter(mthis, value) native "HTMLAnchorElement_integrity_Setter";
-
-  static rel_Getter(mthis) native "HTMLAnchorElement_rel_Getter";
-
-  static rel_Setter(mthis, value) native "HTMLAnchorElement_rel_Setter";
-
-  static target_Getter(mthis) native "HTMLAnchorElement_target_Getter";
-
-  static target_Setter(mthis, value) native "HTMLAnchorElement_target_Setter";
-
-  static type_Getter(mthis) native "HTMLAnchorElement_type_Getter";
-
-  static type_Setter(mthis, value) native "HTMLAnchorElement_type_Setter";
+  static download_Setter(mthis, __arg_0) native "HTMLAnchorElement_download_Setter";
+  download_Setter_(mthis, __arg_0) => download_Setter(mthis, __arg_0);
 
   static hash_Getter(mthis) native "HTMLAnchorElement_hash_Getter";
+  hash_Getter_(mthis) => hash_Getter(mthis);
 
-  static hash_Setter(mthis, value) native "HTMLAnchorElement_hash_Setter";
+  static hash_Setter(mthis, __arg_0) native "HTMLAnchorElement_hash_Setter";
+  hash_Setter_(mthis, __arg_0) => hash_Setter(mthis, __arg_0);
 
   static host_Getter(mthis) native "HTMLAnchorElement_host_Getter";
+  host_Getter_(mthis) => host_Getter(mthis);
 
-  static host_Setter(mthis, value) native "HTMLAnchorElement_host_Setter";
+  static host_Setter(mthis, __arg_0) native "HTMLAnchorElement_host_Setter";
+  host_Setter_(mthis, __arg_0) => host_Setter(mthis, __arg_0);
 
   static hostname_Getter(mthis) native "HTMLAnchorElement_hostname_Getter";
+  hostname_Getter_(mthis) => hostname_Getter(mthis);
 
-  static hostname_Setter(mthis, value) native "HTMLAnchorElement_hostname_Setter";
+  static hostname_Setter(mthis, __arg_0) native "HTMLAnchorElement_hostname_Setter";
+  hostname_Setter_(mthis, __arg_0) => hostname_Setter(mthis, __arg_0);
 
   static href_Getter(mthis) native "HTMLAnchorElement_href_Getter";
+  href_Getter_(mthis) => href_Getter(mthis);
 
-  static href_Setter(mthis, value) native "HTMLAnchorElement_href_Setter";
+  static href_Setter(mthis, __arg_0) native "HTMLAnchorElement_href_Setter";
+  href_Setter_(mthis, __arg_0) => href_Setter(mthis, __arg_0);
+
+  static hreflang_Getter(mthis) native "HTMLAnchorElement_hreflang_Getter";
+  hreflang_Getter_(mthis) => hreflang_Getter(mthis);
+
+  static hreflang_Setter(mthis, __arg_0) native "HTMLAnchorElement_hreflang_Setter";
+  hreflang_Setter_(mthis, __arg_0) => hreflang_Setter(mthis, __arg_0);
+
+  static integrity_Getter(mthis) native "HTMLAnchorElement_integrity_Getter";
+  integrity_Getter_(mthis) => integrity_Getter(mthis);
+
+  static integrity_Setter(mthis, __arg_0) native "HTMLAnchorElement_integrity_Setter";
+  integrity_Setter_(mthis, __arg_0) => integrity_Setter(mthis, __arg_0);
+
+  static name_Getter(mthis) native "HTMLAnchorElement_name_Getter";
+  name_Getter_(mthis) => name_Getter(mthis);
+
+  static name_Setter(mthis, __arg_0) native "HTMLAnchorElement_name_Setter";
+  name_Setter_(mthis, __arg_0) => name_Setter(mthis, __arg_0);
 
   static origin_Getter(mthis) native "HTMLAnchorElement_origin_Getter";
+  origin_Getter_(mthis) => origin_Getter(mthis);
 
   static password_Getter(mthis) native "HTMLAnchorElement_password_Getter";
+  password_Getter_(mthis) => password_Getter(mthis);
 
-  static password_Setter(mthis, value) native "HTMLAnchorElement_password_Setter";
+  static password_Setter(mthis, __arg_0) native "HTMLAnchorElement_password_Setter";
+  password_Setter_(mthis, __arg_0) => password_Setter(mthis, __arg_0);
 
   static pathname_Getter(mthis) native "HTMLAnchorElement_pathname_Getter";
+  pathname_Getter_(mthis) => pathname_Getter(mthis);
 
-  static pathname_Setter(mthis, value) native "HTMLAnchorElement_pathname_Setter";
+  static pathname_Setter(mthis, __arg_0) native "HTMLAnchorElement_pathname_Setter";
+  pathname_Setter_(mthis, __arg_0) => pathname_Setter(mthis, __arg_0);
+
+  static ping_Getter(mthis) native "HTMLAnchorElement_ping_Getter";
+  ping_Getter_(mthis) => ping_Getter(mthis);
+
+  static ping_Setter(mthis, __arg_0) native "HTMLAnchorElement_ping_Setter";
+  ping_Setter_(mthis, __arg_0) => ping_Setter(mthis, __arg_0);
 
   static port_Getter(mthis) native "HTMLAnchorElement_port_Getter";
+  port_Getter_(mthis) => port_Getter(mthis);
 
-  static port_Setter(mthis, value) native "HTMLAnchorElement_port_Setter";
+  static port_Setter(mthis, __arg_0) native "HTMLAnchorElement_port_Setter";
+  port_Setter_(mthis, __arg_0) => port_Setter(mthis, __arg_0);
 
   static protocol_Getter(mthis) native "HTMLAnchorElement_protocol_Getter";
+  protocol_Getter_(mthis) => protocol_Getter(mthis);
 
-  static protocol_Setter(mthis, value) native "HTMLAnchorElement_protocol_Setter";
+  static protocol_Setter(mthis, __arg_0) native "HTMLAnchorElement_protocol_Setter";
+  protocol_Setter_(mthis, __arg_0) => protocol_Setter(mthis, __arg_0);
+
+  static rel_Getter(mthis) native "HTMLAnchorElement_rel_Getter";
+  rel_Getter_(mthis) => rel_Getter(mthis);
+
+  static rel_Setter(mthis, __arg_0) native "HTMLAnchorElement_rel_Setter";
+  rel_Setter_(mthis, __arg_0) => rel_Setter(mthis, __arg_0);
 
   static search_Getter(mthis) native "HTMLAnchorElement_search_Getter";
+  search_Getter_(mthis) => search_Getter(mthis);
 
-  static search_Setter(mthis, value) native "HTMLAnchorElement_search_Setter";
+  static search_Setter(mthis, __arg_0) native "HTMLAnchorElement_search_Setter";
+  search_Setter_(mthis, __arg_0) => search_Setter(mthis, __arg_0);
+
+  static target_Getter(mthis) native "HTMLAnchorElement_target_Getter";
+  target_Getter_(mthis) => target_Getter(mthis);
+
+  static target_Setter(mthis, __arg_0) native "HTMLAnchorElement_target_Setter";
+  target_Setter_(mthis, __arg_0) => target_Setter(mthis, __arg_0);
+
+  static toString_Callback_0(mthis) native "HTMLAnchorElement_toString_Callback";
+  toString_Callback_0_(mthis) => toString_Callback_0(mthis);
+
+  static toString_Callback_1(mthis, __arg_0) native "HTMLAnchorElement_toString_Callback";
+  toString_Callback_1_(mthis, __arg_0) => toString_Callback_1(mthis, __arg_0);
+
+  static toString_Callback_2(mthis, __arg_0, __arg_1) native "HTMLAnchorElement_toString_Callback";
+  toString_Callback_2_(mthis, __arg_0, __arg_1) => toString_Callback_2(mthis, __arg_0, __arg_1);
+
+  static type_Getter(mthis) native "HTMLAnchorElement_type_Getter";
+  type_Getter_(mthis) => type_Getter(mthis);
+
+  static type_Setter(mthis, __arg_0) native "HTMLAnchorElement_type_Setter";
+  type_Setter_(mthis, __arg_0) => type_Setter(mthis, __arg_0);
 
   static username_Getter(mthis) native "HTMLAnchorElement_username_Getter";
+  username_Getter_(mthis) => username_Getter(mthis);
 
-  static username_Setter(mthis, value) native "HTMLAnchorElement_username_Setter";
+  static username_Setter(mthis, __arg_0) native "HTMLAnchorElement_username_Setter";
+  username_Setter_(mthis, __arg_0) => username_Setter(mthis, __arg_0);
 
-  static toString_Callback(mthis) native "HTMLAnchorElement_toString_Callback";
 }
 
-class BlinkHTMLAppletElement {}
+class BlinkHTMLAppletElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLAppletElement();
 
-class BlinkHTMLAreaElement {
+  static $__getter___Callback_1(mthis, __arg_0) native "HTMLAppletElement___getter___Callback";
+  $__getter___Callback_1_(mthis, __arg_0) => $__getter___Callback_1(mthis, __arg_0);
+
+  static $__setter___Callback_2(mthis, __arg_0, __arg_1) native "HTMLAppletElement___setter___Callback";
+  $__setter___Callback_2_(mthis, __arg_0, __arg_1) => $__setter___Callback_2(mthis, __arg_0, __arg_1);
+
+}
+
+class BlinkHTMLAreaElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLAreaElement();
+
   static alt_Getter(mthis) native "HTMLAreaElement_alt_Getter";
+  alt_Getter_(mthis) => alt_Getter(mthis);
 
-  static alt_Setter(mthis, value) native "HTMLAreaElement_alt_Setter";
+  static alt_Setter(mthis, __arg_0) native "HTMLAreaElement_alt_Setter";
+  alt_Setter_(mthis, __arg_0) => alt_Setter(mthis, __arg_0);
 
   static coords_Getter(mthis) native "HTMLAreaElement_coords_Getter";
+  coords_Getter_(mthis) => coords_Getter(mthis);
 
-  static coords_Setter(mthis, value) native "HTMLAreaElement_coords_Setter";
-
-  static shape_Getter(mthis) native "HTMLAreaElement_shape_Getter";
-
-  static shape_Setter(mthis, value) native "HTMLAreaElement_shape_Setter";
-
-  static target_Getter(mthis) native "HTMLAreaElement_target_Getter";
-
-  static target_Setter(mthis, value) native "HTMLAreaElement_target_Setter";
+  static coords_Setter(mthis, __arg_0) native "HTMLAreaElement_coords_Setter";
+  coords_Setter_(mthis, __arg_0) => coords_Setter(mthis, __arg_0);
 
   static hash_Getter(mthis) native "HTMLAreaElement_hash_Getter";
+  hash_Getter_(mthis) => hash_Getter(mthis);
 
-  static hash_Setter(mthis, value) native "HTMLAreaElement_hash_Setter";
+  static hash_Setter(mthis, __arg_0) native "HTMLAreaElement_hash_Setter";
+  hash_Setter_(mthis, __arg_0) => hash_Setter(mthis, __arg_0);
 
   static host_Getter(mthis) native "HTMLAreaElement_host_Getter";
+  host_Getter_(mthis) => host_Getter(mthis);
 
-  static host_Setter(mthis, value) native "HTMLAreaElement_host_Setter";
+  static host_Setter(mthis, __arg_0) native "HTMLAreaElement_host_Setter";
+  host_Setter_(mthis, __arg_0) => host_Setter(mthis, __arg_0);
 
   static hostname_Getter(mthis) native "HTMLAreaElement_hostname_Getter";
+  hostname_Getter_(mthis) => hostname_Getter(mthis);
 
-  static hostname_Setter(mthis, value) native "HTMLAreaElement_hostname_Setter";
+  static hostname_Setter(mthis, __arg_0) native "HTMLAreaElement_hostname_Setter";
+  hostname_Setter_(mthis, __arg_0) => hostname_Setter(mthis, __arg_0);
 
   static href_Getter(mthis) native "HTMLAreaElement_href_Getter";
+  href_Getter_(mthis) => href_Getter(mthis);
 
-  static href_Setter(mthis, value) native "HTMLAreaElement_href_Setter";
+  static href_Setter(mthis, __arg_0) native "HTMLAreaElement_href_Setter";
+  href_Setter_(mthis, __arg_0) => href_Setter(mthis, __arg_0);
 
   static origin_Getter(mthis) native "HTMLAreaElement_origin_Getter";
+  origin_Getter_(mthis) => origin_Getter(mthis);
 
   static password_Getter(mthis) native "HTMLAreaElement_password_Getter";
+  password_Getter_(mthis) => password_Getter(mthis);
 
-  static password_Setter(mthis, value) native "HTMLAreaElement_password_Setter";
+  static password_Setter(mthis, __arg_0) native "HTMLAreaElement_password_Setter";
+  password_Setter_(mthis, __arg_0) => password_Setter(mthis, __arg_0);
 
   static pathname_Getter(mthis) native "HTMLAreaElement_pathname_Getter";
+  pathname_Getter_(mthis) => pathname_Getter(mthis);
 
-  static pathname_Setter(mthis, value) native "HTMLAreaElement_pathname_Setter";
+  static pathname_Setter(mthis, __arg_0) native "HTMLAreaElement_pathname_Setter";
+  pathname_Setter_(mthis, __arg_0) => pathname_Setter(mthis, __arg_0);
+
+  static ping_Getter(mthis) native "HTMLAreaElement_ping_Getter";
+  ping_Getter_(mthis) => ping_Getter(mthis);
+
+  static ping_Setter(mthis, __arg_0) native "HTMLAreaElement_ping_Setter";
+  ping_Setter_(mthis, __arg_0) => ping_Setter(mthis, __arg_0);
 
   static port_Getter(mthis) native "HTMLAreaElement_port_Getter";
+  port_Getter_(mthis) => port_Getter(mthis);
 
-  static port_Setter(mthis, value) native "HTMLAreaElement_port_Setter";
+  static port_Setter(mthis, __arg_0) native "HTMLAreaElement_port_Setter";
+  port_Setter_(mthis, __arg_0) => port_Setter(mthis, __arg_0);
 
   static protocol_Getter(mthis) native "HTMLAreaElement_protocol_Getter";
+  protocol_Getter_(mthis) => protocol_Getter(mthis);
 
-  static protocol_Setter(mthis, value) native "HTMLAreaElement_protocol_Setter";
+  static protocol_Setter(mthis, __arg_0) native "HTMLAreaElement_protocol_Setter";
+  protocol_Setter_(mthis, __arg_0) => protocol_Setter(mthis, __arg_0);
 
   static search_Getter(mthis) native "HTMLAreaElement_search_Getter";
+  search_Getter_(mthis) => search_Getter(mthis);
 
-  static search_Setter(mthis, value) native "HTMLAreaElement_search_Setter";
+  static search_Setter(mthis, __arg_0) native "HTMLAreaElement_search_Setter";
+  search_Setter_(mthis, __arg_0) => search_Setter(mthis, __arg_0);
+
+  static shape_Getter(mthis) native "HTMLAreaElement_shape_Getter";
+  shape_Getter_(mthis) => shape_Getter(mthis);
+
+  static shape_Setter(mthis, __arg_0) native "HTMLAreaElement_shape_Setter";
+  shape_Setter_(mthis, __arg_0) => shape_Setter(mthis, __arg_0);
+
+  static target_Getter(mthis) native "HTMLAreaElement_target_Getter";
+  target_Getter_(mthis) => target_Getter(mthis);
+
+  static target_Setter(mthis, __arg_0) native "HTMLAreaElement_target_Setter";
+  target_Setter_(mthis, __arg_0) => target_Setter(mthis, __arg_0);
+
+  static toString_Callback_0(mthis) native "HTMLAreaElement_toString_Callback";
+  toString_Callback_0_(mthis) => toString_Callback_0(mthis);
+
+  static toString_Callback_1(mthis, __arg_0) native "HTMLAreaElement_toString_Callback";
+  toString_Callback_1_(mthis, __arg_0) => toString_Callback_1(mthis, __arg_0);
+
+  static toString_Callback_2(mthis, __arg_0, __arg_1) native "HTMLAreaElement_toString_Callback";
+  toString_Callback_2_(mthis, __arg_0, __arg_1) => toString_Callback_2(mthis, __arg_0, __arg_1);
 
   static username_Getter(mthis) native "HTMLAreaElement_username_Getter";
+  username_Getter_(mthis) => username_Getter(mthis);
 
-  static username_Setter(mthis, value) native "HTMLAreaElement_username_Setter";
+  static username_Setter(mthis, __arg_0) native "HTMLAreaElement_username_Setter";
+  username_Setter_(mthis, __arg_0) => username_Setter(mthis, __arg_0);
 
-  static toString_Callback(mthis) native "HTMLAreaElement_toString_Callback";
 }
 
-class BlinkHTMLMediaElement {
-  static audioTracks_Getter(mthis) native "HTMLMediaElement_audioTracks_Getter";
+class BlinkHTMLAudioElement extends BlinkHTMLMediaElement {
+  static final instance = new BlinkHTMLAudioElement();
 
-  static autoplay_Getter(mthis) native "HTMLMediaElement_autoplay_Getter";
+  static constructorCallback_0() native "HTMLAudioElement_constructorCallback";
+  constructorCallback_0_() => constructorCallback_0();
 
-  static autoplay_Setter(mthis, value) native "HTMLMediaElement_autoplay_Setter";
+  static constructorCallback_1(__arg_0) native "HTMLAudioElement_constructorCallback";
+  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
 
-  static buffered_Getter(mthis) native "HTMLMediaElement_buffered_Getter";
+  static constructorCallback_2(__arg_0, __arg_1) native "HTMLAudioElement_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
 
-  static controller_Getter(mthis) native "HTMLMediaElement_controller_Getter";
+  static constructorCallback_3(__arg_0, __arg_1, __arg_2) native "HTMLAudioElement_constructorCallback";
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => constructorCallback_3(__arg_0, __arg_1, __arg_2);
 
-  static controller_Setter(mthis, value) native "HTMLMediaElement_controller_Setter";
-
-  static controls_Getter(mthis) native "HTMLMediaElement_controls_Getter";
-
-  static controls_Setter(mthis, value) native "HTMLMediaElement_controls_Setter";
-
-  static crossOrigin_Getter(mthis) native "HTMLMediaElement_crossOrigin_Getter";
-
-  static crossOrigin_Setter(mthis, value) native "HTMLMediaElement_crossOrigin_Setter";
-
-  static currentSrc_Getter(mthis) native "HTMLMediaElement_currentSrc_Getter";
-
-  static currentTime_Getter(mthis) native "HTMLMediaElement_currentTime_Getter";
-
-  static currentTime_Setter(mthis, value) native "HTMLMediaElement_currentTime_Setter";
-
-  static defaultMuted_Getter(mthis) native "HTMLMediaElement_defaultMuted_Getter";
-
-  static defaultMuted_Setter(mthis, value) native "HTMLMediaElement_defaultMuted_Setter";
-
-  static defaultPlaybackRate_Getter(mthis) native "HTMLMediaElement_defaultPlaybackRate_Getter";
-
-  static defaultPlaybackRate_Setter(mthis, value) native "HTMLMediaElement_defaultPlaybackRate_Setter";
-
-  static duration_Getter(mthis) native "HTMLMediaElement_duration_Getter";
-
-  static ended_Getter(mthis) native "HTMLMediaElement_ended_Getter";
-
-  static error_Getter(mthis) native "HTMLMediaElement_error_Getter";
-
-  static integrity_Getter(mthis) native "HTMLMediaElement_integrity_Getter";
-
-  static integrity_Setter(mthis, value) native "HTMLMediaElement_integrity_Setter";
-
-  static loop_Getter(mthis) native "HTMLMediaElement_loop_Getter";
-
-  static loop_Setter(mthis, value) native "HTMLMediaElement_loop_Setter";
-
-  static mediaGroup_Getter(mthis) native "HTMLMediaElement_mediaGroup_Getter";
-
-  static mediaGroup_Setter(mthis, value) native "HTMLMediaElement_mediaGroup_Setter";
-
-  static mediaKeys_Getter(mthis) native "HTMLMediaElement_mediaKeys_Getter";
-
-  static muted_Getter(mthis) native "HTMLMediaElement_muted_Getter";
-
-  static muted_Setter(mthis, value) native "HTMLMediaElement_muted_Setter";
-
-  static networkState_Getter(mthis) native "HTMLMediaElement_networkState_Getter";
-
-  static paused_Getter(mthis) native "HTMLMediaElement_paused_Getter";
-
-  static playbackRate_Getter(mthis) native "HTMLMediaElement_playbackRate_Getter";
-
-  static playbackRate_Setter(mthis, value) native "HTMLMediaElement_playbackRate_Setter";
-
-  static played_Getter(mthis) native "HTMLMediaElement_played_Getter";
-
-  static preload_Getter(mthis) native "HTMLMediaElement_preload_Getter";
-
-  static preload_Setter(mthis, value) native "HTMLMediaElement_preload_Setter";
-
-  static readyState_Getter(mthis) native "HTMLMediaElement_readyState_Getter";
-
-  static seekable_Getter(mthis) native "HTMLMediaElement_seekable_Getter";
-
-  static seeking_Getter(mthis) native "HTMLMediaElement_seeking_Getter";
-
-  static src_Getter(mthis) native "HTMLMediaElement_src_Getter";
-
-  static src_Setter(mthis, value) native "HTMLMediaElement_src_Setter";
-
-  static textTracks_Getter(mthis) native "HTMLMediaElement_textTracks_Getter";
-
-  static videoTracks_Getter(mthis) native "HTMLMediaElement_videoTracks_Getter";
-
-  static volume_Getter(mthis) native "HTMLMediaElement_volume_Getter";
-
-  static volume_Setter(mthis, value) native "HTMLMediaElement_volume_Setter";
-
-  static webkitAudioDecodedByteCount_Getter(mthis) native "HTMLMediaElement_webkitAudioDecodedByteCount_Getter";
-
-  static webkitVideoDecodedByteCount_Getter(mthis) native "HTMLMediaElement_webkitVideoDecodedByteCount_Getter";
-
-  static addTextTrack_Callback_3(mthis, kind, label, language) native "HTMLMediaElement_addTextTrack_Callback";
-
-  static addTextTrack_Callback_2(mthis, kind, label) native "HTMLMediaElement_addTextTrack_Callback";
-
-  static addTextTrack_Callback_1(mthis, kind) native "HTMLMediaElement_addTextTrack_Callback";
-
-  static canPlayType_Callback_2(mthis, type, keySystem) native "HTMLMediaElement_canPlayType_Callback";
-
-  static canPlayType_Callback_1(mthis, type) native "HTMLMediaElement_canPlayType_Callback";
-
-  static load_Callback(mthis) native "HTMLMediaElement_load_Callback";
-
-  static pause_Callback(mthis) native "HTMLMediaElement_pause_Callback";
-
-  static play_Callback(mthis) native "HTMLMediaElement_play_Callback";
-
-  static setMediaKeys_Callback_1(mthis, mediaKeys) native "HTMLMediaElement_setMediaKeys_Callback";
-
-  static webkitAddKey_Callback_4(mthis, keySystem, key, initData, sessionId) native "HTMLMediaElement_webkitAddKey_Callback";
-
-  static webkitAddKey_Callback_2(mthis, keySystem, key) native "HTMLMediaElement_webkitAddKey_Callback";
-
-  static webkitCancelKeyRequest_Callback_2(mthis, keySystem, sessionId) native "HTMLMediaElement_webkitCancelKeyRequest_Callback";
-
-  static webkitGenerateKeyRequest_Callback_2(mthis, keySystem, initData) native "HTMLMediaElement_webkitGenerateKeyRequest_Callback";
-
-  static webkitGenerateKeyRequest_Callback_1(mthis, keySystem) native "HTMLMediaElement_webkitGenerateKeyRequest_Callback";
 }
 
-class BlinkHTMLAudioElement {
-  static constructorCallback_1(src) native "HTMLAudioElement_constructorCallback";
+class BlinkHTMLBRElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLBRElement();
+
 }
 
-class BlinkHTMLBRElement {}
+class BlinkHTMLBaseElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLBaseElement();
 
-class BlinkHTMLBaseElement {
   static href_Getter(mthis) native "HTMLBaseElement_href_Getter";
+  href_Getter_(mthis) => href_Getter(mthis);
 
-  static href_Setter(mthis, value) native "HTMLBaseElement_href_Setter";
+  static href_Setter(mthis, __arg_0) native "HTMLBaseElement_href_Setter";
+  href_Setter_(mthis, __arg_0) => href_Setter(mthis, __arg_0);
 
   static target_Getter(mthis) native "HTMLBaseElement_target_Getter";
+  target_Getter_(mthis) => target_Getter(mthis);
 
-  static target_Setter(mthis, value) native "HTMLBaseElement_target_Setter";
+  static target_Setter(mthis, __arg_0) native "HTMLBaseElement_target_Setter";
+  target_Setter_(mthis, __arg_0) => target_Setter(mthis, __arg_0);
+
 }
 
-class BlinkWindowEventHandlers {}
+class BlinkHTMLBodyElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLBodyElement();
 
-class BlinkHTMLBodyElement {}
+  static onbeforeunload_Getter(mthis) native "HTMLBodyElement_onbeforeunload_Getter";
+  onbeforeunload_Getter_(mthis) => onbeforeunload_Getter(mthis);
 
-class BlinkHTMLButtonElement {
+  static onbeforeunload_Setter(mthis, __arg_0) native "HTMLBodyElement_onbeforeunload_Setter";
+  onbeforeunload_Setter_(mthis, __arg_0) => onbeforeunload_Setter(mthis, __arg_0);
+
+  static onblur_Getter(mthis) native "HTMLBodyElement_onblur_Getter";
+  onblur_Getter_(mthis) => onblur_Getter(mthis);
+
+  static onblur_Setter(mthis, __arg_0) native "HTMLBodyElement_onblur_Setter";
+  onblur_Setter_(mthis, __arg_0) => onblur_Setter(mthis, __arg_0);
+
+  static onerror_Getter(mthis) native "HTMLBodyElement_onerror_Getter";
+  onerror_Getter_(mthis) => onerror_Getter(mthis);
+
+  static onerror_Setter(mthis, __arg_0) native "HTMLBodyElement_onerror_Setter";
+  onerror_Setter_(mthis, __arg_0) => onerror_Setter(mthis, __arg_0);
+
+  static onfocus_Getter(mthis) native "HTMLBodyElement_onfocus_Getter";
+  onfocus_Getter_(mthis) => onfocus_Getter(mthis);
+
+  static onfocus_Setter(mthis, __arg_0) native "HTMLBodyElement_onfocus_Setter";
+  onfocus_Setter_(mthis, __arg_0) => onfocus_Setter(mthis, __arg_0);
+
+  static onhashchange_Getter(mthis) native "HTMLBodyElement_onhashchange_Getter";
+  onhashchange_Getter_(mthis) => onhashchange_Getter(mthis);
+
+  static onhashchange_Setter(mthis, __arg_0) native "HTMLBodyElement_onhashchange_Setter";
+  onhashchange_Setter_(mthis, __arg_0) => onhashchange_Setter(mthis, __arg_0);
+
+  static onlanguagechange_Getter(mthis) native "HTMLBodyElement_onlanguagechange_Getter";
+  onlanguagechange_Getter_(mthis) => onlanguagechange_Getter(mthis);
+
+  static onlanguagechange_Setter(mthis, __arg_0) native "HTMLBodyElement_onlanguagechange_Setter";
+  onlanguagechange_Setter_(mthis, __arg_0) => onlanguagechange_Setter(mthis, __arg_0);
+
+  static onload_Getter(mthis) native "HTMLBodyElement_onload_Getter";
+  onload_Getter_(mthis) => onload_Getter(mthis);
+
+  static onload_Setter(mthis, __arg_0) native "HTMLBodyElement_onload_Setter";
+  onload_Setter_(mthis, __arg_0) => onload_Setter(mthis, __arg_0);
+
+  static onmessage_Getter(mthis) native "HTMLBodyElement_onmessage_Getter";
+  onmessage_Getter_(mthis) => onmessage_Getter(mthis);
+
+  static onmessage_Setter(mthis, __arg_0) native "HTMLBodyElement_onmessage_Setter";
+  onmessage_Setter_(mthis, __arg_0) => onmessage_Setter(mthis, __arg_0);
+
+  static onoffline_Getter(mthis) native "HTMLBodyElement_onoffline_Getter";
+  onoffline_Getter_(mthis) => onoffline_Getter(mthis);
+
+  static onoffline_Setter(mthis, __arg_0) native "HTMLBodyElement_onoffline_Setter";
+  onoffline_Setter_(mthis, __arg_0) => onoffline_Setter(mthis, __arg_0);
+
+  static ononline_Getter(mthis) native "HTMLBodyElement_ononline_Getter";
+  ononline_Getter_(mthis) => ononline_Getter(mthis);
+
+  static ononline_Setter(mthis, __arg_0) native "HTMLBodyElement_ononline_Setter";
+  ononline_Setter_(mthis, __arg_0) => ononline_Setter(mthis, __arg_0);
+
+  static onorientationchange_Getter(mthis) native "HTMLBodyElement_onorientationchange_Getter";
+  onorientationchange_Getter_(mthis) => onorientationchange_Getter(mthis);
+
+  static onorientationchange_Setter(mthis, __arg_0) native "HTMLBodyElement_onorientationchange_Setter";
+  onorientationchange_Setter_(mthis, __arg_0) => onorientationchange_Setter(mthis, __arg_0);
+
+  static onpagehide_Getter(mthis) native "HTMLBodyElement_onpagehide_Getter";
+  onpagehide_Getter_(mthis) => onpagehide_Getter(mthis);
+
+  static onpagehide_Setter(mthis, __arg_0) native "HTMLBodyElement_onpagehide_Setter";
+  onpagehide_Setter_(mthis, __arg_0) => onpagehide_Setter(mthis, __arg_0);
+
+  static onpageshow_Getter(mthis) native "HTMLBodyElement_onpageshow_Getter";
+  onpageshow_Getter_(mthis) => onpageshow_Getter(mthis);
+
+  static onpageshow_Setter(mthis, __arg_0) native "HTMLBodyElement_onpageshow_Setter";
+  onpageshow_Setter_(mthis, __arg_0) => onpageshow_Setter(mthis, __arg_0);
+
+  static onpopstate_Getter(mthis) native "HTMLBodyElement_onpopstate_Getter";
+  onpopstate_Getter_(mthis) => onpopstate_Getter(mthis);
+
+  static onpopstate_Setter(mthis, __arg_0) native "HTMLBodyElement_onpopstate_Setter";
+  onpopstate_Setter_(mthis, __arg_0) => onpopstate_Setter(mthis, __arg_0);
+
+  static onresize_Getter(mthis) native "HTMLBodyElement_onresize_Getter";
+  onresize_Getter_(mthis) => onresize_Getter(mthis);
+
+  static onresize_Setter(mthis, __arg_0) native "HTMLBodyElement_onresize_Setter";
+  onresize_Setter_(mthis, __arg_0) => onresize_Setter(mthis, __arg_0);
+
+  static onscroll_Getter(mthis) native "HTMLBodyElement_onscroll_Getter";
+  onscroll_Getter_(mthis) => onscroll_Getter(mthis);
+
+  static onscroll_Setter(mthis, __arg_0) native "HTMLBodyElement_onscroll_Setter";
+  onscroll_Setter_(mthis, __arg_0) => onscroll_Setter(mthis, __arg_0);
+
+  static onstorage_Getter(mthis) native "HTMLBodyElement_onstorage_Getter";
+  onstorage_Getter_(mthis) => onstorage_Getter(mthis);
+
+  static onstorage_Setter(mthis, __arg_0) native "HTMLBodyElement_onstorage_Setter";
+  onstorage_Setter_(mthis, __arg_0) => onstorage_Setter(mthis, __arg_0);
+
+  static onunload_Getter(mthis) native "HTMLBodyElement_onunload_Getter";
+  onunload_Getter_(mthis) => onunload_Getter(mthis);
+
+  static onunload_Setter(mthis, __arg_0) native "HTMLBodyElement_onunload_Setter";
+  onunload_Setter_(mthis, __arg_0) => onunload_Setter(mthis, __arg_0);
+
+}
+
+class BlinkHTMLButtonElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLButtonElement();
+
   static autofocus_Getter(mthis) native "HTMLButtonElement_autofocus_Getter";
+  autofocus_Getter_(mthis) => autofocus_Getter(mthis);
 
-  static autofocus_Setter(mthis, value) native "HTMLButtonElement_autofocus_Setter";
+  static autofocus_Setter(mthis, __arg_0) native "HTMLButtonElement_autofocus_Setter";
+  autofocus_Setter_(mthis, __arg_0) => autofocus_Setter(mthis, __arg_0);
+
+  static checkValidity_Callback_0(mthis) native "HTMLButtonElement_checkValidity_Callback";
+  checkValidity_Callback_0_(mthis) => checkValidity_Callback_0(mthis);
+
+  static checkValidity_Callback_1(mthis, __arg_0) native "HTMLButtonElement_checkValidity_Callback";
+  checkValidity_Callback_1_(mthis, __arg_0) => checkValidity_Callback_1(mthis, __arg_0);
+
+  static checkValidity_Callback_2(mthis, __arg_0, __arg_1) native "HTMLButtonElement_checkValidity_Callback";
+  checkValidity_Callback_2_(mthis, __arg_0, __arg_1) => checkValidity_Callback_2(mthis, __arg_0, __arg_1);
 
   static disabled_Getter(mthis) native "HTMLButtonElement_disabled_Getter";
+  disabled_Getter_(mthis) => disabled_Getter(mthis);
 
-  static disabled_Setter(mthis, value) native "HTMLButtonElement_disabled_Setter";
-
-  static form_Getter(mthis) native "HTMLButtonElement_form_Getter";
+  static disabled_Setter(mthis, __arg_0) native "HTMLButtonElement_disabled_Setter";
+  disabled_Setter_(mthis, __arg_0) => disabled_Setter(mthis, __arg_0);
 
   static formAction_Getter(mthis) native "HTMLButtonElement_formAction_Getter";
+  formAction_Getter_(mthis) => formAction_Getter(mthis);
 
-  static formAction_Setter(mthis, value) native "HTMLButtonElement_formAction_Setter";
+  static formAction_Setter(mthis, __arg_0) native "HTMLButtonElement_formAction_Setter";
+  formAction_Setter_(mthis, __arg_0) => formAction_Setter(mthis, __arg_0);
 
   static formEnctype_Getter(mthis) native "HTMLButtonElement_formEnctype_Getter";
+  formEnctype_Getter_(mthis) => formEnctype_Getter(mthis);
 
-  static formEnctype_Setter(mthis, value) native "HTMLButtonElement_formEnctype_Setter";
+  static formEnctype_Setter(mthis, __arg_0) native "HTMLButtonElement_formEnctype_Setter";
+  formEnctype_Setter_(mthis, __arg_0) => formEnctype_Setter(mthis, __arg_0);
 
   static formMethod_Getter(mthis) native "HTMLButtonElement_formMethod_Getter";
+  formMethod_Getter_(mthis) => formMethod_Getter(mthis);
 
-  static formMethod_Setter(mthis, value) native "HTMLButtonElement_formMethod_Setter";
+  static formMethod_Setter(mthis, __arg_0) native "HTMLButtonElement_formMethod_Setter";
+  formMethod_Setter_(mthis, __arg_0) => formMethod_Setter(mthis, __arg_0);
 
   static formNoValidate_Getter(mthis) native "HTMLButtonElement_formNoValidate_Getter";
+  formNoValidate_Getter_(mthis) => formNoValidate_Getter(mthis);
 
-  static formNoValidate_Setter(mthis, value) native "HTMLButtonElement_formNoValidate_Setter";
+  static formNoValidate_Setter(mthis, __arg_0) native "HTMLButtonElement_formNoValidate_Setter";
+  formNoValidate_Setter_(mthis, __arg_0) => formNoValidate_Setter(mthis, __arg_0);
 
   static formTarget_Getter(mthis) native "HTMLButtonElement_formTarget_Getter";
+  formTarget_Getter_(mthis) => formTarget_Getter(mthis);
 
-  static formTarget_Setter(mthis, value) native "HTMLButtonElement_formTarget_Setter";
+  static formTarget_Setter(mthis, __arg_0) native "HTMLButtonElement_formTarget_Setter";
+  formTarget_Setter_(mthis, __arg_0) => formTarget_Setter(mthis, __arg_0);
+
+  static form_Getter(mthis) native "HTMLButtonElement_form_Getter";
+  form_Getter_(mthis) => form_Getter(mthis);
 
   static labels_Getter(mthis) native "HTMLButtonElement_labels_Getter";
+  labels_Getter_(mthis) => labels_Getter(mthis);
 
   static name_Getter(mthis) native "HTMLButtonElement_name_Getter";
+  name_Getter_(mthis) => name_Getter(mthis);
 
-  static name_Setter(mthis, value) native "HTMLButtonElement_name_Setter";
+  static name_Setter(mthis, __arg_0) native "HTMLButtonElement_name_Setter";
+  name_Setter_(mthis, __arg_0) => name_Setter(mthis, __arg_0);
+
+  static setCustomValidity_Callback_0(mthis) native "HTMLButtonElement_setCustomValidity_Callback";
+  setCustomValidity_Callback_0_(mthis) => setCustomValidity_Callback_0(mthis);
+
+  static setCustomValidity_Callback_1(mthis, __arg_0) native "HTMLButtonElement_setCustomValidity_Callback";
+  setCustomValidity_Callback_1_(mthis, __arg_0) => setCustomValidity_Callback_1(mthis, __arg_0);
+
+  static setCustomValidity_Callback_2(mthis, __arg_0, __arg_1) native "HTMLButtonElement_setCustomValidity_Callback";
+  setCustomValidity_Callback_2_(mthis, __arg_0, __arg_1) => setCustomValidity_Callback_2(mthis, __arg_0, __arg_1);
+
+  static setCustomValidity_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "HTMLButtonElement_setCustomValidity_Callback";
+  setCustomValidity_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => setCustomValidity_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
   static type_Getter(mthis) native "HTMLButtonElement_type_Getter";
+  type_Getter_(mthis) => type_Getter(mthis);
 
-  static type_Setter(mthis, value) native "HTMLButtonElement_type_Setter";
+  static type_Setter(mthis, __arg_0) native "HTMLButtonElement_type_Setter";
+  type_Setter_(mthis, __arg_0) => type_Setter(mthis, __arg_0);
 
   static validationMessage_Getter(mthis) native "HTMLButtonElement_validationMessage_Getter";
+  validationMessage_Getter_(mthis) => validationMessage_Getter(mthis);
 
   static validity_Getter(mthis) native "HTMLButtonElement_validity_Getter";
+  validity_Getter_(mthis) => validity_Getter(mthis);
 
   static value_Getter(mthis) native "HTMLButtonElement_value_Getter";
+  value_Getter_(mthis) => value_Getter(mthis);
 
-  static value_Setter(mthis, value) native "HTMLButtonElement_value_Setter";
+  static value_Setter(mthis, __arg_0) native "HTMLButtonElement_value_Setter";
+  value_Setter_(mthis, __arg_0) => value_Setter(mthis, __arg_0);
 
   static willValidate_Getter(mthis) native "HTMLButtonElement_willValidate_Getter";
+  willValidate_Getter_(mthis) => willValidate_Getter(mthis);
 
-  static checkValidity_Callback(mthis) native "HTMLButtonElement_checkValidity_Callback";
-
-  static setCustomValidity_Callback_1(mthis, error) native "HTMLButtonElement_setCustomValidity_Callback";
 }
 
-class BlinkHTMLCanvasElement {
-  static height_Getter(mthis) native "HTMLCanvasElement_height_Getter";
+class BlinkHTMLCanvasElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLCanvasElement();
 
-  static height_Setter(mthis, value) native "HTMLCanvasElement_height_Setter";
+  static getContext_Callback_0(mthis) native "HTMLCanvasElement_getContext_Callback";
+  getContext_Callback_0_(mthis) => getContext_Callback_0(mthis);
+
+  static getContext_Callback_1(mthis, __arg_0) native "HTMLCanvasElement_getContext_Callback";
+  getContext_Callback_1_(mthis, __arg_0) => getContext_Callback_1(mthis, __arg_0);
+
+  static getContext_Callback_2(mthis, __arg_0, __arg_1) native "HTMLCanvasElement_getContext_Callback";
+  getContext_Callback_2_(mthis, __arg_0, __arg_1) => getContext_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getContext_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "HTMLCanvasElement_getContext_Callback";
+  getContext_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getContext_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static getContext_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "HTMLCanvasElement_getContext_Callback";
+  getContext_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => getContext_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static height_Getter(mthis) native "HTMLCanvasElement_height_Getter";
+  height_Getter_(mthis) => height_Getter(mthis);
+
+  static height_Setter(mthis, __arg_0) native "HTMLCanvasElement_height_Setter";
+  height_Setter_(mthis, __arg_0) => height_Setter(mthis, __arg_0);
+
+  static toDataURL_Callback_0(mthis) native "HTMLCanvasElement_toDataURL_Callback";
+  toDataURL_Callback_0_(mthis) => toDataURL_Callback_0(mthis);
+
+  static toDataURL_Callback_1(mthis, __arg_0) native "HTMLCanvasElement_toDataURL_Callback";
+  toDataURL_Callback_1_(mthis, __arg_0) => toDataURL_Callback_1(mthis, __arg_0);
+
+  static toDataURL_Callback_2(mthis, __arg_0, __arg_1) native "HTMLCanvasElement_toDataURL_Callback";
+  toDataURL_Callback_2_(mthis, __arg_0, __arg_1) => toDataURL_Callback_2(mthis, __arg_0, __arg_1);
+
+  static toDataURL_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "HTMLCanvasElement_toDataURL_Callback";
+  toDataURL_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => toDataURL_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static toDataURL_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "HTMLCanvasElement_toDataURL_Callback";
+  toDataURL_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => toDataURL_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
 
   static width_Getter(mthis) native "HTMLCanvasElement_width_Getter";
+  width_Getter_(mthis) => width_Getter(mthis);
 
-  static width_Setter(mthis, value) native "HTMLCanvasElement_width_Setter";
+  static width_Setter(mthis, __arg_0) native "HTMLCanvasElement_width_Setter";
+  width_Setter_(mthis, __arg_0) => width_Setter(mthis, __arg_0);
 
-  static getContext_Callback_2(mthis, contextId, attrs) native "HTMLCanvasElement_getContext_Callback";
-
-  static toDataURL_Callback_2(mthis, type, quality) native "HTMLCanvasElement_toDataURL_Callback";
 }
 
 class BlinkHTMLCollection {
+  static final instance = new BlinkHTMLCollection();
+
+  static $__getter___Callback_1(mthis, __arg_0) native "HTMLCollection___getter___Callback";
+  $__getter___Callback_1_(mthis, __arg_0) => $__getter___Callback_1(mthis, __arg_0);
+
+  static item_Callback_0(mthis) native "HTMLCollection_item_Callback";
+  item_Callback_0_(mthis) => item_Callback_0(mthis);
+
+  static item_Callback_1(mthis, __arg_0) native "HTMLCollection_item_Callback";
+  item_Callback_1_(mthis, __arg_0) => item_Callback_1(mthis, __arg_0);
+
+  static item_Callback_2(mthis, __arg_0, __arg_1) native "HTMLCollection_item_Callback";
+  item_Callback_2_(mthis, __arg_0, __arg_1) => item_Callback_2(mthis, __arg_0, __arg_1);
+
+  static item_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "HTMLCollection_item_Callback";
+  item_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => item_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
   static length_Getter(mthis) native "HTMLCollection_length_Getter";
+  length_Getter_(mthis) => length_Getter(mthis);
 
-  static item_Callback_1(mthis, index) native "HTMLCollection_item_Callback";
+  static namedItem_Callback_0(mthis) native "HTMLCollection_namedItem_Callback";
+  namedItem_Callback_0_(mthis) => namedItem_Callback_0(mthis);
 
-  static namedItem_Callback_1(mthis, name) native "HTMLCollection_namedItem_Callback";
+  static namedItem_Callback_1(mthis, __arg_0) native "HTMLCollection_namedItem_Callback";
+  namedItem_Callback_1_(mthis, __arg_0) => namedItem_Callback_1(mthis, __arg_0);
+
+  static namedItem_Callback_2(mthis, __arg_0, __arg_1) native "HTMLCollection_namedItem_Callback";
+  namedItem_Callback_2_(mthis, __arg_0, __arg_1) => namedItem_Callback_2(mthis, __arg_0, __arg_1);
+
+  static namedItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "HTMLCollection_namedItem_Callback";
+  namedItem_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => namedItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
 }
 
-class BlinkHTMLContentElement {
+class BlinkHTMLContentElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLContentElement();
+
+  static getDistributedNodes_Callback_0(mthis) native "HTMLContentElement_getDistributedNodes_Callback";
+  getDistributedNodes_Callback_0_(mthis) => getDistributedNodes_Callback_0(mthis);
+
+  static getDistributedNodes_Callback_1(mthis, __arg_0) native "HTMLContentElement_getDistributedNodes_Callback";
+  getDistributedNodes_Callback_1_(mthis, __arg_0) => getDistributedNodes_Callback_1(mthis, __arg_0);
+
+  static getDistributedNodes_Callback_2(mthis, __arg_0, __arg_1) native "HTMLContentElement_getDistributedNodes_Callback";
+  getDistributedNodes_Callback_2_(mthis, __arg_0, __arg_1) => getDistributedNodes_Callback_2(mthis, __arg_0, __arg_1);
+
   static select_Getter(mthis) native "HTMLContentElement_select_Getter";
+  select_Getter_(mthis) => select_Getter(mthis);
 
-  static select_Setter(mthis, value) native "HTMLContentElement_select_Setter";
+  static select_Setter(mthis, __arg_0) native "HTMLContentElement_select_Setter";
+  select_Setter_(mthis, __arg_0) => select_Setter(mthis, __arg_0);
 
-  static getDistributedNodes_Callback(mthis) native "HTMLContentElement_getDistributedNodes_Callback";
 }
 
-class BlinkHTMLDListElement {}
+class BlinkHTMLDListElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLDListElement();
 
-class BlinkHTMLDataListElement {
+}
+
+class BlinkHTMLDataListElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLDataListElement();
+
   static options_Getter(mthis) native "HTMLDataListElement_options_Getter";
+  options_Getter_(mthis) => options_Getter(mthis);
+
 }
 
-class BlinkHTMLDetailsElement {
+class BlinkHTMLDetailsElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLDetailsElement();
+
   static open_Getter(mthis) native "HTMLDetailsElement_open_Getter";
+  open_Getter_(mthis) => open_Getter(mthis);
 
-  static open_Setter(mthis, value) native "HTMLDetailsElement_open_Setter";
+  static open_Setter(mthis, __arg_0) native "HTMLDetailsElement_open_Setter";
+  open_Setter_(mthis, __arg_0) => open_Setter(mthis, __arg_0);
+
 }
 
-class BlinkHTMLDialogElement {
-  static open_Getter(mthis) native "HTMLDialogElement_open_Getter";
+class BlinkHTMLDialogElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLDialogElement();
 
-  static open_Setter(mthis, value) native "HTMLDialogElement_open_Setter";
+  static close_Callback_0(mthis) native "HTMLDialogElement_close_Callback";
+  close_Callback_0_(mthis) => close_Callback_0(mthis);
+
+  static close_Callback_1(mthis, __arg_0) native "HTMLDialogElement_close_Callback";
+  close_Callback_1_(mthis, __arg_0) => close_Callback_1(mthis, __arg_0);
+
+  static close_Callback_2(mthis, __arg_0, __arg_1) native "HTMLDialogElement_close_Callback";
+  close_Callback_2_(mthis, __arg_0, __arg_1) => close_Callback_2(mthis, __arg_0, __arg_1);
+
+  static close_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "HTMLDialogElement_close_Callback";
+  close_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => close_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static open_Getter(mthis) native "HTMLDialogElement_open_Getter";
+  open_Getter_(mthis) => open_Getter(mthis);
+
+  static open_Setter(mthis, __arg_0) native "HTMLDialogElement_open_Setter";
+  open_Setter_(mthis, __arg_0) => open_Setter(mthis, __arg_0);
 
   static returnValue_Getter(mthis) native "HTMLDialogElement_returnValue_Getter";
+  returnValue_Getter_(mthis) => returnValue_Getter(mthis);
 
-  static returnValue_Setter(mthis, value) native "HTMLDialogElement_returnValue_Setter";
+  static returnValue_Setter(mthis, __arg_0) native "HTMLDialogElement_returnValue_Setter";
+  returnValue_Setter_(mthis, __arg_0) => returnValue_Setter(mthis, __arg_0);
 
-  static close_Callback_1(mthis, returnValue) native "HTMLDialogElement_close_Callback";
+  static showModal_Callback_0(mthis) native "HTMLDialogElement_showModal_Callback";
+  showModal_Callback_0_(mthis) => showModal_Callback_0(mthis);
 
-  static show_Callback(mthis) native "HTMLDialogElement_show_Callback";
+  static showModal_Callback_1(mthis, __arg_0) native "HTMLDialogElement_showModal_Callback";
+  showModal_Callback_1_(mthis, __arg_0) => showModal_Callback_1(mthis, __arg_0);
 
-  static showModal_Callback(mthis) native "HTMLDialogElement_showModal_Callback";
+  static showModal_Callback_2(mthis, __arg_0, __arg_1) native "HTMLDialogElement_showModal_Callback";
+  showModal_Callback_2_(mthis, __arg_0, __arg_1) => showModal_Callback_2(mthis, __arg_0, __arg_1);
+
+  static show_Callback_0(mthis) native "HTMLDialogElement_show_Callback";
+  show_Callback_0_(mthis) => show_Callback_0(mthis);
+
+  static show_Callback_1(mthis, __arg_0) native "HTMLDialogElement_show_Callback";
+  show_Callback_1_(mthis, __arg_0) => show_Callback_1(mthis, __arg_0);
+
+  static show_Callback_2(mthis, __arg_0, __arg_1) native "HTMLDialogElement_show_Callback";
+  show_Callback_2_(mthis, __arg_0, __arg_1) => show_Callback_2(mthis, __arg_0, __arg_1);
+
 }
 
-class BlinkHTMLDirectoryElement {}
+class BlinkHTMLDirectoryElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLDirectoryElement();
 
-class BlinkHTMLDivElement {}
+}
 
-class BlinkHTMLDocument {}
+class BlinkHTMLDivElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLDivElement();
 
-class BlinkHTMLEmbedElement {
+}
+
+class BlinkHTMLDocument extends BlinkDocument {
+  static final instance = new BlinkHTMLDocument();
+
+  static alinkColor_Getter(mthis) native "HTMLDocument_alinkColor_Getter";
+  alinkColor_Getter_(mthis) => alinkColor_Getter(mthis);
+
+  static alinkColor_Setter(mthis, __arg_0) native "HTMLDocument_alinkColor_Setter";
+  alinkColor_Setter_(mthis, __arg_0) => alinkColor_Setter(mthis, __arg_0);
+
+  static bgColor_Getter(mthis) native "HTMLDocument_bgColor_Getter";
+  bgColor_Getter_(mthis) => bgColor_Getter(mthis);
+
+  static bgColor_Setter(mthis, __arg_0) native "HTMLDocument_bgColor_Setter";
+  bgColor_Setter_(mthis, __arg_0) => bgColor_Setter(mthis, __arg_0);
+
+  static captureEvents_Callback_0(mthis) native "HTMLDocument_captureEvents_Callback";
+  captureEvents_Callback_0_(mthis) => captureEvents_Callback_0(mthis);
+
+  static captureEvents_Callback_1(mthis, __arg_0) native "HTMLDocument_captureEvents_Callback";
+  captureEvents_Callback_1_(mthis, __arg_0) => captureEvents_Callback_1(mthis, __arg_0);
+
+  static captureEvents_Callback_2(mthis, __arg_0, __arg_1) native "HTMLDocument_captureEvents_Callback";
+  captureEvents_Callback_2_(mthis, __arg_0, __arg_1) => captureEvents_Callback_2(mthis, __arg_0, __arg_1);
+
+  static clear_Callback_0(mthis) native "HTMLDocument_clear_Callback";
+  clear_Callback_0_(mthis) => clear_Callback_0(mthis);
+
+  static clear_Callback_1(mthis, __arg_0) native "HTMLDocument_clear_Callback";
+  clear_Callback_1_(mthis, __arg_0) => clear_Callback_1(mthis, __arg_0);
+
+  static clear_Callback_2(mthis, __arg_0, __arg_1) native "HTMLDocument_clear_Callback";
+  clear_Callback_2_(mthis, __arg_0, __arg_1) => clear_Callback_2(mthis, __arg_0, __arg_1);
+
+  static close_Callback_0(mthis) native "HTMLDocument_close_Callback";
+  close_Callback_0_(mthis) => close_Callback_0(mthis);
+
+  static close_Callback_1(mthis, __arg_0) native "HTMLDocument_close_Callback";
+  close_Callback_1_(mthis, __arg_0) => close_Callback_1(mthis, __arg_0);
+
+  static close_Callback_2(mthis, __arg_0, __arg_1) native "HTMLDocument_close_Callback";
+  close_Callback_2_(mthis, __arg_0, __arg_1) => close_Callback_2(mthis, __arg_0, __arg_1);
+
+  static compatMode_Getter(mthis) native "HTMLDocument_compatMode_Getter";
+  compatMode_Getter_(mthis) => compatMode_Getter(mthis);
+
+  static fgColor_Getter(mthis) native "HTMLDocument_fgColor_Getter";
+  fgColor_Getter_(mthis) => fgColor_Getter(mthis);
+
+  static fgColor_Setter(mthis, __arg_0) native "HTMLDocument_fgColor_Setter";
+  fgColor_Setter_(mthis, __arg_0) => fgColor_Setter(mthis, __arg_0);
+
+  static linkColor_Getter(mthis) native "HTMLDocument_linkColor_Getter";
+  linkColor_Getter_(mthis) => linkColor_Getter(mthis);
+
+  static linkColor_Setter(mthis, __arg_0) native "HTMLDocument_linkColor_Setter";
+  linkColor_Setter_(mthis, __arg_0) => linkColor_Setter(mthis, __arg_0);
+
+  static open_Callback_0(mthis) native "HTMLDocument_open_Callback";
+  open_Callback_0_(mthis) => open_Callback_0(mthis);
+
+  static open_Callback_1(mthis, __arg_0) native "HTMLDocument_open_Callback";
+  open_Callback_1_(mthis, __arg_0) => open_Callback_1(mthis, __arg_0);
+
+  static open_Callback_2(mthis, __arg_0, __arg_1) native "HTMLDocument_open_Callback";
+  open_Callback_2_(mthis, __arg_0, __arg_1) => open_Callback_2(mthis, __arg_0, __arg_1);
+
+  static releaseEvents_Callback_0(mthis) native "HTMLDocument_releaseEvents_Callback";
+  releaseEvents_Callback_0_(mthis) => releaseEvents_Callback_0(mthis);
+
+  static releaseEvents_Callback_1(mthis, __arg_0) native "HTMLDocument_releaseEvents_Callback";
+  releaseEvents_Callback_1_(mthis, __arg_0) => releaseEvents_Callback_1(mthis, __arg_0);
+
+  static releaseEvents_Callback_2(mthis, __arg_0, __arg_1) native "HTMLDocument_releaseEvents_Callback";
+  releaseEvents_Callback_2_(mthis, __arg_0, __arg_1) => releaseEvents_Callback_2(mthis, __arg_0, __arg_1);
+
+  static vlinkColor_Getter(mthis) native "HTMLDocument_vlinkColor_Getter";
+  vlinkColor_Getter_(mthis) => vlinkColor_Getter(mthis);
+
+  static vlinkColor_Setter(mthis, __arg_0) native "HTMLDocument_vlinkColor_Setter";
+  vlinkColor_Setter_(mthis, __arg_0) => vlinkColor_Setter(mthis, __arg_0);
+
+  static write_Callback_0(mthis) native "HTMLDocument_write_Callback";
+  write_Callback_0_(mthis) => write_Callback_0(mthis);
+
+  static write_Callback_1(mthis, __arg_0) native "HTMLDocument_write_Callback";
+  write_Callback_1_(mthis, __arg_0) => write_Callback_1(mthis, __arg_0);
+
+  static write_Callback_2(mthis, __arg_0, __arg_1) native "HTMLDocument_write_Callback";
+  write_Callback_2_(mthis, __arg_0, __arg_1) => write_Callback_2(mthis, __arg_0, __arg_1);
+
+  static write_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "HTMLDocument_write_Callback";
+  write_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => write_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static writeln_Callback_0(mthis) native "HTMLDocument_writeln_Callback";
+  writeln_Callback_0_(mthis) => writeln_Callback_0(mthis);
+
+  static writeln_Callback_1(mthis, __arg_0) native "HTMLDocument_writeln_Callback";
+  writeln_Callback_1_(mthis, __arg_0) => writeln_Callback_1(mthis, __arg_0);
+
+  static writeln_Callback_2(mthis, __arg_0, __arg_1) native "HTMLDocument_writeln_Callback";
+  writeln_Callback_2_(mthis, __arg_0, __arg_1) => writeln_Callback_2(mthis, __arg_0, __arg_1);
+
+  static writeln_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "HTMLDocument_writeln_Callback";
+  writeln_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => writeln_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+}
+
+class BlinkHTMLElement extends BlinkElement {
+  static final instance = new BlinkHTMLElement();
+
+  static accessKey_Getter(mthis) native "HTMLElement_accessKey_Getter";
+  accessKey_Getter_(mthis) => accessKey_Getter(mthis);
+
+  static accessKey_Setter(mthis, __arg_0) native "HTMLElement_accessKey_Setter";
+  accessKey_Setter_(mthis, __arg_0) => accessKey_Setter(mthis, __arg_0);
+
+  static click_Callback_0(mthis) native "HTMLElement_click_Callback";
+  click_Callback_0_(mthis) => click_Callback_0(mthis);
+
+  static click_Callback_1(mthis, __arg_0) native "HTMLElement_click_Callback";
+  click_Callback_1_(mthis, __arg_0) => click_Callback_1(mthis, __arg_0);
+
+  static click_Callback_2(mthis, __arg_0, __arg_1) native "HTMLElement_click_Callback";
+  click_Callback_2_(mthis, __arg_0, __arg_1) => click_Callback_2(mthis, __arg_0, __arg_1);
+
+  static contentEditable_Getter(mthis) native "HTMLElement_contentEditable_Getter";
+  contentEditable_Getter_(mthis) => contentEditable_Getter(mthis);
+
+  static contentEditable_Setter(mthis, __arg_0) native "HTMLElement_contentEditable_Setter";
+  contentEditable_Setter_(mthis, __arg_0) => contentEditable_Setter(mthis, __arg_0);
+
+  static dir_Getter(mthis) native "HTMLElement_dir_Getter";
+  dir_Getter_(mthis) => dir_Getter(mthis);
+
+  static dir_Setter(mthis, __arg_0) native "HTMLElement_dir_Setter";
+  dir_Setter_(mthis, __arg_0) => dir_Setter(mthis, __arg_0);
+
+  static draggable_Getter(mthis) native "HTMLElement_draggable_Getter";
+  draggable_Getter_(mthis) => draggable_Getter(mthis);
+
+  static draggable_Setter(mthis, __arg_0) native "HTMLElement_draggable_Setter";
+  draggable_Setter_(mthis, __arg_0) => draggable_Setter(mthis, __arg_0);
+
+  static hidden_Getter(mthis) native "HTMLElement_hidden_Getter";
+  hidden_Getter_(mthis) => hidden_Getter(mthis);
+
+  static hidden_Setter(mthis, __arg_0) native "HTMLElement_hidden_Setter";
+  hidden_Setter_(mthis, __arg_0) => hidden_Setter(mthis, __arg_0);
+
+  static innerText_Getter(mthis) native "HTMLElement_innerText_Getter";
+  innerText_Getter_(mthis) => innerText_Getter(mthis);
+
+  static innerText_Setter(mthis, __arg_0) native "HTMLElement_innerText_Setter";
+  innerText_Setter_(mthis, __arg_0) => innerText_Setter(mthis, __arg_0);
+
+  static inputMethodContext_Getter(mthis) native "HTMLElement_inputMethodContext_Getter";
+  inputMethodContext_Getter_(mthis) => inputMethodContext_Getter(mthis);
+
+  static isContentEditable_Getter(mthis) native "HTMLElement_isContentEditable_Getter";
+  isContentEditable_Getter_(mthis) => isContentEditable_Getter(mthis);
+
+  static lang_Getter(mthis) native "HTMLElement_lang_Getter";
+  lang_Getter_(mthis) => lang_Getter(mthis);
+
+  static lang_Setter(mthis, __arg_0) native "HTMLElement_lang_Setter";
+  lang_Setter_(mthis, __arg_0) => lang_Setter(mthis, __arg_0);
+
+  static onabort_Getter(mthis) native "HTMLElement_onabort_Getter";
+  onabort_Getter_(mthis) => onabort_Getter(mthis);
+
+  static onabort_Setter(mthis, __arg_0) native "HTMLElement_onabort_Setter";
+  onabort_Setter_(mthis, __arg_0) => onabort_Setter(mthis, __arg_0);
+
+  static onautocomplete_Getter(mthis) native "HTMLElement_onautocomplete_Getter";
+  onautocomplete_Getter_(mthis) => onautocomplete_Getter(mthis);
+
+  static onautocomplete_Setter(mthis, __arg_0) native "HTMLElement_onautocomplete_Setter";
+  onautocomplete_Setter_(mthis, __arg_0) => onautocomplete_Setter(mthis, __arg_0);
+
+  static onautocompleteerror_Getter(mthis) native "HTMLElement_onautocompleteerror_Getter";
+  onautocompleteerror_Getter_(mthis) => onautocompleteerror_Getter(mthis);
+
+  static onautocompleteerror_Setter(mthis, __arg_0) native "HTMLElement_onautocompleteerror_Setter";
+  onautocompleteerror_Setter_(mthis, __arg_0) => onautocompleteerror_Setter(mthis, __arg_0);
+
+  static onblur_Getter(mthis) native "HTMLElement_onblur_Getter";
+  onblur_Getter_(mthis) => onblur_Getter(mthis);
+
+  static onblur_Setter(mthis, __arg_0) native "HTMLElement_onblur_Setter";
+  onblur_Setter_(mthis, __arg_0) => onblur_Setter(mthis, __arg_0);
+
+  static oncancel_Getter(mthis) native "HTMLElement_oncancel_Getter";
+  oncancel_Getter_(mthis) => oncancel_Getter(mthis);
+
+  static oncancel_Setter(mthis, __arg_0) native "HTMLElement_oncancel_Setter";
+  oncancel_Setter_(mthis, __arg_0) => oncancel_Setter(mthis, __arg_0);
+
+  static oncanplay_Getter(mthis) native "HTMLElement_oncanplay_Getter";
+  oncanplay_Getter_(mthis) => oncanplay_Getter(mthis);
+
+  static oncanplay_Setter(mthis, __arg_0) native "HTMLElement_oncanplay_Setter";
+  oncanplay_Setter_(mthis, __arg_0) => oncanplay_Setter(mthis, __arg_0);
+
+  static oncanplaythrough_Getter(mthis) native "HTMLElement_oncanplaythrough_Getter";
+  oncanplaythrough_Getter_(mthis) => oncanplaythrough_Getter(mthis);
+
+  static oncanplaythrough_Setter(mthis, __arg_0) native "HTMLElement_oncanplaythrough_Setter";
+  oncanplaythrough_Setter_(mthis, __arg_0) => oncanplaythrough_Setter(mthis, __arg_0);
+
+  static onchange_Getter(mthis) native "HTMLElement_onchange_Getter";
+  onchange_Getter_(mthis) => onchange_Getter(mthis);
+
+  static onchange_Setter(mthis, __arg_0) native "HTMLElement_onchange_Setter";
+  onchange_Setter_(mthis, __arg_0) => onchange_Setter(mthis, __arg_0);
+
+  static onclick_Getter(mthis) native "HTMLElement_onclick_Getter";
+  onclick_Getter_(mthis) => onclick_Getter(mthis);
+
+  static onclick_Setter(mthis, __arg_0) native "HTMLElement_onclick_Setter";
+  onclick_Setter_(mthis, __arg_0) => onclick_Setter(mthis, __arg_0);
+
+  static onclose_Getter(mthis) native "HTMLElement_onclose_Getter";
+  onclose_Getter_(mthis) => onclose_Getter(mthis);
+
+  static onclose_Setter(mthis, __arg_0) native "HTMLElement_onclose_Setter";
+  onclose_Setter_(mthis, __arg_0) => onclose_Setter(mthis, __arg_0);
+
+  static oncontextmenu_Getter(mthis) native "HTMLElement_oncontextmenu_Getter";
+  oncontextmenu_Getter_(mthis) => oncontextmenu_Getter(mthis);
+
+  static oncontextmenu_Setter(mthis, __arg_0) native "HTMLElement_oncontextmenu_Setter";
+  oncontextmenu_Setter_(mthis, __arg_0) => oncontextmenu_Setter(mthis, __arg_0);
+
+  static oncuechange_Getter(mthis) native "HTMLElement_oncuechange_Getter";
+  oncuechange_Getter_(mthis) => oncuechange_Getter(mthis);
+
+  static oncuechange_Setter(mthis, __arg_0) native "HTMLElement_oncuechange_Setter";
+  oncuechange_Setter_(mthis, __arg_0) => oncuechange_Setter(mthis, __arg_0);
+
+  static ondblclick_Getter(mthis) native "HTMLElement_ondblclick_Getter";
+  ondblclick_Getter_(mthis) => ondblclick_Getter(mthis);
+
+  static ondblclick_Setter(mthis, __arg_0) native "HTMLElement_ondblclick_Setter";
+  ondblclick_Setter_(mthis, __arg_0) => ondblclick_Setter(mthis, __arg_0);
+
+  static ondrag_Getter(mthis) native "HTMLElement_ondrag_Getter";
+  ondrag_Getter_(mthis) => ondrag_Getter(mthis);
+
+  static ondrag_Setter(mthis, __arg_0) native "HTMLElement_ondrag_Setter";
+  ondrag_Setter_(mthis, __arg_0) => ondrag_Setter(mthis, __arg_0);
+
+  static ondragend_Getter(mthis) native "HTMLElement_ondragend_Getter";
+  ondragend_Getter_(mthis) => ondragend_Getter(mthis);
+
+  static ondragend_Setter(mthis, __arg_0) native "HTMLElement_ondragend_Setter";
+  ondragend_Setter_(mthis, __arg_0) => ondragend_Setter(mthis, __arg_0);
+
+  static ondragenter_Getter(mthis) native "HTMLElement_ondragenter_Getter";
+  ondragenter_Getter_(mthis) => ondragenter_Getter(mthis);
+
+  static ondragenter_Setter(mthis, __arg_0) native "HTMLElement_ondragenter_Setter";
+  ondragenter_Setter_(mthis, __arg_0) => ondragenter_Setter(mthis, __arg_0);
+
+  static ondragleave_Getter(mthis) native "HTMLElement_ondragleave_Getter";
+  ondragleave_Getter_(mthis) => ondragleave_Getter(mthis);
+
+  static ondragleave_Setter(mthis, __arg_0) native "HTMLElement_ondragleave_Setter";
+  ondragleave_Setter_(mthis, __arg_0) => ondragleave_Setter(mthis, __arg_0);
+
+  static ondragover_Getter(mthis) native "HTMLElement_ondragover_Getter";
+  ondragover_Getter_(mthis) => ondragover_Getter(mthis);
+
+  static ondragover_Setter(mthis, __arg_0) native "HTMLElement_ondragover_Setter";
+  ondragover_Setter_(mthis, __arg_0) => ondragover_Setter(mthis, __arg_0);
+
+  static ondragstart_Getter(mthis) native "HTMLElement_ondragstart_Getter";
+  ondragstart_Getter_(mthis) => ondragstart_Getter(mthis);
+
+  static ondragstart_Setter(mthis, __arg_0) native "HTMLElement_ondragstart_Setter";
+  ondragstart_Setter_(mthis, __arg_0) => ondragstart_Setter(mthis, __arg_0);
+
+  static ondrop_Getter(mthis) native "HTMLElement_ondrop_Getter";
+  ondrop_Getter_(mthis) => ondrop_Getter(mthis);
+
+  static ondrop_Setter(mthis, __arg_0) native "HTMLElement_ondrop_Setter";
+  ondrop_Setter_(mthis, __arg_0) => ondrop_Setter(mthis, __arg_0);
+
+  static ondurationchange_Getter(mthis) native "HTMLElement_ondurationchange_Getter";
+  ondurationchange_Getter_(mthis) => ondurationchange_Getter(mthis);
+
+  static ondurationchange_Setter(mthis, __arg_0) native "HTMLElement_ondurationchange_Setter";
+  ondurationchange_Setter_(mthis, __arg_0) => ondurationchange_Setter(mthis, __arg_0);
+
+  static onemptied_Getter(mthis) native "HTMLElement_onemptied_Getter";
+  onemptied_Getter_(mthis) => onemptied_Getter(mthis);
+
+  static onemptied_Setter(mthis, __arg_0) native "HTMLElement_onemptied_Setter";
+  onemptied_Setter_(mthis, __arg_0) => onemptied_Setter(mthis, __arg_0);
+
+  static onended_Getter(mthis) native "HTMLElement_onended_Getter";
+  onended_Getter_(mthis) => onended_Getter(mthis);
+
+  static onended_Setter(mthis, __arg_0) native "HTMLElement_onended_Setter";
+  onended_Setter_(mthis, __arg_0) => onended_Setter(mthis, __arg_0);
+
+  static onerror_Getter(mthis) native "HTMLElement_onerror_Getter";
+  onerror_Getter_(mthis) => onerror_Getter(mthis);
+
+  static onerror_Setter(mthis, __arg_0) native "HTMLElement_onerror_Setter";
+  onerror_Setter_(mthis, __arg_0) => onerror_Setter(mthis, __arg_0);
+
+  static onfocus_Getter(mthis) native "HTMLElement_onfocus_Getter";
+  onfocus_Getter_(mthis) => onfocus_Getter(mthis);
+
+  static onfocus_Setter(mthis, __arg_0) native "HTMLElement_onfocus_Setter";
+  onfocus_Setter_(mthis, __arg_0) => onfocus_Setter(mthis, __arg_0);
+
+  static oninput_Getter(mthis) native "HTMLElement_oninput_Getter";
+  oninput_Getter_(mthis) => oninput_Getter(mthis);
+
+  static oninput_Setter(mthis, __arg_0) native "HTMLElement_oninput_Setter";
+  oninput_Setter_(mthis, __arg_0) => oninput_Setter(mthis, __arg_0);
+
+  static oninvalid_Getter(mthis) native "HTMLElement_oninvalid_Getter";
+  oninvalid_Getter_(mthis) => oninvalid_Getter(mthis);
+
+  static oninvalid_Setter(mthis, __arg_0) native "HTMLElement_oninvalid_Setter";
+  oninvalid_Setter_(mthis, __arg_0) => oninvalid_Setter(mthis, __arg_0);
+
+  static onkeydown_Getter(mthis) native "HTMLElement_onkeydown_Getter";
+  onkeydown_Getter_(mthis) => onkeydown_Getter(mthis);
+
+  static onkeydown_Setter(mthis, __arg_0) native "HTMLElement_onkeydown_Setter";
+  onkeydown_Setter_(mthis, __arg_0) => onkeydown_Setter(mthis, __arg_0);
+
+  static onkeypress_Getter(mthis) native "HTMLElement_onkeypress_Getter";
+  onkeypress_Getter_(mthis) => onkeypress_Getter(mthis);
+
+  static onkeypress_Setter(mthis, __arg_0) native "HTMLElement_onkeypress_Setter";
+  onkeypress_Setter_(mthis, __arg_0) => onkeypress_Setter(mthis, __arg_0);
+
+  static onkeyup_Getter(mthis) native "HTMLElement_onkeyup_Getter";
+  onkeyup_Getter_(mthis) => onkeyup_Getter(mthis);
+
+  static onkeyup_Setter(mthis, __arg_0) native "HTMLElement_onkeyup_Setter";
+  onkeyup_Setter_(mthis, __arg_0) => onkeyup_Setter(mthis, __arg_0);
+
+  static onload_Getter(mthis) native "HTMLElement_onload_Getter";
+  onload_Getter_(mthis) => onload_Getter(mthis);
+
+  static onload_Setter(mthis, __arg_0) native "HTMLElement_onload_Setter";
+  onload_Setter_(mthis, __arg_0) => onload_Setter(mthis, __arg_0);
+
+  static onloadeddata_Getter(mthis) native "HTMLElement_onloadeddata_Getter";
+  onloadeddata_Getter_(mthis) => onloadeddata_Getter(mthis);
+
+  static onloadeddata_Setter(mthis, __arg_0) native "HTMLElement_onloadeddata_Setter";
+  onloadeddata_Setter_(mthis, __arg_0) => onloadeddata_Setter(mthis, __arg_0);
+
+  static onloadedmetadata_Getter(mthis) native "HTMLElement_onloadedmetadata_Getter";
+  onloadedmetadata_Getter_(mthis) => onloadedmetadata_Getter(mthis);
+
+  static onloadedmetadata_Setter(mthis, __arg_0) native "HTMLElement_onloadedmetadata_Setter";
+  onloadedmetadata_Setter_(mthis, __arg_0) => onloadedmetadata_Setter(mthis, __arg_0);
+
+  static onloadstart_Getter(mthis) native "HTMLElement_onloadstart_Getter";
+  onloadstart_Getter_(mthis) => onloadstart_Getter(mthis);
+
+  static onloadstart_Setter(mthis, __arg_0) native "HTMLElement_onloadstart_Setter";
+  onloadstart_Setter_(mthis, __arg_0) => onloadstart_Setter(mthis, __arg_0);
+
+  static onmousedown_Getter(mthis) native "HTMLElement_onmousedown_Getter";
+  onmousedown_Getter_(mthis) => onmousedown_Getter(mthis);
+
+  static onmousedown_Setter(mthis, __arg_0) native "HTMLElement_onmousedown_Setter";
+  onmousedown_Setter_(mthis, __arg_0) => onmousedown_Setter(mthis, __arg_0);
+
+  static onmouseenter_Getter(mthis) native "HTMLElement_onmouseenter_Getter";
+  onmouseenter_Getter_(mthis) => onmouseenter_Getter(mthis);
+
+  static onmouseenter_Setter(mthis, __arg_0) native "HTMLElement_onmouseenter_Setter";
+  onmouseenter_Setter_(mthis, __arg_0) => onmouseenter_Setter(mthis, __arg_0);
+
+  static onmouseleave_Getter(mthis) native "HTMLElement_onmouseleave_Getter";
+  onmouseleave_Getter_(mthis) => onmouseleave_Getter(mthis);
+
+  static onmouseleave_Setter(mthis, __arg_0) native "HTMLElement_onmouseleave_Setter";
+  onmouseleave_Setter_(mthis, __arg_0) => onmouseleave_Setter(mthis, __arg_0);
+
+  static onmousemove_Getter(mthis) native "HTMLElement_onmousemove_Getter";
+  onmousemove_Getter_(mthis) => onmousemove_Getter(mthis);
+
+  static onmousemove_Setter(mthis, __arg_0) native "HTMLElement_onmousemove_Setter";
+  onmousemove_Setter_(mthis, __arg_0) => onmousemove_Setter(mthis, __arg_0);
+
+  static onmouseout_Getter(mthis) native "HTMLElement_onmouseout_Getter";
+  onmouseout_Getter_(mthis) => onmouseout_Getter(mthis);
+
+  static onmouseout_Setter(mthis, __arg_0) native "HTMLElement_onmouseout_Setter";
+  onmouseout_Setter_(mthis, __arg_0) => onmouseout_Setter(mthis, __arg_0);
+
+  static onmouseover_Getter(mthis) native "HTMLElement_onmouseover_Getter";
+  onmouseover_Getter_(mthis) => onmouseover_Getter(mthis);
+
+  static onmouseover_Setter(mthis, __arg_0) native "HTMLElement_onmouseover_Setter";
+  onmouseover_Setter_(mthis, __arg_0) => onmouseover_Setter(mthis, __arg_0);
+
+  static onmouseup_Getter(mthis) native "HTMLElement_onmouseup_Getter";
+  onmouseup_Getter_(mthis) => onmouseup_Getter(mthis);
+
+  static onmouseup_Setter(mthis, __arg_0) native "HTMLElement_onmouseup_Setter";
+  onmouseup_Setter_(mthis, __arg_0) => onmouseup_Setter(mthis, __arg_0);
+
+  static onmousewheel_Getter(mthis) native "HTMLElement_onmousewheel_Getter";
+  onmousewheel_Getter_(mthis) => onmousewheel_Getter(mthis);
+
+  static onmousewheel_Setter(mthis, __arg_0) native "HTMLElement_onmousewheel_Setter";
+  onmousewheel_Setter_(mthis, __arg_0) => onmousewheel_Setter(mthis, __arg_0);
+
+  static onpause_Getter(mthis) native "HTMLElement_onpause_Getter";
+  onpause_Getter_(mthis) => onpause_Getter(mthis);
+
+  static onpause_Setter(mthis, __arg_0) native "HTMLElement_onpause_Setter";
+  onpause_Setter_(mthis, __arg_0) => onpause_Setter(mthis, __arg_0);
+
+  static onplay_Getter(mthis) native "HTMLElement_onplay_Getter";
+  onplay_Getter_(mthis) => onplay_Getter(mthis);
+
+  static onplay_Setter(mthis, __arg_0) native "HTMLElement_onplay_Setter";
+  onplay_Setter_(mthis, __arg_0) => onplay_Setter(mthis, __arg_0);
+
+  static onplaying_Getter(mthis) native "HTMLElement_onplaying_Getter";
+  onplaying_Getter_(mthis) => onplaying_Getter(mthis);
+
+  static onplaying_Setter(mthis, __arg_0) native "HTMLElement_onplaying_Setter";
+  onplaying_Setter_(mthis, __arg_0) => onplaying_Setter(mthis, __arg_0);
+
+  static onprogress_Getter(mthis) native "HTMLElement_onprogress_Getter";
+  onprogress_Getter_(mthis) => onprogress_Getter(mthis);
+
+  static onprogress_Setter(mthis, __arg_0) native "HTMLElement_onprogress_Setter";
+  onprogress_Setter_(mthis, __arg_0) => onprogress_Setter(mthis, __arg_0);
+
+  static onratechange_Getter(mthis) native "HTMLElement_onratechange_Getter";
+  onratechange_Getter_(mthis) => onratechange_Getter(mthis);
+
+  static onratechange_Setter(mthis, __arg_0) native "HTMLElement_onratechange_Setter";
+  onratechange_Setter_(mthis, __arg_0) => onratechange_Setter(mthis, __arg_0);
+
+  static onreset_Getter(mthis) native "HTMLElement_onreset_Getter";
+  onreset_Getter_(mthis) => onreset_Getter(mthis);
+
+  static onreset_Setter(mthis, __arg_0) native "HTMLElement_onreset_Setter";
+  onreset_Setter_(mthis, __arg_0) => onreset_Setter(mthis, __arg_0);
+
+  static onresize_Getter(mthis) native "HTMLElement_onresize_Getter";
+  onresize_Getter_(mthis) => onresize_Getter(mthis);
+
+  static onresize_Setter(mthis, __arg_0) native "HTMLElement_onresize_Setter";
+  onresize_Setter_(mthis, __arg_0) => onresize_Setter(mthis, __arg_0);
+
+  static onscroll_Getter(mthis) native "HTMLElement_onscroll_Getter";
+  onscroll_Getter_(mthis) => onscroll_Getter(mthis);
+
+  static onscroll_Setter(mthis, __arg_0) native "HTMLElement_onscroll_Setter";
+  onscroll_Setter_(mthis, __arg_0) => onscroll_Setter(mthis, __arg_0);
+
+  static onseeked_Getter(mthis) native "HTMLElement_onseeked_Getter";
+  onseeked_Getter_(mthis) => onseeked_Getter(mthis);
+
+  static onseeked_Setter(mthis, __arg_0) native "HTMLElement_onseeked_Setter";
+  onseeked_Setter_(mthis, __arg_0) => onseeked_Setter(mthis, __arg_0);
+
+  static onseeking_Getter(mthis) native "HTMLElement_onseeking_Getter";
+  onseeking_Getter_(mthis) => onseeking_Getter(mthis);
+
+  static onseeking_Setter(mthis, __arg_0) native "HTMLElement_onseeking_Setter";
+  onseeking_Setter_(mthis, __arg_0) => onseeking_Setter(mthis, __arg_0);
+
+  static onselect_Getter(mthis) native "HTMLElement_onselect_Getter";
+  onselect_Getter_(mthis) => onselect_Getter(mthis);
+
+  static onselect_Setter(mthis, __arg_0) native "HTMLElement_onselect_Setter";
+  onselect_Setter_(mthis, __arg_0) => onselect_Setter(mthis, __arg_0);
+
+  static onshow_Getter(mthis) native "HTMLElement_onshow_Getter";
+  onshow_Getter_(mthis) => onshow_Getter(mthis);
+
+  static onshow_Setter(mthis, __arg_0) native "HTMLElement_onshow_Setter";
+  onshow_Setter_(mthis, __arg_0) => onshow_Setter(mthis, __arg_0);
+
+  static onstalled_Getter(mthis) native "HTMLElement_onstalled_Getter";
+  onstalled_Getter_(mthis) => onstalled_Getter(mthis);
+
+  static onstalled_Setter(mthis, __arg_0) native "HTMLElement_onstalled_Setter";
+  onstalled_Setter_(mthis, __arg_0) => onstalled_Setter(mthis, __arg_0);
+
+  static onsubmit_Getter(mthis) native "HTMLElement_onsubmit_Getter";
+  onsubmit_Getter_(mthis) => onsubmit_Getter(mthis);
+
+  static onsubmit_Setter(mthis, __arg_0) native "HTMLElement_onsubmit_Setter";
+  onsubmit_Setter_(mthis, __arg_0) => onsubmit_Setter(mthis, __arg_0);
+
+  static onsuspend_Getter(mthis) native "HTMLElement_onsuspend_Getter";
+  onsuspend_Getter_(mthis) => onsuspend_Getter(mthis);
+
+  static onsuspend_Setter(mthis, __arg_0) native "HTMLElement_onsuspend_Setter";
+  onsuspend_Setter_(mthis, __arg_0) => onsuspend_Setter(mthis, __arg_0);
+
+  static ontimeupdate_Getter(mthis) native "HTMLElement_ontimeupdate_Getter";
+  ontimeupdate_Getter_(mthis) => ontimeupdate_Getter(mthis);
+
+  static ontimeupdate_Setter(mthis, __arg_0) native "HTMLElement_ontimeupdate_Setter";
+  ontimeupdate_Setter_(mthis, __arg_0) => ontimeupdate_Setter(mthis, __arg_0);
+
+  static ontoggle_Getter(mthis) native "HTMLElement_ontoggle_Getter";
+  ontoggle_Getter_(mthis) => ontoggle_Getter(mthis);
+
+  static ontoggle_Setter(mthis, __arg_0) native "HTMLElement_ontoggle_Setter";
+  ontoggle_Setter_(mthis, __arg_0) => ontoggle_Setter(mthis, __arg_0);
+
+  static onvolumechange_Getter(mthis) native "HTMLElement_onvolumechange_Getter";
+  onvolumechange_Getter_(mthis) => onvolumechange_Getter(mthis);
+
+  static onvolumechange_Setter(mthis, __arg_0) native "HTMLElement_onvolumechange_Setter";
+  onvolumechange_Setter_(mthis, __arg_0) => onvolumechange_Setter(mthis, __arg_0);
+
+  static onwaiting_Getter(mthis) native "HTMLElement_onwaiting_Getter";
+  onwaiting_Getter_(mthis) => onwaiting_Getter(mthis);
+
+  static onwaiting_Setter(mthis, __arg_0) native "HTMLElement_onwaiting_Setter";
+  onwaiting_Setter_(mthis, __arg_0) => onwaiting_Setter(mthis, __arg_0);
+
+  static outerText_Getter(mthis) native "HTMLElement_outerText_Getter";
+  outerText_Getter_(mthis) => outerText_Getter(mthis);
+
+  static outerText_Setter(mthis, __arg_0) native "HTMLElement_outerText_Setter";
+  outerText_Setter_(mthis, __arg_0) => outerText_Setter(mthis, __arg_0);
+
+  static spellcheck_Getter(mthis) native "HTMLElement_spellcheck_Getter";
+  spellcheck_Getter_(mthis) => spellcheck_Getter(mthis);
+
+  static spellcheck_Setter(mthis, __arg_0) native "HTMLElement_spellcheck_Setter";
+  spellcheck_Setter_(mthis, __arg_0) => spellcheck_Setter(mthis, __arg_0);
+
+  static tabIndex_Getter(mthis) native "HTMLElement_tabIndex_Getter";
+  tabIndex_Getter_(mthis) => tabIndex_Getter(mthis);
+
+  static tabIndex_Setter(mthis, __arg_0) native "HTMLElement_tabIndex_Setter";
+  tabIndex_Setter_(mthis, __arg_0) => tabIndex_Setter(mthis, __arg_0);
+
+  static title_Getter(mthis) native "HTMLElement_title_Getter";
+  title_Getter_(mthis) => title_Getter(mthis);
+
+  static title_Setter(mthis, __arg_0) native "HTMLElement_title_Setter";
+  title_Setter_(mthis, __arg_0) => title_Setter(mthis, __arg_0);
+
+  static translate_Getter(mthis) native "HTMLElement_translate_Getter";
+  translate_Getter_(mthis) => translate_Getter(mthis);
+
+  static translate_Setter(mthis, __arg_0) native "HTMLElement_translate_Setter";
+  translate_Setter_(mthis, __arg_0) => translate_Setter(mthis, __arg_0);
+
+  static webkitdropzone_Getter(mthis) native "HTMLElement_webkitdropzone_Getter";
+  webkitdropzone_Getter_(mthis) => webkitdropzone_Getter(mthis);
+
+  static webkitdropzone_Setter(mthis, __arg_0) native "HTMLElement_webkitdropzone_Setter";
+  webkitdropzone_Setter_(mthis, __arg_0) => webkitdropzone_Setter(mthis, __arg_0);
+
+}
+
+class BlinkHTMLEmbedElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLEmbedElement();
+
+  static $__getter___Callback_1(mthis, __arg_0) native "HTMLEmbedElement___getter___Callback";
+  $__getter___Callback_1_(mthis, __arg_0) => $__getter___Callback_1(mthis, __arg_0);
+
+  static $__setter___Callback_2(mthis, __arg_0, __arg_1) native "HTMLEmbedElement___setter___Callback";
+  $__setter___Callback_2_(mthis, __arg_0, __arg_1) => $__setter___Callback_2(mthis, __arg_0, __arg_1);
+
+  static align_Getter(mthis) native "HTMLEmbedElement_align_Getter";
+  align_Getter_(mthis) => align_Getter(mthis);
+
+  static align_Setter(mthis, __arg_0) native "HTMLEmbedElement_align_Setter";
+  align_Setter_(mthis, __arg_0) => align_Setter(mthis, __arg_0);
+
+  static getSVGDocument_Callback_0(mthis) native "HTMLEmbedElement_getSVGDocument_Callback";
+  getSVGDocument_Callback_0_(mthis) => getSVGDocument_Callback_0(mthis);
+
+  static getSVGDocument_Callback_1(mthis, __arg_0) native "HTMLEmbedElement_getSVGDocument_Callback";
+  getSVGDocument_Callback_1_(mthis, __arg_0) => getSVGDocument_Callback_1(mthis, __arg_0);
+
+  static getSVGDocument_Callback_2(mthis, __arg_0, __arg_1) native "HTMLEmbedElement_getSVGDocument_Callback";
+  getSVGDocument_Callback_2_(mthis, __arg_0, __arg_1) => getSVGDocument_Callback_2(mthis, __arg_0, __arg_1);
+
   static height_Getter(mthis) native "HTMLEmbedElement_height_Getter";
+  height_Getter_(mthis) => height_Getter(mthis);
 
-  static height_Setter(mthis, value) native "HTMLEmbedElement_height_Setter";
+  static height_Setter(mthis, __arg_0) native "HTMLEmbedElement_height_Setter";
+  height_Setter_(mthis, __arg_0) => height_Setter(mthis, __arg_0);
 
   static integrity_Getter(mthis) native "HTMLEmbedElement_integrity_Getter";
+  integrity_Getter_(mthis) => integrity_Getter(mthis);
 
-  static integrity_Setter(mthis, value) native "HTMLEmbedElement_integrity_Setter";
+  static integrity_Setter(mthis, __arg_0) native "HTMLEmbedElement_integrity_Setter";
+  integrity_Setter_(mthis, __arg_0) => integrity_Setter(mthis, __arg_0);
 
   static name_Getter(mthis) native "HTMLEmbedElement_name_Getter";
+  name_Getter_(mthis) => name_Getter(mthis);
 
-  static name_Setter(mthis, value) native "HTMLEmbedElement_name_Setter";
+  static name_Setter(mthis, __arg_0) native "HTMLEmbedElement_name_Setter";
+  name_Setter_(mthis, __arg_0) => name_Setter(mthis, __arg_0);
 
   static src_Getter(mthis) native "HTMLEmbedElement_src_Getter";
+  src_Getter_(mthis) => src_Getter(mthis);
 
-  static src_Setter(mthis, value) native "HTMLEmbedElement_src_Setter";
+  static src_Setter(mthis, __arg_0) native "HTMLEmbedElement_src_Setter";
+  src_Setter_(mthis, __arg_0) => src_Setter(mthis, __arg_0);
 
   static type_Getter(mthis) native "HTMLEmbedElement_type_Getter";
+  type_Getter_(mthis) => type_Getter(mthis);
 
-  static type_Setter(mthis, value) native "HTMLEmbedElement_type_Setter";
+  static type_Setter(mthis, __arg_0) native "HTMLEmbedElement_type_Setter";
+  type_Setter_(mthis, __arg_0) => type_Setter(mthis, __arg_0);
 
   static width_Getter(mthis) native "HTMLEmbedElement_width_Getter";
+  width_Getter_(mthis) => width_Getter(mthis);
 
-  static width_Setter(mthis, value) native "HTMLEmbedElement_width_Setter";
+  static width_Setter(mthis, __arg_0) native "HTMLEmbedElement_width_Setter";
+  width_Setter_(mthis, __arg_0) => width_Setter(mthis, __arg_0);
 
-  static $__getter___Callback_1(mthis, index_OR_name) native "HTMLEmbedElement___getter___Callback";
-
-  static $__setter___Callback_2(mthis, index_OR_name, value) native "HTMLEmbedElement___setter___Callback";
 }
 
-class BlinkHTMLFieldSetElement {
-  static disabled_Getter(mthis) native "HTMLFieldSetElement_disabled_Getter";
+class BlinkHTMLFieldSetElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLFieldSetElement();
 
-  static disabled_Setter(mthis, value) native "HTMLFieldSetElement_disabled_Setter";
+  static checkValidity_Callback_0(mthis) native "HTMLFieldSetElement_checkValidity_Callback";
+  checkValidity_Callback_0_(mthis) => checkValidity_Callback_0(mthis);
+
+  static checkValidity_Callback_1(mthis, __arg_0) native "HTMLFieldSetElement_checkValidity_Callback";
+  checkValidity_Callback_1_(mthis, __arg_0) => checkValidity_Callback_1(mthis, __arg_0);
+
+  static checkValidity_Callback_2(mthis, __arg_0, __arg_1) native "HTMLFieldSetElement_checkValidity_Callback";
+  checkValidity_Callback_2_(mthis, __arg_0, __arg_1) => checkValidity_Callback_2(mthis, __arg_0, __arg_1);
+
+  static disabled_Getter(mthis) native "HTMLFieldSetElement_disabled_Getter";
+  disabled_Getter_(mthis) => disabled_Getter(mthis);
+
+  static disabled_Setter(mthis, __arg_0) native "HTMLFieldSetElement_disabled_Setter";
+  disabled_Setter_(mthis, __arg_0) => disabled_Setter(mthis, __arg_0);
 
   static elements_Getter(mthis) native "HTMLFieldSetElement_elements_Getter";
+  elements_Getter_(mthis) => elements_Getter(mthis);
 
   static form_Getter(mthis) native "HTMLFieldSetElement_form_Getter";
+  form_Getter_(mthis) => form_Getter(mthis);
 
   static name_Getter(mthis) native "HTMLFieldSetElement_name_Getter";
+  name_Getter_(mthis) => name_Getter(mthis);
 
-  static name_Setter(mthis, value) native "HTMLFieldSetElement_name_Setter";
+  static name_Setter(mthis, __arg_0) native "HTMLFieldSetElement_name_Setter";
+  name_Setter_(mthis, __arg_0) => name_Setter(mthis, __arg_0);
+
+  static setCustomValidity_Callback_0(mthis) native "HTMLFieldSetElement_setCustomValidity_Callback";
+  setCustomValidity_Callback_0_(mthis) => setCustomValidity_Callback_0(mthis);
+
+  static setCustomValidity_Callback_1(mthis, __arg_0) native "HTMLFieldSetElement_setCustomValidity_Callback";
+  setCustomValidity_Callback_1_(mthis, __arg_0) => setCustomValidity_Callback_1(mthis, __arg_0);
+
+  static setCustomValidity_Callback_2(mthis, __arg_0, __arg_1) native "HTMLFieldSetElement_setCustomValidity_Callback";
+  setCustomValidity_Callback_2_(mthis, __arg_0, __arg_1) => setCustomValidity_Callback_2(mthis, __arg_0, __arg_1);
+
+  static setCustomValidity_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "HTMLFieldSetElement_setCustomValidity_Callback";
+  setCustomValidity_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => setCustomValidity_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
   static type_Getter(mthis) native "HTMLFieldSetElement_type_Getter";
+  type_Getter_(mthis) => type_Getter(mthis);
 
   static validationMessage_Getter(mthis) native "HTMLFieldSetElement_validationMessage_Getter";
+  validationMessage_Getter_(mthis) => validationMessage_Getter(mthis);
 
   static validity_Getter(mthis) native "HTMLFieldSetElement_validity_Getter";
+  validity_Getter_(mthis) => validity_Getter(mthis);
 
   static willValidate_Getter(mthis) native "HTMLFieldSetElement_willValidate_Getter";
+  willValidate_Getter_(mthis) => willValidate_Getter(mthis);
 
-  static checkValidity_Callback(mthis) native "HTMLFieldSetElement_checkValidity_Callback";
-
-  static setCustomValidity_Callback_1(mthis, error) native "HTMLFieldSetElement_setCustomValidity_Callback";
 }
 
-class BlinkHTMLFontElement {}
+class BlinkHTMLFontElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLFontElement();
 
-class BlinkHTMLFormControlsCollection {
-  static namedItem_Callback_1(mthis, name) native "HTMLFormControlsCollection_namedItem_Callback";
 }
 
-class BlinkHTMLFormElement {
+class BlinkHTMLFormControlsCollection extends BlinkHTMLCollection {
+  static final instance = new BlinkHTMLFormControlsCollection();
+
+  static $__getter___Callback_1(mthis, __arg_0) native "HTMLFormControlsCollection___getter___Callback";
+  $__getter___Callback_1_(mthis, __arg_0) => $__getter___Callback_1(mthis, __arg_0);
+
+  static namedItem_Callback_0(mthis) native "HTMLFormControlsCollection_namedItem_Callback";
+  namedItem_Callback_0_(mthis) => namedItem_Callback_0(mthis);
+
+  static namedItem_Callback_1(mthis, __arg_0) native "HTMLFormControlsCollection_namedItem_Callback";
+  namedItem_Callback_1_(mthis, __arg_0) => namedItem_Callback_1(mthis, __arg_0);
+
+  static namedItem_Callback_2(mthis, __arg_0, __arg_1) native "HTMLFormControlsCollection_namedItem_Callback";
+  namedItem_Callback_2_(mthis, __arg_0, __arg_1) => namedItem_Callback_2(mthis, __arg_0, __arg_1);
+
+  static namedItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "HTMLFormControlsCollection_namedItem_Callback";
+  namedItem_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => namedItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+}
+
+class BlinkHTMLFormElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLFormElement();
+
+  static $__getter___Callback_1(mthis, __arg_0) native "HTMLFormElement___getter___Callback";
+  $__getter___Callback_1_(mthis, __arg_0) => $__getter___Callback_1(mthis, __arg_0);
+
   static acceptCharset_Getter(mthis) native "HTMLFormElement_acceptCharset_Getter";
+  acceptCharset_Getter_(mthis) => acceptCharset_Getter(mthis);
 
-  static acceptCharset_Setter(mthis, value) native "HTMLFormElement_acceptCharset_Setter";
+  static acceptCharset_Setter(mthis, __arg_0) native "HTMLFormElement_acceptCharset_Setter";
+  acceptCharset_Setter_(mthis, __arg_0) => acceptCharset_Setter(mthis, __arg_0);
 
   static action_Getter(mthis) native "HTMLFormElement_action_Getter";
+  action_Getter_(mthis) => action_Getter(mthis);
 
-  static action_Setter(mthis, value) native "HTMLFormElement_action_Setter";
+  static action_Setter(mthis, __arg_0) native "HTMLFormElement_action_Setter";
+  action_Setter_(mthis, __arg_0) => action_Setter(mthis, __arg_0);
 
   static autocomplete_Getter(mthis) native "HTMLFormElement_autocomplete_Getter";
+  autocomplete_Getter_(mthis) => autocomplete_Getter(mthis);
 
-  static autocomplete_Setter(mthis, value) native "HTMLFormElement_autocomplete_Setter";
+  static autocomplete_Setter(mthis, __arg_0) native "HTMLFormElement_autocomplete_Setter";
+  autocomplete_Setter_(mthis, __arg_0) => autocomplete_Setter(mthis, __arg_0);
+
+  static checkValidity_Callback_0(mthis) native "HTMLFormElement_checkValidity_Callback";
+  checkValidity_Callback_0_(mthis) => checkValidity_Callback_0(mthis);
+
+  static checkValidity_Callback_1(mthis, __arg_0) native "HTMLFormElement_checkValidity_Callback";
+  checkValidity_Callback_1_(mthis, __arg_0) => checkValidity_Callback_1(mthis, __arg_0);
+
+  static checkValidity_Callback_2(mthis, __arg_0, __arg_1) native "HTMLFormElement_checkValidity_Callback";
+  checkValidity_Callback_2_(mthis, __arg_0, __arg_1) => checkValidity_Callback_2(mthis, __arg_0, __arg_1);
+
+  static elements_Getter(mthis) native "HTMLFormElement_elements_Getter";
+  elements_Getter_(mthis) => elements_Getter(mthis);
 
   static encoding_Getter(mthis) native "HTMLFormElement_encoding_Getter";
+  encoding_Getter_(mthis) => encoding_Getter(mthis);
 
-  static encoding_Setter(mthis, value) native "HTMLFormElement_encoding_Setter";
+  static encoding_Setter(mthis, __arg_0) native "HTMLFormElement_encoding_Setter";
+  encoding_Setter_(mthis, __arg_0) => encoding_Setter(mthis, __arg_0);
 
   static enctype_Getter(mthis) native "HTMLFormElement_enctype_Getter";
+  enctype_Getter_(mthis) => enctype_Getter(mthis);
 
-  static enctype_Setter(mthis, value) native "HTMLFormElement_enctype_Setter";
+  static enctype_Setter(mthis, __arg_0) native "HTMLFormElement_enctype_Setter";
+  enctype_Setter_(mthis, __arg_0) => enctype_Setter(mthis, __arg_0);
 
   static length_Getter(mthis) native "HTMLFormElement_length_Getter";
+  length_Getter_(mthis) => length_Getter(mthis);
 
   static method_Getter(mthis) native "HTMLFormElement_method_Getter";
+  method_Getter_(mthis) => method_Getter(mthis);
 
-  static method_Setter(mthis, value) native "HTMLFormElement_method_Setter";
+  static method_Setter(mthis, __arg_0) native "HTMLFormElement_method_Setter";
+  method_Setter_(mthis, __arg_0) => method_Setter(mthis, __arg_0);
 
   static name_Getter(mthis) native "HTMLFormElement_name_Getter";
+  name_Getter_(mthis) => name_Getter(mthis);
 
-  static name_Setter(mthis, value) native "HTMLFormElement_name_Setter";
+  static name_Setter(mthis, __arg_0) native "HTMLFormElement_name_Setter";
+  name_Setter_(mthis, __arg_0) => name_Setter(mthis, __arg_0);
 
   static noValidate_Getter(mthis) native "HTMLFormElement_noValidate_Getter";
+  noValidate_Getter_(mthis) => noValidate_Getter(mthis);
 
-  static noValidate_Setter(mthis, value) native "HTMLFormElement_noValidate_Setter";
+  static noValidate_Setter(mthis, __arg_0) native "HTMLFormElement_noValidate_Setter";
+  noValidate_Setter_(mthis, __arg_0) => noValidate_Setter(mthis, __arg_0);
+
+  static requestAutocomplete_Callback_0(mthis) native "HTMLFormElement_requestAutocomplete_Callback";
+  requestAutocomplete_Callback_0_(mthis) => requestAutocomplete_Callback_0(mthis);
+
+  static requestAutocomplete_Callback_1(mthis, __arg_0) native "HTMLFormElement_requestAutocomplete_Callback";
+  requestAutocomplete_Callback_1_(mthis, __arg_0) => requestAutocomplete_Callback_1(mthis, __arg_0);
+
+  static requestAutocomplete_Callback_2(mthis, __arg_0, __arg_1) native "HTMLFormElement_requestAutocomplete_Callback";
+  requestAutocomplete_Callback_2_(mthis, __arg_0, __arg_1) => requestAutocomplete_Callback_2(mthis, __arg_0, __arg_1);
+
+  static reset_Callback_0(mthis) native "HTMLFormElement_reset_Callback";
+  reset_Callback_0_(mthis) => reset_Callback_0(mthis);
+
+  static reset_Callback_1(mthis, __arg_0) native "HTMLFormElement_reset_Callback";
+  reset_Callback_1_(mthis, __arg_0) => reset_Callback_1(mthis, __arg_0);
+
+  static reset_Callback_2(mthis, __arg_0, __arg_1) native "HTMLFormElement_reset_Callback";
+  reset_Callback_2_(mthis, __arg_0, __arg_1) => reset_Callback_2(mthis, __arg_0, __arg_1);
+
+  static submit_Callback_0(mthis) native "HTMLFormElement_submit_Callback";
+  submit_Callback_0_(mthis) => submit_Callback_0(mthis);
+
+  static submit_Callback_1(mthis, __arg_0) native "HTMLFormElement_submit_Callback";
+  submit_Callback_1_(mthis, __arg_0) => submit_Callback_1(mthis, __arg_0);
+
+  static submit_Callback_2(mthis, __arg_0, __arg_1) native "HTMLFormElement_submit_Callback";
+  submit_Callback_2_(mthis, __arg_0, __arg_1) => submit_Callback_2(mthis, __arg_0, __arg_1);
 
   static target_Getter(mthis) native "HTMLFormElement_target_Getter";
+  target_Getter_(mthis) => target_Getter(mthis);
 
-  static target_Setter(mthis, value) native "HTMLFormElement_target_Setter";
+  static target_Setter(mthis, __arg_0) native "HTMLFormElement_target_Setter";
+  target_Setter_(mthis, __arg_0) => target_Setter(mthis, __arg_0);
 
-  static $__getter___Callback_1(mthis, index_OR_name) native "HTMLFormElement___getter___Callback";
-
-  static checkValidity_Callback(mthis) native "HTMLFormElement_checkValidity_Callback";
-
-  static requestAutocomplete_Callback_1(mthis, details) native "HTMLFormElement_requestAutocomplete_Callback";
-
-  static reset_Callback(mthis) native "HTMLFormElement_reset_Callback";
-
-  static submit_Callback(mthis) native "HTMLFormElement_submit_Callback";
 }
 
-class BlinkHTMLFrameElement {}
+class BlinkHTMLFrameElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLFrameElement();
 
-class BlinkHTMLFrameSetElement {}
+}
 
-class BlinkHTMLHRElement {
+class BlinkHTMLFrameSetElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLFrameSetElement();
+
+  static $__getter___Callback_1(mthis, __arg_0) native "HTMLFrameSetElement___getter___Callback";
+  $__getter___Callback_1_(mthis, __arg_0) => $__getter___Callback_1(mthis, __arg_0);
+
+}
+
+class BlinkHTMLHRElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLHRElement();
+
   static color_Getter(mthis) native "HTMLHRElement_color_Getter";
+  color_Getter_(mthis) => color_Getter(mthis);
 
-  static color_Setter(mthis, value) native "HTMLHRElement_color_Setter";
+  static color_Setter(mthis, __arg_0) native "HTMLHRElement_color_Setter";
+  color_Setter_(mthis, __arg_0) => color_Setter(mthis, __arg_0);
+
 }
 
-class BlinkHTMLHeadElement {}
+class BlinkHTMLHeadElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLHeadElement();
 
-class BlinkHTMLHeadingElement {}
+}
 
-class BlinkHTMLHtmlElement {}
+class BlinkHTMLHeadingElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLHeadingElement();
 
-class BlinkHTMLIFrameElement {
+}
+
+class BlinkHTMLHtmlElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLHtmlElement();
+
+}
+
+class BlinkHTMLIFrameElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLIFrameElement();
+
   static allowFullscreen_Getter(mthis) native "HTMLIFrameElement_allowFullscreen_Getter";
+  allowFullscreen_Getter_(mthis) => allowFullscreen_Getter(mthis);
 
-  static allowFullscreen_Setter(mthis, value) native "HTMLIFrameElement_allowFullscreen_Setter";
+  static allowFullscreen_Setter(mthis, __arg_0) native "HTMLIFrameElement_allowFullscreen_Setter";
+  allowFullscreen_Setter_(mthis, __arg_0) => allowFullscreen_Setter(mthis, __arg_0);
+
+  static contentDocument_Getter(mthis) native "HTMLIFrameElement_contentDocument_Getter";
+  contentDocument_Getter_(mthis) => contentDocument_Getter(mthis);
 
   static contentWindow_Getter(mthis) native "HTMLIFrameElement_contentWindow_Getter";
+  contentWindow_Getter_(mthis) => contentWindow_Getter(mthis);
+
+  static getSVGDocument_Callback_0(mthis) native "HTMLIFrameElement_getSVGDocument_Callback";
+  getSVGDocument_Callback_0_(mthis) => getSVGDocument_Callback_0(mthis);
+
+  static getSVGDocument_Callback_1(mthis, __arg_0) native "HTMLIFrameElement_getSVGDocument_Callback";
+  getSVGDocument_Callback_1_(mthis, __arg_0) => getSVGDocument_Callback_1(mthis, __arg_0);
+
+  static getSVGDocument_Callback_2(mthis, __arg_0, __arg_1) native "HTMLIFrameElement_getSVGDocument_Callback";
+  getSVGDocument_Callback_2_(mthis, __arg_0, __arg_1) => getSVGDocument_Callback_2(mthis, __arg_0, __arg_1);
 
   static height_Getter(mthis) native "HTMLIFrameElement_height_Getter";
+  height_Getter_(mthis) => height_Getter(mthis);
 
-  static height_Setter(mthis, value) native "HTMLIFrameElement_height_Setter";
+  static height_Setter(mthis, __arg_0) native "HTMLIFrameElement_height_Setter";
+  height_Setter_(mthis, __arg_0) => height_Setter(mthis, __arg_0);
 
   static integrity_Getter(mthis) native "HTMLIFrameElement_integrity_Getter";
+  integrity_Getter_(mthis) => integrity_Getter(mthis);
 
-  static integrity_Setter(mthis, value) native "HTMLIFrameElement_integrity_Setter";
+  static integrity_Setter(mthis, __arg_0) native "HTMLIFrameElement_integrity_Setter";
+  integrity_Setter_(mthis, __arg_0) => integrity_Setter(mthis, __arg_0);
 
   static name_Getter(mthis) native "HTMLIFrameElement_name_Getter";
+  name_Getter_(mthis) => name_Getter(mthis);
 
-  static name_Setter(mthis, value) native "HTMLIFrameElement_name_Setter";
+  static name_Setter(mthis, __arg_0) native "HTMLIFrameElement_name_Setter";
+  name_Setter_(mthis, __arg_0) => name_Setter(mthis, __arg_0);
 
   static sandbox_Getter(mthis) native "HTMLIFrameElement_sandbox_Getter";
+  sandbox_Getter_(mthis) => sandbox_Getter(mthis);
 
-  static sandbox_Setter(mthis, value) native "HTMLIFrameElement_sandbox_Setter";
+  static sandbox_Setter(mthis, __arg_0) native "HTMLIFrameElement_sandbox_Setter";
+  sandbox_Setter_(mthis, __arg_0) => sandbox_Setter(mthis, __arg_0);
 
   static src_Getter(mthis) native "HTMLIFrameElement_src_Getter";
+  src_Getter_(mthis) => src_Getter(mthis);
 
-  static src_Setter(mthis, value) native "HTMLIFrameElement_src_Setter";
+  static src_Setter(mthis, __arg_0) native "HTMLIFrameElement_src_Setter";
+  src_Setter_(mthis, __arg_0) => src_Setter(mthis, __arg_0);
 
   static srcdoc_Getter(mthis) native "HTMLIFrameElement_srcdoc_Getter";
+  srcdoc_Getter_(mthis) => srcdoc_Getter(mthis);
 
-  static srcdoc_Setter(mthis, value) native "HTMLIFrameElement_srcdoc_Setter";
+  static srcdoc_Setter(mthis, __arg_0) native "HTMLIFrameElement_srcdoc_Setter";
+  srcdoc_Setter_(mthis, __arg_0) => srcdoc_Setter(mthis, __arg_0);
 
   static width_Getter(mthis) native "HTMLIFrameElement_width_Getter";
+  width_Getter_(mthis) => width_Getter(mthis);
 
-  static width_Setter(mthis, value) native "HTMLIFrameElement_width_Setter";
+  static width_Setter(mthis, __arg_0) native "HTMLIFrameElement_width_Setter";
+  width_Setter_(mthis, __arg_0) => width_Setter(mthis, __arg_0);
+
 }
 
-class BlinkHTMLImageElement {
-  static alt_Getter(mthis) native "HTMLImageElement_alt_Getter";
+class BlinkHTMLImageElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLImageElement();
 
-  static alt_Setter(mthis, value) native "HTMLImageElement_alt_Setter";
+  static alt_Getter(mthis) native "HTMLImageElement_alt_Getter";
+  alt_Getter_(mthis) => alt_Getter(mthis);
+
+  static alt_Setter(mthis, __arg_0) native "HTMLImageElement_alt_Setter";
+  alt_Setter_(mthis, __arg_0) => alt_Setter(mthis, __arg_0);
+
+  static border_Getter(mthis) native "HTMLImageElement_border_Getter";
+  border_Getter_(mthis) => border_Getter(mthis);
+
+  static border_Setter(mthis, __arg_0) native "HTMLImageElement_border_Setter";
+  border_Setter_(mthis, __arg_0) => border_Setter(mthis, __arg_0);
 
   static complete_Getter(mthis) native "HTMLImageElement_complete_Getter";
+  complete_Getter_(mthis) => complete_Getter(mthis);
+
+  static constructorCallback_0() native "HTMLImageElement_constructorCallback";
+  constructorCallback_0_() => constructorCallback_0();
+
+  static constructorCallback_1(__arg_0) native "HTMLImageElement_constructorCallback";
+  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+
+  static constructorCallback_2(__arg_0, __arg_1) native "HTMLImageElement_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+
+  static constructorCallback_3(__arg_0, __arg_1, __arg_2) native "HTMLImageElement_constructorCallback";
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => constructorCallback_3(__arg_0, __arg_1, __arg_2);
+
+  static constructorCallback_4(__arg_0, __arg_1, __arg_2, __arg_3) native "HTMLImageElement_constructorCallback";
+  constructorCallback_4_(__arg_0, __arg_1, __arg_2, __arg_3) => constructorCallback_4(__arg_0, __arg_1, __arg_2, __arg_3);
 
   static crossOrigin_Getter(mthis) native "HTMLImageElement_crossOrigin_Getter";
+  crossOrigin_Getter_(mthis) => crossOrigin_Getter(mthis);
 
-  static crossOrigin_Setter(mthis, value) native "HTMLImageElement_crossOrigin_Setter";
+  static crossOrigin_Setter(mthis, __arg_0) native "HTMLImageElement_crossOrigin_Setter";
+  crossOrigin_Setter_(mthis, __arg_0) => crossOrigin_Setter(mthis, __arg_0);
 
   static currentSrc_Getter(mthis) native "HTMLImageElement_currentSrc_Getter";
+  currentSrc_Getter_(mthis) => currentSrc_Getter(mthis);
 
   static height_Getter(mthis) native "HTMLImageElement_height_Getter";
+  height_Getter_(mthis) => height_Getter(mthis);
 
-  static height_Setter(mthis, value) native "HTMLImageElement_height_Setter";
+  static height_Setter(mthis, __arg_0) native "HTMLImageElement_height_Setter";
+  height_Setter_(mthis, __arg_0) => height_Setter(mthis, __arg_0);
 
   static integrity_Getter(mthis) native "HTMLImageElement_integrity_Getter";
+  integrity_Getter_(mthis) => integrity_Getter(mthis);
 
-  static integrity_Setter(mthis, value) native "HTMLImageElement_integrity_Setter";
+  static integrity_Setter(mthis, __arg_0) native "HTMLImageElement_integrity_Setter";
+  integrity_Setter_(mthis, __arg_0) => integrity_Setter(mthis, __arg_0);
 
   static isMap_Getter(mthis) native "HTMLImageElement_isMap_Getter";
+  isMap_Getter_(mthis) => isMap_Getter(mthis);
 
-  static isMap_Setter(mthis, value) native "HTMLImageElement_isMap_Setter";
+  static isMap_Setter(mthis, __arg_0) native "HTMLImageElement_isMap_Setter";
+  isMap_Setter_(mthis, __arg_0) => isMap_Setter(mthis, __arg_0);
+
+  static lowsrc_Getter(mthis) native "HTMLImageElement_lowsrc_Getter";
+  lowsrc_Getter_(mthis) => lowsrc_Getter(mthis);
+
+  static lowsrc_Setter(mthis, __arg_0) native "HTMLImageElement_lowsrc_Setter";
+  lowsrc_Setter_(mthis, __arg_0) => lowsrc_Setter(mthis, __arg_0);
 
   static naturalHeight_Getter(mthis) native "HTMLImageElement_naturalHeight_Getter";
+  naturalHeight_Getter_(mthis) => naturalHeight_Getter(mthis);
 
   static naturalWidth_Getter(mthis) native "HTMLImageElement_naturalWidth_Getter";
+  naturalWidth_Getter_(mthis) => naturalWidth_Getter(mthis);
 
   static sizes_Getter(mthis) native "HTMLImageElement_sizes_Getter";
+  sizes_Getter_(mthis) => sizes_Getter(mthis);
 
-  static sizes_Setter(mthis, value) native "HTMLImageElement_sizes_Setter";
+  static sizes_Setter(mthis, __arg_0) native "HTMLImageElement_sizes_Setter";
+  sizes_Setter_(mthis, __arg_0) => sizes_Setter(mthis, __arg_0);
 
   static src_Getter(mthis) native "HTMLImageElement_src_Getter";
+  src_Getter_(mthis) => src_Getter(mthis);
 
-  static src_Setter(mthis, value) native "HTMLImageElement_src_Setter";
+  static src_Setter(mthis, __arg_0) native "HTMLImageElement_src_Setter";
+  src_Setter_(mthis, __arg_0) => src_Setter(mthis, __arg_0);
 
   static srcset_Getter(mthis) native "HTMLImageElement_srcset_Getter";
+  srcset_Getter_(mthis) => srcset_Getter(mthis);
 
-  static srcset_Setter(mthis, value) native "HTMLImageElement_srcset_Setter";
+  static srcset_Setter(mthis, __arg_0) native "HTMLImageElement_srcset_Setter";
+  srcset_Setter_(mthis, __arg_0) => srcset_Setter(mthis, __arg_0);
 
   static useMap_Getter(mthis) native "HTMLImageElement_useMap_Getter";
+  useMap_Getter_(mthis) => useMap_Getter(mthis);
 
-  static useMap_Setter(mthis, value) native "HTMLImageElement_useMap_Setter";
+  static useMap_Setter(mthis, __arg_0) native "HTMLImageElement_useMap_Setter";
+  useMap_Setter_(mthis, __arg_0) => useMap_Setter(mthis, __arg_0);
 
   static width_Getter(mthis) native "HTMLImageElement_width_Getter";
+  width_Getter_(mthis) => width_Getter(mthis);
 
-  static width_Setter(mthis, value) native "HTMLImageElement_width_Setter";
+  static width_Setter(mthis, __arg_0) native "HTMLImageElement_width_Setter";
+  width_Setter_(mthis, __arg_0) => width_Setter(mthis, __arg_0);
+
+  static x_Getter(mthis) native "HTMLImageElement_x_Getter";
+  x_Getter_(mthis) => x_Getter(mthis);
+
+  static y_Getter(mthis) native "HTMLImageElement_y_Getter";
+  y_Getter_(mthis) => y_Getter(mthis);
+
 }
 
-class BlinkHTMLInputElement {
-  static accept_Getter(mthis) native "HTMLInputElement_accept_Getter";
+class BlinkHTMLInputElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLInputElement();
 
-  static accept_Setter(mthis, value) native "HTMLInputElement_accept_Setter";
+  static accept_Getter(mthis) native "HTMLInputElement_accept_Getter";
+  accept_Getter_(mthis) => accept_Getter(mthis);
+
+  static accept_Setter(mthis, __arg_0) native "HTMLInputElement_accept_Setter";
+  accept_Setter_(mthis, __arg_0) => accept_Setter(mthis, __arg_0);
 
   static alt_Getter(mthis) native "HTMLInputElement_alt_Getter";
+  alt_Getter_(mthis) => alt_Getter(mthis);
 
-  static alt_Setter(mthis, value) native "HTMLInputElement_alt_Setter";
+  static alt_Setter(mthis, __arg_0) native "HTMLInputElement_alt_Setter";
+  alt_Setter_(mthis, __arg_0) => alt_Setter(mthis, __arg_0);
 
   static autocomplete_Getter(mthis) native "HTMLInputElement_autocomplete_Getter";
+  autocomplete_Getter_(mthis) => autocomplete_Getter(mthis);
 
-  static autocomplete_Setter(mthis, value) native "HTMLInputElement_autocomplete_Setter";
+  static autocomplete_Setter(mthis, __arg_0) native "HTMLInputElement_autocomplete_Setter";
+  autocomplete_Setter_(mthis, __arg_0) => autocomplete_Setter(mthis, __arg_0);
 
   static autofocus_Getter(mthis) native "HTMLInputElement_autofocus_Getter";
+  autofocus_Getter_(mthis) => autofocus_Getter(mthis);
 
-  static autofocus_Setter(mthis, value) native "HTMLInputElement_autofocus_Setter";
+  static autofocus_Setter(mthis, __arg_0) native "HTMLInputElement_autofocus_Setter";
+  autofocus_Setter_(mthis, __arg_0) => autofocus_Setter(mthis, __arg_0);
 
   static capture_Getter(mthis) native "HTMLInputElement_capture_Getter";
+  capture_Getter_(mthis) => capture_Getter(mthis);
 
-  static capture_Setter(mthis, value) native "HTMLInputElement_capture_Setter";
+  static capture_Setter(mthis, __arg_0) native "HTMLInputElement_capture_Setter";
+  capture_Setter_(mthis, __arg_0) => capture_Setter(mthis, __arg_0);
+
+  static checkValidity_Callback_0(mthis) native "HTMLInputElement_checkValidity_Callback";
+  checkValidity_Callback_0_(mthis) => checkValidity_Callback_0(mthis);
+
+  static checkValidity_Callback_1(mthis, __arg_0) native "HTMLInputElement_checkValidity_Callback";
+  checkValidity_Callback_1_(mthis, __arg_0) => checkValidity_Callback_1(mthis, __arg_0);
+
+  static checkValidity_Callback_2(mthis, __arg_0, __arg_1) native "HTMLInputElement_checkValidity_Callback";
+  checkValidity_Callback_2_(mthis, __arg_0, __arg_1) => checkValidity_Callback_2(mthis, __arg_0, __arg_1);
 
   static checked_Getter(mthis) native "HTMLInputElement_checked_Getter";
+  checked_Getter_(mthis) => checked_Getter(mthis);
 
-  static checked_Setter(mthis, value) native "HTMLInputElement_checked_Setter";
+  static checked_Setter(mthis, __arg_0) native "HTMLInputElement_checked_Setter";
+  checked_Setter_(mthis, __arg_0) => checked_Setter(mthis, __arg_0);
 
   static defaultChecked_Getter(mthis) native "HTMLInputElement_defaultChecked_Getter";
+  defaultChecked_Getter_(mthis) => defaultChecked_Getter(mthis);
 
-  static defaultChecked_Setter(mthis, value) native "HTMLInputElement_defaultChecked_Setter";
+  static defaultChecked_Setter(mthis, __arg_0) native "HTMLInputElement_defaultChecked_Setter";
+  defaultChecked_Setter_(mthis, __arg_0) => defaultChecked_Setter(mthis, __arg_0);
 
   static defaultValue_Getter(mthis) native "HTMLInputElement_defaultValue_Getter";
+  defaultValue_Getter_(mthis) => defaultValue_Getter(mthis);
 
-  static defaultValue_Setter(mthis, value) native "HTMLInputElement_defaultValue_Setter";
+  static defaultValue_Setter(mthis, __arg_0) native "HTMLInputElement_defaultValue_Setter";
+  defaultValue_Setter_(mthis, __arg_0) => defaultValue_Setter(mthis, __arg_0);
 
   static dirName_Getter(mthis) native "HTMLInputElement_dirName_Getter";
+  dirName_Getter_(mthis) => dirName_Getter(mthis);
 
-  static dirName_Setter(mthis, value) native "HTMLInputElement_dirName_Setter";
+  static dirName_Setter(mthis, __arg_0) native "HTMLInputElement_dirName_Setter";
+  dirName_Setter_(mthis, __arg_0) => dirName_Setter(mthis, __arg_0);
 
   static disabled_Getter(mthis) native "HTMLInputElement_disabled_Getter";
+  disabled_Getter_(mthis) => disabled_Getter(mthis);
 
-  static disabled_Setter(mthis, value) native "HTMLInputElement_disabled_Setter";
+  static disabled_Setter(mthis, __arg_0) native "HTMLInputElement_disabled_Setter";
+  disabled_Setter_(mthis, __arg_0) => disabled_Setter(mthis, __arg_0);
 
   static files_Getter(mthis) native "HTMLInputElement_files_Getter";
+  files_Getter_(mthis) => files_Getter(mthis);
 
-  static files_Setter(mthis, value) native "HTMLInputElement_files_Setter";
-
-  static form_Getter(mthis) native "HTMLInputElement_form_Getter";
+  static files_Setter(mthis, __arg_0) native "HTMLInputElement_files_Setter";
+  files_Setter_(mthis, __arg_0) => files_Setter(mthis, __arg_0);
 
   static formAction_Getter(mthis) native "HTMLInputElement_formAction_Getter";
+  formAction_Getter_(mthis) => formAction_Getter(mthis);
 
-  static formAction_Setter(mthis, value) native "HTMLInputElement_formAction_Setter";
+  static formAction_Setter(mthis, __arg_0) native "HTMLInputElement_formAction_Setter";
+  formAction_Setter_(mthis, __arg_0) => formAction_Setter(mthis, __arg_0);
 
   static formEnctype_Getter(mthis) native "HTMLInputElement_formEnctype_Getter";
+  formEnctype_Getter_(mthis) => formEnctype_Getter(mthis);
 
-  static formEnctype_Setter(mthis, value) native "HTMLInputElement_formEnctype_Setter";
+  static formEnctype_Setter(mthis, __arg_0) native "HTMLInputElement_formEnctype_Setter";
+  formEnctype_Setter_(mthis, __arg_0) => formEnctype_Setter(mthis, __arg_0);
 
   static formMethod_Getter(mthis) native "HTMLInputElement_formMethod_Getter";
+  formMethod_Getter_(mthis) => formMethod_Getter(mthis);
 
-  static formMethod_Setter(mthis, value) native "HTMLInputElement_formMethod_Setter";
+  static formMethod_Setter(mthis, __arg_0) native "HTMLInputElement_formMethod_Setter";
+  formMethod_Setter_(mthis, __arg_0) => formMethod_Setter(mthis, __arg_0);
 
   static formNoValidate_Getter(mthis) native "HTMLInputElement_formNoValidate_Getter";
+  formNoValidate_Getter_(mthis) => formNoValidate_Getter(mthis);
 
-  static formNoValidate_Setter(mthis, value) native "HTMLInputElement_formNoValidate_Setter";
+  static formNoValidate_Setter(mthis, __arg_0) native "HTMLInputElement_formNoValidate_Setter";
+  formNoValidate_Setter_(mthis, __arg_0) => formNoValidate_Setter(mthis, __arg_0);
 
   static formTarget_Getter(mthis) native "HTMLInputElement_formTarget_Getter";
+  formTarget_Getter_(mthis) => formTarget_Getter(mthis);
 
-  static formTarget_Setter(mthis, value) native "HTMLInputElement_formTarget_Setter";
+  static formTarget_Setter(mthis, __arg_0) native "HTMLInputElement_formTarget_Setter";
+  formTarget_Setter_(mthis, __arg_0) => formTarget_Setter(mthis, __arg_0);
+
+  static form_Getter(mthis) native "HTMLInputElement_form_Getter";
+  form_Getter_(mthis) => form_Getter(mthis);
 
   static height_Getter(mthis) native "HTMLInputElement_height_Getter";
+  height_Getter_(mthis) => height_Getter(mthis);
 
-  static height_Setter(mthis, value) native "HTMLInputElement_height_Setter";
+  static height_Setter(mthis, __arg_0) native "HTMLInputElement_height_Setter";
+  height_Setter_(mthis, __arg_0) => height_Setter(mthis, __arg_0);
 
   static incremental_Getter(mthis) native "HTMLInputElement_incremental_Getter";
+  incremental_Getter_(mthis) => incremental_Getter(mthis);
 
-  static incremental_Setter(mthis, value) native "HTMLInputElement_incremental_Setter";
+  static incremental_Setter(mthis, __arg_0) native "HTMLInputElement_incremental_Setter";
+  incremental_Setter_(mthis, __arg_0) => incremental_Setter(mthis, __arg_0);
 
   static indeterminate_Getter(mthis) native "HTMLInputElement_indeterminate_Getter";
+  indeterminate_Getter_(mthis) => indeterminate_Getter(mthis);
 
-  static indeterminate_Setter(mthis, value) native "HTMLInputElement_indeterminate_Setter";
+  static indeterminate_Setter(mthis, __arg_0) native "HTMLInputElement_indeterminate_Setter";
+  indeterminate_Setter_(mthis, __arg_0) => indeterminate_Setter(mthis, __arg_0);
 
   static inputMode_Getter(mthis) native "HTMLInputElement_inputMode_Getter";
+  inputMode_Getter_(mthis) => inputMode_Getter(mthis);
 
-  static inputMode_Setter(mthis, value) native "HTMLInputElement_inputMode_Setter";
+  static inputMode_Setter(mthis, __arg_0) native "HTMLInputElement_inputMode_Setter";
+  inputMode_Setter_(mthis, __arg_0) => inputMode_Setter(mthis, __arg_0);
 
   static labels_Getter(mthis) native "HTMLInputElement_labels_Getter";
+  labels_Getter_(mthis) => labels_Getter(mthis);
 
   static list_Getter(mthis) native "HTMLInputElement_list_Getter";
-
-  static max_Getter(mthis) native "HTMLInputElement_max_Getter";
-
-  static max_Setter(mthis, value) native "HTMLInputElement_max_Setter";
+  list_Getter_(mthis) => list_Getter(mthis);
 
   static maxLength_Getter(mthis) native "HTMLInputElement_maxLength_Getter";
+  maxLength_Getter_(mthis) => maxLength_Getter(mthis);
 
-  static maxLength_Setter(mthis, value) native "HTMLInputElement_maxLength_Setter";
+  static maxLength_Setter(mthis, __arg_0) native "HTMLInputElement_maxLength_Setter";
+  maxLength_Setter_(mthis, __arg_0) => maxLength_Setter(mthis, __arg_0);
+
+  static max_Getter(mthis) native "HTMLInputElement_max_Getter";
+  max_Getter_(mthis) => max_Getter(mthis);
+
+  static max_Setter(mthis, __arg_0) native "HTMLInputElement_max_Setter";
+  max_Setter_(mthis, __arg_0) => max_Setter(mthis, __arg_0);
 
   static min_Getter(mthis) native "HTMLInputElement_min_Getter";
+  min_Getter_(mthis) => min_Getter(mthis);
 
-  static min_Setter(mthis, value) native "HTMLInputElement_min_Setter";
+  static min_Setter(mthis, __arg_0) native "HTMLInputElement_min_Setter";
+  min_Setter_(mthis, __arg_0) => min_Setter(mthis, __arg_0);
 
   static multiple_Getter(mthis) native "HTMLInputElement_multiple_Getter";
+  multiple_Getter_(mthis) => multiple_Getter(mthis);
 
-  static multiple_Setter(mthis, value) native "HTMLInputElement_multiple_Setter";
+  static multiple_Setter(mthis, __arg_0) native "HTMLInputElement_multiple_Setter";
+  multiple_Setter_(mthis, __arg_0) => multiple_Setter(mthis, __arg_0);
 
   static name_Getter(mthis) native "HTMLInputElement_name_Getter";
+  name_Getter_(mthis) => name_Getter(mthis);
 
-  static name_Setter(mthis, value) native "HTMLInputElement_name_Setter";
+  static name_Setter(mthis, __arg_0) native "HTMLInputElement_name_Setter";
+  name_Setter_(mthis, __arg_0) => name_Setter(mthis, __arg_0);
 
   static pattern_Getter(mthis) native "HTMLInputElement_pattern_Getter";
+  pattern_Getter_(mthis) => pattern_Getter(mthis);
 
-  static pattern_Setter(mthis, value) native "HTMLInputElement_pattern_Setter";
+  static pattern_Setter(mthis, __arg_0) native "HTMLInputElement_pattern_Setter";
+  pattern_Setter_(mthis, __arg_0) => pattern_Setter(mthis, __arg_0);
 
   static placeholder_Getter(mthis) native "HTMLInputElement_placeholder_Getter";
+  placeholder_Getter_(mthis) => placeholder_Getter(mthis);
 
-  static placeholder_Setter(mthis, value) native "HTMLInputElement_placeholder_Setter";
+  static placeholder_Setter(mthis, __arg_0) native "HTMLInputElement_placeholder_Setter";
+  placeholder_Setter_(mthis, __arg_0) => placeholder_Setter(mthis, __arg_0);
 
   static readOnly_Getter(mthis) native "HTMLInputElement_readOnly_Getter";
+  readOnly_Getter_(mthis) => readOnly_Getter(mthis);
 
-  static readOnly_Setter(mthis, value) native "HTMLInputElement_readOnly_Setter";
+  static readOnly_Setter(mthis, __arg_0) native "HTMLInputElement_readOnly_Setter";
+  readOnly_Setter_(mthis, __arg_0) => readOnly_Setter(mthis, __arg_0);
 
   static required_Getter(mthis) native "HTMLInputElement_required_Getter";
+  required_Getter_(mthis) => required_Getter(mthis);
 
-  static required_Setter(mthis, value) native "HTMLInputElement_required_Setter";
+  static required_Setter(mthis, __arg_0) native "HTMLInputElement_required_Setter";
+  required_Setter_(mthis, __arg_0) => required_Setter(mthis, __arg_0);
+
+  static select_Callback_0(mthis) native "HTMLInputElement_select_Callback";
+  select_Callback_0_(mthis) => select_Callback_0(mthis);
+
+  static select_Callback_1(mthis, __arg_0) native "HTMLInputElement_select_Callback";
+  select_Callback_1_(mthis, __arg_0) => select_Callback_1(mthis, __arg_0);
+
+  static select_Callback_2(mthis, __arg_0, __arg_1) native "HTMLInputElement_select_Callback";
+  select_Callback_2_(mthis, __arg_0, __arg_1) => select_Callback_2(mthis, __arg_0, __arg_1);
 
   static selectionDirection_Getter(mthis) native "HTMLInputElement_selectionDirection_Getter";
+  selectionDirection_Getter_(mthis) => selectionDirection_Getter(mthis);
 
-  static selectionDirection_Setter(mthis, value) native "HTMLInputElement_selectionDirection_Setter";
+  static selectionDirection_Setter(mthis, __arg_0) native "HTMLInputElement_selectionDirection_Setter";
+  selectionDirection_Setter_(mthis, __arg_0) => selectionDirection_Setter(mthis, __arg_0);
 
   static selectionEnd_Getter(mthis) native "HTMLInputElement_selectionEnd_Getter";
+  selectionEnd_Getter_(mthis) => selectionEnd_Getter(mthis);
 
-  static selectionEnd_Setter(mthis, value) native "HTMLInputElement_selectionEnd_Setter";
+  static selectionEnd_Setter(mthis, __arg_0) native "HTMLInputElement_selectionEnd_Setter";
+  selectionEnd_Setter_(mthis, __arg_0) => selectionEnd_Setter(mthis, __arg_0);
 
   static selectionStart_Getter(mthis) native "HTMLInputElement_selectionStart_Getter";
+  selectionStart_Getter_(mthis) => selectionStart_Getter(mthis);
 
-  static selectionStart_Setter(mthis, value) native "HTMLInputElement_selectionStart_Setter";
+  static selectionStart_Setter(mthis, __arg_0) native "HTMLInputElement_selectionStart_Setter";
+  selectionStart_Setter_(mthis, __arg_0) => selectionStart_Setter(mthis, __arg_0);
+
+  static setCustomValidity_Callback_0(mthis) native "HTMLInputElement_setCustomValidity_Callback";
+  setCustomValidity_Callback_0_(mthis) => setCustomValidity_Callback_0(mthis);
+
+  static setCustomValidity_Callback_1(mthis, __arg_0) native "HTMLInputElement_setCustomValidity_Callback";
+  setCustomValidity_Callback_1_(mthis, __arg_0) => setCustomValidity_Callback_1(mthis, __arg_0);
+
+  static setCustomValidity_Callback_2(mthis, __arg_0, __arg_1) native "HTMLInputElement_setCustomValidity_Callback";
+  setCustomValidity_Callback_2_(mthis, __arg_0, __arg_1) => setCustomValidity_Callback_2(mthis, __arg_0, __arg_1);
+
+  static setCustomValidity_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "HTMLInputElement_setCustomValidity_Callback";
+  setCustomValidity_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => setCustomValidity_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static setRangeText_Callback_0(mthis) native "HTMLInputElement_setRangeText_Callback";
+  setRangeText_Callback_0_(mthis) => setRangeText_Callback_0(mthis);
+
+  static setRangeText_Callback_1(mthis, __arg_0) native "HTMLInputElement_setRangeText_Callback";
+  setRangeText_Callback_1_(mthis, __arg_0) => setRangeText_Callback_1(mthis, __arg_0);
+
+  static setRangeText_Callback_2(mthis, __arg_0, __arg_1) native "HTMLInputElement_setRangeText_Callback";
+  setRangeText_Callback_2_(mthis, __arg_0, __arg_1) => setRangeText_Callback_2(mthis, __arg_0, __arg_1);
+
+  static setRangeText_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "HTMLInputElement_setRangeText_Callback";
+  setRangeText_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => setRangeText_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static setRangeText_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "HTMLInputElement_setRangeText_Callback";
+  setRangeText_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => setRangeText_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static setRangeText_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "HTMLInputElement_setRangeText_Callback";
+  setRangeText_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => setRangeText_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static setRangeText_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "HTMLInputElement_setRangeText_Callback";
+  setRangeText_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => setRangeText_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static setSelectionRange_Callback_0(mthis) native "HTMLInputElement_setSelectionRange_Callback";
+  setSelectionRange_Callback_0_(mthis) => setSelectionRange_Callback_0(mthis);
+
+  static setSelectionRange_Callback_1(mthis, __arg_0) native "HTMLInputElement_setSelectionRange_Callback";
+  setSelectionRange_Callback_1_(mthis, __arg_0) => setSelectionRange_Callback_1(mthis, __arg_0);
+
+  static setSelectionRange_Callback_2(mthis, __arg_0, __arg_1) native "HTMLInputElement_setSelectionRange_Callback";
+  setSelectionRange_Callback_2_(mthis, __arg_0, __arg_1) => setSelectionRange_Callback_2(mthis, __arg_0, __arg_1);
+
+  static setSelectionRange_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "HTMLInputElement_setSelectionRange_Callback";
+  setSelectionRange_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => setSelectionRange_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static setSelectionRange_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "HTMLInputElement_setSelectionRange_Callback";
+  setSelectionRange_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => setSelectionRange_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static setSelectionRange_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "HTMLInputElement_setSelectionRange_Callback";
+  setSelectionRange_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => setSelectionRange_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
 
   static size_Getter(mthis) native "HTMLInputElement_size_Getter";
+  size_Getter_(mthis) => size_Getter(mthis);
 
-  static size_Setter(mthis, value) native "HTMLInputElement_size_Setter";
+  static size_Setter(mthis, __arg_0) native "HTMLInputElement_size_Setter";
+  size_Setter_(mthis, __arg_0) => size_Setter(mthis, __arg_0);
 
   static src_Getter(mthis) native "HTMLInputElement_src_Getter";
+  src_Getter_(mthis) => src_Getter(mthis);
 
-  static src_Setter(mthis, value) native "HTMLInputElement_src_Setter";
+  static src_Setter(mthis, __arg_0) native "HTMLInputElement_src_Setter";
+  src_Setter_(mthis, __arg_0) => src_Setter(mthis, __arg_0);
+
+  static stepDown_Callback_0(mthis) native "HTMLInputElement_stepDown_Callback";
+  stepDown_Callback_0_(mthis) => stepDown_Callback_0(mthis);
+
+  static stepDown_Callback_1(mthis, __arg_0) native "HTMLInputElement_stepDown_Callback";
+  stepDown_Callback_1_(mthis, __arg_0) => stepDown_Callback_1(mthis, __arg_0);
+
+  static stepDown_Callback_2(mthis, __arg_0, __arg_1) native "HTMLInputElement_stepDown_Callback";
+  stepDown_Callback_2_(mthis, __arg_0, __arg_1) => stepDown_Callback_2(mthis, __arg_0, __arg_1);
+
+  static stepDown_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "HTMLInputElement_stepDown_Callback";
+  stepDown_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => stepDown_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static stepUp_Callback_0(mthis) native "HTMLInputElement_stepUp_Callback";
+  stepUp_Callback_0_(mthis) => stepUp_Callback_0(mthis);
+
+  static stepUp_Callback_1(mthis, __arg_0) native "HTMLInputElement_stepUp_Callback";
+  stepUp_Callback_1_(mthis, __arg_0) => stepUp_Callback_1(mthis, __arg_0);
+
+  static stepUp_Callback_2(mthis, __arg_0, __arg_1) native "HTMLInputElement_stepUp_Callback";
+  stepUp_Callback_2_(mthis, __arg_0, __arg_1) => stepUp_Callback_2(mthis, __arg_0, __arg_1);
+
+  static stepUp_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "HTMLInputElement_stepUp_Callback";
+  stepUp_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => stepUp_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
   static step_Getter(mthis) native "HTMLInputElement_step_Getter";
+  step_Getter_(mthis) => step_Getter(mthis);
 
-  static step_Setter(mthis, value) native "HTMLInputElement_step_Setter";
+  static step_Setter(mthis, __arg_0) native "HTMLInputElement_step_Setter";
+  step_Setter_(mthis, __arg_0) => step_Setter(mthis, __arg_0);
 
   static type_Getter(mthis) native "HTMLInputElement_type_Getter";
+  type_Getter_(mthis) => type_Getter(mthis);
 
-  static type_Setter(mthis, value) native "HTMLInputElement_type_Setter";
+  static type_Setter(mthis, __arg_0) native "HTMLInputElement_type_Setter";
+  type_Setter_(mthis, __arg_0) => type_Setter(mthis, __arg_0);
+
+  static useMap_Getter(mthis) native "HTMLInputElement_useMap_Getter";
+  useMap_Getter_(mthis) => useMap_Getter(mthis);
+
+  static useMap_Setter(mthis, __arg_0) native "HTMLInputElement_useMap_Setter";
+  useMap_Setter_(mthis, __arg_0) => useMap_Setter(mthis, __arg_0);
 
   static validationMessage_Getter(mthis) native "HTMLInputElement_validationMessage_Getter";
+  validationMessage_Getter_(mthis) => validationMessage_Getter(mthis);
 
   static validity_Getter(mthis) native "HTMLInputElement_validity_Getter";
-
-  static value_Getter(mthis) native "HTMLInputElement_value_Getter";
-
-  static value_Setter(mthis, value) native "HTMLInputElement_value_Setter";
+  validity_Getter_(mthis) => validity_Getter(mthis);
 
   static valueAsDate_Getter(mthis) native "HTMLInputElement_valueAsDate_Getter";
+  valueAsDate_Getter_(mthis) => valueAsDate_Getter(mthis);
 
-  static valueAsDate_Setter(mthis, value) native "HTMLInputElement_valueAsDate_Setter";
+  static valueAsDate_Setter(mthis, __arg_0) native "HTMLInputElement_valueAsDate_Setter";
+  valueAsDate_Setter_(mthis, __arg_0) => valueAsDate_Setter(mthis, __arg_0);
 
   static valueAsNumber_Getter(mthis) native "HTMLInputElement_valueAsNumber_Getter";
+  valueAsNumber_Getter_(mthis) => valueAsNumber_Getter(mthis);
 
-  static valueAsNumber_Setter(mthis, value) native "HTMLInputElement_valueAsNumber_Setter";
+  static valueAsNumber_Setter(mthis, __arg_0) native "HTMLInputElement_valueAsNumber_Setter";
+  valueAsNumber_Setter_(mthis, __arg_0) => valueAsNumber_Setter(mthis, __arg_0);
+
+  static value_Getter(mthis) native "HTMLInputElement_value_Getter";
+  value_Getter_(mthis) => value_Getter(mthis);
+
+  static value_Setter(mthis, __arg_0) native "HTMLInputElement_value_Setter";
+  value_Setter_(mthis, __arg_0) => value_Setter(mthis, __arg_0);
 
   static webkitEntries_Getter(mthis) native "HTMLInputElement_webkitEntries_Getter";
+  webkitEntries_Getter_(mthis) => webkitEntries_Getter(mthis);
 
   static webkitdirectory_Getter(mthis) native "HTMLInputElement_webkitdirectory_Getter";
+  webkitdirectory_Getter_(mthis) => webkitdirectory_Getter(mthis);
 
-  static webkitdirectory_Setter(mthis, value) native "HTMLInputElement_webkitdirectory_Setter";
+  static webkitdirectory_Setter(mthis, __arg_0) native "HTMLInputElement_webkitdirectory_Setter";
+  webkitdirectory_Setter_(mthis, __arg_0) => webkitdirectory_Setter(mthis, __arg_0);
 
   static width_Getter(mthis) native "HTMLInputElement_width_Getter";
+  width_Getter_(mthis) => width_Getter(mthis);
 
-  static width_Setter(mthis, value) native "HTMLInputElement_width_Setter";
+  static width_Setter(mthis, __arg_0) native "HTMLInputElement_width_Setter";
+  width_Setter_(mthis, __arg_0) => width_Setter(mthis, __arg_0);
 
   static willValidate_Getter(mthis) native "HTMLInputElement_willValidate_Getter";
+  willValidate_Getter_(mthis) => willValidate_Getter(mthis);
 
-  static checkValidity_Callback(mthis) native "HTMLInputElement_checkValidity_Callback";
-
-  static select_Callback(mthis) native "HTMLInputElement_select_Callback";
-
-  static setCustomValidity_Callback_1(mthis, error) native "HTMLInputElement_setCustomValidity_Callback";
-
-  static setRangeText_Callback_1(mthis, replacement) native "HTMLInputElement_setRangeText_Callback";
-
-  static setRangeText_Callback_4(mthis, replacement, start, end, selectionMode) native "HTMLInputElement_setRangeText_Callback";
-
-  static setSelectionRange_Callback_3(mthis, start, end, direction) native "HTMLInputElement_setSelectionRange_Callback";
-
-  static setSelectionRange_Callback_2(mthis, start, end) native "HTMLInputElement_setSelectionRange_Callback";
-
-  static stepDown_Callback_1(mthis, n) native "HTMLInputElement_stepDown_Callback";
-
-  static stepDown_Callback(mthis) native "HTMLInputElement_stepDown_Callback";
-
-  static stepUp_Callback_1(mthis, n) native "HTMLInputElement_stepUp_Callback";
-
-  static stepUp_Callback(mthis) native "HTMLInputElement_stepUp_Callback";
 }
 
-class BlinkHTMLKeygenElement {
-  static autofocus_Getter(mthis) native "HTMLKeygenElement_autofocus_Getter";
+class BlinkHTMLKeygenElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLKeygenElement();
 
-  static autofocus_Setter(mthis, value) native "HTMLKeygenElement_autofocus_Setter";
+  static autofocus_Getter(mthis) native "HTMLKeygenElement_autofocus_Getter";
+  autofocus_Getter_(mthis) => autofocus_Getter(mthis);
+
+  static autofocus_Setter(mthis, __arg_0) native "HTMLKeygenElement_autofocus_Setter";
+  autofocus_Setter_(mthis, __arg_0) => autofocus_Setter(mthis, __arg_0);
 
   static challenge_Getter(mthis) native "HTMLKeygenElement_challenge_Getter";
+  challenge_Getter_(mthis) => challenge_Getter(mthis);
 
-  static challenge_Setter(mthis, value) native "HTMLKeygenElement_challenge_Setter";
+  static challenge_Setter(mthis, __arg_0) native "HTMLKeygenElement_challenge_Setter";
+  challenge_Setter_(mthis, __arg_0) => challenge_Setter(mthis, __arg_0);
+
+  static checkValidity_Callback_0(mthis) native "HTMLKeygenElement_checkValidity_Callback";
+  checkValidity_Callback_0_(mthis) => checkValidity_Callback_0(mthis);
+
+  static checkValidity_Callback_1(mthis, __arg_0) native "HTMLKeygenElement_checkValidity_Callback";
+  checkValidity_Callback_1_(mthis, __arg_0) => checkValidity_Callback_1(mthis, __arg_0);
+
+  static checkValidity_Callback_2(mthis, __arg_0, __arg_1) native "HTMLKeygenElement_checkValidity_Callback";
+  checkValidity_Callback_2_(mthis, __arg_0, __arg_1) => checkValidity_Callback_2(mthis, __arg_0, __arg_1);
 
   static disabled_Getter(mthis) native "HTMLKeygenElement_disabled_Getter";
+  disabled_Getter_(mthis) => disabled_Getter(mthis);
 
-  static disabled_Setter(mthis, value) native "HTMLKeygenElement_disabled_Setter";
+  static disabled_Setter(mthis, __arg_0) native "HTMLKeygenElement_disabled_Setter";
+  disabled_Setter_(mthis, __arg_0) => disabled_Setter(mthis, __arg_0);
 
   static form_Getter(mthis) native "HTMLKeygenElement_form_Getter";
+  form_Getter_(mthis) => form_Getter(mthis);
 
   static keytype_Getter(mthis) native "HTMLKeygenElement_keytype_Getter";
+  keytype_Getter_(mthis) => keytype_Getter(mthis);
 
-  static keytype_Setter(mthis, value) native "HTMLKeygenElement_keytype_Setter";
+  static keytype_Setter(mthis, __arg_0) native "HTMLKeygenElement_keytype_Setter";
+  keytype_Setter_(mthis, __arg_0) => keytype_Setter(mthis, __arg_0);
 
   static labels_Getter(mthis) native "HTMLKeygenElement_labels_Getter";
+  labels_Getter_(mthis) => labels_Getter(mthis);
 
   static name_Getter(mthis) native "HTMLKeygenElement_name_Getter";
+  name_Getter_(mthis) => name_Getter(mthis);
 
-  static name_Setter(mthis, value) native "HTMLKeygenElement_name_Setter";
+  static name_Setter(mthis, __arg_0) native "HTMLKeygenElement_name_Setter";
+  name_Setter_(mthis, __arg_0) => name_Setter(mthis, __arg_0);
+
+  static setCustomValidity_Callback_0(mthis) native "HTMLKeygenElement_setCustomValidity_Callback";
+  setCustomValidity_Callback_0_(mthis) => setCustomValidity_Callback_0(mthis);
+
+  static setCustomValidity_Callback_1(mthis, __arg_0) native "HTMLKeygenElement_setCustomValidity_Callback";
+  setCustomValidity_Callback_1_(mthis, __arg_0) => setCustomValidity_Callback_1(mthis, __arg_0);
+
+  static setCustomValidity_Callback_2(mthis, __arg_0, __arg_1) native "HTMLKeygenElement_setCustomValidity_Callback";
+  setCustomValidity_Callback_2_(mthis, __arg_0, __arg_1) => setCustomValidity_Callback_2(mthis, __arg_0, __arg_1);
+
+  static setCustomValidity_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "HTMLKeygenElement_setCustomValidity_Callback";
+  setCustomValidity_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => setCustomValidity_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
   static type_Getter(mthis) native "HTMLKeygenElement_type_Getter";
+  type_Getter_(mthis) => type_Getter(mthis);
 
   static validationMessage_Getter(mthis) native "HTMLKeygenElement_validationMessage_Getter";
+  validationMessage_Getter_(mthis) => validationMessage_Getter(mthis);
 
   static validity_Getter(mthis) native "HTMLKeygenElement_validity_Getter";
+  validity_Getter_(mthis) => validity_Getter(mthis);
 
   static willValidate_Getter(mthis) native "HTMLKeygenElement_willValidate_Getter";
+  willValidate_Getter_(mthis) => willValidate_Getter(mthis);
 
-  static checkValidity_Callback(mthis) native "HTMLKeygenElement_checkValidity_Callback";
-
-  static setCustomValidity_Callback_1(mthis, error) native "HTMLKeygenElement_setCustomValidity_Callback";
 }
 
-class BlinkHTMLLIElement {
+class BlinkHTMLLIElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLLIElement();
+
+  static type_Getter(mthis) native "HTMLLIElement_type_Getter";
+  type_Getter_(mthis) => type_Getter(mthis);
+
+  static type_Setter(mthis, __arg_0) native "HTMLLIElement_type_Setter";
+  type_Setter_(mthis, __arg_0) => type_Setter(mthis, __arg_0);
+
   static value_Getter(mthis) native "HTMLLIElement_value_Getter";
+  value_Getter_(mthis) => value_Getter(mthis);
 
-  static value_Setter(mthis, value) native "HTMLLIElement_value_Setter";
+  static value_Setter(mthis, __arg_0) native "HTMLLIElement_value_Setter";
+  value_Setter_(mthis, __arg_0) => value_Setter(mthis, __arg_0);
+
 }
 
-class BlinkHTMLLabelElement {
+class BlinkHTMLLabelElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLLabelElement();
+
   static control_Getter(mthis) native "HTMLLabelElement_control_Getter";
+  control_Getter_(mthis) => control_Getter(mthis);
 
   static form_Getter(mthis) native "HTMLLabelElement_form_Getter";
+  form_Getter_(mthis) => form_Getter(mthis);
 
   static htmlFor_Getter(mthis) native "HTMLLabelElement_htmlFor_Getter";
+  htmlFor_Getter_(mthis) => htmlFor_Getter(mthis);
 
-  static htmlFor_Setter(mthis, value) native "HTMLLabelElement_htmlFor_Setter";
+  static htmlFor_Setter(mthis, __arg_0) native "HTMLLabelElement_htmlFor_Setter";
+  htmlFor_Setter_(mthis, __arg_0) => htmlFor_Setter(mthis, __arg_0);
+
 }
 
-class BlinkHTMLLegendElement {
+class BlinkHTMLLegendElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLLegendElement();
+
   static form_Getter(mthis) native "HTMLLegendElement_form_Getter";
+  form_Getter_(mthis) => form_Getter(mthis);
+
 }
 
-class BlinkHTMLLinkElement {
-  static crossOrigin_Getter(mthis) native "HTMLLinkElement_crossOrigin_Getter";
+class BlinkHTMLLinkElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLLinkElement();
 
-  static crossOrigin_Setter(mthis, value) native "HTMLLinkElement_crossOrigin_Setter";
+  static crossOrigin_Getter(mthis) native "HTMLLinkElement_crossOrigin_Getter";
+  crossOrigin_Getter_(mthis) => crossOrigin_Getter(mthis);
+
+  static crossOrigin_Setter(mthis, __arg_0) native "HTMLLinkElement_crossOrigin_Setter";
+  crossOrigin_Setter_(mthis, __arg_0) => crossOrigin_Setter(mthis, __arg_0);
 
   static disabled_Getter(mthis) native "HTMLLinkElement_disabled_Getter";
+  disabled_Getter_(mthis) => disabled_Getter(mthis);
 
-  static disabled_Setter(mthis, value) native "HTMLLinkElement_disabled_Setter";
+  static disabled_Setter(mthis, __arg_0) native "HTMLLinkElement_disabled_Setter";
+  disabled_Setter_(mthis, __arg_0) => disabled_Setter(mthis, __arg_0);
 
   static href_Getter(mthis) native "HTMLLinkElement_href_Getter";
+  href_Getter_(mthis) => href_Getter(mthis);
 
-  static href_Setter(mthis, value) native "HTMLLinkElement_href_Setter";
+  static href_Setter(mthis, __arg_0) native "HTMLLinkElement_href_Setter";
+  href_Setter_(mthis, __arg_0) => href_Setter(mthis, __arg_0);
 
   static hreflang_Getter(mthis) native "HTMLLinkElement_hreflang_Getter";
+  hreflang_Getter_(mthis) => hreflang_Getter(mthis);
 
-  static hreflang_Setter(mthis, value) native "HTMLLinkElement_hreflang_Setter";
+  static hreflang_Setter(mthis, __arg_0) native "HTMLLinkElement_hreflang_Setter";
+  hreflang_Setter_(mthis, __arg_0) => hreflang_Setter(mthis, __arg_0);
 
   static import_Getter(mthis) native "HTMLLinkElement_import_Getter";
+  import_Getter_(mthis) => import_Getter(mthis);
 
   static integrity_Getter(mthis) native "HTMLLinkElement_integrity_Getter";
+  integrity_Getter_(mthis) => integrity_Getter(mthis);
 
-  static integrity_Setter(mthis, value) native "HTMLLinkElement_integrity_Setter";
+  static integrity_Setter(mthis, __arg_0) native "HTMLLinkElement_integrity_Setter";
+  integrity_Setter_(mthis, __arg_0) => integrity_Setter(mthis, __arg_0);
 
   static media_Getter(mthis) native "HTMLLinkElement_media_Getter";
+  media_Getter_(mthis) => media_Getter(mthis);
 
-  static media_Setter(mthis, value) native "HTMLLinkElement_media_Setter";
+  static media_Setter(mthis, __arg_0) native "HTMLLinkElement_media_Setter";
+  media_Setter_(mthis, __arg_0) => media_Setter(mthis, __arg_0);
 
   static rel_Getter(mthis) native "HTMLLinkElement_rel_Getter";
+  rel_Getter_(mthis) => rel_Getter(mthis);
 
-  static rel_Setter(mthis, value) native "HTMLLinkElement_rel_Setter";
+  static rel_Setter(mthis, __arg_0) native "HTMLLinkElement_rel_Setter";
+  rel_Setter_(mthis, __arg_0) => rel_Setter(mthis, __arg_0);
 
   static sheet_Getter(mthis) native "HTMLLinkElement_sheet_Getter";
+  sheet_Getter_(mthis) => sheet_Getter(mthis);
 
   static sizes_Getter(mthis) native "HTMLLinkElement_sizes_Getter";
+  sizes_Getter_(mthis) => sizes_Getter(mthis);
+
+  static sizes_Setter(mthis, __arg_0) native "HTMLLinkElement_sizes_Setter";
+  sizes_Setter_(mthis, __arg_0) => sizes_Setter(mthis, __arg_0);
 
   static type_Getter(mthis) native "HTMLLinkElement_type_Getter";
+  type_Getter_(mthis) => type_Getter(mthis);
 
-  static type_Setter(mthis, value) native "HTMLLinkElement_type_Setter";
+  static type_Setter(mthis, __arg_0) native "HTMLLinkElement_type_Setter";
+  type_Setter_(mthis, __arg_0) => type_Setter(mthis, __arg_0);
+
 }
 
-class BlinkHTMLMapElement {
+class BlinkHTMLMapElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLMapElement();
+
   static areas_Getter(mthis) native "HTMLMapElement_areas_Getter";
+  areas_Getter_(mthis) => areas_Getter(mthis);
 
   static name_Getter(mthis) native "HTMLMapElement_name_Getter";
+  name_Getter_(mthis) => name_Getter(mthis);
 
-  static name_Setter(mthis, value) native "HTMLMapElement_name_Setter";
+  static name_Setter(mthis, __arg_0) native "HTMLMapElement_name_Setter";
+  name_Setter_(mthis, __arg_0) => name_Setter(mthis, __arg_0);
+
 }
 
-class BlinkHTMLMarqueeElement {}
+class BlinkHTMLMarqueeElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLMarqueeElement();
 
-class BlinkHTMLMenuElement {
+}
+
+class BlinkHTMLMediaElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLMediaElement();
+
+  static addTextTrack_Callback_0(mthis) native "HTMLMediaElement_addTextTrack_Callback";
+  addTextTrack_Callback_0_(mthis) => addTextTrack_Callback_0(mthis);
+
+  static addTextTrack_Callback_1(mthis, __arg_0) native "HTMLMediaElement_addTextTrack_Callback";
+  addTextTrack_Callback_1_(mthis, __arg_0) => addTextTrack_Callback_1(mthis, __arg_0);
+
+  static addTextTrack_Callback_2(mthis, __arg_0, __arg_1) native "HTMLMediaElement_addTextTrack_Callback";
+  addTextTrack_Callback_2_(mthis, __arg_0, __arg_1) => addTextTrack_Callback_2(mthis, __arg_0, __arg_1);
+
+  static addTextTrack_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "HTMLMediaElement_addTextTrack_Callback";
+  addTextTrack_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => addTextTrack_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static addTextTrack_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "HTMLMediaElement_addTextTrack_Callback";
+  addTextTrack_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => addTextTrack_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static addTextTrack_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "HTMLMediaElement_addTextTrack_Callback";
+  addTextTrack_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => addTextTrack_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static audioTracks_Getter(mthis) native "HTMLMediaElement_audioTracks_Getter";
+  audioTracks_Getter_(mthis) => audioTracks_Getter(mthis);
+
+  static autoplay_Getter(mthis) native "HTMLMediaElement_autoplay_Getter";
+  autoplay_Getter_(mthis) => autoplay_Getter(mthis);
+
+  static autoplay_Setter(mthis, __arg_0) native "HTMLMediaElement_autoplay_Setter";
+  autoplay_Setter_(mthis, __arg_0) => autoplay_Setter(mthis, __arg_0);
+
+  static buffered_Getter(mthis) native "HTMLMediaElement_buffered_Getter";
+  buffered_Getter_(mthis) => buffered_Getter(mthis);
+
+  static canPlayType_Callback_0(mthis) native "HTMLMediaElement_canPlayType_Callback";
+  canPlayType_Callback_0_(mthis) => canPlayType_Callback_0(mthis);
+
+  static canPlayType_Callback_1(mthis, __arg_0) native "HTMLMediaElement_canPlayType_Callback";
+  canPlayType_Callback_1_(mthis, __arg_0) => canPlayType_Callback_1(mthis, __arg_0);
+
+  static canPlayType_Callback_2(mthis, __arg_0, __arg_1) native "HTMLMediaElement_canPlayType_Callback";
+  canPlayType_Callback_2_(mthis, __arg_0, __arg_1) => canPlayType_Callback_2(mthis, __arg_0, __arg_1);
+
+  static canPlayType_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "HTMLMediaElement_canPlayType_Callback";
+  canPlayType_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => canPlayType_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static canPlayType_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "HTMLMediaElement_canPlayType_Callback";
+  canPlayType_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => canPlayType_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static controller_Getter(mthis) native "HTMLMediaElement_controller_Getter";
+  controller_Getter_(mthis) => controller_Getter(mthis);
+
+  static controller_Setter(mthis, __arg_0) native "HTMLMediaElement_controller_Setter";
+  controller_Setter_(mthis, __arg_0) => controller_Setter(mthis, __arg_0);
+
+  static controls_Getter(mthis) native "HTMLMediaElement_controls_Getter";
+  controls_Getter_(mthis) => controls_Getter(mthis);
+
+  static controls_Setter(mthis, __arg_0) native "HTMLMediaElement_controls_Setter";
+  controls_Setter_(mthis, __arg_0) => controls_Setter(mthis, __arg_0);
+
+  static crossOrigin_Getter(mthis) native "HTMLMediaElement_crossOrigin_Getter";
+  crossOrigin_Getter_(mthis) => crossOrigin_Getter(mthis);
+
+  static crossOrigin_Setter(mthis, __arg_0) native "HTMLMediaElement_crossOrigin_Setter";
+  crossOrigin_Setter_(mthis, __arg_0) => crossOrigin_Setter(mthis, __arg_0);
+
+  static currentSrc_Getter(mthis) native "HTMLMediaElement_currentSrc_Getter";
+  currentSrc_Getter_(mthis) => currentSrc_Getter(mthis);
+
+  static currentTime_Getter(mthis) native "HTMLMediaElement_currentTime_Getter";
+  currentTime_Getter_(mthis) => currentTime_Getter(mthis);
+
+  static currentTime_Setter(mthis, __arg_0) native "HTMLMediaElement_currentTime_Setter";
+  currentTime_Setter_(mthis, __arg_0) => currentTime_Setter(mthis, __arg_0);
+
+  static defaultMuted_Getter(mthis) native "HTMLMediaElement_defaultMuted_Getter";
+  defaultMuted_Getter_(mthis) => defaultMuted_Getter(mthis);
+
+  static defaultMuted_Setter(mthis, __arg_0) native "HTMLMediaElement_defaultMuted_Setter";
+  defaultMuted_Setter_(mthis, __arg_0) => defaultMuted_Setter(mthis, __arg_0);
+
+  static defaultPlaybackRate_Getter(mthis) native "HTMLMediaElement_defaultPlaybackRate_Getter";
+  defaultPlaybackRate_Getter_(mthis) => defaultPlaybackRate_Getter(mthis);
+
+  static defaultPlaybackRate_Setter(mthis, __arg_0) native "HTMLMediaElement_defaultPlaybackRate_Setter";
+  defaultPlaybackRate_Setter_(mthis, __arg_0) => defaultPlaybackRate_Setter(mthis, __arg_0);
+
+  static duration_Getter(mthis) native "HTMLMediaElement_duration_Getter";
+  duration_Getter_(mthis) => duration_Getter(mthis);
+
+  static ended_Getter(mthis) native "HTMLMediaElement_ended_Getter";
+  ended_Getter_(mthis) => ended_Getter(mthis);
+
+  static error_Getter(mthis) native "HTMLMediaElement_error_Getter";
+  error_Getter_(mthis) => error_Getter(mthis);
+
+  static integrity_Getter(mthis) native "HTMLMediaElement_integrity_Getter";
+  integrity_Getter_(mthis) => integrity_Getter(mthis);
+
+  static integrity_Setter(mthis, __arg_0) native "HTMLMediaElement_integrity_Setter";
+  integrity_Setter_(mthis, __arg_0) => integrity_Setter(mthis, __arg_0);
+
+  static load_Callback_0(mthis) native "HTMLMediaElement_load_Callback";
+  load_Callback_0_(mthis) => load_Callback_0(mthis);
+
+  static load_Callback_1(mthis, __arg_0) native "HTMLMediaElement_load_Callback";
+  load_Callback_1_(mthis, __arg_0) => load_Callback_1(mthis, __arg_0);
+
+  static load_Callback_2(mthis, __arg_0, __arg_1) native "HTMLMediaElement_load_Callback";
+  load_Callback_2_(mthis, __arg_0, __arg_1) => load_Callback_2(mthis, __arg_0, __arg_1);
+
+  static loop_Getter(mthis) native "HTMLMediaElement_loop_Getter";
+  loop_Getter_(mthis) => loop_Getter(mthis);
+
+  static loop_Setter(mthis, __arg_0) native "HTMLMediaElement_loop_Setter";
+  loop_Setter_(mthis, __arg_0) => loop_Setter(mthis, __arg_0);
+
+  static mediaGroup_Getter(mthis) native "HTMLMediaElement_mediaGroup_Getter";
+  mediaGroup_Getter_(mthis) => mediaGroup_Getter(mthis);
+
+  static mediaGroup_Setter(mthis, __arg_0) native "HTMLMediaElement_mediaGroup_Setter";
+  mediaGroup_Setter_(mthis, __arg_0) => mediaGroup_Setter(mthis, __arg_0);
+
+  static mediaKeys_Getter(mthis) native "HTMLMediaElement_mediaKeys_Getter";
+  mediaKeys_Getter_(mthis) => mediaKeys_Getter(mthis);
+
+  static muted_Getter(mthis) native "HTMLMediaElement_muted_Getter";
+  muted_Getter_(mthis) => muted_Getter(mthis);
+
+  static muted_Setter(mthis, __arg_0) native "HTMLMediaElement_muted_Setter";
+  muted_Setter_(mthis, __arg_0) => muted_Setter(mthis, __arg_0);
+
+  static networkState_Getter(mthis) native "HTMLMediaElement_networkState_Getter";
+  networkState_Getter_(mthis) => networkState_Getter(mthis);
+
+  static onneedkey_Getter(mthis) native "HTMLMediaElement_onneedkey_Getter";
+  onneedkey_Getter_(mthis) => onneedkey_Getter(mthis);
+
+  static onneedkey_Setter(mthis, __arg_0) native "HTMLMediaElement_onneedkey_Setter";
+  onneedkey_Setter_(mthis, __arg_0) => onneedkey_Setter(mthis, __arg_0);
+
+  static onwebkitkeyadded_Getter(mthis) native "HTMLMediaElement_onwebkitkeyadded_Getter";
+  onwebkitkeyadded_Getter_(mthis) => onwebkitkeyadded_Getter(mthis);
+
+  static onwebkitkeyadded_Setter(mthis, __arg_0) native "HTMLMediaElement_onwebkitkeyadded_Setter";
+  onwebkitkeyadded_Setter_(mthis, __arg_0) => onwebkitkeyadded_Setter(mthis, __arg_0);
+
+  static onwebkitkeyerror_Getter(mthis) native "HTMLMediaElement_onwebkitkeyerror_Getter";
+  onwebkitkeyerror_Getter_(mthis) => onwebkitkeyerror_Getter(mthis);
+
+  static onwebkitkeyerror_Setter(mthis, __arg_0) native "HTMLMediaElement_onwebkitkeyerror_Setter";
+  onwebkitkeyerror_Setter_(mthis, __arg_0) => onwebkitkeyerror_Setter(mthis, __arg_0);
+
+  static onwebkitkeymessage_Getter(mthis) native "HTMLMediaElement_onwebkitkeymessage_Getter";
+  onwebkitkeymessage_Getter_(mthis) => onwebkitkeymessage_Getter(mthis);
+
+  static onwebkitkeymessage_Setter(mthis, __arg_0) native "HTMLMediaElement_onwebkitkeymessage_Setter";
+  onwebkitkeymessage_Setter_(mthis, __arg_0) => onwebkitkeymessage_Setter(mthis, __arg_0);
+
+  static onwebkitneedkey_Getter(mthis) native "HTMLMediaElement_onwebkitneedkey_Getter";
+  onwebkitneedkey_Getter_(mthis) => onwebkitneedkey_Getter(mthis);
+
+  static onwebkitneedkey_Setter(mthis, __arg_0) native "HTMLMediaElement_onwebkitneedkey_Setter";
+  onwebkitneedkey_Setter_(mthis, __arg_0) => onwebkitneedkey_Setter(mthis, __arg_0);
+
+  static pause_Callback_0(mthis) native "HTMLMediaElement_pause_Callback";
+  pause_Callback_0_(mthis) => pause_Callback_0(mthis);
+
+  static pause_Callback_1(mthis, __arg_0) native "HTMLMediaElement_pause_Callback";
+  pause_Callback_1_(mthis, __arg_0) => pause_Callback_1(mthis, __arg_0);
+
+  static pause_Callback_2(mthis, __arg_0, __arg_1) native "HTMLMediaElement_pause_Callback";
+  pause_Callback_2_(mthis, __arg_0, __arg_1) => pause_Callback_2(mthis, __arg_0, __arg_1);
+
+  static paused_Getter(mthis) native "HTMLMediaElement_paused_Getter";
+  paused_Getter_(mthis) => paused_Getter(mthis);
+
+  static play_Callback_0(mthis) native "HTMLMediaElement_play_Callback";
+  play_Callback_0_(mthis) => play_Callback_0(mthis);
+
+  static play_Callback_1(mthis, __arg_0) native "HTMLMediaElement_play_Callback";
+  play_Callback_1_(mthis, __arg_0) => play_Callback_1(mthis, __arg_0);
+
+  static play_Callback_2(mthis, __arg_0, __arg_1) native "HTMLMediaElement_play_Callback";
+  play_Callback_2_(mthis, __arg_0, __arg_1) => play_Callback_2(mthis, __arg_0, __arg_1);
+
+  static playbackRate_Getter(mthis) native "HTMLMediaElement_playbackRate_Getter";
+  playbackRate_Getter_(mthis) => playbackRate_Getter(mthis);
+
+  static playbackRate_Setter(mthis, __arg_0) native "HTMLMediaElement_playbackRate_Setter";
+  playbackRate_Setter_(mthis, __arg_0) => playbackRate_Setter(mthis, __arg_0);
+
+  static played_Getter(mthis) native "HTMLMediaElement_played_Getter";
+  played_Getter_(mthis) => played_Getter(mthis);
+
+  static preload_Getter(mthis) native "HTMLMediaElement_preload_Getter";
+  preload_Getter_(mthis) => preload_Getter(mthis);
+
+  static preload_Setter(mthis, __arg_0) native "HTMLMediaElement_preload_Setter";
+  preload_Setter_(mthis, __arg_0) => preload_Setter(mthis, __arg_0);
+
+  static readyState_Getter(mthis) native "HTMLMediaElement_readyState_Getter";
+  readyState_Getter_(mthis) => readyState_Getter(mthis);
+
+  static seekable_Getter(mthis) native "HTMLMediaElement_seekable_Getter";
+  seekable_Getter_(mthis) => seekable_Getter(mthis);
+
+  static seeking_Getter(mthis) native "HTMLMediaElement_seeking_Getter";
+  seeking_Getter_(mthis) => seeking_Getter(mthis);
+
+  static setMediaKeys_Callback_0(mthis) native "HTMLMediaElement_setMediaKeys_Callback";
+  setMediaKeys_Callback_0_(mthis) => setMediaKeys_Callback_0(mthis);
+
+  static setMediaKeys_Callback_1(mthis, __arg_0) native "HTMLMediaElement_setMediaKeys_Callback";
+  setMediaKeys_Callback_1_(mthis, __arg_0) => setMediaKeys_Callback_1(mthis, __arg_0);
+
+  static setMediaKeys_Callback_2(mthis, __arg_0, __arg_1) native "HTMLMediaElement_setMediaKeys_Callback";
+  setMediaKeys_Callback_2_(mthis, __arg_0, __arg_1) => setMediaKeys_Callback_2(mthis, __arg_0, __arg_1);
+
+  static setMediaKeys_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "HTMLMediaElement_setMediaKeys_Callback";
+  setMediaKeys_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => setMediaKeys_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static src_Getter(mthis) native "HTMLMediaElement_src_Getter";
+  src_Getter_(mthis) => src_Getter(mthis);
+
+  static src_Setter(mthis, __arg_0) native "HTMLMediaElement_src_Setter";
+  src_Setter_(mthis, __arg_0) => src_Setter(mthis, __arg_0);
+
+  static textTracks_Getter(mthis) native "HTMLMediaElement_textTracks_Getter";
+  textTracks_Getter_(mthis) => textTracks_Getter(mthis);
+
+  static videoTracks_Getter(mthis) native "HTMLMediaElement_videoTracks_Getter";
+  videoTracks_Getter_(mthis) => videoTracks_Getter(mthis);
+
+  static volume_Getter(mthis) native "HTMLMediaElement_volume_Getter";
+  volume_Getter_(mthis) => volume_Getter(mthis);
+
+  static volume_Setter(mthis, __arg_0) native "HTMLMediaElement_volume_Setter";
+  volume_Setter_(mthis, __arg_0) => volume_Setter(mthis, __arg_0);
+
+  static webkitAddKey_Callback_0(mthis) native "HTMLMediaElement_webkitAddKey_Callback";
+  webkitAddKey_Callback_0_(mthis) => webkitAddKey_Callback_0(mthis);
+
+  static webkitAddKey_Callback_1(mthis, __arg_0) native "HTMLMediaElement_webkitAddKey_Callback";
+  webkitAddKey_Callback_1_(mthis, __arg_0) => webkitAddKey_Callback_1(mthis, __arg_0);
+
+  static webkitAddKey_Callback_2(mthis, __arg_0, __arg_1) native "HTMLMediaElement_webkitAddKey_Callback";
+  webkitAddKey_Callback_2_(mthis, __arg_0, __arg_1) => webkitAddKey_Callback_2(mthis, __arg_0, __arg_1);
+
+  static webkitAddKey_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "HTMLMediaElement_webkitAddKey_Callback";
+  webkitAddKey_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => webkitAddKey_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static webkitAddKey_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "HTMLMediaElement_webkitAddKey_Callback";
+  webkitAddKey_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => webkitAddKey_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static webkitAddKey_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "HTMLMediaElement_webkitAddKey_Callback";
+  webkitAddKey_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => webkitAddKey_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static webkitAddKey_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "HTMLMediaElement_webkitAddKey_Callback";
+  webkitAddKey_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => webkitAddKey_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static webkitAudioDecodedByteCount_Getter(mthis) native "HTMLMediaElement_webkitAudioDecodedByteCount_Getter";
+  webkitAudioDecodedByteCount_Getter_(mthis) => webkitAudioDecodedByteCount_Getter(mthis);
+
+  static webkitCancelKeyRequest_Callback_0(mthis) native "HTMLMediaElement_webkitCancelKeyRequest_Callback";
+  webkitCancelKeyRequest_Callback_0_(mthis) => webkitCancelKeyRequest_Callback_0(mthis);
+
+  static webkitCancelKeyRequest_Callback_1(mthis, __arg_0) native "HTMLMediaElement_webkitCancelKeyRequest_Callback";
+  webkitCancelKeyRequest_Callback_1_(mthis, __arg_0) => webkitCancelKeyRequest_Callback_1(mthis, __arg_0);
+
+  static webkitCancelKeyRequest_Callback_2(mthis, __arg_0, __arg_1) native "HTMLMediaElement_webkitCancelKeyRequest_Callback";
+  webkitCancelKeyRequest_Callback_2_(mthis, __arg_0, __arg_1) => webkitCancelKeyRequest_Callback_2(mthis, __arg_0, __arg_1);
+
+  static webkitCancelKeyRequest_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "HTMLMediaElement_webkitCancelKeyRequest_Callback";
+  webkitCancelKeyRequest_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => webkitCancelKeyRequest_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static webkitCancelKeyRequest_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "HTMLMediaElement_webkitCancelKeyRequest_Callback";
+  webkitCancelKeyRequest_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => webkitCancelKeyRequest_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static webkitGenerateKeyRequest_Callback_0(mthis) native "HTMLMediaElement_webkitGenerateKeyRequest_Callback";
+  webkitGenerateKeyRequest_Callback_0_(mthis) => webkitGenerateKeyRequest_Callback_0(mthis);
+
+  static webkitGenerateKeyRequest_Callback_1(mthis, __arg_0) native "HTMLMediaElement_webkitGenerateKeyRequest_Callback";
+  webkitGenerateKeyRequest_Callback_1_(mthis, __arg_0) => webkitGenerateKeyRequest_Callback_1(mthis, __arg_0);
+
+  static webkitGenerateKeyRequest_Callback_2(mthis, __arg_0, __arg_1) native "HTMLMediaElement_webkitGenerateKeyRequest_Callback";
+  webkitGenerateKeyRequest_Callback_2_(mthis, __arg_0, __arg_1) => webkitGenerateKeyRequest_Callback_2(mthis, __arg_0, __arg_1);
+
+  static webkitGenerateKeyRequest_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "HTMLMediaElement_webkitGenerateKeyRequest_Callback";
+  webkitGenerateKeyRequest_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => webkitGenerateKeyRequest_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static webkitGenerateKeyRequest_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "HTMLMediaElement_webkitGenerateKeyRequest_Callback";
+  webkitGenerateKeyRequest_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => webkitGenerateKeyRequest_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static webkitVideoDecodedByteCount_Getter(mthis) native "HTMLMediaElement_webkitVideoDecodedByteCount_Getter";
+  webkitVideoDecodedByteCount_Getter_(mthis) => webkitVideoDecodedByteCount_Getter(mthis);
+
+}
+
+class BlinkHTMLMenuElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLMenuElement();
+
   static label_Getter(mthis) native "HTMLMenuElement_label_Getter";
+  label_Getter_(mthis) => label_Getter(mthis);
 
-  static label_Setter(mthis, value) native "HTMLMenuElement_label_Setter";
+  static label_Setter(mthis, __arg_0) native "HTMLMenuElement_label_Setter";
+  label_Setter_(mthis, __arg_0) => label_Setter(mthis, __arg_0);
 
   static type_Getter(mthis) native "HTMLMenuElement_type_Getter";
+  type_Getter_(mthis) => type_Getter(mthis);
 
-  static type_Setter(mthis, value) native "HTMLMenuElement_type_Setter";
+  static type_Setter(mthis, __arg_0) native "HTMLMenuElement_type_Setter";
+  type_Setter_(mthis, __arg_0) => type_Setter(mthis, __arg_0);
+
 }
 
-class BlinkHTMLMenuItemElement {
-  static checked_Getter(mthis) native "HTMLMenuItemElement_checked_Getter";
+class BlinkHTMLMenuItemElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLMenuItemElement();
 
-  static checked_Setter(mthis, value) native "HTMLMenuItemElement_checked_Setter";
+  static checked_Getter(mthis) native "HTMLMenuItemElement_checked_Getter";
+  checked_Getter_(mthis) => checked_Getter(mthis);
+
+  static checked_Setter(mthis, __arg_0) native "HTMLMenuItemElement_checked_Setter";
+  checked_Setter_(mthis, __arg_0) => checked_Setter(mthis, __arg_0);
 
   static default_Getter(mthis) native "HTMLMenuItemElement_default_Getter";
+  default_Getter_(mthis) => default_Getter(mthis);
 
-  static default_Setter(mthis, value) native "HTMLMenuItemElement_default_Setter";
+  static default_Setter(mthis, __arg_0) native "HTMLMenuItemElement_default_Setter";
+  default_Setter_(mthis, __arg_0) => default_Setter(mthis, __arg_0);
 
   static disabled_Getter(mthis) native "HTMLMenuItemElement_disabled_Getter";
+  disabled_Getter_(mthis) => disabled_Getter(mthis);
 
-  static disabled_Setter(mthis, value) native "HTMLMenuItemElement_disabled_Setter";
+  static disabled_Setter(mthis, __arg_0) native "HTMLMenuItemElement_disabled_Setter";
+  disabled_Setter_(mthis, __arg_0) => disabled_Setter(mthis, __arg_0);
 
   static label_Getter(mthis) native "HTMLMenuItemElement_label_Getter";
+  label_Getter_(mthis) => label_Getter(mthis);
 
-  static label_Setter(mthis, value) native "HTMLMenuItemElement_label_Setter";
+  static label_Setter(mthis, __arg_0) native "HTMLMenuItemElement_label_Setter";
+  label_Setter_(mthis, __arg_0) => label_Setter(mthis, __arg_0);
 
   static type_Getter(mthis) native "HTMLMenuItemElement_type_Getter";
+  type_Getter_(mthis) => type_Getter(mthis);
 
-  static type_Setter(mthis, value) native "HTMLMenuItemElement_type_Setter";
+  static type_Setter(mthis, __arg_0) native "HTMLMenuItemElement_type_Setter";
+  type_Setter_(mthis, __arg_0) => type_Setter(mthis, __arg_0);
+
 }
 
-class BlinkHTMLMetaElement {
-  static content_Getter(mthis) native "HTMLMetaElement_content_Getter";
+class BlinkHTMLMetaElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLMetaElement();
 
-  static content_Setter(mthis, value) native "HTMLMetaElement_content_Setter";
+  static content_Getter(mthis) native "HTMLMetaElement_content_Getter";
+  content_Getter_(mthis) => content_Getter(mthis);
+
+  static content_Setter(mthis, __arg_0) native "HTMLMetaElement_content_Setter";
+  content_Setter_(mthis, __arg_0) => content_Setter(mthis, __arg_0);
 
   static httpEquiv_Getter(mthis) native "HTMLMetaElement_httpEquiv_Getter";
+  httpEquiv_Getter_(mthis) => httpEquiv_Getter(mthis);
 
-  static httpEquiv_Setter(mthis, value) native "HTMLMetaElement_httpEquiv_Setter";
+  static httpEquiv_Setter(mthis, __arg_0) native "HTMLMetaElement_httpEquiv_Setter";
+  httpEquiv_Setter_(mthis, __arg_0) => httpEquiv_Setter(mthis, __arg_0);
 
   static name_Getter(mthis) native "HTMLMetaElement_name_Getter";
+  name_Getter_(mthis) => name_Getter(mthis);
 
-  static name_Setter(mthis, value) native "HTMLMetaElement_name_Setter";
+  static name_Setter(mthis, __arg_0) native "HTMLMetaElement_name_Setter";
+  name_Setter_(mthis, __arg_0) => name_Setter(mthis, __arg_0);
+
 }
 
-class BlinkHTMLMeterElement {
-  static high_Getter(mthis) native "HTMLMeterElement_high_Getter";
+class BlinkHTMLMeterElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLMeterElement();
 
-  static high_Setter(mthis, value) native "HTMLMeterElement_high_Setter";
+  static high_Getter(mthis) native "HTMLMeterElement_high_Getter";
+  high_Getter_(mthis) => high_Getter(mthis);
+
+  static high_Setter(mthis, __arg_0) native "HTMLMeterElement_high_Setter";
+  high_Setter_(mthis, __arg_0) => high_Setter(mthis, __arg_0);
 
   static labels_Getter(mthis) native "HTMLMeterElement_labels_Getter";
+  labels_Getter_(mthis) => labels_Getter(mthis);
 
   static low_Getter(mthis) native "HTMLMeterElement_low_Getter";
+  low_Getter_(mthis) => low_Getter(mthis);
 
-  static low_Setter(mthis, value) native "HTMLMeterElement_low_Setter";
+  static low_Setter(mthis, __arg_0) native "HTMLMeterElement_low_Setter";
+  low_Setter_(mthis, __arg_0) => low_Setter(mthis, __arg_0);
 
   static max_Getter(mthis) native "HTMLMeterElement_max_Getter";
+  max_Getter_(mthis) => max_Getter(mthis);
 
-  static max_Setter(mthis, value) native "HTMLMeterElement_max_Setter";
+  static max_Setter(mthis, __arg_0) native "HTMLMeterElement_max_Setter";
+  max_Setter_(mthis, __arg_0) => max_Setter(mthis, __arg_0);
 
   static min_Getter(mthis) native "HTMLMeterElement_min_Getter";
+  min_Getter_(mthis) => min_Getter(mthis);
 
-  static min_Setter(mthis, value) native "HTMLMeterElement_min_Setter";
+  static min_Setter(mthis, __arg_0) native "HTMLMeterElement_min_Setter";
+  min_Setter_(mthis, __arg_0) => min_Setter(mthis, __arg_0);
 
   static optimum_Getter(mthis) native "HTMLMeterElement_optimum_Getter";
+  optimum_Getter_(mthis) => optimum_Getter(mthis);
 
-  static optimum_Setter(mthis, value) native "HTMLMeterElement_optimum_Setter";
+  static optimum_Setter(mthis, __arg_0) native "HTMLMeterElement_optimum_Setter";
+  optimum_Setter_(mthis, __arg_0) => optimum_Setter(mthis, __arg_0);
 
   static value_Getter(mthis) native "HTMLMeterElement_value_Getter";
+  value_Getter_(mthis) => value_Getter(mthis);
 
-  static value_Setter(mthis, value) native "HTMLMeterElement_value_Setter";
+  static value_Setter(mthis, __arg_0) native "HTMLMeterElement_value_Setter";
+  value_Setter_(mthis, __arg_0) => value_Setter(mthis, __arg_0);
+
 }
 
-class BlinkHTMLModElement {
-  static cite_Getter(mthis) native "HTMLModElement_cite_Getter";
+class BlinkHTMLModElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLModElement();
 
-  static cite_Setter(mthis, value) native "HTMLModElement_cite_Setter";
+  static cite_Getter(mthis) native "HTMLModElement_cite_Getter";
+  cite_Getter_(mthis) => cite_Getter(mthis);
+
+  static cite_Setter(mthis, __arg_0) native "HTMLModElement_cite_Setter";
+  cite_Setter_(mthis, __arg_0) => cite_Setter(mthis, __arg_0);
 
   static dateTime_Getter(mthis) native "HTMLModElement_dateTime_Getter";
+  dateTime_Getter_(mthis) => dateTime_Getter(mthis);
 
-  static dateTime_Setter(mthis, value) native "HTMLModElement_dateTime_Setter";
+  static dateTime_Setter(mthis, __arg_0) native "HTMLModElement_dateTime_Setter";
+  dateTime_Setter_(mthis, __arg_0) => dateTime_Setter(mthis, __arg_0);
+
 }
 
-class BlinkHTMLOListElement {
-  static reversed_Getter(mthis) native "HTMLOListElement_reversed_Getter";
+class BlinkHTMLOListElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLOListElement();
 
-  static reversed_Setter(mthis, value) native "HTMLOListElement_reversed_Setter";
+  static reversed_Getter(mthis) native "HTMLOListElement_reversed_Getter";
+  reversed_Getter_(mthis) => reversed_Getter(mthis);
+
+  static reversed_Setter(mthis, __arg_0) native "HTMLOListElement_reversed_Setter";
+  reversed_Setter_(mthis, __arg_0) => reversed_Setter(mthis, __arg_0);
 
   static start_Getter(mthis) native "HTMLOListElement_start_Getter";
+  start_Getter_(mthis) => start_Getter(mthis);
 
-  static start_Setter(mthis, value) native "HTMLOListElement_start_Setter";
+  static start_Setter(mthis, __arg_0) native "HTMLOListElement_start_Setter";
+  start_Setter_(mthis, __arg_0) => start_Setter(mthis, __arg_0);
 
   static type_Getter(mthis) native "HTMLOListElement_type_Getter";
+  type_Getter_(mthis) => type_Getter(mthis);
 
-  static type_Setter(mthis, value) native "HTMLOListElement_type_Setter";
+  static type_Setter(mthis, __arg_0) native "HTMLOListElement_type_Setter";
+  type_Setter_(mthis, __arg_0) => type_Setter(mthis, __arg_0);
+
 }
 
-class BlinkHTMLObjectElement {
-  static data_Getter(mthis) native "HTMLObjectElement_data_Getter";
+class BlinkHTMLObjectElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLObjectElement();
 
-  static data_Setter(mthis, value) native "HTMLObjectElement_data_Setter";
+  static $__getter___Callback_1(mthis, __arg_0) native "HTMLObjectElement___getter___Callback";
+  $__getter___Callback_1_(mthis, __arg_0) => $__getter___Callback_1(mthis, __arg_0);
+
+  static $__setter___Callback_2(mthis, __arg_0, __arg_1) native "HTMLObjectElement___setter___Callback";
+  $__setter___Callback_2_(mthis, __arg_0, __arg_1) => $__setter___Callback_2(mthis, __arg_0, __arg_1);
+
+  static checkValidity_Callback_0(mthis) native "HTMLObjectElement_checkValidity_Callback";
+  checkValidity_Callback_0_(mthis) => checkValidity_Callback_0(mthis);
+
+  static checkValidity_Callback_1(mthis, __arg_0) native "HTMLObjectElement_checkValidity_Callback";
+  checkValidity_Callback_1_(mthis, __arg_0) => checkValidity_Callback_1(mthis, __arg_0);
+
+  static checkValidity_Callback_2(mthis, __arg_0, __arg_1) native "HTMLObjectElement_checkValidity_Callback";
+  checkValidity_Callback_2_(mthis, __arg_0, __arg_1) => checkValidity_Callback_2(mthis, __arg_0, __arg_1);
+
+  static code_Getter(mthis) native "HTMLObjectElement_code_Getter";
+  code_Getter_(mthis) => code_Getter(mthis);
+
+  static code_Setter(mthis, __arg_0) native "HTMLObjectElement_code_Setter";
+  code_Setter_(mthis, __arg_0) => code_Setter(mthis, __arg_0);
+
+  static contentDocument_Getter(mthis) native "HTMLObjectElement_contentDocument_Getter";
+  contentDocument_Getter_(mthis) => contentDocument_Getter(mthis);
+
+  static data_Getter(mthis) native "HTMLObjectElement_data_Getter";
+  data_Getter_(mthis) => data_Getter(mthis);
+
+  static data_Setter(mthis, __arg_0) native "HTMLObjectElement_data_Setter";
+  data_Setter_(mthis, __arg_0) => data_Setter(mthis, __arg_0);
 
   static form_Getter(mthis) native "HTMLObjectElement_form_Getter";
+  form_Getter_(mthis) => form_Getter(mthis);
+
+  static getSVGDocument_Callback_0(mthis) native "HTMLObjectElement_getSVGDocument_Callback";
+  getSVGDocument_Callback_0_(mthis) => getSVGDocument_Callback_0(mthis);
+
+  static getSVGDocument_Callback_1(mthis, __arg_0) native "HTMLObjectElement_getSVGDocument_Callback";
+  getSVGDocument_Callback_1_(mthis, __arg_0) => getSVGDocument_Callback_1(mthis, __arg_0);
+
+  static getSVGDocument_Callback_2(mthis, __arg_0, __arg_1) native "HTMLObjectElement_getSVGDocument_Callback";
+  getSVGDocument_Callback_2_(mthis, __arg_0, __arg_1) => getSVGDocument_Callback_2(mthis, __arg_0, __arg_1);
 
   static height_Getter(mthis) native "HTMLObjectElement_height_Getter";
+  height_Getter_(mthis) => height_Getter(mthis);
 
-  static height_Setter(mthis, value) native "HTMLObjectElement_height_Setter";
+  static height_Setter(mthis, __arg_0) native "HTMLObjectElement_height_Setter";
+  height_Setter_(mthis, __arg_0) => height_Setter(mthis, __arg_0);
 
   static integrity_Getter(mthis) native "HTMLObjectElement_integrity_Getter";
+  integrity_Getter_(mthis) => integrity_Getter(mthis);
 
-  static integrity_Setter(mthis, value) native "HTMLObjectElement_integrity_Setter";
+  static integrity_Setter(mthis, __arg_0) native "HTMLObjectElement_integrity_Setter";
+  integrity_Setter_(mthis, __arg_0) => integrity_Setter(mthis, __arg_0);
 
   static name_Getter(mthis) native "HTMLObjectElement_name_Getter";
+  name_Getter_(mthis) => name_Getter(mthis);
 
-  static name_Setter(mthis, value) native "HTMLObjectElement_name_Setter";
+  static name_Setter(mthis, __arg_0) native "HTMLObjectElement_name_Setter";
+  name_Setter_(mthis, __arg_0) => name_Setter(mthis, __arg_0);
+
+  static setCustomValidity_Callback_0(mthis) native "HTMLObjectElement_setCustomValidity_Callback";
+  setCustomValidity_Callback_0_(mthis) => setCustomValidity_Callback_0(mthis);
+
+  static setCustomValidity_Callback_1(mthis, __arg_0) native "HTMLObjectElement_setCustomValidity_Callback";
+  setCustomValidity_Callback_1_(mthis, __arg_0) => setCustomValidity_Callback_1(mthis, __arg_0);
+
+  static setCustomValidity_Callback_2(mthis, __arg_0, __arg_1) native "HTMLObjectElement_setCustomValidity_Callback";
+  setCustomValidity_Callback_2_(mthis, __arg_0, __arg_1) => setCustomValidity_Callback_2(mthis, __arg_0, __arg_1);
+
+  static setCustomValidity_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "HTMLObjectElement_setCustomValidity_Callback";
+  setCustomValidity_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => setCustomValidity_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
   static type_Getter(mthis) native "HTMLObjectElement_type_Getter";
+  type_Getter_(mthis) => type_Getter(mthis);
 
-  static type_Setter(mthis, value) native "HTMLObjectElement_type_Setter";
+  static type_Setter(mthis, __arg_0) native "HTMLObjectElement_type_Setter";
+  type_Setter_(mthis, __arg_0) => type_Setter(mthis, __arg_0);
 
   static useMap_Getter(mthis) native "HTMLObjectElement_useMap_Getter";
+  useMap_Getter_(mthis) => useMap_Getter(mthis);
 
-  static useMap_Setter(mthis, value) native "HTMLObjectElement_useMap_Setter";
+  static useMap_Setter(mthis, __arg_0) native "HTMLObjectElement_useMap_Setter";
+  useMap_Setter_(mthis, __arg_0) => useMap_Setter(mthis, __arg_0);
 
   static validationMessage_Getter(mthis) native "HTMLObjectElement_validationMessage_Getter";
+  validationMessage_Getter_(mthis) => validationMessage_Getter(mthis);
 
   static validity_Getter(mthis) native "HTMLObjectElement_validity_Getter";
+  validity_Getter_(mthis) => validity_Getter(mthis);
 
   static width_Getter(mthis) native "HTMLObjectElement_width_Getter";
+  width_Getter_(mthis) => width_Getter(mthis);
 
-  static width_Setter(mthis, value) native "HTMLObjectElement_width_Setter";
+  static width_Setter(mthis, __arg_0) native "HTMLObjectElement_width_Setter";
+  width_Setter_(mthis, __arg_0) => width_Setter(mthis, __arg_0);
 
   static willValidate_Getter(mthis) native "HTMLObjectElement_willValidate_Getter";
+  willValidate_Getter_(mthis) => willValidate_Getter(mthis);
 
-  static $__getter___Callback_1(mthis, index_OR_name) native "HTMLObjectElement___getter___Callback";
-
-  static $__setter___Callback_2(mthis, index_OR_name, value) native "HTMLObjectElement___setter___Callback";
-
-  static checkValidity_Callback(mthis) native "HTMLObjectElement_checkValidity_Callback";
-
-  static setCustomValidity_Callback_1(mthis, error) native "HTMLObjectElement_setCustomValidity_Callback";
 }
 
-class BlinkHTMLOptGroupElement {
-  static disabled_Getter(mthis) native "HTMLOptGroupElement_disabled_Getter";
+class BlinkHTMLOptGroupElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLOptGroupElement();
 
-  static disabled_Setter(mthis, value) native "HTMLOptGroupElement_disabled_Setter";
+  static disabled_Getter(mthis) native "HTMLOptGroupElement_disabled_Getter";
+  disabled_Getter_(mthis) => disabled_Getter(mthis);
+
+  static disabled_Setter(mthis, __arg_0) native "HTMLOptGroupElement_disabled_Setter";
+  disabled_Setter_(mthis, __arg_0) => disabled_Setter(mthis, __arg_0);
 
   static label_Getter(mthis) native "HTMLOptGroupElement_label_Getter";
+  label_Getter_(mthis) => label_Getter(mthis);
 
-  static label_Setter(mthis, value) native "HTMLOptGroupElement_label_Setter";
+  static label_Setter(mthis, __arg_0) native "HTMLOptGroupElement_label_Setter";
+  label_Setter_(mthis, __arg_0) => label_Setter(mthis, __arg_0);
+
 }
 
-class BlinkHTMLOptionElement {
-  static constructorCallback_4(data, value, defaultSelected, selected) native "HTMLOptionElement_constructorCallback";
+class BlinkHTMLOptionElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLOptionElement();
+
+  static constructorCallback_0() native "HTMLOptionElement_constructorCallback";
+  constructorCallback_0_() => constructorCallback_0();
+
+  static constructorCallback_1(__arg_0) native "HTMLOptionElement_constructorCallback";
+  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+
+  static constructorCallback_2(__arg_0, __arg_1) native "HTMLOptionElement_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+
+  static constructorCallback_3(__arg_0, __arg_1, __arg_2) native "HTMLOptionElement_constructorCallback";
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => constructorCallback_3(__arg_0, __arg_1, __arg_2);
+
+  static constructorCallback_4(__arg_0, __arg_1, __arg_2, __arg_3) native "HTMLOptionElement_constructorCallback";
+  constructorCallback_4_(__arg_0, __arg_1, __arg_2, __arg_3) => constructorCallback_4(__arg_0, __arg_1, __arg_2, __arg_3);
+
+  static constructorCallback_5(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "HTMLOptionElement_constructorCallback";
+  constructorCallback_5_(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => constructorCallback_5(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static constructorCallback_6(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "HTMLOptionElement_constructorCallback";
+  constructorCallback_6_(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => constructorCallback_6(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
 
   static defaultSelected_Getter(mthis) native "HTMLOptionElement_defaultSelected_Getter";
+  defaultSelected_Getter_(mthis) => defaultSelected_Getter(mthis);
 
-  static defaultSelected_Setter(mthis, value) native "HTMLOptionElement_defaultSelected_Setter";
+  static defaultSelected_Setter(mthis, __arg_0) native "HTMLOptionElement_defaultSelected_Setter";
+  defaultSelected_Setter_(mthis, __arg_0) => defaultSelected_Setter(mthis, __arg_0);
 
   static disabled_Getter(mthis) native "HTMLOptionElement_disabled_Getter";
+  disabled_Getter_(mthis) => disabled_Getter(mthis);
 
-  static disabled_Setter(mthis, value) native "HTMLOptionElement_disabled_Setter";
+  static disabled_Setter(mthis, __arg_0) native "HTMLOptionElement_disabled_Setter";
+  disabled_Setter_(mthis, __arg_0) => disabled_Setter(mthis, __arg_0);
 
   static form_Getter(mthis) native "HTMLOptionElement_form_Getter";
+  form_Getter_(mthis) => form_Getter(mthis);
 
   static index_Getter(mthis) native "HTMLOptionElement_index_Getter";
+  index_Getter_(mthis) => index_Getter(mthis);
 
   static label_Getter(mthis) native "HTMLOptionElement_label_Getter";
+  label_Getter_(mthis) => label_Getter(mthis);
 
-  static label_Setter(mthis, value) native "HTMLOptionElement_label_Setter";
+  static label_Setter(mthis, __arg_0) native "HTMLOptionElement_label_Setter";
+  label_Setter_(mthis, __arg_0) => label_Setter(mthis, __arg_0);
 
   static selected_Getter(mthis) native "HTMLOptionElement_selected_Getter";
+  selected_Getter_(mthis) => selected_Getter(mthis);
 
-  static selected_Setter(mthis, value) native "HTMLOptionElement_selected_Setter";
+  static selected_Setter(mthis, __arg_0) native "HTMLOptionElement_selected_Setter";
+  selected_Setter_(mthis, __arg_0) => selected_Setter(mthis, __arg_0);
 
   static value_Getter(mthis) native "HTMLOptionElement_value_Getter";
+  value_Getter_(mthis) => value_Getter(mthis);
 
-  static value_Setter(mthis, value) native "HTMLOptionElement_value_Setter";
+  static value_Setter(mthis, __arg_0) native "HTMLOptionElement_value_Setter";
+  value_Setter_(mthis, __arg_0) => value_Setter(mthis, __arg_0);
+
 }
 
-class BlinkHTMLOptionsCollection {}
+class BlinkHTMLOptionsCollection extends BlinkHTMLCollection {
+  static final instance = new BlinkHTMLOptionsCollection();
 
-class BlinkHTMLOutputElement {
+  static $__getter___Callback_1(mthis, __arg_0) native "HTMLOptionsCollection___getter___Callback";
+  $__getter___Callback_1_(mthis, __arg_0) => $__getter___Callback_1(mthis, __arg_0);
+
+  static $__setter___Callback_2(mthis, __arg_0, __arg_1) native "HTMLOptionsCollection___setter___Callback";
+  $__setter___Callback_2_(mthis, __arg_0, __arg_1) => $__setter___Callback_2(mthis, __arg_0, __arg_1);
+
+}
+
+class BlinkHTMLOutputElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLOutputElement();
+
+  static checkValidity_Callback_0(mthis) native "HTMLOutputElement_checkValidity_Callback";
+  checkValidity_Callback_0_(mthis) => checkValidity_Callback_0(mthis);
+
+  static checkValidity_Callback_1(mthis, __arg_0) native "HTMLOutputElement_checkValidity_Callback";
+  checkValidity_Callback_1_(mthis, __arg_0) => checkValidity_Callback_1(mthis, __arg_0);
+
+  static checkValidity_Callback_2(mthis, __arg_0, __arg_1) native "HTMLOutputElement_checkValidity_Callback";
+  checkValidity_Callback_2_(mthis, __arg_0, __arg_1) => checkValidity_Callback_2(mthis, __arg_0, __arg_1);
+
   static defaultValue_Getter(mthis) native "HTMLOutputElement_defaultValue_Getter";
+  defaultValue_Getter_(mthis) => defaultValue_Getter(mthis);
 
-  static defaultValue_Setter(mthis, value) native "HTMLOutputElement_defaultValue_Setter";
+  static defaultValue_Setter(mthis, __arg_0) native "HTMLOutputElement_defaultValue_Setter";
+  defaultValue_Setter_(mthis, __arg_0) => defaultValue_Setter(mthis, __arg_0);
 
   static form_Getter(mthis) native "HTMLOutputElement_form_Getter";
+  form_Getter_(mthis) => form_Getter(mthis);
 
   static htmlFor_Getter(mthis) native "HTMLOutputElement_htmlFor_Getter";
+  htmlFor_Getter_(mthis) => htmlFor_Getter(mthis);
+
+  static htmlFor_Setter(mthis, __arg_0) native "HTMLOutputElement_htmlFor_Setter";
+  htmlFor_Setter_(mthis, __arg_0) => htmlFor_Setter(mthis, __arg_0);
 
   static labels_Getter(mthis) native "HTMLOutputElement_labels_Getter";
+  labels_Getter_(mthis) => labels_Getter(mthis);
 
   static name_Getter(mthis) native "HTMLOutputElement_name_Getter";
+  name_Getter_(mthis) => name_Getter(mthis);
 
-  static name_Setter(mthis, value) native "HTMLOutputElement_name_Setter";
+  static name_Setter(mthis, __arg_0) native "HTMLOutputElement_name_Setter";
+  name_Setter_(mthis, __arg_0) => name_Setter(mthis, __arg_0);
+
+  static setCustomValidity_Callback_0(mthis) native "HTMLOutputElement_setCustomValidity_Callback";
+  setCustomValidity_Callback_0_(mthis) => setCustomValidity_Callback_0(mthis);
+
+  static setCustomValidity_Callback_1(mthis, __arg_0) native "HTMLOutputElement_setCustomValidity_Callback";
+  setCustomValidity_Callback_1_(mthis, __arg_0) => setCustomValidity_Callback_1(mthis, __arg_0);
+
+  static setCustomValidity_Callback_2(mthis, __arg_0, __arg_1) native "HTMLOutputElement_setCustomValidity_Callback";
+  setCustomValidity_Callback_2_(mthis, __arg_0, __arg_1) => setCustomValidity_Callback_2(mthis, __arg_0, __arg_1);
+
+  static setCustomValidity_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "HTMLOutputElement_setCustomValidity_Callback";
+  setCustomValidity_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => setCustomValidity_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
   static type_Getter(mthis) native "HTMLOutputElement_type_Getter";
+  type_Getter_(mthis) => type_Getter(mthis);
 
   static validationMessage_Getter(mthis) native "HTMLOutputElement_validationMessage_Getter";
+  validationMessage_Getter_(mthis) => validationMessage_Getter(mthis);
 
   static validity_Getter(mthis) native "HTMLOutputElement_validity_Getter";
+  validity_Getter_(mthis) => validity_Getter(mthis);
 
   static value_Getter(mthis) native "HTMLOutputElement_value_Getter";
+  value_Getter_(mthis) => value_Getter(mthis);
 
-  static value_Setter(mthis, value) native "HTMLOutputElement_value_Setter";
+  static value_Setter(mthis, __arg_0) native "HTMLOutputElement_value_Setter";
+  value_Setter_(mthis, __arg_0) => value_Setter(mthis, __arg_0);
 
   static willValidate_Getter(mthis) native "HTMLOutputElement_willValidate_Getter";
+  willValidate_Getter_(mthis) => willValidate_Getter(mthis);
 
-  static checkValidity_Callback(mthis) native "HTMLOutputElement_checkValidity_Callback";
-
-  static setCustomValidity_Callback_1(mthis, error) native "HTMLOutputElement_setCustomValidity_Callback";
 }
 
-class BlinkHTMLParagraphElement {}
+class BlinkHTMLParagraphElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLParagraphElement();
 
-class BlinkHTMLParamElement {
+}
+
+class BlinkHTMLParamElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLParamElement();
+
   static name_Getter(mthis) native "HTMLParamElement_name_Getter";
+  name_Getter_(mthis) => name_Getter(mthis);
 
-  static name_Setter(mthis, value) native "HTMLParamElement_name_Setter";
+  static name_Setter(mthis, __arg_0) native "HTMLParamElement_name_Setter";
+  name_Setter_(mthis, __arg_0) => name_Setter(mthis, __arg_0);
 
   static value_Getter(mthis) native "HTMLParamElement_value_Getter";
+  value_Getter_(mthis) => value_Getter(mthis);
 
-  static value_Setter(mthis, value) native "HTMLParamElement_value_Setter";
+  static value_Setter(mthis, __arg_0) native "HTMLParamElement_value_Setter";
+  value_Setter_(mthis, __arg_0) => value_Setter(mthis, __arg_0);
+
 }
 
-class BlinkHTMLPictureElement {}
+class BlinkHTMLPictureElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLPictureElement();
 
-class BlinkHTMLPreElement {}
+}
 
-class BlinkHTMLProgressElement {
+class BlinkHTMLPreElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLPreElement();
+
+}
+
+class BlinkHTMLProgressElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLProgressElement();
+
   static labels_Getter(mthis) native "HTMLProgressElement_labels_Getter";
+  labels_Getter_(mthis) => labels_Getter(mthis);
 
   static max_Getter(mthis) native "HTMLProgressElement_max_Getter";
+  max_Getter_(mthis) => max_Getter(mthis);
 
-  static max_Setter(mthis, value) native "HTMLProgressElement_max_Setter";
+  static max_Setter(mthis, __arg_0) native "HTMLProgressElement_max_Setter";
+  max_Setter_(mthis, __arg_0) => max_Setter(mthis, __arg_0);
 
   static position_Getter(mthis) native "HTMLProgressElement_position_Getter";
+  position_Getter_(mthis) => position_Getter(mthis);
 
   static value_Getter(mthis) native "HTMLProgressElement_value_Getter";
+  value_Getter_(mthis) => value_Getter(mthis);
 
-  static value_Setter(mthis, value) native "HTMLProgressElement_value_Setter";
+  static value_Setter(mthis, __arg_0) native "HTMLProgressElement_value_Setter";
+  value_Setter_(mthis, __arg_0) => value_Setter(mthis, __arg_0);
+
 }
 
-class BlinkHTMLQuoteElement {
+class BlinkHTMLQuoteElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLQuoteElement();
+
   static cite_Getter(mthis) native "HTMLQuoteElement_cite_Getter";
+  cite_Getter_(mthis) => cite_Getter(mthis);
 
-  static cite_Setter(mthis, value) native "HTMLQuoteElement_cite_Setter";
+  static cite_Setter(mthis, __arg_0) native "HTMLQuoteElement_cite_Setter";
+  cite_Setter_(mthis, __arg_0) => cite_Setter(mthis, __arg_0);
+
 }
 
-class BlinkHTMLScriptElement {
-  static async_Getter(mthis) native "HTMLScriptElement_async_Getter";
+class BlinkHTMLScriptElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLScriptElement();
 
-  static async_Setter(mthis, value) native "HTMLScriptElement_async_Setter";
+  static async_Getter(mthis) native "HTMLScriptElement_async_Getter";
+  async_Getter_(mthis) => async_Getter(mthis);
+
+  static async_Setter(mthis, __arg_0) native "HTMLScriptElement_async_Setter";
+  async_Setter_(mthis, __arg_0) => async_Setter(mthis, __arg_0);
 
   static charset_Getter(mthis) native "HTMLScriptElement_charset_Getter";
+  charset_Getter_(mthis) => charset_Getter(mthis);
 
-  static charset_Setter(mthis, value) native "HTMLScriptElement_charset_Setter";
+  static charset_Setter(mthis, __arg_0) native "HTMLScriptElement_charset_Setter";
+  charset_Setter_(mthis, __arg_0) => charset_Setter(mthis, __arg_0);
 
   static crossOrigin_Getter(mthis) native "HTMLScriptElement_crossOrigin_Getter";
+  crossOrigin_Getter_(mthis) => crossOrigin_Getter(mthis);
 
-  static crossOrigin_Setter(mthis, value) native "HTMLScriptElement_crossOrigin_Setter";
+  static crossOrigin_Setter(mthis, __arg_0) native "HTMLScriptElement_crossOrigin_Setter";
+  crossOrigin_Setter_(mthis, __arg_0) => crossOrigin_Setter(mthis, __arg_0);
 
   static defer_Getter(mthis) native "HTMLScriptElement_defer_Getter";
+  defer_Getter_(mthis) => defer_Getter(mthis);
 
-  static defer_Setter(mthis, value) native "HTMLScriptElement_defer_Setter";
+  static defer_Setter(mthis, __arg_0) native "HTMLScriptElement_defer_Setter";
+  defer_Setter_(mthis, __arg_0) => defer_Setter(mthis, __arg_0);
+
+  static event_Getter(mthis) native "HTMLScriptElement_event_Getter";
+  event_Getter_(mthis) => event_Getter(mthis);
+
+  static event_Setter(mthis, __arg_0) native "HTMLScriptElement_event_Setter";
+  event_Setter_(mthis, __arg_0) => event_Setter(mthis, __arg_0);
+
+  static htmlFor_Getter(mthis) native "HTMLScriptElement_htmlFor_Getter";
+  htmlFor_Getter_(mthis) => htmlFor_Getter(mthis);
+
+  static htmlFor_Setter(mthis, __arg_0) native "HTMLScriptElement_htmlFor_Setter";
+  htmlFor_Setter_(mthis, __arg_0) => htmlFor_Setter(mthis, __arg_0);
 
   static integrity_Getter(mthis) native "HTMLScriptElement_integrity_Getter";
+  integrity_Getter_(mthis) => integrity_Getter(mthis);
 
-  static integrity_Setter(mthis, value) native "HTMLScriptElement_integrity_Setter";
+  static integrity_Setter(mthis, __arg_0) native "HTMLScriptElement_integrity_Setter";
+  integrity_Setter_(mthis, __arg_0) => integrity_Setter(mthis, __arg_0);
 
   static nonce_Getter(mthis) native "HTMLScriptElement_nonce_Getter";
+  nonce_Getter_(mthis) => nonce_Getter(mthis);
 
-  static nonce_Setter(mthis, value) native "HTMLScriptElement_nonce_Setter";
+  static nonce_Setter(mthis, __arg_0) native "HTMLScriptElement_nonce_Setter";
+  nonce_Setter_(mthis, __arg_0) => nonce_Setter(mthis, __arg_0);
 
   static src_Getter(mthis) native "HTMLScriptElement_src_Getter";
+  src_Getter_(mthis) => src_Getter(mthis);
 
-  static src_Setter(mthis, value) native "HTMLScriptElement_src_Setter";
+  static src_Setter(mthis, __arg_0) native "HTMLScriptElement_src_Setter";
+  src_Setter_(mthis, __arg_0) => src_Setter(mthis, __arg_0);
 
   static type_Getter(mthis) native "HTMLScriptElement_type_Getter";
+  type_Getter_(mthis) => type_Getter(mthis);
 
-  static type_Setter(mthis, value) native "HTMLScriptElement_type_Setter";
+  static type_Setter(mthis, __arg_0) native "HTMLScriptElement_type_Setter";
+  type_Setter_(mthis, __arg_0) => type_Setter(mthis, __arg_0);
+
 }
 
-class BlinkHTMLSelectElement {
-  static autofocus_Getter(mthis) native "HTMLSelectElement_autofocus_Getter";
+class BlinkHTMLSelectElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLSelectElement();
 
-  static autofocus_Setter(mthis, value) native "HTMLSelectElement_autofocus_Setter";
+  static $__getter___Callback_1(mthis, __arg_0) native "HTMLSelectElement___getter___Callback";
+  $__getter___Callback_1_(mthis, __arg_0) => $__getter___Callback_1(mthis, __arg_0);
+
+  static $__setter___Callback_2(mthis, __arg_0, __arg_1) native "HTMLSelectElement___setter___Callback";
+  $__setter___Callback_2_(mthis, __arg_0, __arg_1) => $__setter___Callback_2(mthis, __arg_0, __arg_1);
+
+  static add_Callback_0(mthis) native "HTMLSelectElement_add_Callback";
+  add_Callback_0_(mthis) => add_Callback_0(mthis);
+
+  static add_Callback_1(mthis, __arg_0) native "HTMLSelectElement_add_Callback";
+  add_Callback_1_(mthis, __arg_0) => add_Callback_1(mthis, __arg_0);
+
+  static add_Callback_2(mthis, __arg_0, __arg_1) native "HTMLSelectElement_add_Callback";
+  add_Callback_2_(mthis, __arg_0, __arg_1) => add_Callback_2(mthis, __arg_0, __arg_1);
+
+  static add_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "HTMLSelectElement_add_Callback";
+  add_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => add_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static add_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "HTMLSelectElement_add_Callback";
+  add_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => add_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static autofocus_Getter(mthis) native "HTMLSelectElement_autofocus_Getter";
+  autofocus_Getter_(mthis) => autofocus_Getter(mthis);
+
+  static autofocus_Setter(mthis, __arg_0) native "HTMLSelectElement_autofocus_Setter";
+  autofocus_Setter_(mthis, __arg_0) => autofocus_Setter(mthis, __arg_0);
+
+  static checkValidity_Callback_0(mthis) native "HTMLSelectElement_checkValidity_Callback";
+  checkValidity_Callback_0_(mthis) => checkValidity_Callback_0(mthis);
+
+  static checkValidity_Callback_1(mthis, __arg_0) native "HTMLSelectElement_checkValidity_Callback";
+  checkValidity_Callback_1_(mthis, __arg_0) => checkValidity_Callback_1(mthis, __arg_0);
+
+  static checkValidity_Callback_2(mthis, __arg_0, __arg_1) native "HTMLSelectElement_checkValidity_Callback";
+  checkValidity_Callback_2_(mthis, __arg_0, __arg_1) => checkValidity_Callback_2(mthis, __arg_0, __arg_1);
 
   static disabled_Getter(mthis) native "HTMLSelectElement_disabled_Getter";
+  disabled_Getter_(mthis) => disabled_Getter(mthis);
 
-  static disabled_Setter(mthis, value) native "HTMLSelectElement_disabled_Setter";
+  static disabled_Setter(mthis, __arg_0) native "HTMLSelectElement_disabled_Setter";
+  disabled_Setter_(mthis, __arg_0) => disabled_Setter(mthis, __arg_0);
 
   static form_Getter(mthis) native "HTMLSelectElement_form_Getter";
+  form_Getter_(mthis) => form_Getter(mthis);
+
+  static item_Callback_0(mthis) native "HTMLSelectElement_item_Callback";
+  item_Callback_0_(mthis) => item_Callback_0(mthis);
+
+  static item_Callback_1(mthis, __arg_0) native "HTMLSelectElement_item_Callback";
+  item_Callback_1_(mthis, __arg_0) => item_Callback_1(mthis, __arg_0);
+
+  static item_Callback_2(mthis, __arg_0, __arg_1) native "HTMLSelectElement_item_Callback";
+  item_Callback_2_(mthis, __arg_0, __arg_1) => item_Callback_2(mthis, __arg_0, __arg_1);
+
+  static item_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "HTMLSelectElement_item_Callback";
+  item_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => item_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
   static labels_Getter(mthis) native "HTMLSelectElement_labels_Getter";
+  labels_Getter_(mthis) => labels_Getter(mthis);
 
   static length_Getter(mthis) native "HTMLSelectElement_length_Getter";
+  length_Getter_(mthis) => length_Getter(mthis);
 
-  static length_Setter(mthis, value) native "HTMLSelectElement_length_Setter";
+  static length_Setter(mthis, __arg_0) native "HTMLSelectElement_length_Setter";
+  length_Setter_(mthis, __arg_0) => length_Setter(mthis, __arg_0);
 
   static multiple_Getter(mthis) native "HTMLSelectElement_multiple_Getter";
+  multiple_Getter_(mthis) => multiple_Getter(mthis);
 
-  static multiple_Setter(mthis, value) native "HTMLSelectElement_multiple_Setter";
+  static multiple_Setter(mthis, __arg_0) native "HTMLSelectElement_multiple_Setter";
+  multiple_Setter_(mthis, __arg_0) => multiple_Setter(mthis, __arg_0);
 
   static name_Getter(mthis) native "HTMLSelectElement_name_Getter";
+  name_Getter_(mthis) => name_Getter(mthis);
 
-  static name_Setter(mthis, value) native "HTMLSelectElement_name_Setter";
+  static name_Setter(mthis, __arg_0) native "HTMLSelectElement_name_Setter";
+  name_Setter_(mthis, __arg_0) => name_Setter(mthis, __arg_0);
+
+  static namedItem_Callback_0(mthis) native "HTMLSelectElement_namedItem_Callback";
+  namedItem_Callback_0_(mthis) => namedItem_Callback_0(mthis);
+
+  static namedItem_Callback_1(mthis, __arg_0) native "HTMLSelectElement_namedItem_Callback";
+  namedItem_Callback_1_(mthis, __arg_0) => namedItem_Callback_1(mthis, __arg_0);
+
+  static namedItem_Callback_2(mthis, __arg_0, __arg_1) native "HTMLSelectElement_namedItem_Callback";
+  namedItem_Callback_2_(mthis, __arg_0, __arg_1) => namedItem_Callback_2(mthis, __arg_0, __arg_1);
+
+  static namedItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "HTMLSelectElement_namedItem_Callback";
+  namedItem_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => namedItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
   static required_Getter(mthis) native "HTMLSelectElement_required_Getter";
+  required_Getter_(mthis) => required_Getter(mthis);
 
-  static required_Setter(mthis, value) native "HTMLSelectElement_required_Setter";
+  static required_Setter(mthis, __arg_0) native "HTMLSelectElement_required_Setter";
+  required_Setter_(mthis, __arg_0) => required_Setter(mthis, __arg_0);
 
   static selectedIndex_Getter(mthis) native "HTMLSelectElement_selectedIndex_Getter";
+  selectedIndex_Getter_(mthis) => selectedIndex_Getter(mthis);
 
-  static selectedIndex_Setter(mthis, value) native "HTMLSelectElement_selectedIndex_Setter";
+  static selectedIndex_Setter(mthis, __arg_0) native "HTMLSelectElement_selectedIndex_Setter";
+  selectedIndex_Setter_(mthis, __arg_0) => selectedIndex_Setter(mthis, __arg_0);
+
+  static setCustomValidity_Callback_0(mthis) native "HTMLSelectElement_setCustomValidity_Callback";
+  setCustomValidity_Callback_0_(mthis) => setCustomValidity_Callback_0(mthis);
+
+  static setCustomValidity_Callback_1(mthis, __arg_0) native "HTMLSelectElement_setCustomValidity_Callback";
+  setCustomValidity_Callback_1_(mthis, __arg_0) => setCustomValidity_Callback_1(mthis, __arg_0);
+
+  static setCustomValidity_Callback_2(mthis, __arg_0, __arg_1) native "HTMLSelectElement_setCustomValidity_Callback";
+  setCustomValidity_Callback_2_(mthis, __arg_0, __arg_1) => setCustomValidity_Callback_2(mthis, __arg_0, __arg_1);
+
+  static setCustomValidity_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "HTMLSelectElement_setCustomValidity_Callback";
+  setCustomValidity_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => setCustomValidity_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
   static size_Getter(mthis) native "HTMLSelectElement_size_Getter";
+  size_Getter_(mthis) => size_Getter(mthis);
 
-  static size_Setter(mthis, value) native "HTMLSelectElement_size_Setter";
+  static size_Setter(mthis, __arg_0) native "HTMLSelectElement_size_Setter";
+  size_Setter_(mthis, __arg_0) => size_Setter(mthis, __arg_0);
 
   static type_Getter(mthis) native "HTMLSelectElement_type_Getter";
+  type_Getter_(mthis) => type_Getter(mthis);
 
   static validationMessage_Getter(mthis) native "HTMLSelectElement_validationMessage_Getter";
+  validationMessage_Getter_(mthis) => validationMessage_Getter(mthis);
 
   static validity_Getter(mthis) native "HTMLSelectElement_validity_Getter";
+  validity_Getter_(mthis) => validity_Getter(mthis);
 
   static value_Getter(mthis) native "HTMLSelectElement_value_Getter";
+  value_Getter_(mthis) => value_Getter(mthis);
 
-  static value_Setter(mthis, value) native "HTMLSelectElement_value_Setter";
+  static value_Setter(mthis, __arg_0) native "HTMLSelectElement_value_Setter";
+  value_Setter_(mthis, __arg_0) => value_Setter(mthis, __arg_0);
 
   static willValidate_Getter(mthis) native "HTMLSelectElement_willValidate_Getter";
+  willValidate_Getter_(mthis) => willValidate_Getter(mthis);
 
-  static $__setter___Callback_2(mthis, index, value) native "HTMLSelectElement___setter___Callback";
-
-  static add_Callback_2(mthis, element, before) native "HTMLSelectElement_add_Callback";
-
-  static checkValidity_Callback(mthis) native "HTMLSelectElement_checkValidity_Callback";
-
-  static item_Callback_1(mthis, index) native "HTMLSelectElement_item_Callback";
-
-  static namedItem_Callback_1(mthis, name) native "HTMLSelectElement_namedItem_Callback";
-
-  static setCustomValidity_Callback_1(mthis, error) native "HTMLSelectElement_setCustomValidity_Callback";
 }
 
-class BlinkHTMLShadowElement {
-  static getDistributedNodes_Callback(mthis) native "HTMLShadowElement_getDistributedNodes_Callback";
+class BlinkHTMLShadowElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLShadowElement();
+
+  static getDistributedNodes_Callback_0(mthis) native "HTMLShadowElement_getDistributedNodes_Callback";
+  getDistributedNodes_Callback_0_(mthis) => getDistributedNodes_Callback_0(mthis);
+
+  static getDistributedNodes_Callback_1(mthis, __arg_0) native "HTMLShadowElement_getDistributedNodes_Callback";
+  getDistributedNodes_Callback_1_(mthis, __arg_0) => getDistributedNodes_Callback_1(mthis, __arg_0);
+
+  static getDistributedNodes_Callback_2(mthis, __arg_0, __arg_1) native "HTMLShadowElement_getDistributedNodes_Callback";
+  getDistributedNodes_Callback_2_(mthis, __arg_0, __arg_1) => getDistributedNodes_Callback_2(mthis, __arg_0, __arg_1);
+
 }
 
-class BlinkHTMLSourceElement {
+class BlinkHTMLSourceElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLSourceElement();
+
   static integrity_Getter(mthis) native "HTMLSourceElement_integrity_Getter";
+  integrity_Getter_(mthis) => integrity_Getter(mthis);
 
-  static integrity_Setter(mthis, value) native "HTMLSourceElement_integrity_Setter";
+  static integrity_Setter(mthis, __arg_0) native "HTMLSourceElement_integrity_Setter";
+  integrity_Setter_(mthis, __arg_0) => integrity_Setter(mthis, __arg_0);
 
   static media_Getter(mthis) native "HTMLSourceElement_media_Getter";
+  media_Getter_(mthis) => media_Getter(mthis);
 
-  static media_Setter(mthis, value) native "HTMLSourceElement_media_Setter";
+  static media_Setter(mthis, __arg_0) native "HTMLSourceElement_media_Setter";
+  media_Setter_(mthis, __arg_0) => media_Setter(mthis, __arg_0);
 
   static sizes_Getter(mthis) native "HTMLSourceElement_sizes_Getter";
+  sizes_Getter_(mthis) => sizes_Getter(mthis);
 
-  static sizes_Setter(mthis, value) native "HTMLSourceElement_sizes_Setter";
+  static sizes_Setter(mthis, __arg_0) native "HTMLSourceElement_sizes_Setter";
+  sizes_Setter_(mthis, __arg_0) => sizes_Setter(mthis, __arg_0);
 
   static src_Getter(mthis) native "HTMLSourceElement_src_Getter";
+  src_Getter_(mthis) => src_Getter(mthis);
 
-  static src_Setter(mthis, value) native "HTMLSourceElement_src_Setter";
+  static src_Setter(mthis, __arg_0) native "HTMLSourceElement_src_Setter";
+  src_Setter_(mthis, __arg_0) => src_Setter(mthis, __arg_0);
 
   static srcset_Getter(mthis) native "HTMLSourceElement_srcset_Getter";
+  srcset_Getter_(mthis) => srcset_Getter(mthis);
 
-  static srcset_Setter(mthis, value) native "HTMLSourceElement_srcset_Setter";
+  static srcset_Setter(mthis, __arg_0) native "HTMLSourceElement_srcset_Setter";
+  srcset_Setter_(mthis, __arg_0) => srcset_Setter(mthis, __arg_0);
 
   static type_Getter(mthis) native "HTMLSourceElement_type_Getter";
+  type_Getter_(mthis) => type_Getter(mthis);
 
-  static type_Setter(mthis, value) native "HTMLSourceElement_type_Setter";
+  static type_Setter(mthis, __arg_0) native "HTMLSourceElement_type_Setter";
+  type_Setter_(mthis, __arg_0) => type_Setter(mthis, __arg_0);
+
 }
 
-class BlinkHTMLSpanElement {}
+class BlinkHTMLSpanElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLSpanElement();
 
-class BlinkHTMLStyleElement {
+}
+
+class BlinkHTMLStyleElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLStyleElement();
+
   static disabled_Getter(mthis) native "HTMLStyleElement_disabled_Getter";
+  disabled_Getter_(mthis) => disabled_Getter(mthis);
 
-  static disabled_Setter(mthis, value) native "HTMLStyleElement_disabled_Setter";
+  static disabled_Setter(mthis, __arg_0) native "HTMLStyleElement_disabled_Setter";
+  disabled_Setter_(mthis, __arg_0) => disabled_Setter(mthis, __arg_0);
 
   static media_Getter(mthis) native "HTMLStyleElement_media_Getter";
+  media_Getter_(mthis) => media_Getter(mthis);
 
-  static media_Setter(mthis, value) native "HTMLStyleElement_media_Setter";
+  static media_Setter(mthis, __arg_0) native "HTMLStyleElement_media_Setter";
+  media_Setter_(mthis, __arg_0) => media_Setter(mthis, __arg_0);
 
   static sheet_Getter(mthis) native "HTMLStyleElement_sheet_Getter";
+  sheet_Getter_(mthis) => sheet_Getter(mthis);
 
   static type_Getter(mthis) native "HTMLStyleElement_type_Getter";
+  type_Getter_(mthis) => type_Getter(mthis);
 
-  static type_Setter(mthis, value) native "HTMLStyleElement_type_Setter";
+  static type_Setter(mthis, __arg_0) native "HTMLStyleElement_type_Setter";
+  type_Setter_(mthis, __arg_0) => type_Setter(mthis, __arg_0);
+
 }
 
-class BlinkHTMLTableCaptionElement {}
+class BlinkHTMLTableCaptionElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLTableCaptionElement();
 
-class BlinkHTMLTableCellElement {
+}
+
+class BlinkHTMLTableCellElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLTableCellElement();
+
   static cellIndex_Getter(mthis) native "HTMLTableCellElement_cellIndex_Getter";
+  cellIndex_Getter_(mthis) => cellIndex_Getter(mthis);
 
   static colSpan_Getter(mthis) native "HTMLTableCellElement_colSpan_Getter";
+  colSpan_Getter_(mthis) => colSpan_Getter(mthis);
 
-  static colSpan_Setter(mthis, value) native "HTMLTableCellElement_colSpan_Setter";
+  static colSpan_Setter(mthis, __arg_0) native "HTMLTableCellElement_colSpan_Setter";
+  colSpan_Setter_(mthis, __arg_0) => colSpan_Setter(mthis, __arg_0);
 
   static headers_Getter(mthis) native "HTMLTableCellElement_headers_Getter";
+  headers_Getter_(mthis) => headers_Getter(mthis);
 
-  static headers_Setter(mthis, value) native "HTMLTableCellElement_headers_Setter";
+  static headers_Setter(mthis, __arg_0) native "HTMLTableCellElement_headers_Setter";
+  headers_Setter_(mthis, __arg_0) => headers_Setter(mthis, __arg_0);
 
   static rowSpan_Getter(mthis) native "HTMLTableCellElement_rowSpan_Getter";
+  rowSpan_Getter_(mthis) => rowSpan_Getter(mthis);
 
-  static rowSpan_Setter(mthis, value) native "HTMLTableCellElement_rowSpan_Setter";
+  static rowSpan_Setter(mthis, __arg_0) native "HTMLTableCellElement_rowSpan_Setter";
+  rowSpan_Setter_(mthis, __arg_0) => rowSpan_Setter(mthis, __arg_0);
+
 }
 
-class BlinkHTMLTableColElement {
+class BlinkHTMLTableColElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLTableColElement();
+
   static span_Getter(mthis) native "HTMLTableColElement_span_Getter";
+  span_Getter_(mthis) => span_Getter(mthis);
 
-  static span_Setter(mthis, value) native "HTMLTableColElement_span_Setter";
+  static span_Setter(mthis, __arg_0) native "HTMLTableColElement_span_Setter";
+  span_Setter_(mthis, __arg_0) => span_Setter(mthis, __arg_0);
+
 }
 
-class BlinkHTMLTableElement {
-  static caption_Getter(mthis) native "HTMLTableElement_caption_Getter";
+class BlinkHTMLTableElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLTableElement();
 
-  static caption_Setter(mthis, value) native "HTMLTableElement_caption_Setter";
+  static border_Getter(mthis) native "HTMLTableElement_border_Getter";
+  border_Getter_(mthis) => border_Getter(mthis);
+
+  static border_Setter(mthis, __arg_0) native "HTMLTableElement_border_Setter";
+  border_Setter_(mthis, __arg_0) => border_Setter(mthis, __arg_0);
+
+  static caption_Getter(mthis) native "HTMLTableElement_caption_Getter";
+  caption_Getter_(mthis) => caption_Getter(mthis);
+
+  static caption_Setter(mthis, __arg_0) native "HTMLTableElement_caption_Setter";
+  caption_Setter_(mthis, __arg_0) => caption_Setter(mthis, __arg_0);
+
+  static createCaption_Callback_0(mthis) native "HTMLTableElement_createCaption_Callback";
+  createCaption_Callback_0_(mthis) => createCaption_Callback_0(mthis);
+
+  static createCaption_Callback_1(mthis, __arg_0) native "HTMLTableElement_createCaption_Callback";
+  createCaption_Callback_1_(mthis, __arg_0) => createCaption_Callback_1(mthis, __arg_0);
+
+  static createCaption_Callback_2(mthis, __arg_0, __arg_1) native "HTMLTableElement_createCaption_Callback";
+  createCaption_Callback_2_(mthis, __arg_0, __arg_1) => createCaption_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createTBody_Callback_0(mthis) native "HTMLTableElement_createTBody_Callback";
+  createTBody_Callback_0_(mthis) => createTBody_Callback_0(mthis);
+
+  static createTBody_Callback_1(mthis, __arg_0) native "HTMLTableElement_createTBody_Callback";
+  createTBody_Callback_1_(mthis, __arg_0) => createTBody_Callback_1(mthis, __arg_0);
+
+  static createTBody_Callback_2(mthis, __arg_0, __arg_1) native "HTMLTableElement_createTBody_Callback";
+  createTBody_Callback_2_(mthis, __arg_0, __arg_1) => createTBody_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createTFoot_Callback_0(mthis) native "HTMLTableElement_createTFoot_Callback";
+  createTFoot_Callback_0_(mthis) => createTFoot_Callback_0(mthis);
+
+  static createTFoot_Callback_1(mthis, __arg_0) native "HTMLTableElement_createTFoot_Callback";
+  createTFoot_Callback_1_(mthis, __arg_0) => createTFoot_Callback_1(mthis, __arg_0);
+
+  static createTFoot_Callback_2(mthis, __arg_0, __arg_1) native "HTMLTableElement_createTFoot_Callback";
+  createTFoot_Callback_2_(mthis, __arg_0, __arg_1) => createTFoot_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createTHead_Callback_0(mthis) native "HTMLTableElement_createTHead_Callback";
+  createTHead_Callback_0_(mthis) => createTHead_Callback_0(mthis);
+
+  static createTHead_Callback_1(mthis, __arg_0) native "HTMLTableElement_createTHead_Callback";
+  createTHead_Callback_1_(mthis, __arg_0) => createTHead_Callback_1(mthis, __arg_0);
+
+  static createTHead_Callback_2(mthis, __arg_0, __arg_1) native "HTMLTableElement_createTHead_Callback";
+  createTHead_Callback_2_(mthis, __arg_0, __arg_1) => createTHead_Callback_2(mthis, __arg_0, __arg_1);
+
+  static deleteCaption_Callback_0(mthis) native "HTMLTableElement_deleteCaption_Callback";
+  deleteCaption_Callback_0_(mthis) => deleteCaption_Callback_0(mthis);
+
+  static deleteCaption_Callback_1(mthis, __arg_0) native "HTMLTableElement_deleteCaption_Callback";
+  deleteCaption_Callback_1_(mthis, __arg_0) => deleteCaption_Callback_1(mthis, __arg_0);
+
+  static deleteCaption_Callback_2(mthis, __arg_0, __arg_1) native "HTMLTableElement_deleteCaption_Callback";
+  deleteCaption_Callback_2_(mthis, __arg_0, __arg_1) => deleteCaption_Callback_2(mthis, __arg_0, __arg_1);
+
+  static deleteRow_Callback_0(mthis) native "HTMLTableElement_deleteRow_Callback";
+  deleteRow_Callback_0_(mthis) => deleteRow_Callback_0(mthis);
+
+  static deleteRow_Callback_1(mthis, __arg_0) native "HTMLTableElement_deleteRow_Callback";
+  deleteRow_Callback_1_(mthis, __arg_0) => deleteRow_Callback_1(mthis, __arg_0);
+
+  static deleteRow_Callback_2(mthis, __arg_0, __arg_1) native "HTMLTableElement_deleteRow_Callback";
+  deleteRow_Callback_2_(mthis, __arg_0, __arg_1) => deleteRow_Callback_2(mthis, __arg_0, __arg_1);
+
+  static deleteRow_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "HTMLTableElement_deleteRow_Callback";
+  deleteRow_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => deleteRow_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static deleteTFoot_Callback_0(mthis) native "HTMLTableElement_deleteTFoot_Callback";
+  deleteTFoot_Callback_0_(mthis) => deleteTFoot_Callback_0(mthis);
+
+  static deleteTFoot_Callback_1(mthis, __arg_0) native "HTMLTableElement_deleteTFoot_Callback";
+  deleteTFoot_Callback_1_(mthis, __arg_0) => deleteTFoot_Callback_1(mthis, __arg_0);
+
+  static deleteTFoot_Callback_2(mthis, __arg_0, __arg_1) native "HTMLTableElement_deleteTFoot_Callback";
+  deleteTFoot_Callback_2_(mthis, __arg_0, __arg_1) => deleteTFoot_Callback_2(mthis, __arg_0, __arg_1);
+
+  static deleteTHead_Callback_0(mthis) native "HTMLTableElement_deleteTHead_Callback";
+  deleteTHead_Callback_0_(mthis) => deleteTHead_Callback_0(mthis);
+
+  static deleteTHead_Callback_1(mthis, __arg_0) native "HTMLTableElement_deleteTHead_Callback";
+  deleteTHead_Callback_1_(mthis, __arg_0) => deleteTHead_Callback_1(mthis, __arg_0);
+
+  static deleteTHead_Callback_2(mthis, __arg_0, __arg_1) native "HTMLTableElement_deleteTHead_Callback";
+  deleteTHead_Callback_2_(mthis, __arg_0, __arg_1) => deleteTHead_Callback_2(mthis, __arg_0, __arg_1);
+
+  static insertRow_Callback_0(mthis) native "HTMLTableElement_insertRow_Callback";
+  insertRow_Callback_0_(mthis) => insertRow_Callback_0(mthis);
+
+  static insertRow_Callback_1(mthis, __arg_0) native "HTMLTableElement_insertRow_Callback";
+  insertRow_Callback_1_(mthis, __arg_0) => insertRow_Callback_1(mthis, __arg_0);
+
+  static insertRow_Callback_2(mthis, __arg_0, __arg_1) native "HTMLTableElement_insertRow_Callback";
+  insertRow_Callback_2_(mthis, __arg_0, __arg_1) => insertRow_Callback_2(mthis, __arg_0, __arg_1);
+
+  static insertRow_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "HTMLTableElement_insertRow_Callback";
+  insertRow_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => insertRow_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
   static rows_Getter(mthis) native "HTMLTableElement_rows_Getter";
+  rows_Getter_(mthis) => rows_Getter(mthis);
 
   static tBodies_Getter(mthis) native "HTMLTableElement_tBodies_Getter";
+  tBodies_Getter_(mthis) => tBodies_Getter(mthis);
 
   static tFoot_Getter(mthis) native "HTMLTableElement_tFoot_Getter";
+  tFoot_Getter_(mthis) => tFoot_Getter(mthis);
 
-  static tFoot_Setter(mthis, value) native "HTMLTableElement_tFoot_Setter";
+  static tFoot_Setter(mthis, __arg_0) native "HTMLTableElement_tFoot_Setter";
+  tFoot_Setter_(mthis, __arg_0) => tFoot_Setter(mthis, __arg_0);
 
   static tHead_Getter(mthis) native "HTMLTableElement_tHead_Getter";
+  tHead_Getter_(mthis) => tHead_Getter(mthis);
 
-  static tHead_Setter(mthis, value) native "HTMLTableElement_tHead_Setter";
+  static tHead_Setter(mthis, __arg_0) native "HTMLTableElement_tHead_Setter";
+  tHead_Setter_(mthis, __arg_0) => tHead_Setter(mthis, __arg_0);
 
-  static createCaption_Callback(mthis) native "HTMLTableElement_createCaption_Callback";
-
-  static createTBody_Callback(mthis) native "HTMLTableElement_createTBody_Callback";
-
-  static createTFoot_Callback(mthis) native "HTMLTableElement_createTFoot_Callback";
-
-  static createTHead_Callback(mthis) native "HTMLTableElement_createTHead_Callback";
-
-  static deleteCaption_Callback(mthis) native "HTMLTableElement_deleteCaption_Callback";
-
-  static deleteRow_Callback_1(mthis, index) native "HTMLTableElement_deleteRow_Callback";
-
-  static deleteTFoot_Callback(mthis) native "HTMLTableElement_deleteTFoot_Callback";
-
-  static deleteTHead_Callback(mthis) native "HTMLTableElement_deleteTHead_Callback";
-
-  static insertRow_Callback_1(mthis, index) native "HTMLTableElement_insertRow_Callback";
-
-  static insertRow_Callback(mthis) native "HTMLTableElement_insertRow_Callback";
 }
 
-class BlinkHTMLTableRowElement {
+class BlinkHTMLTableRowElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLTableRowElement();
+
   static cells_Getter(mthis) native "HTMLTableRowElement_cells_Getter";
+  cells_Getter_(mthis) => cells_Getter(mthis);
+
+  static deleteCell_Callback_0(mthis) native "HTMLTableRowElement_deleteCell_Callback";
+  deleteCell_Callback_0_(mthis) => deleteCell_Callback_0(mthis);
+
+  static deleteCell_Callback_1(mthis, __arg_0) native "HTMLTableRowElement_deleteCell_Callback";
+  deleteCell_Callback_1_(mthis, __arg_0) => deleteCell_Callback_1(mthis, __arg_0);
+
+  static deleteCell_Callback_2(mthis, __arg_0, __arg_1) native "HTMLTableRowElement_deleteCell_Callback";
+  deleteCell_Callback_2_(mthis, __arg_0, __arg_1) => deleteCell_Callback_2(mthis, __arg_0, __arg_1);
+
+  static deleteCell_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "HTMLTableRowElement_deleteCell_Callback";
+  deleteCell_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => deleteCell_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static insertCell_Callback_0(mthis) native "HTMLTableRowElement_insertCell_Callback";
+  insertCell_Callback_0_(mthis) => insertCell_Callback_0(mthis);
+
+  static insertCell_Callback_1(mthis, __arg_0) native "HTMLTableRowElement_insertCell_Callback";
+  insertCell_Callback_1_(mthis, __arg_0) => insertCell_Callback_1(mthis, __arg_0);
+
+  static insertCell_Callback_2(mthis, __arg_0, __arg_1) native "HTMLTableRowElement_insertCell_Callback";
+  insertCell_Callback_2_(mthis, __arg_0, __arg_1) => insertCell_Callback_2(mthis, __arg_0, __arg_1);
+
+  static insertCell_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "HTMLTableRowElement_insertCell_Callback";
+  insertCell_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => insertCell_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
   static rowIndex_Getter(mthis) native "HTMLTableRowElement_rowIndex_Getter";
+  rowIndex_Getter_(mthis) => rowIndex_Getter(mthis);
 
   static sectionRowIndex_Getter(mthis) native "HTMLTableRowElement_sectionRowIndex_Getter";
+  sectionRowIndex_Getter_(mthis) => sectionRowIndex_Getter(mthis);
 
-  static deleteCell_Callback_1(mthis, index) native "HTMLTableRowElement_deleteCell_Callback";
-
-  static insertCell_Callback_1(mthis, index) native "HTMLTableRowElement_insertCell_Callback";
-
-  static insertCell_Callback(mthis) native "HTMLTableRowElement_insertCell_Callback";
 }
 
-class BlinkHTMLTableSectionElement {
+class BlinkHTMLTableSectionElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLTableSectionElement();
+
+  static deleteRow_Callback_0(mthis) native "HTMLTableSectionElement_deleteRow_Callback";
+  deleteRow_Callback_0_(mthis) => deleteRow_Callback_0(mthis);
+
+  static deleteRow_Callback_1(mthis, __arg_0) native "HTMLTableSectionElement_deleteRow_Callback";
+  deleteRow_Callback_1_(mthis, __arg_0) => deleteRow_Callback_1(mthis, __arg_0);
+
+  static deleteRow_Callback_2(mthis, __arg_0, __arg_1) native "HTMLTableSectionElement_deleteRow_Callback";
+  deleteRow_Callback_2_(mthis, __arg_0, __arg_1) => deleteRow_Callback_2(mthis, __arg_0, __arg_1);
+
+  static deleteRow_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "HTMLTableSectionElement_deleteRow_Callback";
+  deleteRow_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => deleteRow_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static insertRow_Callback_0(mthis) native "HTMLTableSectionElement_insertRow_Callback";
+  insertRow_Callback_0_(mthis) => insertRow_Callback_0(mthis);
+
+  static insertRow_Callback_1(mthis, __arg_0) native "HTMLTableSectionElement_insertRow_Callback";
+  insertRow_Callback_1_(mthis, __arg_0) => insertRow_Callback_1(mthis, __arg_0);
+
+  static insertRow_Callback_2(mthis, __arg_0, __arg_1) native "HTMLTableSectionElement_insertRow_Callback";
+  insertRow_Callback_2_(mthis, __arg_0, __arg_1) => insertRow_Callback_2(mthis, __arg_0, __arg_1);
+
+  static insertRow_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "HTMLTableSectionElement_insertRow_Callback";
+  insertRow_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => insertRow_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
   static rows_Getter(mthis) native "HTMLTableSectionElement_rows_Getter";
+  rows_Getter_(mthis) => rows_Getter(mthis);
 
-  static deleteRow_Callback_1(mthis, index) native "HTMLTableSectionElement_deleteRow_Callback";
-
-  static insertRow_Callback_1(mthis, index) native "HTMLTableSectionElement_insertRow_Callback";
-
-  static insertRow_Callback(mthis) native "HTMLTableSectionElement_insertRow_Callback";
 }
 
-class BlinkHTMLTemplateElement {
+class BlinkHTMLTemplateElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLTemplateElement();
+
   static content_Getter(mthis) native "HTMLTemplateElement_content_Getter";
+  content_Getter_(mthis) => content_Getter(mthis);
+
 }
 
-class BlinkHTMLTextAreaElement {
-  static autofocus_Getter(mthis) native "HTMLTextAreaElement_autofocus_Getter";
+class BlinkHTMLTextAreaElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLTextAreaElement();
 
-  static autofocus_Setter(mthis, value) native "HTMLTextAreaElement_autofocus_Setter";
+  static autofocus_Getter(mthis) native "HTMLTextAreaElement_autofocus_Getter";
+  autofocus_Getter_(mthis) => autofocus_Getter(mthis);
+
+  static autofocus_Setter(mthis, __arg_0) native "HTMLTextAreaElement_autofocus_Setter";
+  autofocus_Setter_(mthis, __arg_0) => autofocus_Setter(mthis, __arg_0);
+
+  static checkValidity_Callback_0(mthis) native "HTMLTextAreaElement_checkValidity_Callback";
+  checkValidity_Callback_0_(mthis) => checkValidity_Callback_0(mthis);
+
+  static checkValidity_Callback_1(mthis, __arg_0) native "HTMLTextAreaElement_checkValidity_Callback";
+  checkValidity_Callback_1_(mthis, __arg_0) => checkValidity_Callback_1(mthis, __arg_0);
+
+  static checkValidity_Callback_2(mthis, __arg_0, __arg_1) native "HTMLTextAreaElement_checkValidity_Callback";
+  checkValidity_Callback_2_(mthis, __arg_0, __arg_1) => checkValidity_Callback_2(mthis, __arg_0, __arg_1);
 
   static cols_Getter(mthis) native "HTMLTextAreaElement_cols_Getter";
+  cols_Getter_(mthis) => cols_Getter(mthis);
 
-  static cols_Setter(mthis, value) native "HTMLTextAreaElement_cols_Setter";
+  static cols_Setter(mthis, __arg_0) native "HTMLTextAreaElement_cols_Setter";
+  cols_Setter_(mthis, __arg_0) => cols_Setter(mthis, __arg_0);
 
   static defaultValue_Getter(mthis) native "HTMLTextAreaElement_defaultValue_Getter";
+  defaultValue_Getter_(mthis) => defaultValue_Getter(mthis);
 
-  static defaultValue_Setter(mthis, value) native "HTMLTextAreaElement_defaultValue_Setter";
+  static defaultValue_Setter(mthis, __arg_0) native "HTMLTextAreaElement_defaultValue_Setter";
+  defaultValue_Setter_(mthis, __arg_0) => defaultValue_Setter(mthis, __arg_0);
 
   static dirName_Getter(mthis) native "HTMLTextAreaElement_dirName_Getter";
+  dirName_Getter_(mthis) => dirName_Getter(mthis);
 
-  static dirName_Setter(mthis, value) native "HTMLTextAreaElement_dirName_Setter";
+  static dirName_Setter(mthis, __arg_0) native "HTMLTextAreaElement_dirName_Setter";
+  dirName_Setter_(mthis, __arg_0) => dirName_Setter(mthis, __arg_0);
 
   static disabled_Getter(mthis) native "HTMLTextAreaElement_disabled_Getter";
+  disabled_Getter_(mthis) => disabled_Getter(mthis);
 
-  static disabled_Setter(mthis, value) native "HTMLTextAreaElement_disabled_Setter";
+  static disabled_Setter(mthis, __arg_0) native "HTMLTextAreaElement_disabled_Setter";
+  disabled_Setter_(mthis, __arg_0) => disabled_Setter(mthis, __arg_0);
 
   static form_Getter(mthis) native "HTMLTextAreaElement_form_Getter";
+  form_Getter_(mthis) => form_Getter(mthis);
 
   static inputMode_Getter(mthis) native "HTMLTextAreaElement_inputMode_Getter";
+  inputMode_Getter_(mthis) => inputMode_Getter(mthis);
 
-  static inputMode_Setter(mthis, value) native "HTMLTextAreaElement_inputMode_Setter";
+  static inputMode_Setter(mthis, __arg_0) native "HTMLTextAreaElement_inputMode_Setter";
+  inputMode_Setter_(mthis, __arg_0) => inputMode_Setter(mthis, __arg_0);
 
   static labels_Getter(mthis) native "HTMLTextAreaElement_labels_Getter";
+  labels_Getter_(mthis) => labels_Getter(mthis);
 
   static maxLength_Getter(mthis) native "HTMLTextAreaElement_maxLength_Getter";
+  maxLength_Getter_(mthis) => maxLength_Getter(mthis);
 
-  static maxLength_Setter(mthis, value) native "HTMLTextAreaElement_maxLength_Setter";
+  static maxLength_Setter(mthis, __arg_0) native "HTMLTextAreaElement_maxLength_Setter";
+  maxLength_Setter_(mthis, __arg_0) => maxLength_Setter(mthis, __arg_0);
 
   static name_Getter(mthis) native "HTMLTextAreaElement_name_Getter";
+  name_Getter_(mthis) => name_Getter(mthis);
 
-  static name_Setter(mthis, value) native "HTMLTextAreaElement_name_Setter";
+  static name_Setter(mthis, __arg_0) native "HTMLTextAreaElement_name_Setter";
+  name_Setter_(mthis, __arg_0) => name_Setter(mthis, __arg_0);
 
   static placeholder_Getter(mthis) native "HTMLTextAreaElement_placeholder_Getter";
+  placeholder_Getter_(mthis) => placeholder_Getter(mthis);
 
-  static placeholder_Setter(mthis, value) native "HTMLTextAreaElement_placeholder_Setter";
+  static placeholder_Setter(mthis, __arg_0) native "HTMLTextAreaElement_placeholder_Setter";
+  placeholder_Setter_(mthis, __arg_0) => placeholder_Setter(mthis, __arg_0);
 
   static readOnly_Getter(mthis) native "HTMLTextAreaElement_readOnly_Getter";
+  readOnly_Getter_(mthis) => readOnly_Getter(mthis);
 
-  static readOnly_Setter(mthis, value) native "HTMLTextAreaElement_readOnly_Setter";
+  static readOnly_Setter(mthis, __arg_0) native "HTMLTextAreaElement_readOnly_Setter";
+  readOnly_Setter_(mthis, __arg_0) => readOnly_Setter(mthis, __arg_0);
 
   static required_Getter(mthis) native "HTMLTextAreaElement_required_Getter";
+  required_Getter_(mthis) => required_Getter(mthis);
 
-  static required_Setter(mthis, value) native "HTMLTextAreaElement_required_Setter";
+  static required_Setter(mthis, __arg_0) native "HTMLTextAreaElement_required_Setter";
+  required_Setter_(mthis, __arg_0) => required_Setter(mthis, __arg_0);
 
   static rows_Getter(mthis) native "HTMLTextAreaElement_rows_Getter";
+  rows_Getter_(mthis) => rows_Getter(mthis);
 
-  static rows_Setter(mthis, value) native "HTMLTextAreaElement_rows_Setter";
+  static rows_Setter(mthis, __arg_0) native "HTMLTextAreaElement_rows_Setter";
+  rows_Setter_(mthis, __arg_0) => rows_Setter(mthis, __arg_0);
+
+  static select_Callback_0(mthis) native "HTMLTextAreaElement_select_Callback";
+  select_Callback_0_(mthis) => select_Callback_0(mthis);
+
+  static select_Callback_1(mthis, __arg_0) native "HTMLTextAreaElement_select_Callback";
+  select_Callback_1_(mthis, __arg_0) => select_Callback_1(mthis, __arg_0);
+
+  static select_Callback_2(mthis, __arg_0, __arg_1) native "HTMLTextAreaElement_select_Callback";
+  select_Callback_2_(mthis, __arg_0, __arg_1) => select_Callback_2(mthis, __arg_0, __arg_1);
 
   static selectionDirection_Getter(mthis) native "HTMLTextAreaElement_selectionDirection_Getter";
+  selectionDirection_Getter_(mthis) => selectionDirection_Getter(mthis);
 
-  static selectionDirection_Setter(mthis, value) native "HTMLTextAreaElement_selectionDirection_Setter";
+  static selectionDirection_Setter(mthis, __arg_0) native "HTMLTextAreaElement_selectionDirection_Setter";
+  selectionDirection_Setter_(mthis, __arg_0) => selectionDirection_Setter(mthis, __arg_0);
 
   static selectionEnd_Getter(mthis) native "HTMLTextAreaElement_selectionEnd_Getter";
+  selectionEnd_Getter_(mthis) => selectionEnd_Getter(mthis);
 
-  static selectionEnd_Setter(mthis, value) native "HTMLTextAreaElement_selectionEnd_Setter";
+  static selectionEnd_Setter(mthis, __arg_0) native "HTMLTextAreaElement_selectionEnd_Setter";
+  selectionEnd_Setter_(mthis, __arg_0) => selectionEnd_Setter(mthis, __arg_0);
 
   static selectionStart_Getter(mthis) native "HTMLTextAreaElement_selectionStart_Getter";
+  selectionStart_Getter_(mthis) => selectionStart_Getter(mthis);
 
-  static selectionStart_Setter(mthis, value) native "HTMLTextAreaElement_selectionStart_Setter";
+  static selectionStart_Setter(mthis, __arg_0) native "HTMLTextAreaElement_selectionStart_Setter";
+  selectionStart_Setter_(mthis, __arg_0) => selectionStart_Setter(mthis, __arg_0);
+
+  static setCustomValidity_Callback_0(mthis) native "HTMLTextAreaElement_setCustomValidity_Callback";
+  setCustomValidity_Callback_0_(mthis) => setCustomValidity_Callback_0(mthis);
+
+  static setCustomValidity_Callback_1(mthis, __arg_0) native "HTMLTextAreaElement_setCustomValidity_Callback";
+  setCustomValidity_Callback_1_(mthis, __arg_0) => setCustomValidity_Callback_1(mthis, __arg_0);
+
+  static setCustomValidity_Callback_2(mthis, __arg_0, __arg_1) native "HTMLTextAreaElement_setCustomValidity_Callback";
+  setCustomValidity_Callback_2_(mthis, __arg_0, __arg_1) => setCustomValidity_Callback_2(mthis, __arg_0, __arg_1);
+
+  static setCustomValidity_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "HTMLTextAreaElement_setCustomValidity_Callback";
+  setCustomValidity_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => setCustomValidity_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static setRangeText_Callback_0(mthis) native "HTMLTextAreaElement_setRangeText_Callback";
+  setRangeText_Callback_0_(mthis) => setRangeText_Callback_0(mthis);
+
+  static setRangeText_Callback_1(mthis, __arg_0) native "HTMLTextAreaElement_setRangeText_Callback";
+  setRangeText_Callback_1_(mthis, __arg_0) => setRangeText_Callback_1(mthis, __arg_0);
+
+  static setRangeText_Callback_2(mthis, __arg_0, __arg_1) native "HTMLTextAreaElement_setRangeText_Callback";
+  setRangeText_Callback_2_(mthis, __arg_0, __arg_1) => setRangeText_Callback_2(mthis, __arg_0, __arg_1);
+
+  static setRangeText_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "HTMLTextAreaElement_setRangeText_Callback";
+  setRangeText_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => setRangeText_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static setRangeText_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "HTMLTextAreaElement_setRangeText_Callback";
+  setRangeText_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => setRangeText_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static setRangeText_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "HTMLTextAreaElement_setRangeText_Callback";
+  setRangeText_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => setRangeText_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static setRangeText_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "HTMLTextAreaElement_setRangeText_Callback";
+  setRangeText_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => setRangeText_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static setSelectionRange_Callback_0(mthis) native "HTMLTextAreaElement_setSelectionRange_Callback";
+  setSelectionRange_Callback_0_(mthis) => setSelectionRange_Callback_0(mthis);
+
+  static setSelectionRange_Callback_1(mthis, __arg_0) native "HTMLTextAreaElement_setSelectionRange_Callback";
+  setSelectionRange_Callback_1_(mthis, __arg_0) => setSelectionRange_Callback_1(mthis, __arg_0);
+
+  static setSelectionRange_Callback_2(mthis, __arg_0, __arg_1) native "HTMLTextAreaElement_setSelectionRange_Callback";
+  setSelectionRange_Callback_2_(mthis, __arg_0, __arg_1) => setSelectionRange_Callback_2(mthis, __arg_0, __arg_1);
+
+  static setSelectionRange_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "HTMLTextAreaElement_setSelectionRange_Callback";
+  setSelectionRange_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => setSelectionRange_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static setSelectionRange_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "HTMLTextAreaElement_setSelectionRange_Callback";
+  setSelectionRange_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => setSelectionRange_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static setSelectionRange_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "HTMLTextAreaElement_setSelectionRange_Callback";
+  setSelectionRange_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => setSelectionRange_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
 
   static textLength_Getter(mthis) native "HTMLTextAreaElement_textLength_Getter";
+  textLength_Getter_(mthis) => textLength_Getter(mthis);
 
   static type_Getter(mthis) native "HTMLTextAreaElement_type_Getter";
+  type_Getter_(mthis) => type_Getter(mthis);
 
   static validationMessage_Getter(mthis) native "HTMLTextAreaElement_validationMessage_Getter";
+  validationMessage_Getter_(mthis) => validationMessage_Getter(mthis);
 
   static validity_Getter(mthis) native "HTMLTextAreaElement_validity_Getter";
+  validity_Getter_(mthis) => validity_Getter(mthis);
 
   static value_Getter(mthis) native "HTMLTextAreaElement_value_Getter";
+  value_Getter_(mthis) => value_Getter(mthis);
 
-  static value_Setter(mthis, value) native "HTMLTextAreaElement_value_Setter";
+  static value_Setter(mthis, __arg_0) native "HTMLTextAreaElement_value_Setter";
+  value_Setter_(mthis, __arg_0) => value_Setter(mthis, __arg_0);
 
   static willValidate_Getter(mthis) native "HTMLTextAreaElement_willValidate_Getter";
+  willValidate_Getter_(mthis) => willValidate_Getter(mthis);
 
   static wrap_Getter(mthis) native "HTMLTextAreaElement_wrap_Getter";
+  wrap_Getter_(mthis) => wrap_Getter(mthis);
 
-  static wrap_Setter(mthis, value) native "HTMLTextAreaElement_wrap_Setter";
+  static wrap_Setter(mthis, __arg_0) native "HTMLTextAreaElement_wrap_Setter";
+  wrap_Setter_(mthis, __arg_0) => wrap_Setter(mthis, __arg_0);
 
-  static checkValidity_Callback(mthis) native "HTMLTextAreaElement_checkValidity_Callback";
-
-  static select_Callback(mthis) native "HTMLTextAreaElement_select_Callback";
-
-  static setCustomValidity_Callback_1(mthis, error) native "HTMLTextAreaElement_setCustomValidity_Callback";
-
-  static setRangeText_Callback_1(mthis, replacement) native "HTMLTextAreaElement_setRangeText_Callback";
-
-  static setRangeText_Callback_4(mthis, replacement, start, end, selectionMode) native "HTMLTextAreaElement_setRangeText_Callback";
-
-  static setSelectionRange_Callback_3(mthis, start, end, direction) native "HTMLTextAreaElement_setSelectionRange_Callback";
-
-  static setSelectionRange_Callback_2(mthis, start, end) native "HTMLTextAreaElement_setSelectionRange_Callback";
 }
 
-class BlinkHTMLTitleElement {}
+class BlinkHTMLTitleElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLTitleElement();
 
-class BlinkHTMLTrackElement {
+}
+
+class BlinkHTMLTrackElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLTrackElement();
+
   static default_Getter(mthis) native "HTMLTrackElement_default_Getter";
+  default_Getter_(mthis) => default_Getter(mthis);
 
-  static default_Setter(mthis, value) native "HTMLTrackElement_default_Setter";
+  static default_Setter(mthis, __arg_0) native "HTMLTrackElement_default_Setter";
+  default_Setter_(mthis, __arg_0) => default_Setter(mthis, __arg_0);
 
   static integrity_Getter(mthis) native "HTMLTrackElement_integrity_Getter";
+  integrity_Getter_(mthis) => integrity_Getter(mthis);
 
-  static integrity_Setter(mthis, value) native "HTMLTrackElement_integrity_Setter";
+  static integrity_Setter(mthis, __arg_0) native "HTMLTrackElement_integrity_Setter";
+  integrity_Setter_(mthis, __arg_0) => integrity_Setter(mthis, __arg_0);
 
   static kind_Getter(mthis) native "HTMLTrackElement_kind_Getter";
+  kind_Getter_(mthis) => kind_Getter(mthis);
 
-  static kind_Setter(mthis, value) native "HTMLTrackElement_kind_Setter";
+  static kind_Setter(mthis, __arg_0) native "HTMLTrackElement_kind_Setter";
+  kind_Setter_(mthis, __arg_0) => kind_Setter(mthis, __arg_0);
 
   static label_Getter(mthis) native "HTMLTrackElement_label_Getter";
+  label_Getter_(mthis) => label_Getter(mthis);
 
-  static label_Setter(mthis, value) native "HTMLTrackElement_label_Setter";
+  static label_Setter(mthis, __arg_0) native "HTMLTrackElement_label_Setter";
+  label_Setter_(mthis, __arg_0) => label_Setter(mthis, __arg_0);
 
   static readyState_Getter(mthis) native "HTMLTrackElement_readyState_Getter";
+  readyState_Getter_(mthis) => readyState_Getter(mthis);
 
   static src_Getter(mthis) native "HTMLTrackElement_src_Getter";
+  src_Getter_(mthis) => src_Getter(mthis);
 
-  static src_Setter(mthis, value) native "HTMLTrackElement_src_Setter";
+  static src_Setter(mthis, __arg_0) native "HTMLTrackElement_src_Setter";
+  src_Setter_(mthis, __arg_0) => src_Setter(mthis, __arg_0);
 
   static srclang_Getter(mthis) native "HTMLTrackElement_srclang_Getter";
+  srclang_Getter_(mthis) => srclang_Getter(mthis);
 
-  static srclang_Setter(mthis, value) native "HTMLTrackElement_srclang_Setter";
+  static srclang_Setter(mthis, __arg_0) native "HTMLTrackElement_srclang_Setter";
+  srclang_Setter_(mthis, __arg_0) => srclang_Setter(mthis, __arg_0);
 
   static track_Getter(mthis) native "HTMLTrackElement_track_Getter";
+  track_Getter_(mthis) => track_Getter(mthis);
+
 }
 
-class BlinkHTMLUListElement {}
+class BlinkHTMLUListElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLUListElement();
 
-class BlinkHTMLUnknownElement {}
+}
 
-class BlinkHTMLVideoElement {
+class BlinkHTMLUnknownElement extends BlinkHTMLElement {
+  static final instance = new BlinkHTMLUnknownElement();
+
+}
+
+class BlinkHTMLVideoElement extends BlinkHTMLMediaElement {
+  static final instance = new BlinkHTMLVideoElement();
+
+  static getVideoPlaybackQuality_Callback_0(mthis) native "HTMLVideoElement_getVideoPlaybackQuality_Callback";
+  getVideoPlaybackQuality_Callback_0_(mthis) => getVideoPlaybackQuality_Callback_0(mthis);
+
+  static getVideoPlaybackQuality_Callback_1(mthis, __arg_0) native "HTMLVideoElement_getVideoPlaybackQuality_Callback";
+  getVideoPlaybackQuality_Callback_1_(mthis, __arg_0) => getVideoPlaybackQuality_Callback_1(mthis, __arg_0);
+
+  static getVideoPlaybackQuality_Callback_2(mthis, __arg_0, __arg_1) native "HTMLVideoElement_getVideoPlaybackQuality_Callback";
+  getVideoPlaybackQuality_Callback_2_(mthis, __arg_0, __arg_1) => getVideoPlaybackQuality_Callback_2(mthis, __arg_0, __arg_1);
+
   static height_Getter(mthis) native "HTMLVideoElement_height_Getter";
+  height_Getter_(mthis) => height_Getter(mthis);
 
-  static height_Setter(mthis, value) native "HTMLVideoElement_height_Setter";
+  static height_Setter(mthis, __arg_0) native "HTMLVideoElement_height_Setter";
+  height_Setter_(mthis, __arg_0) => height_Setter(mthis, __arg_0);
 
   static poster_Getter(mthis) native "HTMLVideoElement_poster_Getter";
+  poster_Getter_(mthis) => poster_Getter(mthis);
 
-  static poster_Setter(mthis, value) native "HTMLVideoElement_poster_Setter";
+  static poster_Setter(mthis, __arg_0) native "HTMLVideoElement_poster_Setter";
+  poster_Setter_(mthis, __arg_0) => poster_Setter(mthis, __arg_0);
 
   static videoHeight_Getter(mthis) native "HTMLVideoElement_videoHeight_Getter";
+  videoHeight_Getter_(mthis) => videoHeight_Getter(mthis);
 
   static videoWidth_Getter(mthis) native "HTMLVideoElement_videoWidth_Getter";
+  videoWidth_Getter_(mthis) => videoWidth_Getter(mthis);
 
   static webkitDecodedFrameCount_Getter(mthis) native "HTMLVideoElement_webkitDecodedFrameCount_Getter";
+  webkitDecodedFrameCount_Getter_(mthis) => webkitDecodedFrameCount_Getter(mthis);
+
+  static webkitDisplayingFullscreen_Getter(mthis) native "HTMLVideoElement_webkitDisplayingFullscreen_Getter";
+  webkitDisplayingFullscreen_Getter_(mthis) => webkitDisplayingFullscreen_Getter(mthis);
 
   static webkitDroppedFrameCount_Getter(mthis) native "HTMLVideoElement_webkitDroppedFrameCount_Getter";
+  webkitDroppedFrameCount_Getter_(mthis) => webkitDroppedFrameCount_Getter(mthis);
+
+  static webkitEnterFullScreen_Callback_0(mthis) native "HTMLVideoElement_webkitEnterFullScreen_Callback";
+  webkitEnterFullScreen_Callback_0_(mthis) => webkitEnterFullScreen_Callback_0(mthis);
+
+  static webkitEnterFullScreen_Callback_1(mthis, __arg_0) native "HTMLVideoElement_webkitEnterFullScreen_Callback";
+  webkitEnterFullScreen_Callback_1_(mthis, __arg_0) => webkitEnterFullScreen_Callback_1(mthis, __arg_0);
+
+  static webkitEnterFullScreen_Callback_2(mthis, __arg_0, __arg_1) native "HTMLVideoElement_webkitEnterFullScreen_Callback";
+  webkitEnterFullScreen_Callback_2_(mthis, __arg_0, __arg_1) => webkitEnterFullScreen_Callback_2(mthis, __arg_0, __arg_1);
+
+  static webkitEnterFullscreen_Callback_0(mthis) native "HTMLVideoElement_webkitEnterFullscreen_Callback";
+  webkitEnterFullscreen_Callback_0_(mthis) => webkitEnterFullscreen_Callback_0(mthis);
+
+  static webkitEnterFullscreen_Callback_1(mthis, __arg_0) native "HTMLVideoElement_webkitEnterFullscreen_Callback";
+  webkitEnterFullscreen_Callback_1_(mthis, __arg_0) => webkitEnterFullscreen_Callback_1(mthis, __arg_0);
+
+  static webkitEnterFullscreen_Callback_2(mthis, __arg_0, __arg_1) native "HTMLVideoElement_webkitEnterFullscreen_Callback";
+  webkitEnterFullscreen_Callback_2_(mthis, __arg_0, __arg_1) => webkitEnterFullscreen_Callback_2(mthis, __arg_0, __arg_1);
+
+  static webkitExitFullScreen_Callback_0(mthis) native "HTMLVideoElement_webkitExitFullScreen_Callback";
+  webkitExitFullScreen_Callback_0_(mthis) => webkitExitFullScreen_Callback_0(mthis);
+
+  static webkitExitFullScreen_Callback_1(mthis, __arg_0) native "HTMLVideoElement_webkitExitFullScreen_Callback";
+  webkitExitFullScreen_Callback_1_(mthis, __arg_0) => webkitExitFullScreen_Callback_1(mthis, __arg_0);
+
+  static webkitExitFullScreen_Callback_2(mthis, __arg_0, __arg_1) native "HTMLVideoElement_webkitExitFullScreen_Callback";
+  webkitExitFullScreen_Callback_2_(mthis, __arg_0, __arg_1) => webkitExitFullScreen_Callback_2(mthis, __arg_0, __arg_1);
+
+  static webkitExitFullscreen_Callback_0(mthis) native "HTMLVideoElement_webkitExitFullscreen_Callback";
+  webkitExitFullscreen_Callback_0_(mthis) => webkitExitFullscreen_Callback_0(mthis);
+
+  static webkitExitFullscreen_Callback_1(mthis, __arg_0) native "HTMLVideoElement_webkitExitFullscreen_Callback";
+  webkitExitFullscreen_Callback_1_(mthis, __arg_0) => webkitExitFullscreen_Callback_1(mthis, __arg_0);
+
+  static webkitExitFullscreen_Callback_2(mthis, __arg_0, __arg_1) native "HTMLVideoElement_webkitExitFullscreen_Callback";
+  webkitExitFullscreen_Callback_2_(mthis, __arg_0, __arg_1) => webkitExitFullscreen_Callback_2(mthis, __arg_0, __arg_1);
+
+  static webkitSupportsFullscreen_Getter(mthis) native "HTMLVideoElement_webkitSupportsFullscreen_Getter";
+  webkitSupportsFullscreen_Getter_(mthis) => webkitSupportsFullscreen_Getter(mthis);
 
   static width_Getter(mthis) native "HTMLVideoElement_width_Getter";
+  width_Getter_(mthis) => width_Getter(mthis);
 
-  static width_Setter(mthis, value) native "HTMLVideoElement_width_Setter";
+  static width_Setter(mthis, __arg_0) native "HTMLVideoElement_width_Setter";
+  width_Setter_(mthis, __arg_0) => width_Setter(mthis, __arg_0);
 
-  static getVideoPlaybackQuality_Callback(mthis) native "HTMLVideoElement_getVideoPlaybackQuality_Callback";
-
-  static webkitEnterFullscreen_Callback(mthis) native "HTMLVideoElement_webkitEnterFullscreen_Callback";
-
-  static webkitExitFullscreen_Callback(mthis) native "HTMLVideoElement_webkitExitFullscreen_Callback";
 }
 
-class BlinkHashChangeEvent {
-  static constructorCallback(type, options) native "HashChangeEvent_constructorCallback";
+class BlinkHashChangeEvent extends BlinkEvent {
+  static final instance = new BlinkHashChangeEvent();
+
+  static constructorCallback_2(__arg_0, __arg_1) native "HashChangeEvent_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+
+  static initHashChangeEvent_Callback_0(mthis) native "HashChangeEvent_initHashChangeEvent_Callback";
+  initHashChangeEvent_Callback_0_(mthis) => initHashChangeEvent_Callback_0(mthis);
+
+  static initHashChangeEvent_Callback_1(mthis, __arg_0) native "HashChangeEvent_initHashChangeEvent_Callback";
+  initHashChangeEvent_Callback_1_(mthis, __arg_0) => initHashChangeEvent_Callback_1(mthis, __arg_0);
+
+  static initHashChangeEvent_Callback_2(mthis, __arg_0, __arg_1) native "HashChangeEvent_initHashChangeEvent_Callback";
+  initHashChangeEvent_Callback_2_(mthis, __arg_0, __arg_1) => initHashChangeEvent_Callback_2(mthis, __arg_0, __arg_1);
+
+  static initHashChangeEvent_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "HashChangeEvent_initHashChangeEvent_Callback";
+  initHashChangeEvent_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => initHashChangeEvent_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static initHashChangeEvent_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "HashChangeEvent_initHashChangeEvent_Callback";
+  initHashChangeEvent_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => initHashChangeEvent_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static initHashChangeEvent_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "HashChangeEvent_initHashChangeEvent_Callback";
+  initHashChangeEvent_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => initHashChangeEvent_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static initHashChangeEvent_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "HashChangeEvent_initHashChangeEvent_Callback";
+  initHashChangeEvent_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => initHashChangeEvent_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static initHashChangeEvent_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) native "HashChangeEvent_initHashChangeEvent_Callback";
+  initHashChangeEvent_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => initHashChangeEvent_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6);
 
   static newURL_Getter(mthis) native "HashChangeEvent_newURL_Getter";
+  newURL_Getter_(mthis) => newURL_Getter(mthis);
 
   static oldURL_Getter(mthis) native "HashChangeEvent_oldURL_Getter";
+  oldURL_Getter_(mthis) => oldURL_Getter(mthis);
 
-  static initHashChangeEvent_Callback_5(mthis, type, canBubble, cancelable, oldURL, newURL) native "HashChangeEvent_initHashChangeEvent_Callback";
 }
 
 class BlinkHeaders {
-  static constructorCallback() native "Headers_constructorCallback";
+  static final instance = new BlinkHeaders();
 
-  static constructorCallback_1(input) native "Headers_constructorCallback";
+  static append_Callback_0(mthis) native "Headers_append_Callback";
+  append_Callback_0_(mthis) => append_Callback_0(mthis);
+
+  static append_Callback_1(mthis, __arg_0) native "Headers_append_Callback";
+  append_Callback_1_(mthis, __arg_0) => append_Callback_1(mthis, __arg_0);
+
+  static append_Callback_2(mthis, __arg_0, __arg_1) native "Headers_append_Callback";
+  append_Callback_2_(mthis, __arg_0, __arg_1) => append_Callback_2(mthis, __arg_0, __arg_1);
+
+  static append_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Headers_append_Callback";
+  append_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => append_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static append_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Headers_append_Callback";
+  append_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => append_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static constructorCallback_0() native "Headers_constructorCallback";
+  constructorCallback_0_() => constructorCallback_0();
+
+  static constructorCallback_1(__arg_0) native "Headers_constructorCallback";
+  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+
+  static constructorCallback_2(__arg_0, __arg_1) native "Headers_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+
+  static constructorCallback_3(__arg_0, __arg_1, __arg_2) native "Headers_constructorCallback";
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => constructorCallback_3(__arg_0, __arg_1, __arg_2);
+
+  static delete_Callback_0(mthis) native "Headers_delete_Callback";
+  delete_Callback_0_(mthis) => delete_Callback_0(mthis);
+
+  static delete_Callback_1(mthis, __arg_0) native "Headers_delete_Callback";
+  delete_Callback_1_(mthis, __arg_0) => delete_Callback_1(mthis, __arg_0);
+
+  static delete_Callback_2(mthis, __arg_0, __arg_1) native "Headers_delete_Callback";
+  delete_Callback_2_(mthis, __arg_0, __arg_1) => delete_Callback_2(mthis, __arg_0, __arg_1);
+
+  static delete_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Headers_delete_Callback";
+  delete_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => delete_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static forEach_Callback_0(mthis) native "Headers_forEach_Callback";
+  forEach_Callback_0_(mthis) => forEach_Callback_0(mthis);
+
+  static forEach_Callback_1(mthis, __arg_0) native "Headers_forEach_Callback";
+  forEach_Callback_1_(mthis, __arg_0) => forEach_Callback_1(mthis, __arg_0);
+
+  static forEach_Callback_2(mthis, __arg_0, __arg_1) native "Headers_forEach_Callback";
+  forEach_Callback_2_(mthis, __arg_0, __arg_1) => forEach_Callback_2(mthis, __arg_0, __arg_1);
+
+  static forEach_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Headers_forEach_Callback";
+  forEach_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => forEach_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static forEach_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Headers_forEach_Callback";
+  forEach_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => forEach_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static getAll_Callback_0(mthis) native "Headers_getAll_Callback";
+  getAll_Callback_0_(mthis) => getAll_Callback_0(mthis);
+
+  static getAll_Callback_1(mthis, __arg_0) native "Headers_getAll_Callback";
+  getAll_Callback_1_(mthis, __arg_0) => getAll_Callback_1(mthis, __arg_0);
+
+  static getAll_Callback_2(mthis, __arg_0, __arg_1) native "Headers_getAll_Callback";
+  getAll_Callback_2_(mthis, __arg_0, __arg_1) => getAll_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getAll_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Headers_getAll_Callback";
+  getAll_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getAll_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static get_Callback_0(mthis) native "Headers_get_Callback";
+  get_Callback_0_(mthis) => get_Callback_0(mthis);
+
+  static get_Callback_1(mthis, __arg_0) native "Headers_get_Callback";
+  get_Callback_1_(mthis, __arg_0) => get_Callback_1(mthis, __arg_0);
+
+  static get_Callback_2(mthis, __arg_0, __arg_1) native "Headers_get_Callback";
+  get_Callback_2_(mthis, __arg_0, __arg_1) => get_Callback_2(mthis, __arg_0, __arg_1);
+
+  static get_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Headers_get_Callback";
+  get_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => get_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static has_Callback_0(mthis) native "Headers_has_Callback";
+  has_Callback_0_(mthis) => has_Callback_0(mthis);
+
+  static has_Callback_1(mthis, __arg_0) native "Headers_has_Callback";
+  has_Callback_1_(mthis, __arg_0) => has_Callback_1(mthis, __arg_0);
+
+  static has_Callback_2(mthis, __arg_0, __arg_1) native "Headers_has_Callback";
+  has_Callback_2_(mthis, __arg_0, __arg_1) => has_Callback_2(mthis, __arg_0, __arg_1);
+
+  static has_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Headers_has_Callback";
+  has_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => has_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static set_Callback_0(mthis) native "Headers_set_Callback";
+  set_Callback_0_(mthis) => set_Callback_0(mthis);
+
+  static set_Callback_1(mthis, __arg_0) native "Headers_set_Callback";
+  set_Callback_1_(mthis, __arg_0) => set_Callback_1(mthis, __arg_0);
+
+  static set_Callback_2(mthis, __arg_0, __arg_1) native "Headers_set_Callback";
+  set_Callback_2_(mthis, __arg_0, __arg_1) => set_Callback_2(mthis, __arg_0, __arg_1);
+
+  static set_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Headers_set_Callback";
+  set_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => set_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static set_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Headers_set_Callback";
+  set_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => set_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
 
   static size_Getter(mthis) native "Headers_size_Getter";
+  size_Getter_(mthis) => size_Getter(mthis);
 
-  static forEach_Callback_2(mthis, callback, thisArg) native "Headers_forEach_Callback";
-
-  static forEach_Callback_1(mthis, callback) native "Headers_forEach_Callback";
 }
 
 class BlinkHistory {
+  static final instance = new BlinkHistory();
+
+  static back_Callback_0(mthis) native "History_back_Callback";
+  back_Callback_0_(mthis) => back_Callback_0(mthis);
+
+  static back_Callback_1(mthis, __arg_0) native "History_back_Callback";
+  back_Callback_1_(mthis, __arg_0) => back_Callback_1(mthis, __arg_0);
+
+  static back_Callback_2(mthis, __arg_0, __arg_1) native "History_back_Callback";
+  back_Callback_2_(mthis, __arg_0, __arg_1) => back_Callback_2(mthis, __arg_0, __arg_1);
+
+  static forward_Callback_0(mthis) native "History_forward_Callback";
+  forward_Callback_0_(mthis) => forward_Callback_0(mthis);
+
+  static forward_Callback_1(mthis, __arg_0) native "History_forward_Callback";
+  forward_Callback_1_(mthis, __arg_0) => forward_Callback_1(mthis, __arg_0);
+
+  static forward_Callback_2(mthis, __arg_0, __arg_1) native "History_forward_Callback";
+  forward_Callback_2_(mthis, __arg_0, __arg_1) => forward_Callback_2(mthis, __arg_0, __arg_1);
+
+  static go_Callback_0(mthis) native "History_go_Callback";
+  go_Callback_0_(mthis) => go_Callback_0(mthis);
+
+  static go_Callback_1(mthis, __arg_0) native "History_go_Callback";
+  go_Callback_1_(mthis, __arg_0) => go_Callback_1(mthis, __arg_0);
+
+  static go_Callback_2(mthis, __arg_0, __arg_1) native "History_go_Callback";
+  go_Callback_2_(mthis, __arg_0, __arg_1) => go_Callback_2(mthis, __arg_0, __arg_1);
+
+  static go_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "History_go_Callback";
+  go_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => go_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
   static length_Getter(mthis) native "History_length_Getter";
+  length_Getter_(mthis) => length_Getter(mthis);
+
+  static pushState_Callback_0(mthis) native "History_pushState_Callback";
+  pushState_Callback_0_(mthis) => pushState_Callback_0(mthis);
+
+  static pushState_Callback_1(mthis, __arg_0) native "History_pushState_Callback";
+  pushState_Callback_1_(mthis, __arg_0) => pushState_Callback_1(mthis, __arg_0);
+
+  static pushState_Callback_2(mthis, __arg_0, __arg_1) native "History_pushState_Callback";
+  pushState_Callback_2_(mthis, __arg_0, __arg_1) => pushState_Callback_2(mthis, __arg_0, __arg_1);
+
+  static pushState_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "History_pushState_Callback";
+  pushState_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => pushState_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static pushState_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "History_pushState_Callback";
+  pushState_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => pushState_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static pushState_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "History_pushState_Callback";
+  pushState_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => pushState_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static replaceState_Callback_0(mthis) native "History_replaceState_Callback";
+  replaceState_Callback_0_(mthis) => replaceState_Callback_0(mthis);
+
+  static replaceState_Callback_1(mthis, __arg_0) native "History_replaceState_Callback";
+  replaceState_Callback_1_(mthis, __arg_0) => replaceState_Callback_1(mthis, __arg_0);
+
+  static replaceState_Callback_2(mthis, __arg_0, __arg_1) native "History_replaceState_Callback";
+  replaceState_Callback_2_(mthis, __arg_0, __arg_1) => replaceState_Callback_2(mthis, __arg_0, __arg_1);
+
+  static replaceState_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "History_replaceState_Callback";
+  replaceState_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => replaceState_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static replaceState_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "History_replaceState_Callback";
+  replaceState_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => replaceState_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static replaceState_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "History_replaceState_Callback";
+  replaceState_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => replaceState_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
 
   static state_Getter(mthis) native "History_state_Getter";
+  state_Getter_(mthis) => state_Getter(mthis);
 
-  static back_Callback(mthis) native "History_back_Callback";
-
-  static forward_Callback(mthis) native "History_forward_Callback";
-
-  static go_Callback_1(mthis, distance) native "History_go_Callback";
-
-  static pushState_Callback_3(mthis, data, title, url) native "History_pushState_Callback";
-
-  static replaceState_Callback_3(mthis, data, title, url) native "History_replaceState_Callback";
 }
 
 class BlinkIDBCursor {
+  static final instance = new BlinkIDBCursor();
+
+  static advance_Callback_0(mthis) native "IDBCursor_advance_Callback";
+  advance_Callback_0_(mthis) => advance_Callback_0(mthis);
+
+  static advance_Callback_1(mthis, __arg_0) native "IDBCursor_advance_Callback";
+  advance_Callback_1_(mthis, __arg_0) => advance_Callback_1(mthis, __arg_0);
+
+  static advance_Callback_2(mthis, __arg_0, __arg_1) native "IDBCursor_advance_Callback";
+  advance_Callback_2_(mthis, __arg_0, __arg_1) => advance_Callback_2(mthis, __arg_0, __arg_1);
+
+  static advance_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "IDBCursor_advance_Callback";
+  advance_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => advance_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static continuePrimaryKey_Callback_0(mthis) native "IDBCursor_continuePrimaryKey_Callback";
+  continuePrimaryKey_Callback_0_(mthis) => continuePrimaryKey_Callback_0(mthis);
+
+  static continuePrimaryKey_Callback_1(mthis, __arg_0) native "IDBCursor_continuePrimaryKey_Callback";
+  continuePrimaryKey_Callback_1_(mthis, __arg_0) => continuePrimaryKey_Callback_1(mthis, __arg_0);
+
+  static continuePrimaryKey_Callback_2(mthis, __arg_0, __arg_1) native "IDBCursor_continuePrimaryKey_Callback";
+  continuePrimaryKey_Callback_2_(mthis, __arg_0, __arg_1) => continuePrimaryKey_Callback_2(mthis, __arg_0, __arg_1);
+
+  static continuePrimaryKey_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "IDBCursor_continuePrimaryKey_Callback";
+  continuePrimaryKey_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => continuePrimaryKey_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static continuePrimaryKey_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "IDBCursor_continuePrimaryKey_Callback";
+  continuePrimaryKey_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => continuePrimaryKey_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static continue_Callback_0(mthis) native "IDBCursor_continue_Callback";
+  continue_Callback_0_(mthis) => continue_Callback_0(mthis);
+
+  static continue_Callback_1(mthis, __arg_0) native "IDBCursor_continue_Callback";
+  continue_Callback_1_(mthis, __arg_0) => continue_Callback_1(mthis, __arg_0);
+
+  static continue_Callback_2(mthis, __arg_0, __arg_1) native "IDBCursor_continue_Callback";
+  continue_Callback_2_(mthis, __arg_0, __arg_1) => continue_Callback_2(mthis, __arg_0, __arg_1);
+
+  static continue_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "IDBCursor_continue_Callback";
+  continue_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => continue_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static delete_Callback_0(mthis) native "IDBCursor_delete_Callback";
+  delete_Callback_0_(mthis) => delete_Callback_0(mthis);
+
+  static delete_Callback_1(mthis, __arg_0) native "IDBCursor_delete_Callback";
+  delete_Callback_1_(mthis, __arg_0) => delete_Callback_1(mthis, __arg_0);
+
+  static delete_Callback_2(mthis, __arg_0, __arg_1) native "IDBCursor_delete_Callback";
+  delete_Callback_2_(mthis, __arg_0, __arg_1) => delete_Callback_2(mthis, __arg_0, __arg_1);
+
   static direction_Getter(mthis) native "IDBCursor_direction_Getter";
+  direction_Getter_(mthis) => direction_Getter(mthis);
 
   static key_Getter(mthis) native "IDBCursor_key_Getter";
+  key_Getter_(mthis) => key_Getter(mthis);
 
   static primaryKey_Getter(mthis) native "IDBCursor_primaryKey_Getter";
+  primaryKey_Getter_(mthis) => primaryKey_Getter(mthis);
 
   static source_Getter(mthis) native "IDBCursor_source_Getter";
+  source_Getter_(mthis) => source_Getter(mthis);
 
-  static advance_Callback_1(mthis, count) native "IDBCursor_advance_Callback";
+  static update_Callback_0(mthis) native "IDBCursor_update_Callback";
+  update_Callback_0_(mthis) => update_Callback_0(mthis);
 
-  static continuePrimaryKey_Callback_2(mthis, key, primaryKey) native "IDBCursor_continuePrimaryKey_Callback";
+  static update_Callback_1(mthis, __arg_0) native "IDBCursor_update_Callback";
+  update_Callback_1_(mthis, __arg_0) => update_Callback_1(mthis, __arg_0);
 
-  static delete_Callback(mthis) native "IDBCursor_delete_Callback";
+  static update_Callback_2(mthis, __arg_0, __arg_1) native "IDBCursor_update_Callback";
+  update_Callback_2_(mthis, __arg_0, __arg_1) => update_Callback_2(mthis, __arg_0, __arg_1);
 
-  static continue_Callback_1(mthis, key) native "IDBCursor_continue_Callback";
+  static update_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "IDBCursor_update_Callback";
+  update_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => update_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
-  static continue_Callback(mthis) native "IDBCursor_continue_Callback";
-
-  static update_Callback_1(mthis, value) native "IDBCursor_update_Callback";
 }
 
-class BlinkIDBCursorWithValue {
+class BlinkIDBCursorWithValue extends BlinkIDBCursor {
+  static final instance = new BlinkIDBCursorWithValue();
+
   static value_Getter(mthis) native "IDBCursorWithValue_value_Getter";
+  value_Getter_(mthis) => value_Getter(mthis);
+
 }
 
-class BlinkIDBDatabase {
+class BlinkIDBDatabase extends BlinkEventTarget {
+  static final instance = new BlinkIDBDatabase();
+
+  static close_Callback_0(mthis) native "IDBDatabase_close_Callback";
+  close_Callback_0_(mthis) => close_Callback_0(mthis);
+
+  static close_Callback_1(mthis, __arg_0) native "IDBDatabase_close_Callback";
+  close_Callback_1_(mthis, __arg_0) => close_Callback_1(mthis, __arg_0);
+
+  static close_Callback_2(mthis, __arg_0, __arg_1) native "IDBDatabase_close_Callback";
+  close_Callback_2_(mthis, __arg_0, __arg_1) => close_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createObjectStore_Callback_0(mthis) native "IDBDatabase_createObjectStore_Callback";
+  createObjectStore_Callback_0_(mthis) => createObjectStore_Callback_0(mthis);
+
+  static createObjectStore_Callback_1(mthis, __arg_0) native "IDBDatabase_createObjectStore_Callback";
+  createObjectStore_Callback_1_(mthis, __arg_0) => createObjectStore_Callback_1(mthis, __arg_0);
+
+  static createObjectStore_Callback_2(mthis, __arg_0, __arg_1) native "IDBDatabase_createObjectStore_Callback";
+  createObjectStore_Callback_2_(mthis, __arg_0, __arg_1) => createObjectStore_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createObjectStore_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "IDBDatabase_createObjectStore_Callback";
+  createObjectStore_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => createObjectStore_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static createObjectStore_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "IDBDatabase_createObjectStore_Callback";
+  createObjectStore_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => createObjectStore_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static deleteObjectStore_Callback_0(mthis) native "IDBDatabase_deleteObjectStore_Callback";
+  deleteObjectStore_Callback_0_(mthis) => deleteObjectStore_Callback_0(mthis);
+
+  static deleteObjectStore_Callback_1(mthis, __arg_0) native "IDBDatabase_deleteObjectStore_Callback";
+  deleteObjectStore_Callback_1_(mthis, __arg_0) => deleteObjectStore_Callback_1(mthis, __arg_0);
+
+  static deleteObjectStore_Callback_2(mthis, __arg_0, __arg_1) native "IDBDatabase_deleteObjectStore_Callback";
+  deleteObjectStore_Callback_2_(mthis, __arg_0, __arg_1) => deleteObjectStore_Callback_2(mthis, __arg_0, __arg_1);
+
+  static deleteObjectStore_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "IDBDatabase_deleteObjectStore_Callback";
+  deleteObjectStore_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => deleteObjectStore_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
   static name_Getter(mthis) native "IDBDatabase_name_Getter";
+  name_Getter_(mthis) => name_Getter(mthis);
 
   static objectStoreNames_Getter(mthis) native "IDBDatabase_objectStoreNames_Getter";
+  objectStoreNames_Getter_(mthis) => objectStoreNames_Getter(mthis);
+
+  static onabort_Getter(mthis) native "IDBDatabase_onabort_Getter";
+  onabort_Getter_(mthis) => onabort_Getter(mthis);
+
+  static onabort_Setter(mthis, __arg_0) native "IDBDatabase_onabort_Setter";
+  onabort_Setter_(mthis, __arg_0) => onabort_Setter(mthis, __arg_0);
+
+  static onclose_Getter(mthis) native "IDBDatabase_onclose_Getter";
+  onclose_Getter_(mthis) => onclose_Getter(mthis);
+
+  static onclose_Setter(mthis, __arg_0) native "IDBDatabase_onclose_Setter";
+  onclose_Setter_(mthis, __arg_0) => onclose_Setter(mthis, __arg_0);
+
+  static onerror_Getter(mthis) native "IDBDatabase_onerror_Getter";
+  onerror_Getter_(mthis) => onerror_Getter(mthis);
+
+  static onerror_Setter(mthis, __arg_0) native "IDBDatabase_onerror_Setter";
+  onerror_Setter_(mthis, __arg_0) => onerror_Setter(mthis, __arg_0);
+
+  static onversionchange_Getter(mthis) native "IDBDatabase_onversionchange_Getter";
+  onversionchange_Getter_(mthis) => onversionchange_Getter(mthis);
+
+  static onversionchange_Setter(mthis, __arg_0) native "IDBDatabase_onversionchange_Setter";
+  onversionchange_Setter_(mthis, __arg_0) => onversionchange_Setter(mthis, __arg_0);
+
+  static transaction_Callback_0(mthis) native "IDBDatabase_transaction_Callback";
+  transaction_Callback_0_(mthis) => transaction_Callback_0(mthis);
+
+  static transaction_Callback_1(mthis, __arg_0) native "IDBDatabase_transaction_Callback";
+  transaction_Callback_1_(mthis, __arg_0) => transaction_Callback_1(mthis, __arg_0);
+
+  static transaction_Callback_2(mthis, __arg_0, __arg_1) native "IDBDatabase_transaction_Callback";
+  transaction_Callback_2_(mthis, __arg_0, __arg_1) => transaction_Callback_2(mthis, __arg_0, __arg_1);
+
+  static transaction_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "IDBDatabase_transaction_Callback";
+  transaction_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => transaction_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static transaction_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "IDBDatabase_transaction_Callback";
+  transaction_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => transaction_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
 
   static version_Getter(mthis) native "IDBDatabase_version_Getter";
+  version_Getter_(mthis) => version_Getter(mthis);
 
-  static close_Callback(mthis) native "IDBDatabase_close_Callback";
-
-  static createObjectStore_Callback_2(mthis, name, options) native "IDBDatabase_createObjectStore_Callback";
-
-  static createObjectStore_Callback_1(mthis, name) native "IDBDatabase_createObjectStore_Callback";
-
-  static deleteObjectStore_Callback_1(mthis, name) native "IDBDatabase_deleteObjectStore_Callback";
-
-  static transaction_Callback_1(mthis, storeName_OR_storeNames) native "IDBDatabase_transaction_Callback";
-
-  static transaction_Callback_2(mthis, storeName_OR_storeNames, mode) native "IDBDatabase_transaction_Callback";
 }
 
 class BlinkIDBFactory {
-  static cmp_Callback_2(mthis, first, second) native "IDBFactory_cmp_Callback";
+  static final instance = new BlinkIDBFactory();
 
-  static deleteDatabase_Callback_1(mthis, name) native "IDBFactory_deleteDatabase_Callback";
+  static cmp_Callback_0(mthis) native "IDBFactory_cmp_Callback";
+  cmp_Callback_0_(mthis) => cmp_Callback_0(mthis);
 
-  static open_Callback_2(mthis, name, version) native "IDBFactory_open_Callback";
+  static cmp_Callback_1(mthis, __arg_0) native "IDBFactory_cmp_Callback";
+  cmp_Callback_1_(mthis, __arg_0) => cmp_Callback_1(mthis, __arg_0);
 
-  static open_Callback_1(mthis, name) native "IDBFactory_open_Callback";
+  static cmp_Callback_2(mthis, __arg_0, __arg_1) native "IDBFactory_cmp_Callback";
+  cmp_Callback_2_(mthis, __arg_0, __arg_1) => cmp_Callback_2(mthis, __arg_0, __arg_1);
 
-  static webkitGetDatabaseNames_Callback(mthis) native "IDBFactory_webkitGetDatabaseNames_Callback";
+  static cmp_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "IDBFactory_cmp_Callback";
+  cmp_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => cmp_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static cmp_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "IDBFactory_cmp_Callback";
+  cmp_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => cmp_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static deleteDatabase_Callback_0(mthis) native "IDBFactory_deleteDatabase_Callback";
+  deleteDatabase_Callback_0_(mthis) => deleteDatabase_Callback_0(mthis);
+
+  static deleteDatabase_Callback_1(mthis, __arg_0) native "IDBFactory_deleteDatabase_Callback";
+  deleteDatabase_Callback_1_(mthis, __arg_0) => deleteDatabase_Callback_1(mthis, __arg_0);
+
+  static deleteDatabase_Callback_2(mthis, __arg_0, __arg_1) native "IDBFactory_deleteDatabase_Callback";
+  deleteDatabase_Callback_2_(mthis, __arg_0, __arg_1) => deleteDatabase_Callback_2(mthis, __arg_0, __arg_1);
+
+  static deleteDatabase_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "IDBFactory_deleteDatabase_Callback";
+  deleteDatabase_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => deleteDatabase_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static open_Callback_0(mthis) native "IDBFactory_open_Callback";
+  open_Callback_0_(mthis) => open_Callback_0(mthis);
+
+  static open_Callback_1(mthis, __arg_0) native "IDBFactory_open_Callback";
+  open_Callback_1_(mthis, __arg_0) => open_Callback_1(mthis, __arg_0);
+
+  static open_Callback_2(mthis, __arg_0, __arg_1) native "IDBFactory_open_Callback";
+  open_Callback_2_(mthis, __arg_0, __arg_1) => open_Callback_2(mthis, __arg_0, __arg_1);
+
+  static open_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "IDBFactory_open_Callback";
+  open_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => open_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static open_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "IDBFactory_open_Callback";
+  open_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => open_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static webkitGetDatabaseNames_Callback_0(mthis) native "IDBFactory_webkitGetDatabaseNames_Callback";
+  webkitGetDatabaseNames_Callback_0_(mthis) => webkitGetDatabaseNames_Callback_0(mthis);
+
+  static webkitGetDatabaseNames_Callback_1(mthis, __arg_0) native "IDBFactory_webkitGetDatabaseNames_Callback";
+  webkitGetDatabaseNames_Callback_1_(mthis, __arg_0) => webkitGetDatabaseNames_Callback_1(mthis, __arg_0);
+
+  static webkitGetDatabaseNames_Callback_2(mthis, __arg_0, __arg_1) native "IDBFactory_webkitGetDatabaseNames_Callback";
+  webkitGetDatabaseNames_Callback_2_(mthis, __arg_0, __arg_1) => webkitGetDatabaseNames_Callback_2(mthis, __arg_0, __arg_1);
+
 }
 
 class BlinkIDBIndex {
+  static final instance = new BlinkIDBIndex();
+
+  static count_Callback_0(mthis) native "IDBIndex_count_Callback";
+  count_Callback_0_(mthis) => count_Callback_0(mthis);
+
+  static count_Callback_1(mthis, __arg_0) native "IDBIndex_count_Callback";
+  count_Callback_1_(mthis, __arg_0) => count_Callback_1(mthis, __arg_0);
+
+  static count_Callback_2(mthis, __arg_0, __arg_1) native "IDBIndex_count_Callback";
+  count_Callback_2_(mthis, __arg_0, __arg_1) => count_Callback_2(mthis, __arg_0, __arg_1);
+
+  static count_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "IDBIndex_count_Callback";
+  count_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => count_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static getKey_Callback_0(mthis) native "IDBIndex_getKey_Callback";
+  getKey_Callback_0_(mthis) => getKey_Callback_0(mthis);
+
+  static getKey_Callback_1(mthis, __arg_0) native "IDBIndex_getKey_Callback";
+  getKey_Callback_1_(mthis, __arg_0) => getKey_Callback_1(mthis, __arg_0);
+
+  static getKey_Callback_2(mthis, __arg_0, __arg_1) native "IDBIndex_getKey_Callback";
+  getKey_Callback_2_(mthis, __arg_0, __arg_1) => getKey_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getKey_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "IDBIndex_getKey_Callback";
+  getKey_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getKey_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static get_Callback_0(mthis) native "IDBIndex_get_Callback";
+  get_Callback_0_(mthis) => get_Callback_0(mthis);
+
+  static get_Callback_1(mthis, __arg_0) native "IDBIndex_get_Callback";
+  get_Callback_1_(mthis, __arg_0) => get_Callback_1(mthis, __arg_0);
+
+  static get_Callback_2(mthis, __arg_0, __arg_1) native "IDBIndex_get_Callback";
+  get_Callback_2_(mthis, __arg_0, __arg_1) => get_Callback_2(mthis, __arg_0, __arg_1);
+
+  static get_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "IDBIndex_get_Callback";
+  get_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => get_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
   static keyPath_Getter(mthis) native "IDBIndex_keyPath_Getter";
+  keyPath_Getter_(mthis) => keyPath_Getter(mthis);
 
   static multiEntry_Getter(mthis) native "IDBIndex_multiEntry_Getter";
+  multiEntry_Getter_(mthis) => multiEntry_Getter(mthis);
 
   static name_Getter(mthis) native "IDBIndex_name_Getter";
+  name_Getter_(mthis) => name_Getter(mthis);
 
   static objectStore_Getter(mthis) native "IDBIndex_objectStore_Getter";
+  objectStore_Getter_(mthis) => objectStore_Getter(mthis);
+
+  static openCursor_Callback_0(mthis) native "IDBIndex_openCursor_Callback";
+  openCursor_Callback_0_(mthis) => openCursor_Callback_0(mthis);
+
+  static openCursor_Callback_1(mthis, __arg_0) native "IDBIndex_openCursor_Callback";
+  openCursor_Callback_1_(mthis, __arg_0) => openCursor_Callback_1(mthis, __arg_0);
+
+  static openCursor_Callback_2(mthis, __arg_0, __arg_1) native "IDBIndex_openCursor_Callback";
+  openCursor_Callback_2_(mthis, __arg_0, __arg_1) => openCursor_Callback_2(mthis, __arg_0, __arg_1);
+
+  static openCursor_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "IDBIndex_openCursor_Callback";
+  openCursor_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => openCursor_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static openCursor_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "IDBIndex_openCursor_Callback";
+  openCursor_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => openCursor_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static openKeyCursor_Callback_0(mthis) native "IDBIndex_openKeyCursor_Callback";
+  openKeyCursor_Callback_0_(mthis) => openKeyCursor_Callback_0(mthis);
+
+  static openKeyCursor_Callback_1(mthis, __arg_0) native "IDBIndex_openKeyCursor_Callback";
+  openKeyCursor_Callback_1_(mthis, __arg_0) => openKeyCursor_Callback_1(mthis, __arg_0);
+
+  static openKeyCursor_Callback_2(mthis, __arg_0, __arg_1) native "IDBIndex_openKeyCursor_Callback";
+  openKeyCursor_Callback_2_(mthis, __arg_0, __arg_1) => openKeyCursor_Callback_2(mthis, __arg_0, __arg_1);
+
+  static openKeyCursor_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "IDBIndex_openKeyCursor_Callback";
+  openKeyCursor_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => openKeyCursor_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static openKeyCursor_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "IDBIndex_openKeyCursor_Callback";
+  openKeyCursor_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => openKeyCursor_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
 
   static unique_Getter(mthis) native "IDBIndex_unique_Getter";
+  unique_Getter_(mthis) => unique_Getter(mthis);
 
-  static count_Callback_1(mthis, key) native "IDBIndex_count_Callback";
-
-  static get_Callback_1(mthis, key) native "IDBIndex_get_Callback";
-
-  static getKey_Callback_1(mthis, key) native "IDBIndex_getKey_Callback";
-
-  static openCursor_Callback_2(mthis, range, direction) native "IDBIndex_openCursor_Callback";
-
-  static openCursor_Callback_1(mthis, range) native "IDBIndex_openCursor_Callback";
-
-  static openKeyCursor_Callback_2(mthis, range, direction) native "IDBIndex_openKeyCursor_Callback";
-
-  static openKeyCursor_Callback_1(mthis, range) native "IDBIndex_openKeyCursor_Callback";
 }
 
 class BlinkIDBKeyRange {
-  static lower_Getter(mthis) native "IDBKeyRange_lower_Getter";
+  static final instance = new BlinkIDBKeyRange();
+
+  static bound_Callback_0() native "IDBKeyRange_bound_Callback";
+  bound_Callback_0_() => bound_Callback_0();
+
+  static bound_Callback_1(__arg_0) native "IDBKeyRange_bound_Callback";
+  bound_Callback_1_(__arg_0) => bound_Callback_1(__arg_0);
+
+  static bound_Callback_2(__arg_0, __arg_1) native "IDBKeyRange_bound_Callback";
+  bound_Callback_2_(__arg_0, __arg_1) => bound_Callback_2(__arg_0, __arg_1);
+
+  static bound_Callback_3(__arg_0, __arg_1, __arg_2) native "IDBKeyRange_bound_Callback";
+  bound_Callback_3_(__arg_0, __arg_1, __arg_2) => bound_Callback_3(__arg_0, __arg_1, __arg_2);
+
+  static bound_Callback_4(__arg_0, __arg_1, __arg_2, __arg_3) native "IDBKeyRange_bound_Callback";
+  bound_Callback_4_(__arg_0, __arg_1, __arg_2, __arg_3) => bound_Callback_4(__arg_0, __arg_1, __arg_2, __arg_3);
+
+  static bound_Callback_5(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "IDBKeyRange_bound_Callback";
+  bound_Callback_5_(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => bound_Callback_5(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static bound_Callback_6(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "IDBKeyRange_bound_Callback";
+  bound_Callback_6_(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => bound_Callback_6(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static lowerBound_Callback_0() native "IDBKeyRange_lowerBound_Callback";
+  lowerBound_Callback_0_() => lowerBound_Callback_0();
+
+  static lowerBound_Callback_1(__arg_0) native "IDBKeyRange_lowerBound_Callback";
+  lowerBound_Callback_1_(__arg_0) => lowerBound_Callback_1(__arg_0);
+
+  static lowerBound_Callback_2(__arg_0, __arg_1) native "IDBKeyRange_lowerBound_Callback";
+  lowerBound_Callback_2_(__arg_0, __arg_1) => lowerBound_Callback_2(__arg_0, __arg_1);
+
+  static lowerBound_Callback_3(__arg_0, __arg_1, __arg_2) native "IDBKeyRange_lowerBound_Callback";
+  lowerBound_Callback_3_(__arg_0, __arg_1, __arg_2) => lowerBound_Callback_3(__arg_0, __arg_1, __arg_2);
+
+  static lowerBound_Callback_4(__arg_0, __arg_1, __arg_2, __arg_3) native "IDBKeyRange_lowerBound_Callback";
+  lowerBound_Callback_4_(__arg_0, __arg_1, __arg_2, __arg_3) => lowerBound_Callback_4(__arg_0, __arg_1, __arg_2, __arg_3);
 
   static lowerOpen_Getter(mthis) native "IDBKeyRange_lowerOpen_Getter";
+  lowerOpen_Getter_(mthis) => lowerOpen_Getter(mthis);
 
-  static upper_Getter(mthis) native "IDBKeyRange_upper_Getter";
+  static lower_Getter(mthis) native "IDBKeyRange_lower_Getter";
+  lower_Getter_(mthis) => lower_Getter(mthis);
+
+  static only_Callback_0() native "IDBKeyRange_only_Callback";
+  only_Callback_0_() => only_Callback_0();
+
+  static only_Callback_1(__arg_0) native "IDBKeyRange_only_Callback";
+  only_Callback_1_(__arg_0) => only_Callback_1(__arg_0);
+
+  static only_Callback_2(__arg_0, __arg_1) native "IDBKeyRange_only_Callback";
+  only_Callback_2_(__arg_0, __arg_1) => only_Callback_2(__arg_0, __arg_1);
+
+  static only_Callback_3(__arg_0, __arg_1, __arg_2) native "IDBKeyRange_only_Callback";
+  only_Callback_3_(__arg_0, __arg_1, __arg_2) => only_Callback_3(__arg_0, __arg_1, __arg_2);
+
+  static upperBound_Callback_0() native "IDBKeyRange_upperBound_Callback";
+  upperBound_Callback_0_() => upperBound_Callback_0();
+
+  static upperBound_Callback_1(__arg_0) native "IDBKeyRange_upperBound_Callback";
+  upperBound_Callback_1_(__arg_0) => upperBound_Callback_1(__arg_0);
+
+  static upperBound_Callback_2(__arg_0, __arg_1) native "IDBKeyRange_upperBound_Callback";
+  upperBound_Callback_2_(__arg_0, __arg_1) => upperBound_Callback_2(__arg_0, __arg_1);
+
+  static upperBound_Callback_3(__arg_0, __arg_1, __arg_2) native "IDBKeyRange_upperBound_Callback";
+  upperBound_Callback_3_(__arg_0, __arg_1, __arg_2) => upperBound_Callback_3(__arg_0, __arg_1, __arg_2);
+
+  static upperBound_Callback_4(__arg_0, __arg_1, __arg_2, __arg_3) native "IDBKeyRange_upperBound_Callback";
+  upperBound_Callback_4_(__arg_0, __arg_1, __arg_2, __arg_3) => upperBound_Callback_4(__arg_0, __arg_1, __arg_2, __arg_3);
 
   static upperOpen_Getter(mthis) native "IDBKeyRange_upperOpen_Getter";
+  upperOpen_Getter_(mthis) => upperOpen_Getter(mthis);
 
-  static bound_Callback_4(lower, upper, lowerOpen, upperOpen) native "IDBKeyRange_bound_Callback";
+  static upper_Getter(mthis) native "IDBKeyRange_upper_Getter";
+  upper_Getter_(mthis) => upper_Getter(mthis);
 
-  static bound_Callback_3(lower, upper, lowerOpen) native "IDBKeyRange_bound_Callback";
-
-  static bound_Callback_2(lower, upper) native "IDBKeyRange_bound_Callback";
-
-  static lowerBound_Callback_2(bound, open) native "IDBKeyRange_lowerBound_Callback";
-
-  static lowerBound_Callback_1(bound) native "IDBKeyRange_lowerBound_Callback";
-
-  static only_Callback_1(value) native "IDBKeyRange_only_Callback";
-
-  static upperBound_Callback_2(bound, open) native "IDBKeyRange_upperBound_Callback";
-
-  static upperBound_Callback_1(bound) native "IDBKeyRange_upperBound_Callback";
 }
 
 class BlinkIDBObjectStore {
+  static final instance = new BlinkIDBObjectStore();
+
+  static add_Callback_0(mthis) native "IDBObjectStore_add_Callback";
+  add_Callback_0_(mthis) => add_Callback_0(mthis);
+
+  static add_Callback_1(mthis, __arg_0) native "IDBObjectStore_add_Callback";
+  add_Callback_1_(mthis, __arg_0) => add_Callback_1(mthis, __arg_0);
+
+  static add_Callback_2(mthis, __arg_0, __arg_1) native "IDBObjectStore_add_Callback";
+  add_Callback_2_(mthis, __arg_0, __arg_1) => add_Callback_2(mthis, __arg_0, __arg_1);
+
+  static add_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "IDBObjectStore_add_Callback";
+  add_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => add_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static add_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "IDBObjectStore_add_Callback";
+  add_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => add_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
   static autoIncrement_Getter(mthis) native "IDBObjectStore_autoIncrement_Getter";
+  autoIncrement_Getter_(mthis) => autoIncrement_Getter(mthis);
+
+  static clear_Callback_0(mthis) native "IDBObjectStore_clear_Callback";
+  clear_Callback_0_(mthis) => clear_Callback_0(mthis);
+
+  static clear_Callback_1(mthis, __arg_0) native "IDBObjectStore_clear_Callback";
+  clear_Callback_1_(mthis, __arg_0) => clear_Callback_1(mthis, __arg_0);
+
+  static clear_Callback_2(mthis, __arg_0, __arg_1) native "IDBObjectStore_clear_Callback";
+  clear_Callback_2_(mthis, __arg_0, __arg_1) => clear_Callback_2(mthis, __arg_0, __arg_1);
+
+  static count_Callback_0(mthis) native "IDBObjectStore_count_Callback";
+  count_Callback_0_(mthis) => count_Callback_0(mthis);
+
+  static count_Callback_1(mthis, __arg_0) native "IDBObjectStore_count_Callback";
+  count_Callback_1_(mthis, __arg_0) => count_Callback_1(mthis, __arg_0);
+
+  static count_Callback_2(mthis, __arg_0, __arg_1) native "IDBObjectStore_count_Callback";
+  count_Callback_2_(mthis, __arg_0, __arg_1) => count_Callback_2(mthis, __arg_0, __arg_1);
+
+  static count_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "IDBObjectStore_count_Callback";
+  count_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => count_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static createIndex_Callback_0(mthis) native "IDBObjectStore_createIndex_Callback";
+  createIndex_Callback_0_(mthis) => createIndex_Callback_0(mthis);
+
+  static createIndex_Callback_1(mthis, __arg_0) native "IDBObjectStore_createIndex_Callback";
+  createIndex_Callback_1_(mthis, __arg_0) => createIndex_Callback_1(mthis, __arg_0);
+
+  static createIndex_Callback_2(mthis, __arg_0, __arg_1) native "IDBObjectStore_createIndex_Callback";
+  createIndex_Callback_2_(mthis, __arg_0, __arg_1) => createIndex_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createIndex_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "IDBObjectStore_createIndex_Callback";
+  createIndex_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => createIndex_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static createIndex_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "IDBObjectStore_createIndex_Callback";
+  createIndex_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => createIndex_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static createIndex_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "IDBObjectStore_createIndex_Callback";
+  createIndex_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => createIndex_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static deleteIndex_Callback_0(mthis) native "IDBObjectStore_deleteIndex_Callback";
+  deleteIndex_Callback_0_(mthis) => deleteIndex_Callback_0(mthis);
+
+  static deleteIndex_Callback_1(mthis, __arg_0) native "IDBObjectStore_deleteIndex_Callback";
+  deleteIndex_Callback_1_(mthis, __arg_0) => deleteIndex_Callback_1(mthis, __arg_0);
+
+  static deleteIndex_Callback_2(mthis, __arg_0, __arg_1) native "IDBObjectStore_deleteIndex_Callback";
+  deleteIndex_Callback_2_(mthis, __arg_0, __arg_1) => deleteIndex_Callback_2(mthis, __arg_0, __arg_1);
+
+  static deleteIndex_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "IDBObjectStore_deleteIndex_Callback";
+  deleteIndex_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => deleteIndex_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static delete_Callback_0(mthis) native "IDBObjectStore_delete_Callback";
+  delete_Callback_0_(mthis) => delete_Callback_0(mthis);
+
+  static delete_Callback_1(mthis, __arg_0) native "IDBObjectStore_delete_Callback";
+  delete_Callback_1_(mthis, __arg_0) => delete_Callback_1(mthis, __arg_0);
+
+  static delete_Callback_2(mthis, __arg_0, __arg_1) native "IDBObjectStore_delete_Callback";
+  delete_Callback_2_(mthis, __arg_0, __arg_1) => delete_Callback_2(mthis, __arg_0, __arg_1);
+
+  static delete_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "IDBObjectStore_delete_Callback";
+  delete_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => delete_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static get_Callback_0(mthis) native "IDBObjectStore_get_Callback";
+  get_Callback_0_(mthis) => get_Callback_0(mthis);
+
+  static get_Callback_1(mthis, __arg_0) native "IDBObjectStore_get_Callback";
+  get_Callback_1_(mthis, __arg_0) => get_Callback_1(mthis, __arg_0);
+
+  static get_Callback_2(mthis, __arg_0, __arg_1) native "IDBObjectStore_get_Callback";
+  get_Callback_2_(mthis, __arg_0, __arg_1) => get_Callback_2(mthis, __arg_0, __arg_1);
+
+  static get_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "IDBObjectStore_get_Callback";
+  get_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => get_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
   static indexNames_Getter(mthis) native "IDBObjectStore_indexNames_Getter";
+  indexNames_Getter_(mthis) => indexNames_Getter(mthis);
+
+  static index_Callback_0(mthis) native "IDBObjectStore_index_Callback";
+  index_Callback_0_(mthis) => index_Callback_0(mthis);
+
+  static index_Callback_1(mthis, __arg_0) native "IDBObjectStore_index_Callback";
+  index_Callback_1_(mthis, __arg_0) => index_Callback_1(mthis, __arg_0);
+
+  static index_Callback_2(mthis, __arg_0, __arg_1) native "IDBObjectStore_index_Callback";
+  index_Callback_2_(mthis, __arg_0, __arg_1) => index_Callback_2(mthis, __arg_0, __arg_1);
+
+  static index_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "IDBObjectStore_index_Callback";
+  index_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => index_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
   static keyPath_Getter(mthis) native "IDBObjectStore_keyPath_Getter";
+  keyPath_Getter_(mthis) => keyPath_Getter(mthis);
 
   static name_Getter(mthis) native "IDBObjectStore_name_Getter";
+  name_Getter_(mthis) => name_Getter(mthis);
+
+  static openCursor_Callback_0(mthis) native "IDBObjectStore_openCursor_Callback";
+  openCursor_Callback_0_(mthis) => openCursor_Callback_0(mthis);
+
+  static openCursor_Callback_1(mthis, __arg_0) native "IDBObjectStore_openCursor_Callback";
+  openCursor_Callback_1_(mthis, __arg_0) => openCursor_Callback_1(mthis, __arg_0);
+
+  static openCursor_Callback_2(mthis, __arg_0, __arg_1) native "IDBObjectStore_openCursor_Callback";
+  openCursor_Callback_2_(mthis, __arg_0, __arg_1) => openCursor_Callback_2(mthis, __arg_0, __arg_1);
+
+  static openCursor_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "IDBObjectStore_openCursor_Callback";
+  openCursor_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => openCursor_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static openCursor_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "IDBObjectStore_openCursor_Callback";
+  openCursor_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => openCursor_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static openKeyCursor_Callback_0(mthis) native "IDBObjectStore_openKeyCursor_Callback";
+  openKeyCursor_Callback_0_(mthis) => openKeyCursor_Callback_0(mthis);
+
+  static openKeyCursor_Callback_1(mthis, __arg_0) native "IDBObjectStore_openKeyCursor_Callback";
+  openKeyCursor_Callback_1_(mthis, __arg_0) => openKeyCursor_Callback_1(mthis, __arg_0);
+
+  static openKeyCursor_Callback_2(mthis, __arg_0, __arg_1) native "IDBObjectStore_openKeyCursor_Callback";
+  openKeyCursor_Callback_2_(mthis, __arg_0, __arg_1) => openKeyCursor_Callback_2(mthis, __arg_0, __arg_1);
+
+  static openKeyCursor_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "IDBObjectStore_openKeyCursor_Callback";
+  openKeyCursor_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => openKeyCursor_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static openKeyCursor_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "IDBObjectStore_openKeyCursor_Callback";
+  openKeyCursor_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => openKeyCursor_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static put_Callback_0(mthis) native "IDBObjectStore_put_Callback";
+  put_Callback_0_(mthis) => put_Callback_0(mthis);
+
+  static put_Callback_1(mthis, __arg_0) native "IDBObjectStore_put_Callback";
+  put_Callback_1_(mthis, __arg_0) => put_Callback_1(mthis, __arg_0);
+
+  static put_Callback_2(mthis, __arg_0, __arg_1) native "IDBObjectStore_put_Callback";
+  put_Callback_2_(mthis, __arg_0, __arg_1) => put_Callback_2(mthis, __arg_0, __arg_1);
+
+  static put_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "IDBObjectStore_put_Callback";
+  put_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => put_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static put_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "IDBObjectStore_put_Callback";
+  put_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => put_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
 
   static transaction_Getter(mthis) native "IDBObjectStore_transaction_Getter";
+  transaction_Getter_(mthis) => transaction_Getter(mthis);
 
-  static add_Callback_2(mthis, value, key) native "IDBObjectStore_add_Callback";
-
-  static add_Callback_1(mthis, value) native "IDBObjectStore_add_Callback";
-
-  static clear_Callback(mthis) native "IDBObjectStore_clear_Callback";
-
-  static count_Callback_1(mthis, key) native "IDBObjectStore_count_Callback";
-
-  static createIndex_Callback_2(mthis, name, keyPath) native "IDBObjectStore_createIndex_Callback";
-
-  static createIndex_Callback_3(mthis, name, keyPath, options) native "IDBObjectStore_createIndex_Callback";
-
-  static delete_Callback_1(mthis, key) native "IDBObjectStore_delete_Callback";
-
-  static deleteIndex_Callback_1(mthis, name) native "IDBObjectStore_deleteIndex_Callback";
-
-  static get_Callback_1(mthis, key) native "IDBObjectStore_get_Callback";
-
-  static index_Callback_1(mthis, name) native "IDBObjectStore_index_Callback";
-
-  static openCursor_Callback_2(mthis, range, direction) native "IDBObjectStore_openCursor_Callback";
-
-  static openCursor_Callback_1(mthis, range) native "IDBObjectStore_openCursor_Callback";
-
-  static openKeyCursor_Callback_2(mthis, range, direction) native "IDBObjectStore_openKeyCursor_Callback";
-
-  static openKeyCursor_Callback_1(mthis, range) native "IDBObjectStore_openKeyCursor_Callback";
-
-  static put_Callback_2(mthis, value, key) native "IDBObjectStore_put_Callback";
-
-  static put_Callback_1(mthis, value) native "IDBObjectStore_put_Callback";
 }
 
-class BlinkIDBRequest {
+class BlinkIDBOpenDBRequest extends BlinkIDBRequest {
+  static final instance = new BlinkIDBOpenDBRequest();
+
+  static onblocked_Getter(mthis) native "IDBOpenDBRequest_onblocked_Getter";
+  onblocked_Getter_(mthis) => onblocked_Getter(mthis);
+
+  static onblocked_Setter(mthis, __arg_0) native "IDBOpenDBRequest_onblocked_Setter";
+  onblocked_Setter_(mthis, __arg_0) => onblocked_Setter(mthis, __arg_0);
+
+  static onupgradeneeded_Getter(mthis) native "IDBOpenDBRequest_onupgradeneeded_Getter";
+  onupgradeneeded_Getter_(mthis) => onupgradeneeded_Getter(mthis);
+
+  static onupgradeneeded_Setter(mthis, __arg_0) native "IDBOpenDBRequest_onupgradeneeded_Setter";
+  onupgradeneeded_Setter_(mthis, __arg_0) => onupgradeneeded_Setter(mthis, __arg_0);
+
+}
+
+class BlinkIDBRequest extends BlinkEventTarget {
+  static final instance = new BlinkIDBRequest();
+
   static error_Getter(mthis) native "IDBRequest_error_Getter";
+  error_Getter_(mthis) => error_Getter(mthis);
+
+  static onerror_Getter(mthis) native "IDBRequest_onerror_Getter";
+  onerror_Getter_(mthis) => onerror_Getter(mthis);
+
+  static onerror_Setter(mthis, __arg_0) native "IDBRequest_onerror_Setter";
+  onerror_Setter_(mthis, __arg_0) => onerror_Setter(mthis, __arg_0);
+
+  static onsuccess_Getter(mthis) native "IDBRequest_onsuccess_Getter";
+  onsuccess_Getter_(mthis) => onsuccess_Getter(mthis);
+
+  static onsuccess_Setter(mthis, __arg_0) native "IDBRequest_onsuccess_Setter";
+  onsuccess_Setter_(mthis, __arg_0) => onsuccess_Setter(mthis, __arg_0);
 
   static readyState_Getter(mthis) native "IDBRequest_readyState_Getter";
+  readyState_Getter_(mthis) => readyState_Getter(mthis);
 
   static result_Getter(mthis) native "IDBRequest_result_Getter";
+  result_Getter_(mthis) => result_Getter(mthis);
 
   static source_Getter(mthis) native "IDBRequest_source_Getter";
+  source_Getter_(mthis) => source_Getter(mthis);
 
   static transaction_Getter(mthis) native "IDBRequest_transaction_Getter";
+  transaction_Getter_(mthis) => transaction_Getter(mthis);
+
 }
 
-class BlinkIDBOpenDBRequest {}
+class BlinkIDBTransaction extends BlinkEventTarget {
+  static final instance = new BlinkIDBTransaction();
 
-class BlinkIDBTransaction {
+  static abort_Callback_0(mthis) native "IDBTransaction_abort_Callback";
+  abort_Callback_0_(mthis) => abort_Callback_0(mthis);
+
+  static abort_Callback_1(mthis, __arg_0) native "IDBTransaction_abort_Callback";
+  abort_Callback_1_(mthis, __arg_0) => abort_Callback_1(mthis, __arg_0);
+
+  static abort_Callback_2(mthis, __arg_0, __arg_1) native "IDBTransaction_abort_Callback";
+  abort_Callback_2_(mthis, __arg_0, __arg_1) => abort_Callback_2(mthis, __arg_0, __arg_1);
+
   static db_Getter(mthis) native "IDBTransaction_db_Getter";
+  db_Getter_(mthis) => db_Getter(mthis);
 
   static error_Getter(mthis) native "IDBTransaction_error_Getter";
+  error_Getter_(mthis) => error_Getter(mthis);
 
   static mode_Getter(mthis) native "IDBTransaction_mode_Getter";
+  mode_Getter_(mthis) => mode_Getter(mthis);
 
-  static abort_Callback(mthis) native "IDBTransaction_abort_Callback";
+  static objectStore_Callback_0(mthis) native "IDBTransaction_objectStore_Callback";
+  objectStore_Callback_0_(mthis) => objectStore_Callback_0(mthis);
 
-  static objectStore_Callback_1(mthis, name) native "IDBTransaction_objectStore_Callback";
+  static objectStore_Callback_1(mthis, __arg_0) native "IDBTransaction_objectStore_Callback";
+  objectStore_Callback_1_(mthis, __arg_0) => objectStore_Callback_1(mthis, __arg_0);
+
+  static objectStore_Callback_2(mthis, __arg_0, __arg_1) native "IDBTransaction_objectStore_Callback";
+  objectStore_Callback_2_(mthis, __arg_0, __arg_1) => objectStore_Callback_2(mthis, __arg_0, __arg_1);
+
+  static objectStore_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "IDBTransaction_objectStore_Callback";
+  objectStore_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => objectStore_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static onabort_Getter(mthis) native "IDBTransaction_onabort_Getter";
+  onabort_Getter_(mthis) => onabort_Getter(mthis);
+
+  static onabort_Setter(mthis, __arg_0) native "IDBTransaction_onabort_Setter";
+  onabort_Setter_(mthis, __arg_0) => onabort_Setter(mthis, __arg_0);
+
+  static oncomplete_Getter(mthis) native "IDBTransaction_oncomplete_Getter";
+  oncomplete_Getter_(mthis) => oncomplete_Getter(mthis);
+
+  static oncomplete_Setter(mthis, __arg_0) native "IDBTransaction_oncomplete_Setter";
+  oncomplete_Setter_(mthis, __arg_0) => oncomplete_Setter(mthis, __arg_0);
+
+  static onerror_Getter(mthis) native "IDBTransaction_onerror_Getter";
+  onerror_Getter_(mthis) => onerror_Getter(mthis);
+
+  static onerror_Setter(mthis, __arg_0) native "IDBTransaction_onerror_Setter";
+  onerror_Setter_(mthis, __arg_0) => onerror_Setter(mthis, __arg_0);
+
 }
 
-class BlinkIDBVersionChangeEvent {
-  static constructorCallback(type, options) native "IDBVersionChangeEvent_constructorCallback";
+class BlinkIDBVersionChangeEvent extends BlinkEvent {
+  static final instance = new BlinkIDBVersionChangeEvent();
 
-  static dataLoss_Getter(mthis) native "IDBVersionChangeEvent_dataLoss_Getter";
+  static constructorCallback_2(__arg_0, __arg_1) native "IDBVersionChangeEvent_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
 
   static dataLossMessage_Getter(mthis) native "IDBVersionChangeEvent_dataLossMessage_Getter";
+  dataLossMessage_Getter_(mthis) => dataLossMessage_Getter(mthis);
+
+  static dataLoss_Getter(mthis) native "IDBVersionChangeEvent_dataLoss_Getter";
+  dataLoss_Getter_(mthis) => dataLoss_Getter(mthis);
 
   static newVersion_Getter(mthis) native "IDBVersionChangeEvent_newVersion_Getter";
+  newVersion_Getter_(mthis) => newVersion_Getter(mthis);
 
   static oldVersion_Getter(mthis) native "IDBVersionChangeEvent_oldVersion_Getter";
+  oldVersion_Getter_(mthis) => oldVersion_Getter(mthis);
+
 }
 
 class BlinkImageBitmap {
+  static final instance = new BlinkImageBitmap();
+
   static height_Getter(mthis) native "ImageBitmap_height_Getter";
+  height_Getter_(mthis) => height_Getter(mthis);
 
   static width_Getter(mthis) native "ImageBitmap_width_Getter";
+  width_Getter_(mthis) => width_Getter(mthis);
+
 }
 
 class BlinkImageData {
-  static constructorCallback_2(data_OR_width, height_OR_width) native "ImageData_constructorCallback";
+  static final instance = new BlinkImageData();
 
-  static constructorCallback_3(data_OR_width, height_OR_width, height) native "ImageData_constructorCallback";
+  static constructorCallback_0() native "ImageData_constructorCallback";
+  constructorCallback_0_() => constructorCallback_0();
+
+  static constructorCallback_1(__arg_0) native "ImageData_constructorCallback";
+  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+
+  static constructorCallback_2(__arg_0, __arg_1) native "ImageData_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+
+  static constructorCallback_3(__arg_0, __arg_1, __arg_2) native "ImageData_constructorCallback";
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => constructorCallback_3(__arg_0, __arg_1, __arg_2);
+
+  static constructorCallback_4(__arg_0, __arg_1, __arg_2, __arg_3) native "ImageData_constructorCallback";
+  constructorCallback_4_(__arg_0, __arg_1, __arg_2, __arg_3) => constructorCallback_4(__arg_0, __arg_1, __arg_2, __arg_3);
+
+  static constructorCallback_5(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "ImageData_constructorCallback";
+  constructorCallback_5_(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => constructorCallback_5(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
 
   static data_Getter(mthis) native "ImageData_data_Getter";
+  data_Getter_(mthis) => data_Getter(mthis);
 
   static height_Getter(mthis) native "ImageData_height_Getter";
+  height_Getter_(mthis) => height_Getter(mthis);
 
   static width_Getter(mthis) native "ImageData_width_Getter";
+  width_Getter_(mthis) => width_Getter(mthis);
+
 }
 
 class BlinkInjectedScriptHost {
-  static inspect_Callback_2(mthis, objectId, hints) native "InjectedScriptHost_inspect_Callback";
+  static final instance = new BlinkInjectedScriptHost();
+
+  static callFunction_Callback_1(mthis, __arg_0) native "InjectedScriptHost_callFunction_Callback";
+  callFunction_Callback_1_(mthis, __arg_0) => callFunction_Callback_1(mthis, __arg_0);
+
+  static callFunction_Callback_2(mthis, __arg_0, __arg_1) native "InjectedScriptHost_callFunction_Callback";
+  callFunction_Callback_2_(mthis, __arg_0, __arg_1) => callFunction_Callback_2(mthis, __arg_0, __arg_1);
+
+  static callFunction_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "InjectedScriptHost_callFunction_Callback";
+  callFunction_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => callFunction_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static callFunction_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "InjectedScriptHost_callFunction_Callback";
+  callFunction_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => callFunction_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static callFunction_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "InjectedScriptHost_callFunction_Callback";
+  callFunction_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => callFunction_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static clearConsoleMessages_Callback_0(mthis) native "InjectedScriptHost_clearConsoleMessages_Callback";
+  clearConsoleMessages_Callback_0_(mthis) => clearConsoleMessages_Callback_0(mthis);
+
+  static clearConsoleMessages_Callback_1(mthis, __arg_0) native "InjectedScriptHost_clearConsoleMessages_Callback";
+  clearConsoleMessages_Callback_1_(mthis, __arg_0) => clearConsoleMessages_Callback_1(mthis, __arg_0);
+
+  static clearConsoleMessages_Callback_2(mthis, __arg_0, __arg_1) native "InjectedScriptHost_clearConsoleMessages_Callback";
+  clearConsoleMessages_Callback_2_(mthis, __arg_0, __arg_1) => clearConsoleMessages_Callback_2(mthis, __arg_0, __arg_1);
+
+  static debugFunction_Callback_0(mthis) native "InjectedScriptHost_debugFunction_Callback";
+  debugFunction_Callback_0_(mthis) => debugFunction_Callback_0(mthis);
+
+  static debugFunction_Callback_1(mthis, __arg_0) native "InjectedScriptHost_debugFunction_Callback";
+  debugFunction_Callback_1_(mthis, __arg_0) => debugFunction_Callback_1(mthis, __arg_0);
+
+  static debugFunction_Callback_2(mthis, __arg_0, __arg_1) native "InjectedScriptHost_debugFunction_Callback";
+  debugFunction_Callback_2_(mthis, __arg_0, __arg_1) => debugFunction_Callback_2(mthis, __arg_0, __arg_1);
+
+  static debugFunction_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "InjectedScriptHost_debugFunction_Callback";
+  debugFunction_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => debugFunction_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static eval_Callback_0(mthis) native "InjectedScriptHost_eval_Callback";
+  eval_Callback_0_(mthis) => eval_Callback_0(mthis);
+
+  static eval_Callback_1(mthis, __arg_0) native "InjectedScriptHost_eval_Callback";
+  eval_Callback_1_(mthis, __arg_0) => eval_Callback_1(mthis, __arg_0);
+
+  static eval_Callback_2(mthis, __arg_0, __arg_1) native "InjectedScriptHost_eval_Callback";
+  eval_Callback_2_(mthis, __arg_0, __arg_1) => eval_Callback_2(mthis, __arg_0, __arg_1);
+
+  static eval_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "InjectedScriptHost_eval_Callback";
+  eval_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => eval_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static evaluateWithExceptionDetails_Callback_0(mthis) native "InjectedScriptHost_evaluateWithExceptionDetails_Callback";
+  evaluateWithExceptionDetails_Callback_0_(mthis) => evaluateWithExceptionDetails_Callback_0(mthis);
+
+  static evaluateWithExceptionDetails_Callback_1(mthis, __arg_0) native "InjectedScriptHost_evaluateWithExceptionDetails_Callback";
+  evaluateWithExceptionDetails_Callback_1_(mthis, __arg_0) => evaluateWithExceptionDetails_Callback_1(mthis, __arg_0);
+
+  static evaluateWithExceptionDetails_Callback_2(mthis, __arg_0, __arg_1) native "InjectedScriptHost_evaluateWithExceptionDetails_Callback";
+  evaluateWithExceptionDetails_Callback_2_(mthis, __arg_0, __arg_1) => evaluateWithExceptionDetails_Callback_2(mthis, __arg_0, __arg_1);
+
+  static evaluateWithExceptionDetails_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "InjectedScriptHost_evaluateWithExceptionDetails_Callback";
+  evaluateWithExceptionDetails_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => evaluateWithExceptionDetails_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static functionDetails_Callback_0(mthis) native "InjectedScriptHost_functionDetails_Callback";
+  functionDetails_Callback_0_(mthis) => functionDetails_Callback_0(mthis);
+
+  static functionDetails_Callback_1(mthis, __arg_0) native "InjectedScriptHost_functionDetails_Callback";
+  functionDetails_Callback_1_(mthis, __arg_0) => functionDetails_Callback_1(mthis, __arg_0);
+
+  static functionDetails_Callback_2(mthis, __arg_0, __arg_1) native "InjectedScriptHost_functionDetails_Callback";
+  functionDetails_Callback_2_(mthis, __arg_0, __arg_1) => functionDetails_Callback_2(mthis, __arg_0, __arg_1);
+
+  static functionDetails_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "InjectedScriptHost_functionDetails_Callback";
+  functionDetails_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => functionDetails_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static getEventListeners_Callback_0(mthis) native "InjectedScriptHost_getEventListeners_Callback";
+  getEventListeners_Callback_0_(mthis) => getEventListeners_Callback_0(mthis);
+
+  static getEventListeners_Callback_1(mthis, __arg_0) native "InjectedScriptHost_getEventListeners_Callback";
+  getEventListeners_Callback_1_(mthis, __arg_0) => getEventListeners_Callback_1(mthis, __arg_0);
+
+  static getEventListeners_Callback_2(mthis, __arg_0, __arg_1) native "InjectedScriptHost_getEventListeners_Callback";
+  getEventListeners_Callback_2_(mthis, __arg_0, __arg_1) => getEventListeners_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getEventListeners_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "InjectedScriptHost_getEventListeners_Callback";
+  getEventListeners_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getEventListeners_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static getInternalProperties_Callback_0(mthis) native "InjectedScriptHost_getInternalProperties_Callback";
+  getInternalProperties_Callback_0_(mthis) => getInternalProperties_Callback_0(mthis);
+
+  static getInternalProperties_Callback_1(mthis, __arg_0) native "InjectedScriptHost_getInternalProperties_Callback";
+  getInternalProperties_Callback_1_(mthis, __arg_0) => getInternalProperties_Callback_1(mthis, __arg_0);
+
+  static getInternalProperties_Callback_2(mthis, __arg_0, __arg_1) native "InjectedScriptHost_getInternalProperties_Callback";
+  getInternalProperties_Callback_2_(mthis, __arg_0, __arg_1) => getInternalProperties_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getInternalProperties_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "InjectedScriptHost_getInternalProperties_Callback";
+  getInternalProperties_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getInternalProperties_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static inspect_Callback_0(mthis) native "InjectedScriptHost_inspect_Callback";
+  inspect_Callback_0_(mthis) => inspect_Callback_0(mthis);
+
+  static inspect_Callback_1(mthis, __arg_0) native "InjectedScriptHost_inspect_Callback";
+  inspect_Callback_1_(mthis, __arg_0) => inspect_Callback_1(mthis, __arg_0);
+
+  static inspect_Callback_2(mthis, __arg_0, __arg_1) native "InjectedScriptHost_inspect_Callback";
+  inspect_Callback_2_(mthis, __arg_0, __arg_1) => inspect_Callback_2(mthis, __arg_0, __arg_1);
+
+  static inspect_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "InjectedScriptHost_inspect_Callback";
+  inspect_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => inspect_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static inspect_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "InjectedScriptHost_inspect_Callback";
+  inspect_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => inspect_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static inspectedObject_Callback_0(mthis) native "InjectedScriptHost_inspectedObject_Callback";
+  inspectedObject_Callback_0_(mthis) => inspectedObject_Callback_0(mthis);
+
+  static inspectedObject_Callback_1(mthis, __arg_0) native "InjectedScriptHost_inspectedObject_Callback";
+  inspectedObject_Callback_1_(mthis, __arg_0) => inspectedObject_Callback_1(mthis, __arg_0);
+
+  static inspectedObject_Callback_2(mthis, __arg_0, __arg_1) native "InjectedScriptHost_inspectedObject_Callback";
+  inspectedObject_Callback_2_(mthis, __arg_0, __arg_1) => inspectedObject_Callback_2(mthis, __arg_0, __arg_1);
+
+  static inspectedObject_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "InjectedScriptHost_inspectedObject_Callback";
+  inspectedObject_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => inspectedObject_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static internalConstructorName_Callback_0(mthis) native "InjectedScriptHost_internalConstructorName_Callback";
+  internalConstructorName_Callback_0_(mthis) => internalConstructorName_Callback_0(mthis);
+
+  static internalConstructorName_Callback_1(mthis, __arg_0) native "InjectedScriptHost_internalConstructorName_Callback";
+  internalConstructorName_Callback_1_(mthis, __arg_0) => internalConstructorName_Callback_1(mthis, __arg_0);
+
+  static internalConstructorName_Callback_2(mthis, __arg_0, __arg_1) native "InjectedScriptHost_internalConstructorName_Callback";
+  internalConstructorName_Callback_2_(mthis, __arg_0, __arg_1) => internalConstructorName_Callback_2(mthis, __arg_0, __arg_1);
+
+  static internalConstructorName_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "InjectedScriptHost_internalConstructorName_Callback";
+  internalConstructorName_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => internalConstructorName_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static isHTMLAllCollection_Callback_0(mthis) native "InjectedScriptHost_isHTMLAllCollection_Callback";
+  isHTMLAllCollection_Callback_0_(mthis) => isHTMLAllCollection_Callback_0(mthis);
+
+  static isHTMLAllCollection_Callback_1(mthis, __arg_0) native "InjectedScriptHost_isHTMLAllCollection_Callback";
+  isHTMLAllCollection_Callback_1_(mthis, __arg_0) => isHTMLAllCollection_Callback_1(mthis, __arg_0);
+
+  static isHTMLAllCollection_Callback_2(mthis, __arg_0, __arg_1) native "InjectedScriptHost_isHTMLAllCollection_Callback";
+  isHTMLAllCollection_Callback_2_(mthis, __arg_0, __arg_1) => isHTMLAllCollection_Callback_2(mthis, __arg_0, __arg_1);
+
+  static isHTMLAllCollection_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "InjectedScriptHost_isHTMLAllCollection_Callback";
+  isHTMLAllCollection_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => isHTMLAllCollection_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static monitorFunction_Callback_0(mthis) native "InjectedScriptHost_monitorFunction_Callback";
+  monitorFunction_Callback_0_(mthis) => monitorFunction_Callback_0(mthis);
+
+  static monitorFunction_Callback_1(mthis, __arg_0) native "InjectedScriptHost_monitorFunction_Callback";
+  monitorFunction_Callback_1_(mthis, __arg_0) => monitorFunction_Callback_1(mthis, __arg_0);
+
+  static monitorFunction_Callback_2(mthis, __arg_0, __arg_1) native "InjectedScriptHost_monitorFunction_Callback";
+  monitorFunction_Callback_2_(mthis, __arg_0, __arg_1) => monitorFunction_Callback_2(mthis, __arg_0, __arg_1);
+
+  static monitorFunction_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "InjectedScriptHost_monitorFunction_Callback";
+  monitorFunction_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => monitorFunction_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static setFunctionVariableValue_Callback_2(mthis, __arg_0, __arg_1) native "InjectedScriptHost_setFunctionVariableValue_Callback";
+  setFunctionVariableValue_Callback_2_(mthis, __arg_0, __arg_1) => setFunctionVariableValue_Callback_2(mthis, __arg_0, __arg_1);
+
+  static setFunctionVariableValue_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "InjectedScriptHost_setFunctionVariableValue_Callback";
+  setFunctionVariableValue_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => setFunctionVariableValue_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static setFunctionVariableValue_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "InjectedScriptHost_setFunctionVariableValue_Callback";
+  setFunctionVariableValue_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => setFunctionVariableValue_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static setFunctionVariableValue_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "InjectedScriptHost_setFunctionVariableValue_Callback";
+  setFunctionVariableValue_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => setFunctionVariableValue_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static setFunctionVariableValue_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "InjectedScriptHost_setFunctionVariableValue_Callback";
+  setFunctionVariableValue_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => setFunctionVariableValue_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static suppressWarningsAndCallFunction_Callback_1(mthis, __arg_0) native "InjectedScriptHost_suppressWarningsAndCallFunction_Callback";
+  suppressWarningsAndCallFunction_Callback_1_(mthis, __arg_0) => suppressWarningsAndCallFunction_Callback_1(mthis, __arg_0);
+
+  static suppressWarningsAndCallFunction_Callback_2(mthis, __arg_0, __arg_1) native "InjectedScriptHost_suppressWarningsAndCallFunction_Callback";
+  suppressWarningsAndCallFunction_Callback_2_(mthis, __arg_0, __arg_1) => suppressWarningsAndCallFunction_Callback_2(mthis, __arg_0, __arg_1);
+
+  static suppressWarningsAndCallFunction_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "InjectedScriptHost_suppressWarningsAndCallFunction_Callback";
+  suppressWarningsAndCallFunction_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => suppressWarningsAndCallFunction_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static suppressWarningsAndCallFunction_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "InjectedScriptHost_suppressWarningsAndCallFunction_Callback";
+  suppressWarningsAndCallFunction_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => suppressWarningsAndCallFunction_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static suppressWarningsAndCallFunction_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "InjectedScriptHost_suppressWarningsAndCallFunction_Callback";
+  suppressWarningsAndCallFunction_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => suppressWarningsAndCallFunction_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static type_Callback_0(mthis) native "InjectedScriptHost_type_Callback";
+  type_Callback_0_(mthis) => type_Callback_0(mthis);
+
+  static type_Callback_1(mthis, __arg_0) native "InjectedScriptHost_type_Callback";
+  type_Callback_1_(mthis, __arg_0) => type_Callback_1(mthis, __arg_0);
+
+  static type_Callback_2(mthis, __arg_0, __arg_1) native "InjectedScriptHost_type_Callback";
+  type_Callback_2_(mthis, __arg_0, __arg_1) => type_Callback_2(mthis, __arg_0, __arg_1);
+
+  static type_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "InjectedScriptHost_type_Callback";
+  type_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => type_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static undebugFunction_Callback_0(mthis) native "InjectedScriptHost_undebugFunction_Callback";
+  undebugFunction_Callback_0_(mthis) => undebugFunction_Callback_0(mthis);
+
+  static undebugFunction_Callback_1(mthis, __arg_0) native "InjectedScriptHost_undebugFunction_Callback";
+  undebugFunction_Callback_1_(mthis, __arg_0) => undebugFunction_Callback_1(mthis, __arg_0);
+
+  static undebugFunction_Callback_2(mthis, __arg_0, __arg_1) native "InjectedScriptHost_undebugFunction_Callback";
+  undebugFunction_Callback_2_(mthis, __arg_0, __arg_1) => undebugFunction_Callback_2(mthis, __arg_0, __arg_1);
+
+  static undebugFunction_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "InjectedScriptHost_undebugFunction_Callback";
+  undebugFunction_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => undebugFunction_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static unmonitorFunction_Callback_0(mthis) native "InjectedScriptHost_unmonitorFunction_Callback";
+  unmonitorFunction_Callback_0_(mthis) => unmonitorFunction_Callback_0(mthis);
+
+  static unmonitorFunction_Callback_1(mthis, __arg_0) native "InjectedScriptHost_unmonitorFunction_Callback";
+  unmonitorFunction_Callback_1_(mthis, __arg_0) => unmonitorFunction_Callback_1(mthis, __arg_0);
+
+  static unmonitorFunction_Callback_2(mthis, __arg_0, __arg_1) native "InjectedScriptHost_unmonitorFunction_Callback";
+  unmonitorFunction_Callback_2_(mthis, __arg_0, __arg_1) => unmonitorFunction_Callback_2(mthis, __arg_0, __arg_1);
+
+  static unmonitorFunction_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "InjectedScriptHost_unmonitorFunction_Callback";
+  unmonitorFunction_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => unmonitorFunction_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
 }
 
-class BlinkInputMethodContext {
+class BlinkInputMethodContext extends BlinkEventTarget {
+  static final instance = new BlinkInputMethodContext();
+
   static compositionEndOffset_Getter(mthis) native "InputMethodContext_compositionEndOffset_Getter";
+  compositionEndOffset_Getter_(mthis) => compositionEndOffset_Getter(mthis);
 
   static compositionStartOffset_Getter(mthis) native "InputMethodContext_compositionStartOffset_Getter";
+  compositionStartOffset_Getter_(mthis) => compositionStartOffset_Getter(mthis);
+
+  static confirmComposition_Callback_0(mthis) native "InputMethodContext_confirmComposition_Callback";
+  confirmComposition_Callback_0_(mthis) => confirmComposition_Callback_0(mthis);
+
+  static confirmComposition_Callback_1(mthis, __arg_0) native "InputMethodContext_confirmComposition_Callback";
+  confirmComposition_Callback_1_(mthis, __arg_0) => confirmComposition_Callback_1(mthis, __arg_0);
+
+  static confirmComposition_Callback_2(mthis, __arg_0, __arg_1) native "InputMethodContext_confirmComposition_Callback";
+  confirmComposition_Callback_2_(mthis, __arg_0, __arg_1) => confirmComposition_Callback_2(mthis, __arg_0, __arg_1);
 
   static locale_Getter(mthis) native "InputMethodContext_locale_Getter";
+  locale_Getter_(mthis) => locale_Getter(mthis);
+
+  static oncandidatewindowhide_Getter(mthis) native "InputMethodContext_oncandidatewindowhide_Getter";
+  oncandidatewindowhide_Getter_(mthis) => oncandidatewindowhide_Getter(mthis);
+
+  static oncandidatewindowhide_Setter(mthis, __arg_0) native "InputMethodContext_oncandidatewindowhide_Setter";
+  oncandidatewindowhide_Setter_(mthis, __arg_0) => oncandidatewindowhide_Setter(mthis, __arg_0);
+
+  static oncandidatewindowshow_Getter(mthis) native "InputMethodContext_oncandidatewindowshow_Getter";
+  oncandidatewindowshow_Getter_(mthis) => oncandidatewindowshow_Getter(mthis);
+
+  static oncandidatewindowshow_Setter(mthis, __arg_0) native "InputMethodContext_oncandidatewindowshow_Setter";
+  oncandidatewindowshow_Setter_(mthis, __arg_0) => oncandidatewindowshow_Setter(mthis, __arg_0);
+
+  static oncandidatewindowupdate_Getter(mthis) native "InputMethodContext_oncandidatewindowupdate_Getter";
+  oncandidatewindowupdate_Getter_(mthis) => oncandidatewindowupdate_Getter(mthis);
+
+  static oncandidatewindowupdate_Setter(mthis, __arg_0) native "InputMethodContext_oncandidatewindowupdate_Setter";
+  oncandidatewindowupdate_Setter_(mthis, __arg_0) => oncandidatewindowupdate_Setter(mthis, __arg_0);
 
   static target_Getter(mthis) native "InputMethodContext_target_Getter";
+  target_Getter_(mthis) => target_Getter(mthis);
 
-  static confirmComposition_Callback(mthis) native "InputMethodContext_confirmComposition_Callback";
 }
 
-class BlinkInstallPhaseEvent {
-  static waitUntil_Callback_1(mthis, value) native "InstallPhaseEvent_waitUntil_Callback";
+class BlinkInspectorFrontendHost {
+  static final instance = new BlinkInspectorFrontendHost();
+
+  static copyText_Callback_0(mthis) native "InspectorFrontendHost_copyText_Callback";
+  copyText_Callback_0_(mthis) => copyText_Callback_0(mthis);
+
+  static copyText_Callback_1(mthis, __arg_0) native "InspectorFrontendHost_copyText_Callback";
+  copyText_Callback_1_(mthis, __arg_0) => copyText_Callback_1(mthis, __arg_0);
+
+  static copyText_Callback_2(mthis, __arg_0, __arg_1) native "InspectorFrontendHost_copyText_Callback";
+  copyText_Callback_2_(mthis, __arg_0, __arg_1) => copyText_Callback_2(mthis, __arg_0, __arg_1);
+
+  static copyText_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "InspectorFrontendHost_copyText_Callback";
+  copyText_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => copyText_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static getSelectionBackgroundColor_Callback_0(mthis) native "InspectorFrontendHost_getSelectionBackgroundColor_Callback";
+  getSelectionBackgroundColor_Callback_0_(mthis) => getSelectionBackgroundColor_Callback_0(mthis);
+
+  static getSelectionBackgroundColor_Callback_1(mthis, __arg_0) native "InspectorFrontendHost_getSelectionBackgroundColor_Callback";
+  getSelectionBackgroundColor_Callback_1_(mthis, __arg_0) => getSelectionBackgroundColor_Callback_1(mthis, __arg_0);
+
+  static getSelectionBackgroundColor_Callback_2(mthis, __arg_0, __arg_1) native "InspectorFrontendHost_getSelectionBackgroundColor_Callback";
+  getSelectionBackgroundColor_Callback_2_(mthis, __arg_0, __arg_1) => getSelectionBackgroundColor_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getSelectionForegroundColor_Callback_0(mthis) native "InspectorFrontendHost_getSelectionForegroundColor_Callback";
+  getSelectionForegroundColor_Callback_0_(mthis) => getSelectionForegroundColor_Callback_0(mthis);
+
+  static getSelectionForegroundColor_Callback_1(mthis, __arg_0) native "InspectorFrontendHost_getSelectionForegroundColor_Callback";
+  getSelectionForegroundColor_Callback_1_(mthis, __arg_0) => getSelectionForegroundColor_Callback_1(mthis, __arg_0);
+
+  static getSelectionForegroundColor_Callback_2(mthis, __arg_0, __arg_1) native "InspectorFrontendHost_getSelectionForegroundColor_Callback";
+  getSelectionForegroundColor_Callback_2_(mthis, __arg_0, __arg_1) => getSelectionForegroundColor_Callback_2(mthis, __arg_0, __arg_1);
+
+  static isHostedMode_Callback_0(mthis) native "InspectorFrontendHost_isHostedMode_Callback";
+  isHostedMode_Callback_0_(mthis) => isHostedMode_Callback_0(mthis);
+
+  static isHostedMode_Callback_1(mthis, __arg_0) native "InspectorFrontendHost_isHostedMode_Callback";
+  isHostedMode_Callback_1_(mthis, __arg_0) => isHostedMode_Callback_1(mthis, __arg_0);
+
+  static isHostedMode_Callback_2(mthis, __arg_0, __arg_1) native "InspectorFrontendHost_isHostedMode_Callback";
+  isHostedMode_Callback_2_(mthis, __arg_0, __arg_1) => isHostedMode_Callback_2(mthis, __arg_0, __arg_1);
+
+  static isUnderTest_Callback_0(mthis) native "InspectorFrontendHost_isUnderTest_Callback";
+  isUnderTest_Callback_0_(mthis) => isUnderTest_Callback_0(mthis);
+
+  static isUnderTest_Callback_1(mthis, __arg_0) native "InspectorFrontendHost_isUnderTest_Callback";
+  isUnderTest_Callback_1_(mthis, __arg_0) => isUnderTest_Callback_1(mthis, __arg_0);
+
+  static isUnderTest_Callback_2(mthis, __arg_0, __arg_1) native "InspectorFrontendHost_isUnderTest_Callback";
+  isUnderTest_Callback_2_(mthis, __arg_0, __arg_1) => isUnderTest_Callback_2(mthis, __arg_0, __arg_1);
+
+  static isolatedFileSystem_Callback_0(mthis) native "InspectorFrontendHost_isolatedFileSystem_Callback";
+  isolatedFileSystem_Callback_0_(mthis) => isolatedFileSystem_Callback_0(mthis);
+
+  static isolatedFileSystem_Callback_1(mthis, __arg_0) native "InspectorFrontendHost_isolatedFileSystem_Callback";
+  isolatedFileSystem_Callback_1_(mthis, __arg_0) => isolatedFileSystem_Callback_1(mthis, __arg_0);
+
+  static isolatedFileSystem_Callback_2(mthis, __arg_0, __arg_1) native "InspectorFrontendHost_isolatedFileSystem_Callback";
+  isolatedFileSystem_Callback_2_(mthis, __arg_0, __arg_1) => isolatedFileSystem_Callback_2(mthis, __arg_0, __arg_1);
+
+  static isolatedFileSystem_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "InspectorFrontendHost_isolatedFileSystem_Callback";
+  isolatedFileSystem_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => isolatedFileSystem_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static isolatedFileSystem_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "InspectorFrontendHost_isolatedFileSystem_Callback";
+  isolatedFileSystem_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => isolatedFileSystem_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static platform_Callback_0(mthis) native "InspectorFrontendHost_platform_Callback";
+  platform_Callback_0_(mthis) => platform_Callback_0(mthis);
+
+  static platform_Callback_1(mthis, __arg_0) native "InspectorFrontendHost_platform_Callback";
+  platform_Callback_1_(mthis, __arg_0) => platform_Callback_1(mthis, __arg_0);
+
+  static platform_Callback_2(mthis, __arg_0, __arg_1) native "InspectorFrontendHost_platform_Callback";
+  platform_Callback_2_(mthis, __arg_0, __arg_1) => platform_Callback_2(mthis, __arg_0, __arg_1);
+
+  static port_Callback_0(mthis) native "InspectorFrontendHost_port_Callback";
+  port_Callback_0_(mthis) => port_Callback_0(mthis);
+
+  static port_Callback_1(mthis, __arg_0) native "InspectorFrontendHost_port_Callback";
+  port_Callback_1_(mthis, __arg_0) => port_Callback_1(mthis, __arg_0);
+
+  static port_Callback_2(mthis, __arg_0, __arg_1) native "InspectorFrontendHost_port_Callback";
+  port_Callback_2_(mthis, __arg_0, __arg_1) => port_Callback_2(mthis, __arg_0, __arg_1);
+
+  static recordActionTaken_Callback_0(mthis) native "InspectorFrontendHost_recordActionTaken_Callback";
+  recordActionTaken_Callback_0_(mthis) => recordActionTaken_Callback_0(mthis);
+
+  static recordActionTaken_Callback_1(mthis, __arg_0) native "InspectorFrontendHost_recordActionTaken_Callback";
+  recordActionTaken_Callback_1_(mthis, __arg_0) => recordActionTaken_Callback_1(mthis, __arg_0);
+
+  static recordActionTaken_Callback_2(mthis, __arg_0, __arg_1) native "InspectorFrontendHost_recordActionTaken_Callback";
+  recordActionTaken_Callback_2_(mthis, __arg_0, __arg_1) => recordActionTaken_Callback_2(mthis, __arg_0, __arg_1);
+
+  static recordActionTaken_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "InspectorFrontendHost_recordActionTaken_Callback";
+  recordActionTaken_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => recordActionTaken_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static recordPanelShown_Callback_0(mthis) native "InspectorFrontendHost_recordPanelShown_Callback";
+  recordPanelShown_Callback_0_(mthis) => recordPanelShown_Callback_0(mthis);
+
+  static recordPanelShown_Callback_1(mthis, __arg_0) native "InspectorFrontendHost_recordPanelShown_Callback";
+  recordPanelShown_Callback_1_(mthis, __arg_0) => recordPanelShown_Callback_1(mthis, __arg_0);
+
+  static recordPanelShown_Callback_2(mthis, __arg_0, __arg_1) native "InspectorFrontendHost_recordPanelShown_Callback";
+  recordPanelShown_Callback_2_(mthis, __arg_0, __arg_1) => recordPanelShown_Callback_2(mthis, __arg_0, __arg_1);
+
+  static recordPanelShown_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "InspectorFrontendHost_recordPanelShown_Callback";
+  recordPanelShown_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => recordPanelShown_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static sendMessageToBackend_Callback_0(mthis) native "InspectorFrontendHost_sendMessageToBackend_Callback";
+  sendMessageToBackend_Callback_0_(mthis) => sendMessageToBackend_Callback_0(mthis);
+
+  static sendMessageToBackend_Callback_1(mthis, __arg_0) native "InspectorFrontendHost_sendMessageToBackend_Callback";
+  sendMessageToBackend_Callback_1_(mthis, __arg_0) => sendMessageToBackend_Callback_1(mthis, __arg_0);
+
+  static sendMessageToBackend_Callback_2(mthis, __arg_0, __arg_1) native "InspectorFrontendHost_sendMessageToBackend_Callback";
+  sendMessageToBackend_Callback_2_(mthis, __arg_0, __arg_1) => sendMessageToBackend_Callback_2(mthis, __arg_0, __arg_1);
+
+  static sendMessageToBackend_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "InspectorFrontendHost_sendMessageToBackend_Callback";
+  sendMessageToBackend_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => sendMessageToBackend_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static sendMessageToEmbedder_Callback_0(mthis) native "InspectorFrontendHost_sendMessageToEmbedder_Callback";
+  sendMessageToEmbedder_Callback_0_(mthis) => sendMessageToEmbedder_Callback_0(mthis);
+
+  static sendMessageToEmbedder_Callback_1(mthis, __arg_0) native "InspectorFrontendHost_sendMessageToEmbedder_Callback";
+  sendMessageToEmbedder_Callback_1_(mthis, __arg_0) => sendMessageToEmbedder_Callback_1(mthis, __arg_0);
+
+  static sendMessageToEmbedder_Callback_2(mthis, __arg_0, __arg_1) native "InspectorFrontendHost_sendMessageToEmbedder_Callback";
+  sendMessageToEmbedder_Callback_2_(mthis, __arg_0, __arg_1) => sendMessageToEmbedder_Callback_2(mthis, __arg_0, __arg_1);
+
+  static sendMessageToEmbedder_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "InspectorFrontendHost_sendMessageToEmbedder_Callback";
+  sendMessageToEmbedder_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => sendMessageToEmbedder_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static setInjectedScriptForOrigin_Callback_0(mthis) native "InspectorFrontendHost_setInjectedScriptForOrigin_Callback";
+  setInjectedScriptForOrigin_Callback_0_(mthis) => setInjectedScriptForOrigin_Callback_0(mthis);
+
+  static setInjectedScriptForOrigin_Callback_1(mthis, __arg_0) native "InspectorFrontendHost_setInjectedScriptForOrigin_Callback";
+  setInjectedScriptForOrigin_Callback_1_(mthis, __arg_0) => setInjectedScriptForOrigin_Callback_1(mthis, __arg_0);
+
+  static setInjectedScriptForOrigin_Callback_2(mthis, __arg_0, __arg_1) native "InspectorFrontendHost_setInjectedScriptForOrigin_Callback";
+  setInjectedScriptForOrigin_Callback_2_(mthis, __arg_0, __arg_1) => setInjectedScriptForOrigin_Callback_2(mthis, __arg_0, __arg_1);
+
+  static setInjectedScriptForOrigin_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "InspectorFrontendHost_setInjectedScriptForOrigin_Callback";
+  setInjectedScriptForOrigin_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => setInjectedScriptForOrigin_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static setInjectedScriptForOrigin_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "InspectorFrontendHost_setInjectedScriptForOrigin_Callback";
+  setInjectedScriptForOrigin_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => setInjectedScriptForOrigin_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static setZoomFactor_Callback_0(mthis) native "InspectorFrontendHost_setZoomFactor_Callback";
+  setZoomFactor_Callback_0_(mthis) => setZoomFactor_Callback_0(mthis);
+
+  static setZoomFactor_Callback_1(mthis, __arg_0) native "InspectorFrontendHost_setZoomFactor_Callback";
+  setZoomFactor_Callback_1_(mthis, __arg_0) => setZoomFactor_Callback_1(mthis, __arg_0);
+
+  static setZoomFactor_Callback_2(mthis, __arg_0, __arg_1) native "InspectorFrontendHost_setZoomFactor_Callback";
+  setZoomFactor_Callback_2_(mthis, __arg_0, __arg_1) => setZoomFactor_Callback_2(mthis, __arg_0, __arg_1);
+
+  static setZoomFactor_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "InspectorFrontendHost_setZoomFactor_Callback";
+  setZoomFactor_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => setZoomFactor_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static showContextMenuAtPoint_Callback_1(mthis, __arg_0) native "InspectorFrontendHost_showContextMenuAtPoint_Callback";
+  showContextMenuAtPoint_Callback_1_(mthis, __arg_0) => showContextMenuAtPoint_Callback_1(mthis, __arg_0);
+
+  static showContextMenuAtPoint_Callback_2(mthis, __arg_0, __arg_1) native "InspectorFrontendHost_showContextMenuAtPoint_Callback";
+  showContextMenuAtPoint_Callback_2_(mthis, __arg_0, __arg_1) => showContextMenuAtPoint_Callback_2(mthis, __arg_0, __arg_1);
+
+  static showContextMenuAtPoint_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "InspectorFrontendHost_showContextMenuAtPoint_Callback";
+  showContextMenuAtPoint_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => showContextMenuAtPoint_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static showContextMenuAtPoint_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "InspectorFrontendHost_showContextMenuAtPoint_Callback";
+  showContextMenuAtPoint_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => showContextMenuAtPoint_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static showContextMenuAtPoint_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "InspectorFrontendHost_showContextMenuAtPoint_Callback";
+  showContextMenuAtPoint_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => showContextMenuAtPoint_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static showContextMenu_Callback_0(mthis) native "InspectorFrontendHost_showContextMenu_Callback";
+  showContextMenu_Callback_0_(mthis) => showContextMenu_Callback_0(mthis);
+
+  static showContextMenu_Callback_1(mthis, __arg_0) native "InspectorFrontendHost_showContextMenu_Callback";
+  showContextMenu_Callback_1_(mthis, __arg_0) => showContextMenu_Callback_1(mthis, __arg_0);
+
+  static showContextMenu_Callback_2(mthis, __arg_0, __arg_1) native "InspectorFrontendHost_showContextMenu_Callback";
+  showContextMenu_Callback_2_(mthis, __arg_0, __arg_1) => showContextMenu_Callback_2(mthis, __arg_0, __arg_1);
+
+  static showContextMenu_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "InspectorFrontendHost_showContextMenu_Callback";
+  showContextMenu_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => showContextMenu_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static showContextMenu_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "InspectorFrontendHost_showContextMenu_Callback";
+  showContextMenu_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => showContextMenu_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static upgradeDraggedFileSystemPermissions_Callback_0(mthis) native "InspectorFrontendHost_upgradeDraggedFileSystemPermissions_Callback";
+  upgradeDraggedFileSystemPermissions_Callback_0_(mthis) => upgradeDraggedFileSystemPermissions_Callback_0(mthis);
+
+  static upgradeDraggedFileSystemPermissions_Callback_1(mthis, __arg_0) native "InspectorFrontendHost_upgradeDraggedFileSystemPermissions_Callback";
+  upgradeDraggedFileSystemPermissions_Callback_1_(mthis, __arg_0) => upgradeDraggedFileSystemPermissions_Callback_1(mthis, __arg_0);
+
+  static upgradeDraggedFileSystemPermissions_Callback_2(mthis, __arg_0, __arg_1) native "InspectorFrontendHost_upgradeDraggedFileSystemPermissions_Callback";
+  upgradeDraggedFileSystemPermissions_Callback_2_(mthis, __arg_0, __arg_1) => upgradeDraggedFileSystemPermissions_Callback_2(mthis, __arg_0, __arg_1);
+
+  static upgradeDraggedFileSystemPermissions_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "InspectorFrontendHost_upgradeDraggedFileSystemPermissions_Callback";
+  upgradeDraggedFileSystemPermissions_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => upgradeDraggedFileSystemPermissions_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static zoomFactor_Callback_0(mthis) native "InspectorFrontendHost_zoomFactor_Callback";
+  zoomFactor_Callback_0_(mthis) => zoomFactor_Callback_0(mthis);
+
+  static zoomFactor_Callback_1(mthis, __arg_0) native "InspectorFrontendHost_zoomFactor_Callback";
+  zoomFactor_Callback_1_(mthis, __arg_0) => zoomFactor_Callback_1(mthis, __arg_0);
+
+  static zoomFactor_Callback_2(mthis, __arg_0, __arg_1) native "InspectorFrontendHost_zoomFactor_Callback";
+  zoomFactor_Callback_2_(mthis, __arg_0, __arg_1) => zoomFactor_Callback_2(mthis, __arg_0, __arg_1);
+
 }
 
-class BlinkInstallEvent {
-  static reloadAll_Callback(mthis) native "InstallEvent_reloadAll_Callback";
+class BlinkInspectorOverlayHost {
+  static final instance = new BlinkInspectorOverlayHost();
 
-  static replace_Callback(mthis) native "InstallEvent_replace_Callback";
+  static resume_Callback_0(mthis) native "InspectorOverlayHost_resume_Callback";
+  resume_Callback_0_(mthis) => resume_Callback_0(mthis);
+
+  static resume_Callback_1(mthis, __arg_0) native "InspectorOverlayHost_resume_Callback";
+  resume_Callback_1_(mthis, __arg_0) => resume_Callback_1(mthis, __arg_0);
+
+  static resume_Callback_2(mthis, __arg_0, __arg_1) native "InspectorOverlayHost_resume_Callback";
+  resume_Callback_2_(mthis, __arg_0, __arg_1) => resume_Callback_2(mthis, __arg_0, __arg_1);
+
+  static stepOver_Callback_0(mthis) native "InspectorOverlayHost_stepOver_Callback";
+  stepOver_Callback_0_(mthis) => stepOver_Callback_0(mthis);
+
+  static stepOver_Callback_1(mthis, __arg_0) native "InspectorOverlayHost_stepOver_Callback";
+  stepOver_Callback_1_(mthis, __arg_0) => stepOver_Callback_1(mthis, __arg_0);
+
+  static stepOver_Callback_2(mthis, __arg_0, __arg_1) native "InspectorOverlayHost_stepOver_Callback";
+  stepOver_Callback_2_(mthis, __arg_0, __arg_1) => stepOver_Callback_2(mthis, __arg_0, __arg_1);
+
 }
 
-class BlinkKeyboardEvent {
-  static constructorCallback(type, options) native "KeyboardEvent_constructorCallback";
+class BlinkInstallEvent extends BlinkInstallPhaseEvent {
+  static final instance = new BlinkInstallEvent();
+
+  static reloadAll_Callback_0(mthis) native "InstallEvent_reloadAll_Callback";
+  reloadAll_Callback_0_(mthis) => reloadAll_Callback_0(mthis);
+
+  static reloadAll_Callback_1(mthis, __arg_0) native "InstallEvent_reloadAll_Callback";
+  reloadAll_Callback_1_(mthis, __arg_0) => reloadAll_Callback_1(mthis, __arg_0);
+
+  static reloadAll_Callback_2(mthis, __arg_0, __arg_1) native "InstallEvent_reloadAll_Callback";
+  reloadAll_Callback_2_(mthis, __arg_0, __arg_1) => reloadAll_Callback_2(mthis, __arg_0, __arg_1);
+
+  static replace_Callback_0(mthis) native "InstallEvent_replace_Callback";
+  replace_Callback_0_(mthis) => replace_Callback_0(mthis);
+
+  static replace_Callback_1(mthis, __arg_0) native "InstallEvent_replace_Callback";
+  replace_Callback_1_(mthis, __arg_0) => replace_Callback_1(mthis, __arg_0);
+
+  static replace_Callback_2(mthis, __arg_0, __arg_1) native "InstallEvent_replace_Callback";
+  replace_Callback_2_(mthis, __arg_0, __arg_1) => replace_Callback_2(mthis, __arg_0, __arg_1);
+
+}
+
+class BlinkInstallPhaseEvent extends BlinkEvent {
+  static final instance = new BlinkInstallPhaseEvent();
+
+  static waitUntil_Callback_0(mthis) native "InstallPhaseEvent_waitUntil_Callback";
+  waitUntil_Callback_0_(mthis) => waitUntil_Callback_0(mthis);
+
+  static waitUntil_Callback_1(mthis, __arg_0) native "InstallPhaseEvent_waitUntil_Callback";
+  waitUntil_Callback_1_(mthis, __arg_0) => waitUntil_Callback_1(mthis, __arg_0);
+
+  static waitUntil_Callback_2(mthis, __arg_0, __arg_1) native "InstallPhaseEvent_waitUntil_Callback";
+  waitUntil_Callback_2_(mthis, __arg_0, __arg_1) => waitUntil_Callback_2(mthis, __arg_0, __arg_1);
+
+  static waitUntil_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "InstallPhaseEvent_waitUntil_Callback";
+  waitUntil_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => waitUntil_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+}
+
+class BlinkJavaScriptCallFrame {
+  static final instance = new BlinkJavaScriptCallFrame();
+
+  static caller_Getter(mthis) native "JavaScriptCallFrame_caller_Getter";
+  caller_Getter_(mthis) => caller_Getter(mthis);
+
+  static column_Getter(mthis) native "JavaScriptCallFrame_column_Getter";
+  column_Getter_(mthis) => column_Getter(mthis);
+
+  static evaluateWithExceptionDetails_Callback_0(mthis) native "JavaScriptCallFrame_evaluateWithExceptionDetails_Callback";
+  evaluateWithExceptionDetails_Callback_0_(mthis) => evaluateWithExceptionDetails_Callback_0(mthis);
+
+  static evaluateWithExceptionDetails_Callback_1(mthis, __arg_0) native "JavaScriptCallFrame_evaluateWithExceptionDetails_Callback";
+  evaluateWithExceptionDetails_Callback_1_(mthis, __arg_0) => evaluateWithExceptionDetails_Callback_1(mthis, __arg_0);
+
+  static evaluateWithExceptionDetails_Callback_2(mthis, __arg_0, __arg_1) native "JavaScriptCallFrame_evaluateWithExceptionDetails_Callback";
+  evaluateWithExceptionDetails_Callback_2_(mthis, __arg_0, __arg_1) => evaluateWithExceptionDetails_Callback_2(mthis, __arg_0, __arg_1);
+
+  static evaluateWithExceptionDetails_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "JavaScriptCallFrame_evaluateWithExceptionDetails_Callback";
+  evaluateWithExceptionDetails_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => evaluateWithExceptionDetails_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static functionName_Getter(mthis) native "JavaScriptCallFrame_functionName_Getter";
+  functionName_Getter_(mthis) => functionName_Getter(mthis);
+
+  static isAtReturn_Getter(mthis) native "JavaScriptCallFrame_isAtReturn_Getter";
+  isAtReturn_Getter_(mthis) => isAtReturn_Getter(mthis);
+
+  static line_Getter(mthis) native "JavaScriptCallFrame_line_Getter";
+  line_Getter_(mthis) => line_Getter(mthis);
+
+  static restart_Callback_0(mthis) native "JavaScriptCallFrame_restart_Callback";
+  restart_Callback_0_(mthis) => restart_Callback_0(mthis);
+
+  static restart_Callback_1(mthis, __arg_0) native "JavaScriptCallFrame_restart_Callback";
+  restart_Callback_1_(mthis, __arg_0) => restart_Callback_1(mthis, __arg_0);
+
+  static restart_Callback_2(mthis, __arg_0, __arg_1) native "JavaScriptCallFrame_restart_Callback";
+  restart_Callback_2_(mthis, __arg_0, __arg_1) => restart_Callback_2(mthis, __arg_0, __arg_1);
+
+  static returnValue_Getter(mthis) native "JavaScriptCallFrame_returnValue_Getter";
+  returnValue_Getter_(mthis) => returnValue_Getter(mthis);
+
+  static scopeChain_Getter(mthis) native "JavaScriptCallFrame_scopeChain_Getter";
+  scopeChain_Getter_(mthis) => scopeChain_Getter(mthis);
+
+  static scopeType_Callback_0(mthis) native "JavaScriptCallFrame_scopeType_Callback";
+  scopeType_Callback_0_(mthis) => scopeType_Callback_0(mthis);
+
+  static scopeType_Callback_1(mthis, __arg_0) native "JavaScriptCallFrame_scopeType_Callback";
+  scopeType_Callback_1_(mthis, __arg_0) => scopeType_Callback_1(mthis, __arg_0);
+
+  static scopeType_Callback_2(mthis, __arg_0, __arg_1) native "JavaScriptCallFrame_scopeType_Callback";
+  scopeType_Callback_2_(mthis, __arg_0, __arg_1) => scopeType_Callback_2(mthis, __arg_0, __arg_1);
+
+  static scopeType_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "JavaScriptCallFrame_scopeType_Callback";
+  scopeType_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => scopeType_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static setVariableValue_Callback_0(mthis) native "JavaScriptCallFrame_setVariableValue_Callback";
+  setVariableValue_Callback_0_(mthis) => setVariableValue_Callback_0(mthis);
+
+  static setVariableValue_Callback_1(mthis, __arg_0) native "JavaScriptCallFrame_setVariableValue_Callback";
+  setVariableValue_Callback_1_(mthis, __arg_0) => setVariableValue_Callback_1(mthis, __arg_0);
+
+  static setVariableValue_Callback_2(mthis, __arg_0, __arg_1) native "JavaScriptCallFrame_setVariableValue_Callback";
+  setVariableValue_Callback_2_(mthis, __arg_0, __arg_1) => setVariableValue_Callback_2(mthis, __arg_0, __arg_1);
+
+  static setVariableValue_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "JavaScriptCallFrame_setVariableValue_Callback";
+  setVariableValue_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => setVariableValue_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static setVariableValue_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "JavaScriptCallFrame_setVariableValue_Callback";
+  setVariableValue_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => setVariableValue_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static setVariableValue_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "JavaScriptCallFrame_setVariableValue_Callback";
+  setVariableValue_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => setVariableValue_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static sourceID_Getter(mthis) native "JavaScriptCallFrame_sourceID_Getter";
+  sourceID_Getter_(mthis) => sourceID_Getter(mthis);
+
+  static stepInPositions_Getter(mthis) native "JavaScriptCallFrame_stepInPositions_Getter";
+  stepInPositions_Getter_(mthis) => stepInPositions_Getter(mthis);
+
+  static thisObject_Getter(mthis) native "JavaScriptCallFrame_thisObject_Getter";
+  thisObject_Getter_(mthis) => thisObject_Getter(mthis);
+
+  static type_Getter(mthis) native "JavaScriptCallFrame_type_Getter";
+  type_Getter_(mthis) => type_Getter(mthis);
+
+}
+
+class BlinkKeyboardEvent extends BlinkUIEvent {
+  static final instance = new BlinkKeyboardEvent();
 
   static altKey_Getter(mthis) native "KeyboardEvent_altKey_Getter";
+  altKey_Getter_(mthis) => altKey_Getter(mthis);
+
+  static constructorCallback_2(__arg_0, __arg_1) native "KeyboardEvent_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
 
   static ctrlKey_Getter(mthis) native "KeyboardEvent_ctrlKey_Getter";
+  ctrlKey_Getter_(mthis) => ctrlKey_Getter(mthis);
+
+  static getModifierState_Callback_0(mthis) native "KeyboardEvent_getModifierState_Callback";
+  getModifierState_Callback_0_(mthis) => getModifierState_Callback_0(mthis);
+
+  static getModifierState_Callback_1(mthis, __arg_0) native "KeyboardEvent_getModifierState_Callback";
+  getModifierState_Callback_1_(mthis, __arg_0) => getModifierState_Callback_1(mthis, __arg_0);
+
+  static getModifierState_Callback_2(mthis, __arg_0, __arg_1) native "KeyboardEvent_getModifierState_Callback";
+  getModifierState_Callback_2_(mthis, __arg_0, __arg_1) => getModifierState_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getModifierState_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "KeyboardEvent_getModifierState_Callback";
+  getModifierState_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getModifierState_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static initKeyboardEvent_Callback_0(mthis) native "KeyboardEvent_initKeyboardEvent_Callback";
+  initKeyboardEvent_Callback_0_(mthis) => initKeyboardEvent_Callback_0(mthis);
+
+  static initKeyboardEvent_Callback_1(mthis, __arg_0) native "KeyboardEvent_initKeyboardEvent_Callback";
+  initKeyboardEvent_Callback_1_(mthis, __arg_0) => initKeyboardEvent_Callback_1(mthis, __arg_0);
+
+  static initKeyboardEvent_Callback_10(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9) native "KeyboardEvent_initKeyboardEvent_Callback";
+  initKeyboardEvent_Callback_10_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9) => initKeyboardEvent_Callback_10(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9);
+
+  static initKeyboardEvent_Callback_11(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10) native "KeyboardEvent_initKeyboardEvent_Callback";
+  initKeyboardEvent_Callback_11_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10) => initKeyboardEvent_Callback_11(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10);
+
+  static initKeyboardEvent_Callback_12(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11) native "KeyboardEvent_initKeyboardEvent_Callback";
+  initKeyboardEvent_Callback_12_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11) => initKeyboardEvent_Callback_12(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11);
+
+  static initKeyboardEvent_Callback_2(mthis, __arg_0, __arg_1) native "KeyboardEvent_initKeyboardEvent_Callback";
+  initKeyboardEvent_Callback_2_(mthis, __arg_0, __arg_1) => initKeyboardEvent_Callback_2(mthis, __arg_0, __arg_1);
+
+  static initKeyboardEvent_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "KeyboardEvent_initKeyboardEvent_Callback";
+  initKeyboardEvent_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => initKeyboardEvent_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static initKeyboardEvent_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "KeyboardEvent_initKeyboardEvent_Callback";
+  initKeyboardEvent_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => initKeyboardEvent_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static initKeyboardEvent_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "KeyboardEvent_initKeyboardEvent_Callback";
+  initKeyboardEvent_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => initKeyboardEvent_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static initKeyboardEvent_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "KeyboardEvent_initKeyboardEvent_Callback";
+  initKeyboardEvent_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => initKeyboardEvent_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static initKeyboardEvent_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) native "KeyboardEvent_initKeyboardEvent_Callback";
+  initKeyboardEvent_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => initKeyboardEvent_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6);
+
+  static initKeyboardEvent_Callback_8(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) native "KeyboardEvent_initKeyboardEvent_Callback";
+  initKeyboardEvent_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => initKeyboardEvent_Callback_8(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7);
+
+  static initKeyboardEvent_Callback_9(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) native "KeyboardEvent_initKeyboardEvent_Callback";
+  initKeyboardEvent_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => initKeyboardEvent_Callback_9(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8);
 
   static keyIdentifier_Getter(mthis) native "KeyboardEvent_keyIdentifier_Getter";
+  keyIdentifier_Getter_(mthis) => keyIdentifier_Getter(mthis);
 
   static keyLocation_Getter(mthis) native "KeyboardEvent_keyLocation_Getter";
+  keyLocation_Getter_(mthis) => keyLocation_Getter(mthis);
 
   static location_Getter(mthis) native "KeyboardEvent_location_Getter";
+  location_Getter_(mthis) => location_Getter(mthis);
 
   static metaKey_Getter(mthis) native "KeyboardEvent_metaKey_Getter";
+  metaKey_Getter_(mthis) => metaKey_Getter(mthis);
 
   static repeat_Getter(mthis) native "KeyboardEvent_repeat_Getter";
+  repeat_Getter_(mthis) => repeat_Getter(mthis);
 
   static shiftKey_Getter(mthis) native "KeyboardEvent_shiftKey_Getter";
+  shiftKey_Getter_(mthis) => shiftKey_Getter(mthis);
 
-  static getModifierState_Callback_1(mthis, keyArgument) native "KeyboardEvent_getModifierState_Callback";
-
-  static initKeyboardEvent_Callback_10(mthis, type, canBubble, cancelable, view, keyIdentifier, location, ctrlKey, altKey, shiftKey, metaKey) native "KeyboardEvent_initKeyboardEvent_Callback";
 }
 
-class BlinkLocalCredential {
-  static constructorCallback_4(id, name, avatarURL, password) native "LocalCredential_constructorCallback";
+class BlinkLocalCredential extends BlinkCredential {
+  static final instance = new BlinkLocalCredential();
+
+  static constructorCallback_2(__arg_0, __arg_1) native "LocalCredential_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+
+  static constructorCallback_3(__arg_0, __arg_1, __arg_2) native "LocalCredential_constructorCallback";
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => constructorCallback_3(__arg_0, __arg_1, __arg_2);
+
+  static constructorCallback_4(__arg_0, __arg_1, __arg_2, __arg_3) native "LocalCredential_constructorCallback";
+  constructorCallback_4_(__arg_0, __arg_1, __arg_2, __arg_3) => constructorCallback_4(__arg_0, __arg_1, __arg_2, __arg_3);
+
+  static constructorCallback_5(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "LocalCredential_constructorCallback";
+  constructorCallback_5_(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => constructorCallback_5(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static constructorCallback_6(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "LocalCredential_constructorCallback";
+  constructorCallback_6_(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => constructorCallback_6(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
 
   static password_Getter(mthis) native "LocalCredential_password_Getter";
+  password_Getter_(mthis) => password_Getter(mthis);
+
 }
 
 class BlinkLocation {
+  static final instance = new BlinkLocation();
+
   static ancestorOrigins_Getter(mthis) native "Location_ancestorOrigins_Getter";
+  ancestorOrigins_Getter_(mthis) => ancestorOrigins_Getter(mthis);
+
+  static assign_Callback_0(mthis) native "Location_assign_Callback";
+  assign_Callback_0_(mthis) => assign_Callback_0(mthis);
+
+  static assign_Callback_1(mthis, __arg_0) native "Location_assign_Callback";
+  assign_Callback_1_(mthis, __arg_0) => assign_Callback_1(mthis, __arg_0);
+
+  static assign_Callback_2(mthis, __arg_0, __arg_1) native "Location_assign_Callback";
+  assign_Callback_2_(mthis, __arg_0, __arg_1) => assign_Callback_2(mthis, __arg_0, __arg_1);
+
+  static assign_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Location_assign_Callback";
+  assign_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => assign_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
   static hash_Getter(mthis) native "Location_hash_Getter";
+  hash_Getter_(mthis) => hash_Getter(mthis);
 
-  static hash_Setter(mthis, value) native "Location_hash_Setter";
+  static hash_Setter(mthis, __arg_0) native "Location_hash_Setter";
+  hash_Setter_(mthis, __arg_0) => hash_Setter(mthis, __arg_0);
 
   static host_Getter(mthis) native "Location_host_Getter";
+  host_Getter_(mthis) => host_Getter(mthis);
 
-  static host_Setter(mthis, value) native "Location_host_Setter";
+  static host_Setter(mthis, __arg_0) native "Location_host_Setter";
+  host_Setter_(mthis, __arg_0) => host_Setter(mthis, __arg_0);
 
   static hostname_Getter(mthis) native "Location_hostname_Getter";
+  hostname_Getter_(mthis) => hostname_Getter(mthis);
 
-  static hostname_Setter(mthis, value) native "Location_hostname_Setter";
+  static hostname_Setter(mthis, __arg_0) native "Location_hostname_Setter";
+  hostname_Setter_(mthis, __arg_0) => hostname_Setter(mthis, __arg_0);
 
   static href_Getter(mthis) native "Location_href_Getter";
+  href_Getter_(mthis) => href_Getter(mthis);
 
-  static href_Setter(mthis, value) native "Location_href_Setter";
+  static href_Setter(mthis, __arg_0) native "Location_href_Setter";
+  href_Setter_(mthis, __arg_0) => href_Setter(mthis, __arg_0);
 
   static origin_Getter(mthis) native "Location_origin_Getter";
+  origin_Getter_(mthis) => origin_Getter(mthis);
 
   static pathname_Getter(mthis) native "Location_pathname_Getter";
+  pathname_Getter_(mthis) => pathname_Getter(mthis);
 
-  static pathname_Setter(mthis, value) native "Location_pathname_Setter";
+  static pathname_Setter(mthis, __arg_0) native "Location_pathname_Setter";
+  pathname_Setter_(mthis, __arg_0) => pathname_Setter(mthis, __arg_0);
 
   static port_Getter(mthis) native "Location_port_Getter";
+  port_Getter_(mthis) => port_Getter(mthis);
 
-  static port_Setter(mthis, value) native "Location_port_Setter";
+  static port_Setter(mthis, __arg_0) native "Location_port_Setter";
+  port_Setter_(mthis, __arg_0) => port_Setter(mthis, __arg_0);
 
   static protocol_Getter(mthis) native "Location_protocol_Getter";
+  protocol_Getter_(mthis) => protocol_Getter(mthis);
 
-  static protocol_Setter(mthis, value) native "Location_protocol_Setter";
+  static protocol_Setter(mthis, __arg_0) native "Location_protocol_Setter";
+  protocol_Setter_(mthis, __arg_0) => protocol_Setter(mthis, __arg_0);
+
+  static reload_Callback_0(mthis) native "Location_reload_Callback";
+  reload_Callback_0_(mthis) => reload_Callback_0(mthis);
+
+  static reload_Callback_1(mthis, __arg_0) native "Location_reload_Callback";
+  reload_Callback_1_(mthis, __arg_0) => reload_Callback_1(mthis, __arg_0);
+
+  static reload_Callback_2(mthis, __arg_0, __arg_1) native "Location_reload_Callback";
+  reload_Callback_2_(mthis, __arg_0, __arg_1) => reload_Callback_2(mthis, __arg_0, __arg_1);
+
+  static replace_Callback_0(mthis) native "Location_replace_Callback";
+  replace_Callback_0_(mthis) => replace_Callback_0(mthis);
+
+  static replace_Callback_1(mthis, __arg_0) native "Location_replace_Callback";
+  replace_Callback_1_(mthis, __arg_0) => replace_Callback_1(mthis, __arg_0);
+
+  static replace_Callback_2(mthis, __arg_0, __arg_1) native "Location_replace_Callback";
+  replace_Callback_2_(mthis, __arg_0, __arg_1) => replace_Callback_2(mthis, __arg_0, __arg_1);
+
+  static replace_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Location_replace_Callback";
+  replace_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => replace_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
   static search_Getter(mthis) native "Location_search_Getter";
+  search_Getter_(mthis) => search_Getter(mthis);
 
-  static search_Setter(mthis, value) native "Location_search_Setter";
+  static search_Setter(mthis, __arg_0) native "Location_search_Setter";
+  search_Setter_(mthis, __arg_0) => search_Setter(mthis, __arg_0);
 
-  static assign_Callback_1(mthis, url) native "Location_assign_Callback";
+  static toString_Callback_0(mthis) native "Location_toString_Callback";
+  toString_Callback_0_(mthis) => toString_Callback_0(mthis);
 
-  static reload_Callback(mthis) native "Location_reload_Callback";
+  static toString_Callback_1(mthis, __arg_0) native "Location_toString_Callback";
+  toString_Callback_1_(mthis, __arg_0) => toString_Callback_1(mthis, __arg_0);
 
-  static replace_Callback_1(mthis, url) native "Location_replace_Callback";
+  static toString_Callback_2(mthis, __arg_0, __arg_1) native "Location_toString_Callback";
+  toString_Callback_2_(mthis, __arg_0, __arg_1) => toString_Callback_2(mthis, __arg_0, __arg_1);
 
-  static toString_Callback(mthis) native "Location_toString_Callback";
 }
 
-class BlinkMIDIAccess {
+class BlinkMIDIAccess extends BlinkEventTarget {
+  static final instance = new BlinkMIDIAccess();
+
+  static inputs_Callback_0(mthis) native "MIDIAccess_inputs_Callback";
+  inputs_Callback_0_(mthis) => inputs_Callback_0(mthis);
+
+  static inputs_Callback_1(mthis, __arg_0) native "MIDIAccess_inputs_Callback";
+  inputs_Callback_1_(mthis, __arg_0) => inputs_Callback_1(mthis, __arg_0);
+
+  static inputs_Callback_2(mthis, __arg_0, __arg_1) native "MIDIAccess_inputs_Callback";
+  inputs_Callback_2_(mthis, __arg_0, __arg_1) => inputs_Callback_2(mthis, __arg_0, __arg_1);
+
+  static onconnect_Getter(mthis) native "MIDIAccess_onconnect_Getter";
+  onconnect_Getter_(mthis) => onconnect_Getter(mthis);
+
+  static onconnect_Setter(mthis, __arg_0) native "MIDIAccess_onconnect_Setter";
+  onconnect_Setter_(mthis, __arg_0) => onconnect_Setter(mthis, __arg_0);
+
+  static ondisconnect_Getter(mthis) native "MIDIAccess_ondisconnect_Getter";
+  ondisconnect_Getter_(mthis) => ondisconnect_Getter(mthis);
+
+  static ondisconnect_Setter(mthis, __arg_0) native "MIDIAccess_ondisconnect_Setter";
+  ondisconnect_Setter_(mthis, __arg_0) => ondisconnect_Setter(mthis, __arg_0);
+
+  static outputs_Callback_0(mthis) native "MIDIAccess_outputs_Callback";
+  outputs_Callback_0_(mthis) => outputs_Callback_0(mthis);
+
+  static outputs_Callback_1(mthis, __arg_0) native "MIDIAccess_outputs_Callback";
+  outputs_Callback_1_(mthis, __arg_0) => outputs_Callback_1(mthis, __arg_0);
+
+  static outputs_Callback_2(mthis, __arg_0, __arg_1) native "MIDIAccess_outputs_Callback";
+  outputs_Callback_2_(mthis, __arg_0, __arg_1) => outputs_Callback_2(mthis, __arg_0, __arg_1);
+
   static sysexEnabled_Getter(mthis) native "MIDIAccess_sysexEnabled_Getter";
+  sysexEnabled_Getter_(mthis) => sysexEnabled_Getter(mthis);
 
-  static inputs_Callback(mthis) native "MIDIAccess_inputs_Callback";
-
-  static outputs_Callback(mthis) native "MIDIAccess_outputs_Callback";
 }
 
-class BlinkMIDIConnectionEvent {
-  static constructorCallback(type, options) native "MIDIConnectionEvent_constructorCallback";
+class BlinkMIDIConnectionEvent extends BlinkEvent {
+  static final instance = new BlinkMIDIConnectionEvent();
+
+  static constructorCallback_2(__arg_0, __arg_1) native "MIDIConnectionEvent_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
 
   static port_Getter(mthis) native "MIDIConnectionEvent_port_Getter";
+  port_Getter_(mthis) => port_Getter(mthis);
+
 }
 
-class BlinkMIDIPort {
-  static id_Getter(mthis) native "MIDIPort_id_Getter";
+class BlinkMIDIInput extends BlinkMIDIPort {
+  static final instance = new BlinkMIDIInput();
 
-  static manufacturer_Getter(mthis) native "MIDIPort_manufacturer_Getter";
+  static onmidimessage_Getter(mthis) native "MIDIInput_onmidimessage_Getter";
+  onmidimessage_Getter_(mthis) => onmidimessage_Getter(mthis);
 
-  static name_Getter(mthis) native "MIDIPort_name_Getter";
+  static onmidimessage_Setter(mthis, __arg_0) native "MIDIInput_onmidimessage_Setter";
+  onmidimessage_Setter_(mthis, __arg_0) => onmidimessage_Setter(mthis, __arg_0);
 
-  static type_Getter(mthis) native "MIDIPort_type_Getter";
-
-  static version_Getter(mthis) native "MIDIPort_version_Getter";
 }
 
-class BlinkMIDIInput {}
+class BlinkMIDIMessageEvent extends BlinkEvent {
+  static final instance = new BlinkMIDIMessageEvent();
 
-class BlinkMIDIMessageEvent {
-  static constructorCallback(type, options) native "MIDIMessageEvent_constructorCallback";
+  static constructorCallback_2(__arg_0, __arg_1) native "MIDIMessageEvent_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
 
   static data_Getter(mthis) native "MIDIMessageEvent_data_Getter";
+  data_Getter_(mthis) => data_Getter(mthis);
 
   static receivedTime_Getter(mthis) native "MIDIMessageEvent_receivedTime_Getter";
+  receivedTime_Getter_(mthis) => receivedTime_Getter(mthis);
+
 }
 
-class BlinkMIDIOutput {
-  static send_Callback_2(mthis, data, timestamp) native "MIDIOutput_send_Callback";
+class BlinkMIDIOutput extends BlinkMIDIPort {
+  static final instance = new BlinkMIDIOutput();
 
-  static send_Callback_1(mthis, data) native "MIDIOutput_send_Callback";
+  static send_Callback_0(mthis) native "MIDIOutput_send_Callback";
+  send_Callback_0_(mthis) => send_Callback_0(mthis);
+
+  static send_Callback_1(mthis, __arg_0) native "MIDIOutput_send_Callback";
+  send_Callback_1_(mthis, __arg_0) => send_Callback_1(mthis, __arg_0);
+
+  static send_Callback_2(mthis, __arg_0, __arg_1) native "MIDIOutput_send_Callback";
+  send_Callback_2_(mthis, __arg_0, __arg_1) => send_Callback_2(mthis, __arg_0, __arg_1);
+
+  static send_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "MIDIOutput_send_Callback";
+  send_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => send_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static send_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "MIDIOutput_send_Callback";
+  send_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => send_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
 }
 
-class BlinkMediaController {
-  static constructorCallback() native "MediaController_constructorCallback";
+class BlinkMIDIPort extends BlinkEventTarget {
+  static final instance = new BlinkMIDIPort();
+
+  static id_Getter(mthis) native "MIDIPort_id_Getter";
+  id_Getter_(mthis) => id_Getter(mthis);
+
+  static manufacturer_Getter(mthis) native "MIDIPort_manufacturer_Getter";
+  manufacturer_Getter_(mthis) => manufacturer_Getter(mthis);
+
+  static name_Getter(mthis) native "MIDIPort_name_Getter";
+  name_Getter_(mthis) => name_Getter(mthis);
+
+  static ondisconnect_Getter(mthis) native "MIDIPort_ondisconnect_Getter";
+  ondisconnect_Getter_(mthis) => ondisconnect_Getter(mthis);
+
+  static ondisconnect_Setter(mthis, __arg_0) native "MIDIPort_ondisconnect_Setter";
+  ondisconnect_Setter_(mthis, __arg_0) => ondisconnect_Setter(mthis, __arg_0);
+
+  static type_Getter(mthis) native "MIDIPort_type_Getter";
+  type_Getter_(mthis) => type_Getter(mthis);
+
+  static version_Getter(mthis) native "MIDIPort_version_Getter";
+  version_Getter_(mthis) => version_Getter(mthis);
+
+}
+
+class BlinkMediaController extends BlinkEventTarget {
+  static final instance = new BlinkMediaController();
 
   static buffered_Getter(mthis) native "MediaController_buffered_Getter";
+  buffered_Getter_(mthis) => buffered_Getter(mthis);
+
+  static constructorCallback_0() native "MediaController_constructorCallback";
+  constructorCallback_0_() => constructorCallback_0();
+
+  static constructorCallback_1(__arg_0) native "MediaController_constructorCallback";
+  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+
+  static constructorCallback_2(__arg_0, __arg_1) native "MediaController_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
 
   static currentTime_Getter(mthis) native "MediaController_currentTime_Getter";
+  currentTime_Getter_(mthis) => currentTime_Getter(mthis);
 
-  static currentTime_Setter(mthis, value) native "MediaController_currentTime_Setter";
+  static currentTime_Setter(mthis, __arg_0) native "MediaController_currentTime_Setter";
+  currentTime_Setter_(mthis, __arg_0) => currentTime_Setter(mthis, __arg_0);
 
   static defaultPlaybackRate_Getter(mthis) native "MediaController_defaultPlaybackRate_Getter";
+  defaultPlaybackRate_Getter_(mthis) => defaultPlaybackRate_Getter(mthis);
 
-  static defaultPlaybackRate_Setter(mthis, value) native "MediaController_defaultPlaybackRate_Setter";
+  static defaultPlaybackRate_Setter(mthis, __arg_0) native "MediaController_defaultPlaybackRate_Setter";
+  defaultPlaybackRate_Setter_(mthis, __arg_0) => defaultPlaybackRate_Setter(mthis, __arg_0);
 
   static duration_Getter(mthis) native "MediaController_duration_Getter";
+  duration_Getter_(mthis) => duration_Getter(mthis);
 
   static muted_Getter(mthis) native "MediaController_muted_Getter";
+  muted_Getter_(mthis) => muted_Getter(mthis);
 
-  static muted_Setter(mthis, value) native "MediaController_muted_Setter";
+  static muted_Setter(mthis, __arg_0) native "MediaController_muted_Setter";
+  muted_Setter_(mthis, __arg_0) => muted_Setter(mthis, __arg_0);
+
+  static pause_Callback_0(mthis) native "MediaController_pause_Callback";
+  pause_Callback_0_(mthis) => pause_Callback_0(mthis);
+
+  static pause_Callback_1(mthis, __arg_0) native "MediaController_pause_Callback";
+  pause_Callback_1_(mthis, __arg_0) => pause_Callback_1(mthis, __arg_0);
+
+  static pause_Callback_2(mthis, __arg_0, __arg_1) native "MediaController_pause_Callback";
+  pause_Callback_2_(mthis, __arg_0, __arg_1) => pause_Callback_2(mthis, __arg_0, __arg_1);
 
   static paused_Getter(mthis) native "MediaController_paused_Getter";
+  paused_Getter_(mthis) => paused_Getter(mthis);
+
+  static play_Callback_0(mthis) native "MediaController_play_Callback";
+  play_Callback_0_(mthis) => play_Callback_0(mthis);
+
+  static play_Callback_1(mthis, __arg_0) native "MediaController_play_Callback";
+  play_Callback_1_(mthis, __arg_0) => play_Callback_1(mthis, __arg_0);
+
+  static play_Callback_2(mthis, __arg_0, __arg_1) native "MediaController_play_Callback";
+  play_Callback_2_(mthis, __arg_0, __arg_1) => play_Callback_2(mthis, __arg_0, __arg_1);
 
   static playbackRate_Getter(mthis) native "MediaController_playbackRate_Getter";
+  playbackRate_Getter_(mthis) => playbackRate_Getter(mthis);
 
-  static playbackRate_Setter(mthis, value) native "MediaController_playbackRate_Setter";
+  static playbackRate_Setter(mthis, __arg_0) native "MediaController_playbackRate_Setter";
+  playbackRate_Setter_(mthis, __arg_0) => playbackRate_Setter(mthis, __arg_0);
 
   static playbackState_Getter(mthis) native "MediaController_playbackState_Getter";
+  playbackState_Getter_(mthis) => playbackState_Getter(mthis);
 
   static played_Getter(mthis) native "MediaController_played_Getter";
+  played_Getter_(mthis) => played_Getter(mthis);
 
   static seekable_Getter(mthis) native "MediaController_seekable_Getter";
+  seekable_Getter_(mthis) => seekable_Getter(mthis);
+
+  static unpause_Callback_0(mthis) native "MediaController_unpause_Callback";
+  unpause_Callback_0_(mthis) => unpause_Callback_0(mthis);
+
+  static unpause_Callback_1(mthis, __arg_0) native "MediaController_unpause_Callback";
+  unpause_Callback_1_(mthis, __arg_0) => unpause_Callback_1(mthis, __arg_0);
+
+  static unpause_Callback_2(mthis, __arg_0, __arg_1) native "MediaController_unpause_Callback";
+  unpause_Callback_2_(mthis, __arg_0, __arg_1) => unpause_Callback_2(mthis, __arg_0, __arg_1);
 
   static volume_Getter(mthis) native "MediaController_volume_Getter";
+  volume_Getter_(mthis) => volume_Getter(mthis);
 
-  static volume_Setter(mthis, value) native "MediaController_volume_Setter";
+  static volume_Setter(mthis, __arg_0) native "MediaController_volume_Setter";
+  volume_Setter_(mthis, __arg_0) => volume_Setter(mthis, __arg_0);
 
-  static pause_Callback(mthis) native "MediaController_pause_Callback";
-
-  static play_Callback(mthis) native "MediaController_play_Callback";
-
-  static unpause_Callback(mthis) native "MediaController_unpause_Callback";
 }
 
 class BlinkMediaDeviceInfo {
+  static final instance = new BlinkMediaDeviceInfo();
+
   static deviceId_Getter(mthis) native "MediaDeviceInfo_deviceId_Getter";
+  deviceId_Getter_(mthis) => deviceId_Getter(mthis);
 
   static groupId_Getter(mthis) native "MediaDeviceInfo_groupId_Getter";
+  groupId_Getter_(mthis) => groupId_Getter(mthis);
 
   static kind_Getter(mthis) native "MediaDeviceInfo_kind_Getter";
+  kind_Getter_(mthis) => kind_Getter(mthis);
 
   static label_Getter(mthis) native "MediaDeviceInfo_label_Getter";
+  label_Getter_(mthis) => label_Getter(mthis);
+
 }
 
-class BlinkMediaElementAudioSourceNode {
+class BlinkMediaElementAudioSourceNode extends BlinkAudioSourceNode {
+  static final instance = new BlinkMediaElementAudioSourceNode();
+
   static mediaElement_Getter(mthis) native "MediaElementAudioSourceNode_mediaElement_Getter";
+  mediaElement_Getter_(mthis) => mediaElement_Getter(mthis);
+
 }
 
 class BlinkMediaError {
+  static final instance = new BlinkMediaError();
+
   static code_Getter(mthis) native "MediaError_code_Getter";
+  code_Getter_(mthis) => code_Getter(mthis);
+
 }
 
 class BlinkMediaKeyError {
+  static final instance = new BlinkMediaKeyError();
+
   static code_Getter(mthis) native "MediaKeyError_code_Getter";
+  code_Getter_(mthis) => code_Getter(mthis);
 
   static systemCode_Getter(mthis) native "MediaKeyError_systemCode_Getter";
+  systemCode_Getter_(mthis) => systemCode_Getter(mthis);
+
 }
 
-class BlinkMediaKeyEvent {
-  static constructorCallback(type, options) native "MediaKeyEvent_constructorCallback";
+class BlinkMediaKeyEvent extends BlinkEvent {
+  static final instance = new BlinkMediaKeyEvent();
+
+  static constructorCallback_2(__arg_0, __arg_1) native "MediaKeyEvent_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
 
   static defaultURL_Getter(mthis) native "MediaKeyEvent_defaultURL_Getter";
+  defaultURL_Getter_(mthis) => defaultURL_Getter(mthis);
 
   static errorCode_Getter(mthis) native "MediaKeyEvent_errorCode_Getter";
+  errorCode_Getter_(mthis) => errorCode_Getter(mthis);
 
   static initData_Getter(mthis) native "MediaKeyEvent_initData_Getter";
+  initData_Getter_(mthis) => initData_Getter(mthis);
 
   static keySystem_Getter(mthis) native "MediaKeyEvent_keySystem_Getter";
+  keySystem_Getter_(mthis) => keySystem_Getter(mthis);
 
   static message_Getter(mthis) native "MediaKeyEvent_message_Getter";
+  message_Getter_(mthis) => message_Getter(mthis);
 
   static sessionId_Getter(mthis) native "MediaKeyEvent_sessionId_Getter";
+  sessionId_Getter_(mthis) => sessionId_Getter(mthis);
 
   static systemCode_Getter(mthis) native "MediaKeyEvent_systemCode_Getter";
+  systemCode_Getter_(mthis) => systemCode_Getter(mthis);
+
 }
 
-class BlinkMediaKeyMessageEvent {
-  static constructorCallback(type, options) native "MediaKeyMessageEvent_constructorCallback";
+class BlinkMediaKeyMessageEvent extends BlinkEvent {
+  static final instance = new BlinkMediaKeyMessageEvent();
+
+  static constructorCallback_2(__arg_0, __arg_1) native "MediaKeyMessageEvent_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
 
   static destinationURL_Getter(mthis) native "MediaKeyMessageEvent_destinationURL_Getter";
+  destinationURL_Getter_(mthis) => destinationURL_Getter(mthis);
 
   static message_Getter(mthis) native "MediaKeyMessageEvent_message_Getter";
+  message_Getter_(mthis) => message_Getter(mthis);
+
 }
 
-class BlinkMediaKeyNeededEvent {
-  static constructorCallback(type, options) native "MediaKeyNeededEvent_constructorCallback";
+class BlinkMediaKeyNeededEvent extends BlinkEvent {
+  static final instance = new BlinkMediaKeyNeededEvent();
+
+  static constructorCallback_2(__arg_0, __arg_1) native "MediaKeyNeededEvent_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
 
   static contentType_Getter(mthis) native "MediaKeyNeededEvent_contentType_Getter";
+  contentType_Getter_(mthis) => contentType_Getter(mthis);
 
   static initData_Getter(mthis) native "MediaKeyNeededEvent_initData_Getter";
+  initData_Getter_(mthis) => initData_Getter(mthis);
+
 }
 
-class BlinkMediaKeySession {
+class BlinkMediaKeySession extends BlinkEventTarget {
+  static final instance = new BlinkMediaKeySession();
+
   static closed_Getter(mthis) native "MediaKeySession_closed_Getter";
+  closed_Getter_(mthis) => closed_Getter(mthis);
 
   static error_Getter(mthis) native "MediaKeySession_error_Getter";
+  error_Getter_(mthis) => error_Getter(mthis);
 
   static keySystem_Getter(mthis) native "MediaKeySession_keySystem_Getter";
+  keySystem_Getter_(mthis) => keySystem_Getter(mthis);
+
+  static release_Callback_0(mthis) native "MediaKeySession_release_Callback";
+  release_Callback_0_(mthis) => release_Callback_0(mthis);
+
+  static release_Callback_1(mthis, __arg_0) native "MediaKeySession_release_Callback";
+  release_Callback_1_(mthis, __arg_0) => release_Callback_1(mthis, __arg_0);
+
+  static release_Callback_2(mthis, __arg_0, __arg_1) native "MediaKeySession_release_Callback";
+  release_Callback_2_(mthis, __arg_0, __arg_1) => release_Callback_2(mthis, __arg_0, __arg_1);
 
   static sessionId_Getter(mthis) native "MediaKeySession_sessionId_Getter";
+  sessionId_Getter_(mthis) => sessionId_Getter(mthis);
 
-  static release_Callback(mthis) native "MediaKeySession_release_Callback";
+  static update_Callback_0(mthis) native "MediaKeySession_update_Callback";
+  update_Callback_0_(mthis) => update_Callback_0(mthis);
 
-  static update_Callback_1(mthis, response) native "MediaKeySession_update_Callback";
+  static update_Callback_1(mthis, __arg_0) native "MediaKeySession_update_Callback";
+  update_Callback_1_(mthis, __arg_0) => update_Callback_1(mthis, __arg_0);
+
+  static update_Callback_2(mthis, __arg_0, __arg_1) native "MediaKeySession_update_Callback";
+  update_Callback_2_(mthis, __arg_0, __arg_1) => update_Callback_2(mthis, __arg_0, __arg_1);
+
+  static update_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "MediaKeySession_update_Callback";
+  update_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => update_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
 }
 
 class BlinkMediaKeys {
+  static final instance = new BlinkMediaKeys();
+
+  static createSession_Callback_0(mthis) native "MediaKeys_createSession_Callback";
+  createSession_Callback_0_(mthis) => createSession_Callback_0(mthis);
+
+  static createSession_Callback_1(mthis, __arg_0) native "MediaKeys_createSession_Callback";
+  createSession_Callback_1_(mthis, __arg_0) => createSession_Callback_1(mthis, __arg_0);
+
+  static createSession_Callback_2(mthis, __arg_0, __arg_1) native "MediaKeys_createSession_Callback";
+  createSession_Callback_2_(mthis, __arg_0, __arg_1) => createSession_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createSession_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "MediaKeys_createSession_Callback";
+  createSession_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => createSession_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static createSession_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "MediaKeys_createSession_Callback";
+  createSession_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => createSession_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static createSession_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "MediaKeys_createSession_Callback";
+  createSession_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => createSession_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static create_Callback_0() native "MediaKeys_create_Callback";
+  create_Callback_0_() => create_Callback_0();
+
+  static create_Callback_1(__arg_0) native "MediaKeys_create_Callback";
+  create_Callback_1_(__arg_0) => create_Callback_1(__arg_0);
+
+  static create_Callback_2(__arg_0, __arg_1) native "MediaKeys_create_Callback";
+  create_Callback_2_(__arg_0, __arg_1) => create_Callback_2(__arg_0, __arg_1);
+
+  static create_Callback_3(__arg_0, __arg_1, __arg_2) native "MediaKeys_create_Callback";
+  create_Callback_3_(__arg_0, __arg_1, __arg_2) => create_Callback_3(__arg_0, __arg_1, __arg_2);
+
+  static isTypeSupported_Callback_0() native "MediaKeys_isTypeSupported_Callback";
+  isTypeSupported_Callback_0_() => isTypeSupported_Callback_0();
+
+  static isTypeSupported_Callback_1(__arg_0) native "MediaKeys_isTypeSupported_Callback";
+  isTypeSupported_Callback_1_(__arg_0) => isTypeSupported_Callback_1(__arg_0);
+
+  static isTypeSupported_Callback_2(__arg_0, __arg_1) native "MediaKeys_isTypeSupported_Callback";
+  isTypeSupported_Callback_2_(__arg_0, __arg_1) => isTypeSupported_Callback_2(__arg_0, __arg_1);
+
+  static isTypeSupported_Callback_3(__arg_0, __arg_1, __arg_2) native "MediaKeys_isTypeSupported_Callback";
+  isTypeSupported_Callback_3_(__arg_0, __arg_1, __arg_2) => isTypeSupported_Callback_3(__arg_0, __arg_1, __arg_2);
+
+  static isTypeSupported_Callback_4(__arg_0, __arg_1, __arg_2, __arg_3) native "MediaKeys_isTypeSupported_Callback";
+  isTypeSupported_Callback_4_(__arg_0, __arg_1, __arg_2, __arg_3) => isTypeSupported_Callback_4(__arg_0, __arg_1, __arg_2, __arg_3);
+
   static keySystem_Getter(mthis) native "MediaKeys_keySystem_Getter";
+  keySystem_Getter_(mthis) => keySystem_Getter(mthis);
 
-  static create_Callback_1(keySystem) native "MediaKeys_create_Callback";
-
-  static createSession_Callback_2(mthis, initDataType, initData) native "MediaKeys_createSession_Callback";
-
-  static createSession_Callback_3(mthis, initDataType, initData, sessionType) native "MediaKeys_createSession_Callback";
-
-  static isTypeSupported_Callback_2(keySystem, contentType) native "MediaKeys_isTypeSupported_Callback";
 }
 
 class BlinkMediaList {
+  static final instance = new BlinkMediaList();
+
+  static $__getter___Callback_1(mthis, __arg_0) native "MediaList___getter___Callback";
+  $__getter___Callback_1_(mthis, __arg_0) => $__getter___Callback_1(mthis, __arg_0);
+
+  static appendMedium_Callback_0(mthis) native "MediaList_appendMedium_Callback";
+  appendMedium_Callback_0_(mthis) => appendMedium_Callback_0(mthis);
+
+  static appendMedium_Callback_1(mthis, __arg_0) native "MediaList_appendMedium_Callback";
+  appendMedium_Callback_1_(mthis, __arg_0) => appendMedium_Callback_1(mthis, __arg_0);
+
+  static appendMedium_Callback_2(mthis, __arg_0, __arg_1) native "MediaList_appendMedium_Callback";
+  appendMedium_Callback_2_(mthis, __arg_0, __arg_1) => appendMedium_Callback_2(mthis, __arg_0, __arg_1);
+
+  static appendMedium_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "MediaList_appendMedium_Callback";
+  appendMedium_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => appendMedium_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static deleteMedium_Callback_0(mthis) native "MediaList_deleteMedium_Callback";
+  deleteMedium_Callback_0_(mthis) => deleteMedium_Callback_0(mthis);
+
+  static deleteMedium_Callback_1(mthis, __arg_0) native "MediaList_deleteMedium_Callback";
+  deleteMedium_Callback_1_(mthis, __arg_0) => deleteMedium_Callback_1(mthis, __arg_0);
+
+  static deleteMedium_Callback_2(mthis, __arg_0, __arg_1) native "MediaList_deleteMedium_Callback";
+  deleteMedium_Callback_2_(mthis, __arg_0, __arg_1) => deleteMedium_Callback_2(mthis, __arg_0, __arg_1);
+
+  static deleteMedium_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "MediaList_deleteMedium_Callback";
+  deleteMedium_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => deleteMedium_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static item_Callback_0(mthis) native "MediaList_item_Callback";
+  item_Callback_0_(mthis) => item_Callback_0(mthis);
+
+  static item_Callback_1(mthis, __arg_0) native "MediaList_item_Callback";
+  item_Callback_1_(mthis, __arg_0) => item_Callback_1(mthis, __arg_0);
+
+  static item_Callback_2(mthis, __arg_0, __arg_1) native "MediaList_item_Callback";
+  item_Callback_2_(mthis, __arg_0, __arg_1) => item_Callback_2(mthis, __arg_0, __arg_1);
+
+  static item_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "MediaList_item_Callback";
+  item_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => item_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
   static length_Getter(mthis) native "MediaList_length_Getter";
+  length_Getter_(mthis) => length_Getter(mthis);
 
   static mediaText_Getter(mthis) native "MediaList_mediaText_Getter";
+  mediaText_Getter_(mthis) => mediaText_Getter(mthis);
 
-  static mediaText_Setter(mthis, value) native "MediaList_mediaText_Setter";
+  static mediaText_Setter(mthis, __arg_0) native "MediaList_mediaText_Setter";
+  mediaText_Setter_(mthis, __arg_0) => mediaText_Setter(mthis, __arg_0);
 
-  static appendMedium_Callback_1(mthis, newMedium) native "MediaList_appendMedium_Callback";
-
-  static deleteMedium_Callback_1(mthis, oldMedium) native "MediaList_deleteMedium_Callback";
-
-  static item_Callback_1(mthis, index) native "MediaList_item_Callback";
 }
 
 class BlinkMediaQueryList {
+  static final instance = new BlinkMediaQueryList();
+
+  static addListener_Callback_0(mthis) native "MediaQueryList_addListener_Callback";
+  addListener_Callback_0_(mthis) => addListener_Callback_0(mthis);
+
+  static addListener_Callback_1(mthis, __arg_0) native "MediaQueryList_addListener_Callback";
+  addListener_Callback_1_(mthis, __arg_0) => addListener_Callback_1(mthis, __arg_0);
+
+  static addListener_Callback_2(mthis, __arg_0, __arg_1) native "MediaQueryList_addListener_Callback";
+  addListener_Callback_2_(mthis, __arg_0, __arg_1) => addListener_Callback_2(mthis, __arg_0, __arg_1);
+
+  static addListener_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "MediaQueryList_addListener_Callback";
+  addListener_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => addListener_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
   static matches_Getter(mthis) native "MediaQueryList_matches_Getter";
+  matches_Getter_(mthis) => matches_Getter(mthis);
 
   static media_Getter(mthis) native "MediaQueryList_media_Getter";
+  media_Getter_(mthis) => media_Getter(mthis);
+
+  static removeListener_Callback_0(mthis) native "MediaQueryList_removeListener_Callback";
+  removeListener_Callback_0_(mthis) => removeListener_Callback_0(mthis);
+
+  static removeListener_Callback_1(mthis, __arg_0) native "MediaQueryList_removeListener_Callback";
+  removeListener_Callback_1_(mthis, __arg_0) => removeListener_Callback_1(mthis, __arg_0);
+
+  static removeListener_Callback_2(mthis, __arg_0, __arg_1) native "MediaQueryList_removeListener_Callback";
+  removeListener_Callback_2_(mthis, __arg_0, __arg_1) => removeListener_Callback_2(mthis, __arg_0, __arg_1);
+
+  static removeListener_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "MediaQueryList_removeListener_Callback";
+  removeListener_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => removeListener_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
 }
 
-class BlinkMediaSource {
-  static constructorCallback() native "MediaSource_constructorCallback";
+class BlinkMediaSource extends BlinkEventTarget {
+  static final instance = new BlinkMediaSource();
 
   static activeSourceBuffers_Getter(mthis) native "MediaSource_activeSourceBuffers_Getter";
+  activeSourceBuffers_Getter_(mthis) => activeSourceBuffers_Getter(mthis);
+
+  static addSourceBuffer_Callback_0(mthis) native "MediaSource_addSourceBuffer_Callback";
+  addSourceBuffer_Callback_0_(mthis) => addSourceBuffer_Callback_0(mthis);
+
+  static addSourceBuffer_Callback_1(mthis, __arg_0) native "MediaSource_addSourceBuffer_Callback";
+  addSourceBuffer_Callback_1_(mthis, __arg_0) => addSourceBuffer_Callback_1(mthis, __arg_0);
+
+  static addSourceBuffer_Callback_2(mthis, __arg_0, __arg_1) native "MediaSource_addSourceBuffer_Callback";
+  addSourceBuffer_Callback_2_(mthis, __arg_0, __arg_1) => addSourceBuffer_Callback_2(mthis, __arg_0, __arg_1);
+
+  static addSourceBuffer_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "MediaSource_addSourceBuffer_Callback";
+  addSourceBuffer_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => addSourceBuffer_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static constructorCallback_0() native "MediaSource_constructorCallback";
+  constructorCallback_0_() => constructorCallback_0();
+
+  static constructorCallback_1(__arg_0) native "MediaSource_constructorCallback";
+  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+
+  static constructorCallback_2(__arg_0, __arg_1) native "MediaSource_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
 
   static duration_Getter(mthis) native "MediaSource_duration_Getter";
+  duration_Getter_(mthis) => duration_Getter(mthis);
 
-  static duration_Setter(mthis, value) native "MediaSource_duration_Setter";
+  static duration_Setter(mthis, __arg_0) native "MediaSource_duration_Setter";
+  duration_Setter_(mthis, __arg_0) => duration_Setter(mthis, __arg_0);
+
+  static endOfStream_Callback_0(mthis) native "MediaSource_endOfStream_Callback";
+  endOfStream_Callback_0_(mthis) => endOfStream_Callback_0(mthis);
+
+  static endOfStream_Callback_1(mthis, __arg_0) native "MediaSource_endOfStream_Callback";
+  endOfStream_Callback_1_(mthis, __arg_0) => endOfStream_Callback_1(mthis, __arg_0);
+
+  static endOfStream_Callback_2(mthis, __arg_0, __arg_1) native "MediaSource_endOfStream_Callback";
+  endOfStream_Callback_2_(mthis, __arg_0, __arg_1) => endOfStream_Callback_2(mthis, __arg_0, __arg_1);
+
+  static endOfStream_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "MediaSource_endOfStream_Callback";
+  endOfStream_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => endOfStream_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static isTypeSupported_Callback_0() native "MediaSource_isTypeSupported_Callback";
+  isTypeSupported_Callback_0_() => isTypeSupported_Callback_0();
+
+  static isTypeSupported_Callback_1(__arg_0) native "MediaSource_isTypeSupported_Callback";
+  isTypeSupported_Callback_1_(__arg_0) => isTypeSupported_Callback_1(__arg_0);
+
+  static isTypeSupported_Callback_2(__arg_0, __arg_1) native "MediaSource_isTypeSupported_Callback";
+  isTypeSupported_Callback_2_(__arg_0, __arg_1) => isTypeSupported_Callback_2(__arg_0, __arg_1);
+
+  static isTypeSupported_Callback_3(__arg_0, __arg_1, __arg_2) native "MediaSource_isTypeSupported_Callback";
+  isTypeSupported_Callback_3_(__arg_0, __arg_1, __arg_2) => isTypeSupported_Callback_3(__arg_0, __arg_1, __arg_2);
 
   static readyState_Getter(mthis) native "MediaSource_readyState_Getter";
+  readyState_Getter_(mthis) => readyState_Getter(mthis);
+
+  static removeSourceBuffer_Callback_0(mthis) native "MediaSource_removeSourceBuffer_Callback";
+  removeSourceBuffer_Callback_0_(mthis) => removeSourceBuffer_Callback_0(mthis);
+
+  static removeSourceBuffer_Callback_1(mthis, __arg_0) native "MediaSource_removeSourceBuffer_Callback";
+  removeSourceBuffer_Callback_1_(mthis, __arg_0) => removeSourceBuffer_Callback_1(mthis, __arg_0);
+
+  static removeSourceBuffer_Callback_2(mthis, __arg_0, __arg_1) native "MediaSource_removeSourceBuffer_Callback";
+  removeSourceBuffer_Callback_2_(mthis, __arg_0, __arg_1) => removeSourceBuffer_Callback_2(mthis, __arg_0, __arg_1);
+
+  static removeSourceBuffer_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "MediaSource_removeSourceBuffer_Callback";
+  removeSourceBuffer_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => removeSourceBuffer_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
   static sourceBuffers_Getter(mthis) native "MediaSource_sourceBuffers_Getter";
+  sourceBuffers_Getter_(mthis) => sourceBuffers_Getter(mthis);
 
-  static addSourceBuffer_Callback_1(mthis, type) native "MediaSource_addSourceBuffer_Callback";
-
-  static endOfStream_Callback_1(mthis, error) native "MediaSource_endOfStream_Callback";
-
-  static endOfStream_Callback(mthis) native "MediaSource_endOfStream_Callback";
-
-  static isTypeSupported_Callback_1(type) native "MediaSource_isTypeSupported_Callback";
-
-  static removeSourceBuffer_Callback_1(mthis, buffer) native "MediaSource_removeSourceBuffer_Callback";
 }
 
-class BlinkMediaStream {
-  static constructorCallback() native "MediaStream_constructorCallback";
+class BlinkMediaStream extends BlinkEventTarget {
+  static final instance = new BlinkMediaStream();
 
-  static constructorCallback_1(stream_OR_tracks) native "MediaStream_constructorCallback";
+  static addTrack_Callback_0(mthis) native "MediaStream_addTrack_Callback";
+  addTrack_Callback_0_(mthis) => addTrack_Callback_0(mthis);
+
+  static addTrack_Callback_1(mthis, __arg_0) native "MediaStream_addTrack_Callback";
+  addTrack_Callback_1_(mthis, __arg_0) => addTrack_Callback_1(mthis, __arg_0);
+
+  static addTrack_Callback_2(mthis, __arg_0, __arg_1) native "MediaStream_addTrack_Callback";
+  addTrack_Callback_2_(mthis, __arg_0, __arg_1) => addTrack_Callback_2(mthis, __arg_0, __arg_1);
+
+  static addTrack_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "MediaStream_addTrack_Callback";
+  addTrack_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => addTrack_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static clone_Callback_0(mthis) native "MediaStream_clone_Callback";
+  clone_Callback_0_(mthis) => clone_Callback_0(mthis);
+
+  static clone_Callback_1(mthis, __arg_0) native "MediaStream_clone_Callback";
+  clone_Callback_1_(mthis, __arg_0) => clone_Callback_1(mthis, __arg_0);
+
+  static clone_Callback_2(mthis, __arg_0, __arg_1) native "MediaStream_clone_Callback";
+  clone_Callback_2_(mthis, __arg_0, __arg_1) => clone_Callback_2(mthis, __arg_0, __arg_1);
+
+  static constructorCallback_0() native "MediaStream_constructorCallback";
+  constructorCallback_0_() => constructorCallback_0();
+
+  static constructorCallback_1(__arg_0) native "MediaStream_constructorCallback";
+  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+
+  static constructorCallback_2(__arg_0, __arg_1) native "MediaStream_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+
+  static constructorCallback_3(__arg_0, __arg_1, __arg_2) native "MediaStream_constructorCallback";
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => constructorCallback_3(__arg_0, __arg_1, __arg_2);
 
   static ended_Getter(mthis) native "MediaStream_ended_Getter";
+  ended_Getter_(mthis) => ended_Getter(mthis);
+
+  static getAudioTracks_Callback_0(mthis) native "MediaStream_getAudioTracks_Callback";
+  getAudioTracks_Callback_0_(mthis) => getAudioTracks_Callback_0(mthis);
+
+  static getAudioTracks_Callback_1(mthis, __arg_0) native "MediaStream_getAudioTracks_Callback";
+  getAudioTracks_Callback_1_(mthis, __arg_0) => getAudioTracks_Callback_1(mthis, __arg_0);
+
+  static getAudioTracks_Callback_2(mthis, __arg_0, __arg_1) native "MediaStream_getAudioTracks_Callback";
+  getAudioTracks_Callback_2_(mthis, __arg_0, __arg_1) => getAudioTracks_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getTrackById_Callback_0(mthis) native "MediaStream_getTrackById_Callback";
+  getTrackById_Callback_0_(mthis) => getTrackById_Callback_0(mthis);
+
+  static getTrackById_Callback_1(mthis, __arg_0) native "MediaStream_getTrackById_Callback";
+  getTrackById_Callback_1_(mthis, __arg_0) => getTrackById_Callback_1(mthis, __arg_0);
+
+  static getTrackById_Callback_2(mthis, __arg_0, __arg_1) native "MediaStream_getTrackById_Callback";
+  getTrackById_Callback_2_(mthis, __arg_0, __arg_1) => getTrackById_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getTrackById_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "MediaStream_getTrackById_Callback";
+  getTrackById_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getTrackById_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static getTracks_Callback_0(mthis) native "MediaStream_getTracks_Callback";
+  getTracks_Callback_0_(mthis) => getTracks_Callback_0(mthis);
+
+  static getTracks_Callback_1(mthis, __arg_0) native "MediaStream_getTracks_Callback";
+  getTracks_Callback_1_(mthis, __arg_0) => getTracks_Callback_1(mthis, __arg_0);
+
+  static getTracks_Callback_2(mthis, __arg_0, __arg_1) native "MediaStream_getTracks_Callback";
+  getTracks_Callback_2_(mthis, __arg_0, __arg_1) => getTracks_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getVideoTracks_Callback_0(mthis) native "MediaStream_getVideoTracks_Callback";
+  getVideoTracks_Callback_0_(mthis) => getVideoTracks_Callback_0(mthis);
+
+  static getVideoTracks_Callback_1(mthis, __arg_0) native "MediaStream_getVideoTracks_Callback";
+  getVideoTracks_Callback_1_(mthis, __arg_0) => getVideoTracks_Callback_1(mthis, __arg_0);
+
+  static getVideoTracks_Callback_2(mthis, __arg_0, __arg_1) native "MediaStream_getVideoTracks_Callback";
+  getVideoTracks_Callback_2_(mthis, __arg_0, __arg_1) => getVideoTracks_Callback_2(mthis, __arg_0, __arg_1);
 
   static id_Getter(mthis) native "MediaStream_id_Getter";
+  id_Getter_(mthis) => id_Getter(mthis);
 
   static label_Getter(mthis) native "MediaStream_label_Getter";
+  label_Getter_(mthis) => label_Getter(mthis);
 
-  static addTrack_Callback_1(mthis, track) native "MediaStream_addTrack_Callback";
+  static onaddtrack_Getter(mthis) native "MediaStream_onaddtrack_Getter";
+  onaddtrack_Getter_(mthis) => onaddtrack_Getter(mthis);
 
-  static clone_Callback(mthis) native "MediaStream_clone_Callback";
+  static onaddtrack_Setter(mthis, __arg_0) native "MediaStream_onaddtrack_Setter";
+  onaddtrack_Setter_(mthis, __arg_0) => onaddtrack_Setter(mthis, __arg_0);
 
-  static getAudioTracks_Callback(mthis) native "MediaStream_getAudioTracks_Callback";
+  static onended_Getter(mthis) native "MediaStream_onended_Getter";
+  onended_Getter_(mthis) => onended_Getter(mthis);
 
-  static getTrackById_Callback_1(mthis, trackId) native "MediaStream_getTrackById_Callback";
+  static onended_Setter(mthis, __arg_0) native "MediaStream_onended_Setter";
+  onended_Setter_(mthis, __arg_0) => onended_Setter(mthis, __arg_0);
 
-  static getTracks_Callback(mthis) native "MediaStream_getTracks_Callback";
+  static onremovetrack_Getter(mthis) native "MediaStream_onremovetrack_Getter";
+  onremovetrack_Getter_(mthis) => onremovetrack_Getter(mthis);
 
-  static getVideoTracks_Callback(mthis) native "MediaStream_getVideoTracks_Callback";
+  static onremovetrack_Setter(mthis, __arg_0) native "MediaStream_onremovetrack_Setter";
+  onremovetrack_Setter_(mthis, __arg_0) => onremovetrack_Setter(mthis, __arg_0);
 
-  static removeTrack_Callback_1(mthis, track) native "MediaStream_removeTrack_Callback";
+  static removeTrack_Callback_0(mthis) native "MediaStream_removeTrack_Callback";
+  removeTrack_Callback_0_(mthis) => removeTrack_Callback_0(mthis);
 
-  static stop_Callback(mthis) native "MediaStream_stop_Callback";
+  static removeTrack_Callback_1(mthis, __arg_0) native "MediaStream_removeTrack_Callback";
+  removeTrack_Callback_1_(mthis, __arg_0) => removeTrack_Callback_1(mthis, __arg_0);
+
+  static removeTrack_Callback_2(mthis, __arg_0, __arg_1) native "MediaStream_removeTrack_Callback";
+  removeTrack_Callback_2_(mthis, __arg_0, __arg_1) => removeTrack_Callback_2(mthis, __arg_0, __arg_1);
+
+  static removeTrack_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "MediaStream_removeTrack_Callback";
+  removeTrack_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => removeTrack_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static stop_Callback_0(mthis) native "MediaStream_stop_Callback";
+  stop_Callback_0_(mthis) => stop_Callback_0(mthis);
+
+  static stop_Callback_1(mthis, __arg_0) native "MediaStream_stop_Callback";
+  stop_Callback_1_(mthis, __arg_0) => stop_Callback_1(mthis, __arg_0);
+
+  static stop_Callback_2(mthis, __arg_0, __arg_1) native "MediaStream_stop_Callback";
+  stop_Callback_2_(mthis, __arg_0, __arg_1) => stop_Callback_2(mthis, __arg_0, __arg_1);
+
 }
 
-class BlinkMediaStreamAudioDestinationNode {
+class BlinkMediaStreamAudioDestinationNode extends BlinkAudioNode {
+  static final instance = new BlinkMediaStreamAudioDestinationNode();
+
   static stream_Getter(mthis) native "MediaStreamAudioDestinationNode_stream_Getter";
+  stream_Getter_(mthis) => stream_Getter(mthis);
+
 }
 
-class BlinkMediaStreamAudioSourceNode {
+class BlinkMediaStreamAudioSourceNode extends BlinkAudioSourceNode {
+  static final instance = new BlinkMediaStreamAudioSourceNode();
+
   static mediaStream_Getter(mthis) native "MediaStreamAudioSourceNode_mediaStream_Getter";
+  mediaStream_Getter_(mthis) => mediaStream_Getter(mthis);
+
 }
 
-class BlinkMediaStreamEvent {
-  static constructorCallback(type, options) native "MediaStreamEvent_constructorCallback";
+class BlinkMediaStreamEvent extends BlinkEvent {
+  static final instance = new BlinkMediaStreamEvent();
+
+  static constructorCallback_2(__arg_0, __arg_1) native "MediaStreamEvent_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
 
   static stream_Getter(mthis) native "MediaStreamEvent_stream_Getter";
+  stream_Getter_(mthis) => stream_Getter(mthis);
+
 }
 
-class BlinkMediaStreamTrack {
-  static enabled_Getter(mthis) native "MediaStreamTrack_enabled_Getter";
+class BlinkMediaStreamTrack extends BlinkEventTarget {
+  static final instance = new BlinkMediaStreamTrack();
 
-  static enabled_Setter(mthis, value) native "MediaStreamTrack_enabled_Setter";
+  static clone_Callback_0(mthis) native "MediaStreamTrack_clone_Callback";
+  clone_Callback_0_(mthis) => clone_Callback_0(mthis);
+
+  static clone_Callback_1(mthis, __arg_0) native "MediaStreamTrack_clone_Callback";
+  clone_Callback_1_(mthis, __arg_0) => clone_Callback_1(mthis, __arg_0);
+
+  static clone_Callback_2(mthis, __arg_0, __arg_1) native "MediaStreamTrack_clone_Callback";
+  clone_Callback_2_(mthis, __arg_0, __arg_1) => clone_Callback_2(mthis, __arg_0, __arg_1);
+
+  static enabled_Getter(mthis) native "MediaStreamTrack_enabled_Getter";
+  enabled_Getter_(mthis) => enabled_Getter(mthis);
+
+  static enabled_Setter(mthis, __arg_0) native "MediaStreamTrack_enabled_Setter";
+  enabled_Setter_(mthis, __arg_0) => enabled_Setter(mthis, __arg_0);
+
+  static getSources_Callback_0() native "MediaStreamTrack_getSources_Callback";
+  getSources_Callback_0_() => getSources_Callback_0();
+
+  static getSources_Callback_1(__arg_0) native "MediaStreamTrack_getSources_Callback";
+  getSources_Callback_1_(__arg_0) => getSources_Callback_1(__arg_0);
+
+  static getSources_Callback_2(__arg_0, __arg_1) native "MediaStreamTrack_getSources_Callback";
+  getSources_Callback_2_(__arg_0, __arg_1) => getSources_Callback_2(__arg_0, __arg_1);
+
+  static getSources_Callback_3(__arg_0, __arg_1, __arg_2) native "MediaStreamTrack_getSources_Callback";
+  getSources_Callback_3_(__arg_0, __arg_1, __arg_2) => getSources_Callback_3(__arg_0, __arg_1, __arg_2);
 
   static id_Getter(mthis) native "MediaStreamTrack_id_Getter";
+  id_Getter_(mthis) => id_Getter(mthis);
 
   static kind_Getter(mthis) native "MediaStreamTrack_kind_Getter";
+  kind_Getter_(mthis) => kind_Getter(mthis);
 
   static label_Getter(mthis) native "MediaStreamTrack_label_Getter";
+  label_Getter_(mthis) => label_Getter(mthis);
 
   static muted_Getter(mthis) native "MediaStreamTrack_muted_Getter";
+  muted_Getter_(mthis) => muted_Getter(mthis);
+
+  static onended_Getter(mthis) native "MediaStreamTrack_onended_Getter";
+  onended_Getter_(mthis) => onended_Getter(mthis);
+
+  static onended_Setter(mthis, __arg_0) native "MediaStreamTrack_onended_Setter";
+  onended_Setter_(mthis, __arg_0) => onended_Setter(mthis, __arg_0);
+
+  static onmute_Getter(mthis) native "MediaStreamTrack_onmute_Getter";
+  onmute_Getter_(mthis) => onmute_Getter(mthis);
+
+  static onmute_Setter(mthis, __arg_0) native "MediaStreamTrack_onmute_Setter";
+  onmute_Setter_(mthis, __arg_0) => onmute_Setter(mthis, __arg_0);
+
+  static onunmute_Getter(mthis) native "MediaStreamTrack_onunmute_Getter";
+  onunmute_Getter_(mthis) => onunmute_Getter(mthis);
+
+  static onunmute_Setter(mthis, __arg_0) native "MediaStreamTrack_onunmute_Setter";
+  onunmute_Setter_(mthis, __arg_0) => onunmute_Setter(mthis, __arg_0);
 
   static readyState_Getter(mthis) native "MediaStreamTrack_readyState_Getter";
+  readyState_Getter_(mthis) => readyState_Getter(mthis);
 
-  static clone_Callback(mthis) native "MediaStreamTrack_clone_Callback";
+  static stop_Callback_0(mthis) native "MediaStreamTrack_stop_Callback";
+  stop_Callback_0_(mthis) => stop_Callback_0(mthis);
 
-  static getSources_Callback_1(callback) native "MediaStreamTrack_getSources_Callback";
+  static stop_Callback_1(mthis, __arg_0) native "MediaStreamTrack_stop_Callback";
+  stop_Callback_1_(mthis, __arg_0) => stop_Callback_1(mthis, __arg_0);
 
-  static stop_Callback(mthis) native "MediaStreamTrack_stop_Callback";
+  static stop_Callback_2(mthis, __arg_0, __arg_1) native "MediaStreamTrack_stop_Callback";
+  stop_Callback_2_(mthis, __arg_0, __arg_1) => stop_Callback_2(mthis, __arg_0, __arg_1);
+
 }
 
-class BlinkMediaStreamTrackEvent {
+class BlinkMediaStreamTrackEvent extends BlinkEvent {
+  static final instance = new BlinkMediaStreamTrackEvent();
+
   static track_Getter(mthis) native "MediaStreamTrackEvent_track_Getter";
+  track_Getter_(mthis) => track_Getter(mthis);
+
 }
 
 class BlinkMemoryInfo {
+  static final instance = new BlinkMemoryInfo();
+
   static jsHeapSizeLimit_Getter(mthis) native "MemoryInfo_jsHeapSizeLimit_Getter";
+  jsHeapSizeLimit_Getter_(mthis) => jsHeapSizeLimit_Getter(mthis);
 
   static totalJSHeapSize_Getter(mthis) native "MemoryInfo_totalJSHeapSize_Getter";
+  totalJSHeapSize_Getter_(mthis) => totalJSHeapSize_Getter(mthis);
 
   static usedJSHeapSize_Getter(mthis) native "MemoryInfo_usedJSHeapSize_Getter";
+  usedJSHeapSize_Getter_(mthis) => usedJSHeapSize_Getter(mthis);
+
 }
 
 class BlinkMessageChannel {
+  static final instance = new BlinkMessageChannel();
+
+  static constructorCallback_0() native "MessageChannel_constructorCallback";
+  constructorCallback_0_() => constructorCallback_0();
+
+  static constructorCallback_1(__arg_0) native "MessageChannel_constructorCallback";
+  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+
+  static constructorCallback_2(__arg_0, __arg_1) native "MessageChannel_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+
   static port1_Getter(mthis) native "MessageChannel_port1_Getter";
+  port1_Getter_(mthis) => port1_Getter(mthis);
 
   static port2_Getter(mthis) native "MessageChannel_port2_Getter";
+  port2_Getter_(mthis) => port2_Getter(mthis);
+
 }
 
-class BlinkMessageEvent {
-  static constructorCallback(type, options) native "MessageEvent_constructorCallback";
+class BlinkMessageEvent extends BlinkEvent {
+  static final instance = new BlinkMessageEvent();
+
+  static constructorCallback_2(__arg_0, __arg_1) native "MessageEvent_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
 
   static data_Getter(mthis) native "MessageEvent_data_Getter";
+  data_Getter_(mthis) => data_Getter(mthis);
+
+  static initMessageEvent_Callback_0(mthis) native "MessageEvent_initMessageEvent_Callback";
+  initMessageEvent_Callback_0_(mthis) => initMessageEvent_Callback_0(mthis);
+
+  static initMessageEvent_Callback_1(mthis, __arg_0) native "MessageEvent_initMessageEvent_Callback";
+  initMessageEvent_Callback_1_(mthis, __arg_0) => initMessageEvent_Callback_1(mthis, __arg_0);
+
+  static initMessageEvent_Callback_10(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9) native "MessageEvent_initMessageEvent_Callback";
+  initMessageEvent_Callback_10_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9) => initMessageEvent_Callback_10(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9);
+
+  static initMessageEvent_Callback_2(mthis, __arg_0, __arg_1) native "MessageEvent_initMessageEvent_Callback";
+  initMessageEvent_Callback_2_(mthis, __arg_0, __arg_1) => initMessageEvent_Callback_2(mthis, __arg_0, __arg_1);
+
+  static initMessageEvent_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "MessageEvent_initMessageEvent_Callback";
+  initMessageEvent_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => initMessageEvent_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static initMessageEvent_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "MessageEvent_initMessageEvent_Callback";
+  initMessageEvent_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => initMessageEvent_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static initMessageEvent_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "MessageEvent_initMessageEvent_Callback";
+  initMessageEvent_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => initMessageEvent_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static initMessageEvent_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "MessageEvent_initMessageEvent_Callback";
+  initMessageEvent_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => initMessageEvent_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static initMessageEvent_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) native "MessageEvent_initMessageEvent_Callback";
+  initMessageEvent_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => initMessageEvent_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6);
+
+  static initMessageEvent_Callback_8(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) native "MessageEvent_initMessageEvent_Callback";
+  initMessageEvent_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => initMessageEvent_Callback_8(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7);
+
+  static initMessageEvent_Callback_9(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) native "MessageEvent_initMessageEvent_Callback";
+  initMessageEvent_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => initMessageEvent_Callback_9(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8);
 
   static lastEventId_Getter(mthis) native "MessageEvent_lastEventId_Getter";
+  lastEventId_Getter_(mthis) => lastEventId_Getter(mthis);
 
   static origin_Getter(mthis) native "MessageEvent_origin_Getter";
+  origin_Getter_(mthis) => origin_Getter(mthis);
 
   static source_Getter(mthis) native "MessageEvent_source_Getter";
+  source_Getter_(mthis) => source_Getter(mthis);
 
-  static initMessageEvent_Callback_8(mthis, typeArg, canBubbleArg, cancelableArg, dataArg, originArg, lastEventIdArg, sourceArg, messagePorts) native "MessageEvent_initMessageEvent_Callback";
 }
 
-class BlinkMessagePort {
-  static close_Callback(mthis) native "MessagePort_close_Callback";
+class BlinkMessagePort extends BlinkEventTarget {
+  static final instance = new BlinkMessagePort();
 
-  static postMessage_Callback_2(mthis, message, transfer) native "MessagePort_postMessage_Callback";
+  static close_Callback_0(mthis) native "MessagePort_close_Callback";
+  close_Callback_0_(mthis) => close_Callback_0(mthis);
 
-  static start_Callback(mthis) native "MessagePort_start_Callback";
+  static close_Callback_1(mthis, __arg_0) native "MessagePort_close_Callback";
+  close_Callback_1_(mthis, __arg_0) => close_Callback_1(mthis, __arg_0);
+
+  static close_Callback_2(mthis, __arg_0, __arg_1) native "MessagePort_close_Callback";
+  close_Callback_2_(mthis, __arg_0, __arg_1) => close_Callback_2(mthis, __arg_0, __arg_1);
+
+  static onmessage_Getter(mthis) native "MessagePort_onmessage_Getter";
+  onmessage_Getter_(mthis) => onmessage_Getter(mthis);
+
+  static onmessage_Setter(mthis, __arg_0) native "MessagePort_onmessage_Setter";
+  onmessage_Setter_(mthis, __arg_0) => onmessage_Setter(mthis, __arg_0);
+
+  static postMessage_Callback_0(mthis) native "MessagePort_postMessage_Callback";
+  postMessage_Callback_0_(mthis) => postMessage_Callback_0(mthis);
+
+  static postMessage_Callback_1(mthis, __arg_0) native "MessagePort_postMessage_Callback";
+  postMessage_Callback_1_(mthis, __arg_0) => postMessage_Callback_1(mthis, __arg_0);
+
+  static postMessage_Callback_2(mthis, __arg_0, __arg_1) native "MessagePort_postMessage_Callback";
+  postMessage_Callback_2_(mthis, __arg_0, __arg_1) => postMessage_Callback_2(mthis, __arg_0, __arg_1);
+
+  static postMessage_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "MessagePort_postMessage_Callback";
+  postMessage_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => postMessage_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static postMessage_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "MessagePort_postMessage_Callback";
+  postMessage_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => postMessage_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static start_Callback_0(mthis) native "MessagePort_start_Callback";
+  start_Callback_0_(mthis) => start_Callback_0(mthis);
+
+  static start_Callback_1(mthis, __arg_0) native "MessagePort_start_Callback";
+  start_Callback_1_(mthis, __arg_0) => start_Callback_1(mthis, __arg_0);
+
+  static start_Callback_2(mthis, __arg_0, __arg_1) native "MessagePort_start_Callback";
+  start_Callback_2_(mthis, __arg_0, __arg_1) => start_Callback_2(mthis, __arg_0, __arg_1);
+
 }
 
 class BlinkMetadata {
+  static final instance = new BlinkMetadata();
+
   static modificationTime_Getter(mthis) native "Metadata_modificationTime_Getter";
+  modificationTime_Getter_(mthis) => modificationTime_Getter(mthis);
 
   static size_Getter(mthis) native "Metadata_size_Getter";
+  size_Getter_(mthis) => size_Getter(mthis);
+
 }
 
 class BlinkMimeType {
+  static final instance = new BlinkMimeType();
+
   static description_Getter(mthis) native "MimeType_description_Getter";
+  description_Getter_(mthis) => description_Getter(mthis);
 
   static enabledPlugin_Getter(mthis) native "MimeType_enabledPlugin_Getter";
+  enabledPlugin_Getter_(mthis) => enabledPlugin_Getter(mthis);
 
   static suffixes_Getter(mthis) native "MimeType_suffixes_Getter";
+  suffixes_Getter_(mthis) => suffixes_Getter(mthis);
 
   static type_Getter(mthis) native "MimeType_type_Getter";
+  type_Getter_(mthis) => type_Getter(mthis);
+
 }
 
 class BlinkMimeTypeArray {
+  static final instance = new BlinkMimeTypeArray();
+
+  static $__getter___Callback_1(mthis, __arg_0) native "MimeTypeArray___getter___Callback";
+  $__getter___Callback_1_(mthis, __arg_0) => $__getter___Callback_1(mthis, __arg_0);
+
+  static item_Callback_0(mthis) native "MimeTypeArray_item_Callback";
+  item_Callback_0_(mthis) => item_Callback_0(mthis);
+
+  static item_Callback_1(mthis, __arg_0) native "MimeTypeArray_item_Callback";
+  item_Callback_1_(mthis, __arg_0) => item_Callback_1(mthis, __arg_0);
+
+  static item_Callback_2(mthis, __arg_0, __arg_1) native "MimeTypeArray_item_Callback";
+  item_Callback_2_(mthis, __arg_0, __arg_1) => item_Callback_2(mthis, __arg_0, __arg_1);
+
+  static item_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "MimeTypeArray_item_Callback";
+  item_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => item_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
   static length_Getter(mthis) native "MimeTypeArray_length_Getter";
+  length_Getter_(mthis) => length_Getter(mthis);
 
-  static $__getter___Callback_1(mthis, name) native "MimeTypeArray___getter___Callback";
+  static namedItem_Callback_0(mthis) native "MimeTypeArray_namedItem_Callback";
+  namedItem_Callback_0_(mthis) => namedItem_Callback_0(mthis);
 
-  static item_Callback_1(mthis, index) native "MimeTypeArray_item_Callback";
+  static namedItem_Callback_1(mthis, __arg_0) native "MimeTypeArray_namedItem_Callback";
+  namedItem_Callback_1_(mthis, __arg_0) => namedItem_Callback_1(mthis, __arg_0);
 
-  static namedItem_Callback_1(mthis, name) native "MimeTypeArray_namedItem_Callback";
+  static namedItem_Callback_2(mthis, __arg_0, __arg_1) native "MimeTypeArray_namedItem_Callback";
+  namedItem_Callback_2_(mthis, __arg_0, __arg_1) => namedItem_Callback_2(mthis, __arg_0, __arg_1);
+
+  static namedItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "MimeTypeArray_namedItem_Callback";
+  namedItem_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => namedItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
 }
 
-class BlinkMouseEvent {
-  static constructorCallback(type, options) native "MouseEvent_constructorCallback";
+class BlinkMouseEvent extends BlinkUIEvent {
+  static final instance = new BlinkMouseEvent();
 
   static altKey_Getter(mthis) native "MouseEvent_altKey_Getter";
+  altKey_Getter_(mthis) => altKey_Getter(mthis);
 
   static button_Getter(mthis) native "MouseEvent_button_Getter";
+  button_Getter_(mthis) => button_Getter(mthis);
 
   static clientX_Getter(mthis) native "MouseEvent_clientX_Getter";
+  clientX_Getter_(mthis) => clientX_Getter(mthis);
 
   static clientY_Getter(mthis) native "MouseEvent_clientY_Getter";
+  clientY_Getter_(mthis) => clientY_Getter(mthis);
+
+  static constructorCallback_2(__arg_0, __arg_1) native "MouseEvent_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
 
   static ctrlKey_Getter(mthis) native "MouseEvent_ctrlKey_Getter";
+  ctrlKey_Getter_(mthis) => ctrlKey_Getter(mthis);
 
   static dataTransfer_Getter(mthis) native "MouseEvent_dataTransfer_Getter";
+  dataTransfer_Getter_(mthis) => dataTransfer_Getter(mthis);
 
   static fromElement_Getter(mthis) native "MouseEvent_fromElement_Getter";
+  fromElement_Getter_(mthis) => fromElement_Getter(mthis);
+
+  static initMouseEvent_Callback_0(mthis) native "MouseEvent_initMouseEvent_Callback";
+  initMouseEvent_Callback_0_(mthis) => initMouseEvent_Callback_0(mthis);
+
+  static initMouseEvent_Callback_1(mthis, __arg_0) native "MouseEvent_initMouseEvent_Callback";
+  initMouseEvent_Callback_1_(mthis, __arg_0) => initMouseEvent_Callback_1(mthis, __arg_0);
+
+  static initMouseEvent_Callback_10(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9) native "MouseEvent_initMouseEvent_Callback";
+  initMouseEvent_Callback_10_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9) => initMouseEvent_Callback_10(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9);
+
+  static initMouseEvent_Callback_11(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10) native "MouseEvent_initMouseEvent_Callback";
+  initMouseEvent_Callback_11_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10) => initMouseEvent_Callback_11(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10);
+
+  static initMouseEvent_Callback_12(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11) native "MouseEvent_initMouseEvent_Callback";
+  initMouseEvent_Callback_12_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11) => initMouseEvent_Callback_12(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11);
+
+  static initMouseEvent_Callback_13(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11, __arg_12) native "MouseEvent_initMouseEvent_Callback";
+  initMouseEvent_Callback_13_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11, __arg_12) => initMouseEvent_Callback_13(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11, __arg_12);
+
+  static initMouseEvent_Callback_14(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11, __arg_12, __arg_13) native "MouseEvent_initMouseEvent_Callback";
+  initMouseEvent_Callback_14_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11, __arg_12, __arg_13) => initMouseEvent_Callback_14(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11, __arg_12, __arg_13);
+
+  static initMouseEvent_Callback_15(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11, __arg_12, __arg_13, __arg_14) native "MouseEvent_initMouseEvent_Callback";
+  initMouseEvent_Callback_15_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11, __arg_12, __arg_13, __arg_14) => initMouseEvent_Callback_15(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11, __arg_12, __arg_13, __arg_14);
+
+  static initMouseEvent_Callback_16(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11, __arg_12, __arg_13, __arg_14, __arg_15) native "MouseEvent_initMouseEvent_Callback";
+  initMouseEvent_Callback_16_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11, __arg_12, __arg_13, __arg_14, __arg_15) => initMouseEvent_Callback_16(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11, __arg_12, __arg_13, __arg_14, __arg_15);
+
+  static initMouseEvent_Callback_17(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11, __arg_12, __arg_13, __arg_14, __arg_15, __arg_16) native "MouseEvent_initMouseEvent_Callback";
+  initMouseEvent_Callback_17_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11, __arg_12, __arg_13, __arg_14, __arg_15, __arg_16) => initMouseEvent_Callback_17(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11, __arg_12, __arg_13, __arg_14, __arg_15, __arg_16);
+
+  static initMouseEvent_Callback_2(mthis, __arg_0, __arg_1) native "MouseEvent_initMouseEvent_Callback";
+  initMouseEvent_Callback_2_(mthis, __arg_0, __arg_1) => initMouseEvent_Callback_2(mthis, __arg_0, __arg_1);
+
+  static initMouseEvent_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "MouseEvent_initMouseEvent_Callback";
+  initMouseEvent_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => initMouseEvent_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static initMouseEvent_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "MouseEvent_initMouseEvent_Callback";
+  initMouseEvent_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => initMouseEvent_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static initMouseEvent_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "MouseEvent_initMouseEvent_Callback";
+  initMouseEvent_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => initMouseEvent_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static initMouseEvent_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "MouseEvent_initMouseEvent_Callback";
+  initMouseEvent_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => initMouseEvent_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static initMouseEvent_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) native "MouseEvent_initMouseEvent_Callback";
+  initMouseEvent_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => initMouseEvent_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6);
+
+  static initMouseEvent_Callback_8(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) native "MouseEvent_initMouseEvent_Callback";
+  initMouseEvent_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => initMouseEvent_Callback_8(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7);
+
+  static initMouseEvent_Callback_9(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) native "MouseEvent_initMouseEvent_Callback";
+  initMouseEvent_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => initMouseEvent_Callback_9(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8);
 
   static metaKey_Getter(mthis) native "MouseEvent_metaKey_Getter";
+  metaKey_Getter_(mthis) => metaKey_Getter(mthis);
 
   static movementX_Getter(mthis) native "MouseEvent_movementX_Getter";
+  movementX_Getter_(mthis) => movementX_Getter(mthis);
 
   static movementY_Getter(mthis) native "MouseEvent_movementY_Getter";
+  movementY_Getter_(mthis) => movementY_Getter(mthis);
 
   static offsetX_Getter(mthis) native "MouseEvent_offsetX_Getter";
+  offsetX_Getter_(mthis) => offsetX_Getter(mthis);
 
   static offsetY_Getter(mthis) native "MouseEvent_offsetY_Getter";
+  offsetY_Getter_(mthis) => offsetY_Getter(mthis);
 
   static region_Getter(mthis) native "MouseEvent_region_Getter";
+  region_Getter_(mthis) => region_Getter(mthis);
 
   static relatedTarget_Getter(mthis) native "MouseEvent_relatedTarget_Getter";
+  relatedTarget_Getter_(mthis) => relatedTarget_Getter(mthis);
 
   static screenX_Getter(mthis) native "MouseEvent_screenX_Getter";
+  screenX_Getter_(mthis) => screenX_Getter(mthis);
 
   static screenY_Getter(mthis) native "MouseEvent_screenY_Getter";
+  screenY_Getter_(mthis) => screenY_Getter(mthis);
 
   static shiftKey_Getter(mthis) native "MouseEvent_shiftKey_Getter";
+  shiftKey_Getter_(mthis) => shiftKey_Getter(mthis);
 
   static toElement_Getter(mthis) native "MouseEvent_toElement_Getter";
+  toElement_Getter_(mthis) => toElement_Getter(mthis);
 
   static webkitMovementX_Getter(mthis) native "MouseEvent_webkitMovementX_Getter";
+  webkitMovementX_Getter_(mthis) => webkitMovementX_Getter(mthis);
 
   static webkitMovementY_Getter(mthis) native "MouseEvent_webkitMovementY_Getter";
+  webkitMovementY_Getter_(mthis) => webkitMovementY_Getter(mthis);
 
-  static initMouseEvent_Callback_15(mthis, type, canBubble, cancelable, view, detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget) native "MouseEvent_initMouseEvent_Callback";
 }
 
-class BlinkMutationEvent {}
+class BlinkMutationEvent extends BlinkEvent {
+  static final instance = new BlinkMutationEvent();
+
+  static attrChange_Getter(mthis) native "MutationEvent_attrChange_Getter";
+  attrChange_Getter_(mthis) => attrChange_Getter(mthis);
+
+  static attrName_Getter(mthis) native "MutationEvent_attrName_Getter";
+  attrName_Getter_(mthis) => attrName_Getter(mthis);
+
+  static initMutationEvent_Callback_0(mthis) native "MutationEvent_initMutationEvent_Callback";
+  initMutationEvent_Callback_0_(mthis) => initMutationEvent_Callback_0(mthis);
+
+  static initMutationEvent_Callback_1(mthis, __arg_0) native "MutationEvent_initMutationEvent_Callback";
+  initMutationEvent_Callback_1_(mthis, __arg_0) => initMutationEvent_Callback_1(mthis, __arg_0);
+
+  static initMutationEvent_Callback_10(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9) native "MutationEvent_initMutationEvent_Callback";
+  initMutationEvent_Callback_10_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9) => initMutationEvent_Callback_10(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9);
+
+  static initMutationEvent_Callback_2(mthis, __arg_0, __arg_1) native "MutationEvent_initMutationEvent_Callback";
+  initMutationEvent_Callback_2_(mthis, __arg_0, __arg_1) => initMutationEvent_Callback_2(mthis, __arg_0, __arg_1);
+
+  static initMutationEvent_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "MutationEvent_initMutationEvent_Callback";
+  initMutationEvent_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => initMutationEvent_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static initMutationEvent_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "MutationEvent_initMutationEvent_Callback";
+  initMutationEvent_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => initMutationEvent_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static initMutationEvent_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "MutationEvent_initMutationEvent_Callback";
+  initMutationEvent_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => initMutationEvent_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static initMutationEvent_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "MutationEvent_initMutationEvent_Callback";
+  initMutationEvent_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => initMutationEvent_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static initMutationEvent_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) native "MutationEvent_initMutationEvent_Callback";
+  initMutationEvent_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => initMutationEvent_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6);
+
+  static initMutationEvent_Callback_8(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) native "MutationEvent_initMutationEvent_Callback";
+  initMutationEvent_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => initMutationEvent_Callback_8(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7);
+
+  static initMutationEvent_Callback_9(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) native "MutationEvent_initMutationEvent_Callback";
+  initMutationEvent_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => initMutationEvent_Callback_9(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8);
+
+  static newValue_Getter(mthis) native "MutationEvent_newValue_Getter";
+  newValue_Getter_(mthis) => newValue_Getter(mthis);
+
+  static prevValue_Getter(mthis) native "MutationEvent_prevValue_Getter";
+  prevValue_Getter_(mthis) => prevValue_Getter(mthis);
+
+  static relatedNode_Getter(mthis) native "MutationEvent_relatedNode_Getter";
+  relatedNode_Getter_(mthis) => relatedNode_Getter(mthis);
+
+}
 
 class BlinkMutationObserver {
-  static constructorCallback_1(callback) native "MutationObserver_constructorCallback";
+  static final instance = new BlinkMutationObserver();
 
-  static disconnect_Callback(mthis) native "MutationObserver_disconnect_Callback";
+  static constructorCallback_0() native "MutationObserver_constructorCallback";
+  constructorCallback_0_() => constructorCallback_0();
 
-  static observe_Callback_2(mthis, target, options) native "MutationObserver_observe_Callback";
+  static constructorCallback_1(__arg_0) native "MutationObserver_constructorCallback";
+  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
 
-  static takeRecords_Callback(mthis) native "MutationObserver_takeRecords_Callback";
+  static constructorCallback_2(__arg_0, __arg_1) native "MutationObserver_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+
+  static constructorCallback_3(__arg_0, __arg_1, __arg_2) native "MutationObserver_constructorCallback";
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => constructorCallback_3(__arg_0, __arg_1, __arg_2);
+
+  static disconnect_Callback_0(mthis) native "MutationObserver_disconnect_Callback";
+  disconnect_Callback_0_(mthis) => disconnect_Callback_0(mthis);
+
+  static disconnect_Callback_1(mthis, __arg_0) native "MutationObserver_disconnect_Callback";
+  disconnect_Callback_1_(mthis, __arg_0) => disconnect_Callback_1(mthis, __arg_0);
+
+  static disconnect_Callback_2(mthis, __arg_0, __arg_1) native "MutationObserver_disconnect_Callback";
+  disconnect_Callback_2_(mthis, __arg_0, __arg_1) => disconnect_Callback_2(mthis, __arg_0, __arg_1);
+
+  static observe_Callback_0(mthis) native "MutationObserver_observe_Callback";
+  observe_Callback_0_(mthis) => observe_Callback_0(mthis);
+
+  static observe_Callback_1(mthis, __arg_0) native "MutationObserver_observe_Callback";
+  observe_Callback_1_(mthis, __arg_0) => observe_Callback_1(mthis, __arg_0);
+
+  static observe_Callback_2(mthis, __arg_0, __arg_1) native "MutationObserver_observe_Callback";
+  observe_Callback_2_(mthis, __arg_0, __arg_1) => observe_Callback_2(mthis, __arg_0, __arg_1);
+
+  static observe_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "MutationObserver_observe_Callback";
+  observe_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => observe_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static observe_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "MutationObserver_observe_Callback";
+  observe_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => observe_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static takeRecords_Callback_0(mthis) native "MutationObserver_takeRecords_Callback";
+  takeRecords_Callback_0_(mthis) => takeRecords_Callback_0(mthis);
+
+  static takeRecords_Callback_1(mthis, __arg_0) native "MutationObserver_takeRecords_Callback";
+  takeRecords_Callback_1_(mthis, __arg_0) => takeRecords_Callback_1(mthis, __arg_0);
+
+  static takeRecords_Callback_2(mthis, __arg_0, __arg_1) native "MutationObserver_takeRecords_Callback";
+  takeRecords_Callback_2_(mthis, __arg_0, __arg_1) => takeRecords_Callback_2(mthis, __arg_0, __arg_1);
+
 }
 
 class BlinkMutationRecord {
+  static final instance = new BlinkMutationRecord();
+
   static addedNodes_Getter(mthis) native "MutationRecord_addedNodes_Getter";
+  addedNodes_Getter_(mthis) => addedNodes_Getter(mthis);
 
   static attributeName_Getter(mthis) native "MutationRecord_attributeName_Getter";
+  attributeName_Getter_(mthis) => attributeName_Getter(mthis);
 
   static attributeNamespace_Getter(mthis) native "MutationRecord_attributeNamespace_Getter";
+  attributeNamespace_Getter_(mthis) => attributeNamespace_Getter(mthis);
 
   static nextSibling_Getter(mthis) native "MutationRecord_nextSibling_Getter";
+  nextSibling_Getter_(mthis) => nextSibling_Getter(mthis);
 
   static oldValue_Getter(mthis) native "MutationRecord_oldValue_Getter";
+  oldValue_Getter_(mthis) => oldValue_Getter(mthis);
 
   static previousSibling_Getter(mthis) native "MutationRecord_previousSibling_Getter";
+  previousSibling_Getter_(mthis) => previousSibling_Getter(mthis);
 
   static removedNodes_Getter(mthis) native "MutationRecord_removedNodes_Getter";
+  removedNodes_Getter_(mthis) => removedNodes_Getter(mthis);
 
   static target_Getter(mthis) native "MutationRecord_target_Getter";
+  target_Getter_(mthis) => target_Getter(mthis);
 
   static type_Getter(mthis) native "MutationRecord_type_Getter";
+  type_Getter_(mthis) => type_Getter(mthis);
+
 }
 
 class BlinkNamedNodeMap {
+  static final instance = new BlinkNamedNodeMap();
+
+  static $__getter___Callback_1(mthis, __arg_0) native "NamedNodeMap___getter___Callback";
+  $__getter___Callback_1_(mthis, __arg_0) => $__getter___Callback_1(mthis, __arg_0);
+
+  static getNamedItemNS_Callback_0(mthis) native "NamedNodeMap_getNamedItemNS_Callback";
+  getNamedItemNS_Callback_0_(mthis) => getNamedItemNS_Callback_0(mthis);
+
+  static getNamedItemNS_Callback_1(mthis, __arg_0) native "NamedNodeMap_getNamedItemNS_Callback";
+  getNamedItemNS_Callback_1_(mthis, __arg_0) => getNamedItemNS_Callback_1(mthis, __arg_0);
+
+  static getNamedItemNS_Callback_2(mthis, __arg_0, __arg_1) native "NamedNodeMap_getNamedItemNS_Callback";
+  getNamedItemNS_Callback_2_(mthis, __arg_0, __arg_1) => getNamedItemNS_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getNamedItemNS_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "NamedNodeMap_getNamedItemNS_Callback";
+  getNamedItemNS_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getNamedItemNS_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static getNamedItemNS_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "NamedNodeMap_getNamedItemNS_Callback";
+  getNamedItemNS_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => getNamedItemNS_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static getNamedItem_Callback_0(mthis) native "NamedNodeMap_getNamedItem_Callback";
+  getNamedItem_Callback_0_(mthis) => getNamedItem_Callback_0(mthis);
+
+  static getNamedItem_Callback_1(mthis, __arg_0) native "NamedNodeMap_getNamedItem_Callback";
+  getNamedItem_Callback_1_(mthis, __arg_0) => getNamedItem_Callback_1(mthis, __arg_0);
+
+  static getNamedItem_Callback_2(mthis, __arg_0, __arg_1) native "NamedNodeMap_getNamedItem_Callback";
+  getNamedItem_Callback_2_(mthis, __arg_0, __arg_1) => getNamedItem_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getNamedItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "NamedNodeMap_getNamedItem_Callback";
+  getNamedItem_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getNamedItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static item_Callback_0(mthis) native "NamedNodeMap_item_Callback";
+  item_Callback_0_(mthis) => item_Callback_0(mthis);
+
+  static item_Callback_1(mthis, __arg_0) native "NamedNodeMap_item_Callback";
+  item_Callback_1_(mthis, __arg_0) => item_Callback_1(mthis, __arg_0);
+
+  static item_Callback_2(mthis, __arg_0, __arg_1) native "NamedNodeMap_item_Callback";
+  item_Callback_2_(mthis, __arg_0, __arg_1) => item_Callback_2(mthis, __arg_0, __arg_1);
+
+  static item_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "NamedNodeMap_item_Callback";
+  item_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => item_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
   static length_Getter(mthis) native "NamedNodeMap_length_Getter";
+  length_Getter_(mthis) => length_Getter(mthis);
 
-  static $__getter___Callback_1(mthis, name) native "NamedNodeMap___getter___Callback";
+  static removeNamedItemNS_Callback_0(mthis) native "NamedNodeMap_removeNamedItemNS_Callback";
+  removeNamedItemNS_Callback_0_(mthis) => removeNamedItemNS_Callback_0(mthis);
 
-  static getNamedItem_Callback_1(mthis, name) native "NamedNodeMap_getNamedItem_Callback";
+  static removeNamedItemNS_Callback_1(mthis, __arg_0) native "NamedNodeMap_removeNamedItemNS_Callback";
+  removeNamedItemNS_Callback_1_(mthis, __arg_0) => removeNamedItemNS_Callback_1(mthis, __arg_0);
 
-  static getNamedItemNS_Callback_2(mthis, namespaceURI, localName) native "NamedNodeMap_getNamedItemNS_Callback";
+  static removeNamedItemNS_Callback_2(mthis, __arg_0, __arg_1) native "NamedNodeMap_removeNamedItemNS_Callback";
+  removeNamedItemNS_Callback_2_(mthis, __arg_0, __arg_1) => removeNamedItemNS_Callback_2(mthis, __arg_0, __arg_1);
 
-  static item_Callback_1(mthis, index) native "NamedNodeMap_item_Callback";
+  static removeNamedItemNS_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "NamedNodeMap_removeNamedItemNS_Callback";
+  removeNamedItemNS_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => removeNamedItemNS_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
-  static removeNamedItem_Callback_1(mthis, name) native "NamedNodeMap_removeNamedItem_Callback";
+  static removeNamedItemNS_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "NamedNodeMap_removeNamedItemNS_Callback";
+  removeNamedItemNS_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => removeNamedItemNS_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
 
-  static removeNamedItemNS_Callback_2(mthis, namespaceURI, localName) native "NamedNodeMap_removeNamedItemNS_Callback";
+  static removeNamedItem_Callback_0(mthis) native "NamedNodeMap_removeNamedItem_Callback";
+  removeNamedItem_Callback_0_(mthis) => removeNamedItem_Callback_0(mthis);
 
-  static setNamedItem_Callback_1(mthis, node) native "NamedNodeMap_setNamedItem_Callback";
+  static removeNamedItem_Callback_1(mthis, __arg_0) native "NamedNodeMap_removeNamedItem_Callback";
+  removeNamedItem_Callback_1_(mthis, __arg_0) => removeNamedItem_Callback_1(mthis, __arg_0);
 
-  static setNamedItemNS_Callback_1(mthis, node) native "NamedNodeMap_setNamedItemNS_Callback";
-}
+  static removeNamedItem_Callback_2(mthis, __arg_0, __arg_1) native "NamedNodeMap_removeNamedItem_Callback";
+  removeNamedItem_Callback_2_(mthis, __arg_0, __arg_1) => removeNamedItem_Callback_2(mthis, __arg_0, __arg_1);
 
-class BlinkNavigatorCPU {
-  static hardwareConcurrency_Getter(mthis) native "NavigatorCPU_hardwareConcurrency_Getter";
-}
+  static removeNamedItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "NamedNodeMap_removeNamedItem_Callback";
+  removeNamedItem_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => removeNamedItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
-class BlinkNavigatorID {
-  static appCodeName_Getter(mthis) native "Navigator_appCodeName_Getter";
+  static setNamedItemNS_Callback_0(mthis) native "NamedNodeMap_setNamedItemNS_Callback";
+  setNamedItemNS_Callback_0_(mthis) => setNamedItemNS_Callback_0(mthis);
 
-  static appName_Getter(mthis) native "Navigator_appName_Getter";
+  static setNamedItemNS_Callback_1(mthis, __arg_0) native "NamedNodeMap_setNamedItemNS_Callback";
+  setNamedItemNS_Callback_1_(mthis, __arg_0) => setNamedItemNS_Callback_1(mthis, __arg_0);
 
-  static appVersion_Getter(mthis) native "Navigator_appVersion_Getter";
+  static setNamedItemNS_Callback_2(mthis, __arg_0, __arg_1) native "NamedNodeMap_setNamedItemNS_Callback";
+  setNamedItemNS_Callback_2_(mthis, __arg_0, __arg_1) => setNamedItemNS_Callback_2(mthis, __arg_0, __arg_1);
 
-  static dartEnabled_Getter(mthis) native "Navigator_dartEnabled_Getter";
+  static setNamedItemNS_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "NamedNodeMap_setNamedItemNS_Callback";
+  setNamedItemNS_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => setNamedItemNS_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
-  static platform_Getter(mthis) native "Navigator_platform_Getter";
+  static setNamedItem_Callback_0(mthis) native "NamedNodeMap_setNamedItem_Callback";
+  setNamedItem_Callback_0_(mthis) => setNamedItem_Callback_0(mthis);
 
-  static product_Getter(mthis) native "Navigator_product_Getter";
+  static setNamedItem_Callback_1(mthis, __arg_0) native "NamedNodeMap_setNamedItem_Callback";
+  setNamedItem_Callback_1_(mthis, __arg_0) => setNamedItem_Callback_1(mthis, __arg_0);
 
-  static userAgent_Getter(mthis) native "Navigator_userAgent_Getter";
-}
+  static setNamedItem_Callback_2(mthis, __arg_0, __arg_1) native "NamedNodeMap_setNamedItem_Callback";
+  setNamedItem_Callback_2_(mthis, __arg_0, __arg_1) => setNamedItem_Callback_2(mthis, __arg_0, __arg_1);
 
-class BlinkNavigatorLanguage {
-  static language_Getter(mthis) native "NavigatorLanguage_language_Getter";
+  static setNamedItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "NamedNodeMap_setNamedItem_Callback";
+  setNamedItem_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => setNamedItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
-  static languages_Getter(mthis) native "NavigatorLanguage_languages_Getter";
-}
-
-class BlinkNavigatorOnLine {
-  static onLine_Getter(mthis) native "NavigatorOnLine_onLine_Getter";
 }
 
 class BlinkNavigator {
-  static connection_Getter(mthis) native "Navigator_connection_Getter";
-
-  static cookieEnabled_Getter(mthis) native "Navigator_cookieEnabled_Getter";
-
-  static credentials_Getter(mthis) native "Navigator_credentials_Getter";
-
-  static doNotTrack_Getter(mthis) native "Navigator_doNotTrack_Getter";
-
-  static geofencing_Getter(mthis) native "Navigator_geofencing_Getter";
-
-  static geolocation_Getter(mthis) native "Navigator_geolocation_Getter";
-
-  static maxTouchPoints_Getter(mthis) native "Navigator_maxTouchPoints_Getter";
-
-  static mimeTypes_Getter(mthis) native "Navigator_mimeTypes_Getter";
-
-  static productSub_Getter(mthis) native "Navigator_productSub_Getter";
-
-  static push_Getter(mthis) native "Navigator_push_Getter";
-
-  static serviceWorker_Getter(mthis) native "Navigator_serviceWorker_Getter";
-
-  static storageQuota_Getter(mthis) native "Navigator_storageQuota_Getter";
-
-  static vendor_Getter(mthis) native "Navigator_vendor_Getter";
-
-  static vendorSub_Getter(mthis) native "Navigator_vendorSub_Getter";
-
-  static webkitPersistentStorage_Getter(mthis) native "Navigator_webkitPersistentStorage_Getter";
-
-  static webkitTemporaryStorage_Getter(mthis) native "Navigator_webkitTemporaryStorage_Getter";
-
-  static getBattery_Callback(mthis) native "Navigator_getBattery_Callback";
-
-  static getGamepads_Callback(mthis) native "Navigator_getGamepads_Callback";
-
-  static getStorageUpdates_Callback(mthis) native "Navigator_getStorageUpdates_Callback";
-
-  static isProtocolHandlerRegistered_Callback_2(mthis, scheme, url) native "Navigator_isProtocolHandlerRegistered_Callback";
-
-  static registerProtocolHandler_Callback_3(mthis, scheme, url, title) native "Navigator_registerProtocolHandler_Callback";
-
-  static sendBeacon_Callback_2(mthis, url, data) native "Navigator_sendBeacon_Callback";
-
-  static unregisterProtocolHandler_Callback_2(mthis, scheme, url) native "Navigator_unregisterProtocolHandler_Callback";
-
-  static webkitGetUserMedia_Callback_3(mthis, options, successCallback, errorCallback) native "Navigator_webkitGetUserMedia_Callback";
+  static final instance = new BlinkNavigator();
 
   static appCodeName_Getter(mthis) native "Navigator_appCodeName_Getter";
+  appCodeName_Getter_(mthis) => appCodeName_Getter(mthis);
 
   static appName_Getter(mthis) native "Navigator_appName_Getter";
+  appName_Getter_(mthis) => appName_Getter(mthis);
 
   static appVersion_Getter(mthis) native "Navigator_appVersion_Getter";
+  appVersion_Getter_(mthis) => appVersion_Getter(mthis);
+
+  static connection_Getter(mthis) native "Navigator_connection_Getter";
+  connection_Getter_(mthis) => connection_Getter(mthis);
+
+  static cookieEnabled_Getter(mthis) native "Navigator_cookieEnabled_Getter";
+  cookieEnabled_Getter_(mthis) => cookieEnabled_Getter(mthis);
+
+  static credentials_Getter(mthis) native "Navigator_credentials_Getter";
+  credentials_Getter_(mthis) => credentials_Getter(mthis);
 
   static dartEnabled_Getter(mthis) native "Navigator_dartEnabled_Getter";
+  dartEnabled_Getter_(mthis) => dartEnabled_Getter(mthis);
 
-  static platform_Getter(mthis) native "Navigator_platform_Getter";
+  static doNotTrack_Getter(mthis) native "Navigator_doNotTrack_Getter";
+  doNotTrack_Getter_(mthis) => doNotTrack_Getter(mthis);
 
-  static product_Getter(mthis) native "Navigator_product_Getter";
+  static geofencing_Getter(mthis) native "Navigator_geofencing_Getter";
+  geofencing_Getter_(mthis) => geofencing_Getter(mthis);
 
-  static userAgent_Getter(mthis) native "Navigator_userAgent_Getter";
+  static geolocation_Getter(mthis) native "Navigator_geolocation_Getter";
+  geolocation_Getter_(mthis) => geolocation_Getter(mthis);
+
+  static getBattery_Callback_0(mthis) native "Navigator_getBattery_Callback";
+  getBattery_Callback_0_(mthis) => getBattery_Callback_0(mthis);
+
+  static getBattery_Callback_1(mthis, __arg_0) native "Navigator_getBattery_Callback";
+  getBattery_Callback_1_(mthis, __arg_0) => getBattery_Callback_1(mthis, __arg_0);
+
+  static getBattery_Callback_2(mthis, __arg_0, __arg_1) native "Navigator_getBattery_Callback";
+  getBattery_Callback_2_(mthis, __arg_0, __arg_1) => getBattery_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getGamepads_Callback_0(mthis) native "Navigator_getGamepads_Callback";
+  getGamepads_Callback_0_(mthis) => getGamepads_Callback_0(mthis);
+
+  static getGamepads_Callback_1(mthis, __arg_0) native "Navigator_getGamepads_Callback";
+  getGamepads_Callback_1_(mthis, __arg_0) => getGamepads_Callback_1(mthis, __arg_0);
+
+  static getGamepads_Callback_2(mthis, __arg_0, __arg_1) native "Navigator_getGamepads_Callback";
+  getGamepads_Callback_2_(mthis, __arg_0, __arg_1) => getGamepads_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getStorageUpdates_Callback_0(mthis) native "Navigator_getStorageUpdates_Callback";
+  getStorageUpdates_Callback_0_(mthis) => getStorageUpdates_Callback_0(mthis);
+
+  static getStorageUpdates_Callback_1(mthis, __arg_0) native "Navigator_getStorageUpdates_Callback";
+  getStorageUpdates_Callback_1_(mthis, __arg_0) => getStorageUpdates_Callback_1(mthis, __arg_0);
+
+  static getStorageUpdates_Callback_2(mthis, __arg_0, __arg_1) native "Navigator_getStorageUpdates_Callback";
+  getStorageUpdates_Callback_2_(mthis, __arg_0, __arg_1) => getStorageUpdates_Callback_2(mthis, __arg_0, __arg_1);
+
+  static hardwareConcurrency_Getter(mthis) native "Navigator_hardwareConcurrency_Getter";
+  hardwareConcurrency_Getter_(mthis) => hardwareConcurrency_Getter(mthis);
+
+  static isProtocolHandlerRegistered_Callback_0(mthis) native "Navigator_isProtocolHandlerRegistered_Callback";
+  isProtocolHandlerRegistered_Callback_0_(mthis) => isProtocolHandlerRegistered_Callback_0(mthis);
+
+  static isProtocolHandlerRegistered_Callback_1(mthis, __arg_0) native "Navigator_isProtocolHandlerRegistered_Callback";
+  isProtocolHandlerRegistered_Callback_1_(mthis, __arg_0) => isProtocolHandlerRegistered_Callback_1(mthis, __arg_0);
+
+  static isProtocolHandlerRegistered_Callback_2(mthis, __arg_0, __arg_1) native "Navigator_isProtocolHandlerRegistered_Callback";
+  isProtocolHandlerRegistered_Callback_2_(mthis, __arg_0, __arg_1) => isProtocolHandlerRegistered_Callback_2(mthis, __arg_0, __arg_1);
+
+  static isProtocolHandlerRegistered_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Navigator_isProtocolHandlerRegistered_Callback";
+  isProtocolHandlerRegistered_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => isProtocolHandlerRegistered_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static isProtocolHandlerRegistered_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Navigator_isProtocolHandlerRegistered_Callback";
+  isProtocolHandlerRegistered_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => isProtocolHandlerRegistered_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static javaEnabled_Callback_0(mthis) native "Navigator_javaEnabled_Callback";
+  javaEnabled_Callback_0_(mthis) => javaEnabled_Callback_0(mthis);
+
+  static javaEnabled_Callback_1(mthis, __arg_0) native "Navigator_javaEnabled_Callback";
+  javaEnabled_Callback_1_(mthis, __arg_0) => javaEnabled_Callback_1(mthis, __arg_0);
+
+  static javaEnabled_Callback_2(mthis, __arg_0, __arg_1) native "Navigator_javaEnabled_Callback";
+  javaEnabled_Callback_2_(mthis, __arg_0, __arg_1) => javaEnabled_Callback_2(mthis, __arg_0, __arg_1);
 
   static language_Getter(mthis) native "Navigator_language_Getter";
+  language_Getter_(mthis) => language_Getter(mthis);
 
   static languages_Getter(mthis) native "Navigator_languages_Getter";
+  languages_Getter_(mthis) => languages_Getter(mthis);
+
+  static maxTouchPoints_Getter(mthis) native "Navigator_maxTouchPoints_Getter";
+  maxTouchPoints_Getter_(mthis) => maxTouchPoints_Getter(mthis);
+
+  static mimeTypes_Getter(mthis) native "Navigator_mimeTypes_Getter";
+  mimeTypes_Getter_(mthis) => mimeTypes_Getter(mthis);
 
   static onLine_Getter(mthis) native "Navigator_onLine_Getter";
+  onLine_Getter_(mthis) => onLine_Getter(mthis);
+
+  static platform_Getter(mthis) native "Navigator_platform_Getter";
+  platform_Getter_(mthis) => platform_Getter(mthis);
+
+  static plugins_Getter(mthis) native "Navigator_plugins_Getter";
+  plugins_Getter_(mthis) => plugins_Getter(mthis);
+
+  static productSub_Getter(mthis) native "Navigator_productSub_Getter";
+  productSub_Getter_(mthis) => productSub_Getter(mthis);
+
+  static product_Getter(mthis) native "Navigator_product_Getter";
+  product_Getter_(mthis) => product_Getter(mthis);
+
+  static push_Getter(mthis) native "Navigator_push_Getter";
+  push_Getter_(mthis) => push_Getter(mthis);
+
+  static registerProtocolHandler_Callback_1(mthis, __arg_0) native "Navigator_registerProtocolHandler_Callback";
+  registerProtocolHandler_Callback_1_(mthis, __arg_0) => registerProtocolHandler_Callback_1(mthis, __arg_0);
+
+  static registerProtocolHandler_Callback_2(mthis, __arg_0, __arg_1) native "Navigator_registerProtocolHandler_Callback";
+  registerProtocolHandler_Callback_2_(mthis, __arg_0, __arg_1) => registerProtocolHandler_Callback_2(mthis, __arg_0, __arg_1);
+
+  static registerProtocolHandler_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Navigator_registerProtocolHandler_Callback";
+  registerProtocolHandler_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => registerProtocolHandler_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static registerProtocolHandler_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Navigator_registerProtocolHandler_Callback";
+  registerProtocolHandler_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => registerProtocolHandler_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static registerProtocolHandler_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "Navigator_registerProtocolHandler_Callback";
+  registerProtocolHandler_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => registerProtocolHandler_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static sendBeacon_Callback_0(mthis) native "Navigator_sendBeacon_Callback";
+  sendBeacon_Callback_0_(mthis) => sendBeacon_Callback_0(mthis);
+
+  static sendBeacon_Callback_1(mthis, __arg_0) native "Navigator_sendBeacon_Callback";
+  sendBeacon_Callback_1_(mthis, __arg_0) => sendBeacon_Callback_1(mthis, __arg_0);
+
+  static sendBeacon_Callback_2(mthis, __arg_0, __arg_1) native "Navigator_sendBeacon_Callback";
+  sendBeacon_Callback_2_(mthis, __arg_0, __arg_1) => sendBeacon_Callback_2(mthis, __arg_0, __arg_1);
+
+  static sendBeacon_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Navigator_sendBeacon_Callback";
+  sendBeacon_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => sendBeacon_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static sendBeacon_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Navigator_sendBeacon_Callback";
+  sendBeacon_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => sendBeacon_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static serviceWorker_Getter(mthis) native "Navigator_serviceWorker_Getter";
+  serviceWorker_Getter_(mthis) => serviceWorker_Getter(mthis);
+
+  static storageQuota_Getter(mthis) native "Navigator_storageQuota_Getter";
+  storageQuota_Getter_(mthis) => storageQuota_Getter(mthis);
+
+  static unregisterProtocolHandler_Callback_0(mthis) native "Navigator_unregisterProtocolHandler_Callback";
+  unregisterProtocolHandler_Callback_0_(mthis) => unregisterProtocolHandler_Callback_0(mthis);
+
+  static unregisterProtocolHandler_Callback_1(mthis, __arg_0) native "Navigator_unregisterProtocolHandler_Callback";
+  unregisterProtocolHandler_Callback_1_(mthis, __arg_0) => unregisterProtocolHandler_Callback_1(mthis, __arg_0);
+
+  static unregisterProtocolHandler_Callback_2(mthis, __arg_0, __arg_1) native "Navigator_unregisterProtocolHandler_Callback";
+  unregisterProtocolHandler_Callback_2_(mthis, __arg_0, __arg_1) => unregisterProtocolHandler_Callback_2(mthis, __arg_0, __arg_1);
+
+  static unregisterProtocolHandler_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Navigator_unregisterProtocolHandler_Callback";
+  unregisterProtocolHandler_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => unregisterProtocolHandler_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static unregisterProtocolHandler_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Navigator_unregisterProtocolHandler_Callback";
+  unregisterProtocolHandler_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => unregisterProtocolHandler_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static userAgent_Getter(mthis) native "Navigator_userAgent_Getter";
+  userAgent_Getter_(mthis) => userAgent_Getter(mthis);
+
+  static vendorSub_Getter(mthis) native "Navigator_vendorSub_Getter";
+  vendorSub_Getter_(mthis) => vendorSub_Getter(mthis);
+
+  static vendor_Getter(mthis) native "Navigator_vendor_Getter";
+  vendor_Getter_(mthis) => vendor_Getter(mthis);
+
+  static vibrate_Callback_0(mthis) native "Navigator_vibrate_Callback";
+  vibrate_Callback_0_(mthis) => vibrate_Callback_0(mthis);
+
+  static vibrate_Callback_1(mthis, __arg_0) native "Navigator_vibrate_Callback";
+  vibrate_Callback_1_(mthis, __arg_0) => vibrate_Callback_1(mthis, __arg_0);
+
+  static vibrate_Callback_2(mthis, __arg_0, __arg_1) native "Navigator_vibrate_Callback";
+  vibrate_Callback_2_(mthis, __arg_0, __arg_1) => vibrate_Callback_2(mthis, __arg_0, __arg_1);
+
+  static vibrate_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Navigator_vibrate_Callback";
+  vibrate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => vibrate_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static webkitGetGamepads_Callback_0(mthis) native "Navigator_webkitGetGamepads_Callback";
+  webkitGetGamepads_Callback_0_(mthis) => webkitGetGamepads_Callback_0(mthis);
+
+  static webkitGetGamepads_Callback_1(mthis, __arg_0) native "Navigator_webkitGetGamepads_Callback";
+  webkitGetGamepads_Callback_1_(mthis, __arg_0) => webkitGetGamepads_Callback_1(mthis, __arg_0);
+
+  static webkitGetGamepads_Callback_2(mthis, __arg_0, __arg_1) native "Navigator_webkitGetGamepads_Callback";
+  webkitGetGamepads_Callback_2_(mthis, __arg_0, __arg_1) => webkitGetGamepads_Callback_2(mthis, __arg_0, __arg_1);
+
+  static webkitGetUserMedia_Callback_1(mthis, __arg_0) native "Navigator_webkitGetUserMedia_Callback";
+  webkitGetUserMedia_Callback_1_(mthis, __arg_0) => webkitGetUserMedia_Callback_1(mthis, __arg_0);
+
+  static webkitGetUserMedia_Callback_2(mthis, __arg_0, __arg_1) native "Navigator_webkitGetUserMedia_Callback";
+  webkitGetUserMedia_Callback_2_(mthis, __arg_0, __arg_1) => webkitGetUserMedia_Callback_2(mthis, __arg_0, __arg_1);
+
+  static webkitGetUserMedia_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Navigator_webkitGetUserMedia_Callback";
+  webkitGetUserMedia_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => webkitGetUserMedia_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static webkitGetUserMedia_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Navigator_webkitGetUserMedia_Callback";
+  webkitGetUserMedia_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => webkitGetUserMedia_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static webkitGetUserMedia_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "Navigator_webkitGetUserMedia_Callback";
+  webkitGetUserMedia_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => webkitGetUserMedia_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static webkitPersistentStorage_Getter(mthis) native "Navigator_webkitPersistentStorage_Getter";
+  webkitPersistentStorage_Getter_(mthis) => webkitPersistentStorage_Getter(mthis);
+
+  static webkitTemporaryStorage_Getter(mthis) native "Navigator_webkitTemporaryStorage_Getter";
+  webkitTemporaryStorage_Getter_(mthis) => webkitTemporaryStorage_Getter(mthis);
+
 }
 
 class BlinkNavigatorUserMediaError {
+  static final instance = new BlinkNavigatorUserMediaError();
+
   static constraintName_Getter(mthis) native "NavigatorUserMediaError_constraintName_Getter";
+  constraintName_Getter_(mthis) => constraintName_Getter(mthis);
 
   static message_Getter(mthis) native "NavigatorUserMediaError_message_Getter";
+  message_Getter_(mthis) => message_Getter(mthis);
 
   static name_Getter(mthis) native "NavigatorUserMediaError_name_Getter";
+  name_Getter_(mthis) => name_Getter(mthis);
+
 }
 
-class BlinkNetworkInformation {
+class BlinkNetworkInformation extends BlinkEventTarget {
+  static final instance = new BlinkNetworkInformation();
+
+  static ontypechange_Getter(mthis) native "NetworkInformation_ontypechange_Getter";
+  ontypechange_Getter_(mthis) => ontypechange_Getter(mthis);
+
+  static ontypechange_Setter(mthis, __arg_0) native "NetworkInformation_ontypechange_Setter";
+  ontypechange_Setter_(mthis, __arg_0) => ontypechange_Setter(mthis, __arg_0);
+
   static type_Getter(mthis) native "NetworkInformation_type_Getter";
+  type_Getter_(mthis) => type_Getter(mthis);
+
 }
 
-class BlinkNodeFilter {}
+class BlinkNode extends BlinkEventTarget {
+  static final instance = new BlinkNode();
+
+  static appendChild_Callback_0(mthis) native "Node_appendChild_Callback";
+  appendChild_Callback_0_(mthis) => appendChild_Callback_0(mthis);
+
+  static appendChild_Callback_1(mthis, __arg_0) native "Node_appendChild_Callback";
+  appendChild_Callback_1_(mthis, __arg_0) => appendChild_Callback_1(mthis, __arg_0);
+
+  static appendChild_Callback_2(mthis, __arg_0, __arg_1) native "Node_appendChild_Callback";
+  appendChild_Callback_2_(mthis, __arg_0, __arg_1) => appendChild_Callback_2(mthis, __arg_0, __arg_1);
+
+  static appendChild_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Node_appendChild_Callback";
+  appendChild_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => appendChild_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static baseURI_Getter(mthis) native "Node_baseURI_Getter";
+  baseURI_Getter_(mthis) => baseURI_Getter(mthis);
+
+  static childNodes_Getter(mthis) native "Node_childNodes_Getter";
+  childNodes_Getter_(mthis) => childNodes_Getter(mthis);
+
+  static cloneNode_Callback_0(mthis) native "Node_cloneNode_Callback";
+  cloneNode_Callback_0_(mthis) => cloneNode_Callback_0(mthis);
+
+  static cloneNode_Callback_1(mthis, __arg_0) native "Node_cloneNode_Callback";
+  cloneNode_Callback_1_(mthis, __arg_0) => cloneNode_Callback_1(mthis, __arg_0);
+
+  static cloneNode_Callback_2(mthis, __arg_0, __arg_1) native "Node_cloneNode_Callback";
+  cloneNode_Callback_2_(mthis, __arg_0, __arg_1) => cloneNode_Callback_2(mthis, __arg_0, __arg_1);
+
+  static cloneNode_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Node_cloneNode_Callback";
+  cloneNode_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => cloneNode_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static contains_Callback_0(mthis) native "Node_contains_Callback";
+  contains_Callback_0_(mthis) => contains_Callback_0(mthis);
+
+  static contains_Callback_1(mthis, __arg_0) native "Node_contains_Callback";
+  contains_Callback_1_(mthis, __arg_0) => contains_Callback_1(mthis, __arg_0);
+
+  static contains_Callback_2(mthis, __arg_0, __arg_1) native "Node_contains_Callback";
+  contains_Callback_2_(mthis, __arg_0, __arg_1) => contains_Callback_2(mthis, __arg_0, __arg_1);
+
+  static contains_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Node_contains_Callback";
+  contains_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => contains_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static firstChild_Getter(mthis) native "Node_firstChild_Getter";
+  firstChild_Getter_(mthis) => firstChild_Getter(mthis);
+
+  static hasChildNodes_Callback_0(mthis) native "Node_hasChildNodes_Callback";
+  hasChildNodes_Callback_0_(mthis) => hasChildNodes_Callback_0(mthis);
+
+  static hasChildNodes_Callback_1(mthis, __arg_0) native "Node_hasChildNodes_Callback";
+  hasChildNodes_Callback_1_(mthis, __arg_0) => hasChildNodes_Callback_1(mthis, __arg_0);
+
+  static hasChildNodes_Callback_2(mthis, __arg_0, __arg_1) native "Node_hasChildNodes_Callback";
+  hasChildNodes_Callback_2_(mthis, __arg_0, __arg_1) => hasChildNodes_Callback_2(mthis, __arg_0, __arg_1);
+
+  static insertBefore_Callback_0(mthis) native "Node_insertBefore_Callback";
+  insertBefore_Callback_0_(mthis) => insertBefore_Callback_0(mthis);
+
+  static insertBefore_Callback_1(mthis, __arg_0) native "Node_insertBefore_Callback";
+  insertBefore_Callback_1_(mthis, __arg_0) => insertBefore_Callback_1(mthis, __arg_0);
+
+  static insertBefore_Callback_2(mthis, __arg_0, __arg_1) native "Node_insertBefore_Callback";
+  insertBefore_Callback_2_(mthis, __arg_0, __arg_1) => insertBefore_Callback_2(mthis, __arg_0, __arg_1);
+
+  static insertBefore_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Node_insertBefore_Callback";
+  insertBefore_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => insertBefore_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static insertBefore_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Node_insertBefore_Callback";
+  insertBefore_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => insertBefore_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static lastChild_Getter(mthis) native "Node_lastChild_Getter";
+  lastChild_Getter_(mthis) => lastChild_Getter(mthis);
+
+  static localName_Getter(mthis) native "Node_localName_Getter";
+  localName_Getter_(mthis) => localName_Getter(mthis);
+
+  static namespaceURI_Getter(mthis) native "Node_namespaceURI_Getter";
+  namespaceURI_Getter_(mthis) => namespaceURI_Getter(mthis);
+
+  static nextSibling_Getter(mthis) native "Node_nextSibling_Getter";
+  nextSibling_Getter_(mthis) => nextSibling_Getter(mthis);
+
+  static nodeName_Getter(mthis) native "Node_nodeName_Getter";
+  nodeName_Getter_(mthis) => nodeName_Getter(mthis);
+
+  static nodeType_Getter(mthis) native "Node_nodeType_Getter";
+  nodeType_Getter_(mthis) => nodeType_Getter(mthis);
+
+  static nodeValue_Getter(mthis) native "Node_nodeValue_Getter";
+  nodeValue_Getter_(mthis) => nodeValue_Getter(mthis);
+
+  static nodeValue_Setter(mthis, __arg_0) native "Node_nodeValue_Setter";
+  nodeValue_Setter_(mthis, __arg_0) => nodeValue_Setter(mthis, __arg_0);
+
+  static ownerDocument_Getter(mthis) native "Node_ownerDocument_Getter";
+  ownerDocument_Getter_(mthis) => ownerDocument_Getter(mthis);
+
+  static parentElement_Getter(mthis) native "Node_parentElement_Getter";
+  parentElement_Getter_(mthis) => parentElement_Getter(mthis);
+
+  static parentNode_Getter(mthis) native "Node_parentNode_Getter";
+  parentNode_Getter_(mthis) => parentNode_Getter(mthis);
+
+  static previousSibling_Getter(mthis) native "Node_previousSibling_Getter";
+  previousSibling_Getter_(mthis) => previousSibling_Getter(mthis);
+
+  static removeChild_Callback_0(mthis) native "Node_removeChild_Callback";
+  removeChild_Callback_0_(mthis) => removeChild_Callback_0(mthis);
+
+  static removeChild_Callback_1(mthis, __arg_0) native "Node_removeChild_Callback";
+  removeChild_Callback_1_(mthis, __arg_0) => removeChild_Callback_1(mthis, __arg_0);
+
+  static removeChild_Callback_2(mthis, __arg_0, __arg_1) native "Node_removeChild_Callback";
+  removeChild_Callback_2_(mthis, __arg_0, __arg_1) => removeChild_Callback_2(mthis, __arg_0, __arg_1);
+
+  static removeChild_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Node_removeChild_Callback";
+  removeChild_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => removeChild_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static replaceChild_Callback_0(mthis) native "Node_replaceChild_Callback";
+  replaceChild_Callback_0_(mthis) => replaceChild_Callback_0(mthis);
+
+  static replaceChild_Callback_1(mthis, __arg_0) native "Node_replaceChild_Callback";
+  replaceChild_Callback_1_(mthis, __arg_0) => replaceChild_Callback_1(mthis, __arg_0);
+
+  static replaceChild_Callback_2(mthis, __arg_0, __arg_1) native "Node_replaceChild_Callback";
+  replaceChild_Callback_2_(mthis, __arg_0, __arg_1) => replaceChild_Callback_2(mthis, __arg_0, __arg_1);
+
+  static replaceChild_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Node_replaceChild_Callback";
+  replaceChild_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => replaceChild_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static replaceChild_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Node_replaceChild_Callback";
+  replaceChild_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => replaceChild_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static textContent_Getter(mthis) native "Node_textContent_Getter";
+  textContent_Getter_(mthis) => textContent_Getter(mthis);
+
+  static textContent_Setter(mthis, __arg_0) native "Node_textContent_Setter";
+  textContent_Setter_(mthis, __arg_0) => textContent_Setter(mthis, __arg_0);
+
+}
+
+class BlinkNodeFilter {
+  static final instance = new BlinkNodeFilter();
+
+}
 
 class BlinkNodeIterator {
+  static final instance = new BlinkNodeIterator();
+
+  static detach_Callback_0(mthis) native "NodeIterator_detach_Callback";
+  detach_Callback_0_(mthis) => detach_Callback_0(mthis);
+
+  static detach_Callback_1(mthis, __arg_0) native "NodeIterator_detach_Callback";
+  detach_Callback_1_(mthis, __arg_0) => detach_Callback_1(mthis, __arg_0);
+
+  static detach_Callback_2(mthis, __arg_0, __arg_1) native "NodeIterator_detach_Callback";
+  detach_Callback_2_(mthis, __arg_0, __arg_1) => detach_Callback_2(mthis, __arg_0, __arg_1);
+
+  static nextNode_Callback_0(mthis) native "NodeIterator_nextNode_Callback";
+  nextNode_Callback_0_(mthis) => nextNode_Callback_0(mthis);
+
+  static nextNode_Callback_1(mthis, __arg_0) native "NodeIterator_nextNode_Callback";
+  nextNode_Callback_1_(mthis, __arg_0) => nextNode_Callback_1(mthis, __arg_0);
+
+  static nextNode_Callback_2(mthis, __arg_0, __arg_1) native "NodeIterator_nextNode_Callback";
+  nextNode_Callback_2_(mthis, __arg_0, __arg_1) => nextNode_Callback_2(mthis, __arg_0, __arg_1);
+
   static pointerBeforeReferenceNode_Getter(mthis) native "NodeIterator_pointerBeforeReferenceNode_Getter";
+  pointerBeforeReferenceNode_Getter_(mthis) => pointerBeforeReferenceNode_Getter(mthis);
+
+  static previousNode_Callback_0(mthis) native "NodeIterator_previousNode_Callback";
+  previousNode_Callback_0_(mthis) => previousNode_Callback_0(mthis);
+
+  static previousNode_Callback_1(mthis, __arg_0) native "NodeIterator_previousNode_Callback";
+  previousNode_Callback_1_(mthis, __arg_0) => previousNode_Callback_1(mthis, __arg_0);
+
+  static previousNode_Callback_2(mthis, __arg_0, __arg_1) native "NodeIterator_previousNode_Callback";
+  previousNode_Callback_2_(mthis, __arg_0, __arg_1) => previousNode_Callback_2(mthis, __arg_0, __arg_1);
 
   static referenceNode_Getter(mthis) native "NodeIterator_referenceNode_Getter";
+  referenceNode_Getter_(mthis) => referenceNode_Getter(mthis);
 
   static root_Getter(mthis) native "NodeIterator_root_Getter";
+  root_Getter_(mthis) => root_Getter(mthis);
 
   static whatToShow_Getter(mthis) native "NodeIterator_whatToShow_Getter";
+  whatToShow_Getter_(mthis) => whatToShow_Getter(mthis);
 
-  static detach_Callback(mthis) native "NodeIterator_detach_Callback";
-
-  static nextNode_Callback(mthis) native "NodeIterator_nextNode_Callback";
-
-  static previousNode_Callback(mthis) native "NodeIterator_previousNode_Callback";
 }
 
 class BlinkNodeList {
-  static length_Getter(mthis) native "NodeList_length_Getter";
+  static final instance = new BlinkNodeList();
 
-  static item_Callback_1(mthis, index) native "NodeList_item_Callback";
+  static $__getter___Callback_1(mthis, __arg_0) native "NodeList___getter___Callback";
+  $__getter___Callback_1_(mthis, __arg_0) => $__getter___Callback_1(mthis, __arg_0);
+
+  static item_Callback_0(mthis) native "NodeList_item_Callback";
+  item_Callback_0_(mthis) => item_Callback_0(mthis);
+
+  static item_Callback_1(mthis, __arg_0) native "NodeList_item_Callback";
+  item_Callback_1_(mthis, __arg_0) => item_Callback_1(mthis, __arg_0);
+
+  static item_Callback_2(mthis, __arg_0, __arg_1) native "NodeList_item_Callback";
+  item_Callback_2_(mthis, __arg_0, __arg_1) => item_Callback_2(mthis, __arg_0, __arg_1);
+
+  static item_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "NodeList_item_Callback";
+  item_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => item_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static length_Getter(mthis) native "NodeList_length_Getter";
+  length_Getter_(mthis) => length_Getter(mthis);
+
 }
 
-class BlinkNotation {}
+class BlinkNotation extends BlinkNode {
+  static final instance = new BlinkNotation();
 
-class BlinkNotification {
-  static constructorCallback_2(title, options) native "Notification_constructorCallback";
+}
+
+class BlinkNotification extends BlinkEventTarget {
+  static final instance = new BlinkNotification();
 
   static body_Getter(mthis) native "Notification_body_Getter";
+  body_Getter_(mthis) => body_Getter(mthis);
+
+  static close_Callback_0(mthis) native "Notification_close_Callback";
+  close_Callback_0_(mthis) => close_Callback_0(mthis);
+
+  static close_Callback_1(mthis, __arg_0) native "Notification_close_Callback";
+  close_Callback_1_(mthis, __arg_0) => close_Callback_1(mthis, __arg_0);
+
+  static close_Callback_2(mthis, __arg_0, __arg_1) native "Notification_close_Callback";
+  close_Callback_2_(mthis, __arg_0, __arg_1) => close_Callback_2(mthis, __arg_0, __arg_1);
+
+  static constructorCallback_0() native "Notification_constructorCallback";
+  constructorCallback_0_() => constructorCallback_0();
+
+  static constructorCallback_1(__arg_0) native "Notification_constructorCallback";
+  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+
+  static constructorCallback_2(__arg_0, __arg_1) native "Notification_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+
+  static constructorCallback_3(__arg_0, __arg_1, __arg_2) native "Notification_constructorCallback";
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => constructorCallback_3(__arg_0, __arg_1, __arg_2);
+
+  static constructorCallback_4(__arg_0, __arg_1, __arg_2, __arg_3) native "Notification_constructorCallback";
+  constructorCallback_4_(__arg_0, __arg_1, __arg_2, __arg_3) => constructorCallback_4(__arg_0, __arg_1, __arg_2, __arg_3);
 
   static dir_Getter(mthis) native "Notification_dir_Getter";
+  dir_Getter_(mthis) => dir_Getter(mthis);
 
   static icon_Getter(mthis) native "Notification_icon_Getter";
+  icon_Getter_(mthis) => icon_Getter(mthis);
 
   static lang_Getter(mthis) native "Notification_lang_Getter";
+  lang_Getter_(mthis) => lang_Getter(mthis);
 
-  static permission_Getter(mthis) native "Notification_permission_Getter";
+  static onclick_Getter(mthis) native "Notification_onclick_Getter";
+  onclick_Getter_(mthis) => onclick_Getter(mthis);
+
+  static onclick_Setter(mthis, __arg_0) native "Notification_onclick_Setter";
+  onclick_Setter_(mthis, __arg_0) => onclick_Setter(mthis, __arg_0);
+
+  static onclose_Getter(mthis) native "Notification_onclose_Getter";
+  onclose_Getter_(mthis) => onclose_Getter(mthis);
+
+  static onclose_Setter(mthis, __arg_0) native "Notification_onclose_Setter";
+  onclose_Setter_(mthis, __arg_0) => onclose_Setter(mthis, __arg_0);
+
+  static onerror_Getter(mthis) native "Notification_onerror_Getter";
+  onerror_Getter_(mthis) => onerror_Getter(mthis);
+
+  static onerror_Setter(mthis, __arg_0) native "Notification_onerror_Setter";
+  onerror_Setter_(mthis, __arg_0) => onerror_Setter(mthis, __arg_0);
+
+  static onshow_Getter(mthis) native "Notification_onshow_Getter";
+  onshow_Getter_(mthis) => onshow_Getter(mthis);
+
+  static onshow_Setter(mthis, __arg_0) native "Notification_onshow_Setter";
+  onshow_Setter_(mthis, __arg_0) => onshow_Setter(mthis, __arg_0);
+
+  static permission_Getter() native "Notification_permission_Getter";
+  permission_Getter_() => permission_Getter();
+
+  static requestPermission_Callback_0() native "Notification_requestPermission_Callback";
+  requestPermission_Callback_0_() => requestPermission_Callback_0();
+
+  static requestPermission_Callback_1(__arg_0) native "Notification_requestPermission_Callback";
+  requestPermission_Callback_1_(__arg_0) => requestPermission_Callback_1(__arg_0);
+
+  static requestPermission_Callback_2(__arg_0, __arg_1) native "Notification_requestPermission_Callback";
+  requestPermission_Callback_2_(__arg_0, __arg_1) => requestPermission_Callback_2(__arg_0, __arg_1);
+
+  static requestPermission_Callback_3(__arg_0, __arg_1, __arg_2) native "Notification_requestPermission_Callback";
+  requestPermission_Callback_3_(__arg_0, __arg_1, __arg_2) => requestPermission_Callback_3(__arg_0, __arg_1, __arg_2);
 
   static tag_Getter(mthis) native "Notification_tag_Getter";
+  tag_Getter_(mthis) => tag_Getter(mthis);
 
   static title_Getter(mthis) native "Notification_title_Getter";
+  title_Getter_(mthis) => title_Getter(mthis);
 
-  static close_Callback(mthis) native "Notification_close_Callback";
-
-  static requestPermission_Callback_1(callback) native "Notification_requestPermission_Callback";
-
-  static requestPermission_Callback() native "Notification_requestPermission_Callback";
 }
 
-class BlinkOESElementIndexUint {}
+class BlinkOESElementIndexUint {
+  static final instance = new BlinkOESElementIndexUint();
 
-class BlinkOESStandardDerivatives {}
+}
 
-class BlinkOESTextureFloat {}
+class BlinkOESStandardDerivatives {
+  static final instance = new BlinkOESStandardDerivatives();
 
-class BlinkOESTextureFloatLinear {}
+}
 
-class BlinkOESTextureHalfFloat {}
+class BlinkOESTextureFloat {
+  static final instance = new BlinkOESTextureFloat();
 
-class BlinkOESTextureHalfFloatLinear {}
+}
+
+class BlinkOESTextureFloatLinear {
+  static final instance = new BlinkOESTextureFloatLinear();
+
+}
+
+class BlinkOESTextureHalfFloat {
+  static final instance = new BlinkOESTextureHalfFloat();
+
+}
+
+class BlinkOESTextureHalfFloatLinear {
+  static final instance = new BlinkOESTextureHalfFloatLinear();
+
+}
 
 class BlinkOESVertexArrayObject {
-  static bindVertexArrayOES_Callback_1(mthis, arrayObject) native "OESVertexArrayObject_bindVertexArrayOES_Callback";
+  static final instance = new BlinkOESVertexArrayObject();
 
-  static createVertexArrayOES_Callback(mthis) native "OESVertexArrayObject_createVertexArrayOES_Callback";
+  static bindVertexArrayOES_Callback_0(mthis) native "OESVertexArrayObject_bindVertexArrayOES_Callback";
+  bindVertexArrayOES_Callback_0_(mthis) => bindVertexArrayOES_Callback_0(mthis);
 
-  static deleteVertexArrayOES_Callback_1(mthis, arrayObject) native "OESVertexArrayObject_deleteVertexArrayOES_Callback";
+  static bindVertexArrayOES_Callback_1(mthis, __arg_0) native "OESVertexArrayObject_bindVertexArrayOES_Callback";
+  bindVertexArrayOES_Callback_1_(mthis, __arg_0) => bindVertexArrayOES_Callback_1(mthis, __arg_0);
 
-  static isVertexArrayOES_Callback_1(mthis, arrayObject) native "OESVertexArrayObject_isVertexArrayOES_Callback";
+  static bindVertexArrayOES_Callback_2(mthis, __arg_0, __arg_1) native "OESVertexArrayObject_bindVertexArrayOES_Callback";
+  bindVertexArrayOES_Callback_2_(mthis, __arg_0, __arg_1) => bindVertexArrayOES_Callback_2(mthis, __arg_0, __arg_1);
+
+  static bindVertexArrayOES_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "OESVertexArrayObject_bindVertexArrayOES_Callback";
+  bindVertexArrayOES_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => bindVertexArrayOES_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static createVertexArrayOES_Callback_0(mthis) native "OESVertexArrayObject_createVertexArrayOES_Callback";
+  createVertexArrayOES_Callback_0_(mthis) => createVertexArrayOES_Callback_0(mthis);
+
+  static createVertexArrayOES_Callback_1(mthis, __arg_0) native "OESVertexArrayObject_createVertexArrayOES_Callback";
+  createVertexArrayOES_Callback_1_(mthis, __arg_0) => createVertexArrayOES_Callback_1(mthis, __arg_0);
+
+  static createVertexArrayOES_Callback_2(mthis, __arg_0, __arg_1) native "OESVertexArrayObject_createVertexArrayOES_Callback";
+  createVertexArrayOES_Callback_2_(mthis, __arg_0, __arg_1) => createVertexArrayOES_Callback_2(mthis, __arg_0, __arg_1);
+
+  static deleteVertexArrayOES_Callback_0(mthis) native "OESVertexArrayObject_deleteVertexArrayOES_Callback";
+  deleteVertexArrayOES_Callback_0_(mthis) => deleteVertexArrayOES_Callback_0(mthis);
+
+  static deleteVertexArrayOES_Callback_1(mthis, __arg_0) native "OESVertexArrayObject_deleteVertexArrayOES_Callback";
+  deleteVertexArrayOES_Callback_1_(mthis, __arg_0) => deleteVertexArrayOES_Callback_1(mthis, __arg_0);
+
+  static deleteVertexArrayOES_Callback_2(mthis, __arg_0, __arg_1) native "OESVertexArrayObject_deleteVertexArrayOES_Callback";
+  deleteVertexArrayOES_Callback_2_(mthis, __arg_0, __arg_1) => deleteVertexArrayOES_Callback_2(mthis, __arg_0, __arg_1);
+
+  static deleteVertexArrayOES_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "OESVertexArrayObject_deleteVertexArrayOES_Callback";
+  deleteVertexArrayOES_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => deleteVertexArrayOES_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static isVertexArrayOES_Callback_0(mthis) native "OESVertexArrayObject_isVertexArrayOES_Callback";
+  isVertexArrayOES_Callback_0_(mthis) => isVertexArrayOES_Callback_0(mthis);
+
+  static isVertexArrayOES_Callback_1(mthis, __arg_0) native "OESVertexArrayObject_isVertexArrayOES_Callback";
+  isVertexArrayOES_Callback_1_(mthis, __arg_0) => isVertexArrayOES_Callback_1(mthis, __arg_0);
+
+  static isVertexArrayOES_Callback_2(mthis, __arg_0, __arg_1) native "OESVertexArrayObject_isVertexArrayOES_Callback";
+  isVertexArrayOES_Callback_2_(mthis, __arg_0, __arg_1) => isVertexArrayOES_Callback_2(mthis, __arg_0, __arg_1);
+
+  static isVertexArrayOES_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "OESVertexArrayObject_isVertexArrayOES_Callback";
+  isVertexArrayOES_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => isVertexArrayOES_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
 }
 
-class BlinkOfflineAudioCompletionEvent {
+class BlinkOfflineAudioCompletionEvent extends BlinkEvent {
+  static final instance = new BlinkOfflineAudioCompletionEvent();
+
   static renderedBuffer_Getter(mthis) native "OfflineAudioCompletionEvent_renderedBuffer_Getter";
+  renderedBuffer_Getter_(mthis) => renderedBuffer_Getter(mthis);
+
 }
 
-class BlinkOfflineAudioContext {
-  static constructorCallback_3(numberOfChannels, numberOfFrames, sampleRate) native "OfflineAudioContext_constructorCallback";
+class BlinkOfflineAudioContext extends BlinkAudioContext {
+  static final instance = new BlinkOfflineAudioContext();
+
+  static constructorCallback_1(__arg_0) native "OfflineAudioContext_constructorCallback";
+  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+
+  static constructorCallback_2(__arg_0, __arg_1) native "OfflineAudioContext_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+
+  static constructorCallback_3(__arg_0, __arg_1, __arg_2) native "OfflineAudioContext_constructorCallback";
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => constructorCallback_3(__arg_0, __arg_1, __arg_2);
+
+  static constructorCallback_4(__arg_0, __arg_1, __arg_2, __arg_3) native "OfflineAudioContext_constructorCallback";
+  constructorCallback_4_(__arg_0, __arg_1, __arg_2, __arg_3) => constructorCallback_4(__arg_0, __arg_1, __arg_2, __arg_3);
+
+  static constructorCallback_5(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "OfflineAudioContext_constructorCallback";
+  constructorCallback_5_(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => constructorCallback_5(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
 }
 
-class BlinkOscillatorNode {
+class BlinkOscillatorNode extends BlinkAudioSourceNode {
+  static final instance = new BlinkOscillatorNode();
+
   static detune_Getter(mthis) native "OscillatorNode_detune_Getter";
+  detune_Getter_(mthis) => detune_Getter(mthis);
 
   static frequency_Getter(mthis) native "OscillatorNode_frequency_Getter";
+  frequency_Getter_(mthis) => frequency_Getter(mthis);
+
+  static noteOff_Callback_0(mthis) native "OscillatorNode_noteOff_Callback";
+  noteOff_Callback_0_(mthis) => noteOff_Callback_0(mthis);
+
+  static noteOff_Callback_1(mthis, __arg_0) native "OscillatorNode_noteOff_Callback";
+  noteOff_Callback_1_(mthis, __arg_0) => noteOff_Callback_1(mthis, __arg_0);
+
+  static noteOff_Callback_2(mthis, __arg_0, __arg_1) native "OscillatorNode_noteOff_Callback";
+  noteOff_Callback_2_(mthis, __arg_0, __arg_1) => noteOff_Callback_2(mthis, __arg_0, __arg_1);
+
+  static noteOff_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "OscillatorNode_noteOff_Callback";
+  noteOff_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => noteOff_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static noteOn_Callback_0(mthis) native "OscillatorNode_noteOn_Callback";
+  noteOn_Callback_0_(mthis) => noteOn_Callback_0(mthis);
+
+  static noteOn_Callback_1(mthis, __arg_0) native "OscillatorNode_noteOn_Callback";
+  noteOn_Callback_1_(mthis, __arg_0) => noteOn_Callback_1(mthis, __arg_0);
+
+  static noteOn_Callback_2(mthis, __arg_0, __arg_1) native "OscillatorNode_noteOn_Callback";
+  noteOn_Callback_2_(mthis, __arg_0, __arg_1) => noteOn_Callback_2(mthis, __arg_0, __arg_1);
+
+  static noteOn_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "OscillatorNode_noteOn_Callback";
+  noteOn_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => noteOn_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static onended_Getter(mthis) native "OscillatorNode_onended_Getter";
+  onended_Getter_(mthis) => onended_Getter(mthis);
+
+  static onended_Setter(mthis, __arg_0) native "OscillatorNode_onended_Setter";
+  onended_Setter_(mthis, __arg_0) => onended_Setter(mthis, __arg_0);
+
+  static setPeriodicWave_Callback_0(mthis) native "OscillatorNode_setPeriodicWave_Callback";
+  setPeriodicWave_Callback_0_(mthis) => setPeriodicWave_Callback_0(mthis);
+
+  static setPeriodicWave_Callback_1(mthis, __arg_0) native "OscillatorNode_setPeriodicWave_Callback";
+  setPeriodicWave_Callback_1_(mthis, __arg_0) => setPeriodicWave_Callback_1(mthis, __arg_0);
+
+  static setPeriodicWave_Callback_2(mthis, __arg_0, __arg_1) native "OscillatorNode_setPeriodicWave_Callback";
+  setPeriodicWave_Callback_2_(mthis, __arg_0, __arg_1) => setPeriodicWave_Callback_2(mthis, __arg_0, __arg_1);
+
+  static setPeriodicWave_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "OscillatorNode_setPeriodicWave_Callback";
+  setPeriodicWave_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => setPeriodicWave_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static start_Callback_0(mthis) native "OscillatorNode_start_Callback";
+  start_Callback_0_(mthis) => start_Callback_0(mthis);
+
+  static start_Callback_1(mthis, __arg_0) native "OscillatorNode_start_Callback";
+  start_Callback_1_(mthis, __arg_0) => start_Callback_1(mthis, __arg_0);
+
+  static start_Callback_2(mthis, __arg_0, __arg_1) native "OscillatorNode_start_Callback";
+  start_Callback_2_(mthis, __arg_0, __arg_1) => start_Callback_2(mthis, __arg_0, __arg_1);
+
+  static start_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "OscillatorNode_start_Callback";
+  start_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => start_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static stop_Callback_0(mthis) native "OscillatorNode_stop_Callback";
+  stop_Callback_0_(mthis) => stop_Callback_0(mthis);
+
+  static stop_Callback_1(mthis, __arg_0) native "OscillatorNode_stop_Callback";
+  stop_Callback_1_(mthis, __arg_0) => stop_Callback_1(mthis, __arg_0);
+
+  static stop_Callback_2(mthis, __arg_0, __arg_1) native "OscillatorNode_stop_Callback";
+  stop_Callback_2_(mthis, __arg_0, __arg_1) => stop_Callback_2(mthis, __arg_0, __arg_1);
+
+  static stop_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "OscillatorNode_stop_Callback";
+  stop_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => stop_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
   static type_Getter(mthis) native "OscillatorNode_type_Getter";
+  type_Getter_(mthis) => type_Getter(mthis);
 
-  static type_Setter(mthis, value) native "OscillatorNode_type_Setter";
+  static type_Setter(mthis, __arg_0) native "OscillatorNode_type_Setter";
+  type_Setter_(mthis, __arg_0) => type_Setter(mthis, __arg_0);
 
-  static noteOff_Callback_1(mthis, when) native "OscillatorNode_noteOff_Callback";
-
-  static noteOn_Callback_1(mthis, when) native "OscillatorNode_noteOn_Callback";
-
-  static setPeriodicWave_Callback_1(mthis, periodicWave) native "OscillatorNode_setPeriodicWave_Callback";
-
-  static start_Callback_1(mthis, when) native "OscillatorNode_start_Callback";
-
-  static start_Callback(mthis) native "OscillatorNode_start_Callback";
-
-  static stop_Callback_1(mthis, when) native "OscillatorNode_stop_Callback";
-
-  static stop_Callback(mthis) native "OscillatorNode_stop_Callback";
 }
 
-class BlinkOverflowEvent {
-  static constructorCallback(type, options) native "OverflowEvent_constructorCallback";
+class BlinkOverflowEvent extends BlinkEvent {
+  static final instance = new BlinkOverflowEvent();
+
+  static constructorCallback_2(__arg_0, __arg_1) native "OverflowEvent_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
 
   static horizontalOverflow_Getter(mthis) native "OverflowEvent_horizontalOverflow_Getter";
+  horizontalOverflow_Getter_(mthis) => horizontalOverflow_Getter(mthis);
 
   static orient_Getter(mthis) native "OverflowEvent_orient_Getter";
+  orient_Getter_(mthis) => orient_Getter(mthis);
 
   static verticalOverflow_Getter(mthis) native "OverflowEvent_verticalOverflow_Getter";
+  verticalOverflow_Getter_(mthis) => verticalOverflow_Getter(mthis);
+
 }
 
-class BlinkPagePopupController {}
+class BlinkPagePopupController {
+  static final instance = new BlinkPagePopupController();
 
-class BlinkPageTransitionEvent {
-  static constructorCallback(type, options) native "PageTransitionEvent_constructorCallback";
+  static closePopup_Callback_0(mthis) native "PagePopupController_closePopup_Callback";
+  closePopup_Callback_0_(mthis) => closePopup_Callback_0(mthis);
+
+  static closePopup_Callback_1(mthis, __arg_0) native "PagePopupController_closePopup_Callback";
+  closePopup_Callback_1_(mthis, __arg_0) => closePopup_Callback_1(mthis, __arg_0);
+
+  static closePopup_Callback_2(mthis, __arg_0, __arg_1) native "PagePopupController_closePopup_Callback";
+  closePopup_Callback_2_(mthis, __arg_0, __arg_1) => closePopup_Callback_2(mthis, __arg_0, __arg_1);
+
+  static formatMonth_Callback_0(mthis) native "PagePopupController_formatMonth_Callback";
+  formatMonth_Callback_0_(mthis) => formatMonth_Callback_0(mthis);
+
+  static formatMonth_Callback_1(mthis, __arg_0) native "PagePopupController_formatMonth_Callback";
+  formatMonth_Callback_1_(mthis, __arg_0) => formatMonth_Callback_1(mthis, __arg_0);
+
+  static formatMonth_Callback_2(mthis, __arg_0, __arg_1) native "PagePopupController_formatMonth_Callback";
+  formatMonth_Callback_2_(mthis, __arg_0, __arg_1) => formatMonth_Callback_2(mthis, __arg_0, __arg_1);
+
+  static formatMonth_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "PagePopupController_formatMonth_Callback";
+  formatMonth_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => formatMonth_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static formatMonth_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "PagePopupController_formatMonth_Callback";
+  formatMonth_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => formatMonth_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static formatShortMonth_Callback_0(mthis) native "PagePopupController_formatShortMonth_Callback";
+  formatShortMonth_Callback_0_(mthis) => formatShortMonth_Callback_0(mthis);
+
+  static formatShortMonth_Callback_1(mthis, __arg_0) native "PagePopupController_formatShortMonth_Callback";
+  formatShortMonth_Callback_1_(mthis, __arg_0) => formatShortMonth_Callback_1(mthis, __arg_0);
+
+  static formatShortMonth_Callback_2(mthis, __arg_0, __arg_1) native "PagePopupController_formatShortMonth_Callback";
+  formatShortMonth_Callback_2_(mthis, __arg_0, __arg_1) => formatShortMonth_Callback_2(mthis, __arg_0, __arg_1);
+
+  static formatShortMonth_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "PagePopupController_formatShortMonth_Callback";
+  formatShortMonth_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => formatShortMonth_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static formatShortMonth_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "PagePopupController_formatShortMonth_Callback";
+  formatShortMonth_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => formatShortMonth_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static histogramEnumeration_Callback_1(mthis, __arg_0) native "PagePopupController_histogramEnumeration_Callback";
+  histogramEnumeration_Callback_1_(mthis, __arg_0) => histogramEnumeration_Callback_1(mthis, __arg_0);
+
+  static histogramEnumeration_Callback_2(mthis, __arg_0, __arg_1) native "PagePopupController_histogramEnumeration_Callback";
+  histogramEnumeration_Callback_2_(mthis, __arg_0, __arg_1) => histogramEnumeration_Callback_2(mthis, __arg_0, __arg_1);
+
+  static histogramEnumeration_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "PagePopupController_histogramEnumeration_Callback";
+  histogramEnumeration_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => histogramEnumeration_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static histogramEnumeration_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "PagePopupController_histogramEnumeration_Callback";
+  histogramEnumeration_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => histogramEnumeration_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static histogramEnumeration_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "PagePopupController_histogramEnumeration_Callback";
+  histogramEnumeration_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => histogramEnumeration_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static localizeNumberString_Callback_0(mthis) native "PagePopupController_localizeNumberString_Callback";
+  localizeNumberString_Callback_0_(mthis) => localizeNumberString_Callback_0(mthis);
+
+  static localizeNumberString_Callback_1(mthis, __arg_0) native "PagePopupController_localizeNumberString_Callback";
+  localizeNumberString_Callback_1_(mthis, __arg_0) => localizeNumberString_Callback_1(mthis, __arg_0);
+
+  static localizeNumberString_Callback_2(mthis, __arg_0, __arg_1) native "PagePopupController_localizeNumberString_Callback";
+  localizeNumberString_Callback_2_(mthis, __arg_0, __arg_1) => localizeNumberString_Callback_2(mthis, __arg_0, __arg_1);
+
+  static localizeNumberString_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "PagePopupController_localizeNumberString_Callback";
+  localizeNumberString_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => localizeNumberString_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static setValueAndClosePopup_Callback_0(mthis) native "PagePopupController_setValueAndClosePopup_Callback";
+  setValueAndClosePopup_Callback_0_(mthis) => setValueAndClosePopup_Callback_0(mthis);
+
+  static setValueAndClosePopup_Callback_1(mthis, __arg_0) native "PagePopupController_setValueAndClosePopup_Callback";
+  setValueAndClosePopup_Callback_1_(mthis, __arg_0) => setValueAndClosePopup_Callback_1(mthis, __arg_0);
+
+  static setValueAndClosePopup_Callback_2(mthis, __arg_0, __arg_1) native "PagePopupController_setValueAndClosePopup_Callback";
+  setValueAndClosePopup_Callback_2_(mthis, __arg_0, __arg_1) => setValueAndClosePopup_Callback_2(mthis, __arg_0, __arg_1);
+
+  static setValueAndClosePopup_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "PagePopupController_setValueAndClosePopup_Callback";
+  setValueAndClosePopup_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => setValueAndClosePopup_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static setValueAndClosePopup_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "PagePopupController_setValueAndClosePopup_Callback";
+  setValueAndClosePopup_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => setValueAndClosePopup_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static setValue_Callback_0(mthis) native "PagePopupController_setValue_Callback";
+  setValue_Callback_0_(mthis) => setValue_Callback_0(mthis);
+
+  static setValue_Callback_1(mthis, __arg_0) native "PagePopupController_setValue_Callback";
+  setValue_Callback_1_(mthis, __arg_0) => setValue_Callback_1(mthis, __arg_0);
+
+  static setValue_Callback_2(mthis, __arg_0, __arg_1) native "PagePopupController_setValue_Callback";
+  setValue_Callback_2_(mthis, __arg_0, __arg_1) => setValue_Callback_2(mthis, __arg_0, __arg_1);
+
+  static setValue_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "PagePopupController_setValue_Callback";
+  setValue_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => setValue_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+}
+
+class BlinkPageTransitionEvent extends BlinkEvent {
+  static final instance = new BlinkPageTransitionEvent();
+
+  static constructorCallback_2(__arg_0, __arg_1) native "PageTransitionEvent_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
 
   static persisted_Getter(mthis) native "PageTransitionEvent_persisted_Getter";
+  persisted_Getter_(mthis) => persisted_Getter(mthis);
+
 }
 
-class BlinkPannerNode {
-  static coneInnerAngle_Getter(mthis) native "PannerNode_coneInnerAngle_Getter";
+class BlinkPannerNode extends BlinkAudioNode {
+  static final instance = new BlinkPannerNode();
 
-  static coneInnerAngle_Setter(mthis, value) native "PannerNode_coneInnerAngle_Setter";
+  static coneInnerAngle_Getter(mthis) native "PannerNode_coneInnerAngle_Getter";
+  coneInnerAngle_Getter_(mthis) => coneInnerAngle_Getter(mthis);
+
+  static coneInnerAngle_Setter(mthis, __arg_0) native "PannerNode_coneInnerAngle_Setter";
+  coneInnerAngle_Setter_(mthis, __arg_0) => coneInnerAngle_Setter(mthis, __arg_0);
 
   static coneOuterAngle_Getter(mthis) native "PannerNode_coneOuterAngle_Getter";
+  coneOuterAngle_Getter_(mthis) => coneOuterAngle_Getter(mthis);
 
-  static coneOuterAngle_Setter(mthis, value) native "PannerNode_coneOuterAngle_Setter";
+  static coneOuterAngle_Setter(mthis, __arg_0) native "PannerNode_coneOuterAngle_Setter";
+  coneOuterAngle_Setter_(mthis, __arg_0) => coneOuterAngle_Setter(mthis, __arg_0);
 
   static coneOuterGain_Getter(mthis) native "PannerNode_coneOuterGain_Getter";
+  coneOuterGain_Getter_(mthis) => coneOuterGain_Getter(mthis);
 
-  static coneOuterGain_Setter(mthis, value) native "PannerNode_coneOuterGain_Setter";
+  static coneOuterGain_Setter(mthis, __arg_0) native "PannerNode_coneOuterGain_Setter";
+  coneOuterGain_Setter_(mthis, __arg_0) => coneOuterGain_Setter(mthis, __arg_0);
 
   static distanceModel_Getter(mthis) native "PannerNode_distanceModel_Getter";
+  distanceModel_Getter_(mthis) => distanceModel_Getter(mthis);
 
-  static distanceModel_Setter(mthis, value) native "PannerNode_distanceModel_Setter";
+  static distanceModel_Setter(mthis, __arg_0) native "PannerNode_distanceModel_Setter";
+  distanceModel_Setter_(mthis, __arg_0) => distanceModel_Setter(mthis, __arg_0);
 
   static maxDistance_Getter(mthis) native "PannerNode_maxDistance_Getter";
+  maxDistance_Getter_(mthis) => maxDistance_Getter(mthis);
 
-  static maxDistance_Setter(mthis, value) native "PannerNode_maxDistance_Setter";
+  static maxDistance_Setter(mthis, __arg_0) native "PannerNode_maxDistance_Setter";
+  maxDistance_Setter_(mthis, __arg_0) => maxDistance_Setter(mthis, __arg_0);
 
   static panningModel_Getter(mthis) native "PannerNode_panningModel_Getter";
+  panningModel_Getter_(mthis) => panningModel_Getter(mthis);
 
-  static panningModel_Setter(mthis, value) native "PannerNode_panningModel_Setter";
+  static panningModel_Setter(mthis, __arg_0) native "PannerNode_panningModel_Setter";
+  panningModel_Setter_(mthis, __arg_0) => panningModel_Setter(mthis, __arg_0);
 
   static refDistance_Getter(mthis) native "PannerNode_refDistance_Getter";
+  refDistance_Getter_(mthis) => refDistance_Getter(mthis);
 
-  static refDistance_Setter(mthis, value) native "PannerNode_refDistance_Setter";
+  static refDistance_Setter(mthis, __arg_0) native "PannerNode_refDistance_Setter";
+  refDistance_Setter_(mthis, __arg_0) => refDistance_Setter(mthis, __arg_0);
 
   static rolloffFactor_Getter(mthis) native "PannerNode_rolloffFactor_Getter";
+  rolloffFactor_Getter_(mthis) => rolloffFactor_Getter(mthis);
 
-  static rolloffFactor_Setter(mthis, value) native "PannerNode_rolloffFactor_Setter";
+  static rolloffFactor_Setter(mthis, __arg_0) native "PannerNode_rolloffFactor_Setter";
+  rolloffFactor_Setter_(mthis, __arg_0) => rolloffFactor_Setter(mthis, __arg_0);
 
-  static setOrientation_Callback_3(mthis, x, y, z) native "PannerNode_setOrientation_Callback";
+  static setOrientation_Callback_1(mthis, __arg_0) native "PannerNode_setOrientation_Callback";
+  setOrientation_Callback_1_(mthis, __arg_0) => setOrientation_Callback_1(mthis, __arg_0);
 
-  static setPosition_Callback_3(mthis, x, y, z) native "PannerNode_setPosition_Callback";
+  static setOrientation_Callback_2(mthis, __arg_0, __arg_1) native "PannerNode_setOrientation_Callback";
+  setOrientation_Callback_2_(mthis, __arg_0, __arg_1) => setOrientation_Callback_2(mthis, __arg_0, __arg_1);
 
-  static setVelocity_Callback_3(mthis, x, y, z) native "PannerNode_setVelocity_Callback";
+  static setOrientation_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "PannerNode_setOrientation_Callback";
+  setOrientation_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => setOrientation_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static setOrientation_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "PannerNode_setOrientation_Callback";
+  setOrientation_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => setOrientation_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static setOrientation_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "PannerNode_setOrientation_Callback";
+  setOrientation_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => setOrientation_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static setPosition_Callback_1(mthis, __arg_0) native "PannerNode_setPosition_Callback";
+  setPosition_Callback_1_(mthis, __arg_0) => setPosition_Callback_1(mthis, __arg_0);
+
+  static setPosition_Callback_2(mthis, __arg_0, __arg_1) native "PannerNode_setPosition_Callback";
+  setPosition_Callback_2_(mthis, __arg_0, __arg_1) => setPosition_Callback_2(mthis, __arg_0, __arg_1);
+
+  static setPosition_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "PannerNode_setPosition_Callback";
+  setPosition_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => setPosition_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static setPosition_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "PannerNode_setPosition_Callback";
+  setPosition_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => setPosition_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static setPosition_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "PannerNode_setPosition_Callback";
+  setPosition_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => setPosition_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static setVelocity_Callback_1(mthis, __arg_0) native "PannerNode_setVelocity_Callback";
+  setVelocity_Callback_1_(mthis, __arg_0) => setVelocity_Callback_1(mthis, __arg_0);
+
+  static setVelocity_Callback_2(mthis, __arg_0, __arg_1) native "PannerNode_setVelocity_Callback";
+  setVelocity_Callback_2_(mthis, __arg_0, __arg_1) => setVelocity_Callback_2(mthis, __arg_0, __arg_1);
+
+  static setVelocity_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "PannerNode_setVelocity_Callback";
+  setVelocity_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => setVelocity_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static setVelocity_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "PannerNode_setVelocity_Callback";
+  setVelocity_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => setVelocity_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static setVelocity_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "PannerNode_setVelocity_Callback";
+  setVelocity_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => setVelocity_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
 }
 
 class BlinkPath2D {
-  static constructorCallback() native "Path2D_constructorCallback";
+  static final instance = new BlinkPath2D();
 
-  static constructorCallback_1(path_OR_text) native "Path2D_constructorCallback";
+  static addPath_Callback_0(mthis) native "Path2D_addPath_Callback";
+  addPath_Callback_0_(mthis) => addPath_Callback_0(mthis);
 
-  static addPath_Callback_2(mthis, path, transform) native "Path2D_addPath_Callback";
+  static addPath_Callback_1(mthis, __arg_0) native "Path2D_addPath_Callback";
+  addPath_Callback_1_(mthis, __arg_0) => addPath_Callback_1(mthis, __arg_0);
 
-  static addPath_Callback_1(mthis, path) native "Path2D_addPath_Callback";
+  static addPath_Callback_2(mthis, __arg_0, __arg_1) native "Path2D_addPath_Callback";
+  addPath_Callback_2_(mthis, __arg_0, __arg_1) => addPath_Callback_2(mthis, __arg_0, __arg_1);
 
-  static arc_Callback_6(mthis, x, y, radius, startAngle, endAngle, anticlockwise) native "Path2D_arc_Callback";
+  static addPath_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Path2D_addPath_Callback";
+  addPath_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => addPath_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
-  static arcTo_Callback_5(mthis, x1, y1, x2, y2, radius) native "Path2D_arcTo_Callback";
+  static addPath_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Path2D_addPath_Callback";
+  addPath_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => addPath_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
 
-  static bezierCurveTo_Callback_6(mthis, cp1x, cp1y, cp2x, cp2y, x, y) native "Path2D_bezierCurveTo_Callback";
+  static arcTo_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Path2D_arcTo_Callback";
+  arcTo_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => arcTo_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
-  static closePath_Callback(mthis) native "Path2D_closePath_Callback";
+  static arcTo_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Path2D_arcTo_Callback";
+  arcTo_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => arcTo_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
 
-  static ellipse_Callback_8(mthis, x, y, radiusX, radiusY, rotation, startAngle, endAngle, anticlockwise) native "Path2D_ellipse_Callback";
+  static arcTo_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "Path2D_arcTo_Callback";
+  arcTo_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => arcTo_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
 
-  static lineTo_Callback_2(mthis, x, y) native "Path2D_lineTo_Callback";
+  static arcTo_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "Path2D_arcTo_Callback";
+  arcTo_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => arcTo_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
 
-  static moveTo_Callback_2(mthis, x, y) native "Path2D_moveTo_Callback";
+  static arcTo_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) native "Path2D_arcTo_Callback";
+  arcTo_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => arcTo_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6);
 
-  static quadraticCurveTo_Callback_4(mthis, cpx, cpy, x, y) native "Path2D_quadraticCurveTo_Callback";
+  static arc_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Path2D_arc_Callback";
+  arc_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => arc_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
-  static rect_Callback_4(mthis, x, y, width, height) native "Path2D_rect_Callback";
+  static arc_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Path2D_arc_Callback";
+  arc_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => arc_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static arc_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "Path2D_arc_Callback";
+  arc_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => arc_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static arc_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "Path2D_arc_Callback";
+  arc_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => arc_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static arc_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) native "Path2D_arc_Callback";
+  arc_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => arc_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6);
+
+  static arc_Callback_8(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) native "Path2D_arc_Callback";
+  arc_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => arc_Callback_8(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7);
+
+  static bezierCurveTo_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Path2D_bezierCurveTo_Callback";
+  bezierCurveTo_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => bezierCurveTo_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static bezierCurveTo_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "Path2D_bezierCurveTo_Callback";
+  bezierCurveTo_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => bezierCurveTo_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static bezierCurveTo_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "Path2D_bezierCurveTo_Callback";
+  bezierCurveTo_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => bezierCurveTo_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static bezierCurveTo_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) native "Path2D_bezierCurveTo_Callback";
+  bezierCurveTo_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => bezierCurveTo_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6);
+
+  static bezierCurveTo_Callback_8(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) native "Path2D_bezierCurveTo_Callback";
+  bezierCurveTo_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => bezierCurveTo_Callback_8(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7);
+
+  static closePath_Callback_0(mthis) native "Path2D_closePath_Callback";
+  closePath_Callback_0_(mthis) => closePath_Callback_0(mthis);
+
+  static closePath_Callback_1(mthis, __arg_0) native "Path2D_closePath_Callback";
+  closePath_Callback_1_(mthis, __arg_0) => closePath_Callback_1(mthis, __arg_0);
+
+  static closePath_Callback_2(mthis, __arg_0, __arg_1) native "Path2D_closePath_Callback";
+  closePath_Callback_2_(mthis, __arg_0, __arg_1) => closePath_Callback_2(mthis, __arg_0, __arg_1);
+
+  static constructorCallback_0() native "Path2D_constructorCallback";
+  constructorCallback_0_() => constructorCallback_0();
+
+  static constructorCallback_1(__arg_0) native "Path2D_constructorCallback";
+  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+
+  static constructorCallback_2(__arg_0, __arg_1) native "Path2D_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+
+  static constructorCallback_3(__arg_0, __arg_1, __arg_2) native "Path2D_constructorCallback";
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => constructorCallback_3(__arg_0, __arg_1, __arg_2);
+
+  static ellipse_Callback_10(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9) native "Path2D_ellipse_Callback";
+  ellipse_Callback_10_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9) => ellipse_Callback_10(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9);
+
+  static ellipse_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "Path2D_ellipse_Callback";
+  ellipse_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => ellipse_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static ellipse_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "Path2D_ellipse_Callback";
+  ellipse_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => ellipse_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static ellipse_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) native "Path2D_ellipse_Callback";
+  ellipse_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => ellipse_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6);
+
+  static ellipse_Callback_8(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) native "Path2D_ellipse_Callback";
+  ellipse_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => ellipse_Callback_8(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7);
+
+  static ellipse_Callback_9(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) native "Path2D_ellipse_Callback";
+  ellipse_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => ellipse_Callback_9(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8);
+
+  static lineTo_Callback_0(mthis) native "Path2D_lineTo_Callback";
+  lineTo_Callback_0_(mthis) => lineTo_Callback_0(mthis);
+
+  static lineTo_Callback_1(mthis, __arg_0) native "Path2D_lineTo_Callback";
+  lineTo_Callback_1_(mthis, __arg_0) => lineTo_Callback_1(mthis, __arg_0);
+
+  static lineTo_Callback_2(mthis, __arg_0, __arg_1) native "Path2D_lineTo_Callback";
+  lineTo_Callback_2_(mthis, __arg_0, __arg_1) => lineTo_Callback_2(mthis, __arg_0, __arg_1);
+
+  static lineTo_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Path2D_lineTo_Callback";
+  lineTo_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => lineTo_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static lineTo_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Path2D_lineTo_Callback";
+  lineTo_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => lineTo_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static moveTo_Callback_0(mthis) native "Path2D_moveTo_Callback";
+  moveTo_Callback_0_(mthis) => moveTo_Callback_0(mthis);
+
+  static moveTo_Callback_1(mthis, __arg_0) native "Path2D_moveTo_Callback";
+  moveTo_Callback_1_(mthis, __arg_0) => moveTo_Callback_1(mthis, __arg_0);
+
+  static moveTo_Callback_2(mthis, __arg_0, __arg_1) native "Path2D_moveTo_Callback";
+  moveTo_Callback_2_(mthis, __arg_0, __arg_1) => moveTo_Callback_2(mthis, __arg_0, __arg_1);
+
+  static moveTo_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Path2D_moveTo_Callback";
+  moveTo_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => moveTo_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static moveTo_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Path2D_moveTo_Callback";
+  moveTo_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => moveTo_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static quadraticCurveTo_Callback_2(mthis, __arg_0, __arg_1) native "Path2D_quadraticCurveTo_Callback";
+  quadraticCurveTo_Callback_2_(mthis, __arg_0, __arg_1) => quadraticCurveTo_Callback_2(mthis, __arg_0, __arg_1);
+
+  static quadraticCurveTo_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Path2D_quadraticCurveTo_Callback";
+  quadraticCurveTo_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => quadraticCurveTo_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static quadraticCurveTo_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Path2D_quadraticCurveTo_Callback";
+  quadraticCurveTo_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => quadraticCurveTo_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static quadraticCurveTo_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "Path2D_quadraticCurveTo_Callback";
+  quadraticCurveTo_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => quadraticCurveTo_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static quadraticCurveTo_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "Path2D_quadraticCurveTo_Callback";
+  quadraticCurveTo_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => quadraticCurveTo_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static rect_Callback_2(mthis, __arg_0, __arg_1) native "Path2D_rect_Callback";
+  rect_Callback_2_(mthis, __arg_0, __arg_1) => rect_Callback_2(mthis, __arg_0, __arg_1);
+
+  static rect_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Path2D_rect_Callback";
+  rect_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => rect_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static rect_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Path2D_rect_Callback";
+  rect_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => rect_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static rect_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "Path2D_rect_Callback";
+  rect_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => rect_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static rect_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "Path2D_rect_Callback";
+  rect_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => rect_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
 }
 
-class BlinkPerformance {
+class BlinkPerformance extends BlinkEventTarget {
+  static final instance = new BlinkPerformance();
+
+  static clearMarks_Callback_0(mthis) native "Performance_clearMarks_Callback";
+  clearMarks_Callback_0_(mthis) => clearMarks_Callback_0(mthis);
+
+  static clearMarks_Callback_1(mthis, __arg_0) native "Performance_clearMarks_Callback";
+  clearMarks_Callback_1_(mthis, __arg_0) => clearMarks_Callback_1(mthis, __arg_0);
+
+  static clearMarks_Callback_2(mthis, __arg_0, __arg_1) native "Performance_clearMarks_Callback";
+  clearMarks_Callback_2_(mthis, __arg_0, __arg_1) => clearMarks_Callback_2(mthis, __arg_0, __arg_1);
+
+  static clearMarks_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Performance_clearMarks_Callback";
+  clearMarks_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => clearMarks_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static clearMeasures_Callback_0(mthis) native "Performance_clearMeasures_Callback";
+  clearMeasures_Callback_0_(mthis) => clearMeasures_Callback_0(mthis);
+
+  static clearMeasures_Callback_1(mthis, __arg_0) native "Performance_clearMeasures_Callback";
+  clearMeasures_Callback_1_(mthis, __arg_0) => clearMeasures_Callback_1(mthis, __arg_0);
+
+  static clearMeasures_Callback_2(mthis, __arg_0, __arg_1) native "Performance_clearMeasures_Callback";
+  clearMeasures_Callback_2_(mthis, __arg_0, __arg_1) => clearMeasures_Callback_2(mthis, __arg_0, __arg_1);
+
+  static clearMeasures_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Performance_clearMeasures_Callback";
+  clearMeasures_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => clearMeasures_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static getEntriesByName_Callback_0(mthis) native "Performance_getEntriesByName_Callback";
+  getEntriesByName_Callback_0_(mthis) => getEntriesByName_Callback_0(mthis);
+
+  static getEntriesByName_Callback_1(mthis, __arg_0) native "Performance_getEntriesByName_Callback";
+  getEntriesByName_Callback_1_(mthis, __arg_0) => getEntriesByName_Callback_1(mthis, __arg_0);
+
+  static getEntriesByName_Callback_2(mthis, __arg_0, __arg_1) native "Performance_getEntriesByName_Callback";
+  getEntriesByName_Callback_2_(mthis, __arg_0, __arg_1) => getEntriesByName_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getEntriesByName_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Performance_getEntriesByName_Callback";
+  getEntriesByName_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getEntriesByName_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static getEntriesByName_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Performance_getEntriesByName_Callback";
+  getEntriesByName_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => getEntriesByName_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static getEntriesByType_Callback_0(mthis) native "Performance_getEntriesByType_Callback";
+  getEntriesByType_Callback_0_(mthis) => getEntriesByType_Callback_0(mthis);
+
+  static getEntriesByType_Callback_1(mthis, __arg_0) native "Performance_getEntriesByType_Callback";
+  getEntriesByType_Callback_1_(mthis, __arg_0) => getEntriesByType_Callback_1(mthis, __arg_0);
+
+  static getEntriesByType_Callback_2(mthis, __arg_0, __arg_1) native "Performance_getEntriesByType_Callback";
+  getEntriesByType_Callback_2_(mthis, __arg_0, __arg_1) => getEntriesByType_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getEntriesByType_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Performance_getEntriesByType_Callback";
+  getEntriesByType_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getEntriesByType_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static getEntries_Callback_0(mthis) native "Performance_getEntries_Callback";
+  getEntries_Callback_0_(mthis) => getEntries_Callback_0(mthis);
+
+  static getEntries_Callback_1(mthis, __arg_0) native "Performance_getEntries_Callback";
+  getEntries_Callback_1_(mthis, __arg_0) => getEntries_Callback_1(mthis, __arg_0);
+
+  static getEntries_Callback_2(mthis, __arg_0, __arg_1) native "Performance_getEntries_Callback";
+  getEntries_Callback_2_(mthis, __arg_0, __arg_1) => getEntries_Callback_2(mthis, __arg_0, __arg_1);
+
+  static mark_Callback_0(mthis) native "Performance_mark_Callback";
+  mark_Callback_0_(mthis) => mark_Callback_0(mthis);
+
+  static mark_Callback_1(mthis, __arg_0) native "Performance_mark_Callback";
+  mark_Callback_1_(mthis, __arg_0) => mark_Callback_1(mthis, __arg_0);
+
+  static mark_Callback_2(mthis, __arg_0, __arg_1) native "Performance_mark_Callback";
+  mark_Callback_2_(mthis, __arg_0, __arg_1) => mark_Callback_2(mthis, __arg_0, __arg_1);
+
+  static mark_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Performance_mark_Callback";
+  mark_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mark_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static measure_Callback_0(mthis) native "Performance_measure_Callback";
+  measure_Callback_0_(mthis) => measure_Callback_0(mthis);
+
+  static measure_Callback_1(mthis, __arg_0) native "Performance_measure_Callback";
+  measure_Callback_1_(mthis, __arg_0) => measure_Callback_1(mthis, __arg_0);
+
+  static measure_Callback_2(mthis, __arg_0, __arg_1) native "Performance_measure_Callback";
+  measure_Callback_2_(mthis, __arg_0, __arg_1) => measure_Callback_2(mthis, __arg_0, __arg_1);
+
+  static measure_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Performance_measure_Callback";
+  measure_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => measure_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static measure_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Performance_measure_Callback";
+  measure_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => measure_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static measure_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "Performance_measure_Callback";
+  measure_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => measure_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
   static memory_Getter(mthis) native "Performance_memory_Getter";
+  memory_Getter_(mthis) => memory_Getter(mthis);
 
   static navigation_Getter(mthis) native "Performance_navigation_Getter";
+  navigation_Getter_(mthis) => navigation_Getter(mthis);
+
+  static now_Callback_0(mthis) native "Performance_now_Callback";
+  now_Callback_0_(mthis) => now_Callback_0(mthis);
+
+  static now_Callback_1(mthis, __arg_0) native "Performance_now_Callback";
+  now_Callback_1_(mthis, __arg_0) => now_Callback_1(mthis, __arg_0);
+
+  static now_Callback_2(mthis, __arg_0, __arg_1) native "Performance_now_Callback";
+  now_Callback_2_(mthis, __arg_0, __arg_1) => now_Callback_2(mthis, __arg_0, __arg_1);
+
+  static onwebkitresourcetimingbufferfull_Getter(mthis) native "Performance_onwebkitresourcetimingbufferfull_Getter";
+  onwebkitresourcetimingbufferfull_Getter_(mthis) => onwebkitresourcetimingbufferfull_Getter(mthis);
+
+  static onwebkitresourcetimingbufferfull_Setter(mthis, __arg_0) native "Performance_onwebkitresourcetimingbufferfull_Setter";
+  onwebkitresourcetimingbufferfull_Setter_(mthis, __arg_0) => onwebkitresourcetimingbufferfull_Setter(mthis, __arg_0);
 
   static timing_Getter(mthis) native "Performance_timing_Getter";
+  timing_Getter_(mthis) => timing_Getter(mthis);
 
-  static clearMarks_Callback_1(mthis, markName) native "Performance_clearMarks_Callback";
+  static webkitClearResourceTimings_Callback_0(mthis) native "Performance_webkitClearResourceTimings_Callback";
+  webkitClearResourceTimings_Callback_0_(mthis) => webkitClearResourceTimings_Callback_0(mthis);
 
-  static clearMeasures_Callback_1(mthis, measureName) native "Performance_clearMeasures_Callback";
+  static webkitClearResourceTimings_Callback_1(mthis, __arg_0) native "Performance_webkitClearResourceTimings_Callback";
+  webkitClearResourceTimings_Callback_1_(mthis, __arg_0) => webkitClearResourceTimings_Callback_1(mthis, __arg_0);
 
-  static getEntries_Callback(mthis) native "Performance_getEntries_Callback";
+  static webkitClearResourceTimings_Callback_2(mthis, __arg_0, __arg_1) native "Performance_webkitClearResourceTimings_Callback";
+  webkitClearResourceTimings_Callback_2_(mthis, __arg_0, __arg_1) => webkitClearResourceTimings_Callback_2(mthis, __arg_0, __arg_1);
 
-  static getEntriesByName_Callback_2(mthis, name, entryType) native "Performance_getEntriesByName_Callback";
+  static webkitSetResourceTimingBufferSize_Callback_0(mthis) native "Performance_webkitSetResourceTimingBufferSize_Callback";
+  webkitSetResourceTimingBufferSize_Callback_0_(mthis) => webkitSetResourceTimingBufferSize_Callback_0(mthis);
 
-  static getEntriesByType_Callback_1(mthis, entryType) native "Performance_getEntriesByType_Callback";
+  static webkitSetResourceTimingBufferSize_Callback_1(mthis, __arg_0) native "Performance_webkitSetResourceTimingBufferSize_Callback";
+  webkitSetResourceTimingBufferSize_Callback_1_(mthis, __arg_0) => webkitSetResourceTimingBufferSize_Callback_1(mthis, __arg_0);
 
-  static mark_Callback_1(mthis, markName) native "Performance_mark_Callback";
+  static webkitSetResourceTimingBufferSize_Callback_2(mthis, __arg_0, __arg_1) native "Performance_webkitSetResourceTimingBufferSize_Callback";
+  webkitSetResourceTimingBufferSize_Callback_2_(mthis, __arg_0, __arg_1) => webkitSetResourceTimingBufferSize_Callback_2(mthis, __arg_0, __arg_1);
 
-  static measure_Callback_3(mthis, measureName, startMark, endMark) native "Performance_measure_Callback";
+  static webkitSetResourceTimingBufferSize_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Performance_webkitSetResourceTimingBufferSize_Callback";
+  webkitSetResourceTimingBufferSize_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => webkitSetResourceTimingBufferSize_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
-  static now_Callback(mthis) native "Performance_now_Callback";
-
-  static webkitClearResourceTimings_Callback(mthis) native "Performance_webkitClearResourceTimings_Callback";
-
-  static webkitSetResourceTimingBufferSize_Callback_1(mthis, maxSize) native "Performance_webkitSetResourceTimingBufferSize_Callback";
 }
 
 class BlinkPerformanceEntry {
+  static final instance = new BlinkPerformanceEntry();
+
   static duration_Getter(mthis) native "PerformanceEntry_duration_Getter";
+  duration_Getter_(mthis) => duration_Getter(mthis);
 
   static entryType_Getter(mthis) native "PerformanceEntry_entryType_Getter";
+  entryType_Getter_(mthis) => entryType_Getter(mthis);
 
   static name_Getter(mthis) native "PerformanceEntry_name_Getter";
+  name_Getter_(mthis) => name_Getter(mthis);
 
   static startTime_Getter(mthis) native "PerformanceEntry_startTime_Getter";
+  startTime_Getter_(mthis) => startTime_Getter(mthis);
+
 }
 
-class BlinkPerformanceMark {}
+class BlinkPerformanceMark extends BlinkPerformanceEntry {
+  static final instance = new BlinkPerformanceMark();
 
-class BlinkPerformanceMeasure {}
+}
+
+class BlinkPerformanceMeasure extends BlinkPerformanceEntry {
+  static final instance = new BlinkPerformanceMeasure();
+
+}
 
 class BlinkPerformanceNavigation {
+  static final instance = new BlinkPerformanceNavigation();
+
   static redirectCount_Getter(mthis) native "PerformanceNavigation_redirectCount_Getter";
+  redirectCount_Getter_(mthis) => redirectCount_Getter(mthis);
 
   static type_Getter(mthis) native "PerformanceNavigation_type_Getter";
+  type_Getter_(mthis) => type_Getter(mthis);
+
 }
 
-class BlinkPerformanceResourceTiming {
+class BlinkPerformanceResourceTiming extends BlinkPerformanceEntry {
+  static final instance = new BlinkPerformanceResourceTiming();
+
   static connectEnd_Getter(mthis) native "PerformanceResourceTiming_connectEnd_Getter";
+  connectEnd_Getter_(mthis) => connectEnd_Getter(mthis);
 
   static connectStart_Getter(mthis) native "PerformanceResourceTiming_connectStart_Getter";
+  connectStart_Getter_(mthis) => connectStart_Getter(mthis);
 
   static domainLookupEnd_Getter(mthis) native "PerformanceResourceTiming_domainLookupEnd_Getter";
+  domainLookupEnd_Getter_(mthis) => domainLookupEnd_Getter(mthis);
 
   static domainLookupStart_Getter(mthis) native "PerformanceResourceTiming_domainLookupStart_Getter";
+  domainLookupStart_Getter_(mthis) => domainLookupStart_Getter(mthis);
 
   static fetchStart_Getter(mthis) native "PerformanceResourceTiming_fetchStart_Getter";
+  fetchStart_Getter_(mthis) => fetchStart_Getter(mthis);
 
   static initiatorType_Getter(mthis) native "PerformanceResourceTiming_initiatorType_Getter";
+  initiatorType_Getter_(mthis) => initiatorType_Getter(mthis);
 
   static redirectEnd_Getter(mthis) native "PerformanceResourceTiming_redirectEnd_Getter";
+  redirectEnd_Getter_(mthis) => redirectEnd_Getter(mthis);
 
   static redirectStart_Getter(mthis) native "PerformanceResourceTiming_redirectStart_Getter";
+  redirectStart_Getter_(mthis) => redirectStart_Getter(mthis);
 
   static requestStart_Getter(mthis) native "PerformanceResourceTiming_requestStart_Getter";
+  requestStart_Getter_(mthis) => requestStart_Getter(mthis);
 
   static responseEnd_Getter(mthis) native "PerformanceResourceTiming_responseEnd_Getter";
+  responseEnd_Getter_(mthis) => responseEnd_Getter(mthis);
 
   static responseStart_Getter(mthis) native "PerformanceResourceTiming_responseStart_Getter";
+  responseStart_Getter_(mthis) => responseStart_Getter(mthis);
 
   static secureConnectionStart_Getter(mthis) native "PerformanceResourceTiming_secureConnectionStart_Getter";
+  secureConnectionStart_Getter_(mthis) => secureConnectionStart_Getter(mthis);
+
 }
 
 class BlinkPerformanceTiming {
+  static final instance = new BlinkPerformanceTiming();
+
   static connectEnd_Getter(mthis) native "PerformanceTiming_connectEnd_Getter";
+  connectEnd_Getter_(mthis) => connectEnd_Getter(mthis);
 
   static connectStart_Getter(mthis) native "PerformanceTiming_connectStart_Getter";
+  connectStart_Getter_(mthis) => connectStart_Getter(mthis);
 
   static domComplete_Getter(mthis) native "PerformanceTiming_domComplete_Getter";
+  domComplete_Getter_(mthis) => domComplete_Getter(mthis);
 
   static domContentLoadedEventEnd_Getter(mthis) native "PerformanceTiming_domContentLoadedEventEnd_Getter";
+  domContentLoadedEventEnd_Getter_(mthis) => domContentLoadedEventEnd_Getter(mthis);
 
   static domContentLoadedEventStart_Getter(mthis) native "PerformanceTiming_domContentLoadedEventStart_Getter";
+  domContentLoadedEventStart_Getter_(mthis) => domContentLoadedEventStart_Getter(mthis);
 
   static domInteractive_Getter(mthis) native "PerformanceTiming_domInteractive_Getter";
+  domInteractive_Getter_(mthis) => domInteractive_Getter(mthis);
 
   static domLoading_Getter(mthis) native "PerformanceTiming_domLoading_Getter";
+  domLoading_Getter_(mthis) => domLoading_Getter(mthis);
 
   static domainLookupEnd_Getter(mthis) native "PerformanceTiming_domainLookupEnd_Getter";
+  domainLookupEnd_Getter_(mthis) => domainLookupEnd_Getter(mthis);
 
   static domainLookupStart_Getter(mthis) native "PerformanceTiming_domainLookupStart_Getter";
+  domainLookupStart_Getter_(mthis) => domainLookupStart_Getter(mthis);
 
   static fetchStart_Getter(mthis) native "PerformanceTiming_fetchStart_Getter";
+  fetchStart_Getter_(mthis) => fetchStart_Getter(mthis);
 
   static loadEventEnd_Getter(mthis) native "PerformanceTiming_loadEventEnd_Getter";
+  loadEventEnd_Getter_(mthis) => loadEventEnd_Getter(mthis);
 
   static loadEventStart_Getter(mthis) native "PerformanceTiming_loadEventStart_Getter";
+  loadEventStart_Getter_(mthis) => loadEventStart_Getter(mthis);
 
   static navigationStart_Getter(mthis) native "PerformanceTiming_navigationStart_Getter";
+  navigationStart_Getter_(mthis) => navigationStart_Getter(mthis);
 
   static redirectEnd_Getter(mthis) native "PerformanceTiming_redirectEnd_Getter";
+  redirectEnd_Getter_(mthis) => redirectEnd_Getter(mthis);
 
   static redirectStart_Getter(mthis) native "PerformanceTiming_redirectStart_Getter";
+  redirectStart_Getter_(mthis) => redirectStart_Getter(mthis);
 
   static requestStart_Getter(mthis) native "PerformanceTiming_requestStart_Getter";
+  requestStart_Getter_(mthis) => requestStart_Getter(mthis);
 
   static responseEnd_Getter(mthis) native "PerformanceTiming_responseEnd_Getter";
+  responseEnd_Getter_(mthis) => responseEnd_Getter(mthis);
 
   static responseStart_Getter(mthis) native "PerformanceTiming_responseStart_Getter";
+  responseStart_Getter_(mthis) => responseStart_Getter(mthis);
 
   static secureConnectionStart_Getter(mthis) native "PerformanceTiming_secureConnectionStart_Getter";
+  secureConnectionStart_Getter_(mthis) => secureConnectionStart_Getter(mthis);
 
   static unloadEventEnd_Getter(mthis) native "PerformanceTiming_unloadEventEnd_Getter";
+  unloadEventEnd_Getter_(mthis) => unloadEventEnd_Getter(mthis);
 
   static unloadEventStart_Getter(mthis) native "PerformanceTiming_unloadEventStart_Getter";
+  unloadEventStart_Getter_(mthis) => unloadEventStart_Getter(mthis);
+
 }
 
-class BlinkPeriodicWave {}
+class BlinkPeriodicWave {
+  static final instance = new BlinkPeriodicWave();
+
+}
 
 class BlinkPlugin {
+  static final instance = new BlinkPlugin();
+
+  static $__getter___Callback_1(mthis, __arg_0) native "Plugin___getter___Callback";
+  $__getter___Callback_1_(mthis, __arg_0) => $__getter___Callback_1(mthis, __arg_0);
+
   static description_Getter(mthis) native "Plugin_description_Getter";
+  description_Getter_(mthis) => description_Getter(mthis);
 
   static filename_Getter(mthis) native "Plugin_filename_Getter";
+  filename_Getter_(mthis) => filename_Getter(mthis);
+
+  static item_Callback_0(mthis) native "Plugin_item_Callback";
+  item_Callback_0_(mthis) => item_Callback_0(mthis);
+
+  static item_Callback_1(mthis, __arg_0) native "Plugin_item_Callback";
+  item_Callback_1_(mthis, __arg_0) => item_Callback_1(mthis, __arg_0);
+
+  static item_Callback_2(mthis, __arg_0, __arg_1) native "Plugin_item_Callback";
+  item_Callback_2_(mthis, __arg_0, __arg_1) => item_Callback_2(mthis, __arg_0, __arg_1);
+
+  static item_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Plugin_item_Callback";
+  item_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => item_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
   static length_Getter(mthis) native "Plugin_length_Getter";
+  length_Getter_(mthis) => length_Getter(mthis);
 
   static name_Getter(mthis) native "Plugin_name_Getter";
+  name_Getter_(mthis) => name_Getter(mthis);
 
-  static $__getter___Callback_1(mthis, name) native "Plugin___getter___Callback";
+  static namedItem_Callback_0(mthis) native "Plugin_namedItem_Callback";
+  namedItem_Callback_0_(mthis) => namedItem_Callback_0(mthis);
 
-  static item_Callback_1(mthis, index) native "Plugin_item_Callback";
+  static namedItem_Callback_1(mthis, __arg_0) native "Plugin_namedItem_Callback";
+  namedItem_Callback_1_(mthis, __arg_0) => namedItem_Callback_1(mthis, __arg_0);
 
-  static namedItem_Callback_1(mthis, name) native "Plugin_namedItem_Callback";
+  static namedItem_Callback_2(mthis, __arg_0, __arg_1) native "Plugin_namedItem_Callback";
+  namedItem_Callback_2_(mthis, __arg_0, __arg_1) => namedItem_Callback_2(mthis, __arg_0, __arg_1);
+
+  static namedItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Plugin_namedItem_Callback";
+  namedItem_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => namedItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
 }
 
 class BlinkPluginArray {
+  static final instance = new BlinkPluginArray();
+
+  static $__getter___Callback_1(mthis, __arg_0) native "PluginArray___getter___Callback";
+  $__getter___Callback_1_(mthis, __arg_0) => $__getter___Callback_1(mthis, __arg_0);
+
+  static item_Callback_0(mthis) native "PluginArray_item_Callback";
+  item_Callback_0_(mthis) => item_Callback_0(mthis);
+
+  static item_Callback_1(mthis, __arg_0) native "PluginArray_item_Callback";
+  item_Callback_1_(mthis, __arg_0) => item_Callback_1(mthis, __arg_0);
+
+  static item_Callback_2(mthis, __arg_0, __arg_1) native "PluginArray_item_Callback";
+  item_Callback_2_(mthis, __arg_0, __arg_1) => item_Callback_2(mthis, __arg_0, __arg_1);
+
+  static item_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "PluginArray_item_Callback";
+  item_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => item_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
   static length_Getter(mthis) native "PluginArray_length_Getter";
+  length_Getter_(mthis) => length_Getter(mthis);
 
-  static $__getter___Callback_1(mthis, name) native "PluginArray___getter___Callback";
+  static namedItem_Callback_0(mthis) native "PluginArray_namedItem_Callback";
+  namedItem_Callback_0_(mthis) => namedItem_Callback_0(mthis);
 
-  static item_Callback_1(mthis, index) native "PluginArray_item_Callback";
+  static namedItem_Callback_1(mthis, __arg_0) native "PluginArray_namedItem_Callback";
+  namedItem_Callback_1_(mthis, __arg_0) => namedItem_Callback_1(mthis, __arg_0);
 
-  static namedItem_Callback_1(mthis, name) native "PluginArray_namedItem_Callback";
+  static namedItem_Callback_2(mthis, __arg_0, __arg_1) native "PluginArray_namedItem_Callback";
+  namedItem_Callback_2_(mthis, __arg_0, __arg_1) => namedItem_Callback_2(mthis, __arg_0, __arg_1);
 
-  static refresh_Callback_1(mthis, reload) native "PluginArray_refresh_Callback";
+  static namedItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "PluginArray_namedItem_Callback";
+  namedItem_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => namedItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static refresh_Callback_0(mthis) native "PluginArray_refresh_Callback";
+  refresh_Callback_0_(mthis) => refresh_Callback_0(mthis);
+
+  static refresh_Callback_1(mthis, __arg_0) native "PluginArray_refresh_Callback";
+  refresh_Callback_1_(mthis, __arg_0) => refresh_Callback_1(mthis, __arg_0);
+
+  static refresh_Callback_2(mthis, __arg_0, __arg_1) native "PluginArray_refresh_Callback";
+  refresh_Callback_2_(mthis, __arg_0, __arg_1) => refresh_Callback_2(mthis, __arg_0, __arg_1);
+
+  static refresh_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "PluginArray_refresh_Callback";
+  refresh_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => refresh_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
 }
 
-class BlinkPopStateEvent {
-  static constructorCallback(type, options) native "PopStateEvent_constructorCallback";
+class BlinkPopStateEvent extends BlinkEvent {
+  static final instance = new BlinkPopStateEvent();
+
+  static constructorCallback_2(__arg_0, __arg_1) native "PopStateEvent_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
 
   static state_Getter(mthis) native "PopStateEvent_state_Getter";
+  state_Getter_(mthis) => state_Getter(mthis);
+
 }
 
 class BlinkPositionError {
+  static final instance = new BlinkPositionError();
+
   static code_Getter(mthis) native "PositionError_code_Getter";
+  code_Getter_(mthis) => code_Getter(mthis);
 
   static message_Getter(mthis) native "PositionError_message_Getter";
+  message_Getter_(mthis) => message_Getter(mthis);
+
 }
 
-class BlinkProcessingInstruction {
+class BlinkProcessingInstruction extends BlinkCharacterData {
+  static final instance = new BlinkProcessingInstruction();
+
   static sheet_Getter(mthis) native "ProcessingInstruction_sheet_Getter";
+  sheet_Getter_(mthis) => sheet_Getter(mthis);
 
   static target_Getter(mthis) native "ProcessingInstruction_target_Getter";
+  target_Getter_(mthis) => target_Getter(mthis);
+
 }
 
-class BlinkProgressEvent {
-  static constructorCallback(type, options) native "ProgressEvent_constructorCallback";
+class BlinkProgressEvent extends BlinkEvent {
+  static final instance = new BlinkProgressEvent();
+
+  static constructorCallback_2(__arg_0, __arg_1) native "ProgressEvent_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
 
   static lengthComputable_Getter(mthis) native "ProgressEvent_lengthComputable_Getter";
+  lengthComputable_Getter_(mthis) => lengthComputable_Getter(mthis);
 
   static loaded_Getter(mthis) native "ProgressEvent_loaded_Getter";
+  loaded_Getter_(mthis) => loaded_Getter(mthis);
 
   static total_Getter(mthis) native "ProgressEvent_total_Getter";
+  total_Getter_(mthis) => total_Getter(mthis);
+
 }
 
-class BlinkPushEvent {
-  static constructorCallback(type, options) native "PushEvent_constructorCallback";
+class BlinkPushEvent extends BlinkEvent {
+  static final instance = new BlinkPushEvent();
+
+  static constructorCallback_2(__arg_0, __arg_1) native "PushEvent_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
 
   static data_Getter(mthis) native "PushEvent_data_Getter";
+  data_Getter_(mthis) => data_Getter(mthis);
+
 }
 
 class BlinkPushManager {
-  static register_Callback_1(mthis, senderId) native "PushManager_register_Callback";
+  static final instance = new BlinkPushManager();
+
+  static register_Callback_0(mthis) native "PushManager_register_Callback";
+  register_Callback_0_(mthis) => register_Callback_0(mthis);
+
+  static register_Callback_1(mthis, __arg_0) native "PushManager_register_Callback";
+  register_Callback_1_(mthis, __arg_0) => register_Callback_1(mthis, __arg_0);
+
+  static register_Callback_2(mthis, __arg_0, __arg_1) native "PushManager_register_Callback";
+  register_Callback_2_(mthis, __arg_0, __arg_1) => register_Callback_2(mthis, __arg_0, __arg_1);
+
+  static register_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "PushManager_register_Callback";
+  register_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => register_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
 }
 
 class BlinkPushRegistration {
+  static final instance = new BlinkPushRegistration();
+
   static pushEndpoint_Getter(mthis) native "PushRegistration_pushEndpoint_Getter";
+  pushEndpoint_Getter_(mthis) => pushEndpoint_Getter(mthis);
 
   static pushRegistrationId_Getter(mthis) native "PushRegistration_pushRegistrationId_Getter";
+  pushRegistrationId_Getter_(mthis) => pushRegistrationId_Getter(mthis);
+
 }
 
-class BlinkRGBColor {}
+class BlinkRGBColor {
+  static final instance = new BlinkRGBColor();
 
-class BlinkRTCDTMFSender {
+  static blue_Getter(mthis) native "RGBColor_blue_Getter";
+  blue_Getter_(mthis) => blue_Getter(mthis);
+
+  static green_Getter(mthis) native "RGBColor_green_Getter";
+  green_Getter_(mthis) => green_Getter(mthis);
+
+  static red_Getter(mthis) native "RGBColor_red_Getter";
+  red_Getter_(mthis) => red_Getter(mthis);
+
+}
+
+class BlinkRTCDTMFSender extends BlinkEventTarget {
+  static final instance = new BlinkRTCDTMFSender();
+
   static canInsertDTMF_Getter(mthis) native "RTCDTMFSender_canInsertDTMF_Getter";
+  canInsertDTMF_Getter_(mthis) => canInsertDTMF_Getter(mthis);
 
   static duration_Getter(mthis) native "RTCDTMFSender_duration_Getter";
+  duration_Getter_(mthis) => duration_Getter(mthis);
+
+  static insertDTMF_Callback_0(mthis) native "RTCDTMFSender_insertDTMF_Callback";
+  insertDTMF_Callback_0_(mthis) => insertDTMF_Callback_0(mthis);
+
+  static insertDTMF_Callback_1(mthis, __arg_0) native "RTCDTMFSender_insertDTMF_Callback";
+  insertDTMF_Callback_1_(mthis, __arg_0) => insertDTMF_Callback_1(mthis, __arg_0);
+
+  static insertDTMF_Callback_2(mthis, __arg_0, __arg_1) native "RTCDTMFSender_insertDTMF_Callback";
+  insertDTMF_Callback_2_(mthis, __arg_0, __arg_1) => insertDTMF_Callback_2(mthis, __arg_0, __arg_1);
+
+  static insertDTMF_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "RTCDTMFSender_insertDTMF_Callback";
+  insertDTMF_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => insertDTMF_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static insertDTMF_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "RTCDTMFSender_insertDTMF_Callback";
+  insertDTMF_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => insertDTMF_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static insertDTMF_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "RTCDTMFSender_insertDTMF_Callback";
+  insertDTMF_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => insertDTMF_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
 
   static interToneGap_Getter(mthis) native "RTCDTMFSender_interToneGap_Getter";
+  interToneGap_Getter_(mthis) => interToneGap_Getter(mthis);
+
+  static ontonechange_Getter(mthis) native "RTCDTMFSender_ontonechange_Getter";
+  ontonechange_Getter_(mthis) => ontonechange_Getter(mthis);
+
+  static ontonechange_Setter(mthis, __arg_0) native "RTCDTMFSender_ontonechange_Setter";
+  ontonechange_Setter_(mthis, __arg_0) => ontonechange_Setter(mthis, __arg_0);
 
   static toneBuffer_Getter(mthis) native "RTCDTMFSender_toneBuffer_Getter";
+  toneBuffer_Getter_(mthis) => toneBuffer_Getter(mthis);
 
   static track_Getter(mthis) native "RTCDTMFSender_track_Getter";
+  track_Getter_(mthis) => track_Getter(mthis);
 
-  static insertDTMF_Callback_3(mthis, tones, duration, interToneGap) native "RTCDTMFSender_insertDTMF_Callback";
-
-  static insertDTMF_Callback_2(mthis, tones, duration) native "RTCDTMFSender_insertDTMF_Callback";
-
-  static insertDTMF_Callback_1(mthis, tones) native "RTCDTMFSender_insertDTMF_Callback";
 }
 
-class BlinkRTCDTMFToneChangeEvent {
-  static constructorCallback(type, options) native "RTCDTMFToneChangeEvent_constructorCallback";
+class BlinkRTCDTMFToneChangeEvent extends BlinkEvent {
+  static final instance = new BlinkRTCDTMFToneChangeEvent();
+
+  static constructorCallback_2(__arg_0, __arg_1) native "RTCDTMFToneChangeEvent_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
 
   static tone_Getter(mthis) native "RTCDTMFToneChangeEvent_tone_Getter";
+  tone_Getter_(mthis) => tone_Getter(mthis);
+
 }
 
-class BlinkRTCDataChannel {
-  static binaryType_Getter(mthis) native "RTCDataChannel_binaryType_Getter";
+class BlinkRTCDataChannel extends BlinkEventTarget {
+  static final instance = new BlinkRTCDataChannel();
 
-  static binaryType_Setter(mthis, value) native "RTCDataChannel_binaryType_Setter";
+  static binaryType_Getter(mthis) native "RTCDataChannel_binaryType_Getter";
+  binaryType_Getter_(mthis) => binaryType_Getter(mthis);
+
+  static binaryType_Setter(mthis, __arg_0) native "RTCDataChannel_binaryType_Setter";
+  binaryType_Setter_(mthis, __arg_0) => binaryType_Setter(mthis, __arg_0);
 
   static bufferedAmount_Getter(mthis) native "RTCDataChannel_bufferedAmount_Getter";
+  bufferedAmount_Getter_(mthis) => bufferedAmount_Getter(mthis);
+
+  static close_Callback_0(mthis) native "RTCDataChannel_close_Callback";
+  close_Callback_0_(mthis) => close_Callback_0(mthis);
+
+  static close_Callback_1(mthis, __arg_0) native "RTCDataChannel_close_Callback";
+  close_Callback_1_(mthis, __arg_0) => close_Callback_1(mthis, __arg_0);
+
+  static close_Callback_2(mthis, __arg_0, __arg_1) native "RTCDataChannel_close_Callback";
+  close_Callback_2_(mthis, __arg_0, __arg_1) => close_Callback_2(mthis, __arg_0, __arg_1);
 
   static id_Getter(mthis) native "RTCDataChannel_id_Getter";
+  id_Getter_(mthis) => id_Getter(mthis);
 
   static label_Getter(mthis) native "RTCDataChannel_label_Getter";
+  label_Getter_(mthis) => label_Getter(mthis);
 
   static maxRetransmitTime_Getter(mthis) native "RTCDataChannel_maxRetransmitTime_Getter";
+  maxRetransmitTime_Getter_(mthis) => maxRetransmitTime_Getter(mthis);
 
   static maxRetransmits_Getter(mthis) native "RTCDataChannel_maxRetransmits_Getter";
+  maxRetransmits_Getter_(mthis) => maxRetransmits_Getter(mthis);
 
   static negotiated_Getter(mthis) native "RTCDataChannel_negotiated_Getter";
+  negotiated_Getter_(mthis) => negotiated_Getter(mthis);
+
+  static onclose_Getter(mthis) native "RTCDataChannel_onclose_Getter";
+  onclose_Getter_(mthis) => onclose_Getter(mthis);
+
+  static onclose_Setter(mthis, __arg_0) native "RTCDataChannel_onclose_Setter";
+  onclose_Setter_(mthis, __arg_0) => onclose_Setter(mthis, __arg_0);
+
+  static onerror_Getter(mthis) native "RTCDataChannel_onerror_Getter";
+  onerror_Getter_(mthis) => onerror_Getter(mthis);
+
+  static onerror_Setter(mthis, __arg_0) native "RTCDataChannel_onerror_Setter";
+  onerror_Setter_(mthis, __arg_0) => onerror_Setter(mthis, __arg_0);
+
+  static onmessage_Getter(mthis) native "RTCDataChannel_onmessage_Getter";
+  onmessage_Getter_(mthis) => onmessage_Getter(mthis);
+
+  static onmessage_Setter(mthis, __arg_0) native "RTCDataChannel_onmessage_Setter";
+  onmessage_Setter_(mthis, __arg_0) => onmessage_Setter(mthis, __arg_0);
+
+  static onopen_Getter(mthis) native "RTCDataChannel_onopen_Getter";
+  onopen_Getter_(mthis) => onopen_Getter(mthis);
+
+  static onopen_Setter(mthis, __arg_0) native "RTCDataChannel_onopen_Setter";
+  onopen_Setter_(mthis, __arg_0) => onopen_Setter(mthis, __arg_0);
 
   static ordered_Getter(mthis) native "RTCDataChannel_ordered_Getter";
+  ordered_Getter_(mthis) => ordered_Getter(mthis);
 
   static protocol_Getter(mthis) native "RTCDataChannel_protocol_Getter";
+  protocol_Getter_(mthis) => protocol_Getter(mthis);
 
   static readyState_Getter(mthis) native "RTCDataChannel_readyState_Getter";
+  readyState_Getter_(mthis) => readyState_Getter(mthis);
 
   static reliable_Getter(mthis) native "RTCDataChannel_reliable_Getter";
+  reliable_Getter_(mthis) => reliable_Getter(mthis);
 
-  static close_Callback(mthis) native "RTCDataChannel_close_Callback";
+  static send_Callback_0(mthis) native "RTCDataChannel_send_Callback";
+  send_Callback_0_(mthis) => send_Callback_0(mthis);
 
-  static send_Callback_1(mthis, data) native "RTCDataChannel_send_Callback";
+  static send_Callback_1(mthis, __arg_0) native "RTCDataChannel_send_Callback";
+  send_Callback_1_(mthis, __arg_0) => send_Callback_1(mthis, __arg_0);
+
+  static send_Callback_2(mthis, __arg_0, __arg_1) native "RTCDataChannel_send_Callback";
+  send_Callback_2_(mthis, __arg_0, __arg_1) => send_Callback_2(mthis, __arg_0, __arg_1);
+
+  static send_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "RTCDataChannel_send_Callback";
+  send_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => send_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
 }
 
-class BlinkRTCDataChannelEvent {
+class BlinkRTCDataChannelEvent extends BlinkEvent {
+  static final instance = new BlinkRTCDataChannelEvent();
+
   static channel_Getter(mthis) native "RTCDataChannelEvent_channel_Getter";
+  channel_Getter_(mthis) => channel_Getter(mthis);
+
 }
 
 class BlinkRTCIceCandidate {
-  static constructorCallback_1(dictionary) native "RTCIceCandidate_constructorCallback";
+  static final instance = new BlinkRTCIceCandidate();
 
   static candidate_Getter(mthis) native "RTCIceCandidate_candidate_Getter";
+  candidate_Getter_(mthis) => candidate_Getter(mthis);
 
-  static candidate_Setter(mthis, value) native "RTCIceCandidate_candidate_Setter";
+  static candidate_Setter(mthis, __arg_0) native "RTCIceCandidate_candidate_Setter";
+  candidate_Setter_(mthis, __arg_0) => candidate_Setter(mthis, __arg_0);
+
+  static constructorCallback_0() native "RTCIceCandidate_constructorCallback";
+  constructorCallback_0_() => constructorCallback_0();
+
+  static constructorCallback_1(__arg_0) native "RTCIceCandidate_constructorCallback";
+  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+
+  static constructorCallback_2(__arg_0, __arg_1) native "RTCIceCandidate_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+
+  static constructorCallback_3(__arg_0, __arg_1, __arg_2) native "RTCIceCandidate_constructorCallback";
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => constructorCallback_3(__arg_0, __arg_1, __arg_2);
 
   static sdpMLineIndex_Getter(mthis) native "RTCIceCandidate_sdpMLineIndex_Getter";
+  sdpMLineIndex_Getter_(mthis) => sdpMLineIndex_Getter(mthis);
 
-  static sdpMLineIndex_Setter(mthis, value) native "RTCIceCandidate_sdpMLineIndex_Setter";
+  static sdpMLineIndex_Setter(mthis, __arg_0) native "RTCIceCandidate_sdpMLineIndex_Setter";
+  sdpMLineIndex_Setter_(mthis, __arg_0) => sdpMLineIndex_Setter(mthis, __arg_0);
 
   static sdpMid_Getter(mthis) native "RTCIceCandidate_sdpMid_Getter";
+  sdpMid_Getter_(mthis) => sdpMid_Getter(mthis);
 
-  static sdpMid_Setter(mthis, value) native "RTCIceCandidate_sdpMid_Setter";
+  static sdpMid_Setter(mthis, __arg_0) native "RTCIceCandidate_sdpMid_Setter";
+  sdpMid_Setter_(mthis, __arg_0) => sdpMid_Setter(mthis, __arg_0);
+
 }
 
-class BlinkRTCIceCandidateEvent {
+class BlinkRTCIceCandidateEvent extends BlinkEvent {
+  static final instance = new BlinkRTCIceCandidateEvent();
+
   static candidate_Getter(mthis) native "RTCIceCandidateEvent_candidate_Getter";
+  candidate_Getter_(mthis) => candidate_Getter(mthis);
+
 }
 
-class BlinkRTCPeerConnection {
-  static constructorCallback_2(rtcConfiguration, mediaConstraints) native "RTCPeerConnection_constructorCallback";
+class BlinkRTCPeerConnection extends BlinkEventTarget {
+  static final instance = new BlinkRTCPeerConnection();
 
-  static constructorCallback_1(rtcConfiguration) native "RTCPeerConnection_constructorCallback";
+  static addIceCandidate_Callback_1(mthis, __arg_0) native "RTCPeerConnection_addIceCandidate_Callback";
+  addIceCandidate_Callback_1_(mthis, __arg_0) => addIceCandidate_Callback_1(mthis, __arg_0);
+
+  static addIceCandidate_Callback_2(mthis, __arg_0, __arg_1) native "RTCPeerConnection_addIceCandidate_Callback";
+  addIceCandidate_Callback_2_(mthis, __arg_0, __arg_1) => addIceCandidate_Callback_2(mthis, __arg_0, __arg_1);
+
+  static addIceCandidate_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "RTCPeerConnection_addIceCandidate_Callback";
+  addIceCandidate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => addIceCandidate_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static addIceCandidate_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "RTCPeerConnection_addIceCandidate_Callback";
+  addIceCandidate_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => addIceCandidate_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static addIceCandidate_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "RTCPeerConnection_addIceCandidate_Callback";
+  addIceCandidate_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => addIceCandidate_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static addStream_Callback_0(mthis) native "RTCPeerConnection_addStream_Callback";
+  addStream_Callback_0_(mthis) => addStream_Callback_0(mthis);
+
+  static addStream_Callback_1(mthis, __arg_0) native "RTCPeerConnection_addStream_Callback";
+  addStream_Callback_1_(mthis, __arg_0) => addStream_Callback_1(mthis, __arg_0);
+
+  static addStream_Callback_2(mthis, __arg_0, __arg_1) native "RTCPeerConnection_addStream_Callback";
+  addStream_Callback_2_(mthis, __arg_0, __arg_1) => addStream_Callback_2(mthis, __arg_0, __arg_1);
+
+  static addStream_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "RTCPeerConnection_addStream_Callback";
+  addStream_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => addStream_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static addStream_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "RTCPeerConnection_addStream_Callback";
+  addStream_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => addStream_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static close_Callback_0(mthis) native "RTCPeerConnection_close_Callback";
+  close_Callback_0_(mthis) => close_Callback_0(mthis);
+
+  static close_Callback_1(mthis, __arg_0) native "RTCPeerConnection_close_Callback";
+  close_Callback_1_(mthis, __arg_0) => close_Callback_1(mthis, __arg_0);
+
+  static close_Callback_2(mthis, __arg_0, __arg_1) native "RTCPeerConnection_close_Callback";
+  close_Callback_2_(mthis, __arg_0, __arg_1) => close_Callback_2(mthis, __arg_0, __arg_1);
+
+  static constructorCallback_0() native "RTCPeerConnection_constructorCallback";
+  constructorCallback_0_() => constructorCallback_0();
+
+  static constructorCallback_1(__arg_0) native "RTCPeerConnection_constructorCallback";
+  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+
+  static constructorCallback_2(__arg_0, __arg_1) native "RTCPeerConnection_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+
+  static constructorCallback_3(__arg_0, __arg_1, __arg_2) native "RTCPeerConnection_constructorCallback";
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => constructorCallback_3(__arg_0, __arg_1, __arg_2);
+
+  static constructorCallback_4(__arg_0, __arg_1, __arg_2, __arg_3) native "RTCPeerConnection_constructorCallback";
+  constructorCallback_4_(__arg_0, __arg_1, __arg_2, __arg_3) => constructorCallback_4(__arg_0, __arg_1, __arg_2, __arg_3);
+
+  static createAnswer_Callback_0(mthis) native "RTCPeerConnection_createAnswer_Callback";
+  createAnswer_Callback_0_(mthis) => createAnswer_Callback_0(mthis);
+
+  static createAnswer_Callback_1(mthis, __arg_0) native "RTCPeerConnection_createAnswer_Callback";
+  createAnswer_Callback_1_(mthis, __arg_0) => createAnswer_Callback_1(mthis, __arg_0);
+
+  static createAnswer_Callback_2(mthis, __arg_0, __arg_1) native "RTCPeerConnection_createAnswer_Callback";
+  createAnswer_Callback_2_(mthis, __arg_0, __arg_1) => createAnswer_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createAnswer_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "RTCPeerConnection_createAnswer_Callback";
+  createAnswer_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => createAnswer_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static createAnswer_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "RTCPeerConnection_createAnswer_Callback";
+  createAnswer_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => createAnswer_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static createAnswer_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "RTCPeerConnection_createAnswer_Callback";
+  createAnswer_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => createAnswer_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static createDTMFSender_Callback_0(mthis) native "RTCPeerConnection_createDTMFSender_Callback";
+  createDTMFSender_Callback_0_(mthis) => createDTMFSender_Callback_0(mthis);
+
+  static createDTMFSender_Callback_1(mthis, __arg_0) native "RTCPeerConnection_createDTMFSender_Callback";
+  createDTMFSender_Callback_1_(mthis, __arg_0) => createDTMFSender_Callback_1(mthis, __arg_0);
+
+  static createDTMFSender_Callback_2(mthis, __arg_0, __arg_1) native "RTCPeerConnection_createDTMFSender_Callback";
+  createDTMFSender_Callback_2_(mthis, __arg_0, __arg_1) => createDTMFSender_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createDTMFSender_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "RTCPeerConnection_createDTMFSender_Callback";
+  createDTMFSender_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => createDTMFSender_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static createDataChannel_Callback_0(mthis) native "RTCPeerConnection_createDataChannel_Callback";
+  createDataChannel_Callback_0_(mthis) => createDataChannel_Callback_0(mthis);
+
+  static createDataChannel_Callback_1(mthis, __arg_0) native "RTCPeerConnection_createDataChannel_Callback";
+  createDataChannel_Callback_1_(mthis, __arg_0) => createDataChannel_Callback_1(mthis, __arg_0);
+
+  static createDataChannel_Callback_2(mthis, __arg_0, __arg_1) native "RTCPeerConnection_createDataChannel_Callback";
+  createDataChannel_Callback_2_(mthis, __arg_0, __arg_1) => createDataChannel_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createDataChannel_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "RTCPeerConnection_createDataChannel_Callback";
+  createDataChannel_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => createDataChannel_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static createDataChannel_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "RTCPeerConnection_createDataChannel_Callback";
+  createDataChannel_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => createDataChannel_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static createOffer_Callback_0(mthis) native "RTCPeerConnection_createOffer_Callback";
+  createOffer_Callback_0_(mthis) => createOffer_Callback_0(mthis);
+
+  static createOffer_Callback_1(mthis, __arg_0) native "RTCPeerConnection_createOffer_Callback";
+  createOffer_Callback_1_(mthis, __arg_0) => createOffer_Callback_1(mthis, __arg_0);
+
+  static createOffer_Callback_2(mthis, __arg_0, __arg_1) native "RTCPeerConnection_createOffer_Callback";
+  createOffer_Callback_2_(mthis, __arg_0, __arg_1) => createOffer_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createOffer_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "RTCPeerConnection_createOffer_Callback";
+  createOffer_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => createOffer_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static createOffer_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "RTCPeerConnection_createOffer_Callback";
+  createOffer_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => createOffer_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static createOffer_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "RTCPeerConnection_createOffer_Callback";
+  createOffer_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => createOffer_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static getLocalStreams_Callback_0(mthis) native "RTCPeerConnection_getLocalStreams_Callback";
+  getLocalStreams_Callback_0_(mthis) => getLocalStreams_Callback_0(mthis);
+
+  static getLocalStreams_Callback_1(mthis, __arg_0) native "RTCPeerConnection_getLocalStreams_Callback";
+  getLocalStreams_Callback_1_(mthis, __arg_0) => getLocalStreams_Callback_1(mthis, __arg_0);
+
+  static getLocalStreams_Callback_2(mthis, __arg_0, __arg_1) native "RTCPeerConnection_getLocalStreams_Callback";
+  getLocalStreams_Callback_2_(mthis, __arg_0, __arg_1) => getLocalStreams_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getRemoteStreams_Callback_0(mthis) native "RTCPeerConnection_getRemoteStreams_Callback";
+  getRemoteStreams_Callback_0_(mthis) => getRemoteStreams_Callback_0(mthis);
+
+  static getRemoteStreams_Callback_1(mthis, __arg_0) native "RTCPeerConnection_getRemoteStreams_Callback";
+  getRemoteStreams_Callback_1_(mthis, __arg_0) => getRemoteStreams_Callback_1(mthis, __arg_0);
+
+  static getRemoteStreams_Callback_2(mthis, __arg_0, __arg_1) native "RTCPeerConnection_getRemoteStreams_Callback";
+  getRemoteStreams_Callback_2_(mthis, __arg_0, __arg_1) => getRemoteStreams_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getStats_Callback_0(mthis) native "RTCPeerConnection_getStats_Callback";
+  getStats_Callback_0_(mthis) => getStats_Callback_0(mthis);
+
+  static getStats_Callback_1(mthis, __arg_0) native "RTCPeerConnection_getStats_Callback";
+  getStats_Callback_1_(mthis, __arg_0) => getStats_Callback_1(mthis, __arg_0);
+
+  static getStats_Callback_2(mthis, __arg_0, __arg_1) native "RTCPeerConnection_getStats_Callback";
+  getStats_Callback_2_(mthis, __arg_0, __arg_1) => getStats_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getStats_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "RTCPeerConnection_getStats_Callback";
+  getStats_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getStats_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static getStats_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "RTCPeerConnection_getStats_Callback";
+  getStats_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => getStats_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static getStreamById_Callback_0(mthis) native "RTCPeerConnection_getStreamById_Callback";
+  getStreamById_Callback_0_(mthis) => getStreamById_Callback_0(mthis);
+
+  static getStreamById_Callback_1(mthis, __arg_0) native "RTCPeerConnection_getStreamById_Callback";
+  getStreamById_Callback_1_(mthis, __arg_0) => getStreamById_Callback_1(mthis, __arg_0);
+
+  static getStreamById_Callback_2(mthis, __arg_0, __arg_1) native "RTCPeerConnection_getStreamById_Callback";
+  getStreamById_Callback_2_(mthis, __arg_0, __arg_1) => getStreamById_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getStreamById_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "RTCPeerConnection_getStreamById_Callback";
+  getStreamById_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getStreamById_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
   static iceConnectionState_Getter(mthis) native "RTCPeerConnection_iceConnectionState_Getter";
+  iceConnectionState_Getter_(mthis) => iceConnectionState_Getter(mthis);
 
   static iceGatheringState_Getter(mthis) native "RTCPeerConnection_iceGatheringState_Getter";
+  iceGatheringState_Getter_(mthis) => iceGatheringState_Getter(mthis);
 
   static localDescription_Getter(mthis) native "RTCPeerConnection_localDescription_Getter";
+  localDescription_Getter_(mthis) => localDescription_Getter(mthis);
+
+  static onaddstream_Getter(mthis) native "RTCPeerConnection_onaddstream_Getter";
+  onaddstream_Getter_(mthis) => onaddstream_Getter(mthis);
+
+  static onaddstream_Setter(mthis, __arg_0) native "RTCPeerConnection_onaddstream_Setter";
+  onaddstream_Setter_(mthis, __arg_0) => onaddstream_Setter(mthis, __arg_0);
+
+  static ondatachannel_Getter(mthis) native "RTCPeerConnection_ondatachannel_Getter";
+  ondatachannel_Getter_(mthis) => ondatachannel_Getter(mthis);
+
+  static ondatachannel_Setter(mthis, __arg_0) native "RTCPeerConnection_ondatachannel_Setter";
+  ondatachannel_Setter_(mthis, __arg_0) => ondatachannel_Setter(mthis, __arg_0);
+
+  static onicecandidate_Getter(mthis) native "RTCPeerConnection_onicecandidate_Getter";
+  onicecandidate_Getter_(mthis) => onicecandidate_Getter(mthis);
+
+  static onicecandidate_Setter(mthis, __arg_0) native "RTCPeerConnection_onicecandidate_Setter";
+  onicecandidate_Setter_(mthis, __arg_0) => onicecandidate_Setter(mthis, __arg_0);
+
+  static oniceconnectionstatechange_Getter(mthis) native "RTCPeerConnection_oniceconnectionstatechange_Getter";
+  oniceconnectionstatechange_Getter_(mthis) => oniceconnectionstatechange_Getter(mthis);
+
+  static oniceconnectionstatechange_Setter(mthis, __arg_0) native "RTCPeerConnection_oniceconnectionstatechange_Setter";
+  oniceconnectionstatechange_Setter_(mthis, __arg_0) => oniceconnectionstatechange_Setter(mthis, __arg_0);
+
+  static onnegotiationneeded_Getter(mthis) native "RTCPeerConnection_onnegotiationneeded_Getter";
+  onnegotiationneeded_Getter_(mthis) => onnegotiationneeded_Getter(mthis);
+
+  static onnegotiationneeded_Setter(mthis, __arg_0) native "RTCPeerConnection_onnegotiationneeded_Setter";
+  onnegotiationneeded_Setter_(mthis, __arg_0) => onnegotiationneeded_Setter(mthis, __arg_0);
+
+  static onremovestream_Getter(mthis) native "RTCPeerConnection_onremovestream_Getter";
+  onremovestream_Getter_(mthis) => onremovestream_Getter(mthis);
+
+  static onremovestream_Setter(mthis, __arg_0) native "RTCPeerConnection_onremovestream_Setter";
+  onremovestream_Setter_(mthis, __arg_0) => onremovestream_Setter(mthis, __arg_0);
+
+  static onsignalingstatechange_Getter(mthis) native "RTCPeerConnection_onsignalingstatechange_Getter";
+  onsignalingstatechange_Getter_(mthis) => onsignalingstatechange_Getter(mthis);
+
+  static onsignalingstatechange_Setter(mthis, __arg_0) native "RTCPeerConnection_onsignalingstatechange_Setter";
+  onsignalingstatechange_Setter_(mthis, __arg_0) => onsignalingstatechange_Setter(mthis, __arg_0);
 
   static remoteDescription_Getter(mthis) native "RTCPeerConnection_remoteDescription_Getter";
+  remoteDescription_Getter_(mthis) => remoteDescription_Getter(mthis);
+
+  static removeStream_Callback_0(mthis) native "RTCPeerConnection_removeStream_Callback";
+  removeStream_Callback_0_(mthis) => removeStream_Callback_0(mthis);
+
+  static removeStream_Callback_1(mthis, __arg_0) native "RTCPeerConnection_removeStream_Callback";
+  removeStream_Callback_1_(mthis, __arg_0) => removeStream_Callback_1(mthis, __arg_0);
+
+  static removeStream_Callback_2(mthis, __arg_0, __arg_1) native "RTCPeerConnection_removeStream_Callback";
+  removeStream_Callback_2_(mthis, __arg_0, __arg_1) => removeStream_Callback_2(mthis, __arg_0, __arg_1);
+
+  static removeStream_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "RTCPeerConnection_removeStream_Callback";
+  removeStream_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => removeStream_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static setLocalDescription_Callback_0(mthis) native "RTCPeerConnection_setLocalDescription_Callback";
+  setLocalDescription_Callback_0_(mthis) => setLocalDescription_Callback_0(mthis);
+
+  static setLocalDescription_Callback_1(mthis, __arg_0) native "RTCPeerConnection_setLocalDescription_Callback";
+  setLocalDescription_Callback_1_(mthis, __arg_0) => setLocalDescription_Callback_1(mthis, __arg_0);
+
+  static setLocalDescription_Callback_2(mthis, __arg_0, __arg_1) native "RTCPeerConnection_setLocalDescription_Callback";
+  setLocalDescription_Callback_2_(mthis, __arg_0, __arg_1) => setLocalDescription_Callback_2(mthis, __arg_0, __arg_1);
+
+  static setLocalDescription_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "RTCPeerConnection_setLocalDescription_Callback";
+  setLocalDescription_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => setLocalDescription_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static setLocalDescription_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "RTCPeerConnection_setLocalDescription_Callback";
+  setLocalDescription_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => setLocalDescription_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static setLocalDescription_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "RTCPeerConnection_setLocalDescription_Callback";
+  setLocalDescription_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => setLocalDescription_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static setRemoteDescription_Callback_0(mthis) native "RTCPeerConnection_setRemoteDescription_Callback";
+  setRemoteDescription_Callback_0_(mthis) => setRemoteDescription_Callback_0(mthis);
+
+  static setRemoteDescription_Callback_1(mthis, __arg_0) native "RTCPeerConnection_setRemoteDescription_Callback";
+  setRemoteDescription_Callback_1_(mthis, __arg_0) => setRemoteDescription_Callback_1(mthis, __arg_0);
+
+  static setRemoteDescription_Callback_2(mthis, __arg_0, __arg_1) native "RTCPeerConnection_setRemoteDescription_Callback";
+  setRemoteDescription_Callback_2_(mthis, __arg_0, __arg_1) => setRemoteDescription_Callback_2(mthis, __arg_0, __arg_1);
+
+  static setRemoteDescription_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "RTCPeerConnection_setRemoteDescription_Callback";
+  setRemoteDescription_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => setRemoteDescription_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static setRemoteDescription_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "RTCPeerConnection_setRemoteDescription_Callback";
+  setRemoteDescription_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => setRemoteDescription_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static setRemoteDescription_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "RTCPeerConnection_setRemoteDescription_Callback";
+  setRemoteDescription_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => setRemoteDescription_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
 
   static signalingState_Getter(mthis) native "RTCPeerConnection_signalingState_Getter";
+  signalingState_Getter_(mthis) => signalingState_Getter(mthis);
 
-  static addIceCandidate_Callback_3(mthis, candidate, successCallback, failureCallback) native "RTCPeerConnection_addIceCandidate_Callback";
+  static updateIce_Callback_0(mthis) native "RTCPeerConnection_updateIce_Callback";
+  updateIce_Callback_0_(mthis) => updateIce_Callback_0(mthis);
 
-  static addStream_Callback_2(mthis, stream, mediaConstraints) native "RTCPeerConnection_addStream_Callback";
+  static updateIce_Callback_1(mthis, __arg_0) native "RTCPeerConnection_updateIce_Callback";
+  updateIce_Callback_1_(mthis, __arg_0) => updateIce_Callback_1(mthis, __arg_0);
 
-  static addStream_Callback_1(mthis, stream) native "RTCPeerConnection_addStream_Callback";
+  static updateIce_Callback_2(mthis, __arg_0, __arg_1) native "RTCPeerConnection_updateIce_Callback";
+  updateIce_Callback_2_(mthis, __arg_0, __arg_1) => updateIce_Callback_2(mthis, __arg_0, __arg_1);
 
-  static close_Callback(mthis) native "RTCPeerConnection_close_Callback";
+  static updateIce_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "RTCPeerConnection_updateIce_Callback";
+  updateIce_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => updateIce_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
-  static createAnswer_Callback_3(mthis, successCallback, failureCallback, mediaConstraints) native "RTCPeerConnection_createAnswer_Callback";
+  static updateIce_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "RTCPeerConnection_updateIce_Callback";
+  updateIce_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => updateIce_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
 
-  static createAnswer_Callback_2(mthis, successCallback, failureCallback) native "RTCPeerConnection_createAnswer_Callback";
-
-  static createDTMFSender_Callback_1(mthis, track) native "RTCPeerConnection_createDTMFSender_Callback";
-
-  static createDataChannel_Callback_2(mthis, label, options) native "RTCPeerConnection_createDataChannel_Callback";
-
-  static createDataChannel_Callback_1(mthis, label) native "RTCPeerConnection_createDataChannel_Callback";
-
-  static createOffer_Callback_3(mthis, successCallback, failureCallback, rtcOfferOptions) native "RTCPeerConnection_createOffer_Callback";
-
-  static createOffer_Callback_2(mthis, successCallback, failureCallback) native "RTCPeerConnection_createOffer_Callback";
-
-  static getLocalStreams_Callback(mthis) native "RTCPeerConnection_getLocalStreams_Callback";
-
-  static getRemoteStreams_Callback(mthis) native "RTCPeerConnection_getRemoteStreams_Callback";
-
-  static getStats_Callback_2(mthis, successCallback, selector) native "RTCPeerConnection_getStats_Callback";
-
-  static getStreamById_Callback_1(mthis, streamId) native "RTCPeerConnection_getStreamById_Callback";
-
-  static removeStream_Callback_1(mthis, stream) native "RTCPeerConnection_removeStream_Callback";
-
-  static setLocalDescription_Callback_3(mthis, description, successCallback, failureCallback) native "RTCPeerConnection_setLocalDescription_Callback";
-
-  static setRemoteDescription_Callback_3(mthis, description, successCallback, failureCallback) native "RTCPeerConnection_setRemoteDescription_Callback";
-
-  static updateIce_Callback_2(mthis, configuration, mediaConstraints) native "RTCPeerConnection_updateIce_Callback";
-
-  static updateIce_Callback_1(mthis, configuration) native "RTCPeerConnection_updateIce_Callback";
-
-  static updateIce_Callback(mthis) native "RTCPeerConnection_updateIce_Callback";
 }
 
 class BlinkRTCSessionDescription {
-  static constructorCallback_1(descriptionInitDict) native "RTCSessionDescription_constructorCallback";
+  static final instance = new BlinkRTCSessionDescription();
 
-  static constructorCallback() native "RTCSessionDescription_constructorCallback";
+  static constructorCallback_0() native "RTCSessionDescription_constructorCallback";
+  constructorCallback_0_() => constructorCallback_0();
+
+  static constructorCallback_1(__arg_0) native "RTCSessionDescription_constructorCallback";
+  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+
+  static constructorCallback_2(__arg_0, __arg_1) native "RTCSessionDescription_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+
+  static constructorCallback_3(__arg_0, __arg_1, __arg_2) native "RTCSessionDescription_constructorCallback";
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => constructorCallback_3(__arg_0, __arg_1, __arg_2);
 
   static sdp_Getter(mthis) native "RTCSessionDescription_sdp_Getter";
+  sdp_Getter_(mthis) => sdp_Getter(mthis);
 
-  static sdp_Setter(mthis, value) native "RTCSessionDescription_sdp_Setter";
+  static sdp_Setter(mthis, __arg_0) native "RTCSessionDescription_sdp_Setter";
+  sdp_Setter_(mthis, __arg_0) => sdp_Setter(mthis, __arg_0);
 
   static type_Getter(mthis) native "RTCSessionDescription_type_Getter";
+  type_Getter_(mthis) => type_Getter(mthis);
 
-  static type_Setter(mthis, value) native "RTCSessionDescription_type_Setter";
+  static type_Setter(mthis, __arg_0) native "RTCSessionDescription_type_Setter";
+  type_Setter_(mthis, __arg_0) => type_Setter(mthis, __arg_0);
+
 }
 
 class BlinkRTCStatsReport {
+  static final instance = new BlinkRTCStatsReport();
+
   static id_Getter(mthis) native "RTCStatsReport_id_Getter";
+  id_Getter_(mthis) => id_Getter(mthis);
 
   static local_Getter(mthis) native "RTCStatsReport_local_Getter";
+  local_Getter_(mthis) => local_Getter(mthis);
+
+  static names_Callback_0(mthis) native "RTCStatsReport_names_Callback";
+  names_Callback_0_(mthis) => names_Callback_0(mthis);
+
+  static names_Callback_1(mthis, __arg_0) native "RTCStatsReport_names_Callback";
+  names_Callback_1_(mthis, __arg_0) => names_Callback_1(mthis, __arg_0);
+
+  static names_Callback_2(mthis, __arg_0, __arg_1) native "RTCStatsReport_names_Callback";
+  names_Callback_2_(mthis, __arg_0, __arg_1) => names_Callback_2(mthis, __arg_0, __arg_1);
 
   static remote_Getter(mthis) native "RTCStatsReport_remote_Getter";
+  remote_Getter_(mthis) => remote_Getter(mthis);
+
+  static stat_Callback_0(mthis) native "RTCStatsReport_stat_Callback";
+  stat_Callback_0_(mthis) => stat_Callback_0(mthis);
+
+  static stat_Callback_1(mthis, __arg_0) native "RTCStatsReport_stat_Callback";
+  stat_Callback_1_(mthis, __arg_0) => stat_Callback_1(mthis, __arg_0);
+
+  static stat_Callback_2(mthis, __arg_0, __arg_1) native "RTCStatsReport_stat_Callback";
+  stat_Callback_2_(mthis, __arg_0, __arg_1) => stat_Callback_2(mthis, __arg_0, __arg_1);
+
+  static stat_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "RTCStatsReport_stat_Callback";
+  stat_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => stat_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
   static timestamp_Getter(mthis) native "RTCStatsReport_timestamp_Getter";
+  timestamp_Getter_(mthis) => timestamp_Getter(mthis);
 
   static type_Getter(mthis) native "RTCStatsReport_type_Getter";
+  type_Getter_(mthis) => type_Getter(mthis);
 
-  static names_Callback(mthis) native "RTCStatsReport_names_Callback";
-
-  static stat_Callback_1(mthis, name) native "RTCStatsReport_stat_Callback";
 }
 
 class BlinkRTCStatsResponse {
-  static $__getter___Callback_1(mthis, name) native "RTCStatsResponse___getter___Callback";
+  static final instance = new BlinkRTCStatsResponse();
 
-  static namedItem_Callback_1(mthis, name) native "RTCStatsResponse_namedItem_Callback";
+  static $__getter___Callback_1(mthis, __arg_0) native "RTCStatsResponse___getter___Callback";
+  $__getter___Callback_1_(mthis, __arg_0) => $__getter___Callback_1(mthis, __arg_0);
 
-  static result_Callback(mthis) native "RTCStatsResponse_result_Callback";
+  static namedItem_Callback_0(mthis) native "RTCStatsResponse_namedItem_Callback";
+  namedItem_Callback_0_(mthis) => namedItem_Callback_0(mthis);
+
+  static namedItem_Callback_1(mthis, __arg_0) native "RTCStatsResponse_namedItem_Callback";
+  namedItem_Callback_1_(mthis, __arg_0) => namedItem_Callback_1(mthis, __arg_0);
+
+  static namedItem_Callback_2(mthis, __arg_0, __arg_1) native "RTCStatsResponse_namedItem_Callback";
+  namedItem_Callback_2_(mthis, __arg_0, __arg_1) => namedItem_Callback_2(mthis, __arg_0, __arg_1);
+
+  static namedItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "RTCStatsResponse_namedItem_Callback";
+  namedItem_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => namedItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static result_Callback_0(mthis) native "RTCStatsResponse_result_Callback";
+  result_Callback_0_(mthis) => result_Callback_0(mthis);
+
+  static result_Callback_1(mthis, __arg_0) native "RTCStatsResponse_result_Callback";
+  result_Callback_1_(mthis, __arg_0) => result_Callback_1(mthis, __arg_0);
+
+  static result_Callback_2(mthis, __arg_0, __arg_1) native "RTCStatsResponse_result_Callback";
+  result_Callback_2_(mthis, __arg_0, __arg_1) => result_Callback_2(mthis, __arg_0, __arg_1);
+
 }
 
-class BlinkRadioNodeList {}
+class BlinkRadioNodeList extends BlinkNodeList {
+  static final instance = new BlinkRadioNodeList();
+
+  static $__getter___Callback_1(mthis, __arg_0) native "RadioNodeList___getter___Callback";
+  $__getter___Callback_1_(mthis, __arg_0) => $__getter___Callback_1(mthis, __arg_0);
+
+  static value_Getter(mthis) native "RadioNodeList_value_Getter";
+  value_Getter_(mthis) => value_Getter(mthis);
+
+  static value_Setter(mthis, __arg_0) native "RadioNodeList_value_Setter";
+  value_Setter_(mthis, __arg_0) => value_Setter(mthis, __arg_0);
+
+}
 
 class BlinkRange {
+  static final instance = new BlinkRange();
+
+  static cloneContents_Callback_0(mthis) native "Range_cloneContents_Callback";
+  cloneContents_Callback_0_(mthis) => cloneContents_Callback_0(mthis);
+
+  static cloneContents_Callback_1(mthis, __arg_0) native "Range_cloneContents_Callback";
+  cloneContents_Callback_1_(mthis, __arg_0) => cloneContents_Callback_1(mthis, __arg_0);
+
+  static cloneContents_Callback_2(mthis, __arg_0, __arg_1) native "Range_cloneContents_Callback";
+  cloneContents_Callback_2_(mthis, __arg_0, __arg_1) => cloneContents_Callback_2(mthis, __arg_0, __arg_1);
+
+  static cloneRange_Callback_0(mthis) native "Range_cloneRange_Callback";
+  cloneRange_Callback_0_(mthis) => cloneRange_Callback_0(mthis);
+
+  static cloneRange_Callback_1(mthis, __arg_0) native "Range_cloneRange_Callback";
+  cloneRange_Callback_1_(mthis, __arg_0) => cloneRange_Callback_1(mthis, __arg_0);
+
+  static cloneRange_Callback_2(mthis, __arg_0, __arg_1) native "Range_cloneRange_Callback";
+  cloneRange_Callback_2_(mthis, __arg_0, __arg_1) => cloneRange_Callback_2(mthis, __arg_0, __arg_1);
+
+  static collapse_Callback_0(mthis) native "Range_collapse_Callback";
+  collapse_Callback_0_(mthis) => collapse_Callback_0(mthis);
+
+  static collapse_Callback_1(mthis, __arg_0) native "Range_collapse_Callback";
+  collapse_Callback_1_(mthis, __arg_0) => collapse_Callback_1(mthis, __arg_0);
+
+  static collapse_Callback_2(mthis, __arg_0, __arg_1) native "Range_collapse_Callback";
+  collapse_Callback_2_(mthis, __arg_0, __arg_1) => collapse_Callback_2(mthis, __arg_0, __arg_1);
+
+  static collapse_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Range_collapse_Callback";
+  collapse_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => collapse_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
   static collapsed_Getter(mthis) native "Range_collapsed_Getter";
+  collapsed_Getter_(mthis) => collapsed_Getter(mthis);
 
   static commonAncestorContainer_Getter(mthis) native "Range_commonAncestorContainer_Getter";
+  commonAncestorContainer_Getter_(mthis) => commonAncestorContainer_Getter(mthis);
+
+  static compareBoundaryPoints_Callback_0(mthis) native "Range_compareBoundaryPoints_Callback";
+  compareBoundaryPoints_Callback_0_(mthis) => compareBoundaryPoints_Callback_0(mthis);
+
+  static compareBoundaryPoints_Callback_1(mthis, __arg_0) native "Range_compareBoundaryPoints_Callback";
+  compareBoundaryPoints_Callback_1_(mthis, __arg_0) => compareBoundaryPoints_Callback_1(mthis, __arg_0);
+
+  static compareBoundaryPoints_Callback_2(mthis, __arg_0, __arg_1) native "Range_compareBoundaryPoints_Callback";
+  compareBoundaryPoints_Callback_2_(mthis, __arg_0, __arg_1) => compareBoundaryPoints_Callback_2(mthis, __arg_0, __arg_1);
+
+  static compareBoundaryPoints_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Range_compareBoundaryPoints_Callback";
+  compareBoundaryPoints_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => compareBoundaryPoints_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static compareBoundaryPoints_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Range_compareBoundaryPoints_Callback";
+  compareBoundaryPoints_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => compareBoundaryPoints_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static compareNode_Callback_0(mthis) native "Range_compareNode_Callback";
+  compareNode_Callback_0_(mthis) => compareNode_Callback_0(mthis);
+
+  static compareNode_Callback_1(mthis, __arg_0) native "Range_compareNode_Callback";
+  compareNode_Callback_1_(mthis, __arg_0) => compareNode_Callback_1(mthis, __arg_0);
+
+  static compareNode_Callback_2(mthis, __arg_0, __arg_1) native "Range_compareNode_Callback";
+  compareNode_Callback_2_(mthis, __arg_0, __arg_1) => compareNode_Callback_2(mthis, __arg_0, __arg_1);
+
+  static compareNode_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Range_compareNode_Callback";
+  compareNode_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => compareNode_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static comparePoint_Callback_0(mthis) native "Range_comparePoint_Callback";
+  comparePoint_Callback_0_(mthis) => comparePoint_Callback_0(mthis);
+
+  static comparePoint_Callback_1(mthis, __arg_0) native "Range_comparePoint_Callback";
+  comparePoint_Callback_1_(mthis, __arg_0) => comparePoint_Callback_1(mthis, __arg_0);
+
+  static comparePoint_Callback_2(mthis, __arg_0, __arg_1) native "Range_comparePoint_Callback";
+  comparePoint_Callback_2_(mthis, __arg_0, __arg_1) => comparePoint_Callback_2(mthis, __arg_0, __arg_1);
+
+  static comparePoint_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Range_comparePoint_Callback";
+  comparePoint_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => comparePoint_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static comparePoint_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Range_comparePoint_Callback";
+  comparePoint_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => comparePoint_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static constructorCallback_0() native "Range_constructorCallback";
+  constructorCallback_0_() => constructorCallback_0();
+
+  static constructorCallback_1(__arg_0) native "Range_constructorCallback";
+  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+
+  static constructorCallback_2(__arg_0, __arg_1) native "Range_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+
+  static createContextualFragment_Callback_0(mthis) native "Range_createContextualFragment_Callback";
+  createContextualFragment_Callback_0_(mthis) => createContextualFragment_Callback_0(mthis);
+
+  static createContextualFragment_Callback_1(mthis, __arg_0) native "Range_createContextualFragment_Callback";
+  createContextualFragment_Callback_1_(mthis, __arg_0) => createContextualFragment_Callback_1(mthis, __arg_0);
+
+  static createContextualFragment_Callback_2(mthis, __arg_0, __arg_1) native "Range_createContextualFragment_Callback";
+  createContextualFragment_Callback_2_(mthis, __arg_0, __arg_1) => createContextualFragment_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createContextualFragment_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Range_createContextualFragment_Callback";
+  createContextualFragment_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => createContextualFragment_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static deleteContents_Callback_0(mthis) native "Range_deleteContents_Callback";
+  deleteContents_Callback_0_(mthis) => deleteContents_Callback_0(mthis);
+
+  static deleteContents_Callback_1(mthis, __arg_0) native "Range_deleteContents_Callback";
+  deleteContents_Callback_1_(mthis, __arg_0) => deleteContents_Callback_1(mthis, __arg_0);
+
+  static deleteContents_Callback_2(mthis, __arg_0, __arg_1) native "Range_deleteContents_Callback";
+  deleteContents_Callback_2_(mthis, __arg_0, __arg_1) => deleteContents_Callback_2(mthis, __arg_0, __arg_1);
+
+  static detach_Callback_0(mthis) native "Range_detach_Callback";
+  detach_Callback_0_(mthis) => detach_Callback_0(mthis);
+
+  static detach_Callback_1(mthis, __arg_0) native "Range_detach_Callback";
+  detach_Callback_1_(mthis, __arg_0) => detach_Callback_1(mthis, __arg_0);
+
+  static detach_Callback_2(mthis, __arg_0, __arg_1) native "Range_detach_Callback";
+  detach_Callback_2_(mthis, __arg_0, __arg_1) => detach_Callback_2(mthis, __arg_0, __arg_1);
 
   static endContainer_Getter(mthis) native "Range_endContainer_Getter";
+  endContainer_Getter_(mthis) => endContainer_Getter(mthis);
 
   static endOffset_Getter(mthis) native "Range_endOffset_Getter";
+  endOffset_Getter_(mthis) => endOffset_Getter(mthis);
+
+  static expand_Callback_0(mthis) native "Range_expand_Callback";
+  expand_Callback_0_(mthis) => expand_Callback_0(mthis);
+
+  static expand_Callback_1(mthis, __arg_0) native "Range_expand_Callback";
+  expand_Callback_1_(mthis, __arg_0) => expand_Callback_1(mthis, __arg_0);
+
+  static expand_Callback_2(mthis, __arg_0, __arg_1) native "Range_expand_Callback";
+  expand_Callback_2_(mthis, __arg_0, __arg_1) => expand_Callback_2(mthis, __arg_0, __arg_1);
+
+  static expand_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Range_expand_Callback";
+  expand_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => expand_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static extractContents_Callback_0(mthis) native "Range_extractContents_Callback";
+  extractContents_Callback_0_(mthis) => extractContents_Callback_0(mthis);
+
+  static extractContents_Callback_1(mthis, __arg_0) native "Range_extractContents_Callback";
+  extractContents_Callback_1_(mthis, __arg_0) => extractContents_Callback_1(mthis, __arg_0);
+
+  static extractContents_Callback_2(mthis, __arg_0, __arg_1) native "Range_extractContents_Callback";
+  extractContents_Callback_2_(mthis, __arg_0, __arg_1) => extractContents_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getBoundingClientRect_Callback_0(mthis) native "Range_getBoundingClientRect_Callback";
+  getBoundingClientRect_Callback_0_(mthis) => getBoundingClientRect_Callback_0(mthis);
+
+  static getBoundingClientRect_Callback_1(mthis, __arg_0) native "Range_getBoundingClientRect_Callback";
+  getBoundingClientRect_Callback_1_(mthis, __arg_0) => getBoundingClientRect_Callback_1(mthis, __arg_0);
+
+  static getBoundingClientRect_Callback_2(mthis, __arg_0, __arg_1) native "Range_getBoundingClientRect_Callback";
+  getBoundingClientRect_Callback_2_(mthis, __arg_0, __arg_1) => getBoundingClientRect_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getClientRects_Callback_0(mthis) native "Range_getClientRects_Callback";
+  getClientRects_Callback_0_(mthis) => getClientRects_Callback_0(mthis);
+
+  static getClientRects_Callback_1(mthis, __arg_0) native "Range_getClientRects_Callback";
+  getClientRects_Callback_1_(mthis, __arg_0) => getClientRects_Callback_1(mthis, __arg_0);
+
+  static getClientRects_Callback_2(mthis, __arg_0, __arg_1) native "Range_getClientRects_Callback";
+  getClientRects_Callback_2_(mthis, __arg_0, __arg_1) => getClientRects_Callback_2(mthis, __arg_0, __arg_1);
+
+  static insertNode_Callback_0(mthis) native "Range_insertNode_Callback";
+  insertNode_Callback_0_(mthis) => insertNode_Callback_0(mthis);
+
+  static insertNode_Callback_1(mthis, __arg_0) native "Range_insertNode_Callback";
+  insertNode_Callback_1_(mthis, __arg_0) => insertNode_Callback_1(mthis, __arg_0);
+
+  static insertNode_Callback_2(mthis, __arg_0, __arg_1) native "Range_insertNode_Callback";
+  insertNode_Callback_2_(mthis, __arg_0, __arg_1) => insertNode_Callback_2(mthis, __arg_0, __arg_1);
+
+  static insertNode_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Range_insertNode_Callback";
+  insertNode_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => insertNode_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static intersectsNode_Callback_0(mthis) native "Range_intersectsNode_Callback";
+  intersectsNode_Callback_0_(mthis) => intersectsNode_Callback_0(mthis);
+
+  static intersectsNode_Callback_1(mthis, __arg_0) native "Range_intersectsNode_Callback";
+  intersectsNode_Callback_1_(mthis, __arg_0) => intersectsNode_Callback_1(mthis, __arg_0);
+
+  static intersectsNode_Callback_2(mthis, __arg_0, __arg_1) native "Range_intersectsNode_Callback";
+  intersectsNode_Callback_2_(mthis, __arg_0, __arg_1) => intersectsNode_Callback_2(mthis, __arg_0, __arg_1);
+
+  static intersectsNode_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Range_intersectsNode_Callback";
+  intersectsNode_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => intersectsNode_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static isPointInRange_Callback_0(mthis) native "Range_isPointInRange_Callback";
+  isPointInRange_Callback_0_(mthis) => isPointInRange_Callback_0(mthis);
+
+  static isPointInRange_Callback_1(mthis, __arg_0) native "Range_isPointInRange_Callback";
+  isPointInRange_Callback_1_(mthis, __arg_0) => isPointInRange_Callback_1(mthis, __arg_0);
+
+  static isPointInRange_Callback_2(mthis, __arg_0, __arg_1) native "Range_isPointInRange_Callback";
+  isPointInRange_Callback_2_(mthis, __arg_0, __arg_1) => isPointInRange_Callback_2(mthis, __arg_0, __arg_1);
+
+  static isPointInRange_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Range_isPointInRange_Callback";
+  isPointInRange_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => isPointInRange_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static isPointInRange_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Range_isPointInRange_Callback";
+  isPointInRange_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => isPointInRange_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static selectNodeContents_Callback_0(mthis) native "Range_selectNodeContents_Callback";
+  selectNodeContents_Callback_0_(mthis) => selectNodeContents_Callback_0(mthis);
+
+  static selectNodeContents_Callback_1(mthis, __arg_0) native "Range_selectNodeContents_Callback";
+  selectNodeContents_Callback_1_(mthis, __arg_0) => selectNodeContents_Callback_1(mthis, __arg_0);
+
+  static selectNodeContents_Callback_2(mthis, __arg_0, __arg_1) native "Range_selectNodeContents_Callback";
+  selectNodeContents_Callback_2_(mthis, __arg_0, __arg_1) => selectNodeContents_Callback_2(mthis, __arg_0, __arg_1);
+
+  static selectNodeContents_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Range_selectNodeContents_Callback";
+  selectNodeContents_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => selectNodeContents_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static selectNode_Callback_0(mthis) native "Range_selectNode_Callback";
+  selectNode_Callback_0_(mthis) => selectNode_Callback_0(mthis);
+
+  static selectNode_Callback_1(mthis, __arg_0) native "Range_selectNode_Callback";
+  selectNode_Callback_1_(mthis, __arg_0) => selectNode_Callback_1(mthis, __arg_0);
+
+  static selectNode_Callback_2(mthis, __arg_0, __arg_1) native "Range_selectNode_Callback";
+  selectNode_Callback_2_(mthis, __arg_0, __arg_1) => selectNode_Callback_2(mthis, __arg_0, __arg_1);
+
+  static selectNode_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Range_selectNode_Callback";
+  selectNode_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => selectNode_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static setEndAfter_Callback_0(mthis) native "Range_setEndAfter_Callback";
+  setEndAfter_Callback_0_(mthis) => setEndAfter_Callback_0(mthis);
+
+  static setEndAfter_Callback_1(mthis, __arg_0) native "Range_setEndAfter_Callback";
+  setEndAfter_Callback_1_(mthis, __arg_0) => setEndAfter_Callback_1(mthis, __arg_0);
+
+  static setEndAfter_Callback_2(mthis, __arg_0, __arg_1) native "Range_setEndAfter_Callback";
+  setEndAfter_Callback_2_(mthis, __arg_0, __arg_1) => setEndAfter_Callback_2(mthis, __arg_0, __arg_1);
+
+  static setEndAfter_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Range_setEndAfter_Callback";
+  setEndAfter_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => setEndAfter_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static setEndBefore_Callback_0(mthis) native "Range_setEndBefore_Callback";
+  setEndBefore_Callback_0_(mthis) => setEndBefore_Callback_0(mthis);
+
+  static setEndBefore_Callback_1(mthis, __arg_0) native "Range_setEndBefore_Callback";
+  setEndBefore_Callback_1_(mthis, __arg_0) => setEndBefore_Callback_1(mthis, __arg_0);
+
+  static setEndBefore_Callback_2(mthis, __arg_0, __arg_1) native "Range_setEndBefore_Callback";
+  setEndBefore_Callback_2_(mthis, __arg_0, __arg_1) => setEndBefore_Callback_2(mthis, __arg_0, __arg_1);
+
+  static setEndBefore_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Range_setEndBefore_Callback";
+  setEndBefore_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => setEndBefore_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static setEnd_Callback_0(mthis) native "Range_setEnd_Callback";
+  setEnd_Callback_0_(mthis) => setEnd_Callback_0(mthis);
+
+  static setEnd_Callback_1(mthis, __arg_0) native "Range_setEnd_Callback";
+  setEnd_Callback_1_(mthis, __arg_0) => setEnd_Callback_1(mthis, __arg_0);
+
+  static setEnd_Callback_2(mthis, __arg_0, __arg_1) native "Range_setEnd_Callback";
+  setEnd_Callback_2_(mthis, __arg_0, __arg_1) => setEnd_Callback_2(mthis, __arg_0, __arg_1);
+
+  static setEnd_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Range_setEnd_Callback";
+  setEnd_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => setEnd_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static setEnd_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Range_setEnd_Callback";
+  setEnd_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => setEnd_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static setStartAfter_Callback_0(mthis) native "Range_setStartAfter_Callback";
+  setStartAfter_Callback_0_(mthis) => setStartAfter_Callback_0(mthis);
+
+  static setStartAfter_Callback_1(mthis, __arg_0) native "Range_setStartAfter_Callback";
+  setStartAfter_Callback_1_(mthis, __arg_0) => setStartAfter_Callback_1(mthis, __arg_0);
+
+  static setStartAfter_Callback_2(mthis, __arg_0, __arg_1) native "Range_setStartAfter_Callback";
+  setStartAfter_Callback_2_(mthis, __arg_0, __arg_1) => setStartAfter_Callback_2(mthis, __arg_0, __arg_1);
+
+  static setStartAfter_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Range_setStartAfter_Callback";
+  setStartAfter_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => setStartAfter_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static setStartBefore_Callback_0(mthis) native "Range_setStartBefore_Callback";
+  setStartBefore_Callback_0_(mthis) => setStartBefore_Callback_0(mthis);
+
+  static setStartBefore_Callback_1(mthis, __arg_0) native "Range_setStartBefore_Callback";
+  setStartBefore_Callback_1_(mthis, __arg_0) => setStartBefore_Callback_1(mthis, __arg_0);
+
+  static setStartBefore_Callback_2(mthis, __arg_0, __arg_1) native "Range_setStartBefore_Callback";
+  setStartBefore_Callback_2_(mthis, __arg_0, __arg_1) => setStartBefore_Callback_2(mthis, __arg_0, __arg_1);
+
+  static setStartBefore_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Range_setStartBefore_Callback";
+  setStartBefore_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => setStartBefore_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static setStart_Callback_0(mthis) native "Range_setStart_Callback";
+  setStart_Callback_0_(mthis) => setStart_Callback_0(mthis);
+
+  static setStart_Callback_1(mthis, __arg_0) native "Range_setStart_Callback";
+  setStart_Callback_1_(mthis, __arg_0) => setStart_Callback_1(mthis, __arg_0);
+
+  static setStart_Callback_2(mthis, __arg_0, __arg_1) native "Range_setStart_Callback";
+  setStart_Callback_2_(mthis, __arg_0, __arg_1) => setStart_Callback_2(mthis, __arg_0, __arg_1);
+
+  static setStart_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Range_setStart_Callback";
+  setStart_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => setStart_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static setStart_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Range_setStart_Callback";
+  setStart_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => setStart_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
 
   static startContainer_Getter(mthis) native "Range_startContainer_Getter";
+  startContainer_Getter_(mthis) => startContainer_Getter(mthis);
 
   static startOffset_Getter(mthis) native "Range_startOffset_Getter";
+  startOffset_Getter_(mthis) => startOffset_Getter(mthis);
 
-  static cloneContents_Callback(mthis) native "Range_cloneContents_Callback";
+  static surroundContents_Callback_0(mthis) native "Range_surroundContents_Callback";
+  surroundContents_Callback_0_(mthis) => surroundContents_Callback_0(mthis);
 
-  static cloneRange_Callback(mthis) native "Range_cloneRange_Callback";
+  static surroundContents_Callback_1(mthis, __arg_0) native "Range_surroundContents_Callback";
+  surroundContents_Callback_1_(mthis, __arg_0) => surroundContents_Callback_1(mthis, __arg_0);
 
-  static collapse_Callback_1(mthis, toStart) native "Range_collapse_Callback";
+  static surroundContents_Callback_2(mthis, __arg_0, __arg_1) native "Range_surroundContents_Callback";
+  surroundContents_Callback_2_(mthis, __arg_0, __arg_1) => surroundContents_Callback_2(mthis, __arg_0, __arg_1);
 
-  static collapse_Callback(mthis) native "Range_collapse_Callback";
+  static surroundContents_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Range_surroundContents_Callback";
+  surroundContents_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => surroundContents_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
-  static comparePoint_Callback_2(mthis, refNode, offset) native "Range_comparePoint_Callback";
-
-  static createContextualFragment_Callback_1(mthis, html) native "Range_createContextualFragment_Callback";
-
-  static deleteContents_Callback(mthis) native "Range_deleteContents_Callback";
-
-  static detach_Callback(mthis) native "Range_detach_Callback";
-
-  static expand_Callback_1(mthis, unit) native "Range_expand_Callback";
-
-  static extractContents_Callback(mthis) native "Range_extractContents_Callback";
-
-  static getBoundingClientRect_Callback(mthis) native "Range_getBoundingClientRect_Callback";
-
-  static getClientRects_Callback(mthis) native "Range_getClientRects_Callback";
-
-  static insertNode_Callback_1(mthis, newNode) native "Range_insertNode_Callback";
-
-  static isPointInRange_Callback_2(mthis, refNode, offset) native "Range_isPointInRange_Callback";
-
-  static selectNode_Callback_1(mthis, refNode) native "Range_selectNode_Callback";
-
-  static selectNodeContents_Callback_1(mthis, refNode) native "Range_selectNodeContents_Callback";
-
-  static setEnd_Callback_2(mthis, refNode, offset) native "Range_setEnd_Callback";
-
-  static setEndAfter_Callback_1(mthis, refNode) native "Range_setEndAfter_Callback";
-
-  static setEndBefore_Callback_1(mthis, refNode) native "Range_setEndBefore_Callback";
-
-  static setStart_Callback_2(mthis, refNode, offset) native "Range_setStart_Callback";
-
-  static setStartAfter_Callback_1(mthis, refNode) native "Range_setStartAfter_Callback";
-
-  static setStartBefore_Callback_1(mthis, refNode) native "Range_setStartBefore_Callback";
-
-  static surroundContents_Callback_1(mthis, newParent) native "Range_surroundContents_Callback";
 }
 
-class BlinkReadableStream {}
+class BlinkReadableStream {
+  static final instance = new BlinkReadableStream();
 
-class BlinkRect {}
+}
 
-class BlinkRelatedEvent {
-  static constructorCallback(type, options) native "RelatedEvent_constructorCallback";
+class BlinkRect {
+  static final instance = new BlinkRect();
+
+  static bottom_Getter(mthis) native "Rect_bottom_Getter";
+  bottom_Getter_(mthis) => bottom_Getter(mthis);
+
+  static left_Getter(mthis) native "Rect_left_Getter";
+  left_Getter_(mthis) => left_Getter(mthis);
+
+  static right_Getter(mthis) native "Rect_right_Getter";
+  right_Getter_(mthis) => right_Getter(mthis);
+
+  static top_Getter(mthis) native "Rect_top_Getter";
+  top_Getter_(mthis) => top_Getter(mthis);
+
+}
+
+class BlinkRelatedEvent extends BlinkEvent {
+  static final instance = new BlinkRelatedEvent();
+
+  static constructorCallback_2(__arg_0, __arg_1) native "RelatedEvent_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
 
   static relatedTarget_Getter(mthis) native "RelatedEvent_relatedTarget_Getter";
+  relatedTarget_Getter_(mthis) => relatedTarget_Getter(mthis);
+
 }
 
 class BlinkRequest {
-  static constructorCallback_1(input) native "Request_constructorCallback";
+  static final instance = new BlinkRequest();
 
-  static constructorCallback_2(input, requestInitDict) native "Request_constructorCallback";
+  static constructorCallback_0() native "Request_constructorCallback";
+  constructorCallback_0_() => constructorCallback_0();
+
+  static constructorCallback_1(__arg_0) native "Request_constructorCallback";
+  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+
+  static constructorCallback_2(__arg_0, __arg_1) native "Request_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+
+  static constructorCallback_3(__arg_0, __arg_1, __arg_2) native "Request_constructorCallback";
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => constructorCallback_3(__arg_0, __arg_1, __arg_2);
+
+  static constructorCallback_4(__arg_0, __arg_1, __arg_2, __arg_3) native "Request_constructorCallback";
+  constructorCallback_4_(__arg_0, __arg_1, __arg_2, __arg_3) => constructorCallback_4(__arg_0, __arg_1, __arg_2, __arg_3);
 
   static credentials_Getter(mthis) native "Request_credentials_Getter";
+  credentials_Getter_(mthis) => credentials_Getter(mthis);
 
   static headers_Getter(mthis) native "Request_headers_Getter";
+  headers_Getter_(mthis) => headers_Getter(mthis);
+
+  static method_Getter(mthis) native "Request_method_Getter";
+  method_Getter_(mthis) => method_Getter(mthis);
 
   static mode_Getter(mthis) native "Request_mode_Getter";
+  mode_Getter_(mthis) => mode_Getter(mthis);
 
   static referrer_Getter(mthis) native "Request_referrer_Getter";
+  referrer_Getter_(mthis) => referrer_Getter(mthis);
 
   static url_Getter(mthis) native "Request_url_Getter";
+  url_Getter_(mthis) => url_Getter(mthis);
+
 }
 
-class BlinkResourceProgressEvent {
+class BlinkResourceProgressEvent extends BlinkProgressEvent {
+  static final instance = new BlinkResourceProgressEvent();
+
   static url_Getter(mthis) native "ResourceProgressEvent_url_Getter";
+  url_Getter_(mthis) => url_Getter(mthis);
+
 }
 
 class BlinkResponse {
-  static constructorCallback_1(body) native "Response_constructorCallback";
+  static final instance = new BlinkResponse();
 
-  static constructorCallback_2(body, responseInitDict) native "Response_constructorCallback";
+  static body_Getter(mthis) native "Response_body_Getter";
+  body_Getter_(mthis) => body_Getter(mthis);
+
+  static constructorCallback_0() native "Response_constructorCallback";
+  constructorCallback_0_() => constructorCallback_0();
+
+  static constructorCallback_1(__arg_0) native "Response_constructorCallback";
+  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+
+  static constructorCallback_2(__arg_0, __arg_1) native "Response_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+
+  static constructorCallback_3(__arg_0, __arg_1, __arg_2) native "Response_constructorCallback";
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => constructorCallback_3(__arg_0, __arg_1, __arg_2);
+
+  static constructorCallback_4(__arg_0, __arg_1, __arg_2, __arg_3) native "Response_constructorCallback";
+  constructorCallback_4_(__arg_0, __arg_1, __arg_2, __arg_3) => constructorCallback_4(__arg_0, __arg_1, __arg_2, __arg_3);
+
+  static headers_Getter(mthis) native "Response_headers_Getter";
+  headers_Getter_(mthis) => headers_Getter(mthis);
+
+  static statusText_Getter(mthis) native "Response_statusText_Getter";
+  statusText_Getter_(mthis) => statusText_Getter(mthis);
+
+  static status_Getter(mthis) native "Response_status_Getter";
+  status_Getter_(mthis) => status_Getter(mthis);
+
+  static type_Getter(mthis) native "Response_type_Getter";
+  type_Getter_(mthis) => type_Getter(mthis);
+
+  static url_Getter(mthis) native "Response_url_Getter";
+  url_Getter_(mthis) => url_Getter(mthis);
+
 }
 
 class BlinkSQLError {
+  static final instance = new BlinkSQLError();
+
   static code_Getter(mthis) native "SQLError_code_Getter";
+  code_Getter_(mthis) => code_Getter(mthis);
 
   static message_Getter(mthis) native "SQLError_message_Getter";
+  message_Getter_(mthis) => message_Getter(mthis);
+
 }
 
 class BlinkSQLResultSet {
-  static insertId_Getter(mthis) native "SQLResultSet_insertId_Getter";
+  static final instance = new BlinkSQLResultSet();
 
-  static rows_Getter(mthis) native "SQLResultSet_rows_Getter";
+  static insertId_Getter(mthis) native "SQLResultSet_insertId_Getter";
+  insertId_Getter_(mthis) => insertId_Getter(mthis);
 
   static rowsAffected_Getter(mthis) native "SQLResultSet_rowsAffected_Getter";
+  rowsAffected_Getter_(mthis) => rowsAffected_Getter(mthis);
+
+  static rows_Getter(mthis) native "SQLResultSet_rows_Getter";
+  rows_Getter_(mthis) => rows_Getter(mthis);
+
 }
 
 class BlinkSQLResultSetRowList {
-  static length_Getter(mthis) native "SQLResultSetRowList_length_Getter";
+  static final instance = new BlinkSQLResultSetRowList();
 
-  static item_Callback_1(mthis, index) native "SQLResultSetRowList_item_Callback";
+  static item_Callback_0(mthis) native "SQLResultSetRowList_item_Callback";
+  item_Callback_0_(mthis) => item_Callback_0(mthis);
+
+  static item_Callback_1(mthis, __arg_0) native "SQLResultSetRowList_item_Callback";
+  item_Callback_1_(mthis, __arg_0) => item_Callback_1(mthis, __arg_0);
+
+  static item_Callback_2(mthis, __arg_0, __arg_1) native "SQLResultSetRowList_item_Callback";
+  item_Callback_2_(mthis, __arg_0, __arg_1) => item_Callback_2(mthis, __arg_0, __arg_1);
+
+  static item_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SQLResultSetRowList_item_Callback";
+  item_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => item_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static length_Getter(mthis) native "SQLResultSetRowList_length_Getter";
+  length_Getter_(mthis) => length_Getter(mthis);
+
 }
 
 class BlinkSQLTransaction {
-  static executeSql_Callback_4(mthis, sqlStatement, arguments, callback, errorCallback) native "SQLTransaction_executeSql_Callback";
+  static final instance = new BlinkSQLTransaction();
+
+  static executeSql_Callback_0(mthis) native "SQLTransaction_executeSql_Callback";
+  executeSql_Callback_0_(mthis) => executeSql_Callback_0(mthis);
+
+  static executeSql_Callback_1(mthis, __arg_0) native "SQLTransaction_executeSql_Callback";
+  executeSql_Callback_1_(mthis, __arg_0) => executeSql_Callback_1(mthis, __arg_0);
+
+  static executeSql_Callback_2(mthis, __arg_0, __arg_1) native "SQLTransaction_executeSql_Callback";
+  executeSql_Callback_2_(mthis, __arg_0, __arg_1) => executeSql_Callback_2(mthis, __arg_0, __arg_1);
+
+  static executeSql_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SQLTransaction_executeSql_Callback";
+  executeSql_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => executeSql_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static executeSql_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "SQLTransaction_executeSql_Callback";
+  executeSql_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => executeSql_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static executeSql_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "SQLTransaction_executeSql_Callback";
+  executeSql_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => executeSql_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static executeSql_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "SQLTransaction_executeSql_Callback";
+  executeSql_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => executeSql_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
 }
 
-class BlinkSQLTransactionSync {}
+class BlinkSQLTransactionSync {
+  static final instance = new BlinkSQLTransactionSync();
 
-class BlinkSVGElement {
-  static className_Getter(mthis) native "SVGElement_className_Getter";
+  static executeSql_Callback_0(mthis) native "SQLTransactionSync_executeSql_Callback";
+  executeSql_Callback_0_(mthis) => executeSql_Callback_0(mthis);
 
-  static ownerSVGElement_Getter(mthis) native "SVGElement_ownerSVGElement_Getter";
+  static executeSql_Callback_1(mthis, __arg_0) native "SQLTransactionSync_executeSql_Callback";
+  executeSql_Callback_1_(mthis, __arg_0) => executeSql_Callback_1(mthis, __arg_0);
 
-  static style_Getter(mthis) native "SVGElement_style_Getter";
+  static executeSql_Callback_2(mthis, __arg_0, __arg_1) native "SQLTransactionSync_executeSql_Callback";
+  executeSql_Callback_2_(mthis, __arg_0, __arg_1) => executeSql_Callback_2(mthis, __arg_0, __arg_1);
 
-  static tabIndex_Getter(mthis) native "SVGElement_tabIndex_Getter";
+  static executeSql_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SQLTransactionSync_executeSql_Callback";
+  executeSql_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => executeSql_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
-  static tabIndex_Setter(mthis, value) native "SVGElement_tabIndex_Setter";
+  static executeSql_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "SQLTransactionSync_executeSql_Callback";
+  executeSql_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => executeSql_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
 
-  static viewportElement_Getter(mthis) native "SVGElement_viewportElement_Getter";
-
-  static xmlbase_Getter(mthis) native "SVGElement_xmlbase_Getter";
-
-  static xmlbase_Setter(mthis, value) native "SVGElement_xmlbase_Setter";
-
-  static xmllang_Getter(mthis) native "SVGElement_xmllang_Getter";
-
-  static xmllang_Setter(mthis, value) native "SVGElement_xmllang_Setter";
-
-  static xmlspace_Getter(mthis) native "SVGElement_xmlspace_Getter";
-
-  static xmlspace_Setter(mthis, value) native "SVGElement_xmlspace_Setter";
 }
 
-class BlinkSVGTests {
-  static requiredExtensions_Getter(mthis) native "SVGTests_requiredExtensions_Getter";
-
-  static requiredFeatures_Getter(mthis) native "SVGTests_requiredFeatures_Getter";
-
-  static systemLanguage_Getter(mthis) native "SVGTests_systemLanguage_Getter";
-
-  static hasExtension_Callback_1(mthis, extension) native "SVGTests_hasExtension_Callback";
-}
-
-class BlinkSVGGraphicsElement {
-  static farthestViewportElement_Getter(mthis) native "SVGGraphicsElement_farthestViewportElement_Getter";
-
-  static nearestViewportElement_Getter(mthis) native "SVGGraphicsElement_nearestViewportElement_Getter";
-
-  static transform_Getter(mthis) native "SVGGraphicsElement_transform_Getter";
-
-  static getBBox_Callback(mthis) native "SVGGraphicsElement_getBBox_Callback";
-
-  static getCTM_Callback(mthis) native "SVGGraphicsElement_getCTM_Callback";
-
-  static getScreenCTM_Callback(mthis) native "SVGGraphicsElement_getScreenCTM_Callback";
-
-  static getTransformToElement_Callback_1(mthis, element) native "SVGGraphicsElement_getTransformToElement_Callback";
-
-  static requiredExtensions_Getter(mthis) native "SVGGraphicsElement_requiredExtensions_Getter";
-
-  static requiredFeatures_Getter(mthis) native "SVGGraphicsElement_requiredFeatures_Getter";
-
-  static systemLanguage_Getter(mthis) native "SVGGraphicsElement_systemLanguage_Getter";
-
-  static hasExtension_Callback_1(mthis, extension) native "SVGGraphicsElement_hasExtension_Callback";
-}
-
-class BlinkSVGURIReference {
-  static href_Getter(mthis) native "SVGURIReference_href_Getter";
-}
-
-class BlinkSVGAElement {
-  static target_Getter(mthis) native "SVGAElement_target_Getter";
+class BlinkSVGAElement extends BlinkSVGGraphicsElement {
+  static final instance = new BlinkSVGAElement();
 
   static href_Getter(mthis) native "SVGAElement_href_Getter";
+  href_Getter_(mthis) => href_Getter(mthis);
+
+  static target_Getter(mthis) native "SVGAElement_target_Getter";
+  target_Getter_(mthis) => target_Getter(mthis);
+
 }
 
-class BlinkSVGAltGlyphDefElement {}
+class BlinkSVGAltGlyphDefElement extends BlinkSVGElement {
+  static final instance = new BlinkSVGAltGlyphDefElement();
 
-class BlinkSVGTextContentElement {
-  static lengthAdjust_Getter(mthis) native "SVGTextContentElement_lengthAdjust_Getter";
-
-  static textLength_Getter(mthis) native "SVGTextContentElement_textLength_Getter";
-
-  static getCharNumAtPosition_Callback_1(mthis, point) native "SVGTextContentElement_getCharNumAtPosition_Callback";
-
-  static getComputedTextLength_Callback(mthis) native "SVGTextContentElement_getComputedTextLength_Callback";
-
-  static getEndPositionOfChar_Callback_1(mthis, offset) native "SVGTextContentElement_getEndPositionOfChar_Callback";
-
-  static getExtentOfChar_Callback_1(mthis, offset) native "SVGTextContentElement_getExtentOfChar_Callback";
-
-  static getNumberOfChars_Callback(mthis) native "SVGTextContentElement_getNumberOfChars_Callback";
-
-  static getRotationOfChar_Callback_1(mthis, offset) native "SVGTextContentElement_getRotationOfChar_Callback";
-
-  static getStartPositionOfChar_Callback_1(mthis, offset) native "SVGTextContentElement_getStartPositionOfChar_Callback";
-
-  static getSubStringLength_Callback_2(mthis, offset, length) native "SVGTextContentElement_getSubStringLength_Callback";
-
-  static selectSubString_Callback_2(mthis, offset, length) native "SVGTextContentElement_selectSubString_Callback";
 }
 
-class BlinkSVGTextPositioningElement {
-  static dx_Getter(mthis) native "SVGTextPositioningElement_dx_Getter";
+class BlinkSVGAltGlyphElement extends BlinkSVGTextPositioningElement {
+  static final instance = new BlinkSVGAltGlyphElement();
 
-  static dy_Getter(mthis) native "SVGTextPositioningElement_dy_Getter";
-
-  static rotate_Getter(mthis) native "SVGTextPositioningElement_rotate_Getter";
-
-  static x_Getter(mthis) native "SVGTextPositioningElement_x_Getter";
-
-  static y_Getter(mthis) native "SVGTextPositioningElement_y_Getter";
-}
-
-class BlinkSVGAltGlyphElement {
   static format_Getter(mthis) native "SVGAltGlyphElement_format_Getter";
+  format_Getter_(mthis) => format_Getter(mthis);
 
-  static format_Setter(mthis, value) native "SVGAltGlyphElement_format_Setter";
+  static format_Setter(mthis, __arg_0) native "SVGAltGlyphElement_format_Setter";
+  format_Setter_(mthis, __arg_0) => format_Setter(mthis, __arg_0);
 
   static glyphRef_Getter(mthis) native "SVGAltGlyphElement_glyphRef_Getter";
+  glyphRef_Getter_(mthis) => glyphRef_Getter(mthis);
 
-  static glyphRef_Setter(mthis, value) native "SVGAltGlyphElement_glyphRef_Setter";
+  static glyphRef_Setter(mthis, __arg_0) native "SVGAltGlyphElement_glyphRef_Setter";
+  glyphRef_Setter_(mthis, __arg_0) => glyphRef_Setter(mthis, __arg_0);
 
   static href_Getter(mthis) native "SVGAltGlyphElement_href_Getter";
+  href_Getter_(mthis) => href_Getter(mthis);
+
 }
 
-class BlinkSVGAltGlyphItemElement {}
+class BlinkSVGAltGlyphItemElement extends BlinkSVGElement {
+  static final instance = new BlinkSVGAltGlyphItemElement();
+
+}
 
 class BlinkSVGAngle {
+  static final instance = new BlinkSVGAngle();
+
+  static convertToSpecifiedUnits_Callback_0(mthis) native "SVGAngle_convertToSpecifiedUnits_Callback";
+  convertToSpecifiedUnits_Callback_0_(mthis) => convertToSpecifiedUnits_Callback_0(mthis);
+
+  static convertToSpecifiedUnits_Callback_1(mthis, __arg_0) native "SVGAngle_convertToSpecifiedUnits_Callback";
+  convertToSpecifiedUnits_Callback_1_(mthis, __arg_0) => convertToSpecifiedUnits_Callback_1(mthis, __arg_0);
+
+  static convertToSpecifiedUnits_Callback_2(mthis, __arg_0, __arg_1) native "SVGAngle_convertToSpecifiedUnits_Callback";
+  convertToSpecifiedUnits_Callback_2_(mthis, __arg_0, __arg_1) => convertToSpecifiedUnits_Callback_2(mthis, __arg_0, __arg_1);
+
+  static convertToSpecifiedUnits_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGAngle_convertToSpecifiedUnits_Callback";
+  convertToSpecifiedUnits_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => convertToSpecifiedUnits_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static newValueSpecifiedUnits_Callback_0(mthis) native "SVGAngle_newValueSpecifiedUnits_Callback";
+  newValueSpecifiedUnits_Callback_0_(mthis) => newValueSpecifiedUnits_Callback_0(mthis);
+
+  static newValueSpecifiedUnits_Callback_1(mthis, __arg_0) native "SVGAngle_newValueSpecifiedUnits_Callback";
+  newValueSpecifiedUnits_Callback_1_(mthis, __arg_0) => newValueSpecifiedUnits_Callback_1(mthis, __arg_0);
+
+  static newValueSpecifiedUnits_Callback_2(mthis, __arg_0, __arg_1) native "SVGAngle_newValueSpecifiedUnits_Callback";
+  newValueSpecifiedUnits_Callback_2_(mthis, __arg_0, __arg_1) => newValueSpecifiedUnits_Callback_2(mthis, __arg_0, __arg_1);
+
+  static newValueSpecifiedUnits_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGAngle_newValueSpecifiedUnits_Callback";
+  newValueSpecifiedUnits_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => newValueSpecifiedUnits_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static newValueSpecifiedUnits_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "SVGAngle_newValueSpecifiedUnits_Callback";
+  newValueSpecifiedUnits_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => newValueSpecifiedUnits_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
   static unitType_Getter(mthis) native "SVGAngle_unitType_Getter";
-
-  static value_Getter(mthis) native "SVGAngle_value_Getter";
-
-  static value_Setter(mthis, value) native "SVGAngle_value_Setter";
+  unitType_Getter_(mthis) => unitType_Getter(mthis);
 
   static valueAsString_Getter(mthis) native "SVGAngle_valueAsString_Getter";
+  valueAsString_Getter_(mthis) => valueAsString_Getter(mthis);
 
-  static valueAsString_Setter(mthis, value) native "SVGAngle_valueAsString_Setter";
+  static valueAsString_Setter(mthis, __arg_0) native "SVGAngle_valueAsString_Setter";
+  valueAsString_Setter_(mthis, __arg_0) => valueAsString_Setter(mthis, __arg_0);
 
   static valueInSpecifiedUnits_Getter(mthis) native "SVGAngle_valueInSpecifiedUnits_Getter";
+  valueInSpecifiedUnits_Getter_(mthis) => valueInSpecifiedUnits_Getter(mthis);
 
-  static valueInSpecifiedUnits_Setter(mthis, value) native "SVGAngle_valueInSpecifiedUnits_Setter";
+  static valueInSpecifiedUnits_Setter(mthis, __arg_0) native "SVGAngle_valueInSpecifiedUnits_Setter";
+  valueInSpecifiedUnits_Setter_(mthis, __arg_0) => valueInSpecifiedUnits_Setter(mthis, __arg_0);
 
-  static convertToSpecifiedUnits_Callback_1(mthis, unitType) native "SVGAngle_convertToSpecifiedUnits_Callback";
+  static value_Getter(mthis) native "SVGAngle_value_Getter";
+  value_Getter_(mthis) => value_Getter(mthis);
 
-  static newValueSpecifiedUnits_Callback_2(mthis, unitType, valueInSpecifiedUnits) native "SVGAngle_newValueSpecifiedUnits_Callback";
+  static value_Setter(mthis, __arg_0) native "SVGAngle_value_Setter";
+  value_Setter_(mthis, __arg_0) => value_Setter(mthis, __arg_0);
+
 }
 
-class BlinkSVGAnimationElement {
-  static targetElement_Getter(mthis) native "SVGAnimationElement_targetElement_Getter";
+class BlinkSVGAnimateElement extends BlinkSVGAnimationElement {
+  static final instance = new BlinkSVGAnimateElement();
 
-  static beginElement_Callback(mthis) native "SVGAnimationElement_beginElement_Callback";
-
-  static beginElementAt_Callback_1(mthis, offset) native "SVGAnimationElement_beginElementAt_Callback";
-
-  static endElement_Callback(mthis) native "SVGAnimationElement_endElement_Callback";
-
-  static endElementAt_Callback_1(mthis, offset) native "SVGAnimationElement_endElementAt_Callback";
-
-  static getCurrentTime_Callback(mthis) native "SVGAnimationElement_getCurrentTime_Callback";
-
-  static getSimpleDuration_Callback(mthis) native "SVGAnimationElement_getSimpleDuration_Callback";
-
-  static getStartTime_Callback(mthis) native "SVGAnimationElement_getStartTime_Callback";
-
-  static requiredExtensions_Getter(mthis) native "SVGAnimationElement_requiredExtensions_Getter";
-
-  static requiredFeatures_Getter(mthis) native "SVGAnimationElement_requiredFeatures_Getter";
-
-  static systemLanguage_Getter(mthis) native "SVGAnimationElement_systemLanguage_Getter";
-
-  static hasExtension_Callback_1(mthis, extension) native "SVGAnimationElement_hasExtension_Callback";
 }
 
-class BlinkSVGAnimateElement {}
+class BlinkSVGAnimateMotionElement extends BlinkSVGAnimationElement {
+  static final instance = new BlinkSVGAnimateMotionElement();
 
-class BlinkSVGAnimateMotionElement {}
+}
 
-class BlinkSVGAnimateTransformElement {}
+class BlinkSVGAnimateTransformElement extends BlinkSVGAnimationElement {
+  static final instance = new BlinkSVGAnimateTransformElement();
+
+}
 
 class BlinkSVGAnimatedAngle {
+  static final instance = new BlinkSVGAnimatedAngle();
+
   static animVal_Getter(mthis) native "SVGAnimatedAngle_animVal_Getter";
+  animVal_Getter_(mthis) => animVal_Getter(mthis);
 
   static baseVal_Getter(mthis) native "SVGAnimatedAngle_baseVal_Getter";
+  baseVal_Getter_(mthis) => baseVal_Getter(mthis);
+
 }
 
 class BlinkSVGAnimatedBoolean {
+  static final instance = new BlinkSVGAnimatedBoolean();
+
   static animVal_Getter(mthis) native "SVGAnimatedBoolean_animVal_Getter";
+  animVal_Getter_(mthis) => animVal_Getter(mthis);
 
   static baseVal_Getter(mthis) native "SVGAnimatedBoolean_baseVal_Getter";
+  baseVal_Getter_(mthis) => baseVal_Getter(mthis);
 
-  static baseVal_Setter(mthis, value) native "SVGAnimatedBoolean_baseVal_Setter";
+  static baseVal_Setter(mthis, __arg_0) native "SVGAnimatedBoolean_baseVal_Setter";
+  baseVal_Setter_(mthis, __arg_0) => baseVal_Setter(mthis, __arg_0);
+
 }
 
 class BlinkSVGAnimatedEnumeration {
+  static final instance = new BlinkSVGAnimatedEnumeration();
+
   static animVal_Getter(mthis) native "SVGAnimatedEnumeration_animVal_Getter";
+  animVal_Getter_(mthis) => animVal_Getter(mthis);
 
   static baseVal_Getter(mthis) native "SVGAnimatedEnumeration_baseVal_Getter";
+  baseVal_Getter_(mthis) => baseVal_Getter(mthis);
 
-  static baseVal_Setter(mthis, value) native "SVGAnimatedEnumeration_baseVal_Setter";
+  static baseVal_Setter(mthis, __arg_0) native "SVGAnimatedEnumeration_baseVal_Setter";
+  baseVal_Setter_(mthis, __arg_0) => baseVal_Setter(mthis, __arg_0);
+
 }
 
 class BlinkSVGAnimatedInteger {
+  static final instance = new BlinkSVGAnimatedInteger();
+
   static animVal_Getter(mthis) native "SVGAnimatedInteger_animVal_Getter";
+  animVal_Getter_(mthis) => animVal_Getter(mthis);
 
   static baseVal_Getter(mthis) native "SVGAnimatedInteger_baseVal_Getter";
+  baseVal_Getter_(mthis) => baseVal_Getter(mthis);
 
-  static baseVal_Setter(mthis, value) native "SVGAnimatedInteger_baseVal_Setter";
+  static baseVal_Setter(mthis, __arg_0) native "SVGAnimatedInteger_baseVal_Setter";
+  baseVal_Setter_(mthis, __arg_0) => baseVal_Setter(mthis, __arg_0);
+
 }
 
 class BlinkSVGAnimatedLength {
+  static final instance = new BlinkSVGAnimatedLength();
+
   static animVal_Getter(mthis) native "SVGAnimatedLength_animVal_Getter";
+  animVal_Getter_(mthis) => animVal_Getter(mthis);
 
   static baseVal_Getter(mthis) native "SVGAnimatedLength_baseVal_Getter";
+  baseVal_Getter_(mthis) => baseVal_Getter(mthis);
+
 }
 
 class BlinkSVGAnimatedLengthList {
+  static final instance = new BlinkSVGAnimatedLengthList();
+
   static animVal_Getter(mthis) native "SVGAnimatedLengthList_animVal_Getter";
+  animVal_Getter_(mthis) => animVal_Getter(mthis);
 
   static baseVal_Getter(mthis) native "SVGAnimatedLengthList_baseVal_Getter";
+  baseVal_Getter_(mthis) => baseVal_Getter(mthis);
+
 }
 
 class BlinkSVGAnimatedNumber {
+  static final instance = new BlinkSVGAnimatedNumber();
+
   static animVal_Getter(mthis) native "SVGAnimatedNumber_animVal_Getter";
+  animVal_Getter_(mthis) => animVal_Getter(mthis);
 
   static baseVal_Getter(mthis) native "SVGAnimatedNumber_baseVal_Getter";
+  baseVal_Getter_(mthis) => baseVal_Getter(mthis);
 
-  static baseVal_Setter(mthis, value) native "SVGAnimatedNumber_baseVal_Setter";
+  static baseVal_Setter(mthis, __arg_0) native "SVGAnimatedNumber_baseVal_Setter";
+  baseVal_Setter_(mthis, __arg_0) => baseVal_Setter(mthis, __arg_0);
+
 }
 
 class BlinkSVGAnimatedNumberList {
+  static final instance = new BlinkSVGAnimatedNumberList();
+
   static animVal_Getter(mthis) native "SVGAnimatedNumberList_animVal_Getter";
+  animVal_Getter_(mthis) => animVal_Getter(mthis);
 
   static baseVal_Getter(mthis) native "SVGAnimatedNumberList_baseVal_Getter";
+  baseVal_Getter_(mthis) => baseVal_Getter(mthis);
+
 }
 
 class BlinkSVGAnimatedPreserveAspectRatio {
+  static final instance = new BlinkSVGAnimatedPreserveAspectRatio();
+
   static animVal_Getter(mthis) native "SVGAnimatedPreserveAspectRatio_animVal_Getter";
+  animVal_Getter_(mthis) => animVal_Getter(mthis);
 
   static baseVal_Getter(mthis) native "SVGAnimatedPreserveAspectRatio_baseVal_Getter";
+  baseVal_Getter_(mthis) => baseVal_Getter(mthis);
+
 }
 
 class BlinkSVGAnimatedRect {
+  static final instance = new BlinkSVGAnimatedRect();
+
   static animVal_Getter(mthis) native "SVGAnimatedRect_animVal_Getter";
+  animVal_Getter_(mthis) => animVal_Getter(mthis);
 
   static baseVal_Getter(mthis) native "SVGAnimatedRect_baseVal_Getter";
+  baseVal_Getter_(mthis) => baseVal_Getter(mthis);
+
 }
 
 class BlinkSVGAnimatedString {
+  static final instance = new BlinkSVGAnimatedString();
+
   static animVal_Getter(mthis) native "SVGAnimatedString_animVal_Getter";
+  animVal_Getter_(mthis) => animVal_Getter(mthis);
 
   static baseVal_Getter(mthis) native "SVGAnimatedString_baseVal_Getter";
+  baseVal_Getter_(mthis) => baseVal_Getter(mthis);
 
-  static baseVal_Setter(mthis, value) native "SVGAnimatedString_baseVal_Setter";
+  static baseVal_Setter(mthis, __arg_0) native "SVGAnimatedString_baseVal_Setter";
+  baseVal_Setter_(mthis, __arg_0) => baseVal_Setter(mthis, __arg_0);
+
 }
 
 class BlinkSVGAnimatedTransformList {
+  static final instance = new BlinkSVGAnimatedTransformList();
+
   static animVal_Getter(mthis) native "SVGAnimatedTransformList_animVal_Getter";
+  animVal_Getter_(mthis) => animVal_Getter(mthis);
 
   static baseVal_Getter(mthis) native "SVGAnimatedTransformList_baseVal_Getter";
+  baseVal_Getter_(mthis) => baseVal_Getter(mthis);
+
 }
 
-class BlinkSVGGeometryElement {
-  static isPointInFill_Callback_1(mthis, point) native "SVGGeometryElement_isPointInFill_Callback";
+class BlinkSVGAnimationElement extends BlinkSVGElement {
+  static final instance = new BlinkSVGAnimationElement();
 
-  static isPointInStroke_Callback_1(mthis, point) native "SVGGeometryElement_isPointInStroke_Callback";
+  static beginElementAt_Callback_0(mthis) native "SVGAnimationElement_beginElementAt_Callback";
+  beginElementAt_Callback_0_(mthis) => beginElementAt_Callback_0(mthis);
+
+  static beginElementAt_Callback_1(mthis, __arg_0) native "SVGAnimationElement_beginElementAt_Callback";
+  beginElementAt_Callback_1_(mthis, __arg_0) => beginElementAt_Callback_1(mthis, __arg_0);
+
+  static beginElementAt_Callback_2(mthis, __arg_0, __arg_1) native "SVGAnimationElement_beginElementAt_Callback";
+  beginElementAt_Callback_2_(mthis, __arg_0, __arg_1) => beginElementAt_Callback_2(mthis, __arg_0, __arg_1);
+
+  static beginElementAt_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGAnimationElement_beginElementAt_Callback";
+  beginElementAt_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => beginElementAt_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static beginElement_Callback_0(mthis) native "SVGAnimationElement_beginElement_Callback";
+  beginElement_Callback_0_(mthis) => beginElement_Callback_0(mthis);
+
+  static beginElement_Callback_1(mthis, __arg_0) native "SVGAnimationElement_beginElement_Callback";
+  beginElement_Callback_1_(mthis, __arg_0) => beginElement_Callback_1(mthis, __arg_0);
+
+  static beginElement_Callback_2(mthis, __arg_0, __arg_1) native "SVGAnimationElement_beginElement_Callback";
+  beginElement_Callback_2_(mthis, __arg_0, __arg_1) => beginElement_Callback_2(mthis, __arg_0, __arg_1);
+
+  static endElementAt_Callback_0(mthis) native "SVGAnimationElement_endElementAt_Callback";
+  endElementAt_Callback_0_(mthis) => endElementAt_Callback_0(mthis);
+
+  static endElementAt_Callback_1(mthis, __arg_0) native "SVGAnimationElement_endElementAt_Callback";
+  endElementAt_Callback_1_(mthis, __arg_0) => endElementAt_Callback_1(mthis, __arg_0);
+
+  static endElementAt_Callback_2(mthis, __arg_0, __arg_1) native "SVGAnimationElement_endElementAt_Callback";
+  endElementAt_Callback_2_(mthis, __arg_0, __arg_1) => endElementAt_Callback_2(mthis, __arg_0, __arg_1);
+
+  static endElementAt_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGAnimationElement_endElementAt_Callback";
+  endElementAt_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => endElementAt_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static endElement_Callback_0(mthis) native "SVGAnimationElement_endElement_Callback";
+  endElement_Callback_0_(mthis) => endElement_Callback_0(mthis);
+
+  static endElement_Callback_1(mthis, __arg_0) native "SVGAnimationElement_endElement_Callback";
+  endElement_Callback_1_(mthis, __arg_0) => endElement_Callback_1(mthis, __arg_0);
+
+  static endElement_Callback_2(mthis, __arg_0, __arg_1) native "SVGAnimationElement_endElement_Callback";
+  endElement_Callback_2_(mthis, __arg_0, __arg_1) => endElement_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getCurrentTime_Callback_0(mthis) native "SVGAnimationElement_getCurrentTime_Callback";
+  getCurrentTime_Callback_0_(mthis) => getCurrentTime_Callback_0(mthis);
+
+  static getCurrentTime_Callback_1(mthis, __arg_0) native "SVGAnimationElement_getCurrentTime_Callback";
+  getCurrentTime_Callback_1_(mthis, __arg_0) => getCurrentTime_Callback_1(mthis, __arg_0);
+
+  static getCurrentTime_Callback_2(mthis, __arg_0, __arg_1) native "SVGAnimationElement_getCurrentTime_Callback";
+  getCurrentTime_Callback_2_(mthis, __arg_0, __arg_1) => getCurrentTime_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getSimpleDuration_Callback_0(mthis) native "SVGAnimationElement_getSimpleDuration_Callback";
+  getSimpleDuration_Callback_0_(mthis) => getSimpleDuration_Callback_0(mthis);
+
+  static getSimpleDuration_Callback_1(mthis, __arg_0) native "SVGAnimationElement_getSimpleDuration_Callback";
+  getSimpleDuration_Callback_1_(mthis, __arg_0) => getSimpleDuration_Callback_1(mthis, __arg_0);
+
+  static getSimpleDuration_Callback_2(mthis, __arg_0, __arg_1) native "SVGAnimationElement_getSimpleDuration_Callback";
+  getSimpleDuration_Callback_2_(mthis, __arg_0, __arg_1) => getSimpleDuration_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getStartTime_Callback_0(mthis) native "SVGAnimationElement_getStartTime_Callback";
+  getStartTime_Callback_0_(mthis) => getStartTime_Callback_0(mthis);
+
+  static getStartTime_Callback_1(mthis, __arg_0) native "SVGAnimationElement_getStartTime_Callback";
+  getStartTime_Callback_1_(mthis, __arg_0) => getStartTime_Callback_1(mthis, __arg_0);
+
+  static getStartTime_Callback_2(mthis, __arg_0, __arg_1) native "SVGAnimationElement_getStartTime_Callback";
+  getStartTime_Callback_2_(mthis, __arg_0, __arg_1) => getStartTime_Callback_2(mthis, __arg_0, __arg_1);
+
+  static hasExtension_Callback_0(mthis) native "SVGAnimationElement_hasExtension_Callback";
+  hasExtension_Callback_0_(mthis) => hasExtension_Callback_0(mthis);
+
+  static hasExtension_Callback_1(mthis, __arg_0) native "SVGAnimationElement_hasExtension_Callback";
+  hasExtension_Callback_1_(mthis, __arg_0) => hasExtension_Callback_1(mthis, __arg_0);
+
+  static hasExtension_Callback_2(mthis, __arg_0, __arg_1) native "SVGAnimationElement_hasExtension_Callback";
+  hasExtension_Callback_2_(mthis, __arg_0, __arg_1) => hasExtension_Callback_2(mthis, __arg_0, __arg_1);
+
+  static hasExtension_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGAnimationElement_hasExtension_Callback";
+  hasExtension_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => hasExtension_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static onbegin_Getter(mthis) native "SVGAnimationElement_onbegin_Getter";
+  onbegin_Getter_(mthis) => onbegin_Getter(mthis);
+
+  static onbegin_Setter(mthis, __arg_0) native "SVGAnimationElement_onbegin_Setter";
+  onbegin_Setter_(mthis, __arg_0) => onbegin_Setter(mthis, __arg_0);
+
+  static onend_Getter(mthis) native "SVGAnimationElement_onend_Getter";
+  onend_Getter_(mthis) => onend_Getter(mthis);
+
+  static onend_Setter(mthis, __arg_0) native "SVGAnimationElement_onend_Setter";
+  onend_Setter_(mthis, __arg_0) => onend_Setter(mthis, __arg_0);
+
+  static onrepeat_Getter(mthis) native "SVGAnimationElement_onrepeat_Getter";
+  onrepeat_Getter_(mthis) => onrepeat_Getter(mthis);
+
+  static onrepeat_Setter(mthis, __arg_0) native "SVGAnimationElement_onrepeat_Setter";
+  onrepeat_Setter_(mthis, __arg_0) => onrepeat_Setter(mthis, __arg_0);
+
+  static requiredExtensions_Getter(mthis) native "SVGAnimationElement_requiredExtensions_Getter";
+  requiredExtensions_Getter_(mthis) => requiredExtensions_Getter(mthis);
+
+  static requiredFeatures_Getter(mthis) native "SVGAnimationElement_requiredFeatures_Getter";
+  requiredFeatures_Getter_(mthis) => requiredFeatures_Getter(mthis);
+
+  static systemLanguage_Getter(mthis) native "SVGAnimationElement_systemLanguage_Getter";
+  systemLanguage_Getter_(mthis) => systemLanguage_Getter(mthis);
+
+  static targetElement_Getter(mthis) native "SVGAnimationElement_targetElement_Getter";
+  targetElement_Getter_(mthis) => targetElement_Getter(mthis);
+
 }
 
-class BlinkSVGCircleElement {
+class BlinkSVGCircleElement extends BlinkSVGGeometryElement {
+  static final instance = new BlinkSVGCircleElement();
+
   static cx_Getter(mthis) native "SVGCircleElement_cx_Getter";
+  cx_Getter_(mthis) => cx_Getter(mthis);
 
   static cy_Getter(mthis) native "SVGCircleElement_cy_Getter";
+  cy_Getter_(mthis) => cy_Getter(mthis);
 
   static r_Getter(mthis) native "SVGCircleElement_r_Getter";
+  r_Getter_(mthis) => r_Getter(mthis);
+
 }
 
-class BlinkSVGClipPathElement {
+class BlinkSVGClipPathElement extends BlinkSVGGraphicsElement {
+  static final instance = new BlinkSVGClipPathElement();
+
   static clipPathUnits_Getter(mthis) native "SVGClipPathElement_clipPathUnits_Getter";
+  clipPathUnits_Getter_(mthis) => clipPathUnits_Getter(mthis);
+
 }
 
-class BlinkSVGComponentTransferFunctionElement {}
+class BlinkSVGComponentTransferFunctionElement extends BlinkSVGElement {
+  static final instance = new BlinkSVGComponentTransferFunctionElement();
 
-class BlinkSVGCursorElement {}
+  static amplitude_Getter(mthis) native "SVGComponentTransferFunctionElement_amplitude_Getter";
+  amplitude_Getter_(mthis) => amplitude_Getter(mthis);
 
-class BlinkSVGDefsElement {}
+  static exponent_Getter(mthis) native "SVGComponentTransferFunctionElement_exponent_Getter";
+  exponent_Getter_(mthis) => exponent_Getter(mthis);
 
-class BlinkSVGDescElement {}
+  static intercept_Getter(mthis) native "SVGComponentTransferFunctionElement_intercept_Getter";
+  intercept_Getter_(mthis) => intercept_Getter(mthis);
 
-class BlinkSVGDiscardElement {}
+  static offset_Getter(mthis) native "SVGComponentTransferFunctionElement_offset_Getter";
+  offset_Getter_(mthis) => offset_Getter(mthis);
 
-class BlinkSVGEllipseElement {
+  static slope_Getter(mthis) native "SVGComponentTransferFunctionElement_slope_Getter";
+  slope_Getter_(mthis) => slope_Getter(mthis);
+
+  static tableValues_Getter(mthis) native "SVGComponentTransferFunctionElement_tableValues_Getter";
+  tableValues_Getter_(mthis) => tableValues_Getter(mthis);
+
+  static type_Getter(mthis) native "SVGComponentTransferFunctionElement_type_Getter";
+  type_Getter_(mthis) => type_Getter(mthis);
+
+}
+
+class BlinkSVGCursorElement extends BlinkSVGElement {
+  static final instance = new BlinkSVGCursorElement();
+
+  static hasExtension_Callback_0(mthis) native "SVGCursorElement_hasExtension_Callback";
+  hasExtension_Callback_0_(mthis) => hasExtension_Callback_0(mthis);
+
+  static hasExtension_Callback_1(mthis, __arg_0) native "SVGCursorElement_hasExtension_Callback";
+  hasExtension_Callback_1_(mthis, __arg_0) => hasExtension_Callback_1(mthis, __arg_0);
+
+  static hasExtension_Callback_2(mthis, __arg_0, __arg_1) native "SVGCursorElement_hasExtension_Callback";
+  hasExtension_Callback_2_(mthis, __arg_0, __arg_1) => hasExtension_Callback_2(mthis, __arg_0, __arg_1);
+
+  static hasExtension_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGCursorElement_hasExtension_Callback";
+  hasExtension_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => hasExtension_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static href_Getter(mthis) native "SVGCursorElement_href_Getter";
+  href_Getter_(mthis) => href_Getter(mthis);
+
+  static requiredExtensions_Getter(mthis) native "SVGCursorElement_requiredExtensions_Getter";
+  requiredExtensions_Getter_(mthis) => requiredExtensions_Getter(mthis);
+
+  static requiredFeatures_Getter(mthis) native "SVGCursorElement_requiredFeatures_Getter";
+  requiredFeatures_Getter_(mthis) => requiredFeatures_Getter(mthis);
+
+  static systemLanguage_Getter(mthis) native "SVGCursorElement_systemLanguage_Getter";
+  systemLanguage_Getter_(mthis) => systemLanguage_Getter(mthis);
+
+  static x_Getter(mthis) native "SVGCursorElement_x_Getter";
+  x_Getter_(mthis) => x_Getter(mthis);
+
+  static y_Getter(mthis) native "SVGCursorElement_y_Getter";
+  y_Getter_(mthis) => y_Getter(mthis);
+
+}
+
+class BlinkSVGDefsElement extends BlinkSVGGraphicsElement {
+  static final instance = new BlinkSVGDefsElement();
+
+}
+
+class BlinkSVGDescElement extends BlinkSVGElement {
+  static final instance = new BlinkSVGDescElement();
+
+}
+
+class BlinkSVGDiscardElement extends BlinkSVGElement {
+  static final instance = new BlinkSVGDiscardElement();
+
+}
+
+class BlinkSVGElement extends BlinkElement {
+  static final instance = new BlinkSVGElement();
+
+  static className_Getter(mthis) native "SVGElement_className_Getter";
+  className_Getter_(mthis) => className_Getter(mthis);
+
+  static onabort_Getter(mthis) native "SVGElement_onabort_Getter";
+  onabort_Getter_(mthis) => onabort_Getter(mthis);
+
+  static onabort_Setter(mthis, __arg_0) native "SVGElement_onabort_Setter";
+  onabort_Setter_(mthis, __arg_0) => onabort_Setter(mthis, __arg_0);
+
+  static onautocomplete_Getter(mthis) native "SVGElement_onautocomplete_Getter";
+  onautocomplete_Getter_(mthis) => onautocomplete_Getter(mthis);
+
+  static onautocomplete_Setter(mthis, __arg_0) native "SVGElement_onautocomplete_Setter";
+  onautocomplete_Setter_(mthis, __arg_0) => onautocomplete_Setter(mthis, __arg_0);
+
+  static onautocompleteerror_Getter(mthis) native "SVGElement_onautocompleteerror_Getter";
+  onautocompleteerror_Getter_(mthis) => onautocompleteerror_Getter(mthis);
+
+  static onautocompleteerror_Setter(mthis, __arg_0) native "SVGElement_onautocompleteerror_Setter";
+  onautocompleteerror_Setter_(mthis, __arg_0) => onautocompleteerror_Setter(mthis, __arg_0);
+
+  static onblur_Getter(mthis) native "SVGElement_onblur_Getter";
+  onblur_Getter_(mthis) => onblur_Getter(mthis);
+
+  static onblur_Setter(mthis, __arg_0) native "SVGElement_onblur_Setter";
+  onblur_Setter_(mthis, __arg_0) => onblur_Setter(mthis, __arg_0);
+
+  static oncancel_Getter(mthis) native "SVGElement_oncancel_Getter";
+  oncancel_Getter_(mthis) => oncancel_Getter(mthis);
+
+  static oncancel_Setter(mthis, __arg_0) native "SVGElement_oncancel_Setter";
+  oncancel_Setter_(mthis, __arg_0) => oncancel_Setter(mthis, __arg_0);
+
+  static oncanplay_Getter(mthis) native "SVGElement_oncanplay_Getter";
+  oncanplay_Getter_(mthis) => oncanplay_Getter(mthis);
+
+  static oncanplay_Setter(mthis, __arg_0) native "SVGElement_oncanplay_Setter";
+  oncanplay_Setter_(mthis, __arg_0) => oncanplay_Setter(mthis, __arg_0);
+
+  static oncanplaythrough_Getter(mthis) native "SVGElement_oncanplaythrough_Getter";
+  oncanplaythrough_Getter_(mthis) => oncanplaythrough_Getter(mthis);
+
+  static oncanplaythrough_Setter(mthis, __arg_0) native "SVGElement_oncanplaythrough_Setter";
+  oncanplaythrough_Setter_(mthis, __arg_0) => oncanplaythrough_Setter(mthis, __arg_0);
+
+  static onchange_Getter(mthis) native "SVGElement_onchange_Getter";
+  onchange_Getter_(mthis) => onchange_Getter(mthis);
+
+  static onchange_Setter(mthis, __arg_0) native "SVGElement_onchange_Setter";
+  onchange_Setter_(mthis, __arg_0) => onchange_Setter(mthis, __arg_0);
+
+  static onclick_Getter(mthis) native "SVGElement_onclick_Getter";
+  onclick_Getter_(mthis) => onclick_Getter(mthis);
+
+  static onclick_Setter(mthis, __arg_0) native "SVGElement_onclick_Setter";
+  onclick_Setter_(mthis, __arg_0) => onclick_Setter(mthis, __arg_0);
+
+  static onclose_Getter(mthis) native "SVGElement_onclose_Getter";
+  onclose_Getter_(mthis) => onclose_Getter(mthis);
+
+  static onclose_Setter(mthis, __arg_0) native "SVGElement_onclose_Setter";
+  onclose_Setter_(mthis, __arg_0) => onclose_Setter(mthis, __arg_0);
+
+  static oncontextmenu_Getter(mthis) native "SVGElement_oncontextmenu_Getter";
+  oncontextmenu_Getter_(mthis) => oncontextmenu_Getter(mthis);
+
+  static oncontextmenu_Setter(mthis, __arg_0) native "SVGElement_oncontextmenu_Setter";
+  oncontextmenu_Setter_(mthis, __arg_0) => oncontextmenu_Setter(mthis, __arg_0);
+
+  static oncuechange_Getter(mthis) native "SVGElement_oncuechange_Getter";
+  oncuechange_Getter_(mthis) => oncuechange_Getter(mthis);
+
+  static oncuechange_Setter(mthis, __arg_0) native "SVGElement_oncuechange_Setter";
+  oncuechange_Setter_(mthis, __arg_0) => oncuechange_Setter(mthis, __arg_0);
+
+  static ondblclick_Getter(mthis) native "SVGElement_ondblclick_Getter";
+  ondblclick_Getter_(mthis) => ondblclick_Getter(mthis);
+
+  static ondblclick_Setter(mthis, __arg_0) native "SVGElement_ondblclick_Setter";
+  ondblclick_Setter_(mthis, __arg_0) => ondblclick_Setter(mthis, __arg_0);
+
+  static ondrag_Getter(mthis) native "SVGElement_ondrag_Getter";
+  ondrag_Getter_(mthis) => ondrag_Getter(mthis);
+
+  static ondrag_Setter(mthis, __arg_0) native "SVGElement_ondrag_Setter";
+  ondrag_Setter_(mthis, __arg_0) => ondrag_Setter(mthis, __arg_0);
+
+  static ondragend_Getter(mthis) native "SVGElement_ondragend_Getter";
+  ondragend_Getter_(mthis) => ondragend_Getter(mthis);
+
+  static ondragend_Setter(mthis, __arg_0) native "SVGElement_ondragend_Setter";
+  ondragend_Setter_(mthis, __arg_0) => ondragend_Setter(mthis, __arg_0);
+
+  static ondragenter_Getter(mthis) native "SVGElement_ondragenter_Getter";
+  ondragenter_Getter_(mthis) => ondragenter_Getter(mthis);
+
+  static ondragenter_Setter(mthis, __arg_0) native "SVGElement_ondragenter_Setter";
+  ondragenter_Setter_(mthis, __arg_0) => ondragenter_Setter(mthis, __arg_0);
+
+  static ondragleave_Getter(mthis) native "SVGElement_ondragleave_Getter";
+  ondragleave_Getter_(mthis) => ondragleave_Getter(mthis);
+
+  static ondragleave_Setter(mthis, __arg_0) native "SVGElement_ondragleave_Setter";
+  ondragleave_Setter_(mthis, __arg_0) => ondragleave_Setter(mthis, __arg_0);
+
+  static ondragover_Getter(mthis) native "SVGElement_ondragover_Getter";
+  ondragover_Getter_(mthis) => ondragover_Getter(mthis);
+
+  static ondragover_Setter(mthis, __arg_0) native "SVGElement_ondragover_Setter";
+  ondragover_Setter_(mthis, __arg_0) => ondragover_Setter(mthis, __arg_0);
+
+  static ondragstart_Getter(mthis) native "SVGElement_ondragstart_Getter";
+  ondragstart_Getter_(mthis) => ondragstart_Getter(mthis);
+
+  static ondragstart_Setter(mthis, __arg_0) native "SVGElement_ondragstart_Setter";
+  ondragstart_Setter_(mthis, __arg_0) => ondragstart_Setter(mthis, __arg_0);
+
+  static ondrop_Getter(mthis) native "SVGElement_ondrop_Getter";
+  ondrop_Getter_(mthis) => ondrop_Getter(mthis);
+
+  static ondrop_Setter(mthis, __arg_0) native "SVGElement_ondrop_Setter";
+  ondrop_Setter_(mthis, __arg_0) => ondrop_Setter(mthis, __arg_0);
+
+  static ondurationchange_Getter(mthis) native "SVGElement_ondurationchange_Getter";
+  ondurationchange_Getter_(mthis) => ondurationchange_Getter(mthis);
+
+  static ondurationchange_Setter(mthis, __arg_0) native "SVGElement_ondurationchange_Setter";
+  ondurationchange_Setter_(mthis, __arg_0) => ondurationchange_Setter(mthis, __arg_0);
+
+  static onemptied_Getter(mthis) native "SVGElement_onemptied_Getter";
+  onemptied_Getter_(mthis) => onemptied_Getter(mthis);
+
+  static onemptied_Setter(mthis, __arg_0) native "SVGElement_onemptied_Setter";
+  onemptied_Setter_(mthis, __arg_0) => onemptied_Setter(mthis, __arg_0);
+
+  static onended_Getter(mthis) native "SVGElement_onended_Getter";
+  onended_Getter_(mthis) => onended_Getter(mthis);
+
+  static onended_Setter(mthis, __arg_0) native "SVGElement_onended_Setter";
+  onended_Setter_(mthis, __arg_0) => onended_Setter(mthis, __arg_0);
+
+  static onerror_Getter(mthis) native "SVGElement_onerror_Getter";
+  onerror_Getter_(mthis) => onerror_Getter(mthis);
+
+  static onerror_Setter(mthis, __arg_0) native "SVGElement_onerror_Setter";
+  onerror_Setter_(mthis, __arg_0) => onerror_Setter(mthis, __arg_0);
+
+  static onfocus_Getter(mthis) native "SVGElement_onfocus_Getter";
+  onfocus_Getter_(mthis) => onfocus_Getter(mthis);
+
+  static onfocus_Setter(mthis, __arg_0) native "SVGElement_onfocus_Setter";
+  onfocus_Setter_(mthis, __arg_0) => onfocus_Setter(mthis, __arg_0);
+
+  static oninput_Getter(mthis) native "SVGElement_oninput_Getter";
+  oninput_Getter_(mthis) => oninput_Getter(mthis);
+
+  static oninput_Setter(mthis, __arg_0) native "SVGElement_oninput_Setter";
+  oninput_Setter_(mthis, __arg_0) => oninput_Setter(mthis, __arg_0);
+
+  static oninvalid_Getter(mthis) native "SVGElement_oninvalid_Getter";
+  oninvalid_Getter_(mthis) => oninvalid_Getter(mthis);
+
+  static oninvalid_Setter(mthis, __arg_0) native "SVGElement_oninvalid_Setter";
+  oninvalid_Setter_(mthis, __arg_0) => oninvalid_Setter(mthis, __arg_0);
+
+  static onkeydown_Getter(mthis) native "SVGElement_onkeydown_Getter";
+  onkeydown_Getter_(mthis) => onkeydown_Getter(mthis);
+
+  static onkeydown_Setter(mthis, __arg_0) native "SVGElement_onkeydown_Setter";
+  onkeydown_Setter_(mthis, __arg_0) => onkeydown_Setter(mthis, __arg_0);
+
+  static onkeypress_Getter(mthis) native "SVGElement_onkeypress_Getter";
+  onkeypress_Getter_(mthis) => onkeypress_Getter(mthis);
+
+  static onkeypress_Setter(mthis, __arg_0) native "SVGElement_onkeypress_Setter";
+  onkeypress_Setter_(mthis, __arg_0) => onkeypress_Setter(mthis, __arg_0);
+
+  static onkeyup_Getter(mthis) native "SVGElement_onkeyup_Getter";
+  onkeyup_Getter_(mthis) => onkeyup_Getter(mthis);
+
+  static onkeyup_Setter(mthis, __arg_0) native "SVGElement_onkeyup_Setter";
+  onkeyup_Setter_(mthis, __arg_0) => onkeyup_Setter(mthis, __arg_0);
+
+  static onload_Getter(mthis) native "SVGElement_onload_Getter";
+  onload_Getter_(mthis) => onload_Getter(mthis);
+
+  static onload_Setter(mthis, __arg_0) native "SVGElement_onload_Setter";
+  onload_Setter_(mthis, __arg_0) => onload_Setter(mthis, __arg_0);
+
+  static onloadeddata_Getter(mthis) native "SVGElement_onloadeddata_Getter";
+  onloadeddata_Getter_(mthis) => onloadeddata_Getter(mthis);
+
+  static onloadeddata_Setter(mthis, __arg_0) native "SVGElement_onloadeddata_Setter";
+  onloadeddata_Setter_(mthis, __arg_0) => onloadeddata_Setter(mthis, __arg_0);
+
+  static onloadedmetadata_Getter(mthis) native "SVGElement_onloadedmetadata_Getter";
+  onloadedmetadata_Getter_(mthis) => onloadedmetadata_Getter(mthis);
+
+  static onloadedmetadata_Setter(mthis, __arg_0) native "SVGElement_onloadedmetadata_Setter";
+  onloadedmetadata_Setter_(mthis, __arg_0) => onloadedmetadata_Setter(mthis, __arg_0);
+
+  static onloadstart_Getter(mthis) native "SVGElement_onloadstart_Getter";
+  onloadstart_Getter_(mthis) => onloadstart_Getter(mthis);
+
+  static onloadstart_Setter(mthis, __arg_0) native "SVGElement_onloadstart_Setter";
+  onloadstart_Setter_(mthis, __arg_0) => onloadstart_Setter(mthis, __arg_0);
+
+  static onmousedown_Getter(mthis) native "SVGElement_onmousedown_Getter";
+  onmousedown_Getter_(mthis) => onmousedown_Getter(mthis);
+
+  static onmousedown_Setter(mthis, __arg_0) native "SVGElement_onmousedown_Setter";
+  onmousedown_Setter_(mthis, __arg_0) => onmousedown_Setter(mthis, __arg_0);
+
+  static onmouseenter_Getter(mthis) native "SVGElement_onmouseenter_Getter";
+  onmouseenter_Getter_(mthis) => onmouseenter_Getter(mthis);
+
+  static onmouseenter_Setter(mthis, __arg_0) native "SVGElement_onmouseenter_Setter";
+  onmouseenter_Setter_(mthis, __arg_0) => onmouseenter_Setter(mthis, __arg_0);
+
+  static onmouseleave_Getter(mthis) native "SVGElement_onmouseleave_Getter";
+  onmouseleave_Getter_(mthis) => onmouseleave_Getter(mthis);
+
+  static onmouseleave_Setter(mthis, __arg_0) native "SVGElement_onmouseleave_Setter";
+  onmouseleave_Setter_(mthis, __arg_0) => onmouseleave_Setter(mthis, __arg_0);
+
+  static onmousemove_Getter(mthis) native "SVGElement_onmousemove_Getter";
+  onmousemove_Getter_(mthis) => onmousemove_Getter(mthis);
+
+  static onmousemove_Setter(mthis, __arg_0) native "SVGElement_onmousemove_Setter";
+  onmousemove_Setter_(mthis, __arg_0) => onmousemove_Setter(mthis, __arg_0);
+
+  static onmouseout_Getter(mthis) native "SVGElement_onmouseout_Getter";
+  onmouseout_Getter_(mthis) => onmouseout_Getter(mthis);
+
+  static onmouseout_Setter(mthis, __arg_0) native "SVGElement_onmouseout_Setter";
+  onmouseout_Setter_(mthis, __arg_0) => onmouseout_Setter(mthis, __arg_0);
+
+  static onmouseover_Getter(mthis) native "SVGElement_onmouseover_Getter";
+  onmouseover_Getter_(mthis) => onmouseover_Getter(mthis);
+
+  static onmouseover_Setter(mthis, __arg_0) native "SVGElement_onmouseover_Setter";
+  onmouseover_Setter_(mthis, __arg_0) => onmouseover_Setter(mthis, __arg_0);
+
+  static onmouseup_Getter(mthis) native "SVGElement_onmouseup_Getter";
+  onmouseup_Getter_(mthis) => onmouseup_Getter(mthis);
+
+  static onmouseup_Setter(mthis, __arg_0) native "SVGElement_onmouseup_Setter";
+  onmouseup_Setter_(mthis, __arg_0) => onmouseup_Setter(mthis, __arg_0);
+
+  static onmousewheel_Getter(mthis) native "SVGElement_onmousewheel_Getter";
+  onmousewheel_Getter_(mthis) => onmousewheel_Getter(mthis);
+
+  static onmousewheel_Setter(mthis, __arg_0) native "SVGElement_onmousewheel_Setter";
+  onmousewheel_Setter_(mthis, __arg_0) => onmousewheel_Setter(mthis, __arg_0);
+
+  static onpause_Getter(mthis) native "SVGElement_onpause_Getter";
+  onpause_Getter_(mthis) => onpause_Getter(mthis);
+
+  static onpause_Setter(mthis, __arg_0) native "SVGElement_onpause_Setter";
+  onpause_Setter_(mthis, __arg_0) => onpause_Setter(mthis, __arg_0);
+
+  static onplay_Getter(mthis) native "SVGElement_onplay_Getter";
+  onplay_Getter_(mthis) => onplay_Getter(mthis);
+
+  static onplay_Setter(mthis, __arg_0) native "SVGElement_onplay_Setter";
+  onplay_Setter_(mthis, __arg_0) => onplay_Setter(mthis, __arg_0);
+
+  static onplaying_Getter(mthis) native "SVGElement_onplaying_Getter";
+  onplaying_Getter_(mthis) => onplaying_Getter(mthis);
+
+  static onplaying_Setter(mthis, __arg_0) native "SVGElement_onplaying_Setter";
+  onplaying_Setter_(mthis, __arg_0) => onplaying_Setter(mthis, __arg_0);
+
+  static onprogress_Getter(mthis) native "SVGElement_onprogress_Getter";
+  onprogress_Getter_(mthis) => onprogress_Getter(mthis);
+
+  static onprogress_Setter(mthis, __arg_0) native "SVGElement_onprogress_Setter";
+  onprogress_Setter_(mthis, __arg_0) => onprogress_Setter(mthis, __arg_0);
+
+  static onratechange_Getter(mthis) native "SVGElement_onratechange_Getter";
+  onratechange_Getter_(mthis) => onratechange_Getter(mthis);
+
+  static onratechange_Setter(mthis, __arg_0) native "SVGElement_onratechange_Setter";
+  onratechange_Setter_(mthis, __arg_0) => onratechange_Setter(mthis, __arg_0);
+
+  static onreset_Getter(mthis) native "SVGElement_onreset_Getter";
+  onreset_Getter_(mthis) => onreset_Getter(mthis);
+
+  static onreset_Setter(mthis, __arg_0) native "SVGElement_onreset_Setter";
+  onreset_Setter_(mthis, __arg_0) => onreset_Setter(mthis, __arg_0);
+
+  static onresize_Getter(mthis) native "SVGElement_onresize_Getter";
+  onresize_Getter_(mthis) => onresize_Getter(mthis);
+
+  static onresize_Setter(mthis, __arg_0) native "SVGElement_onresize_Setter";
+  onresize_Setter_(mthis, __arg_0) => onresize_Setter(mthis, __arg_0);
+
+  static onscroll_Getter(mthis) native "SVGElement_onscroll_Getter";
+  onscroll_Getter_(mthis) => onscroll_Getter(mthis);
+
+  static onscroll_Setter(mthis, __arg_0) native "SVGElement_onscroll_Setter";
+  onscroll_Setter_(mthis, __arg_0) => onscroll_Setter(mthis, __arg_0);
+
+  static onseeked_Getter(mthis) native "SVGElement_onseeked_Getter";
+  onseeked_Getter_(mthis) => onseeked_Getter(mthis);
+
+  static onseeked_Setter(mthis, __arg_0) native "SVGElement_onseeked_Setter";
+  onseeked_Setter_(mthis, __arg_0) => onseeked_Setter(mthis, __arg_0);
+
+  static onseeking_Getter(mthis) native "SVGElement_onseeking_Getter";
+  onseeking_Getter_(mthis) => onseeking_Getter(mthis);
+
+  static onseeking_Setter(mthis, __arg_0) native "SVGElement_onseeking_Setter";
+  onseeking_Setter_(mthis, __arg_0) => onseeking_Setter(mthis, __arg_0);
+
+  static onselect_Getter(mthis) native "SVGElement_onselect_Getter";
+  onselect_Getter_(mthis) => onselect_Getter(mthis);
+
+  static onselect_Setter(mthis, __arg_0) native "SVGElement_onselect_Setter";
+  onselect_Setter_(mthis, __arg_0) => onselect_Setter(mthis, __arg_0);
+
+  static onshow_Getter(mthis) native "SVGElement_onshow_Getter";
+  onshow_Getter_(mthis) => onshow_Getter(mthis);
+
+  static onshow_Setter(mthis, __arg_0) native "SVGElement_onshow_Setter";
+  onshow_Setter_(mthis, __arg_0) => onshow_Setter(mthis, __arg_0);
+
+  static onstalled_Getter(mthis) native "SVGElement_onstalled_Getter";
+  onstalled_Getter_(mthis) => onstalled_Getter(mthis);
+
+  static onstalled_Setter(mthis, __arg_0) native "SVGElement_onstalled_Setter";
+  onstalled_Setter_(mthis, __arg_0) => onstalled_Setter(mthis, __arg_0);
+
+  static onsubmit_Getter(mthis) native "SVGElement_onsubmit_Getter";
+  onsubmit_Getter_(mthis) => onsubmit_Getter(mthis);
+
+  static onsubmit_Setter(mthis, __arg_0) native "SVGElement_onsubmit_Setter";
+  onsubmit_Setter_(mthis, __arg_0) => onsubmit_Setter(mthis, __arg_0);
+
+  static onsuspend_Getter(mthis) native "SVGElement_onsuspend_Getter";
+  onsuspend_Getter_(mthis) => onsuspend_Getter(mthis);
+
+  static onsuspend_Setter(mthis, __arg_0) native "SVGElement_onsuspend_Setter";
+  onsuspend_Setter_(mthis, __arg_0) => onsuspend_Setter(mthis, __arg_0);
+
+  static ontimeupdate_Getter(mthis) native "SVGElement_ontimeupdate_Getter";
+  ontimeupdate_Getter_(mthis) => ontimeupdate_Getter(mthis);
+
+  static ontimeupdate_Setter(mthis, __arg_0) native "SVGElement_ontimeupdate_Setter";
+  ontimeupdate_Setter_(mthis, __arg_0) => ontimeupdate_Setter(mthis, __arg_0);
+
+  static ontoggle_Getter(mthis) native "SVGElement_ontoggle_Getter";
+  ontoggle_Getter_(mthis) => ontoggle_Getter(mthis);
+
+  static ontoggle_Setter(mthis, __arg_0) native "SVGElement_ontoggle_Setter";
+  ontoggle_Setter_(mthis, __arg_0) => ontoggle_Setter(mthis, __arg_0);
+
+  static onvolumechange_Getter(mthis) native "SVGElement_onvolumechange_Getter";
+  onvolumechange_Getter_(mthis) => onvolumechange_Getter(mthis);
+
+  static onvolumechange_Setter(mthis, __arg_0) native "SVGElement_onvolumechange_Setter";
+  onvolumechange_Setter_(mthis, __arg_0) => onvolumechange_Setter(mthis, __arg_0);
+
+  static onwaiting_Getter(mthis) native "SVGElement_onwaiting_Getter";
+  onwaiting_Getter_(mthis) => onwaiting_Getter(mthis);
+
+  static onwaiting_Setter(mthis, __arg_0) native "SVGElement_onwaiting_Setter";
+  onwaiting_Setter_(mthis, __arg_0) => onwaiting_Setter(mthis, __arg_0);
+
+  static ownerSVGElement_Getter(mthis) native "SVGElement_ownerSVGElement_Getter";
+  ownerSVGElement_Getter_(mthis) => ownerSVGElement_Getter(mthis);
+
+  static style_Getter(mthis) native "SVGElement_style_Getter";
+  style_Getter_(mthis) => style_Getter(mthis);
+
+  static tabIndex_Getter(mthis) native "SVGElement_tabIndex_Getter";
+  tabIndex_Getter_(mthis) => tabIndex_Getter(mthis);
+
+  static tabIndex_Setter(mthis, __arg_0) native "SVGElement_tabIndex_Setter";
+  tabIndex_Setter_(mthis, __arg_0) => tabIndex_Setter(mthis, __arg_0);
+
+  static viewportElement_Getter(mthis) native "SVGElement_viewportElement_Getter";
+  viewportElement_Getter_(mthis) => viewportElement_Getter(mthis);
+
+  static xmlbase_Getter(mthis) native "SVGElement_xmlbase_Getter";
+  xmlbase_Getter_(mthis) => xmlbase_Getter(mthis);
+
+  static xmlbase_Setter(mthis, __arg_0) native "SVGElement_xmlbase_Setter";
+  xmlbase_Setter_(mthis, __arg_0) => xmlbase_Setter(mthis, __arg_0);
+
+  static xmllang_Getter(mthis) native "SVGElement_xmllang_Getter";
+  xmllang_Getter_(mthis) => xmllang_Getter(mthis);
+
+  static xmllang_Setter(mthis, __arg_0) native "SVGElement_xmllang_Setter";
+  xmllang_Setter_(mthis, __arg_0) => xmllang_Setter(mthis, __arg_0);
+
+  static xmlspace_Getter(mthis) native "SVGElement_xmlspace_Getter";
+  xmlspace_Getter_(mthis) => xmlspace_Getter(mthis);
+
+  static xmlspace_Setter(mthis, __arg_0) native "SVGElement_xmlspace_Setter";
+  xmlspace_Setter_(mthis, __arg_0) => xmlspace_Setter(mthis, __arg_0);
+
+}
+
+class BlinkSVGEllipseElement extends BlinkSVGGeometryElement {
+  static final instance = new BlinkSVGEllipseElement();
+
   static cx_Getter(mthis) native "SVGEllipseElement_cx_Getter";
+  cx_Getter_(mthis) => cx_Getter(mthis);
 
   static cy_Getter(mthis) native "SVGEllipseElement_cy_Getter";
+  cy_Getter_(mthis) => cy_Getter(mthis);
 
   static rx_Getter(mthis) native "SVGEllipseElement_rx_Getter";
+  rx_Getter_(mthis) => rx_Getter(mthis);
 
   static ry_Getter(mthis) native "SVGEllipseElement_ry_Getter";
+  ry_Getter_(mthis) => ry_Getter(mthis);
+
 }
 
-class BlinkSVGFilterPrimitiveStandardAttributes {
-  static height_Getter(mthis) native "SVGFilterPrimitiveStandardAttributes_height_Getter";
-
-  static result_Getter(mthis) native "SVGFilterPrimitiveStandardAttributes_result_Getter";
-
-  static width_Getter(mthis) native "SVGFilterPrimitiveStandardAttributes_width_Getter";
-
-  static x_Getter(mthis) native "SVGFilterPrimitiveStandardAttributes_x_Getter";
-
-  static y_Getter(mthis) native "SVGFilterPrimitiveStandardAttributes_y_Getter";
-}
-
-class BlinkSVGFEBlendElement {
-  static in1_Getter(mthis) native "SVGFEBlendElement_in1_Getter";
-
-  static in2_Getter(mthis) native "SVGFEBlendElement_in2_Getter";
-
-  static mode_Getter(mthis) native "SVGFEBlendElement_mode_Getter";
+class BlinkSVGFEBlendElement extends BlinkSVGElement {
+  static final instance = new BlinkSVGFEBlendElement();
 
   static height_Getter(mthis) native "SVGFEBlendElement_height_Getter";
+  height_Getter_(mthis) => height_Getter(mthis);
+
+  static in1_Getter(mthis) native "SVGFEBlendElement_in1_Getter";
+  in1_Getter_(mthis) => in1_Getter(mthis);
+
+  static in2_Getter(mthis) native "SVGFEBlendElement_in2_Getter";
+  in2_Getter_(mthis) => in2_Getter(mthis);
+
+  static mode_Getter(mthis) native "SVGFEBlendElement_mode_Getter";
+  mode_Getter_(mthis) => mode_Getter(mthis);
 
   static result_Getter(mthis) native "SVGFEBlendElement_result_Getter";
+  result_Getter_(mthis) => result_Getter(mthis);
 
   static width_Getter(mthis) native "SVGFEBlendElement_width_Getter";
+  width_Getter_(mthis) => width_Getter(mthis);
 
   static x_Getter(mthis) native "SVGFEBlendElement_x_Getter";
+  x_Getter_(mthis) => x_Getter(mthis);
 
   static y_Getter(mthis) native "SVGFEBlendElement_y_Getter";
+  y_Getter_(mthis) => y_Getter(mthis);
+
 }
 
-class BlinkSVGFEColorMatrixElement {
-  static in1_Getter(mthis) native "SVGFEColorMatrixElement_in1_Getter";
-
-  static type_Getter(mthis) native "SVGFEColorMatrixElement_type_Getter";
-
-  static values_Getter(mthis) native "SVGFEColorMatrixElement_values_Getter";
+class BlinkSVGFEColorMatrixElement extends BlinkSVGElement {
+  static final instance = new BlinkSVGFEColorMatrixElement();
 
   static height_Getter(mthis) native "SVGFEColorMatrixElement_height_Getter";
+  height_Getter_(mthis) => height_Getter(mthis);
+
+  static in1_Getter(mthis) native "SVGFEColorMatrixElement_in1_Getter";
+  in1_Getter_(mthis) => in1_Getter(mthis);
 
   static result_Getter(mthis) native "SVGFEColorMatrixElement_result_Getter";
+  result_Getter_(mthis) => result_Getter(mthis);
+
+  static type_Getter(mthis) native "SVGFEColorMatrixElement_type_Getter";
+  type_Getter_(mthis) => type_Getter(mthis);
+
+  static values_Getter(mthis) native "SVGFEColorMatrixElement_values_Getter";
+  values_Getter_(mthis) => values_Getter(mthis);
 
   static width_Getter(mthis) native "SVGFEColorMatrixElement_width_Getter";
+  width_Getter_(mthis) => width_Getter(mthis);
 
   static x_Getter(mthis) native "SVGFEColorMatrixElement_x_Getter";
+  x_Getter_(mthis) => x_Getter(mthis);
 
   static y_Getter(mthis) native "SVGFEColorMatrixElement_y_Getter";
+  y_Getter_(mthis) => y_Getter(mthis);
+
 }
 
-class BlinkSVGFEComponentTransferElement {
-  static in1_Getter(mthis) native "SVGFEComponentTransferElement_in1_Getter";
+class BlinkSVGFEComponentTransferElement extends BlinkSVGElement {
+  static final instance = new BlinkSVGFEComponentTransferElement();
 
   static height_Getter(mthis) native "SVGFEComponentTransferElement_height_Getter";
+  height_Getter_(mthis) => height_Getter(mthis);
+
+  static in1_Getter(mthis) native "SVGFEComponentTransferElement_in1_Getter";
+  in1_Getter_(mthis) => in1_Getter(mthis);
 
   static result_Getter(mthis) native "SVGFEComponentTransferElement_result_Getter";
+  result_Getter_(mthis) => result_Getter(mthis);
 
   static width_Getter(mthis) native "SVGFEComponentTransferElement_width_Getter";
+  width_Getter_(mthis) => width_Getter(mthis);
 
   static x_Getter(mthis) native "SVGFEComponentTransferElement_x_Getter";
+  x_Getter_(mthis) => x_Getter(mthis);
 
   static y_Getter(mthis) native "SVGFEComponentTransferElement_y_Getter";
+  y_Getter_(mthis) => y_Getter(mthis);
+
 }
 
-class BlinkSVGFECompositeElement {
-  static in1_Getter(mthis) native "SVGFECompositeElement_in1_Getter";
-
-  static in2_Getter(mthis) native "SVGFECompositeElement_in2_Getter";
-
-  static k1_Getter(mthis) native "SVGFECompositeElement_k1_Getter";
-
-  static k2_Getter(mthis) native "SVGFECompositeElement_k2_Getter";
-
-  static k3_Getter(mthis) native "SVGFECompositeElement_k3_Getter";
-
-  static k4_Getter(mthis) native "SVGFECompositeElement_k4_Getter";
-
-  static operator_Getter(mthis) native "SVGFECompositeElement_operator_Getter";
+class BlinkSVGFECompositeElement extends BlinkSVGElement {
+  static final instance = new BlinkSVGFECompositeElement();
 
   static height_Getter(mthis) native "SVGFECompositeElement_height_Getter";
+  height_Getter_(mthis) => height_Getter(mthis);
+
+  static in1_Getter(mthis) native "SVGFECompositeElement_in1_Getter";
+  in1_Getter_(mthis) => in1_Getter(mthis);
+
+  static in2_Getter(mthis) native "SVGFECompositeElement_in2_Getter";
+  in2_Getter_(mthis) => in2_Getter(mthis);
+
+  static k1_Getter(mthis) native "SVGFECompositeElement_k1_Getter";
+  k1_Getter_(mthis) => k1_Getter(mthis);
+
+  static k2_Getter(mthis) native "SVGFECompositeElement_k2_Getter";
+  k2_Getter_(mthis) => k2_Getter(mthis);
+
+  static k3_Getter(mthis) native "SVGFECompositeElement_k3_Getter";
+  k3_Getter_(mthis) => k3_Getter(mthis);
+
+  static k4_Getter(mthis) native "SVGFECompositeElement_k4_Getter";
+  k4_Getter_(mthis) => k4_Getter(mthis);
+
+  static operator_Getter(mthis) native "SVGFECompositeElement_operator_Getter";
+  operator_Getter_(mthis) => operator_Getter(mthis);
 
   static result_Getter(mthis) native "SVGFECompositeElement_result_Getter";
+  result_Getter_(mthis) => result_Getter(mthis);
 
   static width_Getter(mthis) native "SVGFECompositeElement_width_Getter";
+  width_Getter_(mthis) => width_Getter(mthis);
 
   static x_Getter(mthis) native "SVGFECompositeElement_x_Getter";
+  x_Getter_(mthis) => x_Getter(mthis);
 
   static y_Getter(mthis) native "SVGFECompositeElement_y_Getter";
+  y_Getter_(mthis) => y_Getter(mthis);
+
 }
 
-class BlinkSVGFEConvolveMatrixElement {
+class BlinkSVGFEConvolveMatrixElement extends BlinkSVGElement {
+  static final instance = new BlinkSVGFEConvolveMatrixElement();
+
   static bias_Getter(mthis) native "SVGFEConvolveMatrixElement_bias_Getter";
+  bias_Getter_(mthis) => bias_Getter(mthis);
 
   static divisor_Getter(mthis) native "SVGFEConvolveMatrixElement_divisor_Getter";
+  divisor_Getter_(mthis) => divisor_Getter(mthis);
 
   static edgeMode_Getter(mthis) native "SVGFEConvolveMatrixElement_edgeMode_Getter";
-
-  static in1_Getter(mthis) native "SVGFEConvolveMatrixElement_in1_Getter";
-
-  static kernelMatrix_Getter(mthis) native "SVGFEConvolveMatrixElement_kernelMatrix_Getter";
-
-  static kernelUnitLengthX_Getter(mthis) native "SVGFEConvolveMatrixElement_kernelUnitLengthX_Getter";
-
-  static kernelUnitLengthY_Getter(mthis) native "SVGFEConvolveMatrixElement_kernelUnitLengthY_Getter";
-
-  static orderX_Getter(mthis) native "SVGFEConvolveMatrixElement_orderX_Getter";
-
-  static orderY_Getter(mthis) native "SVGFEConvolveMatrixElement_orderY_Getter";
-
-  static preserveAlpha_Getter(mthis) native "SVGFEConvolveMatrixElement_preserveAlpha_Getter";
-
-  static targetX_Getter(mthis) native "SVGFEConvolveMatrixElement_targetX_Getter";
-
-  static targetY_Getter(mthis) native "SVGFEConvolveMatrixElement_targetY_Getter";
+  edgeMode_Getter_(mthis) => edgeMode_Getter(mthis);
 
   static height_Getter(mthis) native "SVGFEConvolveMatrixElement_height_Getter";
+  height_Getter_(mthis) => height_Getter(mthis);
+
+  static in1_Getter(mthis) native "SVGFEConvolveMatrixElement_in1_Getter";
+  in1_Getter_(mthis) => in1_Getter(mthis);
+
+  static kernelMatrix_Getter(mthis) native "SVGFEConvolveMatrixElement_kernelMatrix_Getter";
+  kernelMatrix_Getter_(mthis) => kernelMatrix_Getter(mthis);
+
+  static kernelUnitLengthX_Getter(mthis) native "SVGFEConvolveMatrixElement_kernelUnitLengthX_Getter";
+  kernelUnitLengthX_Getter_(mthis) => kernelUnitLengthX_Getter(mthis);
+
+  static kernelUnitLengthY_Getter(mthis) native "SVGFEConvolveMatrixElement_kernelUnitLengthY_Getter";
+  kernelUnitLengthY_Getter_(mthis) => kernelUnitLengthY_Getter(mthis);
+
+  static orderX_Getter(mthis) native "SVGFEConvolveMatrixElement_orderX_Getter";
+  orderX_Getter_(mthis) => orderX_Getter(mthis);
+
+  static orderY_Getter(mthis) native "SVGFEConvolveMatrixElement_orderY_Getter";
+  orderY_Getter_(mthis) => orderY_Getter(mthis);
+
+  static preserveAlpha_Getter(mthis) native "SVGFEConvolveMatrixElement_preserveAlpha_Getter";
+  preserveAlpha_Getter_(mthis) => preserveAlpha_Getter(mthis);
 
   static result_Getter(mthis) native "SVGFEConvolveMatrixElement_result_Getter";
+  result_Getter_(mthis) => result_Getter(mthis);
+
+  static targetX_Getter(mthis) native "SVGFEConvolveMatrixElement_targetX_Getter";
+  targetX_Getter_(mthis) => targetX_Getter(mthis);
+
+  static targetY_Getter(mthis) native "SVGFEConvolveMatrixElement_targetY_Getter";
+  targetY_Getter_(mthis) => targetY_Getter(mthis);
 
   static width_Getter(mthis) native "SVGFEConvolveMatrixElement_width_Getter";
+  width_Getter_(mthis) => width_Getter(mthis);
 
   static x_Getter(mthis) native "SVGFEConvolveMatrixElement_x_Getter";
+  x_Getter_(mthis) => x_Getter(mthis);
 
   static y_Getter(mthis) native "SVGFEConvolveMatrixElement_y_Getter";
+  y_Getter_(mthis) => y_Getter(mthis);
+
 }
 
-class BlinkSVGFEDiffuseLightingElement {
+class BlinkSVGFEDiffuseLightingElement extends BlinkSVGElement {
+  static final instance = new BlinkSVGFEDiffuseLightingElement();
+
   static diffuseConstant_Getter(mthis) native "SVGFEDiffuseLightingElement_diffuseConstant_Getter";
-
-  static in1_Getter(mthis) native "SVGFEDiffuseLightingElement_in1_Getter";
-
-  static kernelUnitLengthX_Getter(mthis) native "SVGFEDiffuseLightingElement_kernelUnitLengthX_Getter";
-
-  static kernelUnitLengthY_Getter(mthis) native "SVGFEDiffuseLightingElement_kernelUnitLengthY_Getter";
-
-  static surfaceScale_Getter(mthis) native "SVGFEDiffuseLightingElement_surfaceScale_Getter";
+  diffuseConstant_Getter_(mthis) => diffuseConstant_Getter(mthis);
 
   static height_Getter(mthis) native "SVGFEDiffuseLightingElement_height_Getter";
+  height_Getter_(mthis) => height_Getter(mthis);
+
+  static in1_Getter(mthis) native "SVGFEDiffuseLightingElement_in1_Getter";
+  in1_Getter_(mthis) => in1_Getter(mthis);
+
+  static kernelUnitLengthX_Getter(mthis) native "SVGFEDiffuseLightingElement_kernelUnitLengthX_Getter";
+  kernelUnitLengthX_Getter_(mthis) => kernelUnitLengthX_Getter(mthis);
+
+  static kernelUnitLengthY_Getter(mthis) native "SVGFEDiffuseLightingElement_kernelUnitLengthY_Getter";
+  kernelUnitLengthY_Getter_(mthis) => kernelUnitLengthY_Getter(mthis);
 
   static result_Getter(mthis) native "SVGFEDiffuseLightingElement_result_Getter";
+  result_Getter_(mthis) => result_Getter(mthis);
+
+  static surfaceScale_Getter(mthis) native "SVGFEDiffuseLightingElement_surfaceScale_Getter";
+  surfaceScale_Getter_(mthis) => surfaceScale_Getter(mthis);
 
   static width_Getter(mthis) native "SVGFEDiffuseLightingElement_width_Getter";
+  width_Getter_(mthis) => width_Getter(mthis);
 
   static x_Getter(mthis) native "SVGFEDiffuseLightingElement_x_Getter";
+  x_Getter_(mthis) => x_Getter(mthis);
 
   static y_Getter(mthis) native "SVGFEDiffuseLightingElement_y_Getter";
+  y_Getter_(mthis) => y_Getter(mthis);
+
 }
 
-class BlinkSVGFEDisplacementMapElement {
-  static in1_Getter(mthis) native "SVGFEDisplacementMapElement_in1_Getter";
-
-  static in2_Getter(mthis) native "SVGFEDisplacementMapElement_in2_Getter";
-
-  static scale_Getter(mthis) native "SVGFEDisplacementMapElement_scale_Getter";
-
-  static xChannelSelector_Getter(mthis) native "SVGFEDisplacementMapElement_xChannelSelector_Getter";
-
-  static yChannelSelector_Getter(mthis) native "SVGFEDisplacementMapElement_yChannelSelector_Getter";
+class BlinkSVGFEDisplacementMapElement extends BlinkSVGElement {
+  static final instance = new BlinkSVGFEDisplacementMapElement();
 
   static height_Getter(mthis) native "SVGFEDisplacementMapElement_height_Getter";
+  height_Getter_(mthis) => height_Getter(mthis);
+
+  static in1_Getter(mthis) native "SVGFEDisplacementMapElement_in1_Getter";
+  in1_Getter_(mthis) => in1_Getter(mthis);
+
+  static in2_Getter(mthis) native "SVGFEDisplacementMapElement_in2_Getter";
+  in2_Getter_(mthis) => in2_Getter(mthis);
 
   static result_Getter(mthis) native "SVGFEDisplacementMapElement_result_Getter";
+  result_Getter_(mthis) => result_Getter(mthis);
+
+  static scale_Getter(mthis) native "SVGFEDisplacementMapElement_scale_Getter";
+  scale_Getter_(mthis) => scale_Getter(mthis);
 
   static width_Getter(mthis) native "SVGFEDisplacementMapElement_width_Getter";
+  width_Getter_(mthis) => width_Getter(mthis);
+
+  static xChannelSelector_Getter(mthis) native "SVGFEDisplacementMapElement_xChannelSelector_Getter";
+  xChannelSelector_Getter_(mthis) => xChannelSelector_Getter(mthis);
 
   static x_Getter(mthis) native "SVGFEDisplacementMapElement_x_Getter";
+  x_Getter_(mthis) => x_Getter(mthis);
+
+  static yChannelSelector_Getter(mthis) native "SVGFEDisplacementMapElement_yChannelSelector_Getter";
+  yChannelSelector_Getter_(mthis) => yChannelSelector_Getter(mthis);
 
   static y_Getter(mthis) native "SVGFEDisplacementMapElement_y_Getter";
+  y_Getter_(mthis) => y_Getter(mthis);
+
 }
 
-class BlinkSVGFEDistantLightElement {
+class BlinkSVGFEDistantLightElement extends BlinkSVGElement {
+  static final instance = new BlinkSVGFEDistantLightElement();
+
   static azimuth_Getter(mthis) native "SVGFEDistantLightElement_azimuth_Getter";
+  azimuth_Getter_(mthis) => azimuth_Getter(mthis);
 
   static elevation_Getter(mthis) native "SVGFEDistantLightElement_elevation_Getter";
+  elevation_Getter_(mthis) => elevation_Getter(mthis);
+
 }
 
-class BlinkSVGFEDropShadowElement {}
+class BlinkSVGFEDropShadowElement extends BlinkSVGElement {
+  static final instance = new BlinkSVGFEDropShadowElement();
 
-class BlinkSVGFEFloodElement {
+  static dx_Getter(mthis) native "SVGFEDropShadowElement_dx_Getter";
+  dx_Getter_(mthis) => dx_Getter(mthis);
+
+  static dy_Getter(mthis) native "SVGFEDropShadowElement_dy_Getter";
+  dy_Getter_(mthis) => dy_Getter(mthis);
+
+  static height_Getter(mthis) native "SVGFEDropShadowElement_height_Getter";
+  height_Getter_(mthis) => height_Getter(mthis);
+
+  static in1_Getter(mthis) native "SVGFEDropShadowElement_in1_Getter";
+  in1_Getter_(mthis) => in1_Getter(mthis);
+
+  static result_Getter(mthis) native "SVGFEDropShadowElement_result_Getter";
+  result_Getter_(mthis) => result_Getter(mthis);
+
+  static setStdDeviation_Callback_0(mthis) native "SVGFEDropShadowElement_setStdDeviation_Callback";
+  setStdDeviation_Callback_0_(mthis) => setStdDeviation_Callback_0(mthis);
+
+  static setStdDeviation_Callback_1(mthis, __arg_0) native "SVGFEDropShadowElement_setStdDeviation_Callback";
+  setStdDeviation_Callback_1_(mthis, __arg_0) => setStdDeviation_Callback_1(mthis, __arg_0);
+
+  static setStdDeviation_Callback_2(mthis, __arg_0, __arg_1) native "SVGFEDropShadowElement_setStdDeviation_Callback";
+  setStdDeviation_Callback_2_(mthis, __arg_0, __arg_1) => setStdDeviation_Callback_2(mthis, __arg_0, __arg_1);
+
+  static setStdDeviation_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGFEDropShadowElement_setStdDeviation_Callback";
+  setStdDeviation_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => setStdDeviation_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static setStdDeviation_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "SVGFEDropShadowElement_setStdDeviation_Callback";
+  setStdDeviation_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => setStdDeviation_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static stdDeviationX_Getter(mthis) native "SVGFEDropShadowElement_stdDeviationX_Getter";
+  stdDeviationX_Getter_(mthis) => stdDeviationX_Getter(mthis);
+
+  static stdDeviationY_Getter(mthis) native "SVGFEDropShadowElement_stdDeviationY_Getter";
+  stdDeviationY_Getter_(mthis) => stdDeviationY_Getter(mthis);
+
+  static width_Getter(mthis) native "SVGFEDropShadowElement_width_Getter";
+  width_Getter_(mthis) => width_Getter(mthis);
+
+  static x_Getter(mthis) native "SVGFEDropShadowElement_x_Getter";
+  x_Getter_(mthis) => x_Getter(mthis);
+
+  static y_Getter(mthis) native "SVGFEDropShadowElement_y_Getter";
+  y_Getter_(mthis) => y_Getter(mthis);
+
+}
+
+class BlinkSVGFEFloodElement extends BlinkSVGElement {
+  static final instance = new BlinkSVGFEFloodElement();
+
   static height_Getter(mthis) native "SVGFEFloodElement_height_Getter";
+  height_Getter_(mthis) => height_Getter(mthis);
 
   static result_Getter(mthis) native "SVGFEFloodElement_result_Getter";
+  result_Getter_(mthis) => result_Getter(mthis);
 
   static width_Getter(mthis) native "SVGFEFloodElement_width_Getter";
+  width_Getter_(mthis) => width_Getter(mthis);
 
   static x_Getter(mthis) native "SVGFEFloodElement_x_Getter";
+  x_Getter_(mthis) => x_Getter(mthis);
 
   static y_Getter(mthis) native "SVGFEFloodElement_y_Getter";
+  y_Getter_(mthis) => y_Getter(mthis);
+
 }
 
-class BlinkSVGFEFuncAElement {}
+class BlinkSVGFEFuncAElement extends BlinkSVGComponentTransferFunctionElement {
+  static final instance = new BlinkSVGFEFuncAElement();
 
-class BlinkSVGFEFuncBElement {}
+}
 
-class BlinkSVGFEFuncGElement {}
+class BlinkSVGFEFuncBElement extends BlinkSVGComponentTransferFunctionElement {
+  static final instance = new BlinkSVGFEFuncBElement();
 
-class BlinkSVGFEFuncRElement {}
+}
 
-class BlinkSVGFEGaussianBlurElement {
-  static in1_Getter(mthis) native "SVGFEGaussianBlurElement_in1_Getter";
+class BlinkSVGFEFuncGElement extends BlinkSVGComponentTransferFunctionElement {
+  static final instance = new BlinkSVGFEFuncGElement();
 
-  static stdDeviationX_Getter(mthis) native "SVGFEGaussianBlurElement_stdDeviationX_Getter";
+}
 
-  static stdDeviationY_Getter(mthis) native "SVGFEGaussianBlurElement_stdDeviationY_Getter";
+class BlinkSVGFEFuncRElement extends BlinkSVGComponentTransferFunctionElement {
+  static final instance = new BlinkSVGFEFuncRElement();
 
-  static setStdDeviation_Callback_2(mthis, stdDeviationX, stdDeviationY) native "SVGFEGaussianBlurElement_setStdDeviation_Callback";
+}
+
+class BlinkSVGFEGaussianBlurElement extends BlinkSVGElement {
+  static final instance = new BlinkSVGFEGaussianBlurElement();
 
   static height_Getter(mthis) native "SVGFEGaussianBlurElement_height_Getter";
+  height_Getter_(mthis) => height_Getter(mthis);
+
+  static in1_Getter(mthis) native "SVGFEGaussianBlurElement_in1_Getter";
+  in1_Getter_(mthis) => in1_Getter(mthis);
 
   static result_Getter(mthis) native "SVGFEGaussianBlurElement_result_Getter";
+  result_Getter_(mthis) => result_Getter(mthis);
+
+  static setStdDeviation_Callback_0(mthis) native "SVGFEGaussianBlurElement_setStdDeviation_Callback";
+  setStdDeviation_Callback_0_(mthis) => setStdDeviation_Callback_0(mthis);
+
+  static setStdDeviation_Callback_1(mthis, __arg_0) native "SVGFEGaussianBlurElement_setStdDeviation_Callback";
+  setStdDeviation_Callback_1_(mthis, __arg_0) => setStdDeviation_Callback_1(mthis, __arg_0);
+
+  static setStdDeviation_Callback_2(mthis, __arg_0, __arg_1) native "SVGFEGaussianBlurElement_setStdDeviation_Callback";
+  setStdDeviation_Callback_2_(mthis, __arg_0, __arg_1) => setStdDeviation_Callback_2(mthis, __arg_0, __arg_1);
+
+  static setStdDeviation_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGFEGaussianBlurElement_setStdDeviation_Callback";
+  setStdDeviation_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => setStdDeviation_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static setStdDeviation_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "SVGFEGaussianBlurElement_setStdDeviation_Callback";
+  setStdDeviation_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => setStdDeviation_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static stdDeviationX_Getter(mthis) native "SVGFEGaussianBlurElement_stdDeviationX_Getter";
+  stdDeviationX_Getter_(mthis) => stdDeviationX_Getter(mthis);
+
+  static stdDeviationY_Getter(mthis) native "SVGFEGaussianBlurElement_stdDeviationY_Getter";
+  stdDeviationY_Getter_(mthis) => stdDeviationY_Getter(mthis);
 
   static width_Getter(mthis) native "SVGFEGaussianBlurElement_width_Getter";
+  width_Getter_(mthis) => width_Getter(mthis);
 
   static x_Getter(mthis) native "SVGFEGaussianBlurElement_x_Getter";
+  x_Getter_(mthis) => x_Getter(mthis);
 
   static y_Getter(mthis) native "SVGFEGaussianBlurElement_y_Getter";
+  y_Getter_(mthis) => y_Getter(mthis);
+
 }
 
-class BlinkSVGFEImageElement {
-  static preserveAspectRatio_Getter(mthis) native "SVGFEImageElement_preserveAspectRatio_Getter";
+class BlinkSVGFEImageElement extends BlinkSVGElement {
+  static final instance = new BlinkSVGFEImageElement();
 
   static height_Getter(mthis) native "SVGFEImageElement_height_Getter";
-
-  static result_Getter(mthis) native "SVGFEImageElement_result_Getter";
-
-  static width_Getter(mthis) native "SVGFEImageElement_width_Getter";
-
-  static x_Getter(mthis) native "SVGFEImageElement_x_Getter";
-
-  static y_Getter(mthis) native "SVGFEImageElement_y_Getter";
+  height_Getter_(mthis) => height_Getter(mthis);
 
   static href_Getter(mthis) native "SVGFEImageElement_href_Getter";
+  href_Getter_(mthis) => href_Getter(mthis);
+
+  static preserveAspectRatio_Getter(mthis) native "SVGFEImageElement_preserveAspectRatio_Getter";
+  preserveAspectRatio_Getter_(mthis) => preserveAspectRatio_Getter(mthis);
+
+  static result_Getter(mthis) native "SVGFEImageElement_result_Getter";
+  result_Getter_(mthis) => result_Getter(mthis);
+
+  static width_Getter(mthis) native "SVGFEImageElement_width_Getter";
+  width_Getter_(mthis) => width_Getter(mthis);
+
+  static x_Getter(mthis) native "SVGFEImageElement_x_Getter";
+  x_Getter_(mthis) => x_Getter(mthis);
+
+  static y_Getter(mthis) native "SVGFEImageElement_y_Getter";
+  y_Getter_(mthis) => y_Getter(mthis);
+
 }
 
-class BlinkSVGFEMergeElement {
+class BlinkSVGFEMergeElement extends BlinkSVGElement {
+  static final instance = new BlinkSVGFEMergeElement();
+
   static height_Getter(mthis) native "SVGFEMergeElement_height_Getter";
+  height_Getter_(mthis) => height_Getter(mthis);
 
   static result_Getter(mthis) native "SVGFEMergeElement_result_Getter";
+  result_Getter_(mthis) => result_Getter(mthis);
 
   static width_Getter(mthis) native "SVGFEMergeElement_width_Getter";
+  width_Getter_(mthis) => width_Getter(mthis);
 
   static x_Getter(mthis) native "SVGFEMergeElement_x_Getter";
+  x_Getter_(mthis) => x_Getter(mthis);
 
   static y_Getter(mthis) native "SVGFEMergeElement_y_Getter";
+  y_Getter_(mthis) => y_Getter(mthis);
+
 }
 
-class BlinkSVGFEMergeNodeElement {
+class BlinkSVGFEMergeNodeElement extends BlinkSVGElement {
+  static final instance = new BlinkSVGFEMergeNodeElement();
+
   static in1_Getter(mthis) native "SVGFEMergeNodeElement_in1_Getter";
+  in1_Getter_(mthis) => in1_Getter(mthis);
+
 }
 
-class BlinkSVGFEMorphologyElement {
-  static in1_Getter(mthis) native "SVGFEMorphologyElement_in1_Getter";
-
-  static operator_Getter(mthis) native "SVGFEMorphologyElement_operator_Getter";
-
-  static radiusX_Getter(mthis) native "SVGFEMorphologyElement_radiusX_Getter";
-
-  static radiusY_Getter(mthis) native "SVGFEMorphologyElement_radiusY_Getter";
+class BlinkSVGFEMorphologyElement extends BlinkSVGElement {
+  static final instance = new BlinkSVGFEMorphologyElement();
 
   static height_Getter(mthis) native "SVGFEMorphologyElement_height_Getter";
+  height_Getter_(mthis) => height_Getter(mthis);
+
+  static in1_Getter(mthis) native "SVGFEMorphologyElement_in1_Getter";
+  in1_Getter_(mthis) => in1_Getter(mthis);
+
+  static operator_Getter(mthis) native "SVGFEMorphologyElement_operator_Getter";
+  operator_Getter_(mthis) => operator_Getter(mthis);
+
+  static radiusX_Getter(mthis) native "SVGFEMorphologyElement_radiusX_Getter";
+  radiusX_Getter_(mthis) => radiusX_Getter(mthis);
+
+  static radiusY_Getter(mthis) native "SVGFEMorphologyElement_radiusY_Getter";
+  radiusY_Getter_(mthis) => radiusY_Getter(mthis);
 
   static result_Getter(mthis) native "SVGFEMorphologyElement_result_Getter";
+  result_Getter_(mthis) => result_Getter(mthis);
 
   static width_Getter(mthis) native "SVGFEMorphologyElement_width_Getter";
+  width_Getter_(mthis) => width_Getter(mthis);
 
   static x_Getter(mthis) native "SVGFEMorphologyElement_x_Getter";
+  x_Getter_(mthis) => x_Getter(mthis);
 
   static y_Getter(mthis) native "SVGFEMorphologyElement_y_Getter";
+  y_Getter_(mthis) => y_Getter(mthis);
+
 }
 
-class BlinkSVGFEOffsetElement {
+class BlinkSVGFEOffsetElement extends BlinkSVGElement {
+  static final instance = new BlinkSVGFEOffsetElement();
+
   static dx_Getter(mthis) native "SVGFEOffsetElement_dx_Getter";
+  dx_Getter_(mthis) => dx_Getter(mthis);
 
   static dy_Getter(mthis) native "SVGFEOffsetElement_dy_Getter";
-
-  static in1_Getter(mthis) native "SVGFEOffsetElement_in1_Getter";
+  dy_Getter_(mthis) => dy_Getter(mthis);
 
   static height_Getter(mthis) native "SVGFEOffsetElement_height_Getter";
+  height_Getter_(mthis) => height_Getter(mthis);
+
+  static in1_Getter(mthis) native "SVGFEOffsetElement_in1_Getter";
+  in1_Getter_(mthis) => in1_Getter(mthis);
 
   static result_Getter(mthis) native "SVGFEOffsetElement_result_Getter";
+  result_Getter_(mthis) => result_Getter(mthis);
 
   static width_Getter(mthis) native "SVGFEOffsetElement_width_Getter";
+  width_Getter_(mthis) => width_Getter(mthis);
 
   static x_Getter(mthis) native "SVGFEOffsetElement_x_Getter";
+  x_Getter_(mthis) => x_Getter(mthis);
 
   static y_Getter(mthis) native "SVGFEOffsetElement_y_Getter";
+  y_Getter_(mthis) => y_Getter(mthis);
+
 }
 
-class BlinkSVGFEPointLightElement {
+class BlinkSVGFEPointLightElement extends BlinkSVGElement {
+  static final instance = new BlinkSVGFEPointLightElement();
+
   static x_Getter(mthis) native "SVGFEPointLightElement_x_Getter";
+  x_Getter_(mthis) => x_Getter(mthis);
 
   static y_Getter(mthis) native "SVGFEPointLightElement_y_Getter";
+  y_Getter_(mthis) => y_Getter(mthis);
 
   static z_Getter(mthis) native "SVGFEPointLightElement_z_Getter";
+  z_Getter_(mthis) => z_Getter(mthis);
+
 }
 
-class BlinkSVGFESpecularLightingElement {
-  static in1_Getter(mthis) native "SVGFESpecularLightingElement_in1_Getter";
-
-  static specularConstant_Getter(mthis) native "SVGFESpecularLightingElement_specularConstant_Getter";
-
-  static specularExponent_Getter(mthis) native "SVGFESpecularLightingElement_specularExponent_Getter";
-
-  static surfaceScale_Getter(mthis) native "SVGFESpecularLightingElement_surfaceScale_Getter";
+class BlinkSVGFESpecularLightingElement extends BlinkSVGElement {
+  static final instance = new BlinkSVGFESpecularLightingElement();
 
   static height_Getter(mthis) native "SVGFESpecularLightingElement_height_Getter";
+  height_Getter_(mthis) => height_Getter(mthis);
+
+  static in1_Getter(mthis) native "SVGFESpecularLightingElement_in1_Getter";
+  in1_Getter_(mthis) => in1_Getter(mthis);
 
   static result_Getter(mthis) native "SVGFESpecularLightingElement_result_Getter";
+  result_Getter_(mthis) => result_Getter(mthis);
+
+  static specularConstant_Getter(mthis) native "SVGFESpecularLightingElement_specularConstant_Getter";
+  specularConstant_Getter_(mthis) => specularConstant_Getter(mthis);
+
+  static specularExponent_Getter(mthis) native "SVGFESpecularLightingElement_specularExponent_Getter";
+  specularExponent_Getter_(mthis) => specularExponent_Getter(mthis);
+
+  static surfaceScale_Getter(mthis) native "SVGFESpecularLightingElement_surfaceScale_Getter";
+  surfaceScale_Getter_(mthis) => surfaceScale_Getter(mthis);
 
   static width_Getter(mthis) native "SVGFESpecularLightingElement_width_Getter";
+  width_Getter_(mthis) => width_Getter(mthis);
 
   static x_Getter(mthis) native "SVGFESpecularLightingElement_x_Getter";
+  x_Getter_(mthis) => x_Getter(mthis);
 
   static y_Getter(mthis) native "SVGFESpecularLightingElement_y_Getter";
+  y_Getter_(mthis) => y_Getter(mthis);
+
 }
 
-class BlinkSVGFESpotLightElement {
+class BlinkSVGFESpotLightElement extends BlinkSVGElement {
+  static final instance = new BlinkSVGFESpotLightElement();
+
   static limitingConeAngle_Getter(mthis) native "SVGFESpotLightElement_limitingConeAngle_Getter";
+  limitingConeAngle_Getter_(mthis) => limitingConeAngle_Getter(mthis);
 
   static pointsAtX_Getter(mthis) native "SVGFESpotLightElement_pointsAtX_Getter";
+  pointsAtX_Getter_(mthis) => pointsAtX_Getter(mthis);
 
   static pointsAtY_Getter(mthis) native "SVGFESpotLightElement_pointsAtY_Getter";
+  pointsAtY_Getter_(mthis) => pointsAtY_Getter(mthis);
 
   static pointsAtZ_Getter(mthis) native "SVGFESpotLightElement_pointsAtZ_Getter";
+  pointsAtZ_Getter_(mthis) => pointsAtZ_Getter(mthis);
 
   static specularExponent_Getter(mthis) native "SVGFESpotLightElement_specularExponent_Getter";
+  specularExponent_Getter_(mthis) => specularExponent_Getter(mthis);
 
   static x_Getter(mthis) native "SVGFESpotLightElement_x_Getter";
+  x_Getter_(mthis) => x_Getter(mthis);
 
   static y_Getter(mthis) native "SVGFESpotLightElement_y_Getter";
+  y_Getter_(mthis) => y_Getter(mthis);
 
   static z_Getter(mthis) native "SVGFESpotLightElement_z_Getter";
+  z_Getter_(mthis) => z_Getter(mthis);
+
 }
 
-class BlinkSVGFETileElement {
-  static in1_Getter(mthis) native "SVGFETileElement_in1_Getter";
+class BlinkSVGFETileElement extends BlinkSVGElement {
+  static final instance = new BlinkSVGFETileElement();
 
   static height_Getter(mthis) native "SVGFETileElement_height_Getter";
+  height_Getter_(mthis) => height_Getter(mthis);
+
+  static in1_Getter(mthis) native "SVGFETileElement_in1_Getter";
+  in1_Getter_(mthis) => in1_Getter(mthis);
 
   static result_Getter(mthis) native "SVGFETileElement_result_Getter";
+  result_Getter_(mthis) => result_Getter(mthis);
 
   static width_Getter(mthis) native "SVGFETileElement_width_Getter";
+  width_Getter_(mthis) => width_Getter(mthis);
 
   static x_Getter(mthis) native "SVGFETileElement_x_Getter";
+  x_Getter_(mthis) => x_Getter(mthis);
 
   static y_Getter(mthis) native "SVGFETileElement_y_Getter";
+  y_Getter_(mthis) => y_Getter(mthis);
+
 }
 
-class BlinkSVGFETurbulenceElement {
+class BlinkSVGFETurbulenceElement extends BlinkSVGElement {
+  static final instance = new BlinkSVGFETurbulenceElement();
+
   static baseFrequencyX_Getter(mthis) native "SVGFETurbulenceElement_baseFrequencyX_Getter";
+  baseFrequencyX_Getter_(mthis) => baseFrequencyX_Getter(mthis);
 
   static baseFrequencyY_Getter(mthis) native "SVGFETurbulenceElement_baseFrequencyY_Getter";
-
-  static numOctaves_Getter(mthis) native "SVGFETurbulenceElement_numOctaves_Getter";
-
-  static seed_Getter(mthis) native "SVGFETurbulenceElement_seed_Getter";
-
-  static stitchTiles_Getter(mthis) native "SVGFETurbulenceElement_stitchTiles_Getter";
-
-  static type_Getter(mthis) native "SVGFETurbulenceElement_type_Getter";
+  baseFrequencyY_Getter_(mthis) => baseFrequencyY_Getter(mthis);
 
   static height_Getter(mthis) native "SVGFETurbulenceElement_height_Getter";
+  height_Getter_(mthis) => height_Getter(mthis);
+
+  static numOctaves_Getter(mthis) native "SVGFETurbulenceElement_numOctaves_Getter";
+  numOctaves_Getter_(mthis) => numOctaves_Getter(mthis);
 
   static result_Getter(mthis) native "SVGFETurbulenceElement_result_Getter";
+  result_Getter_(mthis) => result_Getter(mthis);
+
+  static seed_Getter(mthis) native "SVGFETurbulenceElement_seed_Getter";
+  seed_Getter_(mthis) => seed_Getter(mthis);
+
+  static stitchTiles_Getter(mthis) native "SVGFETurbulenceElement_stitchTiles_Getter";
+  stitchTiles_Getter_(mthis) => stitchTiles_Getter(mthis);
+
+  static type_Getter(mthis) native "SVGFETurbulenceElement_type_Getter";
+  type_Getter_(mthis) => type_Getter(mthis);
 
   static width_Getter(mthis) native "SVGFETurbulenceElement_width_Getter";
+  width_Getter_(mthis) => width_Getter(mthis);
 
   static x_Getter(mthis) native "SVGFETurbulenceElement_x_Getter";
+  x_Getter_(mthis) => x_Getter(mthis);
 
   static y_Getter(mthis) native "SVGFETurbulenceElement_y_Getter";
+  y_Getter_(mthis) => y_Getter(mthis);
+
 }
 
-class BlinkSVGFilterElement {
+class BlinkSVGFilterElement extends BlinkSVGElement {
+  static final instance = new BlinkSVGFilterElement();
+
   static filterResX_Getter(mthis) native "SVGFilterElement_filterResX_Getter";
+  filterResX_Getter_(mthis) => filterResX_Getter(mthis);
 
   static filterResY_Getter(mthis) native "SVGFilterElement_filterResY_Getter";
+  filterResY_Getter_(mthis) => filterResY_Getter(mthis);
 
   static filterUnits_Getter(mthis) native "SVGFilterElement_filterUnits_Getter";
+  filterUnits_Getter_(mthis) => filterUnits_Getter(mthis);
 
   static height_Getter(mthis) native "SVGFilterElement_height_Getter";
-
-  static primitiveUnits_Getter(mthis) native "SVGFilterElement_primitiveUnits_Getter";
-
-  static width_Getter(mthis) native "SVGFilterElement_width_Getter";
-
-  static x_Getter(mthis) native "SVGFilterElement_x_Getter";
-
-  static y_Getter(mthis) native "SVGFilterElement_y_Getter";
-
-  static setFilterRes_Callback_2(mthis, filterResX, filterResY) native "SVGFilterElement_setFilterRes_Callback";
+  height_Getter_(mthis) => height_Getter(mthis);
 
   static href_Getter(mthis) native "SVGFilterElement_href_Getter";
+  href_Getter_(mthis) => href_Getter(mthis);
+
+  static primitiveUnits_Getter(mthis) native "SVGFilterElement_primitiveUnits_Getter";
+  primitiveUnits_Getter_(mthis) => primitiveUnits_Getter(mthis);
+
+  static setFilterRes_Callback_0(mthis) native "SVGFilterElement_setFilterRes_Callback";
+  setFilterRes_Callback_0_(mthis) => setFilterRes_Callback_0(mthis);
+
+  static setFilterRes_Callback_1(mthis, __arg_0) native "SVGFilterElement_setFilterRes_Callback";
+  setFilterRes_Callback_1_(mthis, __arg_0) => setFilterRes_Callback_1(mthis, __arg_0);
+
+  static setFilterRes_Callback_2(mthis, __arg_0, __arg_1) native "SVGFilterElement_setFilterRes_Callback";
+  setFilterRes_Callback_2_(mthis, __arg_0, __arg_1) => setFilterRes_Callback_2(mthis, __arg_0, __arg_1);
+
+  static setFilterRes_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGFilterElement_setFilterRes_Callback";
+  setFilterRes_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => setFilterRes_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static setFilterRes_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "SVGFilterElement_setFilterRes_Callback";
+  setFilterRes_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => setFilterRes_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static width_Getter(mthis) native "SVGFilterElement_width_Getter";
+  width_Getter_(mthis) => width_Getter(mthis);
+
+  static x_Getter(mthis) native "SVGFilterElement_x_Getter";
+  x_Getter_(mthis) => x_Getter(mthis);
+
+  static y_Getter(mthis) native "SVGFilterElement_y_Getter";
+  y_Getter_(mthis) => y_Getter(mthis);
+
 }
 
-class BlinkSVGFitToViewBox {
-  static preserveAspectRatio_Getter(mthis) native "SVGFitToViewBox_preserveAspectRatio_Getter";
+class BlinkSVGFontElement extends BlinkSVGElement {
+  static final instance = new BlinkSVGFontElement();
 
-  static viewBox_Getter(mthis) native "SVGFitToViewBox_viewBox_Getter";
 }
 
-class BlinkSVGFontElement {}
+class BlinkSVGFontFaceElement extends BlinkSVGElement {
+  static final instance = new BlinkSVGFontFaceElement();
 
-class BlinkSVGFontFaceElement {}
+}
 
-class BlinkSVGFontFaceFormatElement {}
+class BlinkSVGFontFaceFormatElement extends BlinkSVGElement {
+  static final instance = new BlinkSVGFontFaceFormatElement();
 
-class BlinkSVGFontFaceNameElement {}
+}
 
-class BlinkSVGFontFaceSrcElement {}
+class BlinkSVGFontFaceNameElement extends BlinkSVGElement {
+  static final instance = new BlinkSVGFontFaceNameElement();
 
-class BlinkSVGFontFaceUriElement {}
+}
 
-class BlinkSVGForeignObjectElement {
+class BlinkSVGFontFaceSrcElement extends BlinkSVGElement {
+  static final instance = new BlinkSVGFontFaceSrcElement();
+
+}
+
+class BlinkSVGFontFaceUriElement extends BlinkSVGElement {
+  static final instance = new BlinkSVGFontFaceUriElement();
+
+}
+
+class BlinkSVGForeignObjectElement extends BlinkSVGGraphicsElement {
+  static final instance = new BlinkSVGForeignObjectElement();
+
   static height_Getter(mthis) native "SVGForeignObjectElement_height_Getter";
+  height_Getter_(mthis) => height_Getter(mthis);
 
   static width_Getter(mthis) native "SVGForeignObjectElement_width_Getter";
+  width_Getter_(mthis) => width_Getter(mthis);
 
   static x_Getter(mthis) native "SVGForeignObjectElement_x_Getter";
+  x_Getter_(mthis) => x_Getter(mthis);
 
   static y_Getter(mthis) native "SVGForeignObjectElement_y_Getter";
+  y_Getter_(mthis) => y_Getter(mthis);
+
 }
 
-class BlinkSVGGElement {}
+class BlinkSVGGElement extends BlinkSVGGraphicsElement {
+  static final instance = new BlinkSVGGElement();
 
-class BlinkSVGGlyphElement {}
+}
 
-class BlinkSVGGlyphRefElement {}
+class BlinkSVGGeometryElement extends BlinkSVGGraphicsElement {
+  static final instance = new BlinkSVGGeometryElement();
 
-class BlinkSVGGradientElement {
+  static isPointInFill_Callback_0(mthis) native "SVGGeometryElement_isPointInFill_Callback";
+  isPointInFill_Callback_0_(mthis) => isPointInFill_Callback_0(mthis);
+
+  static isPointInFill_Callback_1(mthis, __arg_0) native "SVGGeometryElement_isPointInFill_Callback";
+  isPointInFill_Callback_1_(mthis, __arg_0) => isPointInFill_Callback_1(mthis, __arg_0);
+
+  static isPointInFill_Callback_2(mthis, __arg_0, __arg_1) native "SVGGeometryElement_isPointInFill_Callback";
+  isPointInFill_Callback_2_(mthis, __arg_0, __arg_1) => isPointInFill_Callback_2(mthis, __arg_0, __arg_1);
+
+  static isPointInFill_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGGeometryElement_isPointInFill_Callback";
+  isPointInFill_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => isPointInFill_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static isPointInStroke_Callback_0(mthis) native "SVGGeometryElement_isPointInStroke_Callback";
+  isPointInStroke_Callback_0_(mthis) => isPointInStroke_Callback_0(mthis);
+
+  static isPointInStroke_Callback_1(mthis, __arg_0) native "SVGGeometryElement_isPointInStroke_Callback";
+  isPointInStroke_Callback_1_(mthis, __arg_0) => isPointInStroke_Callback_1(mthis, __arg_0);
+
+  static isPointInStroke_Callback_2(mthis, __arg_0, __arg_1) native "SVGGeometryElement_isPointInStroke_Callback";
+  isPointInStroke_Callback_2_(mthis, __arg_0, __arg_1) => isPointInStroke_Callback_2(mthis, __arg_0, __arg_1);
+
+  static isPointInStroke_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGGeometryElement_isPointInStroke_Callback";
+  isPointInStroke_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => isPointInStroke_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+}
+
+class BlinkSVGGlyphElement extends BlinkSVGElement {
+  static final instance = new BlinkSVGGlyphElement();
+
+}
+
+class BlinkSVGGlyphRefElement extends BlinkSVGElement {
+  static final instance = new BlinkSVGGlyphRefElement();
+
+  static dx_Getter(mthis) native "SVGGlyphRefElement_dx_Getter";
+  dx_Getter_(mthis) => dx_Getter(mthis);
+
+  static dx_Setter(mthis, __arg_0) native "SVGGlyphRefElement_dx_Setter";
+  dx_Setter_(mthis, __arg_0) => dx_Setter(mthis, __arg_0);
+
+  static dy_Getter(mthis) native "SVGGlyphRefElement_dy_Getter";
+  dy_Getter_(mthis) => dy_Getter(mthis);
+
+  static dy_Setter(mthis, __arg_0) native "SVGGlyphRefElement_dy_Setter";
+  dy_Setter_(mthis, __arg_0) => dy_Setter(mthis, __arg_0);
+
+  static format_Getter(mthis) native "SVGGlyphRefElement_format_Getter";
+  format_Getter_(mthis) => format_Getter(mthis);
+
+  static format_Setter(mthis, __arg_0) native "SVGGlyphRefElement_format_Setter";
+  format_Setter_(mthis, __arg_0) => format_Setter(mthis, __arg_0);
+
+  static glyphRef_Getter(mthis) native "SVGGlyphRefElement_glyphRef_Getter";
+  glyphRef_Getter_(mthis) => glyphRef_Getter(mthis);
+
+  static glyphRef_Setter(mthis, __arg_0) native "SVGGlyphRefElement_glyphRef_Setter";
+  glyphRef_Setter_(mthis, __arg_0) => glyphRef_Setter(mthis, __arg_0);
+
+  static href_Getter(mthis) native "SVGGlyphRefElement_href_Getter";
+  href_Getter_(mthis) => href_Getter(mthis);
+
+  static x_Getter(mthis) native "SVGGlyphRefElement_x_Getter";
+  x_Getter_(mthis) => x_Getter(mthis);
+
+  static x_Setter(mthis, __arg_0) native "SVGGlyphRefElement_x_Setter";
+  x_Setter_(mthis, __arg_0) => x_Setter(mthis, __arg_0);
+
+  static y_Getter(mthis) native "SVGGlyphRefElement_y_Getter";
+  y_Getter_(mthis) => y_Getter(mthis);
+
+  static y_Setter(mthis, __arg_0) native "SVGGlyphRefElement_y_Setter";
+  y_Setter_(mthis, __arg_0) => y_Setter(mthis, __arg_0);
+
+}
+
+class BlinkSVGGradientElement extends BlinkSVGElement {
+  static final instance = new BlinkSVGGradientElement();
+
   static gradientTransform_Getter(mthis) native "SVGGradientElement_gradientTransform_Getter";
+  gradientTransform_Getter_(mthis) => gradientTransform_Getter(mthis);
 
   static gradientUnits_Getter(mthis) native "SVGGradientElement_gradientUnits_Getter";
-
-  static spreadMethod_Getter(mthis) native "SVGGradientElement_spreadMethod_Getter";
+  gradientUnits_Getter_(mthis) => gradientUnits_Getter(mthis);
 
   static href_Getter(mthis) native "SVGGradientElement_href_Getter";
+  href_Getter_(mthis) => href_Getter(mthis);
+
+  static spreadMethod_Getter(mthis) native "SVGGradientElement_spreadMethod_Getter";
+  spreadMethod_Getter_(mthis) => spreadMethod_Getter(mthis);
+
 }
 
-class BlinkSVGHKernElement {}
+class BlinkSVGGraphicsElement extends BlinkSVGElement {
+  static final instance = new BlinkSVGGraphicsElement();
 
-class BlinkSVGImageElement {
+  static farthestViewportElement_Getter(mthis) native "SVGGraphicsElement_farthestViewportElement_Getter";
+  farthestViewportElement_Getter_(mthis) => farthestViewportElement_Getter(mthis);
+
+  static getBBox_Callback_0(mthis) native "SVGGraphicsElement_getBBox_Callback";
+  getBBox_Callback_0_(mthis) => getBBox_Callback_0(mthis);
+
+  static getBBox_Callback_1(mthis, __arg_0) native "SVGGraphicsElement_getBBox_Callback";
+  getBBox_Callback_1_(mthis, __arg_0) => getBBox_Callback_1(mthis, __arg_0);
+
+  static getBBox_Callback_2(mthis, __arg_0, __arg_1) native "SVGGraphicsElement_getBBox_Callback";
+  getBBox_Callback_2_(mthis, __arg_0, __arg_1) => getBBox_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getCTM_Callback_0(mthis) native "SVGGraphicsElement_getCTM_Callback";
+  getCTM_Callback_0_(mthis) => getCTM_Callback_0(mthis);
+
+  static getCTM_Callback_1(mthis, __arg_0) native "SVGGraphicsElement_getCTM_Callback";
+  getCTM_Callback_1_(mthis, __arg_0) => getCTM_Callback_1(mthis, __arg_0);
+
+  static getCTM_Callback_2(mthis, __arg_0, __arg_1) native "SVGGraphicsElement_getCTM_Callback";
+  getCTM_Callback_2_(mthis, __arg_0, __arg_1) => getCTM_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getScreenCTM_Callback_0(mthis) native "SVGGraphicsElement_getScreenCTM_Callback";
+  getScreenCTM_Callback_0_(mthis) => getScreenCTM_Callback_0(mthis);
+
+  static getScreenCTM_Callback_1(mthis, __arg_0) native "SVGGraphicsElement_getScreenCTM_Callback";
+  getScreenCTM_Callback_1_(mthis, __arg_0) => getScreenCTM_Callback_1(mthis, __arg_0);
+
+  static getScreenCTM_Callback_2(mthis, __arg_0, __arg_1) native "SVGGraphicsElement_getScreenCTM_Callback";
+  getScreenCTM_Callback_2_(mthis, __arg_0, __arg_1) => getScreenCTM_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getTransformToElement_Callback_0(mthis) native "SVGGraphicsElement_getTransformToElement_Callback";
+  getTransformToElement_Callback_0_(mthis) => getTransformToElement_Callback_0(mthis);
+
+  static getTransformToElement_Callback_1(mthis, __arg_0) native "SVGGraphicsElement_getTransformToElement_Callback";
+  getTransformToElement_Callback_1_(mthis, __arg_0) => getTransformToElement_Callback_1(mthis, __arg_0);
+
+  static getTransformToElement_Callback_2(mthis, __arg_0, __arg_1) native "SVGGraphicsElement_getTransformToElement_Callback";
+  getTransformToElement_Callback_2_(mthis, __arg_0, __arg_1) => getTransformToElement_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getTransformToElement_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGGraphicsElement_getTransformToElement_Callback";
+  getTransformToElement_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getTransformToElement_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static hasExtension_Callback_0(mthis) native "SVGGraphicsElement_hasExtension_Callback";
+  hasExtension_Callback_0_(mthis) => hasExtension_Callback_0(mthis);
+
+  static hasExtension_Callback_1(mthis, __arg_0) native "SVGGraphicsElement_hasExtension_Callback";
+  hasExtension_Callback_1_(mthis, __arg_0) => hasExtension_Callback_1(mthis, __arg_0);
+
+  static hasExtension_Callback_2(mthis, __arg_0, __arg_1) native "SVGGraphicsElement_hasExtension_Callback";
+  hasExtension_Callback_2_(mthis, __arg_0, __arg_1) => hasExtension_Callback_2(mthis, __arg_0, __arg_1);
+
+  static hasExtension_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGGraphicsElement_hasExtension_Callback";
+  hasExtension_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => hasExtension_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static nearestViewportElement_Getter(mthis) native "SVGGraphicsElement_nearestViewportElement_Getter";
+  nearestViewportElement_Getter_(mthis) => nearestViewportElement_Getter(mthis);
+
+  static requiredExtensions_Getter(mthis) native "SVGGraphicsElement_requiredExtensions_Getter";
+  requiredExtensions_Getter_(mthis) => requiredExtensions_Getter(mthis);
+
+  static requiredFeatures_Getter(mthis) native "SVGGraphicsElement_requiredFeatures_Getter";
+  requiredFeatures_Getter_(mthis) => requiredFeatures_Getter(mthis);
+
+  static systemLanguage_Getter(mthis) native "SVGGraphicsElement_systemLanguage_Getter";
+  systemLanguage_Getter_(mthis) => systemLanguage_Getter(mthis);
+
+  static transform_Getter(mthis) native "SVGGraphicsElement_transform_Getter";
+  transform_Getter_(mthis) => transform_Getter(mthis);
+
+}
+
+class BlinkSVGHKernElement extends BlinkSVGElement {
+  static final instance = new BlinkSVGHKernElement();
+
+}
+
+class BlinkSVGImageElement extends BlinkSVGGraphicsElement {
+  static final instance = new BlinkSVGImageElement();
+
   static height_Getter(mthis) native "SVGImageElement_height_Getter";
-
-  static preserveAspectRatio_Getter(mthis) native "SVGImageElement_preserveAspectRatio_Getter";
-
-  static width_Getter(mthis) native "SVGImageElement_width_Getter";
-
-  static x_Getter(mthis) native "SVGImageElement_x_Getter";
-
-  static y_Getter(mthis) native "SVGImageElement_y_Getter";
+  height_Getter_(mthis) => height_Getter(mthis);
 
   static href_Getter(mthis) native "SVGImageElement_href_Getter";
+  href_Getter_(mthis) => href_Getter(mthis);
+
+  static preserveAspectRatio_Getter(mthis) native "SVGImageElement_preserveAspectRatio_Getter";
+  preserveAspectRatio_Getter_(mthis) => preserveAspectRatio_Getter(mthis);
+
+  static width_Getter(mthis) native "SVGImageElement_width_Getter";
+  width_Getter_(mthis) => width_Getter(mthis);
+
+  static x_Getter(mthis) native "SVGImageElement_x_Getter";
+  x_Getter_(mthis) => x_Getter(mthis);
+
+  static y_Getter(mthis) native "SVGImageElement_y_Getter";
+  y_Getter_(mthis) => y_Getter(mthis);
+
 }
 
 class BlinkSVGLength {
+  static final instance = new BlinkSVGLength();
+
+  static convertToSpecifiedUnits_Callback_0(mthis) native "SVGLength_convertToSpecifiedUnits_Callback";
+  convertToSpecifiedUnits_Callback_0_(mthis) => convertToSpecifiedUnits_Callback_0(mthis);
+
+  static convertToSpecifiedUnits_Callback_1(mthis, __arg_0) native "SVGLength_convertToSpecifiedUnits_Callback";
+  convertToSpecifiedUnits_Callback_1_(mthis, __arg_0) => convertToSpecifiedUnits_Callback_1(mthis, __arg_0);
+
+  static convertToSpecifiedUnits_Callback_2(mthis, __arg_0, __arg_1) native "SVGLength_convertToSpecifiedUnits_Callback";
+  convertToSpecifiedUnits_Callback_2_(mthis, __arg_0, __arg_1) => convertToSpecifiedUnits_Callback_2(mthis, __arg_0, __arg_1);
+
+  static convertToSpecifiedUnits_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGLength_convertToSpecifiedUnits_Callback";
+  convertToSpecifiedUnits_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => convertToSpecifiedUnits_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static newValueSpecifiedUnits_Callback_0(mthis) native "SVGLength_newValueSpecifiedUnits_Callback";
+  newValueSpecifiedUnits_Callback_0_(mthis) => newValueSpecifiedUnits_Callback_0(mthis);
+
+  static newValueSpecifiedUnits_Callback_1(mthis, __arg_0) native "SVGLength_newValueSpecifiedUnits_Callback";
+  newValueSpecifiedUnits_Callback_1_(mthis, __arg_0) => newValueSpecifiedUnits_Callback_1(mthis, __arg_0);
+
+  static newValueSpecifiedUnits_Callback_2(mthis, __arg_0, __arg_1) native "SVGLength_newValueSpecifiedUnits_Callback";
+  newValueSpecifiedUnits_Callback_2_(mthis, __arg_0, __arg_1) => newValueSpecifiedUnits_Callback_2(mthis, __arg_0, __arg_1);
+
+  static newValueSpecifiedUnits_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGLength_newValueSpecifiedUnits_Callback";
+  newValueSpecifiedUnits_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => newValueSpecifiedUnits_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static newValueSpecifiedUnits_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "SVGLength_newValueSpecifiedUnits_Callback";
+  newValueSpecifiedUnits_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => newValueSpecifiedUnits_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
   static unitType_Getter(mthis) native "SVGLength_unitType_Getter";
-
-  static value_Getter(mthis) native "SVGLength_value_Getter";
-
-  static value_Setter(mthis, value) native "SVGLength_value_Setter";
+  unitType_Getter_(mthis) => unitType_Getter(mthis);
 
   static valueAsString_Getter(mthis) native "SVGLength_valueAsString_Getter";
+  valueAsString_Getter_(mthis) => valueAsString_Getter(mthis);
 
-  static valueAsString_Setter(mthis, value) native "SVGLength_valueAsString_Setter";
+  static valueAsString_Setter(mthis, __arg_0) native "SVGLength_valueAsString_Setter";
+  valueAsString_Setter_(mthis, __arg_0) => valueAsString_Setter(mthis, __arg_0);
 
   static valueInSpecifiedUnits_Getter(mthis) native "SVGLength_valueInSpecifiedUnits_Getter";
+  valueInSpecifiedUnits_Getter_(mthis) => valueInSpecifiedUnits_Getter(mthis);
 
-  static valueInSpecifiedUnits_Setter(mthis, value) native "SVGLength_valueInSpecifiedUnits_Setter";
+  static valueInSpecifiedUnits_Setter(mthis, __arg_0) native "SVGLength_valueInSpecifiedUnits_Setter";
+  valueInSpecifiedUnits_Setter_(mthis, __arg_0) => valueInSpecifiedUnits_Setter(mthis, __arg_0);
 
-  static convertToSpecifiedUnits_Callback_1(mthis, unitType) native "SVGLength_convertToSpecifiedUnits_Callback";
+  static value_Getter(mthis) native "SVGLength_value_Getter";
+  value_Getter_(mthis) => value_Getter(mthis);
 
-  static newValueSpecifiedUnits_Callback_2(mthis, unitType, valueInSpecifiedUnits) native "SVGLength_newValueSpecifiedUnits_Callback";
+  static value_Setter(mthis, __arg_0) native "SVGLength_value_Setter";
+  value_Setter_(mthis, __arg_0) => value_Setter(mthis, __arg_0);
+
 }
 
 class BlinkSVGLengthList {
+  static final instance = new BlinkSVGLengthList();
+
+  static $__getter___Callback_1(mthis, __arg_0) native "SVGLengthList___getter___Callback";
+  $__getter___Callback_1_(mthis, __arg_0) => $__getter___Callback_1(mthis, __arg_0);
+
+  static $__setter___Callback_2(mthis, __arg_0, __arg_1) native "SVGLengthList___setter___Callback";
+  $__setter___Callback_2_(mthis, __arg_0, __arg_1) => $__setter___Callback_2(mthis, __arg_0, __arg_1);
+
+  static appendItem_Callback_0(mthis) native "SVGLengthList_appendItem_Callback";
+  appendItem_Callback_0_(mthis) => appendItem_Callback_0(mthis);
+
+  static appendItem_Callback_1(mthis, __arg_0) native "SVGLengthList_appendItem_Callback";
+  appendItem_Callback_1_(mthis, __arg_0) => appendItem_Callback_1(mthis, __arg_0);
+
+  static appendItem_Callback_2(mthis, __arg_0, __arg_1) native "SVGLengthList_appendItem_Callback";
+  appendItem_Callback_2_(mthis, __arg_0, __arg_1) => appendItem_Callback_2(mthis, __arg_0, __arg_1);
+
+  static appendItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGLengthList_appendItem_Callback";
+  appendItem_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => appendItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static clear_Callback_0(mthis) native "SVGLengthList_clear_Callback";
+  clear_Callback_0_(mthis) => clear_Callback_0(mthis);
+
+  static clear_Callback_1(mthis, __arg_0) native "SVGLengthList_clear_Callback";
+  clear_Callback_1_(mthis, __arg_0) => clear_Callback_1(mthis, __arg_0);
+
+  static clear_Callback_2(mthis, __arg_0, __arg_1) native "SVGLengthList_clear_Callback";
+  clear_Callback_2_(mthis, __arg_0, __arg_1) => clear_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getItem_Callback_0(mthis) native "SVGLengthList_getItem_Callback";
+  getItem_Callback_0_(mthis) => getItem_Callback_0(mthis);
+
+  static getItem_Callback_1(mthis, __arg_0) native "SVGLengthList_getItem_Callback";
+  getItem_Callback_1_(mthis, __arg_0) => getItem_Callback_1(mthis, __arg_0);
+
+  static getItem_Callback_2(mthis, __arg_0, __arg_1) native "SVGLengthList_getItem_Callback";
+  getItem_Callback_2_(mthis, __arg_0, __arg_1) => getItem_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGLengthList_getItem_Callback";
+  getItem_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static initialize_Callback_0(mthis) native "SVGLengthList_initialize_Callback";
+  initialize_Callback_0_(mthis) => initialize_Callback_0(mthis);
+
+  static initialize_Callback_1(mthis, __arg_0) native "SVGLengthList_initialize_Callback";
+  initialize_Callback_1_(mthis, __arg_0) => initialize_Callback_1(mthis, __arg_0);
+
+  static initialize_Callback_2(mthis, __arg_0, __arg_1) native "SVGLengthList_initialize_Callback";
+  initialize_Callback_2_(mthis, __arg_0, __arg_1) => initialize_Callback_2(mthis, __arg_0, __arg_1);
+
+  static initialize_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGLengthList_initialize_Callback";
+  initialize_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => initialize_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static insertItemBefore_Callback_0(mthis) native "SVGLengthList_insertItemBefore_Callback";
+  insertItemBefore_Callback_0_(mthis) => insertItemBefore_Callback_0(mthis);
+
+  static insertItemBefore_Callback_1(mthis, __arg_0) native "SVGLengthList_insertItemBefore_Callback";
+  insertItemBefore_Callback_1_(mthis, __arg_0) => insertItemBefore_Callback_1(mthis, __arg_0);
+
+  static insertItemBefore_Callback_2(mthis, __arg_0, __arg_1) native "SVGLengthList_insertItemBefore_Callback";
+  insertItemBefore_Callback_2_(mthis, __arg_0, __arg_1) => insertItemBefore_Callback_2(mthis, __arg_0, __arg_1);
+
+  static insertItemBefore_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGLengthList_insertItemBefore_Callback";
+  insertItemBefore_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => insertItemBefore_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static insertItemBefore_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "SVGLengthList_insertItemBefore_Callback";
+  insertItemBefore_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => insertItemBefore_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
   static length_Getter(mthis) native "SVGLengthList_length_Getter";
+  length_Getter_(mthis) => length_Getter(mthis);
 
   static numberOfItems_Getter(mthis) native "SVGLengthList_numberOfItems_Getter";
+  numberOfItems_Getter_(mthis) => numberOfItems_Getter(mthis);
 
-  static $__setter___Callback_2(mthis, index, value) native "SVGLengthList___setter___Callback";
+  static removeItem_Callback_0(mthis) native "SVGLengthList_removeItem_Callback";
+  removeItem_Callback_0_(mthis) => removeItem_Callback_0(mthis);
 
-  static appendItem_Callback_1(mthis, item) native "SVGLengthList_appendItem_Callback";
+  static removeItem_Callback_1(mthis, __arg_0) native "SVGLengthList_removeItem_Callback";
+  removeItem_Callback_1_(mthis, __arg_0) => removeItem_Callback_1(mthis, __arg_0);
 
-  static clear_Callback(mthis) native "SVGLengthList_clear_Callback";
+  static removeItem_Callback_2(mthis, __arg_0, __arg_1) native "SVGLengthList_removeItem_Callback";
+  removeItem_Callback_2_(mthis, __arg_0, __arg_1) => removeItem_Callback_2(mthis, __arg_0, __arg_1);
 
-  static getItem_Callback_1(mthis, index) native "SVGLengthList_getItem_Callback";
+  static removeItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGLengthList_removeItem_Callback";
+  removeItem_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => removeItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
-  static initialize_Callback_1(mthis, item) native "SVGLengthList_initialize_Callback";
+  static replaceItem_Callback_0(mthis) native "SVGLengthList_replaceItem_Callback";
+  replaceItem_Callback_0_(mthis) => replaceItem_Callback_0(mthis);
 
-  static insertItemBefore_Callback_2(mthis, item, index) native "SVGLengthList_insertItemBefore_Callback";
+  static replaceItem_Callback_1(mthis, __arg_0) native "SVGLengthList_replaceItem_Callback";
+  replaceItem_Callback_1_(mthis, __arg_0) => replaceItem_Callback_1(mthis, __arg_0);
 
-  static removeItem_Callback_1(mthis, index) native "SVGLengthList_removeItem_Callback";
+  static replaceItem_Callback_2(mthis, __arg_0, __arg_1) native "SVGLengthList_replaceItem_Callback";
+  replaceItem_Callback_2_(mthis, __arg_0, __arg_1) => replaceItem_Callback_2(mthis, __arg_0, __arg_1);
 
-  static replaceItem_Callback_2(mthis, item, index) native "SVGLengthList_replaceItem_Callback";
+  static replaceItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGLengthList_replaceItem_Callback";
+  replaceItem_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => replaceItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static replaceItem_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "SVGLengthList_replaceItem_Callback";
+  replaceItem_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => replaceItem_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
 }
 
-class BlinkSVGLineElement {
+class BlinkSVGLineElement extends BlinkSVGGeometryElement {
+  static final instance = new BlinkSVGLineElement();
+
   static x1_Getter(mthis) native "SVGLineElement_x1_Getter";
+  x1_Getter_(mthis) => x1_Getter(mthis);
 
   static x2_Getter(mthis) native "SVGLineElement_x2_Getter";
+  x2_Getter_(mthis) => x2_Getter(mthis);
 
   static y1_Getter(mthis) native "SVGLineElement_y1_Getter";
+  y1_Getter_(mthis) => y1_Getter(mthis);
 
   static y2_Getter(mthis) native "SVGLineElement_y2_Getter";
+  y2_Getter_(mthis) => y2_Getter(mthis);
+
 }
 
-class BlinkSVGLinearGradientElement {
+class BlinkSVGLinearGradientElement extends BlinkSVGGradientElement {
+  static final instance = new BlinkSVGLinearGradientElement();
+
   static x1_Getter(mthis) native "SVGLinearGradientElement_x1_Getter";
+  x1_Getter_(mthis) => x1_Getter(mthis);
 
   static x2_Getter(mthis) native "SVGLinearGradientElement_x2_Getter";
+  x2_Getter_(mthis) => x2_Getter(mthis);
 
   static y1_Getter(mthis) native "SVGLinearGradientElement_y1_Getter";
+  y1_Getter_(mthis) => y1_Getter(mthis);
 
   static y2_Getter(mthis) native "SVGLinearGradientElement_y2_Getter";
+  y2_Getter_(mthis) => y2_Getter(mthis);
+
 }
 
-class BlinkSVGMPathElement {}
+class BlinkSVGMPathElement extends BlinkSVGElement {
+  static final instance = new BlinkSVGMPathElement();
 
-class BlinkSVGMarkerElement {
+  static href_Getter(mthis) native "SVGMPathElement_href_Getter";
+  href_Getter_(mthis) => href_Getter(mthis);
+
+}
+
+class BlinkSVGMarkerElement extends BlinkSVGElement {
+  static final instance = new BlinkSVGMarkerElement();
+
   static markerHeight_Getter(mthis) native "SVGMarkerElement_markerHeight_Getter";
+  markerHeight_Getter_(mthis) => markerHeight_Getter(mthis);
 
   static markerUnits_Getter(mthis) native "SVGMarkerElement_markerUnits_Getter";
+  markerUnits_Getter_(mthis) => markerUnits_Getter(mthis);
 
   static markerWidth_Getter(mthis) native "SVGMarkerElement_markerWidth_Getter";
+  markerWidth_Getter_(mthis) => markerWidth_Getter(mthis);
 
   static orientAngle_Getter(mthis) native "SVGMarkerElement_orientAngle_Getter";
+  orientAngle_Getter_(mthis) => orientAngle_Getter(mthis);
 
   static orientType_Getter(mthis) native "SVGMarkerElement_orientType_Getter";
-
-  static refX_Getter(mthis) native "SVGMarkerElement_refX_Getter";
-
-  static refY_Getter(mthis) native "SVGMarkerElement_refY_Getter";
-
-  static setOrientToAngle_Callback_1(mthis, angle) native "SVGMarkerElement_setOrientToAngle_Callback";
-
-  static setOrientToAuto_Callback(mthis) native "SVGMarkerElement_setOrientToAuto_Callback";
+  orientType_Getter_(mthis) => orientType_Getter(mthis);
 
   static preserveAspectRatio_Getter(mthis) native "SVGMarkerElement_preserveAspectRatio_Getter";
+  preserveAspectRatio_Getter_(mthis) => preserveAspectRatio_Getter(mthis);
+
+  static refX_Getter(mthis) native "SVGMarkerElement_refX_Getter";
+  refX_Getter_(mthis) => refX_Getter(mthis);
+
+  static refY_Getter(mthis) native "SVGMarkerElement_refY_Getter";
+  refY_Getter_(mthis) => refY_Getter(mthis);
+
+  static setOrientToAngle_Callback_0(mthis) native "SVGMarkerElement_setOrientToAngle_Callback";
+  setOrientToAngle_Callback_0_(mthis) => setOrientToAngle_Callback_0(mthis);
+
+  static setOrientToAngle_Callback_1(mthis, __arg_0) native "SVGMarkerElement_setOrientToAngle_Callback";
+  setOrientToAngle_Callback_1_(mthis, __arg_0) => setOrientToAngle_Callback_1(mthis, __arg_0);
+
+  static setOrientToAngle_Callback_2(mthis, __arg_0, __arg_1) native "SVGMarkerElement_setOrientToAngle_Callback";
+  setOrientToAngle_Callback_2_(mthis, __arg_0, __arg_1) => setOrientToAngle_Callback_2(mthis, __arg_0, __arg_1);
+
+  static setOrientToAngle_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGMarkerElement_setOrientToAngle_Callback";
+  setOrientToAngle_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => setOrientToAngle_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static setOrientToAuto_Callback_0(mthis) native "SVGMarkerElement_setOrientToAuto_Callback";
+  setOrientToAuto_Callback_0_(mthis) => setOrientToAuto_Callback_0(mthis);
+
+  static setOrientToAuto_Callback_1(mthis, __arg_0) native "SVGMarkerElement_setOrientToAuto_Callback";
+  setOrientToAuto_Callback_1_(mthis, __arg_0) => setOrientToAuto_Callback_1(mthis, __arg_0);
+
+  static setOrientToAuto_Callback_2(mthis, __arg_0, __arg_1) native "SVGMarkerElement_setOrientToAuto_Callback";
+  setOrientToAuto_Callback_2_(mthis, __arg_0, __arg_1) => setOrientToAuto_Callback_2(mthis, __arg_0, __arg_1);
 
   static viewBox_Getter(mthis) native "SVGMarkerElement_viewBox_Getter";
+  viewBox_Getter_(mthis) => viewBox_Getter(mthis);
+
 }
 
-class BlinkSVGMaskElement {
+class BlinkSVGMaskElement extends BlinkSVGElement {
+  static final instance = new BlinkSVGMaskElement();
+
+  static hasExtension_Callback_0(mthis) native "SVGMaskElement_hasExtension_Callback";
+  hasExtension_Callback_0_(mthis) => hasExtension_Callback_0(mthis);
+
+  static hasExtension_Callback_1(mthis, __arg_0) native "SVGMaskElement_hasExtension_Callback";
+  hasExtension_Callback_1_(mthis, __arg_0) => hasExtension_Callback_1(mthis, __arg_0);
+
+  static hasExtension_Callback_2(mthis, __arg_0, __arg_1) native "SVGMaskElement_hasExtension_Callback";
+  hasExtension_Callback_2_(mthis, __arg_0, __arg_1) => hasExtension_Callback_2(mthis, __arg_0, __arg_1);
+
+  static hasExtension_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGMaskElement_hasExtension_Callback";
+  hasExtension_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => hasExtension_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
   static height_Getter(mthis) native "SVGMaskElement_height_Getter";
+  height_Getter_(mthis) => height_Getter(mthis);
 
   static maskContentUnits_Getter(mthis) native "SVGMaskElement_maskContentUnits_Getter";
+  maskContentUnits_Getter_(mthis) => maskContentUnits_Getter(mthis);
 
   static maskUnits_Getter(mthis) native "SVGMaskElement_maskUnits_Getter";
-
-  static width_Getter(mthis) native "SVGMaskElement_width_Getter";
-
-  static x_Getter(mthis) native "SVGMaskElement_x_Getter";
-
-  static y_Getter(mthis) native "SVGMaskElement_y_Getter";
+  maskUnits_Getter_(mthis) => maskUnits_Getter(mthis);
 
   static requiredExtensions_Getter(mthis) native "SVGMaskElement_requiredExtensions_Getter";
+  requiredExtensions_Getter_(mthis) => requiredExtensions_Getter(mthis);
 
   static requiredFeatures_Getter(mthis) native "SVGMaskElement_requiredFeatures_Getter";
+  requiredFeatures_Getter_(mthis) => requiredFeatures_Getter(mthis);
 
   static systemLanguage_Getter(mthis) native "SVGMaskElement_systemLanguage_Getter";
+  systemLanguage_Getter_(mthis) => systemLanguage_Getter(mthis);
 
-  static hasExtension_Callback_1(mthis, extension) native "SVGMaskElement_hasExtension_Callback";
+  static width_Getter(mthis) native "SVGMaskElement_width_Getter";
+  width_Getter_(mthis) => width_Getter(mthis);
+
+  static x_Getter(mthis) native "SVGMaskElement_x_Getter";
+  x_Getter_(mthis) => x_Getter(mthis);
+
+  static y_Getter(mthis) native "SVGMaskElement_y_Getter";
+  y_Getter_(mthis) => y_Getter(mthis);
+
 }
 
 class BlinkSVGMatrix {
-  static a_Getter(mthis) native "SVGMatrix_a_Getter";
+  static final instance = new BlinkSVGMatrix();
 
-  static a_Setter(mthis, value) native "SVGMatrix_a_Setter";
+  static a_Getter(mthis) native "SVGMatrix_a_Getter";
+  a_Getter_(mthis) => a_Getter(mthis);
+
+  static a_Setter(mthis, __arg_0) native "SVGMatrix_a_Setter";
+  a_Setter_(mthis, __arg_0) => a_Setter(mthis, __arg_0);
 
   static b_Getter(mthis) native "SVGMatrix_b_Getter";
+  b_Getter_(mthis) => b_Getter(mthis);
 
-  static b_Setter(mthis, value) native "SVGMatrix_b_Setter";
+  static b_Setter(mthis, __arg_0) native "SVGMatrix_b_Setter";
+  b_Setter_(mthis, __arg_0) => b_Setter(mthis, __arg_0);
 
   static c_Getter(mthis) native "SVGMatrix_c_Getter";
+  c_Getter_(mthis) => c_Getter(mthis);
 
-  static c_Setter(mthis, value) native "SVGMatrix_c_Setter";
+  static c_Setter(mthis, __arg_0) native "SVGMatrix_c_Setter";
+  c_Setter_(mthis, __arg_0) => c_Setter(mthis, __arg_0);
 
   static d_Getter(mthis) native "SVGMatrix_d_Getter";
+  d_Getter_(mthis) => d_Getter(mthis);
 
-  static d_Setter(mthis, value) native "SVGMatrix_d_Setter";
+  static d_Setter(mthis, __arg_0) native "SVGMatrix_d_Setter";
+  d_Setter_(mthis, __arg_0) => d_Setter(mthis, __arg_0);
 
   static e_Getter(mthis) native "SVGMatrix_e_Getter";
+  e_Getter_(mthis) => e_Getter(mthis);
 
-  static e_Setter(mthis, value) native "SVGMatrix_e_Setter";
+  static e_Setter(mthis, __arg_0) native "SVGMatrix_e_Setter";
+  e_Setter_(mthis, __arg_0) => e_Setter(mthis, __arg_0);
 
   static f_Getter(mthis) native "SVGMatrix_f_Getter";
+  f_Getter_(mthis) => f_Getter(mthis);
 
-  static f_Setter(mthis, value) native "SVGMatrix_f_Setter";
+  static f_Setter(mthis, __arg_0) native "SVGMatrix_f_Setter";
+  f_Setter_(mthis, __arg_0) => f_Setter(mthis, __arg_0);
 
-  static flipX_Callback(mthis) native "SVGMatrix_flipX_Callback";
+  static flipX_Callback_0(mthis) native "SVGMatrix_flipX_Callback";
+  flipX_Callback_0_(mthis) => flipX_Callback_0(mthis);
 
-  static flipY_Callback(mthis) native "SVGMatrix_flipY_Callback";
+  static flipX_Callback_1(mthis, __arg_0) native "SVGMatrix_flipX_Callback";
+  flipX_Callback_1_(mthis, __arg_0) => flipX_Callback_1(mthis, __arg_0);
 
-  static inverse_Callback(mthis) native "SVGMatrix_inverse_Callback";
+  static flipX_Callback_2(mthis, __arg_0, __arg_1) native "SVGMatrix_flipX_Callback";
+  flipX_Callback_2_(mthis, __arg_0, __arg_1) => flipX_Callback_2(mthis, __arg_0, __arg_1);
 
-  static multiply_Callback_1(mthis, secondMatrix) native "SVGMatrix_multiply_Callback";
+  static flipY_Callback_0(mthis) native "SVGMatrix_flipY_Callback";
+  flipY_Callback_0_(mthis) => flipY_Callback_0(mthis);
 
-  static rotate_Callback_1(mthis, angle) native "SVGMatrix_rotate_Callback";
+  static flipY_Callback_1(mthis, __arg_0) native "SVGMatrix_flipY_Callback";
+  flipY_Callback_1_(mthis, __arg_0) => flipY_Callback_1(mthis, __arg_0);
 
-  static rotateFromVector_Callback_2(mthis, x, y) native "SVGMatrix_rotateFromVector_Callback";
+  static flipY_Callback_2(mthis, __arg_0, __arg_1) native "SVGMatrix_flipY_Callback";
+  flipY_Callback_2_(mthis, __arg_0, __arg_1) => flipY_Callback_2(mthis, __arg_0, __arg_1);
 
-  static scale_Callback_1(mthis, scaleFactor) native "SVGMatrix_scale_Callback";
+  static inverse_Callback_0(mthis) native "SVGMatrix_inverse_Callback";
+  inverse_Callback_0_(mthis) => inverse_Callback_0(mthis);
 
-  static scaleNonUniform_Callback_2(mthis, scaleFactorX, scaleFactorY) native "SVGMatrix_scaleNonUniform_Callback";
+  static inverse_Callback_1(mthis, __arg_0) native "SVGMatrix_inverse_Callback";
+  inverse_Callback_1_(mthis, __arg_0) => inverse_Callback_1(mthis, __arg_0);
 
-  static skewX_Callback_1(mthis, angle) native "SVGMatrix_skewX_Callback";
+  static inverse_Callback_2(mthis, __arg_0, __arg_1) native "SVGMatrix_inverse_Callback";
+  inverse_Callback_2_(mthis, __arg_0, __arg_1) => inverse_Callback_2(mthis, __arg_0, __arg_1);
 
-  static skewY_Callback_1(mthis, angle) native "SVGMatrix_skewY_Callback";
+  static multiply_Callback_0(mthis) native "SVGMatrix_multiply_Callback";
+  multiply_Callback_0_(mthis) => multiply_Callback_0(mthis);
 
-  static translate_Callback_2(mthis, x, y) native "SVGMatrix_translate_Callback";
+  static multiply_Callback_1(mthis, __arg_0) native "SVGMatrix_multiply_Callback";
+  multiply_Callback_1_(mthis, __arg_0) => multiply_Callback_1(mthis, __arg_0);
+
+  static multiply_Callback_2(mthis, __arg_0, __arg_1) native "SVGMatrix_multiply_Callback";
+  multiply_Callback_2_(mthis, __arg_0, __arg_1) => multiply_Callback_2(mthis, __arg_0, __arg_1);
+
+  static multiply_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGMatrix_multiply_Callback";
+  multiply_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => multiply_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static rotateFromVector_Callback_0(mthis) native "SVGMatrix_rotateFromVector_Callback";
+  rotateFromVector_Callback_0_(mthis) => rotateFromVector_Callback_0(mthis);
+
+  static rotateFromVector_Callback_1(mthis, __arg_0) native "SVGMatrix_rotateFromVector_Callback";
+  rotateFromVector_Callback_1_(mthis, __arg_0) => rotateFromVector_Callback_1(mthis, __arg_0);
+
+  static rotateFromVector_Callback_2(mthis, __arg_0, __arg_1) native "SVGMatrix_rotateFromVector_Callback";
+  rotateFromVector_Callback_2_(mthis, __arg_0, __arg_1) => rotateFromVector_Callback_2(mthis, __arg_0, __arg_1);
+
+  static rotateFromVector_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGMatrix_rotateFromVector_Callback";
+  rotateFromVector_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => rotateFromVector_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static rotateFromVector_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "SVGMatrix_rotateFromVector_Callback";
+  rotateFromVector_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => rotateFromVector_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static rotate_Callback_0(mthis) native "SVGMatrix_rotate_Callback";
+  rotate_Callback_0_(mthis) => rotate_Callback_0(mthis);
+
+  static rotate_Callback_1(mthis, __arg_0) native "SVGMatrix_rotate_Callback";
+  rotate_Callback_1_(mthis, __arg_0) => rotate_Callback_1(mthis, __arg_0);
+
+  static rotate_Callback_2(mthis, __arg_0, __arg_1) native "SVGMatrix_rotate_Callback";
+  rotate_Callback_2_(mthis, __arg_0, __arg_1) => rotate_Callback_2(mthis, __arg_0, __arg_1);
+
+  static rotate_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGMatrix_rotate_Callback";
+  rotate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => rotate_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static scaleNonUniform_Callback_0(mthis) native "SVGMatrix_scaleNonUniform_Callback";
+  scaleNonUniform_Callback_0_(mthis) => scaleNonUniform_Callback_0(mthis);
+
+  static scaleNonUniform_Callback_1(mthis, __arg_0) native "SVGMatrix_scaleNonUniform_Callback";
+  scaleNonUniform_Callback_1_(mthis, __arg_0) => scaleNonUniform_Callback_1(mthis, __arg_0);
+
+  static scaleNonUniform_Callback_2(mthis, __arg_0, __arg_1) native "SVGMatrix_scaleNonUniform_Callback";
+  scaleNonUniform_Callback_2_(mthis, __arg_0, __arg_1) => scaleNonUniform_Callback_2(mthis, __arg_0, __arg_1);
+
+  static scaleNonUniform_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGMatrix_scaleNonUniform_Callback";
+  scaleNonUniform_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => scaleNonUniform_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static scaleNonUniform_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "SVGMatrix_scaleNonUniform_Callback";
+  scaleNonUniform_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => scaleNonUniform_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static scale_Callback_0(mthis) native "SVGMatrix_scale_Callback";
+  scale_Callback_0_(mthis) => scale_Callback_0(mthis);
+
+  static scale_Callback_1(mthis, __arg_0) native "SVGMatrix_scale_Callback";
+  scale_Callback_1_(mthis, __arg_0) => scale_Callback_1(mthis, __arg_0);
+
+  static scale_Callback_2(mthis, __arg_0, __arg_1) native "SVGMatrix_scale_Callback";
+  scale_Callback_2_(mthis, __arg_0, __arg_1) => scale_Callback_2(mthis, __arg_0, __arg_1);
+
+  static scale_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGMatrix_scale_Callback";
+  scale_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => scale_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static skewX_Callback_0(mthis) native "SVGMatrix_skewX_Callback";
+  skewX_Callback_0_(mthis) => skewX_Callback_0(mthis);
+
+  static skewX_Callback_1(mthis, __arg_0) native "SVGMatrix_skewX_Callback";
+  skewX_Callback_1_(mthis, __arg_0) => skewX_Callback_1(mthis, __arg_0);
+
+  static skewX_Callback_2(mthis, __arg_0, __arg_1) native "SVGMatrix_skewX_Callback";
+  skewX_Callback_2_(mthis, __arg_0, __arg_1) => skewX_Callback_2(mthis, __arg_0, __arg_1);
+
+  static skewX_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGMatrix_skewX_Callback";
+  skewX_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => skewX_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static skewY_Callback_0(mthis) native "SVGMatrix_skewY_Callback";
+  skewY_Callback_0_(mthis) => skewY_Callback_0(mthis);
+
+  static skewY_Callback_1(mthis, __arg_0) native "SVGMatrix_skewY_Callback";
+  skewY_Callback_1_(mthis, __arg_0) => skewY_Callback_1(mthis, __arg_0);
+
+  static skewY_Callback_2(mthis, __arg_0, __arg_1) native "SVGMatrix_skewY_Callback";
+  skewY_Callback_2_(mthis, __arg_0, __arg_1) => skewY_Callback_2(mthis, __arg_0, __arg_1);
+
+  static skewY_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGMatrix_skewY_Callback";
+  skewY_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => skewY_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static translate_Callback_0(mthis) native "SVGMatrix_translate_Callback";
+  translate_Callback_0_(mthis) => translate_Callback_0(mthis);
+
+  static translate_Callback_1(mthis, __arg_0) native "SVGMatrix_translate_Callback";
+  translate_Callback_1_(mthis, __arg_0) => translate_Callback_1(mthis, __arg_0);
+
+  static translate_Callback_2(mthis, __arg_0, __arg_1) native "SVGMatrix_translate_Callback";
+  translate_Callback_2_(mthis, __arg_0, __arg_1) => translate_Callback_2(mthis, __arg_0, __arg_1);
+
+  static translate_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGMatrix_translate_Callback";
+  translate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => translate_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static translate_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "SVGMatrix_translate_Callback";
+  translate_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => translate_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
 }
 
-class BlinkSVGMetadataElement {}
+class BlinkSVGMetadataElement extends BlinkSVGElement {
+  static final instance = new BlinkSVGMetadataElement();
 
-class BlinkSVGMissingGlyphElement {}
+}
+
+class BlinkSVGMissingGlyphElement extends BlinkSVGElement {
+  static final instance = new BlinkSVGMissingGlyphElement();
+
+}
 
 class BlinkSVGNumber {
-  static value_Getter(mthis) native "SVGNumber_value_Getter";
+  static final instance = new BlinkSVGNumber();
 
-  static value_Setter(mthis, value) native "SVGNumber_value_Setter";
+  static value_Getter(mthis) native "SVGNumber_value_Getter";
+  value_Getter_(mthis) => value_Getter(mthis);
+
+  static value_Setter(mthis, __arg_0) native "SVGNumber_value_Setter";
+  value_Setter_(mthis, __arg_0) => value_Setter(mthis, __arg_0);
+
 }
 
 class BlinkSVGNumberList {
+  static final instance = new BlinkSVGNumberList();
+
+  static $__getter___Callback_1(mthis, __arg_0) native "SVGNumberList___getter___Callback";
+  $__getter___Callback_1_(mthis, __arg_0) => $__getter___Callback_1(mthis, __arg_0);
+
+  static $__setter___Callback_2(mthis, __arg_0, __arg_1) native "SVGNumberList___setter___Callback";
+  $__setter___Callback_2_(mthis, __arg_0, __arg_1) => $__setter___Callback_2(mthis, __arg_0, __arg_1);
+
+  static appendItem_Callback_0(mthis) native "SVGNumberList_appendItem_Callback";
+  appendItem_Callback_0_(mthis) => appendItem_Callback_0(mthis);
+
+  static appendItem_Callback_1(mthis, __arg_0) native "SVGNumberList_appendItem_Callback";
+  appendItem_Callback_1_(mthis, __arg_0) => appendItem_Callback_1(mthis, __arg_0);
+
+  static appendItem_Callback_2(mthis, __arg_0, __arg_1) native "SVGNumberList_appendItem_Callback";
+  appendItem_Callback_2_(mthis, __arg_0, __arg_1) => appendItem_Callback_2(mthis, __arg_0, __arg_1);
+
+  static appendItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGNumberList_appendItem_Callback";
+  appendItem_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => appendItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static clear_Callback_0(mthis) native "SVGNumberList_clear_Callback";
+  clear_Callback_0_(mthis) => clear_Callback_0(mthis);
+
+  static clear_Callback_1(mthis, __arg_0) native "SVGNumberList_clear_Callback";
+  clear_Callback_1_(mthis, __arg_0) => clear_Callback_1(mthis, __arg_0);
+
+  static clear_Callback_2(mthis, __arg_0, __arg_1) native "SVGNumberList_clear_Callback";
+  clear_Callback_2_(mthis, __arg_0, __arg_1) => clear_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getItem_Callback_0(mthis) native "SVGNumberList_getItem_Callback";
+  getItem_Callback_0_(mthis) => getItem_Callback_0(mthis);
+
+  static getItem_Callback_1(mthis, __arg_0) native "SVGNumberList_getItem_Callback";
+  getItem_Callback_1_(mthis, __arg_0) => getItem_Callback_1(mthis, __arg_0);
+
+  static getItem_Callback_2(mthis, __arg_0, __arg_1) native "SVGNumberList_getItem_Callback";
+  getItem_Callback_2_(mthis, __arg_0, __arg_1) => getItem_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGNumberList_getItem_Callback";
+  getItem_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static initialize_Callback_0(mthis) native "SVGNumberList_initialize_Callback";
+  initialize_Callback_0_(mthis) => initialize_Callback_0(mthis);
+
+  static initialize_Callback_1(mthis, __arg_0) native "SVGNumberList_initialize_Callback";
+  initialize_Callback_1_(mthis, __arg_0) => initialize_Callback_1(mthis, __arg_0);
+
+  static initialize_Callback_2(mthis, __arg_0, __arg_1) native "SVGNumberList_initialize_Callback";
+  initialize_Callback_2_(mthis, __arg_0, __arg_1) => initialize_Callback_2(mthis, __arg_0, __arg_1);
+
+  static initialize_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGNumberList_initialize_Callback";
+  initialize_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => initialize_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static insertItemBefore_Callback_0(mthis) native "SVGNumberList_insertItemBefore_Callback";
+  insertItemBefore_Callback_0_(mthis) => insertItemBefore_Callback_0(mthis);
+
+  static insertItemBefore_Callback_1(mthis, __arg_0) native "SVGNumberList_insertItemBefore_Callback";
+  insertItemBefore_Callback_1_(mthis, __arg_0) => insertItemBefore_Callback_1(mthis, __arg_0);
+
+  static insertItemBefore_Callback_2(mthis, __arg_0, __arg_1) native "SVGNumberList_insertItemBefore_Callback";
+  insertItemBefore_Callback_2_(mthis, __arg_0, __arg_1) => insertItemBefore_Callback_2(mthis, __arg_0, __arg_1);
+
+  static insertItemBefore_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGNumberList_insertItemBefore_Callback";
+  insertItemBefore_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => insertItemBefore_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static insertItemBefore_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "SVGNumberList_insertItemBefore_Callback";
+  insertItemBefore_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => insertItemBefore_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
   static length_Getter(mthis) native "SVGNumberList_length_Getter";
+  length_Getter_(mthis) => length_Getter(mthis);
 
   static numberOfItems_Getter(mthis) native "SVGNumberList_numberOfItems_Getter";
+  numberOfItems_Getter_(mthis) => numberOfItems_Getter(mthis);
 
-  static $__setter___Callback_2(mthis, index, value) native "SVGNumberList___setter___Callback";
+  static removeItem_Callback_0(mthis) native "SVGNumberList_removeItem_Callback";
+  removeItem_Callback_0_(mthis) => removeItem_Callback_0(mthis);
 
-  static appendItem_Callback_1(mthis, item) native "SVGNumberList_appendItem_Callback";
+  static removeItem_Callback_1(mthis, __arg_0) native "SVGNumberList_removeItem_Callback";
+  removeItem_Callback_1_(mthis, __arg_0) => removeItem_Callback_1(mthis, __arg_0);
 
-  static clear_Callback(mthis) native "SVGNumberList_clear_Callback";
+  static removeItem_Callback_2(mthis, __arg_0, __arg_1) native "SVGNumberList_removeItem_Callback";
+  removeItem_Callback_2_(mthis, __arg_0, __arg_1) => removeItem_Callback_2(mthis, __arg_0, __arg_1);
 
-  static getItem_Callback_1(mthis, index) native "SVGNumberList_getItem_Callback";
+  static removeItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGNumberList_removeItem_Callback";
+  removeItem_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => removeItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
-  static initialize_Callback_1(mthis, item) native "SVGNumberList_initialize_Callback";
+  static replaceItem_Callback_0(mthis) native "SVGNumberList_replaceItem_Callback";
+  replaceItem_Callback_0_(mthis) => replaceItem_Callback_0(mthis);
 
-  static insertItemBefore_Callback_2(mthis, item, index) native "SVGNumberList_insertItemBefore_Callback";
+  static replaceItem_Callback_1(mthis, __arg_0) native "SVGNumberList_replaceItem_Callback";
+  replaceItem_Callback_1_(mthis, __arg_0) => replaceItem_Callback_1(mthis, __arg_0);
 
-  static removeItem_Callback_1(mthis, index) native "SVGNumberList_removeItem_Callback";
+  static replaceItem_Callback_2(mthis, __arg_0, __arg_1) native "SVGNumberList_replaceItem_Callback";
+  replaceItem_Callback_2_(mthis, __arg_0, __arg_1) => replaceItem_Callback_2(mthis, __arg_0, __arg_1);
 
-  static replaceItem_Callback_2(mthis, item, index) native "SVGNumberList_replaceItem_Callback";
+  static replaceItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGNumberList_replaceItem_Callback";
+  replaceItem_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => replaceItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static replaceItem_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "SVGNumberList_replaceItem_Callback";
+  replaceItem_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => replaceItem_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
 }
 
-class BlinkSVGPathElement {
+class BlinkSVGPathElement extends BlinkSVGGeometryElement {
+  static final instance = new BlinkSVGPathElement();
+
   static animatedNormalizedPathSegList_Getter(mthis) native "SVGPathElement_animatedNormalizedPathSegList_Getter";
+  animatedNormalizedPathSegList_Getter_(mthis) => animatedNormalizedPathSegList_Getter(mthis);
 
   static animatedPathSegList_Getter(mthis) native "SVGPathElement_animatedPathSegList_Getter";
+  animatedPathSegList_Getter_(mthis) => animatedPathSegList_Getter(mthis);
+
+  static createSVGPathSegArcAbs_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "SVGPathElement_createSVGPathSegArcAbs_Callback";
+  createSVGPathSegArcAbs_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => createSVGPathSegArcAbs_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static createSVGPathSegArcAbs_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "SVGPathElement_createSVGPathSegArcAbs_Callback";
+  createSVGPathSegArcAbs_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => createSVGPathSegArcAbs_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static createSVGPathSegArcAbs_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) native "SVGPathElement_createSVGPathSegArcAbs_Callback";
+  createSVGPathSegArcAbs_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => createSVGPathSegArcAbs_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6);
+
+  static createSVGPathSegArcAbs_Callback_8(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) native "SVGPathElement_createSVGPathSegArcAbs_Callback";
+  createSVGPathSegArcAbs_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => createSVGPathSegArcAbs_Callback_8(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7);
+
+  static createSVGPathSegArcAbs_Callback_9(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) native "SVGPathElement_createSVGPathSegArcAbs_Callback";
+  createSVGPathSegArcAbs_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => createSVGPathSegArcAbs_Callback_9(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8);
+
+  static createSVGPathSegArcRel_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "SVGPathElement_createSVGPathSegArcRel_Callback";
+  createSVGPathSegArcRel_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => createSVGPathSegArcRel_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static createSVGPathSegArcRel_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "SVGPathElement_createSVGPathSegArcRel_Callback";
+  createSVGPathSegArcRel_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => createSVGPathSegArcRel_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static createSVGPathSegArcRel_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) native "SVGPathElement_createSVGPathSegArcRel_Callback";
+  createSVGPathSegArcRel_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => createSVGPathSegArcRel_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6);
+
+  static createSVGPathSegArcRel_Callback_8(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) native "SVGPathElement_createSVGPathSegArcRel_Callback";
+  createSVGPathSegArcRel_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => createSVGPathSegArcRel_Callback_8(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7);
+
+  static createSVGPathSegArcRel_Callback_9(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) native "SVGPathElement_createSVGPathSegArcRel_Callback";
+  createSVGPathSegArcRel_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => createSVGPathSegArcRel_Callback_9(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8);
+
+  static createSVGPathSegClosePath_Callback_0(mthis) native "SVGPathElement_createSVGPathSegClosePath_Callback";
+  createSVGPathSegClosePath_Callback_0_(mthis) => createSVGPathSegClosePath_Callback_0(mthis);
+
+  static createSVGPathSegClosePath_Callback_1(mthis, __arg_0) native "SVGPathElement_createSVGPathSegClosePath_Callback";
+  createSVGPathSegClosePath_Callback_1_(mthis, __arg_0) => createSVGPathSegClosePath_Callback_1(mthis, __arg_0);
+
+  static createSVGPathSegClosePath_Callback_2(mthis, __arg_0, __arg_1) native "SVGPathElement_createSVGPathSegClosePath_Callback";
+  createSVGPathSegClosePath_Callback_2_(mthis, __arg_0, __arg_1) => createSVGPathSegClosePath_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createSVGPathSegCurvetoCubicAbs_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "SVGPathElement_createSVGPathSegCurvetoCubicAbs_Callback";
+  createSVGPathSegCurvetoCubicAbs_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => createSVGPathSegCurvetoCubicAbs_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static createSVGPathSegCurvetoCubicAbs_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "SVGPathElement_createSVGPathSegCurvetoCubicAbs_Callback";
+  createSVGPathSegCurvetoCubicAbs_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => createSVGPathSegCurvetoCubicAbs_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static createSVGPathSegCurvetoCubicAbs_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "SVGPathElement_createSVGPathSegCurvetoCubicAbs_Callback";
+  createSVGPathSegCurvetoCubicAbs_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => createSVGPathSegCurvetoCubicAbs_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static createSVGPathSegCurvetoCubicAbs_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) native "SVGPathElement_createSVGPathSegCurvetoCubicAbs_Callback";
+  createSVGPathSegCurvetoCubicAbs_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => createSVGPathSegCurvetoCubicAbs_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6);
+
+  static createSVGPathSegCurvetoCubicAbs_Callback_8(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) native "SVGPathElement_createSVGPathSegCurvetoCubicAbs_Callback";
+  createSVGPathSegCurvetoCubicAbs_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => createSVGPathSegCurvetoCubicAbs_Callback_8(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7);
+
+  static createSVGPathSegCurvetoCubicRel_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "SVGPathElement_createSVGPathSegCurvetoCubicRel_Callback";
+  createSVGPathSegCurvetoCubicRel_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => createSVGPathSegCurvetoCubicRel_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static createSVGPathSegCurvetoCubicRel_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "SVGPathElement_createSVGPathSegCurvetoCubicRel_Callback";
+  createSVGPathSegCurvetoCubicRel_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => createSVGPathSegCurvetoCubicRel_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static createSVGPathSegCurvetoCubicRel_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "SVGPathElement_createSVGPathSegCurvetoCubicRel_Callback";
+  createSVGPathSegCurvetoCubicRel_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => createSVGPathSegCurvetoCubicRel_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static createSVGPathSegCurvetoCubicRel_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) native "SVGPathElement_createSVGPathSegCurvetoCubicRel_Callback";
+  createSVGPathSegCurvetoCubicRel_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => createSVGPathSegCurvetoCubicRel_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6);
+
+  static createSVGPathSegCurvetoCubicRel_Callback_8(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) native "SVGPathElement_createSVGPathSegCurvetoCubicRel_Callback";
+  createSVGPathSegCurvetoCubicRel_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => createSVGPathSegCurvetoCubicRel_Callback_8(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7);
+
+  static createSVGPathSegCurvetoCubicSmoothAbs_Callback_2(mthis, __arg_0, __arg_1) native "SVGPathElement_createSVGPathSegCurvetoCubicSmoothAbs_Callback";
+  createSVGPathSegCurvetoCubicSmoothAbs_Callback_2_(mthis, __arg_0, __arg_1) => createSVGPathSegCurvetoCubicSmoothAbs_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createSVGPathSegCurvetoCubicSmoothAbs_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGPathElement_createSVGPathSegCurvetoCubicSmoothAbs_Callback";
+  createSVGPathSegCurvetoCubicSmoothAbs_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => createSVGPathSegCurvetoCubicSmoothAbs_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static createSVGPathSegCurvetoCubicSmoothAbs_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "SVGPathElement_createSVGPathSegCurvetoCubicSmoothAbs_Callback";
+  createSVGPathSegCurvetoCubicSmoothAbs_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => createSVGPathSegCurvetoCubicSmoothAbs_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static createSVGPathSegCurvetoCubicSmoothAbs_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "SVGPathElement_createSVGPathSegCurvetoCubicSmoothAbs_Callback";
+  createSVGPathSegCurvetoCubicSmoothAbs_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => createSVGPathSegCurvetoCubicSmoothAbs_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static createSVGPathSegCurvetoCubicSmoothAbs_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "SVGPathElement_createSVGPathSegCurvetoCubicSmoothAbs_Callback";
+  createSVGPathSegCurvetoCubicSmoothAbs_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => createSVGPathSegCurvetoCubicSmoothAbs_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static createSVGPathSegCurvetoCubicSmoothRel_Callback_2(mthis, __arg_0, __arg_1) native "SVGPathElement_createSVGPathSegCurvetoCubicSmoothRel_Callback";
+  createSVGPathSegCurvetoCubicSmoothRel_Callback_2_(mthis, __arg_0, __arg_1) => createSVGPathSegCurvetoCubicSmoothRel_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createSVGPathSegCurvetoCubicSmoothRel_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGPathElement_createSVGPathSegCurvetoCubicSmoothRel_Callback";
+  createSVGPathSegCurvetoCubicSmoothRel_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => createSVGPathSegCurvetoCubicSmoothRel_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static createSVGPathSegCurvetoCubicSmoothRel_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "SVGPathElement_createSVGPathSegCurvetoCubicSmoothRel_Callback";
+  createSVGPathSegCurvetoCubicSmoothRel_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => createSVGPathSegCurvetoCubicSmoothRel_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static createSVGPathSegCurvetoCubicSmoothRel_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "SVGPathElement_createSVGPathSegCurvetoCubicSmoothRel_Callback";
+  createSVGPathSegCurvetoCubicSmoothRel_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => createSVGPathSegCurvetoCubicSmoothRel_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static createSVGPathSegCurvetoCubicSmoothRel_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "SVGPathElement_createSVGPathSegCurvetoCubicSmoothRel_Callback";
+  createSVGPathSegCurvetoCubicSmoothRel_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => createSVGPathSegCurvetoCubicSmoothRel_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static createSVGPathSegCurvetoQuadraticAbs_Callback_2(mthis, __arg_0, __arg_1) native "SVGPathElement_createSVGPathSegCurvetoQuadraticAbs_Callback";
+  createSVGPathSegCurvetoQuadraticAbs_Callback_2_(mthis, __arg_0, __arg_1) => createSVGPathSegCurvetoQuadraticAbs_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createSVGPathSegCurvetoQuadraticAbs_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGPathElement_createSVGPathSegCurvetoQuadraticAbs_Callback";
+  createSVGPathSegCurvetoQuadraticAbs_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => createSVGPathSegCurvetoQuadraticAbs_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static createSVGPathSegCurvetoQuadraticAbs_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "SVGPathElement_createSVGPathSegCurvetoQuadraticAbs_Callback";
+  createSVGPathSegCurvetoQuadraticAbs_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => createSVGPathSegCurvetoQuadraticAbs_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static createSVGPathSegCurvetoQuadraticAbs_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "SVGPathElement_createSVGPathSegCurvetoQuadraticAbs_Callback";
+  createSVGPathSegCurvetoQuadraticAbs_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => createSVGPathSegCurvetoQuadraticAbs_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static createSVGPathSegCurvetoQuadraticAbs_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "SVGPathElement_createSVGPathSegCurvetoQuadraticAbs_Callback";
+  createSVGPathSegCurvetoQuadraticAbs_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => createSVGPathSegCurvetoQuadraticAbs_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static createSVGPathSegCurvetoQuadraticRel_Callback_2(mthis, __arg_0, __arg_1) native "SVGPathElement_createSVGPathSegCurvetoQuadraticRel_Callback";
+  createSVGPathSegCurvetoQuadraticRel_Callback_2_(mthis, __arg_0, __arg_1) => createSVGPathSegCurvetoQuadraticRel_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createSVGPathSegCurvetoQuadraticRel_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGPathElement_createSVGPathSegCurvetoQuadraticRel_Callback";
+  createSVGPathSegCurvetoQuadraticRel_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => createSVGPathSegCurvetoQuadraticRel_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static createSVGPathSegCurvetoQuadraticRel_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "SVGPathElement_createSVGPathSegCurvetoQuadraticRel_Callback";
+  createSVGPathSegCurvetoQuadraticRel_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => createSVGPathSegCurvetoQuadraticRel_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static createSVGPathSegCurvetoQuadraticRel_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "SVGPathElement_createSVGPathSegCurvetoQuadraticRel_Callback";
+  createSVGPathSegCurvetoQuadraticRel_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => createSVGPathSegCurvetoQuadraticRel_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static createSVGPathSegCurvetoQuadraticRel_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "SVGPathElement_createSVGPathSegCurvetoQuadraticRel_Callback";
+  createSVGPathSegCurvetoQuadraticRel_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => createSVGPathSegCurvetoQuadraticRel_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static createSVGPathSegCurvetoQuadraticSmoothAbs_Callback_0(mthis) native "SVGPathElement_createSVGPathSegCurvetoQuadraticSmoothAbs_Callback";
+  createSVGPathSegCurvetoQuadraticSmoothAbs_Callback_0_(mthis) => createSVGPathSegCurvetoQuadraticSmoothAbs_Callback_0(mthis);
+
+  static createSVGPathSegCurvetoQuadraticSmoothAbs_Callback_1(mthis, __arg_0) native "SVGPathElement_createSVGPathSegCurvetoQuadraticSmoothAbs_Callback";
+  createSVGPathSegCurvetoQuadraticSmoothAbs_Callback_1_(mthis, __arg_0) => createSVGPathSegCurvetoQuadraticSmoothAbs_Callback_1(mthis, __arg_0);
+
+  static createSVGPathSegCurvetoQuadraticSmoothAbs_Callback_2(mthis, __arg_0, __arg_1) native "SVGPathElement_createSVGPathSegCurvetoQuadraticSmoothAbs_Callback";
+  createSVGPathSegCurvetoQuadraticSmoothAbs_Callback_2_(mthis, __arg_0, __arg_1) => createSVGPathSegCurvetoQuadraticSmoothAbs_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createSVGPathSegCurvetoQuadraticSmoothAbs_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGPathElement_createSVGPathSegCurvetoQuadraticSmoothAbs_Callback";
+  createSVGPathSegCurvetoQuadraticSmoothAbs_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => createSVGPathSegCurvetoQuadraticSmoothAbs_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static createSVGPathSegCurvetoQuadraticSmoothAbs_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "SVGPathElement_createSVGPathSegCurvetoQuadraticSmoothAbs_Callback";
+  createSVGPathSegCurvetoQuadraticSmoothAbs_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => createSVGPathSegCurvetoQuadraticSmoothAbs_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static createSVGPathSegCurvetoQuadraticSmoothRel_Callback_0(mthis) native "SVGPathElement_createSVGPathSegCurvetoQuadraticSmoothRel_Callback";
+  createSVGPathSegCurvetoQuadraticSmoothRel_Callback_0_(mthis) => createSVGPathSegCurvetoQuadraticSmoothRel_Callback_0(mthis);
+
+  static createSVGPathSegCurvetoQuadraticSmoothRel_Callback_1(mthis, __arg_0) native "SVGPathElement_createSVGPathSegCurvetoQuadraticSmoothRel_Callback";
+  createSVGPathSegCurvetoQuadraticSmoothRel_Callback_1_(mthis, __arg_0) => createSVGPathSegCurvetoQuadraticSmoothRel_Callback_1(mthis, __arg_0);
+
+  static createSVGPathSegCurvetoQuadraticSmoothRel_Callback_2(mthis, __arg_0, __arg_1) native "SVGPathElement_createSVGPathSegCurvetoQuadraticSmoothRel_Callback";
+  createSVGPathSegCurvetoQuadraticSmoothRel_Callback_2_(mthis, __arg_0, __arg_1) => createSVGPathSegCurvetoQuadraticSmoothRel_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createSVGPathSegCurvetoQuadraticSmoothRel_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGPathElement_createSVGPathSegCurvetoQuadraticSmoothRel_Callback";
+  createSVGPathSegCurvetoQuadraticSmoothRel_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => createSVGPathSegCurvetoQuadraticSmoothRel_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static createSVGPathSegCurvetoQuadraticSmoothRel_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "SVGPathElement_createSVGPathSegCurvetoQuadraticSmoothRel_Callback";
+  createSVGPathSegCurvetoQuadraticSmoothRel_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => createSVGPathSegCurvetoQuadraticSmoothRel_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static createSVGPathSegLinetoAbs_Callback_0(mthis) native "SVGPathElement_createSVGPathSegLinetoAbs_Callback";
+  createSVGPathSegLinetoAbs_Callback_0_(mthis) => createSVGPathSegLinetoAbs_Callback_0(mthis);
+
+  static createSVGPathSegLinetoAbs_Callback_1(mthis, __arg_0) native "SVGPathElement_createSVGPathSegLinetoAbs_Callback";
+  createSVGPathSegLinetoAbs_Callback_1_(mthis, __arg_0) => createSVGPathSegLinetoAbs_Callback_1(mthis, __arg_0);
+
+  static createSVGPathSegLinetoAbs_Callback_2(mthis, __arg_0, __arg_1) native "SVGPathElement_createSVGPathSegLinetoAbs_Callback";
+  createSVGPathSegLinetoAbs_Callback_2_(mthis, __arg_0, __arg_1) => createSVGPathSegLinetoAbs_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createSVGPathSegLinetoAbs_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGPathElement_createSVGPathSegLinetoAbs_Callback";
+  createSVGPathSegLinetoAbs_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => createSVGPathSegLinetoAbs_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static createSVGPathSegLinetoAbs_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "SVGPathElement_createSVGPathSegLinetoAbs_Callback";
+  createSVGPathSegLinetoAbs_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => createSVGPathSegLinetoAbs_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static createSVGPathSegLinetoHorizontalAbs_Callback_0(mthis) native "SVGPathElement_createSVGPathSegLinetoHorizontalAbs_Callback";
+  createSVGPathSegLinetoHorizontalAbs_Callback_0_(mthis) => createSVGPathSegLinetoHorizontalAbs_Callback_0(mthis);
+
+  static createSVGPathSegLinetoHorizontalAbs_Callback_1(mthis, __arg_0) native "SVGPathElement_createSVGPathSegLinetoHorizontalAbs_Callback";
+  createSVGPathSegLinetoHorizontalAbs_Callback_1_(mthis, __arg_0) => createSVGPathSegLinetoHorizontalAbs_Callback_1(mthis, __arg_0);
+
+  static createSVGPathSegLinetoHorizontalAbs_Callback_2(mthis, __arg_0, __arg_1) native "SVGPathElement_createSVGPathSegLinetoHorizontalAbs_Callback";
+  createSVGPathSegLinetoHorizontalAbs_Callback_2_(mthis, __arg_0, __arg_1) => createSVGPathSegLinetoHorizontalAbs_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createSVGPathSegLinetoHorizontalAbs_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGPathElement_createSVGPathSegLinetoHorizontalAbs_Callback";
+  createSVGPathSegLinetoHorizontalAbs_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => createSVGPathSegLinetoHorizontalAbs_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static createSVGPathSegLinetoHorizontalRel_Callback_0(mthis) native "SVGPathElement_createSVGPathSegLinetoHorizontalRel_Callback";
+  createSVGPathSegLinetoHorizontalRel_Callback_0_(mthis) => createSVGPathSegLinetoHorizontalRel_Callback_0(mthis);
+
+  static createSVGPathSegLinetoHorizontalRel_Callback_1(mthis, __arg_0) native "SVGPathElement_createSVGPathSegLinetoHorizontalRel_Callback";
+  createSVGPathSegLinetoHorizontalRel_Callback_1_(mthis, __arg_0) => createSVGPathSegLinetoHorizontalRel_Callback_1(mthis, __arg_0);
+
+  static createSVGPathSegLinetoHorizontalRel_Callback_2(mthis, __arg_0, __arg_1) native "SVGPathElement_createSVGPathSegLinetoHorizontalRel_Callback";
+  createSVGPathSegLinetoHorizontalRel_Callback_2_(mthis, __arg_0, __arg_1) => createSVGPathSegLinetoHorizontalRel_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createSVGPathSegLinetoHorizontalRel_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGPathElement_createSVGPathSegLinetoHorizontalRel_Callback";
+  createSVGPathSegLinetoHorizontalRel_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => createSVGPathSegLinetoHorizontalRel_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static createSVGPathSegLinetoRel_Callback_0(mthis) native "SVGPathElement_createSVGPathSegLinetoRel_Callback";
+  createSVGPathSegLinetoRel_Callback_0_(mthis) => createSVGPathSegLinetoRel_Callback_0(mthis);
+
+  static createSVGPathSegLinetoRel_Callback_1(mthis, __arg_0) native "SVGPathElement_createSVGPathSegLinetoRel_Callback";
+  createSVGPathSegLinetoRel_Callback_1_(mthis, __arg_0) => createSVGPathSegLinetoRel_Callback_1(mthis, __arg_0);
+
+  static createSVGPathSegLinetoRel_Callback_2(mthis, __arg_0, __arg_1) native "SVGPathElement_createSVGPathSegLinetoRel_Callback";
+  createSVGPathSegLinetoRel_Callback_2_(mthis, __arg_0, __arg_1) => createSVGPathSegLinetoRel_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createSVGPathSegLinetoRel_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGPathElement_createSVGPathSegLinetoRel_Callback";
+  createSVGPathSegLinetoRel_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => createSVGPathSegLinetoRel_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static createSVGPathSegLinetoRel_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "SVGPathElement_createSVGPathSegLinetoRel_Callback";
+  createSVGPathSegLinetoRel_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => createSVGPathSegLinetoRel_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static createSVGPathSegLinetoVerticalAbs_Callback_0(mthis) native "SVGPathElement_createSVGPathSegLinetoVerticalAbs_Callback";
+  createSVGPathSegLinetoVerticalAbs_Callback_0_(mthis) => createSVGPathSegLinetoVerticalAbs_Callback_0(mthis);
+
+  static createSVGPathSegLinetoVerticalAbs_Callback_1(mthis, __arg_0) native "SVGPathElement_createSVGPathSegLinetoVerticalAbs_Callback";
+  createSVGPathSegLinetoVerticalAbs_Callback_1_(mthis, __arg_0) => createSVGPathSegLinetoVerticalAbs_Callback_1(mthis, __arg_0);
+
+  static createSVGPathSegLinetoVerticalAbs_Callback_2(mthis, __arg_0, __arg_1) native "SVGPathElement_createSVGPathSegLinetoVerticalAbs_Callback";
+  createSVGPathSegLinetoVerticalAbs_Callback_2_(mthis, __arg_0, __arg_1) => createSVGPathSegLinetoVerticalAbs_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createSVGPathSegLinetoVerticalAbs_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGPathElement_createSVGPathSegLinetoVerticalAbs_Callback";
+  createSVGPathSegLinetoVerticalAbs_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => createSVGPathSegLinetoVerticalAbs_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static createSVGPathSegLinetoVerticalRel_Callback_0(mthis) native "SVGPathElement_createSVGPathSegLinetoVerticalRel_Callback";
+  createSVGPathSegLinetoVerticalRel_Callback_0_(mthis) => createSVGPathSegLinetoVerticalRel_Callback_0(mthis);
+
+  static createSVGPathSegLinetoVerticalRel_Callback_1(mthis, __arg_0) native "SVGPathElement_createSVGPathSegLinetoVerticalRel_Callback";
+  createSVGPathSegLinetoVerticalRel_Callback_1_(mthis, __arg_0) => createSVGPathSegLinetoVerticalRel_Callback_1(mthis, __arg_0);
+
+  static createSVGPathSegLinetoVerticalRel_Callback_2(mthis, __arg_0, __arg_1) native "SVGPathElement_createSVGPathSegLinetoVerticalRel_Callback";
+  createSVGPathSegLinetoVerticalRel_Callback_2_(mthis, __arg_0, __arg_1) => createSVGPathSegLinetoVerticalRel_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createSVGPathSegLinetoVerticalRel_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGPathElement_createSVGPathSegLinetoVerticalRel_Callback";
+  createSVGPathSegLinetoVerticalRel_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => createSVGPathSegLinetoVerticalRel_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static createSVGPathSegMovetoAbs_Callback_0(mthis) native "SVGPathElement_createSVGPathSegMovetoAbs_Callback";
+  createSVGPathSegMovetoAbs_Callback_0_(mthis) => createSVGPathSegMovetoAbs_Callback_0(mthis);
+
+  static createSVGPathSegMovetoAbs_Callback_1(mthis, __arg_0) native "SVGPathElement_createSVGPathSegMovetoAbs_Callback";
+  createSVGPathSegMovetoAbs_Callback_1_(mthis, __arg_0) => createSVGPathSegMovetoAbs_Callback_1(mthis, __arg_0);
+
+  static createSVGPathSegMovetoAbs_Callback_2(mthis, __arg_0, __arg_1) native "SVGPathElement_createSVGPathSegMovetoAbs_Callback";
+  createSVGPathSegMovetoAbs_Callback_2_(mthis, __arg_0, __arg_1) => createSVGPathSegMovetoAbs_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createSVGPathSegMovetoAbs_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGPathElement_createSVGPathSegMovetoAbs_Callback";
+  createSVGPathSegMovetoAbs_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => createSVGPathSegMovetoAbs_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static createSVGPathSegMovetoAbs_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "SVGPathElement_createSVGPathSegMovetoAbs_Callback";
+  createSVGPathSegMovetoAbs_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => createSVGPathSegMovetoAbs_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static createSVGPathSegMovetoRel_Callback_0(mthis) native "SVGPathElement_createSVGPathSegMovetoRel_Callback";
+  createSVGPathSegMovetoRel_Callback_0_(mthis) => createSVGPathSegMovetoRel_Callback_0(mthis);
+
+  static createSVGPathSegMovetoRel_Callback_1(mthis, __arg_0) native "SVGPathElement_createSVGPathSegMovetoRel_Callback";
+  createSVGPathSegMovetoRel_Callback_1_(mthis, __arg_0) => createSVGPathSegMovetoRel_Callback_1(mthis, __arg_0);
+
+  static createSVGPathSegMovetoRel_Callback_2(mthis, __arg_0, __arg_1) native "SVGPathElement_createSVGPathSegMovetoRel_Callback";
+  createSVGPathSegMovetoRel_Callback_2_(mthis, __arg_0, __arg_1) => createSVGPathSegMovetoRel_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createSVGPathSegMovetoRel_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGPathElement_createSVGPathSegMovetoRel_Callback";
+  createSVGPathSegMovetoRel_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => createSVGPathSegMovetoRel_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static createSVGPathSegMovetoRel_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "SVGPathElement_createSVGPathSegMovetoRel_Callback";
+  createSVGPathSegMovetoRel_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => createSVGPathSegMovetoRel_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static getPathSegAtLength_Callback_0(mthis) native "SVGPathElement_getPathSegAtLength_Callback";
+  getPathSegAtLength_Callback_0_(mthis) => getPathSegAtLength_Callback_0(mthis);
+
+  static getPathSegAtLength_Callback_1(mthis, __arg_0) native "SVGPathElement_getPathSegAtLength_Callback";
+  getPathSegAtLength_Callback_1_(mthis, __arg_0) => getPathSegAtLength_Callback_1(mthis, __arg_0);
+
+  static getPathSegAtLength_Callback_2(mthis, __arg_0, __arg_1) native "SVGPathElement_getPathSegAtLength_Callback";
+  getPathSegAtLength_Callback_2_(mthis, __arg_0, __arg_1) => getPathSegAtLength_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getPathSegAtLength_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGPathElement_getPathSegAtLength_Callback";
+  getPathSegAtLength_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getPathSegAtLength_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static getPointAtLength_Callback_0(mthis) native "SVGPathElement_getPointAtLength_Callback";
+  getPointAtLength_Callback_0_(mthis) => getPointAtLength_Callback_0(mthis);
+
+  static getPointAtLength_Callback_1(mthis, __arg_0) native "SVGPathElement_getPointAtLength_Callback";
+  getPointAtLength_Callback_1_(mthis, __arg_0) => getPointAtLength_Callback_1(mthis, __arg_0);
+
+  static getPointAtLength_Callback_2(mthis, __arg_0, __arg_1) native "SVGPathElement_getPointAtLength_Callback";
+  getPointAtLength_Callback_2_(mthis, __arg_0, __arg_1) => getPointAtLength_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getPointAtLength_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGPathElement_getPointAtLength_Callback";
+  getPointAtLength_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getPointAtLength_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static getTotalLength_Callback_0(mthis) native "SVGPathElement_getTotalLength_Callback";
+  getTotalLength_Callback_0_(mthis) => getTotalLength_Callback_0(mthis);
+
+  static getTotalLength_Callback_1(mthis, __arg_0) native "SVGPathElement_getTotalLength_Callback";
+  getTotalLength_Callback_1_(mthis, __arg_0) => getTotalLength_Callback_1(mthis, __arg_0);
+
+  static getTotalLength_Callback_2(mthis, __arg_0, __arg_1) native "SVGPathElement_getTotalLength_Callback";
+  getTotalLength_Callback_2_(mthis, __arg_0, __arg_1) => getTotalLength_Callback_2(mthis, __arg_0, __arg_1);
 
   static normalizedPathSegList_Getter(mthis) native "SVGPathElement_normalizedPathSegList_Getter";
+  normalizedPathSegList_Getter_(mthis) => normalizedPathSegList_Getter(mthis);
 
   static pathLength_Getter(mthis) native "SVGPathElement_pathLength_Getter";
+  pathLength_Getter_(mthis) => pathLength_Getter(mthis);
 
   static pathSegList_Getter(mthis) native "SVGPathElement_pathSegList_Getter";
+  pathSegList_Getter_(mthis) => pathSegList_Getter(mthis);
 
-  static createSVGPathSegArcAbs_Callback_7(mthis, x, y, r1, r2, angle, largeArcFlag, sweepFlag) native "SVGPathElement_createSVGPathSegArcAbs_Callback";
-
-  static createSVGPathSegArcRel_Callback_7(mthis, x, y, r1, r2, angle, largeArcFlag, sweepFlag) native "SVGPathElement_createSVGPathSegArcRel_Callback";
-
-  static createSVGPathSegClosePath_Callback(mthis) native "SVGPathElement_createSVGPathSegClosePath_Callback";
-
-  static createSVGPathSegCurvetoCubicAbs_Callback_6(mthis, x, y, x1, y1, x2, y2) native "SVGPathElement_createSVGPathSegCurvetoCubicAbs_Callback";
-
-  static createSVGPathSegCurvetoCubicRel_Callback_6(mthis, x, y, x1, y1, x2, y2) native "SVGPathElement_createSVGPathSegCurvetoCubicRel_Callback";
-
-  static createSVGPathSegCurvetoCubicSmoothAbs_Callback_4(mthis, x, y, x2, y2) native "SVGPathElement_createSVGPathSegCurvetoCubicSmoothAbs_Callback";
-
-  static createSVGPathSegCurvetoCubicSmoothRel_Callback_4(mthis, x, y, x2, y2) native "SVGPathElement_createSVGPathSegCurvetoCubicSmoothRel_Callback";
-
-  static createSVGPathSegCurvetoQuadraticAbs_Callback_4(mthis, x, y, x1, y1) native "SVGPathElement_createSVGPathSegCurvetoQuadraticAbs_Callback";
-
-  static createSVGPathSegCurvetoQuadraticRel_Callback_4(mthis, x, y, x1, y1) native "SVGPathElement_createSVGPathSegCurvetoQuadraticRel_Callback";
-
-  static createSVGPathSegCurvetoQuadraticSmoothAbs_Callback_2(mthis, x, y) native "SVGPathElement_createSVGPathSegCurvetoQuadraticSmoothAbs_Callback";
-
-  static createSVGPathSegCurvetoQuadraticSmoothRel_Callback_2(mthis, x, y) native "SVGPathElement_createSVGPathSegCurvetoQuadraticSmoothRel_Callback";
-
-  static createSVGPathSegLinetoAbs_Callback_2(mthis, x, y) native "SVGPathElement_createSVGPathSegLinetoAbs_Callback";
-
-  static createSVGPathSegLinetoHorizontalAbs_Callback_1(mthis, x) native "SVGPathElement_createSVGPathSegLinetoHorizontalAbs_Callback";
-
-  static createSVGPathSegLinetoHorizontalRel_Callback_1(mthis, x) native "SVGPathElement_createSVGPathSegLinetoHorizontalRel_Callback";
-
-  static createSVGPathSegLinetoRel_Callback_2(mthis, x, y) native "SVGPathElement_createSVGPathSegLinetoRel_Callback";
-
-  static createSVGPathSegLinetoVerticalAbs_Callback_1(mthis, y) native "SVGPathElement_createSVGPathSegLinetoVerticalAbs_Callback";
-
-  static createSVGPathSegLinetoVerticalRel_Callback_1(mthis, y) native "SVGPathElement_createSVGPathSegLinetoVerticalRel_Callback";
-
-  static createSVGPathSegMovetoAbs_Callback_2(mthis, x, y) native "SVGPathElement_createSVGPathSegMovetoAbs_Callback";
-
-  static createSVGPathSegMovetoRel_Callback_2(mthis, x, y) native "SVGPathElement_createSVGPathSegMovetoRel_Callback";
-
-  static getPathSegAtLength_Callback_1(mthis, distance) native "SVGPathElement_getPathSegAtLength_Callback";
-
-  static getPointAtLength_Callback_1(mthis, distance) native "SVGPathElement_getPointAtLength_Callback";
-
-  static getTotalLength_Callback(mthis) native "SVGPathElement_getTotalLength_Callback";
 }
 
 class BlinkSVGPathSeg {
-  static pathSegType_Getter(mthis) native "SVGPathSeg_pathSegType_Getter";
+  static final instance = new BlinkSVGPathSeg();
 
   static pathSegTypeAsLetter_Getter(mthis) native "SVGPathSeg_pathSegTypeAsLetter_Getter";
+  pathSegTypeAsLetter_Getter_(mthis) => pathSegTypeAsLetter_Getter(mthis);
+
+  static pathSegType_Getter(mthis) native "SVGPathSeg_pathSegType_Getter";
+  pathSegType_Getter_(mthis) => pathSegType_Getter(mthis);
+
 }
 
-class BlinkSVGPathSegArcAbs {
-  static angle_Getter(mthis) native "SVGPathSegArcAbs_angle_Getter";
+class BlinkSVGPathSegArcAbs extends BlinkSVGPathSeg {
+  static final instance = new BlinkSVGPathSegArcAbs();
 
-  static angle_Setter(mthis, value) native "SVGPathSegArcAbs_angle_Setter";
+  static angle_Getter(mthis) native "SVGPathSegArcAbs_angle_Getter";
+  angle_Getter_(mthis) => angle_Getter(mthis);
+
+  static angle_Setter(mthis, __arg_0) native "SVGPathSegArcAbs_angle_Setter";
+  angle_Setter_(mthis, __arg_0) => angle_Setter(mthis, __arg_0);
 
   static largeArcFlag_Getter(mthis) native "SVGPathSegArcAbs_largeArcFlag_Getter";
+  largeArcFlag_Getter_(mthis) => largeArcFlag_Getter(mthis);
 
-  static largeArcFlag_Setter(mthis, value) native "SVGPathSegArcAbs_largeArcFlag_Setter";
+  static largeArcFlag_Setter(mthis, __arg_0) native "SVGPathSegArcAbs_largeArcFlag_Setter";
+  largeArcFlag_Setter_(mthis, __arg_0) => largeArcFlag_Setter(mthis, __arg_0);
 
   static r1_Getter(mthis) native "SVGPathSegArcAbs_r1_Getter";
+  r1_Getter_(mthis) => r1_Getter(mthis);
 
-  static r1_Setter(mthis, value) native "SVGPathSegArcAbs_r1_Setter";
+  static r1_Setter(mthis, __arg_0) native "SVGPathSegArcAbs_r1_Setter";
+  r1_Setter_(mthis, __arg_0) => r1_Setter(mthis, __arg_0);
 
   static r2_Getter(mthis) native "SVGPathSegArcAbs_r2_Getter";
+  r2_Getter_(mthis) => r2_Getter(mthis);
 
-  static r2_Setter(mthis, value) native "SVGPathSegArcAbs_r2_Setter";
+  static r2_Setter(mthis, __arg_0) native "SVGPathSegArcAbs_r2_Setter";
+  r2_Setter_(mthis, __arg_0) => r2_Setter(mthis, __arg_0);
 
   static sweepFlag_Getter(mthis) native "SVGPathSegArcAbs_sweepFlag_Getter";
+  sweepFlag_Getter_(mthis) => sweepFlag_Getter(mthis);
 
-  static sweepFlag_Setter(mthis, value) native "SVGPathSegArcAbs_sweepFlag_Setter";
+  static sweepFlag_Setter(mthis, __arg_0) native "SVGPathSegArcAbs_sweepFlag_Setter";
+  sweepFlag_Setter_(mthis, __arg_0) => sweepFlag_Setter(mthis, __arg_0);
 
   static x_Getter(mthis) native "SVGPathSegArcAbs_x_Getter";
+  x_Getter_(mthis) => x_Getter(mthis);
 
-  static x_Setter(mthis, value) native "SVGPathSegArcAbs_x_Setter";
+  static x_Setter(mthis, __arg_0) native "SVGPathSegArcAbs_x_Setter";
+  x_Setter_(mthis, __arg_0) => x_Setter(mthis, __arg_0);
 
   static y_Getter(mthis) native "SVGPathSegArcAbs_y_Getter";
+  y_Getter_(mthis) => y_Getter(mthis);
 
-  static y_Setter(mthis, value) native "SVGPathSegArcAbs_y_Setter";
+  static y_Setter(mthis, __arg_0) native "SVGPathSegArcAbs_y_Setter";
+  y_Setter_(mthis, __arg_0) => y_Setter(mthis, __arg_0);
+
 }
 
-class BlinkSVGPathSegArcRel {
-  static angle_Getter(mthis) native "SVGPathSegArcRel_angle_Getter";
+class BlinkSVGPathSegArcRel extends BlinkSVGPathSeg {
+  static final instance = new BlinkSVGPathSegArcRel();
 
-  static angle_Setter(mthis, value) native "SVGPathSegArcRel_angle_Setter";
+  static angle_Getter(mthis) native "SVGPathSegArcRel_angle_Getter";
+  angle_Getter_(mthis) => angle_Getter(mthis);
+
+  static angle_Setter(mthis, __arg_0) native "SVGPathSegArcRel_angle_Setter";
+  angle_Setter_(mthis, __arg_0) => angle_Setter(mthis, __arg_0);
 
   static largeArcFlag_Getter(mthis) native "SVGPathSegArcRel_largeArcFlag_Getter";
+  largeArcFlag_Getter_(mthis) => largeArcFlag_Getter(mthis);
 
-  static largeArcFlag_Setter(mthis, value) native "SVGPathSegArcRel_largeArcFlag_Setter";
+  static largeArcFlag_Setter(mthis, __arg_0) native "SVGPathSegArcRel_largeArcFlag_Setter";
+  largeArcFlag_Setter_(mthis, __arg_0) => largeArcFlag_Setter(mthis, __arg_0);
 
   static r1_Getter(mthis) native "SVGPathSegArcRel_r1_Getter";
+  r1_Getter_(mthis) => r1_Getter(mthis);
 
-  static r1_Setter(mthis, value) native "SVGPathSegArcRel_r1_Setter";
+  static r1_Setter(mthis, __arg_0) native "SVGPathSegArcRel_r1_Setter";
+  r1_Setter_(mthis, __arg_0) => r1_Setter(mthis, __arg_0);
 
   static r2_Getter(mthis) native "SVGPathSegArcRel_r2_Getter";
+  r2_Getter_(mthis) => r2_Getter(mthis);
 
-  static r2_Setter(mthis, value) native "SVGPathSegArcRel_r2_Setter";
+  static r2_Setter(mthis, __arg_0) native "SVGPathSegArcRel_r2_Setter";
+  r2_Setter_(mthis, __arg_0) => r2_Setter(mthis, __arg_0);
 
   static sweepFlag_Getter(mthis) native "SVGPathSegArcRel_sweepFlag_Getter";
+  sweepFlag_Getter_(mthis) => sweepFlag_Getter(mthis);
 
-  static sweepFlag_Setter(mthis, value) native "SVGPathSegArcRel_sweepFlag_Setter";
+  static sweepFlag_Setter(mthis, __arg_0) native "SVGPathSegArcRel_sweepFlag_Setter";
+  sweepFlag_Setter_(mthis, __arg_0) => sweepFlag_Setter(mthis, __arg_0);
 
   static x_Getter(mthis) native "SVGPathSegArcRel_x_Getter";
+  x_Getter_(mthis) => x_Getter(mthis);
 
-  static x_Setter(mthis, value) native "SVGPathSegArcRel_x_Setter";
+  static x_Setter(mthis, __arg_0) native "SVGPathSegArcRel_x_Setter";
+  x_Setter_(mthis, __arg_0) => x_Setter(mthis, __arg_0);
 
   static y_Getter(mthis) native "SVGPathSegArcRel_y_Getter";
+  y_Getter_(mthis) => y_Getter(mthis);
 
-  static y_Setter(mthis, value) native "SVGPathSegArcRel_y_Setter";
+  static y_Setter(mthis, __arg_0) native "SVGPathSegArcRel_y_Setter";
+  y_Setter_(mthis, __arg_0) => y_Setter(mthis, __arg_0);
+
 }
 
-class BlinkSVGPathSegClosePath {}
+class BlinkSVGPathSegClosePath extends BlinkSVGPathSeg {
+  static final instance = new BlinkSVGPathSegClosePath();
 
-class BlinkSVGPathSegCurvetoCubicAbs {
-  static x_Getter(mthis) native "SVGPathSegCurvetoCubicAbs_x_Getter";
+}
 
-  static x_Setter(mthis, value) native "SVGPathSegCurvetoCubicAbs_x_Setter";
+class BlinkSVGPathSegCurvetoCubicAbs extends BlinkSVGPathSeg {
+  static final instance = new BlinkSVGPathSegCurvetoCubicAbs();
 
   static x1_Getter(mthis) native "SVGPathSegCurvetoCubicAbs_x1_Getter";
+  x1_Getter_(mthis) => x1_Getter(mthis);
 
-  static x1_Setter(mthis, value) native "SVGPathSegCurvetoCubicAbs_x1_Setter";
+  static x1_Setter(mthis, __arg_0) native "SVGPathSegCurvetoCubicAbs_x1_Setter";
+  x1_Setter_(mthis, __arg_0) => x1_Setter(mthis, __arg_0);
 
   static x2_Getter(mthis) native "SVGPathSegCurvetoCubicAbs_x2_Getter";
+  x2_Getter_(mthis) => x2_Getter(mthis);
 
-  static x2_Setter(mthis, value) native "SVGPathSegCurvetoCubicAbs_x2_Setter";
+  static x2_Setter(mthis, __arg_0) native "SVGPathSegCurvetoCubicAbs_x2_Setter";
+  x2_Setter_(mthis, __arg_0) => x2_Setter(mthis, __arg_0);
 
-  static y_Getter(mthis) native "SVGPathSegCurvetoCubicAbs_y_Getter";
+  static x_Getter(mthis) native "SVGPathSegCurvetoCubicAbs_x_Getter";
+  x_Getter_(mthis) => x_Getter(mthis);
 
-  static y_Setter(mthis, value) native "SVGPathSegCurvetoCubicAbs_y_Setter";
+  static x_Setter(mthis, __arg_0) native "SVGPathSegCurvetoCubicAbs_x_Setter";
+  x_Setter_(mthis, __arg_0) => x_Setter(mthis, __arg_0);
 
   static y1_Getter(mthis) native "SVGPathSegCurvetoCubicAbs_y1_Getter";
+  y1_Getter_(mthis) => y1_Getter(mthis);
 
-  static y1_Setter(mthis, value) native "SVGPathSegCurvetoCubicAbs_y1_Setter";
+  static y1_Setter(mthis, __arg_0) native "SVGPathSegCurvetoCubicAbs_y1_Setter";
+  y1_Setter_(mthis, __arg_0) => y1_Setter(mthis, __arg_0);
 
   static y2_Getter(mthis) native "SVGPathSegCurvetoCubicAbs_y2_Getter";
+  y2_Getter_(mthis) => y2_Getter(mthis);
 
-  static y2_Setter(mthis, value) native "SVGPathSegCurvetoCubicAbs_y2_Setter";
+  static y2_Setter(mthis, __arg_0) native "SVGPathSegCurvetoCubicAbs_y2_Setter";
+  y2_Setter_(mthis, __arg_0) => y2_Setter(mthis, __arg_0);
+
+  static y_Getter(mthis) native "SVGPathSegCurvetoCubicAbs_y_Getter";
+  y_Getter_(mthis) => y_Getter(mthis);
+
+  static y_Setter(mthis, __arg_0) native "SVGPathSegCurvetoCubicAbs_y_Setter";
+  y_Setter_(mthis, __arg_0) => y_Setter(mthis, __arg_0);
+
 }
 
-class BlinkSVGPathSegCurvetoCubicRel {
-  static x_Getter(mthis) native "SVGPathSegCurvetoCubicRel_x_Getter";
-
-  static x_Setter(mthis, value) native "SVGPathSegCurvetoCubicRel_x_Setter";
+class BlinkSVGPathSegCurvetoCubicRel extends BlinkSVGPathSeg {
+  static final instance = new BlinkSVGPathSegCurvetoCubicRel();
 
   static x1_Getter(mthis) native "SVGPathSegCurvetoCubicRel_x1_Getter";
+  x1_Getter_(mthis) => x1_Getter(mthis);
 
-  static x1_Setter(mthis, value) native "SVGPathSegCurvetoCubicRel_x1_Setter";
+  static x1_Setter(mthis, __arg_0) native "SVGPathSegCurvetoCubicRel_x1_Setter";
+  x1_Setter_(mthis, __arg_0) => x1_Setter(mthis, __arg_0);
 
   static x2_Getter(mthis) native "SVGPathSegCurvetoCubicRel_x2_Getter";
+  x2_Getter_(mthis) => x2_Getter(mthis);
 
-  static x2_Setter(mthis, value) native "SVGPathSegCurvetoCubicRel_x2_Setter";
+  static x2_Setter(mthis, __arg_0) native "SVGPathSegCurvetoCubicRel_x2_Setter";
+  x2_Setter_(mthis, __arg_0) => x2_Setter(mthis, __arg_0);
 
-  static y_Getter(mthis) native "SVGPathSegCurvetoCubicRel_y_Getter";
+  static x_Getter(mthis) native "SVGPathSegCurvetoCubicRel_x_Getter";
+  x_Getter_(mthis) => x_Getter(mthis);
 
-  static y_Setter(mthis, value) native "SVGPathSegCurvetoCubicRel_y_Setter";
+  static x_Setter(mthis, __arg_0) native "SVGPathSegCurvetoCubicRel_x_Setter";
+  x_Setter_(mthis, __arg_0) => x_Setter(mthis, __arg_0);
 
   static y1_Getter(mthis) native "SVGPathSegCurvetoCubicRel_y1_Getter";
+  y1_Getter_(mthis) => y1_Getter(mthis);
 
-  static y1_Setter(mthis, value) native "SVGPathSegCurvetoCubicRel_y1_Setter";
+  static y1_Setter(mthis, __arg_0) native "SVGPathSegCurvetoCubicRel_y1_Setter";
+  y1_Setter_(mthis, __arg_0) => y1_Setter(mthis, __arg_0);
 
   static y2_Getter(mthis) native "SVGPathSegCurvetoCubicRel_y2_Getter";
+  y2_Getter_(mthis) => y2_Getter(mthis);
 
-  static y2_Setter(mthis, value) native "SVGPathSegCurvetoCubicRel_y2_Setter";
+  static y2_Setter(mthis, __arg_0) native "SVGPathSegCurvetoCubicRel_y2_Setter";
+  y2_Setter_(mthis, __arg_0) => y2_Setter(mthis, __arg_0);
+
+  static y_Getter(mthis) native "SVGPathSegCurvetoCubicRel_y_Getter";
+  y_Getter_(mthis) => y_Getter(mthis);
+
+  static y_Setter(mthis, __arg_0) native "SVGPathSegCurvetoCubicRel_y_Setter";
+  y_Setter_(mthis, __arg_0) => y_Setter(mthis, __arg_0);
+
 }
 
-class BlinkSVGPathSegCurvetoCubicSmoothAbs {
-  static x_Getter(mthis) native "SVGPathSegCurvetoCubicSmoothAbs_x_Getter";
-
-  static x_Setter(mthis, value) native "SVGPathSegCurvetoCubicSmoothAbs_x_Setter";
+class BlinkSVGPathSegCurvetoCubicSmoothAbs extends BlinkSVGPathSeg {
+  static final instance = new BlinkSVGPathSegCurvetoCubicSmoothAbs();
 
   static x2_Getter(mthis) native "SVGPathSegCurvetoCubicSmoothAbs_x2_Getter";
+  x2_Getter_(mthis) => x2_Getter(mthis);
 
-  static x2_Setter(mthis, value) native "SVGPathSegCurvetoCubicSmoothAbs_x2_Setter";
+  static x2_Setter(mthis, __arg_0) native "SVGPathSegCurvetoCubicSmoothAbs_x2_Setter";
+  x2_Setter_(mthis, __arg_0) => x2_Setter(mthis, __arg_0);
 
-  static y_Getter(mthis) native "SVGPathSegCurvetoCubicSmoothAbs_y_Getter";
+  static x_Getter(mthis) native "SVGPathSegCurvetoCubicSmoothAbs_x_Getter";
+  x_Getter_(mthis) => x_Getter(mthis);
 
-  static y_Setter(mthis, value) native "SVGPathSegCurvetoCubicSmoothAbs_y_Setter";
+  static x_Setter(mthis, __arg_0) native "SVGPathSegCurvetoCubicSmoothAbs_x_Setter";
+  x_Setter_(mthis, __arg_0) => x_Setter(mthis, __arg_0);
 
   static y2_Getter(mthis) native "SVGPathSegCurvetoCubicSmoothAbs_y2_Getter";
+  y2_Getter_(mthis) => y2_Getter(mthis);
 
-  static y2_Setter(mthis, value) native "SVGPathSegCurvetoCubicSmoothAbs_y2_Setter";
+  static y2_Setter(mthis, __arg_0) native "SVGPathSegCurvetoCubicSmoothAbs_y2_Setter";
+  y2_Setter_(mthis, __arg_0) => y2_Setter(mthis, __arg_0);
+
+  static y_Getter(mthis) native "SVGPathSegCurvetoCubicSmoothAbs_y_Getter";
+  y_Getter_(mthis) => y_Getter(mthis);
+
+  static y_Setter(mthis, __arg_0) native "SVGPathSegCurvetoCubicSmoothAbs_y_Setter";
+  y_Setter_(mthis, __arg_0) => y_Setter(mthis, __arg_0);
+
 }
 
-class BlinkSVGPathSegCurvetoCubicSmoothRel {
-  static x_Getter(mthis) native "SVGPathSegCurvetoCubicSmoothRel_x_Getter";
-
-  static x_Setter(mthis, value) native "SVGPathSegCurvetoCubicSmoothRel_x_Setter";
+class BlinkSVGPathSegCurvetoCubicSmoothRel extends BlinkSVGPathSeg {
+  static final instance = new BlinkSVGPathSegCurvetoCubicSmoothRel();
 
   static x2_Getter(mthis) native "SVGPathSegCurvetoCubicSmoothRel_x2_Getter";
+  x2_Getter_(mthis) => x2_Getter(mthis);
 
-  static x2_Setter(mthis, value) native "SVGPathSegCurvetoCubicSmoothRel_x2_Setter";
+  static x2_Setter(mthis, __arg_0) native "SVGPathSegCurvetoCubicSmoothRel_x2_Setter";
+  x2_Setter_(mthis, __arg_0) => x2_Setter(mthis, __arg_0);
 
-  static y_Getter(mthis) native "SVGPathSegCurvetoCubicSmoothRel_y_Getter";
+  static x_Getter(mthis) native "SVGPathSegCurvetoCubicSmoothRel_x_Getter";
+  x_Getter_(mthis) => x_Getter(mthis);
 
-  static y_Setter(mthis, value) native "SVGPathSegCurvetoCubicSmoothRel_y_Setter";
+  static x_Setter(mthis, __arg_0) native "SVGPathSegCurvetoCubicSmoothRel_x_Setter";
+  x_Setter_(mthis, __arg_0) => x_Setter(mthis, __arg_0);
 
   static y2_Getter(mthis) native "SVGPathSegCurvetoCubicSmoothRel_y2_Getter";
+  y2_Getter_(mthis) => y2_Getter(mthis);
 
-  static y2_Setter(mthis, value) native "SVGPathSegCurvetoCubicSmoothRel_y2_Setter";
+  static y2_Setter(mthis, __arg_0) native "SVGPathSegCurvetoCubicSmoothRel_y2_Setter";
+  y2_Setter_(mthis, __arg_0) => y2_Setter(mthis, __arg_0);
+
+  static y_Getter(mthis) native "SVGPathSegCurvetoCubicSmoothRel_y_Getter";
+  y_Getter_(mthis) => y_Getter(mthis);
+
+  static y_Setter(mthis, __arg_0) native "SVGPathSegCurvetoCubicSmoothRel_y_Setter";
+  y_Setter_(mthis, __arg_0) => y_Setter(mthis, __arg_0);
+
 }
 
-class BlinkSVGPathSegCurvetoQuadraticAbs {
-  static x_Getter(mthis) native "SVGPathSegCurvetoQuadraticAbs_x_Getter";
-
-  static x_Setter(mthis, value) native "SVGPathSegCurvetoQuadraticAbs_x_Setter";
+class BlinkSVGPathSegCurvetoQuadraticAbs extends BlinkSVGPathSeg {
+  static final instance = new BlinkSVGPathSegCurvetoQuadraticAbs();
 
   static x1_Getter(mthis) native "SVGPathSegCurvetoQuadraticAbs_x1_Getter";
+  x1_Getter_(mthis) => x1_Getter(mthis);
 
-  static x1_Setter(mthis, value) native "SVGPathSegCurvetoQuadraticAbs_x1_Setter";
+  static x1_Setter(mthis, __arg_0) native "SVGPathSegCurvetoQuadraticAbs_x1_Setter";
+  x1_Setter_(mthis, __arg_0) => x1_Setter(mthis, __arg_0);
 
-  static y_Getter(mthis) native "SVGPathSegCurvetoQuadraticAbs_y_Getter";
+  static x_Getter(mthis) native "SVGPathSegCurvetoQuadraticAbs_x_Getter";
+  x_Getter_(mthis) => x_Getter(mthis);
 
-  static y_Setter(mthis, value) native "SVGPathSegCurvetoQuadraticAbs_y_Setter";
+  static x_Setter(mthis, __arg_0) native "SVGPathSegCurvetoQuadraticAbs_x_Setter";
+  x_Setter_(mthis, __arg_0) => x_Setter(mthis, __arg_0);
 
   static y1_Getter(mthis) native "SVGPathSegCurvetoQuadraticAbs_y1_Getter";
+  y1_Getter_(mthis) => y1_Getter(mthis);
 
-  static y1_Setter(mthis, value) native "SVGPathSegCurvetoQuadraticAbs_y1_Setter";
+  static y1_Setter(mthis, __arg_0) native "SVGPathSegCurvetoQuadraticAbs_y1_Setter";
+  y1_Setter_(mthis, __arg_0) => y1_Setter(mthis, __arg_0);
+
+  static y_Getter(mthis) native "SVGPathSegCurvetoQuadraticAbs_y_Getter";
+  y_Getter_(mthis) => y_Getter(mthis);
+
+  static y_Setter(mthis, __arg_0) native "SVGPathSegCurvetoQuadraticAbs_y_Setter";
+  y_Setter_(mthis, __arg_0) => y_Setter(mthis, __arg_0);
+
 }
 
-class BlinkSVGPathSegCurvetoQuadraticRel {
-  static x_Getter(mthis) native "SVGPathSegCurvetoQuadraticRel_x_Getter";
-
-  static x_Setter(mthis, value) native "SVGPathSegCurvetoQuadraticRel_x_Setter";
+class BlinkSVGPathSegCurvetoQuadraticRel extends BlinkSVGPathSeg {
+  static final instance = new BlinkSVGPathSegCurvetoQuadraticRel();
 
   static x1_Getter(mthis) native "SVGPathSegCurvetoQuadraticRel_x1_Getter";
+  x1_Getter_(mthis) => x1_Getter(mthis);
 
-  static x1_Setter(mthis, value) native "SVGPathSegCurvetoQuadraticRel_x1_Setter";
+  static x1_Setter(mthis, __arg_0) native "SVGPathSegCurvetoQuadraticRel_x1_Setter";
+  x1_Setter_(mthis, __arg_0) => x1_Setter(mthis, __arg_0);
 
-  static y_Getter(mthis) native "SVGPathSegCurvetoQuadraticRel_y_Getter";
+  static x_Getter(mthis) native "SVGPathSegCurvetoQuadraticRel_x_Getter";
+  x_Getter_(mthis) => x_Getter(mthis);
 
-  static y_Setter(mthis, value) native "SVGPathSegCurvetoQuadraticRel_y_Setter";
+  static x_Setter(mthis, __arg_0) native "SVGPathSegCurvetoQuadraticRel_x_Setter";
+  x_Setter_(mthis, __arg_0) => x_Setter(mthis, __arg_0);
 
   static y1_Getter(mthis) native "SVGPathSegCurvetoQuadraticRel_y1_Getter";
+  y1_Getter_(mthis) => y1_Getter(mthis);
 
-  static y1_Setter(mthis, value) native "SVGPathSegCurvetoQuadraticRel_y1_Setter";
+  static y1_Setter(mthis, __arg_0) native "SVGPathSegCurvetoQuadraticRel_y1_Setter";
+  y1_Setter_(mthis, __arg_0) => y1_Setter(mthis, __arg_0);
+
+  static y_Getter(mthis) native "SVGPathSegCurvetoQuadraticRel_y_Getter";
+  y_Getter_(mthis) => y_Getter(mthis);
+
+  static y_Setter(mthis, __arg_0) native "SVGPathSegCurvetoQuadraticRel_y_Setter";
+  y_Setter_(mthis, __arg_0) => y_Setter(mthis, __arg_0);
+
 }
 
-class BlinkSVGPathSegCurvetoQuadraticSmoothAbs {
-  static x_Getter(mthis) native "SVGPathSegCurvetoQuadraticSmoothAbs_x_Getter";
+class BlinkSVGPathSegCurvetoQuadraticSmoothAbs extends BlinkSVGPathSeg {
+  static final instance = new BlinkSVGPathSegCurvetoQuadraticSmoothAbs();
 
-  static x_Setter(mthis, value) native "SVGPathSegCurvetoQuadraticSmoothAbs_x_Setter";
+  static x_Getter(mthis) native "SVGPathSegCurvetoQuadraticSmoothAbs_x_Getter";
+  x_Getter_(mthis) => x_Getter(mthis);
+
+  static x_Setter(mthis, __arg_0) native "SVGPathSegCurvetoQuadraticSmoothAbs_x_Setter";
+  x_Setter_(mthis, __arg_0) => x_Setter(mthis, __arg_0);
 
   static y_Getter(mthis) native "SVGPathSegCurvetoQuadraticSmoothAbs_y_Getter";
+  y_Getter_(mthis) => y_Getter(mthis);
 
-  static y_Setter(mthis, value) native "SVGPathSegCurvetoQuadraticSmoothAbs_y_Setter";
+  static y_Setter(mthis, __arg_0) native "SVGPathSegCurvetoQuadraticSmoothAbs_y_Setter";
+  y_Setter_(mthis, __arg_0) => y_Setter(mthis, __arg_0);
+
 }
 
-class BlinkSVGPathSegCurvetoQuadraticSmoothRel {
-  static x_Getter(mthis) native "SVGPathSegCurvetoQuadraticSmoothRel_x_Getter";
+class BlinkSVGPathSegCurvetoQuadraticSmoothRel extends BlinkSVGPathSeg {
+  static final instance = new BlinkSVGPathSegCurvetoQuadraticSmoothRel();
 
-  static x_Setter(mthis, value) native "SVGPathSegCurvetoQuadraticSmoothRel_x_Setter";
+  static x_Getter(mthis) native "SVGPathSegCurvetoQuadraticSmoothRel_x_Getter";
+  x_Getter_(mthis) => x_Getter(mthis);
+
+  static x_Setter(mthis, __arg_0) native "SVGPathSegCurvetoQuadraticSmoothRel_x_Setter";
+  x_Setter_(mthis, __arg_0) => x_Setter(mthis, __arg_0);
 
   static y_Getter(mthis) native "SVGPathSegCurvetoQuadraticSmoothRel_y_Getter";
+  y_Getter_(mthis) => y_Getter(mthis);
 
-  static y_Setter(mthis, value) native "SVGPathSegCurvetoQuadraticSmoothRel_y_Setter";
+  static y_Setter(mthis, __arg_0) native "SVGPathSegCurvetoQuadraticSmoothRel_y_Setter";
+  y_Setter_(mthis, __arg_0) => y_Setter(mthis, __arg_0);
+
 }
 
-class BlinkSVGPathSegLinetoAbs {
-  static x_Getter(mthis) native "SVGPathSegLinetoAbs_x_Getter";
+class BlinkSVGPathSegLinetoAbs extends BlinkSVGPathSeg {
+  static final instance = new BlinkSVGPathSegLinetoAbs();
 
-  static x_Setter(mthis, value) native "SVGPathSegLinetoAbs_x_Setter";
+  static x_Getter(mthis) native "SVGPathSegLinetoAbs_x_Getter";
+  x_Getter_(mthis) => x_Getter(mthis);
+
+  static x_Setter(mthis, __arg_0) native "SVGPathSegLinetoAbs_x_Setter";
+  x_Setter_(mthis, __arg_0) => x_Setter(mthis, __arg_0);
 
   static y_Getter(mthis) native "SVGPathSegLinetoAbs_y_Getter";
+  y_Getter_(mthis) => y_Getter(mthis);
 
-  static y_Setter(mthis, value) native "SVGPathSegLinetoAbs_y_Setter";
+  static y_Setter(mthis, __arg_0) native "SVGPathSegLinetoAbs_y_Setter";
+  y_Setter_(mthis, __arg_0) => y_Setter(mthis, __arg_0);
+
 }
 
-class BlinkSVGPathSegLinetoHorizontalAbs {
+class BlinkSVGPathSegLinetoHorizontalAbs extends BlinkSVGPathSeg {
+  static final instance = new BlinkSVGPathSegLinetoHorizontalAbs();
+
   static x_Getter(mthis) native "SVGPathSegLinetoHorizontalAbs_x_Getter";
+  x_Getter_(mthis) => x_Getter(mthis);
 
-  static x_Setter(mthis, value) native "SVGPathSegLinetoHorizontalAbs_x_Setter";
+  static x_Setter(mthis, __arg_0) native "SVGPathSegLinetoHorizontalAbs_x_Setter";
+  x_Setter_(mthis, __arg_0) => x_Setter(mthis, __arg_0);
+
 }
 
-class BlinkSVGPathSegLinetoHorizontalRel {
+class BlinkSVGPathSegLinetoHorizontalRel extends BlinkSVGPathSeg {
+  static final instance = new BlinkSVGPathSegLinetoHorizontalRel();
+
   static x_Getter(mthis) native "SVGPathSegLinetoHorizontalRel_x_Getter";
+  x_Getter_(mthis) => x_Getter(mthis);
 
-  static x_Setter(mthis, value) native "SVGPathSegLinetoHorizontalRel_x_Setter";
+  static x_Setter(mthis, __arg_0) native "SVGPathSegLinetoHorizontalRel_x_Setter";
+  x_Setter_(mthis, __arg_0) => x_Setter(mthis, __arg_0);
+
 }
 
-class BlinkSVGPathSegLinetoRel {
-  static x_Getter(mthis) native "SVGPathSegLinetoRel_x_Getter";
+class BlinkSVGPathSegLinetoRel extends BlinkSVGPathSeg {
+  static final instance = new BlinkSVGPathSegLinetoRel();
 
-  static x_Setter(mthis, value) native "SVGPathSegLinetoRel_x_Setter";
+  static x_Getter(mthis) native "SVGPathSegLinetoRel_x_Getter";
+  x_Getter_(mthis) => x_Getter(mthis);
+
+  static x_Setter(mthis, __arg_0) native "SVGPathSegLinetoRel_x_Setter";
+  x_Setter_(mthis, __arg_0) => x_Setter(mthis, __arg_0);
 
   static y_Getter(mthis) native "SVGPathSegLinetoRel_y_Getter";
+  y_Getter_(mthis) => y_Getter(mthis);
 
-  static y_Setter(mthis, value) native "SVGPathSegLinetoRel_y_Setter";
+  static y_Setter(mthis, __arg_0) native "SVGPathSegLinetoRel_y_Setter";
+  y_Setter_(mthis, __arg_0) => y_Setter(mthis, __arg_0);
+
 }
 
-class BlinkSVGPathSegLinetoVerticalAbs {
+class BlinkSVGPathSegLinetoVerticalAbs extends BlinkSVGPathSeg {
+  static final instance = new BlinkSVGPathSegLinetoVerticalAbs();
+
   static y_Getter(mthis) native "SVGPathSegLinetoVerticalAbs_y_Getter";
+  y_Getter_(mthis) => y_Getter(mthis);
 
-  static y_Setter(mthis, value) native "SVGPathSegLinetoVerticalAbs_y_Setter";
+  static y_Setter(mthis, __arg_0) native "SVGPathSegLinetoVerticalAbs_y_Setter";
+  y_Setter_(mthis, __arg_0) => y_Setter(mthis, __arg_0);
+
 }
 
-class BlinkSVGPathSegLinetoVerticalRel {
-  static y_Getter(mthis) native "SVGPathSegLinetoVerticalRel_y_Getter";
+class BlinkSVGPathSegLinetoVerticalRel extends BlinkSVGPathSeg {
+  static final instance = new BlinkSVGPathSegLinetoVerticalRel();
 
-  static y_Setter(mthis, value) native "SVGPathSegLinetoVerticalRel_y_Setter";
+  static y_Getter(mthis) native "SVGPathSegLinetoVerticalRel_y_Getter";
+  y_Getter_(mthis) => y_Getter(mthis);
+
+  static y_Setter(mthis, __arg_0) native "SVGPathSegLinetoVerticalRel_y_Setter";
+  y_Setter_(mthis, __arg_0) => y_Setter(mthis, __arg_0);
+
 }
 
 class BlinkSVGPathSegList {
+  static final instance = new BlinkSVGPathSegList();
+
+  static $__getter___Callback_1(mthis, __arg_0) native "SVGPathSegList___getter___Callback";
+  $__getter___Callback_1_(mthis, __arg_0) => $__getter___Callback_1(mthis, __arg_0);
+
+  static $__setter___Callback_2(mthis, __arg_0, __arg_1) native "SVGPathSegList___setter___Callback";
+  $__setter___Callback_2_(mthis, __arg_0, __arg_1) => $__setter___Callback_2(mthis, __arg_0, __arg_1);
+
+  static appendItem_Callback_0(mthis) native "SVGPathSegList_appendItem_Callback";
+  appendItem_Callback_0_(mthis) => appendItem_Callback_0(mthis);
+
+  static appendItem_Callback_1(mthis, __arg_0) native "SVGPathSegList_appendItem_Callback";
+  appendItem_Callback_1_(mthis, __arg_0) => appendItem_Callback_1(mthis, __arg_0);
+
+  static appendItem_Callback_2(mthis, __arg_0, __arg_1) native "SVGPathSegList_appendItem_Callback";
+  appendItem_Callback_2_(mthis, __arg_0, __arg_1) => appendItem_Callback_2(mthis, __arg_0, __arg_1);
+
+  static appendItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGPathSegList_appendItem_Callback";
+  appendItem_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => appendItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static clear_Callback_0(mthis) native "SVGPathSegList_clear_Callback";
+  clear_Callback_0_(mthis) => clear_Callback_0(mthis);
+
+  static clear_Callback_1(mthis, __arg_0) native "SVGPathSegList_clear_Callback";
+  clear_Callback_1_(mthis, __arg_0) => clear_Callback_1(mthis, __arg_0);
+
+  static clear_Callback_2(mthis, __arg_0, __arg_1) native "SVGPathSegList_clear_Callback";
+  clear_Callback_2_(mthis, __arg_0, __arg_1) => clear_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getItem_Callback_0(mthis) native "SVGPathSegList_getItem_Callback";
+  getItem_Callback_0_(mthis) => getItem_Callback_0(mthis);
+
+  static getItem_Callback_1(mthis, __arg_0) native "SVGPathSegList_getItem_Callback";
+  getItem_Callback_1_(mthis, __arg_0) => getItem_Callback_1(mthis, __arg_0);
+
+  static getItem_Callback_2(mthis, __arg_0, __arg_1) native "SVGPathSegList_getItem_Callback";
+  getItem_Callback_2_(mthis, __arg_0, __arg_1) => getItem_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGPathSegList_getItem_Callback";
+  getItem_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static initialize_Callback_0(mthis) native "SVGPathSegList_initialize_Callback";
+  initialize_Callback_0_(mthis) => initialize_Callback_0(mthis);
+
+  static initialize_Callback_1(mthis, __arg_0) native "SVGPathSegList_initialize_Callback";
+  initialize_Callback_1_(mthis, __arg_0) => initialize_Callback_1(mthis, __arg_0);
+
+  static initialize_Callback_2(mthis, __arg_0, __arg_1) native "SVGPathSegList_initialize_Callback";
+  initialize_Callback_2_(mthis, __arg_0, __arg_1) => initialize_Callback_2(mthis, __arg_0, __arg_1);
+
+  static initialize_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGPathSegList_initialize_Callback";
+  initialize_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => initialize_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static insertItemBefore_Callback_0(mthis) native "SVGPathSegList_insertItemBefore_Callback";
+  insertItemBefore_Callback_0_(mthis) => insertItemBefore_Callback_0(mthis);
+
+  static insertItemBefore_Callback_1(mthis, __arg_0) native "SVGPathSegList_insertItemBefore_Callback";
+  insertItemBefore_Callback_1_(mthis, __arg_0) => insertItemBefore_Callback_1(mthis, __arg_0);
+
+  static insertItemBefore_Callback_2(mthis, __arg_0, __arg_1) native "SVGPathSegList_insertItemBefore_Callback";
+  insertItemBefore_Callback_2_(mthis, __arg_0, __arg_1) => insertItemBefore_Callback_2(mthis, __arg_0, __arg_1);
+
+  static insertItemBefore_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGPathSegList_insertItemBefore_Callback";
+  insertItemBefore_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => insertItemBefore_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static insertItemBefore_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "SVGPathSegList_insertItemBefore_Callback";
+  insertItemBefore_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => insertItemBefore_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
   static length_Getter(mthis) native "SVGPathSegList_length_Getter";
+  length_Getter_(mthis) => length_Getter(mthis);
 
   static numberOfItems_Getter(mthis) native "SVGPathSegList_numberOfItems_Getter";
+  numberOfItems_Getter_(mthis) => numberOfItems_Getter(mthis);
 
-  static $__setter___Callback_2(mthis, index, value) native "SVGPathSegList___setter___Callback";
+  static removeItem_Callback_0(mthis) native "SVGPathSegList_removeItem_Callback";
+  removeItem_Callback_0_(mthis) => removeItem_Callback_0(mthis);
 
-  static appendItem_Callback_1(mthis, newItem) native "SVGPathSegList_appendItem_Callback";
+  static removeItem_Callback_1(mthis, __arg_0) native "SVGPathSegList_removeItem_Callback";
+  removeItem_Callback_1_(mthis, __arg_0) => removeItem_Callback_1(mthis, __arg_0);
 
-  static clear_Callback(mthis) native "SVGPathSegList_clear_Callback";
+  static removeItem_Callback_2(mthis, __arg_0, __arg_1) native "SVGPathSegList_removeItem_Callback";
+  removeItem_Callback_2_(mthis, __arg_0, __arg_1) => removeItem_Callback_2(mthis, __arg_0, __arg_1);
 
-  static getItem_Callback_1(mthis, index) native "SVGPathSegList_getItem_Callback";
+  static removeItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGPathSegList_removeItem_Callback";
+  removeItem_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => removeItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
-  static initialize_Callback_1(mthis, newItem) native "SVGPathSegList_initialize_Callback";
+  static replaceItem_Callback_0(mthis) native "SVGPathSegList_replaceItem_Callback";
+  replaceItem_Callback_0_(mthis) => replaceItem_Callback_0(mthis);
 
-  static insertItemBefore_Callback_2(mthis, newItem, index) native "SVGPathSegList_insertItemBefore_Callback";
+  static replaceItem_Callback_1(mthis, __arg_0) native "SVGPathSegList_replaceItem_Callback";
+  replaceItem_Callback_1_(mthis, __arg_0) => replaceItem_Callback_1(mthis, __arg_0);
 
-  static removeItem_Callback_1(mthis, index) native "SVGPathSegList_removeItem_Callback";
+  static replaceItem_Callback_2(mthis, __arg_0, __arg_1) native "SVGPathSegList_replaceItem_Callback";
+  replaceItem_Callback_2_(mthis, __arg_0, __arg_1) => replaceItem_Callback_2(mthis, __arg_0, __arg_1);
 
-  static replaceItem_Callback_2(mthis, newItem, index) native "SVGPathSegList_replaceItem_Callback";
+  static replaceItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGPathSegList_replaceItem_Callback";
+  replaceItem_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => replaceItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static replaceItem_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "SVGPathSegList_replaceItem_Callback";
+  replaceItem_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => replaceItem_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
 }
 
-class BlinkSVGPathSegMovetoAbs {
-  static x_Getter(mthis) native "SVGPathSegMovetoAbs_x_Getter";
+class BlinkSVGPathSegMovetoAbs extends BlinkSVGPathSeg {
+  static final instance = new BlinkSVGPathSegMovetoAbs();
 
-  static x_Setter(mthis, value) native "SVGPathSegMovetoAbs_x_Setter";
+  static x_Getter(mthis) native "SVGPathSegMovetoAbs_x_Getter";
+  x_Getter_(mthis) => x_Getter(mthis);
+
+  static x_Setter(mthis, __arg_0) native "SVGPathSegMovetoAbs_x_Setter";
+  x_Setter_(mthis, __arg_0) => x_Setter(mthis, __arg_0);
 
   static y_Getter(mthis) native "SVGPathSegMovetoAbs_y_Getter";
+  y_Getter_(mthis) => y_Getter(mthis);
 
-  static y_Setter(mthis, value) native "SVGPathSegMovetoAbs_y_Setter";
+  static y_Setter(mthis, __arg_0) native "SVGPathSegMovetoAbs_y_Setter";
+  y_Setter_(mthis, __arg_0) => y_Setter(mthis, __arg_0);
+
 }
 
-class BlinkSVGPathSegMovetoRel {
-  static x_Getter(mthis) native "SVGPathSegMovetoRel_x_Getter";
+class BlinkSVGPathSegMovetoRel extends BlinkSVGPathSeg {
+  static final instance = new BlinkSVGPathSegMovetoRel();
 
-  static x_Setter(mthis, value) native "SVGPathSegMovetoRel_x_Setter";
+  static x_Getter(mthis) native "SVGPathSegMovetoRel_x_Getter";
+  x_Getter_(mthis) => x_Getter(mthis);
+
+  static x_Setter(mthis, __arg_0) native "SVGPathSegMovetoRel_x_Setter";
+  x_Setter_(mthis, __arg_0) => x_Setter(mthis, __arg_0);
 
   static y_Getter(mthis) native "SVGPathSegMovetoRel_y_Getter";
+  y_Getter_(mthis) => y_Getter(mthis);
 
-  static y_Setter(mthis, value) native "SVGPathSegMovetoRel_y_Setter";
+  static y_Setter(mthis, __arg_0) native "SVGPathSegMovetoRel_y_Setter";
+  y_Setter_(mthis, __arg_0) => y_Setter(mthis, __arg_0);
+
 }
 
-class BlinkSVGPatternElement {
+class BlinkSVGPatternElement extends BlinkSVGElement {
+  static final instance = new BlinkSVGPatternElement();
+
+  static hasExtension_Callback_0(mthis) native "SVGPatternElement_hasExtension_Callback";
+  hasExtension_Callback_0_(mthis) => hasExtension_Callback_0(mthis);
+
+  static hasExtension_Callback_1(mthis, __arg_0) native "SVGPatternElement_hasExtension_Callback";
+  hasExtension_Callback_1_(mthis, __arg_0) => hasExtension_Callback_1(mthis, __arg_0);
+
+  static hasExtension_Callback_2(mthis, __arg_0, __arg_1) native "SVGPatternElement_hasExtension_Callback";
+  hasExtension_Callback_2_(mthis, __arg_0, __arg_1) => hasExtension_Callback_2(mthis, __arg_0, __arg_1);
+
+  static hasExtension_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGPatternElement_hasExtension_Callback";
+  hasExtension_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => hasExtension_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
   static height_Getter(mthis) native "SVGPatternElement_height_Getter";
-
-  static patternContentUnits_Getter(mthis) native "SVGPatternElement_patternContentUnits_Getter";
-
-  static patternTransform_Getter(mthis) native "SVGPatternElement_patternTransform_Getter";
-
-  static patternUnits_Getter(mthis) native "SVGPatternElement_patternUnits_Getter";
-
-  static width_Getter(mthis) native "SVGPatternElement_width_Getter";
-
-  static x_Getter(mthis) native "SVGPatternElement_x_Getter";
-
-  static y_Getter(mthis) native "SVGPatternElement_y_Getter";
-
-  static preserveAspectRatio_Getter(mthis) native "SVGPatternElement_preserveAspectRatio_Getter";
-
-  static viewBox_Getter(mthis) native "SVGPatternElement_viewBox_Getter";
-
-  static requiredExtensions_Getter(mthis) native "SVGPatternElement_requiredExtensions_Getter";
-
-  static requiredFeatures_Getter(mthis) native "SVGPatternElement_requiredFeatures_Getter";
-
-  static systemLanguage_Getter(mthis) native "SVGPatternElement_systemLanguage_Getter";
-
-  static hasExtension_Callback_1(mthis, extension) native "SVGPatternElement_hasExtension_Callback";
+  height_Getter_(mthis) => height_Getter(mthis);
 
   static href_Getter(mthis) native "SVGPatternElement_href_Getter";
+  href_Getter_(mthis) => href_Getter(mthis);
+
+  static patternContentUnits_Getter(mthis) native "SVGPatternElement_patternContentUnits_Getter";
+  patternContentUnits_Getter_(mthis) => patternContentUnits_Getter(mthis);
+
+  static patternTransform_Getter(mthis) native "SVGPatternElement_patternTransform_Getter";
+  patternTransform_Getter_(mthis) => patternTransform_Getter(mthis);
+
+  static patternUnits_Getter(mthis) native "SVGPatternElement_patternUnits_Getter";
+  patternUnits_Getter_(mthis) => patternUnits_Getter(mthis);
+
+  static preserveAspectRatio_Getter(mthis) native "SVGPatternElement_preserveAspectRatio_Getter";
+  preserveAspectRatio_Getter_(mthis) => preserveAspectRatio_Getter(mthis);
+
+  static requiredExtensions_Getter(mthis) native "SVGPatternElement_requiredExtensions_Getter";
+  requiredExtensions_Getter_(mthis) => requiredExtensions_Getter(mthis);
+
+  static requiredFeatures_Getter(mthis) native "SVGPatternElement_requiredFeatures_Getter";
+  requiredFeatures_Getter_(mthis) => requiredFeatures_Getter(mthis);
+
+  static systemLanguage_Getter(mthis) native "SVGPatternElement_systemLanguage_Getter";
+  systemLanguage_Getter_(mthis) => systemLanguage_Getter(mthis);
+
+  static viewBox_Getter(mthis) native "SVGPatternElement_viewBox_Getter";
+  viewBox_Getter_(mthis) => viewBox_Getter(mthis);
+
+  static width_Getter(mthis) native "SVGPatternElement_width_Getter";
+  width_Getter_(mthis) => width_Getter(mthis);
+
+  static x_Getter(mthis) native "SVGPatternElement_x_Getter";
+  x_Getter_(mthis) => x_Getter(mthis);
+
+  static y_Getter(mthis) native "SVGPatternElement_y_Getter";
+  y_Getter_(mthis) => y_Getter(mthis);
+
 }
 
 class BlinkSVGPoint {
-  static x_Getter(mthis) native "SVGPoint_x_Getter";
+  static final instance = new BlinkSVGPoint();
 
-  static x_Setter(mthis, value) native "SVGPoint_x_Setter";
+  static matrixTransform_Callback_0(mthis) native "SVGPoint_matrixTransform_Callback";
+  matrixTransform_Callback_0_(mthis) => matrixTransform_Callback_0(mthis);
+
+  static matrixTransform_Callback_1(mthis, __arg_0) native "SVGPoint_matrixTransform_Callback";
+  matrixTransform_Callback_1_(mthis, __arg_0) => matrixTransform_Callback_1(mthis, __arg_0);
+
+  static matrixTransform_Callback_2(mthis, __arg_0, __arg_1) native "SVGPoint_matrixTransform_Callback";
+  matrixTransform_Callback_2_(mthis, __arg_0, __arg_1) => matrixTransform_Callback_2(mthis, __arg_0, __arg_1);
+
+  static matrixTransform_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGPoint_matrixTransform_Callback";
+  matrixTransform_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => matrixTransform_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static x_Getter(mthis) native "SVGPoint_x_Getter";
+  x_Getter_(mthis) => x_Getter(mthis);
+
+  static x_Setter(mthis, __arg_0) native "SVGPoint_x_Setter";
+  x_Setter_(mthis, __arg_0) => x_Setter(mthis, __arg_0);
 
   static y_Getter(mthis) native "SVGPoint_y_Getter";
+  y_Getter_(mthis) => y_Getter(mthis);
 
-  static y_Setter(mthis, value) native "SVGPoint_y_Setter";
+  static y_Setter(mthis, __arg_0) native "SVGPoint_y_Setter";
+  y_Setter_(mthis, __arg_0) => y_Setter(mthis, __arg_0);
 
-  static matrixTransform_Callback_1(mthis, matrix) native "SVGPoint_matrixTransform_Callback";
 }
 
 class BlinkSVGPointList {
+  static final instance = new BlinkSVGPointList();
+
+  static $__getter___Callback_1(mthis, __arg_0) native "SVGPointList___getter___Callback";
+  $__getter___Callback_1_(mthis, __arg_0) => $__getter___Callback_1(mthis, __arg_0);
+
+  static $__setter___Callback_2(mthis, __arg_0, __arg_1) native "SVGPointList___setter___Callback";
+  $__setter___Callback_2_(mthis, __arg_0, __arg_1) => $__setter___Callback_2(mthis, __arg_0, __arg_1);
+
+  static appendItem_Callback_0(mthis) native "SVGPointList_appendItem_Callback";
+  appendItem_Callback_0_(mthis) => appendItem_Callback_0(mthis);
+
+  static appendItem_Callback_1(mthis, __arg_0) native "SVGPointList_appendItem_Callback";
+  appendItem_Callback_1_(mthis, __arg_0) => appendItem_Callback_1(mthis, __arg_0);
+
+  static appendItem_Callback_2(mthis, __arg_0, __arg_1) native "SVGPointList_appendItem_Callback";
+  appendItem_Callback_2_(mthis, __arg_0, __arg_1) => appendItem_Callback_2(mthis, __arg_0, __arg_1);
+
+  static appendItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGPointList_appendItem_Callback";
+  appendItem_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => appendItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static clear_Callback_0(mthis) native "SVGPointList_clear_Callback";
+  clear_Callback_0_(mthis) => clear_Callback_0(mthis);
+
+  static clear_Callback_1(mthis, __arg_0) native "SVGPointList_clear_Callback";
+  clear_Callback_1_(mthis, __arg_0) => clear_Callback_1(mthis, __arg_0);
+
+  static clear_Callback_2(mthis, __arg_0, __arg_1) native "SVGPointList_clear_Callback";
+  clear_Callback_2_(mthis, __arg_0, __arg_1) => clear_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getItem_Callback_0(mthis) native "SVGPointList_getItem_Callback";
+  getItem_Callback_0_(mthis) => getItem_Callback_0(mthis);
+
+  static getItem_Callback_1(mthis, __arg_0) native "SVGPointList_getItem_Callback";
+  getItem_Callback_1_(mthis, __arg_0) => getItem_Callback_1(mthis, __arg_0);
+
+  static getItem_Callback_2(mthis, __arg_0, __arg_1) native "SVGPointList_getItem_Callback";
+  getItem_Callback_2_(mthis, __arg_0, __arg_1) => getItem_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGPointList_getItem_Callback";
+  getItem_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static initialize_Callback_0(mthis) native "SVGPointList_initialize_Callback";
+  initialize_Callback_0_(mthis) => initialize_Callback_0(mthis);
+
+  static initialize_Callback_1(mthis, __arg_0) native "SVGPointList_initialize_Callback";
+  initialize_Callback_1_(mthis, __arg_0) => initialize_Callback_1(mthis, __arg_0);
+
+  static initialize_Callback_2(mthis, __arg_0, __arg_1) native "SVGPointList_initialize_Callback";
+  initialize_Callback_2_(mthis, __arg_0, __arg_1) => initialize_Callback_2(mthis, __arg_0, __arg_1);
+
+  static initialize_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGPointList_initialize_Callback";
+  initialize_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => initialize_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static insertItemBefore_Callback_0(mthis) native "SVGPointList_insertItemBefore_Callback";
+  insertItemBefore_Callback_0_(mthis) => insertItemBefore_Callback_0(mthis);
+
+  static insertItemBefore_Callback_1(mthis, __arg_0) native "SVGPointList_insertItemBefore_Callback";
+  insertItemBefore_Callback_1_(mthis, __arg_0) => insertItemBefore_Callback_1(mthis, __arg_0);
+
+  static insertItemBefore_Callback_2(mthis, __arg_0, __arg_1) native "SVGPointList_insertItemBefore_Callback";
+  insertItemBefore_Callback_2_(mthis, __arg_0, __arg_1) => insertItemBefore_Callback_2(mthis, __arg_0, __arg_1);
+
+  static insertItemBefore_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGPointList_insertItemBefore_Callback";
+  insertItemBefore_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => insertItemBefore_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static insertItemBefore_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "SVGPointList_insertItemBefore_Callback";
+  insertItemBefore_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => insertItemBefore_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
   static length_Getter(mthis) native "SVGPointList_length_Getter";
+  length_Getter_(mthis) => length_Getter(mthis);
 
   static numberOfItems_Getter(mthis) native "SVGPointList_numberOfItems_Getter";
+  numberOfItems_Getter_(mthis) => numberOfItems_Getter(mthis);
 
-  static $__setter___Callback_2(mthis, index, value) native "SVGPointList___setter___Callback";
+  static removeItem_Callback_0(mthis) native "SVGPointList_removeItem_Callback";
+  removeItem_Callback_0_(mthis) => removeItem_Callback_0(mthis);
 
-  static appendItem_Callback_1(mthis, item) native "SVGPointList_appendItem_Callback";
+  static removeItem_Callback_1(mthis, __arg_0) native "SVGPointList_removeItem_Callback";
+  removeItem_Callback_1_(mthis, __arg_0) => removeItem_Callback_1(mthis, __arg_0);
 
-  static clear_Callback(mthis) native "SVGPointList_clear_Callback";
+  static removeItem_Callback_2(mthis, __arg_0, __arg_1) native "SVGPointList_removeItem_Callback";
+  removeItem_Callback_2_(mthis, __arg_0, __arg_1) => removeItem_Callback_2(mthis, __arg_0, __arg_1);
 
-  static getItem_Callback_1(mthis, index) native "SVGPointList_getItem_Callback";
+  static removeItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGPointList_removeItem_Callback";
+  removeItem_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => removeItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
-  static initialize_Callback_1(mthis, item) native "SVGPointList_initialize_Callback";
+  static replaceItem_Callback_0(mthis) native "SVGPointList_replaceItem_Callback";
+  replaceItem_Callback_0_(mthis) => replaceItem_Callback_0(mthis);
 
-  static insertItemBefore_Callback_2(mthis, item, index) native "SVGPointList_insertItemBefore_Callback";
+  static replaceItem_Callback_1(mthis, __arg_0) native "SVGPointList_replaceItem_Callback";
+  replaceItem_Callback_1_(mthis, __arg_0) => replaceItem_Callback_1(mthis, __arg_0);
 
-  static removeItem_Callback_1(mthis, index) native "SVGPointList_removeItem_Callback";
+  static replaceItem_Callback_2(mthis, __arg_0, __arg_1) native "SVGPointList_replaceItem_Callback";
+  replaceItem_Callback_2_(mthis, __arg_0, __arg_1) => replaceItem_Callback_2(mthis, __arg_0, __arg_1);
 
-  static replaceItem_Callback_2(mthis, item, index) native "SVGPointList_replaceItem_Callback";
+  static replaceItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGPointList_replaceItem_Callback";
+  replaceItem_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => replaceItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static replaceItem_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "SVGPointList_replaceItem_Callback";
+  replaceItem_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => replaceItem_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
 }
 
-class BlinkSVGPolygonElement {
+class BlinkSVGPolygonElement extends BlinkSVGGeometryElement {
+  static final instance = new BlinkSVGPolygonElement();
+
   static animatedPoints_Getter(mthis) native "SVGPolygonElement_animatedPoints_Getter";
+  animatedPoints_Getter_(mthis) => animatedPoints_Getter(mthis);
 
   static points_Getter(mthis) native "SVGPolygonElement_points_Getter";
+  points_Getter_(mthis) => points_Getter(mthis);
+
 }
 
-class BlinkSVGPolylineElement {
+class BlinkSVGPolylineElement extends BlinkSVGGeometryElement {
+  static final instance = new BlinkSVGPolylineElement();
+
   static animatedPoints_Getter(mthis) native "SVGPolylineElement_animatedPoints_Getter";
+  animatedPoints_Getter_(mthis) => animatedPoints_Getter(mthis);
 
   static points_Getter(mthis) native "SVGPolylineElement_points_Getter";
+  points_Getter_(mthis) => points_Getter(mthis);
+
 }
 
 class BlinkSVGPreserveAspectRatio {
-  static align_Getter(mthis) native "SVGPreserveAspectRatio_align_Getter";
+  static final instance = new BlinkSVGPreserveAspectRatio();
 
-  static align_Setter(mthis, value) native "SVGPreserveAspectRatio_align_Setter";
+  static align_Getter(mthis) native "SVGPreserveAspectRatio_align_Getter";
+  align_Getter_(mthis) => align_Getter(mthis);
+
+  static align_Setter(mthis, __arg_0) native "SVGPreserveAspectRatio_align_Setter";
+  align_Setter_(mthis, __arg_0) => align_Setter(mthis, __arg_0);
 
   static meetOrSlice_Getter(mthis) native "SVGPreserveAspectRatio_meetOrSlice_Getter";
+  meetOrSlice_Getter_(mthis) => meetOrSlice_Getter(mthis);
 
-  static meetOrSlice_Setter(mthis, value) native "SVGPreserveAspectRatio_meetOrSlice_Setter";
+  static meetOrSlice_Setter(mthis, __arg_0) native "SVGPreserveAspectRatio_meetOrSlice_Setter";
+  meetOrSlice_Setter_(mthis, __arg_0) => meetOrSlice_Setter(mthis, __arg_0);
+
 }
 
-class BlinkSVGRadialGradientElement {
+class BlinkSVGRadialGradientElement extends BlinkSVGGradientElement {
+  static final instance = new BlinkSVGRadialGradientElement();
+
   static cx_Getter(mthis) native "SVGRadialGradientElement_cx_Getter";
+  cx_Getter_(mthis) => cx_Getter(mthis);
 
   static cy_Getter(mthis) native "SVGRadialGradientElement_cy_Getter";
+  cy_Getter_(mthis) => cy_Getter(mthis);
 
   static fr_Getter(mthis) native "SVGRadialGradientElement_fr_Getter";
+  fr_Getter_(mthis) => fr_Getter(mthis);
 
   static fx_Getter(mthis) native "SVGRadialGradientElement_fx_Getter";
+  fx_Getter_(mthis) => fx_Getter(mthis);
 
   static fy_Getter(mthis) native "SVGRadialGradientElement_fy_Getter";
+  fy_Getter_(mthis) => fy_Getter(mthis);
 
   static r_Getter(mthis) native "SVGRadialGradientElement_r_Getter";
+  r_Getter_(mthis) => r_Getter(mthis);
+
 }
 
 class BlinkSVGRect {
-  static height_Getter(mthis) native "SVGRect_height_Getter";
+  static final instance = new BlinkSVGRect();
 
-  static height_Setter(mthis, value) native "SVGRect_height_Setter";
+  static height_Getter(mthis) native "SVGRect_height_Getter";
+  height_Getter_(mthis) => height_Getter(mthis);
+
+  static height_Setter(mthis, __arg_0) native "SVGRect_height_Setter";
+  height_Setter_(mthis, __arg_0) => height_Setter(mthis, __arg_0);
 
   static width_Getter(mthis) native "SVGRect_width_Getter";
+  width_Getter_(mthis) => width_Getter(mthis);
 
-  static width_Setter(mthis, value) native "SVGRect_width_Setter";
+  static width_Setter(mthis, __arg_0) native "SVGRect_width_Setter";
+  width_Setter_(mthis, __arg_0) => width_Setter(mthis, __arg_0);
 
   static x_Getter(mthis) native "SVGRect_x_Getter";
+  x_Getter_(mthis) => x_Getter(mthis);
 
-  static x_Setter(mthis, value) native "SVGRect_x_Setter";
+  static x_Setter(mthis, __arg_0) native "SVGRect_x_Setter";
+  x_Setter_(mthis, __arg_0) => x_Setter(mthis, __arg_0);
 
   static y_Getter(mthis) native "SVGRect_y_Getter";
+  y_Getter_(mthis) => y_Getter(mthis);
 
-  static y_Setter(mthis, value) native "SVGRect_y_Setter";
+  static y_Setter(mthis, __arg_0) native "SVGRect_y_Setter";
+  y_Setter_(mthis, __arg_0) => y_Setter(mthis, __arg_0);
+
 }
 
-class BlinkSVGRectElement {
+class BlinkSVGRectElement extends BlinkSVGGeometryElement {
+  static final instance = new BlinkSVGRectElement();
+
   static height_Getter(mthis) native "SVGRectElement_height_Getter";
+  height_Getter_(mthis) => height_Getter(mthis);
 
   static rx_Getter(mthis) native "SVGRectElement_rx_Getter";
+  rx_Getter_(mthis) => rx_Getter(mthis);
 
   static ry_Getter(mthis) native "SVGRectElement_ry_Getter";
+  ry_Getter_(mthis) => ry_Getter(mthis);
 
   static width_Getter(mthis) native "SVGRectElement_width_Getter";
+  width_Getter_(mthis) => width_Getter(mthis);
 
   static x_Getter(mthis) native "SVGRectElement_x_Getter";
+  x_Getter_(mthis) => x_Getter(mthis);
 
   static y_Getter(mthis) native "SVGRectElement_y_Getter";
+  y_Getter_(mthis) => y_Getter(mthis);
+
 }
 
-class BlinkSVGRenderingIntent {}
+class BlinkSVGRenderingIntent {
+  static final instance = new BlinkSVGRenderingIntent();
 
-class BlinkSVGZoomAndPan {
-  static zoomAndPan_Getter(mthis) native "SVGZoomAndPan_zoomAndPan_Getter";
-
-  static zoomAndPan_Setter(mthis, value) native "SVGZoomAndPan_zoomAndPan_Setter";
 }
 
-class BlinkSVGSVGElement {
+class BlinkSVGSVGElement extends BlinkSVGGraphicsElement {
+  static final instance = new BlinkSVGSVGElement();
+
+  static animationsPaused_Callback_0(mthis) native "SVGSVGElement_animationsPaused_Callback";
+  animationsPaused_Callback_0_(mthis) => animationsPaused_Callback_0(mthis);
+
+  static animationsPaused_Callback_1(mthis, __arg_0) native "SVGSVGElement_animationsPaused_Callback";
+  animationsPaused_Callback_1_(mthis, __arg_0) => animationsPaused_Callback_1(mthis, __arg_0);
+
+  static animationsPaused_Callback_2(mthis, __arg_0, __arg_1) native "SVGSVGElement_animationsPaused_Callback";
+  animationsPaused_Callback_2_(mthis, __arg_0, __arg_1) => animationsPaused_Callback_2(mthis, __arg_0, __arg_1);
+
+  static checkEnclosure_Callback_0(mthis) native "SVGSVGElement_checkEnclosure_Callback";
+  checkEnclosure_Callback_0_(mthis) => checkEnclosure_Callback_0(mthis);
+
+  static checkEnclosure_Callback_1(mthis, __arg_0) native "SVGSVGElement_checkEnclosure_Callback";
+  checkEnclosure_Callback_1_(mthis, __arg_0) => checkEnclosure_Callback_1(mthis, __arg_0);
+
+  static checkEnclosure_Callback_2(mthis, __arg_0, __arg_1) native "SVGSVGElement_checkEnclosure_Callback";
+  checkEnclosure_Callback_2_(mthis, __arg_0, __arg_1) => checkEnclosure_Callback_2(mthis, __arg_0, __arg_1);
+
+  static checkEnclosure_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGSVGElement_checkEnclosure_Callback";
+  checkEnclosure_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => checkEnclosure_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static checkEnclosure_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "SVGSVGElement_checkEnclosure_Callback";
+  checkEnclosure_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => checkEnclosure_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static checkIntersection_Callback_0(mthis) native "SVGSVGElement_checkIntersection_Callback";
+  checkIntersection_Callback_0_(mthis) => checkIntersection_Callback_0(mthis);
+
+  static checkIntersection_Callback_1(mthis, __arg_0) native "SVGSVGElement_checkIntersection_Callback";
+  checkIntersection_Callback_1_(mthis, __arg_0) => checkIntersection_Callback_1(mthis, __arg_0);
+
+  static checkIntersection_Callback_2(mthis, __arg_0, __arg_1) native "SVGSVGElement_checkIntersection_Callback";
+  checkIntersection_Callback_2_(mthis, __arg_0, __arg_1) => checkIntersection_Callback_2(mthis, __arg_0, __arg_1);
+
+  static checkIntersection_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGSVGElement_checkIntersection_Callback";
+  checkIntersection_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => checkIntersection_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static checkIntersection_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "SVGSVGElement_checkIntersection_Callback";
+  checkIntersection_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => checkIntersection_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static createSVGAngle_Callback_0(mthis) native "SVGSVGElement_createSVGAngle_Callback";
+  createSVGAngle_Callback_0_(mthis) => createSVGAngle_Callback_0(mthis);
+
+  static createSVGAngle_Callback_1(mthis, __arg_0) native "SVGSVGElement_createSVGAngle_Callback";
+  createSVGAngle_Callback_1_(mthis, __arg_0) => createSVGAngle_Callback_1(mthis, __arg_0);
+
+  static createSVGAngle_Callback_2(mthis, __arg_0, __arg_1) native "SVGSVGElement_createSVGAngle_Callback";
+  createSVGAngle_Callback_2_(mthis, __arg_0, __arg_1) => createSVGAngle_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createSVGLength_Callback_0(mthis) native "SVGSVGElement_createSVGLength_Callback";
+  createSVGLength_Callback_0_(mthis) => createSVGLength_Callback_0(mthis);
+
+  static createSVGLength_Callback_1(mthis, __arg_0) native "SVGSVGElement_createSVGLength_Callback";
+  createSVGLength_Callback_1_(mthis, __arg_0) => createSVGLength_Callback_1(mthis, __arg_0);
+
+  static createSVGLength_Callback_2(mthis, __arg_0, __arg_1) native "SVGSVGElement_createSVGLength_Callback";
+  createSVGLength_Callback_2_(mthis, __arg_0, __arg_1) => createSVGLength_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createSVGMatrix_Callback_0(mthis) native "SVGSVGElement_createSVGMatrix_Callback";
+  createSVGMatrix_Callback_0_(mthis) => createSVGMatrix_Callback_0(mthis);
+
+  static createSVGMatrix_Callback_1(mthis, __arg_0) native "SVGSVGElement_createSVGMatrix_Callback";
+  createSVGMatrix_Callback_1_(mthis, __arg_0) => createSVGMatrix_Callback_1(mthis, __arg_0);
+
+  static createSVGMatrix_Callback_2(mthis, __arg_0, __arg_1) native "SVGSVGElement_createSVGMatrix_Callback";
+  createSVGMatrix_Callback_2_(mthis, __arg_0, __arg_1) => createSVGMatrix_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createSVGNumber_Callback_0(mthis) native "SVGSVGElement_createSVGNumber_Callback";
+  createSVGNumber_Callback_0_(mthis) => createSVGNumber_Callback_0(mthis);
+
+  static createSVGNumber_Callback_1(mthis, __arg_0) native "SVGSVGElement_createSVGNumber_Callback";
+  createSVGNumber_Callback_1_(mthis, __arg_0) => createSVGNumber_Callback_1(mthis, __arg_0);
+
+  static createSVGNumber_Callback_2(mthis, __arg_0, __arg_1) native "SVGSVGElement_createSVGNumber_Callback";
+  createSVGNumber_Callback_2_(mthis, __arg_0, __arg_1) => createSVGNumber_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createSVGPoint_Callback_0(mthis) native "SVGSVGElement_createSVGPoint_Callback";
+  createSVGPoint_Callback_0_(mthis) => createSVGPoint_Callback_0(mthis);
+
+  static createSVGPoint_Callback_1(mthis, __arg_0) native "SVGSVGElement_createSVGPoint_Callback";
+  createSVGPoint_Callback_1_(mthis, __arg_0) => createSVGPoint_Callback_1(mthis, __arg_0);
+
+  static createSVGPoint_Callback_2(mthis, __arg_0, __arg_1) native "SVGSVGElement_createSVGPoint_Callback";
+  createSVGPoint_Callback_2_(mthis, __arg_0, __arg_1) => createSVGPoint_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createSVGRect_Callback_0(mthis) native "SVGSVGElement_createSVGRect_Callback";
+  createSVGRect_Callback_0_(mthis) => createSVGRect_Callback_0(mthis);
+
+  static createSVGRect_Callback_1(mthis, __arg_0) native "SVGSVGElement_createSVGRect_Callback";
+  createSVGRect_Callback_1_(mthis, __arg_0) => createSVGRect_Callback_1(mthis, __arg_0);
+
+  static createSVGRect_Callback_2(mthis, __arg_0, __arg_1) native "SVGSVGElement_createSVGRect_Callback";
+  createSVGRect_Callback_2_(mthis, __arg_0, __arg_1) => createSVGRect_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createSVGTransformFromMatrix_Callback_0(mthis) native "SVGSVGElement_createSVGTransformFromMatrix_Callback";
+  createSVGTransformFromMatrix_Callback_0_(mthis) => createSVGTransformFromMatrix_Callback_0(mthis);
+
+  static createSVGTransformFromMatrix_Callback_1(mthis, __arg_0) native "SVGSVGElement_createSVGTransformFromMatrix_Callback";
+  createSVGTransformFromMatrix_Callback_1_(mthis, __arg_0) => createSVGTransformFromMatrix_Callback_1(mthis, __arg_0);
+
+  static createSVGTransformFromMatrix_Callback_2(mthis, __arg_0, __arg_1) native "SVGSVGElement_createSVGTransformFromMatrix_Callback";
+  createSVGTransformFromMatrix_Callback_2_(mthis, __arg_0, __arg_1) => createSVGTransformFromMatrix_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createSVGTransformFromMatrix_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGSVGElement_createSVGTransformFromMatrix_Callback";
+  createSVGTransformFromMatrix_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => createSVGTransformFromMatrix_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static createSVGTransform_Callback_0(mthis) native "SVGSVGElement_createSVGTransform_Callback";
+  createSVGTransform_Callback_0_(mthis) => createSVGTransform_Callback_0(mthis);
+
+  static createSVGTransform_Callback_1(mthis, __arg_0) native "SVGSVGElement_createSVGTransform_Callback";
+  createSVGTransform_Callback_1_(mthis, __arg_0) => createSVGTransform_Callback_1(mthis, __arg_0);
+
+  static createSVGTransform_Callback_2(mthis, __arg_0, __arg_1) native "SVGSVGElement_createSVGTransform_Callback";
+  createSVGTransform_Callback_2_(mthis, __arg_0, __arg_1) => createSVGTransform_Callback_2(mthis, __arg_0, __arg_1);
+
   static currentScale_Getter(mthis) native "SVGSVGElement_currentScale_Getter";
+  currentScale_Getter_(mthis) => currentScale_Getter(mthis);
 
-  static currentScale_Setter(mthis, value) native "SVGSVGElement_currentScale_Setter";
+  static currentScale_Setter(mthis, __arg_0) native "SVGSVGElement_currentScale_Setter";
+  currentScale_Setter_(mthis, __arg_0) => currentScale_Setter(mthis, __arg_0);
 
   static currentTranslate_Getter(mthis) native "SVGSVGElement_currentTranslate_Getter";
+  currentTranslate_Getter_(mthis) => currentTranslate_Getter(mthis);
 
   static currentView_Getter(mthis) native "SVGSVGElement_currentView_Getter";
+  currentView_Getter_(mthis) => currentView_Getter(mthis);
+
+  static deselectAll_Callback_0(mthis) native "SVGSVGElement_deselectAll_Callback";
+  deselectAll_Callback_0_(mthis) => deselectAll_Callback_0(mthis);
+
+  static deselectAll_Callback_1(mthis, __arg_0) native "SVGSVGElement_deselectAll_Callback";
+  deselectAll_Callback_1_(mthis, __arg_0) => deselectAll_Callback_1(mthis, __arg_0);
+
+  static deselectAll_Callback_2(mthis, __arg_0, __arg_1) native "SVGSVGElement_deselectAll_Callback";
+  deselectAll_Callback_2_(mthis, __arg_0, __arg_1) => deselectAll_Callback_2(mthis, __arg_0, __arg_1);
+
+  static forceRedraw_Callback_0(mthis) native "SVGSVGElement_forceRedraw_Callback";
+  forceRedraw_Callback_0_(mthis) => forceRedraw_Callback_0(mthis);
+
+  static forceRedraw_Callback_1(mthis, __arg_0) native "SVGSVGElement_forceRedraw_Callback";
+  forceRedraw_Callback_1_(mthis, __arg_0) => forceRedraw_Callback_1(mthis, __arg_0);
+
+  static forceRedraw_Callback_2(mthis, __arg_0, __arg_1) native "SVGSVGElement_forceRedraw_Callback";
+  forceRedraw_Callback_2_(mthis, __arg_0, __arg_1) => forceRedraw_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getCurrentTime_Callback_0(mthis) native "SVGSVGElement_getCurrentTime_Callback";
+  getCurrentTime_Callback_0_(mthis) => getCurrentTime_Callback_0(mthis);
+
+  static getCurrentTime_Callback_1(mthis, __arg_0) native "SVGSVGElement_getCurrentTime_Callback";
+  getCurrentTime_Callback_1_(mthis, __arg_0) => getCurrentTime_Callback_1(mthis, __arg_0);
+
+  static getCurrentTime_Callback_2(mthis, __arg_0, __arg_1) native "SVGSVGElement_getCurrentTime_Callback";
+  getCurrentTime_Callback_2_(mthis, __arg_0, __arg_1) => getCurrentTime_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getElementById_Callback_0(mthis) native "SVGSVGElement_getElementById_Callback";
+  getElementById_Callback_0_(mthis) => getElementById_Callback_0(mthis);
+
+  static getElementById_Callback_1(mthis, __arg_0) native "SVGSVGElement_getElementById_Callback";
+  getElementById_Callback_1_(mthis, __arg_0) => getElementById_Callback_1(mthis, __arg_0);
+
+  static getElementById_Callback_2(mthis, __arg_0, __arg_1) native "SVGSVGElement_getElementById_Callback";
+  getElementById_Callback_2_(mthis, __arg_0, __arg_1) => getElementById_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getElementById_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGSVGElement_getElementById_Callback";
+  getElementById_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getElementById_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static getEnclosureList_Callback_0(mthis) native "SVGSVGElement_getEnclosureList_Callback";
+  getEnclosureList_Callback_0_(mthis) => getEnclosureList_Callback_0(mthis);
+
+  static getEnclosureList_Callback_1(mthis, __arg_0) native "SVGSVGElement_getEnclosureList_Callback";
+  getEnclosureList_Callback_1_(mthis, __arg_0) => getEnclosureList_Callback_1(mthis, __arg_0);
+
+  static getEnclosureList_Callback_2(mthis, __arg_0, __arg_1) native "SVGSVGElement_getEnclosureList_Callback";
+  getEnclosureList_Callback_2_(mthis, __arg_0, __arg_1) => getEnclosureList_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getEnclosureList_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGSVGElement_getEnclosureList_Callback";
+  getEnclosureList_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getEnclosureList_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static getEnclosureList_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "SVGSVGElement_getEnclosureList_Callback";
+  getEnclosureList_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => getEnclosureList_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static getIntersectionList_Callback_0(mthis) native "SVGSVGElement_getIntersectionList_Callback";
+  getIntersectionList_Callback_0_(mthis) => getIntersectionList_Callback_0(mthis);
+
+  static getIntersectionList_Callback_1(mthis, __arg_0) native "SVGSVGElement_getIntersectionList_Callback";
+  getIntersectionList_Callback_1_(mthis, __arg_0) => getIntersectionList_Callback_1(mthis, __arg_0);
+
+  static getIntersectionList_Callback_2(mthis, __arg_0, __arg_1) native "SVGSVGElement_getIntersectionList_Callback";
+  getIntersectionList_Callback_2_(mthis, __arg_0, __arg_1) => getIntersectionList_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getIntersectionList_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGSVGElement_getIntersectionList_Callback";
+  getIntersectionList_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getIntersectionList_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static getIntersectionList_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "SVGSVGElement_getIntersectionList_Callback";
+  getIntersectionList_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => getIntersectionList_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
 
   static height_Getter(mthis) native "SVGSVGElement_height_Getter";
+  height_Getter_(mthis) => height_Getter(mthis);
+
+  static pauseAnimations_Callback_0(mthis) native "SVGSVGElement_pauseAnimations_Callback";
+  pauseAnimations_Callback_0_(mthis) => pauseAnimations_Callback_0(mthis);
+
+  static pauseAnimations_Callback_1(mthis, __arg_0) native "SVGSVGElement_pauseAnimations_Callback";
+  pauseAnimations_Callback_1_(mthis, __arg_0) => pauseAnimations_Callback_1(mthis, __arg_0);
+
+  static pauseAnimations_Callback_2(mthis, __arg_0, __arg_1) native "SVGSVGElement_pauseAnimations_Callback";
+  pauseAnimations_Callback_2_(mthis, __arg_0, __arg_1) => pauseAnimations_Callback_2(mthis, __arg_0, __arg_1);
 
   static pixelUnitToMillimeterX_Getter(mthis) native "SVGSVGElement_pixelUnitToMillimeterX_Getter";
+  pixelUnitToMillimeterX_Getter_(mthis) => pixelUnitToMillimeterX_Getter(mthis);
 
   static pixelUnitToMillimeterY_Getter(mthis) native "SVGSVGElement_pixelUnitToMillimeterY_Getter";
-
-  static screenPixelToMillimeterX_Getter(mthis) native "SVGSVGElement_screenPixelToMillimeterX_Getter";
-
-  static screenPixelToMillimeterY_Getter(mthis) native "SVGSVGElement_screenPixelToMillimeterY_Getter";
-
-  static useCurrentView_Getter(mthis) native "SVGSVGElement_useCurrentView_Getter";
-
-  static viewport_Getter(mthis) native "SVGSVGElement_viewport_Getter";
-
-  static width_Getter(mthis) native "SVGSVGElement_width_Getter";
-
-  static x_Getter(mthis) native "SVGSVGElement_x_Getter";
-
-  static y_Getter(mthis) native "SVGSVGElement_y_Getter";
-
-  static animationsPaused_Callback(mthis) native "SVGSVGElement_animationsPaused_Callback";
-
-  static checkEnclosure_Callback_2(mthis, element, rect) native "SVGSVGElement_checkEnclosure_Callback";
-
-  static checkIntersection_Callback_2(mthis, element, rect) native "SVGSVGElement_checkIntersection_Callback";
-
-  static createSVGAngle_Callback(mthis) native "SVGSVGElement_createSVGAngle_Callback";
-
-  static createSVGLength_Callback(mthis) native "SVGSVGElement_createSVGLength_Callback";
-
-  static createSVGMatrix_Callback(mthis) native "SVGSVGElement_createSVGMatrix_Callback";
-
-  static createSVGNumber_Callback(mthis) native "SVGSVGElement_createSVGNumber_Callback";
-
-  static createSVGPoint_Callback(mthis) native "SVGSVGElement_createSVGPoint_Callback";
-
-  static createSVGRect_Callback(mthis) native "SVGSVGElement_createSVGRect_Callback";
-
-  static createSVGTransform_Callback(mthis) native "SVGSVGElement_createSVGTransform_Callback";
-
-  static createSVGTransformFromMatrix_Callback_1(mthis, matrix) native "SVGSVGElement_createSVGTransformFromMatrix_Callback";
-
-  static deselectAll_Callback(mthis) native "SVGSVGElement_deselectAll_Callback";
-
-  static forceRedraw_Callback(mthis) native "SVGSVGElement_forceRedraw_Callback";
-
-  static getCurrentTime_Callback(mthis) native "SVGSVGElement_getCurrentTime_Callback";
-
-  static getElementById_Callback_1(mthis, elementId) native "SVGSVGElement_getElementById_Callback";
-
-  static getEnclosureList_Callback_2(mthis, rect, referenceElement) native "SVGSVGElement_getEnclosureList_Callback";
-
-  static getIntersectionList_Callback_2(mthis, rect, referenceElement) native "SVGSVGElement_getIntersectionList_Callback";
-
-  static pauseAnimations_Callback(mthis) native "SVGSVGElement_pauseAnimations_Callback";
-
-  static setCurrentTime_Callback_1(mthis, seconds) native "SVGSVGElement_setCurrentTime_Callback";
-
-  static suspendRedraw_Callback_1(mthis, maxWaitMilliseconds) native "SVGSVGElement_suspendRedraw_Callback";
-
-  static unpauseAnimations_Callback(mthis) native "SVGSVGElement_unpauseAnimations_Callback";
-
-  static unsuspendRedraw_Callback_1(mthis, suspendHandleId) native "SVGSVGElement_unsuspendRedraw_Callback";
-
-  static unsuspendRedrawAll_Callback(mthis) native "SVGSVGElement_unsuspendRedrawAll_Callback";
+  pixelUnitToMillimeterY_Getter_(mthis) => pixelUnitToMillimeterY_Getter(mthis);
 
   static preserveAspectRatio_Getter(mthis) native "SVGSVGElement_preserveAspectRatio_Getter";
+  preserveAspectRatio_Getter_(mthis) => preserveAspectRatio_Getter(mthis);
+
+  static screenPixelToMillimeterX_Getter(mthis) native "SVGSVGElement_screenPixelToMillimeterX_Getter";
+  screenPixelToMillimeterX_Getter_(mthis) => screenPixelToMillimeterX_Getter(mthis);
+
+  static screenPixelToMillimeterY_Getter(mthis) native "SVGSVGElement_screenPixelToMillimeterY_Getter";
+  screenPixelToMillimeterY_Getter_(mthis) => screenPixelToMillimeterY_Getter(mthis);
+
+  static setCurrentTime_Callback_0(mthis) native "SVGSVGElement_setCurrentTime_Callback";
+  setCurrentTime_Callback_0_(mthis) => setCurrentTime_Callback_0(mthis);
+
+  static setCurrentTime_Callback_1(mthis, __arg_0) native "SVGSVGElement_setCurrentTime_Callback";
+  setCurrentTime_Callback_1_(mthis, __arg_0) => setCurrentTime_Callback_1(mthis, __arg_0);
+
+  static setCurrentTime_Callback_2(mthis, __arg_0, __arg_1) native "SVGSVGElement_setCurrentTime_Callback";
+  setCurrentTime_Callback_2_(mthis, __arg_0, __arg_1) => setCurrentTime_Callback_2(mthis, __arg_0, __arg_1);
+
+  static setCurrentTime_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGSVGElement_setCurrentTime_Callback";
+  setCurrentTime_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => setCurrentTime_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static suspendRedraw_Callback_0(mthis) native "SVGSVGElement_suspendRedraw_Callback";
+  suspendRedraw_Callback_0_(mthis) => suspendRedraw_Callback_0(mthis);
+
+  static suspendRedraw_Callback_1(mthis, __arg_0) native "SVGSVGElement_suspendRedraw_Callback";
+  suspendRedraw_Callback_1_(mthis, __arg_0) => suspendRedraw_Callback_1(mthis, __arg_0);
+
+  static suspendRedraw_Callback_2(mthis, __arg_0, __arg_1) native "SVGSVGElement_suspendRedraw_Callback";
+  suspendRedraw_Callback_2_(mthis, __arg_0, __arg_1) => suspendRedraw_Callback_2(mthis, __arg_0, __arg_1);
+
+  static suspendRedraw_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGSVGElement_suspendRedraw_Callback";
+  suspendRedraw_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => suspendRedraw_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static unpauseAnimations_Callback_0(mthis) native "SVGSVGElement_unpauseAnimations_Callback";
+  unpauseAnimations_Callback_0_(mthis) => unpauseAnimations_Callback_0(mthis);
+
+  static unpauseAnimations_Callback_1(mthis, __arg_0) native "SVGSVGElement_unpauseAnimations_Callback";
+  unpauseAnimations_Callback_1_(mthis, __arg_0) => unpauseAnimations_Callback_1(mthis, __arg_0);
+
+  static unpauseAnimations_Callback_2(mthis, __arg_0, __arg_1) native "SVGSVGElement_unpauseAnimations_Callback";
+  unpauseAnimations_Callback_2_(mthis, __arg_0, __arg_1) => unpauseAnimations_Callback_2(mthis, __arg_0, __arg_1);
+
+  static unsuspendRedrawAll_Callback_0(mthis) native "SVGSVGElement_unsuspendRedrawAll_Callback";
+  unsuspendRedrawAll_Callback_0_(mthis) => unsuspendRedrawAll_Callback_0(mthis);
+
+  static unsuspendRedrawAll_Callback_1(mthis, __arg_0) native "SVGSVGElement_unsuspendRedrawAll_Callback";
+  unsuspendRedrawAll_Callback_1_(mthis, __arg_0) => unsuspendRedrawAll_Callback_1(mthis, __arg_0);
+
+  static unsuspendRedrawAll_Callback_2(mthis, __arg_0, __arg_1) native "SVGSVGElement_unsuspendRedrawAll_Callback";
+  unsuspendRedrawAll_Callback_2_(mthis, __arg_0, __arg_1) => unsuspendRedrawAll_Callback_2(mthis, __arg_0, __arg_1);
+
+  static unsuspendRedraw_Callback_0(mthis) native "SVGSVGElement_unsuspendRedraw_Callback";
+  unsuspendRedraw_Callback_0_(mthis) => unsuspendRedraw_Callback_0(mthis);
+
+  static unsuspendRedraw_Callback_1(mthis, __arg_0) native "SVGSVGElement_unsuspendRedraw_Callback";
+  unsuspendRedraw_Callback_1_(mthis, __arg_0) => unsuspendRedraw_Callback_1(mthis, __arg_0);
+
+  static unsuspendRedraw_Callback_2(mthis, __arg_0, __arg_1) native "SVGSVGElement_unsuspendRedraw_Callback";
+  unsuspendRedraw_Callback_2_(mthis, __arg_0, __arg_1) => unsuspendRedraw_Callback_2(mthis, __arg_0, __arg_1);
+
+  static unsuspendRedraw_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGSVGElement_unsuspendRedraw_Callback";
+  unsuspendRedraw_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => unsuspendRedraw_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static useCurrentView_Getter(mthis) native "SVGSVGElement_useCurrentView_Getter";
+  useCurrentView_Getter_(mthis) => useCurrentView_Getter(mthis);
 
   static viewBox_Getter(mthis) native "SVGSVGElement_viewBox_Getter";
+  viewBox_Getter_(mthis) => viewBox_Getter(mthis);
+
+  static viewport_Getter(mthis) native "SVGSVGElement_viewport_Getter";
+  viewport_Getter_(mthis) => viewport_Getter(mthis);
+
+  static width_Getter(mthis) native "SVGSVGElement_width_Getter";
+  width_Getter_(mthis) => width_Getter(mthis);
+
+  static x_Getter(mthis) native "SVGSVGElement_x_Getter";
+  x_Getter_(mthis) => x_Getter(mthis);
+
+  static y_Getter(mthis) native "SVGSVGElement_y_Getter";
+  y_Getter_(mthis) => y_Getter(mthis);
 
   static zoomAndPan_Getter(mthis) native "SVGSVGElement_zoomAndPan_Getter";
+  zoomAndPan_Getter_(mthis) => zoomAndPan_Getter(mthis);
 
-  static zoomAndPan_Setter(mthis, value) native "SVGSVGElement_zoomAndPan_Setter";
+  static zoomAndPan_Setter(mthis, __arg_0) native "SVGSVGElement_zoomAndPan_Setter";
+  zoomAndPan_Setter_(mthis, __arg_0) => zoomAndPan_Setter(mthis, __arg_0);
+
 }
 
-class BlinkSVGScriptElement {
-  static type_Getter(mthis) native "SVGScriptElement_type_Getter";
-
-  static type_Setter(mthis, value) native "SVGScriptElement_type_Setter";
+class BlinkSVGScriptElement extends BlinkSVGElement {
+  static final instance = new BlinkSVGScriptElement();
 
   static href_Getter(mthis) native "SVGScriptElement_href_Getter";
+  href_Getter_(mthis) => href_Getter(mthis);
+
+  static type_Getter(mthis) native "SVGScriptElement_type_Getter";
+  type_Getter_(mthis) => type_Getter(mthis);
+
+  static type_Setter(mthis, __arg_0) native "SVGScriptElement_type_Setter";
+  type_Setter_(mthis, __arg_0) => type_Setter(mthis, __arg_0);
+
 }
 
-class BlinkSVGSetElement {}
+class BlinkSVGSetElement extends BlinkSVGAnimationElement {
+  static final instance = new BlinkSVGSetElement();
 
-class BlinkSVGStopElement {
+}
+
+class BlinkSVGStopElement extends BlinkSVGElement {
+  static final instance = new BlinkSVGStopElement();
+
   static offset_Getter(mthis) native "SVGStopElement_offset_Getter";
+  offset_Getter_(mthis) => offset_Getter(mthis);
+
 }
 
 class BlinkSVGStringList {
+  static final instance = new BlinkSVGStringList();
+
+  static $__getter___Callback_1(mthis, __arg_0) native "SVGStringList___getter___Callback";
+  $__getter___Callback_1_(mthis, __arg_0) => $__getter___Callback_1(mthis, __arg_0);
+
+  static $__setter___Callback_2(mthis, __arg_0, __arg_1) native "SVGStringList___setter___Callback";
+  $__setter___Callback_2_(mthis, __arg_0, __arg_1) => $__setter___Callback_2(mthis, __arg_0, __arg_1);
+
+  static appendItem_Callback_0(mthis) native "SVGStringList_appendItem_Callback";
+  appendItem_Callback_0_(mthis) => appendItem_Callback_0(mthis);
+
+  static appendItem_Callback_1(mthis, __arg_0) native "SVGStringList_appendItem_Callback";
+  appendItem_Callback_1_(mthis, __arg_0) => appendItem_Callback_1(mthis, __arg_0);
+
+  static appendItem_Callback_2(mthis, __arg_0, __arg_1) native "SVGStringList_appendItem_Callback";
+  appendItem_Callback_2_(mthis, __arg_0, __arg_1) => appendItem_Callback_2(mthis, __arg_0, __arg_1);
+
+  static appendItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGStringList_appendItem_Callback";
+  appendItem_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => appendItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static clear_Callback_0(mthis) native "SVGStringList_clear_Callback";
+  clear_Callback_0_(mthis) => clear_Callback_0(mthis);
+
+  static clear_Callback_1(mthis, __arg_0) native "SVGStringList_clear_Callback";
+  clear_Callback_1_(mthis, __arg_0) => clear_Callback_1(mthis, __arg_0);
+
+  static clear_Callback_2(mthis, __arg_0, __arg_1) native "SVGStringList_clear_Callback";
+  clear_Callback_2_(mthis, __arg_0, __arg_1) => clear_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getItem_Callback_0(mthis) native "SVGStringList_getItem_Callback";
+  getItem_Callback_0_(mthis) => getItem_Callback_0(mthis);
+
+  static getItem_Callback_1(mthis, __arg_0) native "SVGStringList_getItem_Callback";
+  getItem_Callback_1_(mthis, __arg_0) => getItem_Callback_1(mthis, __arg_0);
+
+  static getItem_Callback_2(mthis, __arg_0, __arg_1) native "SVGStringList_getItem_Callback";
+  getItem_Callback_2_(mthis, __arg_0, __arg_1) => getItem_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGStringList_getItem_Callback";
+  getItem_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static initialize_Callback_0(mthis) native "SVGStringList_initialize_Callback";
+  initialize_Callback_0_(mthis) => initialize_Callback_0(mthis);
+
+  static initialize_Callback_1(mthis, __arg_0) native "SVGStringList_initialize_Callback";
+  initialize_Callback_1_(mthis, __arg_0) => initialize_Callback_1(mthis, __arg_0);
+
+  static initialize_Callback_2(mthis, __arg_0, __arg_1) native "SVGStringList_initialize_Callback";
+  initialize_Callback_2_(mthis, __arg_0, __arg_1) => initialize_Callback_2(mthis, __arg_0, __arg_1);
+
+  static initialize_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGStringList_initialize_Callback";
+  initialize_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => initialize_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static insertItemBefore_Callback_0(mthis) native "SVGStringList_insertItemBefore_Callback";
+  insertItemBefore_Callback_0_(mthis) => insertItemBefore_Callback_0(mthis);
+
+  static insertItemBefore_Callback_1(mthis, __arg_0) native "SVGStringList_insertItemBefore_Callback";
+  insertItemBefore_Callback_1_(mthis, __arg_0) => insertItemBefore_Callback_1(mthis, __arg_0);
+
+  static insertItemBefore_Callback_2(mthis, __arg_0, __arg_1) native "SVGStringList_insertItemBefore_Callback";
+  insertItemBefore_Callback_2_(mthis, __arg_0, __arg_1) => insertItemBefore_Callback_2(mthis, __arg_0, __arg_1);
+
+  static insertItemBefore_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGStringList_insertItemBefore_Callback";
+  insertItemBefore_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => insertItemBefore_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static insertItemBefore_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "SVGStringList_insertItemBefore_Callback";
+  insertItemBefore_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => insertItemBefore_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
   static length_Getter(mthis) native "SVGStringList_length_Getter";
+  length_Getter_(mthis) => length_Getter(mthis);
 
   static numberOfItems_Getter(mthis) native "SVGStringList_numberOfItems_Getter";
+  numberOfItems_Getter_(mthis) => numberOfItems_Getter(mthis);
 
-  static $__setter___Callback_2(mthis, index, value) native "SVGStringList___setter___Callback";
+  static removeItem_Callback_0(mthis) native "SVGStringList_removeItem_Callback";
+  removeItem_Callback_0_(mthis) => removeItem_Callback_0(mthis);
 
-  static appendItem_Callback_1(mthis, item) native "SVGStringList_appendItem_Callback";
+  static removeItem_Callback_1(mthis, __arg_0) native "SVGStringList_removeItem_Callback";
+  removeItem_Callback_1_(mthis, __arg_0) => removeItem_Callback_1(mthis, __arg_0);
 
-  static clear_Callback(mthis) native "SVGStringList_clear_Callback";
+  static removeItem_Callback_2(mthis, __arg_0, __arg_1) native "SVGStringList_removeItem_Callback";
+  removeItem_Callback_2_(mthis, __arg_0, __arg_1) => removeItem_Callback_2(mthis, __arg_0, __arg_1);
 
-  static getItem_Callback_1(mthis, index) native "SVGStringList_getItem_Callback";
+  static removeItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGStringList_removeItem_Callback";
+  removeItem_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => removeItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
-  static initialize_Callback_1(mthis, item) native "SVGStringList_initialize_Callback";
+  static replaceItem_Callback_0(mthis) native "SVGStringList_replaceItem_Callback";
+  replaceItem_Callback_0_(mthis) => replaceItem_Callback_0(mthis);
 
-  static insertItemBefore_Callback_2(mthis, item, index) native "SVGStringList_insertItemBefore_Callback";
+  static replaceItem_Callback_1(mthis, __arg_0) native "SVGStringList_replaceItem_Callback";
+  replaceItem_Callback_1_(mthis, __arg_0) => replaceItem_Callback_1(mthis, __arg_0);
 
-  static removeItem_Callback_1(mthis, index) native "SVGStringList_removeItem_Callback";
+  static replaceItem_Callback_2(mthis, __arg_0, __arg_1) native "SVGStringList_replaceItem_Callback";
+  replaceItem_Callback_2_(mthis, __arg_0, __arg_1) => replaceItem_Callback_2(mthis, __arg_0, __arg_1);
 
-  static replaceItem_Callback_2(mthis, item, index) native "SVGStringList_replaceItem_Callback";
+  static replaceItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGStringList_replaceItem_Callback";
+  replaceItem_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => replaceItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static replaceItem_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "SVGStringList_replaceItem_Callback";
+  replaceItem_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => replaceItem_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
 }
 
-class BlinkSVGStyleElement {
-  static disabled_Getter(mthis) native "SVGStyleElement_disabled_Getter";
+class BlinkSVGStyleElement extends BlinkSVGElement {
+  static final instance = new BlinkSVGStyleElement();
 
-  static disabled_Setter(mthis, value) native "SVGStyleElement_disabled_Setter";
+  static disabled_Getter(mthis) native "SVGStyleElement_disabled_Getter";
+  disabled_Getter_(mthis) => disabled_Getter(mthis);
+
+  static disabled_Setter(mthis, __arg_0) native "SVGStyleElement_disabled_Setter";
+  disabled_Setter_(mthis, __arg_0) => disabled_Setter(mthis, __arg_0);
 
   static media_Getter(mthis) native "SVGStyleElement_media_Getter";
+  media_Getter_(mthis) => media_Getter(mthis);
 
-  static media_Setter(mthis, value) native "SVGStyleElement_media_Setter";
+  static media_Setter(mthis, __arg_0) native "SVGStyleElement_media_Setter";
+  media_Setter_(mthis, __arg_0) => media_Setter(mthis, __arg_0);
 
   static sheet_Getter(mthis) native "SVGStyleElement_sheet_Getter";
+  sheet_Getter_(mthis) => sheet_Getter(mthis);
 
   static title_Getter(mthis) native "SVGStyleElement_title_Getter";
+  title_Getter_(mthis) => title_Getter(mthis);
 
-  static title_Setter(mthis, value) native "SVGStyleElement_title_Setter";
+  static title_Setter(mthis, __arg_0) native "SVGStyleElement_title_Setter";
+  title_Setter_(mthis, __arg_0) => title_Setter(mthis, __arg_0);
 
   static type_Getter(mthis) native "SVGStyleElement_type_Getter";
+  type_Getter_(mthis) => type_Getter(mthis);
 
-  static type_Setter(mthis, value) native "SVGStyleElement_type_Setter";
+  static type_Setter(mthis, __arg_0) native "SVGStyleElement_type_Setter";
+  type_Setter_(mthis, __arg_0) => type_Setter(mthis, __arg_0);
+
 }
 
-class BlinkSVGSwitchElement {}
+class BlinkSVGSwitchElement extends BlinkSVGGraphicsElement {
+  static final instance = new BlinkSVGSwitchElement();
 
-class BlinkSVGSymbolElement {
+}
+
+class BlinkSVGSymbolElement extends BlinkSVGElement {
+  static final instance = new BlinkSVGSymbolElement();
+
   static preserveAspectRatio_Getter(mthis) native "SVGSymbolElement_preserveAspectRatio_Getter";
+  preserveAspectRatio_Getter_(mthis) => preserveAspectRatio_Getter(mthis);
 
   static viewBox_Getter(mthis) native "SVGSymbolElement_viewBox_Getter";
+  viewBox_Getter_(mthis) => viewBox_Getter(mthis);
+
 }
 
-class BlinkSVGTSpanElement {}
+class BlinkSVGTSpanElement extends BlinkSVGTextPositioningElement {
+  static final instance = new BlinkSVGTSpanElement();
 
-class BlinkSVGTextElement {}
+}
 
-class BlinkSVGTextPathElement {
-  static method_Getter(mthis) native "SVGTextPathElement_method_Getter";
+class BlinkSVGTextContentElement extends BlinkSVGGraphicsElement {
+  static final instance = new BlinkSVGTextContentElement();
 
-  static spacing_Getter(mthis) native "SVGTextPathElement_spacing_Getter";
+  static getCharNumAtPosition_Callback_0(mthis) native "SVGTextContentElement_getCharNumAtPosition_Callback";
+  getCharNumAtPosition_Callback_0_(mthis) => getCharNumAtPosition_Callback_0(mthis);
 
-  static startOffset_Getter(mthis) native "SVGTextPathElement_startOffset_Getter";
+  static getCharNumAtPosition_Callback_1(mthis, __arg_0) native "SVGTextContentElement_getCharNumAtPosition_Callback";
+  getCharNumAtPosition_Callback_1_(mthis, __arg_0) => getCharNumAtPosition_Callback_1(mthis, __arg_0);
+
+  static getCharNumAtPosition_Callback_2(mthis, __arg_0, __arg_1) native "SVGTextContentElement_getCharNumAtPosition_Callback";
+  getCharNumAtPosition_Callback_2_(mthis, __arg_0, __arg_1) => getCharNumAtPosition_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getCharNumAtPosition_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGTextContentElement_getCharNumAtPosition_Callback";
+  getCharNumAtPosition_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getCharNumAtPosition_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static getComputedTextLength_Callback_0(mthis) native "SVGTextContentElement_getComputedTextLength_Callback";
+  getComputedTextLength_Callback_0_(mthis) => getComputedTextLength_Callback_0(mthis);
+
+  static getComputedTextLength_Callback_1(mthis, __arg_0) native "SVGTextContentElement_getComputedTextLength_Callback";
+  getComputedTextLength_Callback_1_(mthis, __arg_0) => getComputedTextLength_Callback_1(mthis, __arg_0);
+
+  static getComputedTextLength_Callback_2(mthis, __arg_0, __arg_1) native "SVGTextContentElement_getComputedTextLength_Callback";
+  getComputedTextLength_Callback_2_(mthis, __arg_0, __arg_1) => getComputedTextLength_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getEndPositionOfChar_Callback_0(mthis) native "SVGTextContentElement_getEndPositionOfChar_Callback";
+  getEndPositionOfChar_Callback_0_(mthis) => getEndPositionOfChar_Callback_0(mthis);
+
+  static getEndPositionOfChar_Callback_1(mthis, __arg_0) native "SVGTextContentElement_getEndPositionOfChar_Callback";
+  getEndPositionOfChar_Callback_1_(mthis, __arg_0) => getEndPositionOfChar_Callback_1(mthis, __arg_0);
+
+  static getEndPositionOfChar_Callback_2(mthis, __arg_0, __arg_1) native "SVGTextContentElement_getEndPositionOfChar_Callback";
+  getEndPositionOfChar_Callback_2_(mthis, __arg_0, __arg_1) => getEndPositionOfChar_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getEndPositionOfChar_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGTextContentElement_getEndPositionOfChar_Callback";
+  getEndPositionOfChar_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getEndPositionOfChar_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static getExtentOfChar_Callback_0(mthis) native "SVGTextContentElement_getExtentOfChar_Callback";
+  getExtentOfChar_Callback_0_(mthis) => getExtentOfChar_Callback_0(mthis);
+
+  static getExtentOfChar_Callback_1(mthis, __arg_0) native "SVGTextContentElement_getExtentOfChar_Callback";
+  getExtentOfChar_Callback_1_(mthis, __arg_0) => getExtentOfChar_Callback_1(mthis, __arg_0);
+
+  static getExtentOfChar_Callback_2(mthis, __arg_0, __arg_1) native "SVGTextContentElement_getExtentOfChar_Callback";
+  getExtentOfChar_Callback_2_(mthis, __arg_0, __arg_1) => getExtentOfChar_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getExtentOfChar_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGTextContentElement_getExtentOfChar_Callback";
+  getExtentOfChar_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getExtentOfChar_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static getNumberOfChars_Callback_0(mthis) native "SVGTextContentElement_getNumberOfChars_Callback";
+  getNumberOfChars_Callback_0_(mthis) => getNumberOfChars_Callback_0(mthis);
+
+  static getNumberOfChars_Callback_1(mthis, __arg_0) native "SVGTextContentElement_getNumberOfChars_Callback";
+  getNumberOfChars_Callback_1_(mthis, __arg_0) => getNumberOfChars_Callback_1(mthis, __arg_0);
+
+  static getNumberOfChars_Callback_2(mthis, __arg_0, __arg_1) native "SVGTextContentElement_getNumberOfChars_Callback";
+  getNumberOfChars_Callback_2_(mthis, __arg_0, __arg_1) => getNumberOfChars_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getRotationOfChar_Callback_0(mthis) native "SVGTextContentElement_getRotationOfChar_Callback";
+  getRotationOfChar_Callback_0_(mthis) => getRotationOfChar_Callback_0(mthis);
+
+  static getRotationOfChar_Callback_1(mthis, __arg_0) native "SVGTextContentElement_getRotationOfChar_Callback";
+  getRotationOfChar_Callback_1_(mthis, __arg_0) => getRotationOfChar_Callback_1(mthis, __arg_0);
+
+  static getRotationOfChar_Callback_2(mthis, __arg_0, __arg_1) native "SVGTextContentElement_getRotationOfChar_Callback";
+  getRotationOfChar_Callback_2_(mthis, __arg_0, __arg_1) => getRotationOfChar_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getRotationOfChar_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGTextContentElement_getRotationOfChar_Callback";
+  getRotationOfChar_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getRotationOfChar_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static getStartPositionOfChar_Callback_0(mthis) native "SVGTextContentElement_getStartPositionOfChar_Callback";
+  getStartPositionOfChar_Callback_0_(mthis) => getStartPositionOfChar_Callback_0(mthis);
+
+  static getStartPositionOfChar_Callback_1(mthis, __arg_0) native "SVGTextContentElement_getStartPositionOfChar_Callback";
+  getStartPositionOfChar_Callback_1_(mthis, __arg_0) => getStartPositionOfChar_Callback_1(mthis, __arg_0);
+
+  static getStartPositionOfChar_Callback_2(mthis, __arg_0, __arg_1) native "SVGTextContentElement_getStartPositionOfChar_Callback";
+  getStartPositionOfChar_Callback_2_(mthis, __arg_0, __arg_1) => getStartPositionOfChar_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getStartPositionOfChar_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGTextContentElement_getStartPositionOfChar_Callback";
+  getStartPositionOfChar_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getStartPositionOfChar_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static getSubStringLength_Callback_0(mthis) native "SVGTextContentElement_getSubStringLength_Callback";
+  getSubStringLength_Callback_0_(mthis) => getSubStringLength_Callback_0(mthis);
+
+  static getSubStringLength_Callback_1(mthis, __arg_0) native "SVGTextContentElement_getSubStringLength_Callback";
+  getSubStringLength_Callback_1_(mthis, __arg_0) => getSubStringLength_Callback_1(mthis, __arg_0);
+
+  static getSubStringLength_Callback_2(mthis, __arg_0, __arg_1) native "SVGTextContentElement_getSubStringLength_Callback";
+  getSubStringLength_Callback_2_(mthis, __arg_0, __arg_1) => getSubStringLength_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getSubStringLength_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGTextContentElement_getSubStringLength_Callback";
+  getSubStringLength_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getSubStringLength_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static getSubStringLength_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "SVGTextContentElement_getSubStringLength_Callback";
+  getSubStringLength_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => getSubStringLength_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static lengthAdjust_Getter(mthis) native "SVGTextContentElement_lengthAdjust_Getter";
+  lengthAdjust_Getter_(mthis) => lengthAdjust_Getter(mthis);
+
+  static selectSubString_Callback_0(mthis) native "SVGTextContentElement_selectSubString_Callback";
+  selectSubString_Callback_0_(mthis) => selectSubString_Callback_0(mthis);
+
+  static selectSubString_Callback_1(mthis, __arg_0) native "SVGTextContentElement_selectSubString_Callback";
+  selectSubString_Callback_1_(mthis, __arg_0) => selectSubString_Callback_1(mthis, __arg_0);
+
+  static selectSubString_Callback_2(mthis, __arg_0, __arg_1) native "SVGTextContentElement_selectSubString_Callback";
+  selectSubString_Callback_2_(mthis, __arg_0, __arg_1) => selectSubString_Callback_2(mthis, __arg_0, __arg_1);
+
+  static selectSubString_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGTextContentElement_selectSubString_Callback";
+  selectSubString_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => selectSubString_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static selectSubString_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "SVGTextContentElement_selectSubString_Callback";
+  selectSubString_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => selectSubString_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static textLength_Getter(mthis) native "SVGTextContentElement_textLength_Getter";
+  textLength_Getter_(mthis) => textLength_Getter(mthis);
+
+}
+
+class BlinkSVGTextElement extends BlinkSVGTextPositioningElement {
+  static final instance = new BlinkSVGTextElement();
+
+}
+
+class BlinkSVGTextPathElement extends BlinkSVGTextContentElement {
+  static final instance = new BlinkSVGTextPathElement();
 
   static href_Getter(mthis) native "SVGTextPathElement_href_Getter";
+  href_Getter_(mthis) => href_Getter(mthis);
+
+  static method_Getter(mthis) native "SVGTextPathElement_method_Getter";
+  method_Getter_(mthis) => method_Getter(mthis);
+
+  static spacing_Getter(mthis) native "SVGTextPathElement_spacing_Getter";
+  spacing_Getter_(mthis) => spacing_Getter(mthis);
+
+  static startOffset_Getter(mthis) native "SVGTextPathElement_startOffset_Getter";
+  startOffset_Getter_(mthis) => startOffset_Getter(mthis);
+
 }
 
-class BlinkSVGTitleElement {}
+class BlinkSVGTextPositioningElement extends BlinkSVGTextContentElement {
+  static final instance = new BlinkSVGTextPositioningElement();
+
+  static dx_Getter(mthis) native "SVGTextPositioningElement_dx_Getter";
+  dx_Getter_(mthis) => dx_Getter(mthis);
+
+  static dy_Getter(mthis) native "SVGTextPositioningElement_dy_Getter";
+  dy_Getter_(mthis) => dy_Getter(mthis);
+
+  static rotate_Getter(mthis) native "SVGTextPositioningElement_rotate_Getter";
+  rotate_Getter_(mthis) => rotate_Getter(mthis);
+
+  static x_Getter(mthis) native "SVGTextPositioningElement_x_Getter";
+  x_Getter_(mthis) => x_Getter(mthis);
+
+  static y_Getter(mthis) native "SVGTextPositioningElement_y_Getter";
+  y_Getter_(mthis) => y_Getter(mthis);
+
+}
+
+class BlinkSVGTitleElement extends BlinkSVGElement {
+  static final instance = new BlinkSVGTitleElement();
+
+}
 
 class BlinkSVGTransform {
+  static final instance = new BlinkSVGTransform();
+
   static angle_Getter(mthis) native "SVGTransform_angle_Getter";
+  angle_Getter_(mthis) => angle_Getter(mthis);
 
   static matrix_Getter(mthis) native "SVGTransform_matrix_Getter";
+  matrix_Getter_(mthis) => matrix_Getter(mthis);
+
+  static setMatrix_Callback_0(mthis) native "SVGTransform_setMatrix_Callback";
+  setMatrix_Callback_0_(mthis) => setMatrix_Callback_0(mthis);
+
+  static setMatrix_Callback_1(mthis, __arg_0) native "SVGTransform_setMatrix_Callback";
+  setMatrix_Callback_1_(mthis, __arg_0) => setMatrix_Callback_1(mthis, __arg_0);
+
+  static setMatrix_Callback_2(mthis, __arg_0, __arg_1) native "SVGTransform_setMatrix_Callback";
+  setMatrix_Callback_2_(mthis, __arg_0, __arg_1) => setMatrix_Callback_2(mthis, __arg_0, __arg_1);
+
+  static setMatrix_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGTransform_setMatrix_Callback";
+  setMatrix_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => setMatrix_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static setRotate_Callback_1(mthis, __arg_0) native "SVGTransform_setRotate_Callback";
+  setRotate_Callback_1_(mthis, __arg_0) => setRotate_Callback_1(mthis, __arg_0);
+
+  static setRotate_Callback_2(mthis, __arg_0, __arg_1) native "SVGTransform_setRotate_Callback";
+  setRotate_Callback_2_(mthis, __arg_0, __arg_1) => setRotate_Callback_2(mthis, __arg_0, __arg_1);
+
+  static setRotate_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGTransform_setRotate_Callback";
+  setRotate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => setRotate_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static setRotate_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "SVGTransform_setRotate_Callback";
+  setRotate_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => setRotate_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static setRotate_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "SVGTransform_setRotate_Callback";
+  setRotate_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => setRotate_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static setScale_Callback_0(mthis) native "SVGTransform_setScale_Callback";
+  setScale_Callback_0_(mthis) => setScale_Callback_0(mthis);
+
+  static setScale_Callback_1(mthis, __arg_0) native "SVGTransform_setScale_Callback";
+  setScale_Callback_1_(mthis, __arg_0) => setScale_Callback_1(mthis, __arg_0);
+
+  static setScale_Callback_2(mthis, __arg_0, __arg_1) native "SVGTransform_setScale_Callback";
+  setScale_Callback_2_(mthis, __arg_0, __arg_1) => setScale_Callback_2(mthis, __arg_0, __arg_1);
+
+  static setScale_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGTransform_setScale_Callback";
+  setScale_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => setScale_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static setScale_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "SVGTransform_setScale_Callback";
+  setScale_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => setScale_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static setSkewX_Callback_0(mthis) native "SVGTransform_setSkewX_Callback";
+  setSkewX_Callback_0_(mthis) => setSkewX_Callback_0(mthis);
+
+  static setSkewX_Callback_1(mthis, __arg_0) native "SVGTransform_setSkewX_Callback";
+  setSkewX_Callback_1_(mthis, __arg_0) => setSkewX_Callback_1(mthis, __arg_0);
+
+  static setSkewX_Callback_2(mthis, __arg_0, __arg_1) native "SVGTransform_setSkewX_Callback";
+  setSkewX_Callback_2_(mthis, __arg_0, __arg_1) => setSkewX_Callback_2(mthis, __arg_0, __arg_1);
+
+  static setSkewX_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGTransform_setSkewX_Callback";
+  setSkewX_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => setSkewX_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static setSkewY_Callback_0(mthis) native "SVGTransform_setSkewY_Callback";
+  setSkewY_Callback_0_(mthis) => setSkewY_Callback_0(mthis);
+
+  static setSkewY_Callback_1(mthis, __arg_0) native "SVGTransform_setSkewY_Callback";
+  setSkewY_Callback_1_(mthis, __arg_0) => setSkewY_Callback_1(mthis, __arg_0);
+
+  static setSkewY_Callback_2(mthis, __arg_0, __arg_1) native "SVGTransform_setSkewY_Callback";
+  setSkewY_Callback_2_(mthis, __arg_0, __arg_1) => setSkewY_Callback_2(mthis, __arg_0, __arg_1);
+
+  static setSkewY_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGTransform_setSkewY_Callback";
+  setSkewY_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => setSkewY_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static setTranslate_Callback_0(mthis) native "SVGTransform_setTranslate_Callback";
+  setTranslate_Callback_0_(mthis) => setTranslate_Callback_0(mthis);
+
+  static setTranslate_Callback_1(mthis, __arg_0) native "SVGTransform_setTranslate_Callback";
+  setTranslate_Callback_1_(mthis, __arg_0) => setTranslate_Callback_1(mthis, __arg_0);
+
+  static setTranslate_Callback_2(mthis, __arg_0, __arg_1) native "SVGTransform_setTranslate_Callback";
+  setTranslate_Callback_2_(mthis, __arg_0, __arg_1) => setTranslate_Callback_2(mthis, __arg_0, __arg_1);
+
+  static setTranslate_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGTransform_setTranslate_Callback";
+  setTranslate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => setTranslate_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static setTranslate_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "SVGTransform_setTranslate_Callback";
+  setTranslate_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => setTranslate_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
 
   static type_Getter(mthis) native "SVGTransform_type_Getter";
+  type_Getter_(mthis) => type_Getter(mthis);
 
-  static setMatrix_Callback_1(mthis, matrix) native "SVGTransform_setMatrix_Callback";
-
-  static setRotate_Callback_3(mthis, angle, cx, cy) native "SVGTransform_setRotate_Callback";
-
-  static setScale_Callback_2(mthis, sx, sy) native "SVGTransform_setScale_Callback";
-
-  static setSkewX_Callback_1(mthis, angle) native "SVGTransform_setSkewX_Callback";
-
-  static setSkewY_Callback_1(mthis, angle) native "SVGTransform_setSkewY_Callback";
-
-  static setTranslate_Callback_2(mthis, tx, ty) native "SVGTransform_setTranslate_Callback";
 }
 
 class BlinkSVGTransformList {
+  static final instance = new BlinkSVGTransformList();
+
+  static $__getter___Callback_1(mthis, __arg_0) native "SVGTransformList___getter___Callback";
+  $__getter___Callback_1_(mthis, __arg_0) => $__getter___Callback_1(mthis, __arg_0);
+
+  static $__setter___Callback_2(mthis, __arg_0, __arg_1) native "SVGTransformList___setter___Callback";
+  $__setter___Callback_2_(mthis, __arg_0, __arg_1) => $__setter___Callback_2(mthis, __arg_0, __arg_1);
+
+  static appendItem_Callback_0(mthis) native "SVGTransformList_appendItem_Callback";
+  appendItem_Callback_0_(mthis) => appendItem_Callback_0(mthis);
+
+  static appendItem_Callback_1(mthis, __arg_0) native "SVGTransformList_appendItem_Callback";
+  appendItem_Callback_1_(mthis, __arg_0) => appendItem_Callback_1(mthis, __arg_0);
+
+  static appendItem_Callback_2(mthis, __arg_0, __arg_1) native "SVGTransformList_appendItem_Callback";
+  appendItem_Callback_2_(mthis, __arg_0, __arg_1) => appendItem_Callback_2(mthis, __arg_0, __arg_1);
+
+  static appendItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGTransformList_appendItem_Callback";
+  appendItem_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => appendItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static clear_Callback_0(mthis) native "SVGTransformList_clear_Callback";
+  clear_Callback_0_(mthis) => clear_Callback_0(mthis);
+
+  static clear_Callback_1(mthis, __arg_0) native "SVGTransformList_clear_Callback";
+  clear_Callback_1_(mthis, __arg_0) => clear_Callback_1(mthis, __arg_0);
+
+  static clear_Callback_2(mthis, __arg_0, __arg_1) native "SVGTransformList_clear_Callback";
+  clear_Callback_2_(mthis, __arg_0, __arg_1) => clear_Callback_2(mthis, __arg_0, __arg_1);
+
+  static consolidate_Callback_0(mthis) native "SVGTransformList_consolidate_Callback";
+  consolidate_Callback_0_(mthis) => consolidate_Callback_0(mthis);
+
+  static consolidate_Callback_1(mthis, __arg_0) native "SVGTransformList_consolidate_Callback";
+  consolidate_Callback_1_(mthis, __arg_0) => consolidate_Callback_1(mthis, __arg_0);
+
+  static consolidate_Callback_2(mthis, __arg_0, __arg_1) native "SVGTransformList_consolidate_Callback";
+  consolidate_Callback_2_(mthis, __arg_0, __arg_1) => consolidate_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createSVGTransformFromMatrix_Callback_0(mthis) native "SVGTransformList_createSVGTransformFromMatrix_Callback";
+  createSVGTransformFromMatrix_Callback_0_(mthis) => createSVGTransformFromMatrix_Callback_0(mthis);
+
+  static createSVGTransformFromMatrix_Callback_1(mthis, __arg_0) native "SVGTransformList_createSVGTransformFromMatrix_Callback";
+  createSVGTransformFromMatrix_Callback_1_(mthis, __arg_0) => createSVGTransformFromMatrix_Callback_1(mthis, __arg_0);
+
+  static createSVGTransformFromMatrix_Callback_2(mthis, __arg_0, __arg_1) native "SVGTransformList_createSVGTransformFromMatrix_Callback";
+  createSVGTransformFromMatrix_Callback_2_(mthis, __arg_0, __arg_1) => createSVGTransformFromMatrix_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createSVGTransformFromMatrix_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGTransformList_createSVGTransformFromMatrix_Callback";
+  createSVGTransformFromMatrix_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => createSVGTransformFromMatrix_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static getItem_Callback_0(mthis) native "SVGTransformList_getItem_Callback";
+  getItem_Callback_0_(mthis) => getItem_Callback_0(mthis);
+
+  static getItem_Callback_1(mthis, __arg_0) native "SVGTransformList_getItem_Callback";
+  getItem_Callback_1_(mthis, __arg_0) => getItem_Callback_1(mthis, __arg_0);
+
+  static getItem_Callback_2(mthis, __arg_0, __arg_1) native "SVGTransformList_getItem_Callback";
+  getItem_Callback_2_(mthis, __arg_0, __arg_1) => getItem_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGTransformList_getItem_Callback";
+  getItem_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static initialize_Callback_0(mthis) native "SVGTransformList_initialize_Callback";
+  initialize_Callback_0_(mthis) => initialize_Callback_0(mthis);
+
+  static initialize_Callback_1(mthis, __arg_0) native "SVGTransformList_initialize_Callback";
+  initialize_Callback_1_(mthis, __arg_0) => initialize_Callback_1(mthis, __arg_0);
+
+  static initialize_Callback_2(mthis, __arg_0, __arg_1) native "SVGTransformList_initialize_Callback";
+  initialize_Callback_2_(mthis, __arg_0, __arg_1) => initialize_Callback_2(mthis, __arg_0, __arg_1);
+
+  static initialize_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGTransformList_initialize_Callback";
+  initialize_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => initialize_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static insertItemBefore_Callback_0(mthis) native "SVGTransformList_insertItemBefore_Callback";
+  insertItemBefore_Callback_0_(mthis) => insertItemBefore_Callback_0(mthis);
+
+  static insertItemBefore_Callback_1(mthis, __arg_0) native "SVGTransformList_insertItemBefore_Callback";
+  insertItemBefore_Callback_1_(mthis, __arg_0) => insertItemBefore_Callback_1(mthis, __arg_0);
+
+  static insertItemBefore_Callback_2(mthis, __arg_0, __arg_1) native "SVGTransformList_insertItemBefore_Callback";
+  insertItemBefore_Callback_2_(mthis, __arg_0, __arg_1) => insertItemBefore_Callback_2(mthis, __arg_0, __arg_1);
+
+  static insertItemBefore_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGTransformList_insertItemBefore_Callback";
+  insertItemBefore_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => insertItemBefore_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static insertItemBefore_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "SVGTransformList_insertItemBefore_Callback";
+  insertItemBefore_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => insertItemBefore_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
   static length_Getter(mthis) native "SVGTransformList_length_Getter";
+  length_Getter_(mthis) => length_Getter(mthis);
 
   static numberOfItems_Getter(mthis) native "SVGTransformList_numberOfItems_Getter";
+  numberOfItems_Getter_(mthis) => numberOfItems_Getter(mthis);
 
-  static $__setter___Callback_2(mthis, index, value) native "SVGTransformList___setter___Callback";
+  static removeItem_Callback_0(mthis) native "SVGTransformList_removeItem_Callback";
+  removeItem_Callback_0_(mthis) => removeItem_Callback_0(mthis);
 
-  static appendItem_Callback_1(mthis, item) native "SVGTransformList_appendItem_Callback";
+  static removeItem_Callback_1(mthis, __arg_0) native "SVGTransformList_removeItem_Callback";
+  removeItem_Callback_1_(mthis, __arg_0) => removeItem_Callback_1(mthis, __arg_0);
 
-  static clear_Callback(mthis) native "SVGTransformList_clear_Callback";
+  static removeItem_Callback_2(mthis, __arg_0, __arg_1) native "SVGTransformList_removeItem_Callback";
+  removeItem_Callback_2_(mthis, __arg_0, __arg_1) => removeItem_Callback_2(mthis, __arg_0, __arg_1);
 
-  static consolidate_Callback(mthis) native "SVGTransformList_consolidate_Callback";
+  static removeItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGTransformList_removeItem_Callback";
+  removeItem_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => removeItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
-  static createSVGTransformFromMatrix_Callback_1(mthis, matrix) native "SVGTransformList_createSVGTransformFromMatrix_Callback";
+  static replaceItem_Callback_0(mthis) native "SVGTransformList_replaceItem_Callback";
+  replaceItem_Callback_0_(mthis) => replaceItem_Callback_0(mthis);
 
-  static getItem_Callback_1(mthis, index) native "SVGTransformList_getItem_Callback";
+  static replaceItem_Callback_1(mthis, __arg_0) native "SVGTransformList_replaceItem_Callback";
+  replaceItem_Callback_1_(mthis, __arg_0) => replaceItem_Callback_1(mthis, __arg_0);
 
-  static initialize_Callback_1(mthis, item) native "SVGTransformList_initialize_Callback";
+  static replaceItem_Callback_2(mthis, __arg_0, __arg_1) native "SVGTransformList_replaceItem_Callback";
+  replaceItem_Callback_2_(mthis, __arg_0, __arg_1) => replaceItem_Callback_2(mthis, __arg_0, __arg_1);
 
-  static insertItemBefore_Callback_2(mthis, item, index) native "SVGTransformList_insertItemBefore_Callback";
+  static replaceItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SVGTransformList_replaceItem_Callback";
+  replaceItem_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => replaceItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
-  static removeItem_Callback_1(mthis, index) native "SVGTransformList_removeItem_Callback";
+  static replaceItem_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "SVGTransformList_replaceItem_Callback";
+  replaceItem_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => replaceItem_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
 
-  static replaceItem_Callback_2(mthis, item, index) native "SVGTransformList_replaceItem_Callback";
 }
 
-class BlinkSVGUnitTypes {}
+class BlinkSVGUnitTypes {
+  static final instance = new BlinkSVGUnitTypes();
 
-class BlinkSVGUseElement {
+}
+
+class BlinkSVGUseElement extends BlinkSVGGraphicsElement {
+  static final instance = new BlinkSVGUseElement();
+
   static height_Getter(mthis) native "SVGUseElement_height_Getter";
-
-  static width_Getter(mthis) native "SVGUseElement_width_Getter";
-
-  static x_Getter(mthis) native "SVGUseElement_x_Getter";
-
-  static y_Getter(mthis) native "SVGUseElement_y_Getter";
+  height_Getter_(mthis) => height_Getter(mthis);
 
   static href_Getter(mthis) native "SVGUseElement_href_Getter";
+  href_Getter_(mthis) => href_Getter(mthis);
+
+  static width_Getter(mthis) native "SVGUseElement_width_Getter";
+  width_Getter_(mthis) => width_Getter(mthis);
+
+  static x_Getter(mthis) native "SVGUseElement_x_Getter";
+  x_Getter_(mthis) => x_Getter(mthis);
+
+  static y_Getter(mthis) native "SVGUseElement_y_Getter";
+  y_Getter_(mthis) => y_Getter(mthis);
+
 }
 
-class BlinkSVGVKernElement {}
+class BlinkSVGVKernElement extends BlinkSVGElement {
+  static final instance = new BlinkSVGVKernElement();
 
-class BlinkSVGViewElement {
-  static viewTarget_Getter(mthis) native "SVGViewElement_viewTarget_Getter";
+}
+
+class BlinkSVGViewElement extends BlinkSVGElement {
+  static final instance = new BlinkSVGViewElement();
 
   static preserveAspectRatio_Getter(mthis) native "SVGViewElement_preserveAspectRatio_Getter";
+  preserveAspectRatio_Getter_(mthis) => preserveAspectRatio_Getter(mthis);
 
   static viewBox_Getter(mthis) native "SVGViewElement_viewBox_Getter";
+  viewBox_Getter_(mthis) => viewBox_Getter(mthis);
+
+  static viewTarget_Getter(mthis) native "SVGViewElement_viewTarget_Getter";
+  viewTarget_Getter_(mthis) => viewTarget_Getter(mthis);
 
   static zoomAndPan_Getter(mthis) native "SVGViewElement_zoomAndPan_Getter";
+  zoomAndPan_Getter_(mthis) => zoomAndPan_Getter(mthis);
 
-  static zoomAndPan_Setter(mthis, value) native "SVGViewElement_zoomAndPan_Setter";
+  static zoomAndPan_Setter(mthis, __arg_0) native "SVGViewElement_zoomAndPan_Setter";
+  zoomAndPan_Setter_(mthis, __arg_0) => zoomAndPan_Setter(mthis, __arg_0);
+
 }
 
 class BlinkSVGViewSpec {
+  static final instance = new BlinkSVGViewSpec();
+
   static preserveAspectRatioString_Getter(mthis) native "SVGViewSpec_preserveAspectRatioString_Getter";
-
-  static transform_Getter(mthis) native "SVGViewSpec_transform_Getter";
-
-  static transformString_Getter(mthis) native "SVGViewSpec_transformString_Getter";
-
-  static viewBoxString_Getter(mthis) native "SVGViewSpec_viewBoxString_Getter";
-
-  static viewTarget_Getter(mthis) native "SVGViewSpec_viewTarget_Getter";
-
-  static viewTargetString_Getter(mthis) native "SVGViewSpec_viewTargetString_Getter";
+  preserveAspectRatioString_Getter_(mthis) => preserveAspectRatioString_Getter(mthis);
 
   static preserveAspectRatio_Getter(mthis) native "SVGViewSpec_preserveAspectRatio_Getter";
+  preserveAspectRatio_Getter_(mthis) => preserveAspectRatio_Getter(mthis);
+
+  static transformString_Getter(mthis) native "SVGViewSpec_transformString_Getter";
+  transformString_Getter_(mthis) => transformString_Getter(mthis);
+
+  static transform_Getter(mthis) native "SVGViewSpec_transform_Getter";
+  transform_Getter_(mthis) => transform_Getter(mthis);
+
+  static viewBoxString_Getter(mthis) native "SVGViewSpec_viewBoxString_Getter";
+  viewBoxString_Getter_(mthis) => viewBoxString_Getter(mthis);
 
   static viewBox_Getter(mthis) native "SVGViewSpec_viewBox_Getter";
+  viewBox_Getter_(mthis) => viewBox_Getter(mthis);
+
+  static viewTargetString_Getter(mthis) native "SVGViewSpec_viewTargetString_Getter";
+  viewTargetString_Getter_(mthis) => viewTargetString_Getter(mthis);
+
+  static viewTarget_Getter(mthis) native "SVGViewSpec_viewTarget_Getter";
+  viewTarget_Getter_(mthis) => viewTarget_Getter(mthis);
 
   static zoomAndPan_Getter(mthis) native "SVGViewSpec_zoomAndPan_Getter";
+  zoomAndPan_Getter_(mthis) => zoomAndPan_Getter(mthis);
 
-  static zoomAndPan_Setter(mthis, value) native "SVGViewSpec_zoomAndPan_Setter";
+  static zoomAndPan_Setter(mthis, __arg_0) native "SVGViewSpec_zoomAndPan_Setter";
+  zoomAndPan_Setter_(mthis, __arg_0) => zoomAndPan_Setter(mthis, __arg_0);
+
 }
 
-class BlinkSVGZoomEvent {
+class BlinkSVGZoomEvent extends BlinkUIEvent {
+  static final instance = new BlinkSVGZoomEvent();
+
   static newScale_Getter(mthis) native "SVGZoomEvent_newScale_Getter";
+  newScale_Getter_(mthis) => newScale_Getter(mthis);
 
   static newTranslate_Getter(mthis) native "SVGZoomEvent_newTranslate_Getter";
+  newTranslate_Getter_(mthis) => newTranslate_Getter(mthis);
 
   static previousScale_Getter(mthis) native "SVGZoomEvent_previousScale_Getter";
+  previousScale_Getter_(mthis) => previousScale_Getter(mthis);
 
   static previousTranslate_Getter(mthis) native "SVGZoomEvent_previousTranslate_Getter";
+  previousTranslate_Getter_(mthis) => previousTranslate_Getter(mthis);
 
   static zoomRectScreen_Getter(mthis) native "SVGZoomEvent_zoomRectScreen_Getter";
+  zoomRectScreen_Getter_(mthis) => zoomRectScreen_Getter(mthis);
+
 }
 
 class BlinkScreen {
+  static final instance = new BlinkScreen();
+
   static availHeight_Getter(mthis) native "Screen_availHeight_Getter";
+  availHeight_Getter_(mthis) => availHeight_Getter(mthis);
 
   static availLeft_Getter(mthis) native "Screen_availLeft_Getter";
+  availLeft_Getter_(mthis) => availLeft_Getter(mthis);
 
   static availTop_Getter(mthis) native "Screen_availTop_Getter";
+  availTop_Getter_(mthis) => availTop_Getter(mthis);
 
   static availWidth_Getter(mthis) native "Screen_availWidth_Getter";
+  availWidth_Getter_(mthis) => availWidth_Getter(mthis);
 
   static colorDepth_Getter(mthis) native "Screen_colorDepth_Getter";
+  colorDepth_Getter_(mthis) => colorDepth_Getter(mthis);
 
   static height_Getter(mthis) native "Screen_height_Getter";
+  height_Getter_(mthis) => height_Getter(mthis);
 
   static orientation_Getter(mthis) native "Screen_orientation_Getter";
+  orientation_Getter_(mthis) => orientation_Getter(mthis);
 
   static pixelDepth_Getter(mthis) native "Screen_pixelDepth_Getter";
+  pixelDepth_Getter_(mthis) => pixelDepth_Getter(mthis);
 
   static width_Getter(mthis) native "Screen_width_Getter";
+  width_Getter_(mthis) => width_Getter(mthis);
+
 }
 
-class BlinkScreenOrientation {
+class BlinkScreenOrientation extends BlinkEventTarget {
+  static final instance = new BlinkScreenOrientation();
+
   static angle_Getter(mthis) native "ScreenOrientation_angle_Getter";
+  angle_Getter_(mthis) => angle_Getter(mthis);
+
+  static lock_Callback_0(mthis) native "ScreenOrientation_lock_Callback";
+  lock_Callback_0_(mthis) => lock_Callback_0(mthis);
+
+  static lock_Callback_1(mthis, __arg_0) native "ScreenOrientation_lock_Callback";
+  lock_Callback_1_(mthis, __arg_0) => lock_Callback_1(mthis, __arg_0);
+
+  static lock_Callback_2(mthis, __arg_0, __arg_1) native "ScreenOrientation_lock_Callback";
+  lock_Callback_2_(mthis, __arg_0, __arg_1) => lock_Callback_2(mthis, __arg_0, __arg_1);
+
+  static lock_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "ScreenOrientation_lock_Callback";
+  lock_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => lock_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static onchange_Getter(mthis) native "ScreenOrientation_onchange_Getter";
+  onchange_Getter_(mthis) => onchange_Getter(mthis);
+
+  static onchange_Setter(mthis, __arg_0) native "ScreenOrientation_onchange_Setter";
+  onchange_Setter_(mthis, __arg_0) => onchange_Setter(mthis, __arg_0);
 
   static type_Getter(mthis) native "ScreenOrientation_type_Getter";
+  type_Getter_(mthis) => type_Getter(mthis);
 
-  static lock_Callback_1(mthis, orientation) native "ScreenOrientation_lock_Callback";
+  static unlock_Callback_0(mthis) native "ScreenOrientation_unlock_Callback";
+  unlock_Callback_0_(mthis) => unlock_Callback_0(mthis);
 
-  static unlock_Callback(mthis) native "ScreenOrientation_unlock_Callback";
+  static unlock_Callback_1(mthis, __arg_0) native "ScreenOrientation_unlock_Callback";
+  unlock_Callback_1_(mthis, __arg_0) => unlock_Callback_1(mthis, __arg_0);
+
+  static unlock_Callback_2(mthis, __arg_0, __arg_1) native "ScreenOrientation_unlock_Callback";
+  unlock_Callback_2_(mthis, __arg_0, __arg_1) => unlock_Callback_2(mthis, __arg_0, __arg_1);
+
 }
 
-class BlinkScriptProcessorNode {
+class BlinkScriptProcessorNode extends BlinkAudioNode {
+  static final instance = new BlinkScriptProcessorNode();
+
   static bufferSize_Getter(mthis) native "ScriptProcessorNode_bufferSize_Getter";
+  bufferSize_Getter_(mthis) => bufferSize_Getter(mthis);
 
-  static setEventListener_Callback_1(mthis, eventListener) native "ScriptProcessorNode_setEventListener_Callback";
+  static setEventListener_Callback_0(mthis) native "ScriptProcessorNode_setEventListener_Callback";
+  setEventListener_Callback_0_(mthis) => setEventListener_Callback_0(mthis);
+
+  static setEventListener_Callback_1(mthis, __arg_0) native "ScriptProcessorNode_setEventListener_Callback";
+  setEventListener_Callback_1_(mthis, __arg_0) => setEventListener_Callback_1(mthis, __arg_0);
+
+  static setEventListener_Callback_2(mthis, __arg_0, __arg_1) native "ScriptProcessorNode_setEventListener_Callback";
+  setEventListener_Callback_2_(mthis, __arg_0, __arg_1) => setEventListener_Callback_2(mthis, __arg_0, __arg_1);
+
+  static setEventListener_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "ScriptProcessorNode_setEventListener_Callback";
+  setEventListener_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => setEventListener_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
 }
 
-class BlinkSecurityPolicyViolationEvent {
-  static constructorCallback(type, options) native "SecurityPolicyViolationEvent_constructorCallback";
+class BlinkSecurityPolicyViolationEvent extends BlinkEvent {
+  static final instance = new BlinkSecurityPolicyViolationEvent();
 
   static blockedURI_Getter(mthis) native "SecurityPolicyViolationEvent_blockedURI_Getter";
+  blockedURI_Getter_(mthis) => blockedURI_Getter(mthis);
 
   static columnNumber_Getter(mthis) native "SecurityPolicyViolationEvent_columnNumber_Getter";
+  columnNumber_Getter_(mthis) => columnNumber_Getter(mthis);
+
+  static constructorCallback_2(__arg_0, __arg_1) native "SecurityPolicyViolationEvent_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
 
   static documentURI_Getter(mthis) native "SecurityPolicyViolationEvent_documentURI_Getter";
+  documentURI_Getter_(mthis) => documentURI_Getter(mthis);
 
   static effectiveDirective_Getter(mthis) native "SecurityPolicyViolationEvent_effectiveDirective_Getter";
+  effectiveDirective_Getter_(mthis) => effectiveDirective_Getter(mthis);
 
   static lineNumber_Getter(mthis) native "SecurityPolicyViolationEvent_lineNumber_Getter";
+  lineNumber_Getter_(mthis) => lineNumber_Getter(mthis);
 
   static originalPolicy_Getter(mthis) native "SecurityPolicyViolationEvent_originalPolicy_Getter";
+  originalPolicy_Getter_(mthis) => originalPolicy_Getter(mthis);
 
   static referrer_Getter(mthis) native "SecurityPolicyViolationEvent_referrer_Getter";
+  referrer_Getter_(mthis) => referrer_Getter(mthis);
 
   static sourceFile_Getter(mthis) native "SecurityPolicyViolationEvent_sourceFile_Getter";
+  sourceFile_Getter_(mthis) => sourceFile_Getter(mthis);
 
   static statusCode_Getter(mthis) native "SecurityPolicyViolationEvent_statusCode_Getter";
+  statusCode_Getter_(mthis) => statusCode_Getter(mthis);
 
   static violatedDirective_Getter(mthis) native "SecurityPolicyViolationEvent_violatedDirective_Getter";
+  violatedDirective_Getter_(mthis) => violatedDirective_Getter(mthis);
+
 }
 
 class BlinkSelection {
+  static final instance = new BlinkSelection();
+
+  static addRange_Callback_0(mthis) native "Selection_addRange_Callback";
+  addRange_Callback_0_(mthis) => addRange_Callback_0(mthis);
+
+  static addRange_Callback_1(mthis, __arg_0) native "Selection_addRange_Callback";
+  addRange_Callback_1_(mthis, __arg_0) => addRange_Callback_1(mthis, __arg_0);
+
+  static addRange_Callback_2(mthis, __arg_0, __arg_1) native "Selection_addRange_Callback";
+  addRange_Callback_2_(mthis, __arg_0, __arg_1) => addRange_Callback_2(mthis, __arg_0, __arg_1);
+
+  static addRange_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Selection_addRange_Callback";
+  addRange_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => addRange_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
   static anchorNode_Getter(mthis) native "Selection_anchorNode_Getter";
+  anchorNode_Getter_(mthis) => anchorNode_Getter(mthis);
 
   static anchorOffset_Getter(mthis) native "Selection_anchorOffset_Getter";
+  anchorOffset_Getter_(mthis) => anchorOffset_Getter(mthis);
 
   static baseNode_Getter(mthis) native "Selection_baseNode_Getter";
+  baseNode_Getter_(mthis) => baseNode_Getter(mthis);
 
   static baseOffset_Getter(mthis) native "Selection_baseOffset_Getter";
+  baseOffset_Getter_(mthis) => baseOffset_Getter(mthis);
+
+  static collapseToEnd_Callback_0(mthis) native "Selection_collapseToEnd_Callback";
+  collapseToEnd_Callback_0_(mthis) => collapseToEnd_Callback_0(mthis);
+
+  static collapseToEnd_Callback_1(mthis, __arg_0) native "Selection_collapseToEnd_Callback";
+  collapseToEnd_Callback_1_(mthis, __arg_0) => collapseToEnd_Callback_1(mthis, __arg_0);
+
+  static collapseToEnd_Callback_2(mthis, __arg_0, __arg_1) native "Selection_collapseToEnd_Callback";
+  collapseToEnd_Callback_2_(mthis, __arg_0, __arg_1) => collapseToEnd_Callback_2(mthis, __arg_0, __arg_1);
+
+  static collapseToStart_Callback_0(mthis) native "Selection_collapseToStart_Callback";
+  collapseToStart_Callback_0_(mthis) => collapseToStart_Callback_0(mthis);
+
+  static collapseToStart_Callback_1(mthis, __arg_0) native "Selection_collapseToStart_Callback";
+  collapseToStart_Callback_1_(mthis, __arg_0) => collapseToStart_Callback_1(mthis, __arg_0);
+
+  static collapseToStart_Callback_2(mthis, __arg_0, __arg_1) native "Selection_collapseToStart_Callback";
+  collapseToStart_Callback_2_(mthis, __arg_0, __arg_1) => collapseToStart_Callback_2(mthis, __arg_0, __arg_1);
+
+  static collapse_Callback_0(mthis) native "Selection_collapse_Callback";
+  collapse_Callback_0_(mthis) => collapse_Callback_0(mthis);
+
+  static collapse_Callback_1(mthis, __arg_0) native "Selection_collapse_Callback";
+  collapse_Callback_1_(mthis, __arg_0) => collapse_Callback_1(mthis, __arg_0);
+
+  static collapse_Callback_2(mthis, __arg_0, __arg_1) native "Selection_collapse_Callback";
+  collapse_Callback_2_(mthis, __arg_0, __arg_1) => collapse_Callback_2(mthis, __arg_0, __arg_1);
+
+  static collapse_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Selection_collapse_Callback";
+  collapse_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => collapse_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static collapse_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Selection_collapse_Callback";
+  collapse_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => collapse_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static containsNode_Callback_0(mthis) native "Selection_containsNode_Callback";
+  containsNode_Callback_0_(mthis) => containsNode_Callback_0(mthis);
+
+  static containsNode_Callback_1(mthis, __arg_0) native "Selection_containsNode_Callback";
+  containsNode_Callback_1_(mthis, __arg_0) => containsNode_Callback_1(mthis, __arg_0);
+
+  static containsNode_Callback_2(mthis, __arg_0, __arg_1) native "Selection_containsNode_Callback";
+  containsNode_Callback_2_(mthis, __arg_0, __arg_1) => containsNode_Callback_2(mthis, __arg_0, __arg_1);
+
+  static containsNode_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Selection_containsNode_Callback";
+  containsNode_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => containsNode_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static containsNode_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Selection_containsNode_Callback";
+  containsNode_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => containsNode_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static deleteFromDocument_Callback_0(mthis) native "Selection_deleteFromDocument_Callback";
+  deleteFromDocument_Callback_0_(mthis) => deleteFromDocument_Callback_0(mthis);
+
+  static deleteFromDocument_Callback_1(mthis, __arg_0) native "Selection_deleteFromDocument_Callback";
+  deleteFromDocument_Callback_1_(mthis, __arg_0) => deleteFromDocument_Callback_1(mthis, __arg_0);
+
+  static deleteFromDocument_Callback_2(mthis, __arg_0, __arg_1) native "Selection_deleteFromDocument_Callback";
+  deleteFromDocument_Callback_2_(mthis, __arg_0, __arg_1) => deleteFromDocument_Callback_2(mthis, __arg_0, __arg_1);
+
+  static empty_Callback_0(mthis) native "Selection_empty_Callback";
+  empty_Callback_0_(mthis) => empty_Callback_0(mthis);
+
+  static empty_Callback_1(mthis, __arg_0) native "Selection_empty_Callback";
+  empty_Callback_1_(mthis, __arg_0) => empty_Callback_1(mthis, __arg_0);
+
+  static empty_Callback_2(mthis, __arg_0, __arg_1) native "Selection_empty_Callback";
+  empty_Callback_2_(mthis, __arg_0, __arg_1) => empty_Callback_2(mthis, __arg_0, __arg_1);
+
+  static extend_Callback_0(mthis) native "Selection_extend_Callback";
+  extend_Callback_0_(mthis) => extend_Callback_0(mthis);
+
+  static extend_Callback_1(mthis, __arg_0) native "Selection_extend_Callback";
+  extend_Callback_1_(mthis, __arg_0) => extend_Callback_1(mthis, __arg_0);
+
+  static extend_Callback_2(mthis, __arg_0, __arg_1) native "Selection_extend_Callback";
+  extend_Callback_2_(mthis, __arg_0, __arg_1) => extend_Callback_2(mthis, __arg_0, __arg_1);
+
+  static extend_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Selection_extend_Callback";
+  extend_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => extend_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static extend_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Selection_extend_Callback";
+  extend_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => extend_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
 
   static extentNode_Getter(mthis) native "Selection_extentNode_Getter";
+  extentNode_Getter_(mthis) => extentNode_Getter(mthis);
 
   static extentOffset_Getter(mthis) native "Selection_extentOffset_Getter";
+  extentOffset_Getter_(mthis) => extentOffset_Getter(mthis);
 
   static focusNode_Getter(mthis) native "Selection_focusNode_Getter";
+  focusNode_Getter_(mthis) => focusNode_Getter(mthis);
 
   static focusOffset_Getter(mthis) native "Selection_focusOffset_Getter";
+  focusOffset_Getter_(mthis) => focusOffset_Getter(mthis);
+
+  static getRangeAt_Callback_0(mthis) native "Selection_getRangeAt_Callback";
+  getRangeAt_Callback_0_(mthis) => getRangeAt_Callback_0(mthis);
+
+  static getRangeAt_Callback_1(mthis, __arg_0) native "Selection_getRangeAt_Callback";
+  getRangeAt_Callback_1_(mthis, __arg_0) => getRangeAt_Callback_1(mthis, __arg_0);
+
+  static getRangeAt_Callback_2(mthis, __arg_0, __arg_1) native "Selection_getRangeAt_Callback";
+  getRangeAt_Callback_2_(mthis, __arg_0, __arg_1) => getRangeAt_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getRangeAt_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Selection_getRangeAt_Callback";
+  getRangeAt_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getRangeAt_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
   static isCollapsed_Getter(mthis) native "Selection_isCollapsed_Getter";
+  isCollapsed_Getter_(mthis) => isCollapsed_Getter(mthis);
+
+  static modify_Callback_0(mthis) native "Selection_modify_Callback";
+  modify_Callback_0_(mthis) => modify_Callback_0(mthis);
+
+  static modify_Callback_1(mthis, __arg_0) native "Selection_modify_Callback";
+  modify_Callback_1_(mthis, __arg_0) => modify_Callback_1(mthis, __arg_0);
+
+  static modify_Callback_2(mthis, __arg_0, __arg_1) native "Selection_modify_Callback";
+  modify_Callback_2_(mthis, __arg_0, __arg_1) => modify_Callback_2(mthis, __arg_0, __arg_1);
+
+  static modify_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Selection_modify_Callback";
+  modify_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => modify_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static modify_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Selection_modify_Callback";
+  modify_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => modify_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static modify_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "Selection_modify_Callback";
+  modify_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => modify_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
 
   static rangeCount_Getter(mthis) native "Selection_rangeCount_Getter";
+  rangeCount_Getter_(mthis) => rangeCount_Getter(mthis);
+
+  static removeAllRanges_Callback_0(mthis) native "Selection_removeAllRanges_Callback";
+  removeAllRanges_Callback_0_(mthis) => removeAllRanges_Callback_0(mthis);
+
+  static removeAllRanges_Callback_1(mthis, __arg_0) native "Selection_removeAllRanges_Callback";
+  removeAllRanges_Callback_1_(mthis, __arg_0) => removeAllRanges_Callback_1(mthis, __arg_0);
+
+  static removeAllRanges_Callback_2(mthis, __arg_0, __arg_1) native "Selection_removeAllRanges_Callback";
+  removeAllRanges_Callback_2_(mthis, __arg_0, __arg_1) => removeAllRanges_Callback_2(mthis, __arg_0, __arg_1);
+
+  static selectAllChildren_Callback_0(mthis) native "Selection_selectAllChildren_Callback";
+  selectAllChildren_Callback_0_(mthis) => selectAllChildren_Callback_0(mthis);
+
+  static selectAllChildren_Callback_1(mthis, __arg_0) native "Selection_selectAllChildren_Callback";
+  selectAllChildren_Callback_1_(mthis, __arg_0) => selectAllChildren_Callback_1(mthis, __arg_0);
+
+  static selectAllChildren_Callback_2(mthis, __arg_0, __arg_1) native "Selection_selectAllChildren_Callback";
+  selectAllChildren_Callback_2_(mthis, __arg_0, __arg_1) => selectAllChildren_Callback_2(mthis, __arg_0, __arg_1);
+
+  static selectAllChildren_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Selection_selectAllChildren_Callback";
+  selectAllChildren_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => selectAllChildren_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static setBaseAndExtent_Callback_0(mthis) native "Selection_setBaseAndExtent_Callback";
+  setBaseAndExtent_Callback_0_(mthis) => setBaseAndExtent_Callback_0(mthis);
+
+  static setBaseAndExtent_Callback_1(mthis, __arg_0) native "Selection_setBaseAndExtent_Callback";
+  setBaseAndExtent_Callback_1_(mthis, __arg_0) => setBaseAndExtent_Callback_1(mthis, __arg_0);
+
+  static setBaseAndExtent_Callback_2(mthis, __arg_0, __arg_1) native "Selection_setBaseAndExtent_Callback";
+  setBaseAndExtent_Callback_2_(mthis, __arg_0, __arg_1) => setBaseAndExtent_Callback_2(mthis, __arg_0, __arg_1);
+
+  static setBaseAndExtent_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Selection_setBaseAndExtent_Callback";
+  setBaseAndExtent_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => setBaseAndExtent_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static setBaseAndExtent_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Selection_setBaseAndExtent_Callback";
+  setBaseAndExtent_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => setBaseAndExtent_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static setBaseAndExtent_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "Selection_setBaseAndExtent_Callback";
+  setBaseAndExtent_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => setBaseAndExtent_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static setBaseAndExtent_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "Selection_setBaseAndExtent_Callback";
+  setBaseAndExtent_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => setBaseAndExtent_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static setPosition_Callback_0(mthis) native "Selection_setPosition_Callback";
+  setPosition_Callback_0_(mthis) => setPosition_Callback_0(mthis);
+
+  static setPosition_Callback_1(mthis, __arg_0) native "Selection_setPosition_Callback";
+  setPosition_Callback_1_(mthis, __arg_0) => setPosition_Callback_1(mthis, __arg_0);
+
+  static setPosition_Callback_2(mthis, __arg_0, __arg_1) native "Selection_setPosition_Callback";
+  setPosition_Callback_2_(mthis, __arg_0, __arg_1) => setPosition_Callback_2(mthis, __arg_0, __arg_1);
+
+  static setPosition_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Selection_setPosition_Callback";
+  setPosition_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => setPosition_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static setPosition_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Selection_setPosition_Callback";
+  setPosition_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => setPosition_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
 
   static type_Getter(mthis) native "Selection_type_Getter";
+  type_Getter_(mthis) => type_Getter(mthis);
 
-  static addRange_Callback_1(mthis, range) native "Selection_addRange_Callback";
-
-  static collapse_Callback_2(mthis, node, offset) native "Selection_collapse_Callback";
-
-  static collapse_Callback_1(mthis, node) native "Selection_collapse_Callback";
-
-  static collapseToEnd_Callback(mthis) native "Selection_collapseToEnd_Callback";
-
-  static collapseToStart_Callback(mthis) native "Selection_collapseToStart_Callback";
-
-  static containsNode_Callback_2(mthis, node, allowPartial) native "Selection_containsNode_Callback";
-
-  static deleteFromDocument_Callback(mthis) native "Selection_deleteFromDocument_Callback";
-
-  static empty_Callback(mthis) native "Selection_empty_Callback";
-
-  static extend_Callback_2(mthis, node, offset) native "Selection_extend_Callback";
-
-  static extend_Callback_1(mthis, node) native "Selection_extend_Callback";
-
-  static getRangeAt_Callback_1(mthis, index) native "Selection_getRangeAt_Callback";
-
-  static modify_Callback_3(mthis, alter, direction, granularity) native "Selection_modify_Callback";
-
-  static removeAllRanges_Callback(mthis) native "Selection_removeAllRanges_Callback";
-
-  static selectAllChildren_Callback_1(mthis, node) native "Selection_selectAllChildren_Callback";
-
-  static setBaseAndExtent_Callback_4(mthis, baseNode, baseOffset, extentNode, extentOffset) native "Selection_setBaseAndExtent_Callback";
-
-  static setPosition_Callback_2(mthis, node, offset) native "Selection_setPosition_Callback";
-
-  static setPosition_Callback_1(mthis, node) native "Selection_setPosition_Callback";
 }
 
-class BlinkServiceWorker {}
+class BlinkServiceWorker extends BlinkEventTarget {
+  static final instance = new BlinkServiceWorker();
+
+  static onerror_Getter(mthis) native "ServiceWorker_onerror_Getter";
+  onerror_Getter_(mthis) => onerror_Getter(mthis);
+
+  static onerror_Setter(mthis, __arg_0) native "ServiceWorker_onerror_Setter";
+  onerror_Setter_(mthis, __arg_0) => onerror_Setter(mthis, __arg_0);
+
+  static onstatechange_Getter(mthis) native "ServiceWorker_onstatechange_Getter";
+  onstatechange_Getter_(mthis) => onstatechange_Getter(mthis);
+
+  static onstatechange_Setter(mthis, __arg_0) native "ServiceWorker_onstatechange_Setter";
+  onstatechange_Setter_(mthis, __arg_0) => onstatechange_Setter(mthis, __arg_0);
+
+  static postMessage_Callback_0(mthis) native "ServiceWorker_postMessage_Callback";
+  postMessage_Callback_0_(mthis) => postMessage_Callback_0(mthis);
+
+  static postMessage_Callback_1(mthis, __arg_0) native "ServiceWorker_postMessage_Callback";
+  postMessage_Callback_1_(mthis, __arg_0) => postMessage_Callback_1(mthis, __arg_0);
+
+  static postMessage_Callback_2(mthis, __arg_0, __arg_1) native "ServiceWorker_postMessage_Callback";
+  postMessage_Callback_2_(mthis, __arg_0, __arg_1) => postMessage_Callback_2(mthis, __arg_0, __arg_1);
+
+  static postMessage_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "ServiceWorker_postMessage_Callback";
+  postMessage_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => postMessage_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static postMessage_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "ServiceWorker_postMessage_Callback";
+  postMessage_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => postMessage_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static scriptURL_Getter(mthis) native "ServiceWorker_scriptURL_Getter";
+  scriptURL_Getter_(mthis) => scriptURL_Getter(mthis);
+
+  static state_Getter(mthis) native "ServiceWorker_state_Getter";
+  state_Getter_(mthis) => state_Getter(mthis);
+
+}
 
 class BlinkServiceWorkerClient {
-  static id_Getter(mthis) native "ServiceWorkerClient_id_Getter";
+  static final instance = new BlinkServiceWorkerClient();
 
-  static postMessage_Callback_2(mthis, message, transfer) native "ServiceWorkerClient_postMessage_Callback";
+  static id_Getter(mthis) native "ServiceWorkerClient_id_Getter";
+  id_Getter_(mthis) => id_Getter(mthis);
+
+  static postMessage_Callback_0(mthis) native "ServiceWorkerClient_postMessage_Callback";
+  postMessage_Callback_0_(mthis) => postMessage_Callback_0(mthis);
+
+  static postMessage_Callback_1(mthis, __arg_0) native "ServiceWorkerClient_postMessage_Callback";
+  postMessage_Callback_1_(mthis, __arg_0) => postMessage_Callback_1(mthis, __arg_0);
+
+  static postMessage_Callback_2(mthis, __arg_0, __arg_1) native "ServiceWorkerClient_postMessage_Callback";
+  postMessage_Callback_2_(mthis, __arg_0, __arg_1) => postMessage_Callback_2(mthis, __arg_0, __arg_1);
+
+  static postMessage_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "ServiceWorkerClient_postMessage_Callback";
+  postMessage_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => postMessage_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static postMessage_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "ServiceWorkerClient_postMessage_Callback";
+  postMessage_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => postMessage_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
 }
 
 class BlinkServiceWorkerClients {
-  static getServiced_Callback(mthis) native "ServiceWorkerClients_getServiced_Callback";
+  static final instance = new BlinkServiceWorkerClients();
+
+  static getServiced_Callback_0(mthis) native "ServiceWorkerClients_getServiced_Callback";
+  getServiced_Callback_0_(mthis) => getServiced_Callback_0(mthis);
+
+  static getServiced_Callback_1(mthis, __arg_0) native "ServiceWorkerClients_getServiced_Callback";
+  getServiced_Callback_1_(mthis, __arg_0) => getServiced_Callback_1(mthis, __arg_0);
+
+  static getServiced_Callback_2(mthis, __arg_0, __arg_1) native "ServiceWorkerClients_getServiced_Callback";
+  getServiced_Callback_2_(mthis, __arg_0, __arg_1) => getServiced_Callback_2(mthis, __arg_0, __arg_1);
+
 }
 
 class BlinkServiceWorkerContainer {
+  static final instance = new BlinkServiceWorkerContainer();
+
   static active_Getter(mthis) native "ServiceWorkerContainer_active_Getter";
+  active_Getter_(mthis) => active_Getter(mthis);
 
   static controller_Getter(mthis) native "ServiceWorkerContainer_controller_Getter";
+  controller_Getter_(mthis) => controller_Getter(mthis);
 
   static installing_Getter(mthis) native "ServiceWorkerContainer_installing_Getter";
+  installing_Getter_(mthis) => installing_Getter(mthis);
 
   static ready_Getter(mthis) native "ServiceWorkerContainer_ready_Getter";
+  ready_Getter_(mthis) => ready_Getter(mthis);
+
+  static register_Callback_0(mthis) native "ServiceWorkerContainer_register_Callback";
+  register_Callback_0_(mthis) => register_Callback_0(mthis);
+
+  static register_Callback_1(mthis, __arg_0) native "ServiceWorkerContainer_register_Callback";
+  register_Callback_1_(mthis, __arg_0) => register_Callback_1(mthis, __arg_0);
+
+  static register_Callback_2(mthis, __arg_0, __arg_1) native "ServiceWorkerContainer_register_Callback";
+  register_Callback_2_(mthis, __arg_0, __arg_1) => register_Callback_2(mthis, __arg_0, __arg_1);
+
+  static register_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "ServiceWorkerContainer_register_Callback";
+  register_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => register_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static register_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "ServiceWorkerContainer_register_Callback";
+  register_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => register_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static unregister_Callback_0(mthis) native "ServiceWorkerContainer_unregister_Callback";
+  unregister_Callback_0_(mthis) => unregister_Callback_0(mthis);
+
+  static unregister_Callback_1(mthis, __arg_0) native "ServiceWorkerContainer_unregister_Callback";
+  unregister_Callback_1_(mthis, __arg_0) => unregister_Callback_1(mthis, __arg_0);
+
+  static unregister_Callback_2(mthis, __arg_0, __arg_1) native "ServiceWorkerContainer_unregister_Callback";
+  unregister_Callback_2_(mthis, __arg_0, __arg_1) => unregister_Callback_2(mthis, __arg_0, __arg_1);
+
+  static unregister_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "ServiceWorkerContainer_unregister_Callback";
+  unregister_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => unregister_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
   static waiting_Getter(mthis) native "ServiceWorkerContainer_waiting_Getter";
+  waiting_Getter_(mthis) => waiting_Getter(mthis);
 
-  static register_Callback_2(mthis, url, options) native "ServiceWorkerContainer_register_Callback";
-
-  static register_Callback_1(mthis, url) native "ServiceWorkerContainer_register_Callback";
-
-  static unregister_Callback_1(mthis, scope) native "ServiceWorkerContainer_unregister_Callback";
-
-  static unregister_Callback(mthis) native "ServiceWorkerContainer_unregister_Callback";
 }
 
-class BlinkServiceWorkerGlobalScope {
+class BlinkServiceWorkerGlobalScope extends BlinkWorkerGlobalScope {
+  static final instance = new BlinkServiceWorkerGlobalScope();
+
   static clients_Getter(mthis) native "ServiceWorkerGlobalScope_clients_Getter";
+  clients_Getter_(mthis) => clients_Getter(mthis);
+
+  static fetch_Callback_0(mthis) native "ServiceWorkerGlobalScope_fetch_Callback";
+  fetch_Callback_0_(mthis) => fetch_Callback_0(mthis);
+
+  static fetch_Callback_1(mthis, __arg_0) native "ServiceWorkerGlobalScope_fetch_Callback";
+  fetch_Callback_1_(mthis, __arg_0) => fetch_Callback_1(mthis, __arg_0);
+
+  static fetch_Callback_2(mthis, __arg_0, __arg_1) native "ServiceWorkerGlobalScope_fetch_Callback";
+  fetch_Callback_2_(mthis, __arg_0, __arg_1) => fetch_Callback_2(mthis, __arg_0, __arg_1);
+
+  static fetch_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "ServiceWorkerGlobalScope_fetch_Callback";
+  fetch_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => fetch_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static fetch_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "ServiceWorkerGlobalScope_fetch_Callback";
+  fetch_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => fetch_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
 
   static nativeCaches_Getter(mthis) native "ServiceWorkerGlobalScope_nativeCaches_Getter";
+  nativeCaches_Getter_(mthis) => nativeCaches_Getter(mthis);
+
+  static onactivate_Getter(mthis) native "ServiceWorkerGlobalScope_onactivate_Getter";
+  onactivate_Getter_(mthis) => onactivate_Getter(mthis);
+
+  static onactivate_Setter(mthis, __arg_0) native "ServiceWorkerGlobalScope_onactivate_Setter";
+  onactivate_Setter_(mthis, __arg_0) => onactivate_Setter(mthis, __arg_0);
+
+  static onfetch_Getter(mthis) native "ServiceWorkerGlobalScope_onfetch_Getter";
+  onfetch_Getter_(mthis) => onfetch_Getter(mthis);
+
+  static onfetch_Setter(mthis, __arg_0) native "ServiceWorkerGlobalScope_onfetch_Setter";
+  onfetch_Setter_(mthis, __arg_0) => onfetch_Setter(mthis, __arg_0);
+
+  static oninstall_Getter(mthis) native "ServiceWorkerGlobalScope_oninstall_Getter";
+  oninstall_Getter_(mthis) => oninstall_Getter(mthis);
+
+  static oninstall_Setter(mthis, __arg_0) native "ServiceWorkerGlobalScope_oninstall_Setter";
+  oninstall_Setter_(mthis, __arg_0) => oninstall_Setter(mthis, __arg_0);
+
+  static onmessage_Getter(mthis) native "ServiceWorkerGlobalScope_onmessage_Getter";
+  onmessage_Getter_(mthis) => onmessage_Getter(mthis);
+
+  static onmessage_Setter(mthis, __arg_0) native "ServiceWorkerGlobalScope_onmessage_Setter";
+  onmessage_Setter_(mthis, __arg_0) => onmessage_Setter(mthis, __arg_0);
+
+  static onpush_Getter(mthis) native "ServiceWorkerGlobalScope_onpush_Getter";
+  onpush_Getter_(mthis) => onpush_Getter(mthis);
+
+  static onpush_Setter(mthis, __arg_0) native "ServiceWorkerGlobalScope_onpush_Setter";
+  onpush_Setter_(mthis, __arg_0) => onpush_Setter(mthis, __arg_0);
+
+  static onsync_Getter(mthis) native "ServiceWorkerGlobalScope_onsync_Getter";
+  onsync_Getter_(mthis) => onsync_Getter(mthis);
+
+  static onsync_Setter(mthis, __arg_0) native "ServiceWorkerGlobalScope_onsync_Setter";
+  onsync_Setter_(mthis, __arg_0) => onsync_Setter(mthis, __arg_0);
 
   static scope_Getter(mthis) native "ServiceWorkerGlobalScope_scope_Getter";
+  scope_Getter_(mthis) => scope_Getter(mthis);
 
-  static fetch_Callback_1(mthis, request) native "ServiceWorkerGlobalScope_fetch_Callback";
-
-  static fetch_Callback_2(mthis, request, requestInitDict) native "ServiceWorkerGlobalScope_fetch_Callback";
 }
 
-class BlinkServiceWorkerRegistration {
+class BlinkServiceWorkerRegistration extends BlinkEventTarget {
+  static final instance = new BlinkServiceWorkerRegistration();
+
   static active_Getter(mthis) native "ServiceWorkerRegistration_active_Getter";
+  active_Getter_(mthis) => active_Getter(mthis);
 
   static installing_Getter(mthis) native "ServiceWorkerRegistration_installing_Getter";
+  installing_Getter_(mthis) => installing_Getter(mthis);
+
+  static onupdatefound_Getter(mthis) native "ServiceWorkerRegistration_onupdatefound_Getter";
+  onupdatefound_Getter_(mthis) => onupdatefound_Getter(mthis);
+
+  static onupdatefound_Setter(mthis, __arg_0) native "ServiceWorkerRegistration_onupdatefound_Setter";
+  onupdatefound_Setter_(mthis, __arg_0) => onupdatefound_Setter(mthis, __arg_0);
 
   static scope_Getter(mthis) native "ServiceWorkerRegistration_scope_Getter";
+  scope_Getter_(mthis) => scope_Getter(mthis);
+
+  static unregister_Callback_0(mthis) native "ServiceWorkerRegistration_unregister_Callback";
+  unregister_Callback_0_(mthis) => unregister_Callback_0(mthis);
+
+  static unregister_Callback_1(mthis, __arg_0) native "ServiceWorkerRegistration_unregister_Callback";
+  unregister_Callback_1_(mthis, __arg_0) => unregister_Callback_1(mthis, __arg_0);
+
+  static unregister_Callback_2(mthis, __arg_0, __arg_1) native "ServiceWorkerRegistration_unregister_Callback";
+  unregister_Callback_2_(mthis, __arg_0, __arg_1) => unregister_Callback_2(mthis, __arg_0, __arg_1);
 
   static waiting_Getter(mthis) native "ServiceWorkerRegistration_waiting_Getter";
+  waiting_Getter_(mthis) => waiting_Getter(mthis);
 
-  static unregister_Callback(mthis) native "ServiceWorkerRegistration_unregister_Callback";
 }
 
-class BlinkShadowRoot {
+class BlinkShadowRoot extends BlinkDocumentFragment {
+  static final instance = new BlinkShadowRoot();
+
   static activeElement_Getter(mthis) native "ShadowRoot_activeElement_Getter";
+  activeElement_Getter_(mthis) => activeElement_Getter(mthis);
+
+  static cloneNode_Callback_0(mthis) native "ShadowRoot_cloneNode_Callback";
+  cloneNode_Callback_0_(mthis) => cloneNode_Callback_0(mthis);
+
+  static cloneNode_Callback_1(mthis, __arg_0) native "ShadowRoot_cloneNode_Callback";
+  cloneNode_Callback_1_(mthis, __arg_0) => cloneNode_Callback_1(mthis, __arg_0);
+
+  static cloneNode_Callback_2(mthis, __arg_0, __arg_1) native "ShadowRoot_cloneNode_Callback";
+  cloneNode_Callback_2_(mthis, __arg_0, __arg_1) => cloneNode_Callback_2(mthis, __arg_0, __arg_1);
+
+  static cloneNode_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "ShadowRoot_cloneNode_Callback";
+  cloneNode_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => cloneNode_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static elementFromPoint_Callback_0(mthis) native "ShadowRoot_elementFromPoint_Callback";
+  elementFromPoint_Callback_0_(mthis) => elementFromPoint_Callback_0(mthis);
+
+  static elementFromPoint_Callback_1(mthis, __arg_0) native "ShadowRoot_elementFromPoint_Callback";
+  elementFromPoint_Callback_1_(mthis, __arg_0) => elementFromPoint_Callback_1(mthis, __arg_0);
+
+  static elementFromPoint_Callback_2(mthis, __arg_0, __arg_1) native "ShadowRoot_elementFromPoint_Callback";
+  elementFromPoint_Callback_2_(mthis, __arg_0, __arg_1) => elementFromPoint_Callback_2(mthis, __arg_0, __arg_1);
+
+  static elementFromPoint_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "ShadowRoot_elementFromPoint_Callback";
+  elementFromPoint_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => elementFromPoint_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static elementFromPoint_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "ShadowRoot_elementFromPoint_Callback";
+  elementFromPoint_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => elementFromPoint_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static getElementById_Callback_0(mthis) native "ShadowRoot_getElementById_Callback";
+  getElementById_Callback_0_(mthis) => getElementById_Callback_0(mthis);
+
+  static getElementById_Callback_1(mthis, __arg_0) native "ShadowRoot_getElementById_Callback";
+  getElementById_Callback_1_(mthis, __arg_0) => getElementById_Callback_1(mthis, __arg_0);
+
+  static getElementById_Callback_2(mthis, __arg_0, __arg_1) native "ShadowRoot_getElementById_Callback";
+  getElementById_Callback_2_(mthis, __arg_0, __arg_1) => getElementById_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getElementById_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "ShadowRoot_getElementById_Callback";
+  getElementById_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getElementById_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static getElementsByClassName_Callback_0(mthis) native "ShadowRoot_getElementsByClassName_Callback";
+  getElementsByClassName_Callback_0_(mthis) => getElementsByClassName_Callback_0(mthis);
+
+  static getElementsByClassName_Callback_1(mthis, __arg_0) native "ShadowRoot_getElementsByClassName_Callback";
+  getElementsByClassName_Callback_1_(mthis, __arg_0) => getElementsByClassName_Callback_1(mthis, __arg_0);
+
+  static getElementsByClassName_Callback_2(mthis, __arg_0, __arg_1) native "ShadowRoot_getElementsByClassName_Callback";
+  getElementsByClassName_Callback_2_(mthis, __arg_0, __arg_1) => getElementsByClassName_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getElementsByClassName_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "ShadowRoot_getElementsByClassName_Callback";
+  getElementsByClassName_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getElementsByClassName_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static getElementsByTagName_Callback_0(mthis) native "ShadowRoot_getElementsByTagName_Callback";
+  getElementsByTagName_Callback_0_(mthis) => getElementsByTagName_Callback_0(mthis);
+
+  static getElementsByTagName_Callback_1(mthis, __arg_0) native "ShadowRoot_getElementsByTagName_Callback";
+  getElementsByTagName_Callback_1_(mthis, __arg_0) => getElementsByTagName_Callback_1(mthis, __arg_0);
+
+  static getElementsByTagName_Callback_2(mthis, __arg_0, __arg_1) native "ShadowRoot_getElementsByTagName_Callback";
+  getElementsByTagName_Callback_2_(mthis, __arg_0, __arg_1) => getElementsByTagName_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getElementsByTagName_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "ShadowRoot_getElementsByTagName_Callback";
+  getElementsByTagName_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getElementsByTagName_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static getSelection_Callback_0(mthis) native "ShadowRoot_getSelection_Callback";
+  getSelection_Callback_0_(mthis) => getSelection_Callback_0(mthis);
+
+  static getSelection_Callback_1(mthis, __arg_0) native "ShadowRoot_getSelection_Callback";
+  getSelection_Callback_1_(mthis, __arg_0) => getSelection_Callback_1(mthis, __arg_0);
+
+  static getSelection_Callback_2(mthis, __arg_0, __arg_1) native "ShadowRoot_getSelection_Callback";
+  getSelection_Callback_2_(mthis, __arg_0, __arg_1) => getSelection_Callback_2(mthis, __arg_0, __arg_1);
 
   static host_Getter(mthis) native "ShadowRoot_host_Getter";
+  host_Getter_(mthis) => host_Getter(mthis);
 
   static innerHTML_Getter(mthis) native "ShadowRoot_innerHTML_Getter";
+  innerHTML_Getter_(mthis) => innerHTML_Getter(mthis);
 
-  static innerHTML_Setter(mthis, value) native "ShadowRoot_innerHTML_Setter";
+  static innerHTML_Setter(mthis, __arg_0) native "ShadowRoot_innerHTML_Setter";
+  innerHTML_Setter_(mthis, __arg_0) => innerHTML_Setter(mthis, __arg_0);
 
   static olderShadowRoot_Getter(mthis) native "ShadowRoot_olderShadowRoot_Getter";
+  olderShadowRoot_Getter_(mthis) => olderShadowRoot_Getter(mthis);
 
   static styleSheets_Getter(mthis) native "ShadowRoot_styleSheets_Getter";
+  styleSheets_Getter_(mthis) => styleSheets_Getter(mthis);
 
-  static cloneNode_Callback_1(mthis, deep) native "ShadowRoot_cloneNode_Callback";
-
-  static elementFromPoint_Callback_2(mthis, x, y) native "ShadowRoot_elementFromPoint_Callback";
-
-  static getElementById_Callback_1(mthis, elementId) native "ShadowRoot_getElementById_Callback";
-
-  static getElementsByClassName_Callback_1(mthis, className) native "ShadowRoot_getElementsByClassName_Callback";
-
-  static getElementsByTagName_Callback_1(mthis, tagName) native "ShadowRoot_getElementsByTagName_Callback";
-
-  static getSelection_Callback(mthis) native "ShadowRoot_getSelection_Callback";
 }
 
-class BlinkSharedWorker {
-  static constructorCallback_2(scriptURL, name) native "SharedWorker_constructorCallback";
+class BlinkSharedWorker extends BlinkEventTarget {
+  static final instance = new BlinkSharedWorker();
+
+  static constructorCallback_0() native "SharedWorker_constructorCallback";
+  constructorCallback_0_() => constructorCallback_0();
+
+  static constructorCallback_1(__arg_0) native "SharedWorker_constructorCallback";
+  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+
+  static constructorCallback_2(__arg_0, __arg_1) native "SharedWorker_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+
+  static constructorCallback_3(__arg_0, __arg_1, __arg_2) native "SharedWorker_constructorCallback";
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => constructorCallback_3(__arg_0, __arg_1, __arg_2);
+
+  static constructorCallback_4(__arg_0, __arg_1, __arg_2, __arg_3) native "SharedWorker_constructorCallback";
+  constructorCallback_4_(__arg_0, __arg_1, __arg_2, __arg_3) => constructorCallback_4(__arg_0, __arg_1, __arg_2, __arg_3);
+
+  static onerror_Getter(mthis) native "SharedWorker_onerror_Getter";
+  onerror_Getter_(mthis) => onerror_Getter(mthis);
+
+  static onerror_Setter(mthis, __arg_0) native "SharedWorker_onerror_Setter";
+  onerror_Setter_(mthis, __arg_0) => onerror_Setter(mthis, __arg_0);
 
   static port_Getter(mthis) native "SharedWorker_port_Getter";
+  port_Getter_(mthis) => port_Getter(mthis);
 
   static workerStart_Getter(mthis) native "SharedWorker_workerStart_Getter";
+  workerStart_Getter_(mthis) => workerStart_Getter(mthis);
+
 }
 
-class BlinkSharedWorkerGlobalScope {
+class BlinkSharedWorkerGlobalScope extends BlinkWorkerGlobalScope {
+  static final instance = new BlinkSharedWorkerGlobalScope();
+
   static name_Getter(mthis) native "SharedWorkerGlobalScope_name_Getter";
+  name_Getter_(mthis) => name_Getter(mthis);
+
+  static onconnect_Getter(mthis) native "SharedWorkerGlobalScope_onconnect_Getter";
+  onconnect_Getter_(mthis) => onconnect_Getter(mthis);
+
+  static onconnect_Setter(mthis, __arg_0) native "SharedWorkerGlobalScope_onconnect_Setter";
+  onconnect_Setter_(mthis, __arg_0) => onconnect_Setter(mthis, __arg_0);
+
 }
 
-class BlinkSourceBuffer {
-  static appendWindowEnd_Getter(mthis) native "SourceBuffer_appendWindowEnd_Getter";
+class BlinkSourceBuffer extends BlinkEventTarget {
+  static final instance = new BlinkSourceBuffer();
 
-  static appendWindowEnd_Setter(mthis, value) native "SourceBuffer_appendWindowEnd_Setter";
+  static abort_Callback_0(mthis) native "SourceBuffer_abort_Callback";
+  abort_Callback_0_(mthis) => abort_Callback_0(mthis);
+
+  static abort_Callback_1(mthis, __arg_0) native "SourceBuffer_abort_Callback";
+  abort_Callback_1_(mthis, __arg_0) => abort_Callback_1(mthis, __arg_0);
+
+  static abort_Callback_2(mthis, __arg_0, __arg_1) native "SourceBuffer_abort_Callback";
+  abort_Callback_2_(mthis, __arg_0, __arg_1) => abort_Callback_2(mthis, __arg_0, __arg_1);
+
+  static appendBuffer_Callback_0(mthis) native "SourceBuffer_appendBuffer_Callback";
+  appendBuffer_Callback_0_(mthis) => appendBuffer_Callback_0(mthis);
+
+  static appendBuffer_Callback_1(mthis, __arg_0) native "SourceBuffer_appendBuffer_Callback";
+  appendBuffer_Callback_1_(mthis, __arg_0) => appendBuffer_Callback_1(mthis, __arg_0);
+
+  static appendBuffer_Callback_2(mthis, __arg_0, __arg_1) native "SourceBuffer_appendBuffer_Callback";
+  appendBuffer_Callback_2_(mthis, __arg_0, __arg_1) => appendBuffer_Callback_2(mthis, __arg_0, __arg_1);
+
+  static appendBuffer_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SourceBuffer_appendBuffer_Callback";
+  appendBuffer_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => appendBuffer_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static appendStream_Callback_0(mthis) native "SourceBuffer_appendStream_Callback";
+  appendStream_Callback_0_(mthis) => appendStream_Callback_0(mthis);
+
+  static appendStream_Callback_1(mthis, __arg_0) native "SourceBuffer_appendStream_Callback";
+  appendStream_Callback_1_(mthis, __arg_0) => appendStream_Callback_1(mthis, __arg_0);
+
+  static appendStream_Callback_2(mthis, __arg_0, __arg_1) native "SourceBuffer_appendStream_Callback";
+  appendStream_Callback_2_(mthis, __arg_0, __arg_1) => appendStream_Callback_2(mthis, __arg_0, __arg_1);
+
+  static appendStream_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SourceBuffer_appendStream_Callback";
+  appendStream_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => appendStream_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static appendStream_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "SourceBuffer_appendStream_Callback";
+  appendStream_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => appendStream_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static appendWindowEnd_Getter(mthis) native "SourceBuffer_appendWindowEnd_Getter";
+  appendWindowEnd_Getter_(mthis) => appendWindowEnd_Getter(mthis);
+
+  static appendWindowEnd_Setter(mthis, __arg_0) native "SourceBuffer_appendWindowEnd_Setter";
+  appendWindowEnd_Setter_(mthis, __arg_0) => appendWindowEnd_Setter(mthis, __arg_0);
 
   static appendWindowStart_Getter(mthis) native "SourceBuffer_appendWindowStart_Getter";
+  appendWindowStart_Getter_(mthis) => appendWindowStart_Getter(mthis);
 
-  static appendWindowStart_Setter(mthis, value) native "SourceBuffer_appendWindowStart_Setter";
+  static appendWindowStart_Setter(mthis, __arg_0) native "SourceBuffer_appendWindowStart_Setter";
+  appendWindowStart_Setter_(mthis, __arg_0) => appendWindowStart_Setter(mthis, __arg_0);
 
   static buffered_Getter(mthis) native "SourceBuffer_buffered_Getter";
+  buffered_Getter_(mthis) => buffered_Getter(mthis);
 
   static mode_Getter(mthis) native "SourceBuffer_mode_Getter";
+  mode_Getter_(mthis) => mode_Getter(mthis);
 
-  static mode_Setter(mthis, value) native "SourceBuffer_mode_Setter";
+  static mode_Setter(mthis, __arg_0) native "SourceBuffer_mode_Setter";
+  mode_Setter_(mthis, __arg_0) => mode_Setter(mthis, __arg_0);
+
+  static remove_Callback_0(mthis) native "SourceBuffer_remove_Callback";
+  remove_Callback_0_(mthis) => remove_Callback_0(mthis);
+
+  static remove_Callback_1(mthis, __arg_0) native "SourceBuffer_remove_Callback";
+  remove_Callback_1_(mthis, __arg_0) => remove_Callback_1(mthis, __arg_0);
+
+  static remove_Callback_2(mthis, __arg_0, __arg_1) native "SourceBuffer_remove_Callback";
+  remove_Callback_2_(mthis, __arg_0, __arg_1) => remove_Callback_2(mthis, __arg_0, __arg_1);
+
+  static remove_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SourceBuffer_remove_Callback";
+  remove_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => remove_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static remove_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "SourceBuffer_remove_Callback";
+  remove_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => remove_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
 
   static timestampOffset_Getter(mthis) native "SourceBuffer_timestampOffset_Getter";
+  timestampOffset_Getter_(mthis) => timestampOffset_Getter(mthis);
 
-  static timestampOffset_Setter(mthis, value) native "SourceBuffer_timestampOffset_Setter";
+  static timestampOffset_Setter(mthis, __arg_0) native "SourceBuffer_timestampOffset_Setter";
+  timestampOffset_Setter_(mthis, __arg_0) => timestampOffset_Setter(mthis, __arg_0);
 
   static updating_Getter(mthis) native "SourceBuffer_updating_Getter";
+  updating_Getter_(mthis) => updating_Getter(mthis);
 
-  static abort_Callback(mthis) native "SourceBuffer_abort_Callback";
-
-  static appendBuffer_Callback_1(mthis, data) native "SourceBuffer_appendBuffer_Callback";
-
-  static appendStream_Callback_2(mthis, stream, maxSize) native "SourceBuffer_appendStream_Callback";
-
-  static appendStream_Callback_1(mthis, stream) native "SourceBuffer_appendStream_Callback";
-
-  static remove_Callback_2(mthis, start, end) native "SourceBuffer_remove_Callback";
 }
 
-class BlinkSourceBufferList {
-  static length_Getter(mthis) native "SourceBufferList_length_Getter";
+class BlinkSourceBufferList extends BlinkEventTarget {
+  static final instance = new BlinkSourceBufferList();
 
-  static item_Callback_1(mthis, index) native "SourceBufferList_item_Callback";
+  static $__getter___Callback_1(mthis, __arg_0) native "SourceBufferList___getter___Callback";
+  $__getter___Callback_1_(mthis, __arg_0) => $__getter___Callback_1(mthis, __arg_0);
+
+  static item_Callback_0(mthis) native "SourceBufferList_item_Callback";
+  item_Callback_0_(mthis) => item_Callback_0(mthis);
+
+  static item_Callback_1(mthis, __arg_0) native "SourceBufferList_item_Callback";
+  item_Callback_1_(mthis, __arg_0) => item_Callback_1(mthis, __arg_0);
+
+  static item_Callback_2(mthis, __arg_0, __arg_1) native "SourceBufferList_item_Callback";
+  item_Callback_2_(mthis, __arg_0, __arg_1) => item_Callback_2(mthis, __arg_0, __arg_1);
+
+  static item_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SourceBufferList_item_Callback";
+  item_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => item_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static length_Getter(mthis) native "SourceBufferList_length_Getter";
+  length_Getter_(mthis) => length_Getter(mthis);
+
 }
 
 class BlinkSourceInfo {
+  static final instance = new BlinkSourceInfo();
+
   static facing_Getter(mthis) native "SourceInfo_facing_Getter";
+  facing_Getter_(mthis) => facing_Getter(mthis);
 
   static id_Getter(mthis) native "SourceInfo_id_Getter";
+  id_Getter_(mthis) => id_Getter(mthis);
 
   static kind_Getter(mthis) native "SourceInfo_kind_Getter";
+  kind_Getter_(mthis) => kind_Getter(mthis);
 
   static label_Getter(mthis) native "SourceInfo_label_Getter";
+  label_Getter_(mthis) => label_Getter(mthis);
+
 }
 
 class BlinkSpeechGrammar {
-  static constructorCallback() native "SpeechGrammar_constructorCallback";
+  static final instance = new BlinkSpeechGrammar();
+
+  static constructorCallback_0() native "SpeechGrammar_constructorCallback";
+  constructorCallback_0_() => constructorCallback_0();
+
+  static constructorCallback_1(__arg_0) native "SpeechGrammar_constructorCallback";
+  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+
+  static constructorCallback_2(__arg_0, __arg_1) native "SpeechGrammar_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
 
   static src_Getter(mthis) native "SpeechGrammar_src_Getter";
+  src_Getter_(mthis) => src_Getter(mthis);
 
-  static src_Setter(mthis, value) native "SpeechGrammar_src_Setter";
+  static src_Setter(mthis, __arg_0) native "SpeechGrammar_src_Setter";
+  src_Setter_(mthis, __arg_0) => src_Setter(mthis, __arg_0);
 
   static weight_Getter(mthis) native "SpeechGrammar_weight_Getter";
+  weight_Getter_(mthis) => weight_Getter(mthis);
 
-  static weight_Setter(mthis, value) native "SpeechGrammar_weight_Setter";
+  static weight_Setter(mthis, __arg_0) native "SpeechGrammar_weight_Setter";
+  weight_Setter_(mthis, __arg_0) => weight_Setter(mthis, __arg_0);
+
 }
 
 class BlinkSpeechGrammarList {
-  static constructorCallback() native "SpeechGrammarList_constructorCallback";
+  static final instance = new BlinkSpeechGrammarList();
+
+  static $__getter___Callback_1(mthis, __arg_0) native "SpeechGrammarList___getter___Callback";
+  $__getter___Callback_1_(mthis, __arg_0) => $__getter___Callback_1(mthis, __arg_0);
+
+  static addFromString_Callback_0(mthis) native "SpeechGrammarList_addFromString_Callback";
+  addFromString_Callback_0_(mthis) => addFromString_Callback_0(mthis);
+
+  static addFromString_Callback_1(mthis, __arg_0) native "SpeechGrammarList_addFromString_Callback";
+  addFromString_Callback_1_(mthis, __arg_0) => addFromString_Callback_1(mthis, __arg_0);
+
+  static addFromString_Callback_2(mthis, __arg_0, __arg_1) native "SpeechGrammarList_addFromString_Callback";
+  addFromString_Callback_2_(mthis, __arg_0, __arg_1) => addFromString_Callback_2(mthis, __arg_0, __arg_1);
+
+  static addFromString_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SpeechGrammarList_addFromString_Callback";
+  addFromString_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => addFromString_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static addFromString_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "SpeechGrammarList_addFromString_Callback";
+  addFromString_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => addFromString_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static addFromUri_Callback_0(mthis) native "SpeechGrammarList_addFromUri_Callback";
+  addFromUri_Callback_0_(mthis) => addFromUri_Callback_0(mthis);
+
+  static addFromUri_Callback_1(mthis, __arg_0) native "SpeechGrammarList_addFromUri_Callback";
+  addFromUri_Callback_1_(mthis, __arg_0) => addFromUri_Callback_1(mthis, __arg_0);
+
+  static addFromUri_Callback_2(mthis, __arg_0, __arg_1) native "SpeechGrammarList_addFromUri_Callback";
+  addFromUri_Callback_2_(mthis, __arg_0, __arg_1) => addFromUri_Callback_2(mthis, __arg_0, __arg_1);
+
+  static addFromUri_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SpeechGrammarList_addFromUri_Callback";
+  addFromUri_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => addFromUri_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static addFromUri_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "SpeechGrammarList_addFromUri_Callback";
+  addFromUri_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => addFromUri_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static constructorCallback_0() native "SpeechGrammarList_constructorCallback";
+  constructorCallback_0_() => constructorCallback_0();
+
+  static constructorCallback_1(__arg_0) native "SpeechGrammarList_constructorCallback";
+  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+
+  static constructorCallback_2(__arg_0, __arg_1) native "SpeechGrammarList_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+
+  static item_Callback_0(mthis) native "SpeechGrammarList_item_Callback";
+  item_Callback_0_(mthis) => item_Callback_0(mthis);
+
+  static item_Callback_1(mthis, __arg_0) native "SpeechGrammarList_item_Callback";
+  item_Callback_1_(mthis, __arg_0) => item_Callback_1(mthis, __arg_0);
+
+  static item_Callback_2(mthis, __arg_0, __arg_1) native "SpeechGrammarList_item_Callback";
+  item_Callback_2_(mthis, __arg_0, __arg_1) => item_Callback_2(mthis, __arg_0, __arg_1);
+
+  static item_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SpeechGrammarList_item_Callback";
+  item_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => item_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
   static length_Getter(mthis) native "SpeechGrammarList_length_Getter";
+  length_Getter_(mthis) => length_Getter(mthis);
 
-  static addFromString_Callback_2(mthis, string, weight) native "SpeechGrammarList_addFromString_Callback";
-
-  static addFromString_Callback_1(mthis, string) native "SpeechGrammarList_addFromString_Callback";
-
-  static addFromUri_Callback_2(mthis, src, weight) native "SpeechGrammarList_addFromUri_Callback";
-
-  static addFromUri_Callback_1(mthis, src) native "SpeechGrammarList_addFromUri_Callback";
-
-  static item_Callback_1(mthis, index) native "SpeechGrammarList_item_Callback";
 }
 
-class BlinkSpeechRecognition {
-  static constructorCallback() native "SpeechRecognition_constructorCallback";
+class BlinkSpeechRecognition extends BlinkEventTarget {
+  static final instance = new BlinkSpeechRecognition();
+
+  static abort_Callback_0(mthis) native "SpeechRecognition_abort_Callback";
+  abort_Callback_0_(mthis) => abort_Callback_0(mthis);
+
+  static abort_Callback_1(mthis, __arg_0) native "SpeechRecognition_abort_Callback";
+  abort_Callback_1_(mthis, __arg_0) => abort_Callback_1(mthis, __arg_0);
+
+  static abort_Callback_2(mthis, __arg_0, __arg_1) native "SpeechRecognition_abort_Callback";
+  abort_Callback_2_(mthis, __arg_0, __arg_1) => abort_Callback_2(mthis, __arg_0, __arg_1);
+
+  static constructorCallback_0() native "SpeechRecognition_constructorCallback";
+  constructorCallback_0_() => constructorCallback_0();
+
+  static constructorCallback_1(__arg_0) native "SpeechRecognition_constructorCallback";
+  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+
+  static constructorCallback_2(__arg_0, __arg_1) native "SpeechRecognition_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
 
   static continuous_Getter(mthis) native "SpeechRecognition_continuous_Getter";
+  continuous_Getter_(mthis) => continuous_Getter(mthis);
 
-  static continuous_Setter(mthis, value) native "SpeechRecognition_continuous_Setter";
+  static continuous_Setter(mthis, __arg_0) native "SpeechRecognition_continuous_Setter";
+  continuous_Setter_(mthis, __arg_0) => continuous_Setter(mthis, __arg_0);
 
   static grammars_Getter(mthis) native "SpeechRecognition_grammars_Getter";
+  grammars_Getter_(mthis) => grammars_Getter(mthis);
 
-  static grammars_Setter(mthis, value) native "SpeechRecognition_grammars_Setter";
+  static grammars_Setter(mthis, __arg_0) native "SpeechRecognition_grammars_Setter";
+  grammars_Setter_(mthis, __arg_0) => grammars_Setter(mthis, __arg_0);
 
   static interimResults_Getter(mthis) native "SpeechRecognition_interimResults_Getter";
+  interimResults_Getter_(mthis) => interimResults_Getter(mthis);
 
-  static interimResults_Setter(mthis, value) native "SpeechRecognition_interimResults_Setter";
+  static interimResults_Setter(mthis, __arg_0) native "SpeechRecognition_interimResults_Setter";
+  interimResults_Setter_(mthis, __arg_0) => interimResults_Setter(mthis, __arg_0);
 
   static lang_Getter(mthis) native "SpeechRecognition_lang_Getter";
+  lang_Getter_(mthis) => lang_Getter(mthis);
 
-  static lang_Setter(mthis, value) native "SpeechRecognition_lang_Setter";
+  static lang_Setter(mthis, __arg_0) native "SpeechRecognition_lang_Setter";
+  lang_Setter_(mthis, __arg_0) => lang_Setter(mthis, __arg_0);
 
   static maxAlternatives_Getter(mthis) native "SpeechRecognition_maxAlternatives_Getter";
+  maxAlternatives_Getter_(mthis) => maxAlternatives_Getter(mthis);
 
-  static maxAlternatives_Setter(mthis, value) native "SpeechRecognition_maxAlternatives_Setter";
+  static maxAlternatives_Setter(mthis, __arg_0) native "SpeechRecognition_maxAlternatives_Setter";
+  maxAlternatives_Setter_(mthis, __arg_0) => maxAlternatives_Setter(mthis, __arg_0);
 
-  static abort_Callback(mthis) native "SpeechRecognition_abort_Callback";
+  static onaudioend_Getter(mthis) native "SpeechRecognition_onaudioend_Getter";
+  onaudioend_Getter_(mthis) => onaudioend_Getter(mthis);
 
-  static start_Callback(mthis) native "SpeechRecognition_start_Callback";
+  static onaudioend_Setter(mthis, __arg_0) native "SpeechRecognition_onaudioend_Setter";
+  onaudioend_Setter_(mthis, __arg_0) => onaudioend_Setter(mthis, __arg_0);
 
-  static stop_Callback(mthis) native "SpeechRecognition_stop_Callback";
+  static onaudiostart_Getter(mthis) native "SpeechRecognition_onaudiostart_Getter";
+  onaudiostart_Getter_(mthis) => onaudiostart_Getter(mthis);
+
+  static onaudiostart_Setter(mthis, __arg_0) native "SpeechRecognition_onaudiostart_Setter";
+  onaudiostart_Setter_(mthis, __arg_0) => onaudiostart_Setter(mthis, __arg_0);
+
+  static onend_Getter(mthis) native "SpeechRecognition_onend_Getter";
+  onend_Getter_(mthis) => onend_Getter(mthis);
+
+  static onend_Setter(mthis, __arg_0) native "SpeechRecognition_onend_Setter";
+  onend_Setter_(mthis, __arg_0) => onend_Setter(mthis, __arg_0);
+
+  static onerror_Getter(mthis) native "SpeechRecognition_onerror_Getter";
+  onerror_Getter_(mthis) => onerror_Getter(mthis);
+
+  static onerror_Setter(mthis, __arg_0) native "SpeechRecognition_onerror_Setter";
+  onerror_Setter_(mthis, __arg_0) => onerror_Setter(mthis, __arg_0);
+
+  static onnomatch_Getter(mthis) native "SpeechRecognition_onnomatch_Getter";
+  onnomatch_Getter_(mthis) => onnomatch_Getter(mthis);
+
+  static onnomatch_Setter(mthis, __arg_0) native "SpeechRecognition_onnomatch_Setter";
+  onnomatch_Setter_(mthis, __arg_0) => onnomatch_Setter(mthis, __arg_0);
+
+  static onresult_Getter(mthis) native "SpeechRecognition_onresult_Getter";
+  onresult_Getter_(mthis) => onresult_Getter(mthis);
+
+  static onresult_Setter(mthis, __arg_0) native "SpeechRecognition_onresult_Setter";
+  onresult_Setter_(mthis, __arg_0) => onresult_Setter(mthis, __arg_0);
+
+  static onsoundend_Getter(mthis) native "SpeechRecognition_onsoundend_Getter";
+  onsoundend_Getter_(mthis) => onsoundend_Getter(mthis);
+
+  static onsoundend_Setter(mthis, __arg_0) native "SpeechRecognition_onsoundend_Setter";
+  onsoundend_Setter_(mthis, __arg_0) => onsoundend_Setter(mthis, __arg_0);
+
+  static onsoundstart_Getter(mthis) native "SpeechRecognition_onsoundstart_Getter";
+  onsoundstart_Getter_(mthis) => onsoundstart_Getter(mthis);
+
+  static onsoundstart_Setter(mthis, __arg_0) native "SpeechRecognition_onsoundstart_Setter";
+  onsoundstart_Setter_(mthis, __arg_0) => onsoundstart_Setter(mthis, __arg_0);
+
+  static onspeechend_Getter(mthis) native "SpeechRecognition_onspeechend_Getter";
+  onspeechend_Getter_(mthis) => onspeechend_Getter(mthis);
+
+  static onspeechend_Setter(mthis, __arg_0) native "SpeechRecognition_onspeechend_Setter";
+  onspeechend_Setter_(mthis, __arg_0) => onspeechend_Setter(mthis, __arg_0);
+
+  static onspeechstart_Getter(mthis) native "SpeechRecognition_onspeechstart_Getter";
+  onspeechstart_Getter_(mthis) => onspeechstart_Getter(mthis);
+
+  static onspeechstart_Setter(mthis, __arg_0) native "SpeechRecognition_onspeechstart_Setter";
+  onspeechstart_Setter_(mthis, __arg_0) => onspeechstart_Setter(mthis, __arg_0);
+
+  static onstart_Getter(mthis) native "SpeechRecognition_onstart_Getter";
+  onstart_Getter_(mthis) => onstart_Getter(mthis);
+
+  static onstart_Setter(mthis, __arg_0) native "SpeechRecognition_onstart_Setter";
+  onstart_Setter_(mthis, __arg_0) => onstart_Setter(mthis, __arg_0);
+
+  static start_Callback_0(mthis) native "SpeechRecognition_start_Callback";
+  start_Callback_0_(mthis) => start_Callback_0(mthis);
+
+  static start_Callback_1(mthis, __arg_0) native "SpeechRecognition_start_Callback";
+  start_Callback_1_(mthis, __arg_0) => start_Callback_1(mthis, __arg_0);
+
+  static start_Callback_2(mthis, __arg_0, __arg_1) native "SpeechRecognition_start_Callback";
+  start_Callback_2_(mthis, __arg_0, __arg_1) => start_Callback_2(mthis, __arg_0, __arg_1);
+
+  static stop_Callback_0(mthis) native "SpeechRecognition_stop_Callback";
+  stop_Callback_0_(mthis) => stop_Callback_0(mthis);
+
+  static stop_Callback_1(mthis, __arg_0) native "SpeechRecognition_stop_Callback";
+  stop_Callback_1_(mthis, __arg_0) => stop_Callback_1(mthis, __arg_0);
+
+  static stop_Callback_2(mthis, __arg_0, __arg_1) native "SpeechRecognition_stop_Callback";
+  stop_Callback_2_(mthis, __arg_0, __arg_1) => stop_Callback_2(mthis, __arg_0, __arg_1);
+
 }
 
 class BlinkSpeechRecognitionAlternative {
+  static final instance = new BlinkSpeechRecognitionAlternative();
+
   static confidence_Getter(mthis) native "SpeechRecognitionAlternative_confidence_Getter";
+  confidence_Getter_(mthis) => confidence_Getter(mthis);
 
   static transcript_Getter(mthis) native "SpeechRecognitionAlternative_transcript_Getter";
+  transcript_Getter_(mthis) => transcript_Getter(mthis);
+
 }
 
-class BlinkSpeechRecognitionError {
-  static constructorCallback(type, options) native "SpeechRecognitionError_constructorCallback";
+class BlinkSpeechRecognitionError extends BlinkEvent {
+  static final instance = new BlinkSpeechRecognitionError();
+
+  static constructorCallback_2(__arg_0, __arg_1) native "SpeechRecognitionError_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
 
   static error_Getter(mthis) native "SpeechRecognitionError_error_Getter";
+  error_Getter_(mthis) => error_Getter(mthis);
 
   static message_Getter(mthis) native "SpeechRecognitionError_message_Getter";
+  message_Getter_(mthis) => message_Getter(mthis);
+
 }
 
-class BlinkSpeechRecognitionEvent {
-  static constructorCallback(type, options) native "SpeechRecognitionEvent_constructorCallback";
+class BlinkSpeechRecognitionEvent extends BlinkEvent {
+  static final instance = new BlinkSpeechRecognitionEvent();
+
+  static constructorCallback_2(__arg_0, __arg_1) native "SpeechRecognitionEvent_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
 
   static emma_Getter(mthis) native "SpeechRecognitionEvent_emma_Getter";
+  emma_Getter_(mthis) => emma_Getter(mthis);
 
   static interpretation_Getter(mthis) native "SpeechRecognitionEvent_interpretation_Getter";
+  interpretation_Getter_(mthis) => interpretation_Getter(mthis);
 
   static resultIndex_Getter(mthis) native "SpeechRecognitionEvent_resultIndex_Getter";
+  resultIndex_Getter_(mthis) => resultIndex_Getter(mthis);
 
   static results_Getter(mthis) native "SpeechRecognitionEvent_results_Getter";
+  results_Getter_(mthis) => results_Getter(mthis);
+
 }
 
 class BlinkSpeechRecognitionResult {
+  static final instance = new BlinkSpeechRecognitionResult();
+
+  static $__getter___Callback_1(mthis, __arg_0) native "SpeechRecognitionResult___getter___Callback";
+  $__getter___Callback_1_(mthis, __arg_0) => $__getter___Callback_1(mthis, __arg_0);
+
   static isFinal_Getter(mthis) native "SpeechRecognitionResult_isFinal_Getter";
+  isFinal_Getter_(mthis) => isFinal_Getter(mthis);
+
+  static item_Callback_0(mthis) native "SpeechRecognitionResult_item_Callback";
+  item_Callback_0_(mthis) => item_Callback_0(mthis);
+
+  static item_Callback_1(mthis, __arg_0) native "SpeechRecognitionResult_item_Callback";
+  item_Callback_1_(mthis, __arg_0) => item_Callback_1(mthis, __arg_0);
+
+  static item_Callback_2(mthis, __arg_0, __arg_1) native "SpeechRecognitionResult_item_Callback";
+  item_Callback_2_(mthis, __arg_0, __arg_1) => item_Callback_2(mthis, __arg_0, __arg_1);
+
+  static item_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SpeechRecognitionResult_item_Callback";
+  item_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => item_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
   static length_Getter(mthis) native "SpeechRecognitionResult_length_Getter";
+  length_Getter_(mthis) => length_Getter(mthis);
 
-  static item_Callback_1(mthis, index) native "SpeechRecognitionResult_item_Callback";
 }
 
 class BlinkSpeechRecognitionResultList {
-  static length_Getter(mthis) native "SpeechRecognitionResultList_length_Getter";
+  static final instance = new BlinkSpeechRecognitionResultList();
 
-  static item_Callback_1(mthis, index) native "SpeechRecognitionResultList_item_Callback";
+  static $__getter___Callback_1(mthis, __arg_0) native "SpeechRecognitionResultList___getter___Callback";
+  $__getter___Callback_1_(mthis, __arg_0) => $__getter___Callback_1(mthis, __arg_0);
+
+  static item_Callback_0(mthis) native "SpeechRecognitionResultList_item_Callback";
+  item_Callback_0_(mthis) => item_Callback_0(mthis);
+
+  static item_Callback_1(mthis, __arg_0) native "SpeechRecognitionResultList_item_Callback";
+  item_Callback_1_(mthis, __arg_0) => item_Callback_1(mthis, __arg_0);
+
+  static item_Callback_2(mthis, __arg_0, __arg_1) native "SpeechRecognitionResultList_item_Callback";
+  item_Callback_2_(mthis, __arg_0, __arg_1) => item_Callback_2(mthis, __arg_0, __arg_1);
+
+  static item_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SpeechRecognitionResultList_item_Callback";
+  item_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => item_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static length_Getter(mthis) native "SpeechRecognitionResultList_length_Getter";
+  length_Getter_(mthis) => length_Getter(mthis);
+
 }
 
-class BlinkSpeechSynthesis {
+class BlinkSpeechSynthesis extends BlinkEventTarget {
+  static final instance = new BlinkSpeechSynthesis();
+
+  static cancel_Callback_0(mthis) native "SpeechSynthesis_cancel_Callback";
+  cancel_Callback_0_(mthis) => cancel_Callback_0(mthis);
+
+  static cancel_Callback_1(mthis, __arg_0) native "SpeechSynthesis_cancel_Callback";
+  cancel_Callback_1_(mthis, __arg_0) => cancel_Callback_1(mthis, __arg_0);
+
+  static cancel_Callback_2(mthis, __arg_0, __arg_1) native "SpeechSynthesis_cancel_Callback";
+  cancel_Callback_2_(mthis, __arg_0, __arg_1) => cancel_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getVoices_Callback_0(mthis) native "SpeechSynthesis_getVoices_Callback";
+  getVoices_Callback_0_(mthis) => getVoices_Callback_0(mthis);
+
+  static getVoices_Callback_1(mthis, __arg_0) native "SpeechSynthesis_getVoices_Callback";
+  getVoices_Callback_1_(mthis, __arg_0) => getVoices_Callback_1(mthis, __arg_0);
+
+  static getVoices_Callback_2(mthis, __arg_0, __arg_1) native "SpeechSynthesis_getVoices_Callback";
+  getVoices_Callback_2_(mthis, __arg_0, __arg_1) => getVoices_Callback_2(mthis, __arg_0, __arg_1);
+
+  static onvoiceschanged_Getter(mthis) native "SpeechSynthesis_onvoiceschanged_Getter";
+  onvoiceschanged_Getter_(mthis) => onvoiceschanged_Getter(mthis);
+
+  static onvoiceschanged_Setter(mthis, __arg_0) native "SpeechSynthesis_onvoiceschanged_Setter";
+  onvoiceschanged_Setter_(mthis, __arg_0) => onvoiceschanged_Setter(mthis, __arg_0);
+
+  static pause_Callback_0(mthis) native "SpeechSynthesis_pause_Callback";
+  pause_Callback_0_(mthis) => pause_Callback_0(mthis);
+
+  static pause_Callback_1(mthis, __arg_0) native "SpeechSynthesis_pause_Callback";
+  pause_Callback_1_(mthis, __arg_0) => pause_Callback_1(mthis, __arg_0);
+
+  static pause_Callback_2(mthis, __arg_0, __arg_1) native "SpeechSynthesis_pause_Callback";
+  pause_Callback_2_(mthis, __arg_0, __arg_1) => pause_Callback_2(mthis, __arg_0, __arg_1);
+
   static paused_Getter(mthis) native "SpeechSynthesis_paused_Getter";
+  paused_Getter_(mthis) => paused_Getter(mthis);
 
   static pending_Getter(mthis) native "SpeechSynthesis_pending_Getter";
+  pending_Getter_(mthis) => pending_Getter(mthis);
+
+  static resume_Callback_0(mthis) native "SpeechSynthesis_resume_Callback";
+  resume_Callback_0_(mthis) => resume_Callback_0(mthis);
+
+  static resume_Callback_1(mthis, __arg_0) native "SpeechSynthesis_resume_Callback";
+  resume_Callback_1_(mthis, __arg_0) => resume_Callback_1(mthis, __arg_0);
+
+  static resume_Callback_2(mthis, __arg_0, __arg_1) native "SpeechSynthesis_resume_Callback";
+  resume_Callback_2_(mthis, __arg_0, __arg_1) => resume_Callback_2(mthis, __arg_0, __arg_1);
+
+  static speak_Callback_0(mthis) native "SpeechSynthesis_speak_Callback";
+  speak_Callback_0_(mthis) => speak_Callback_0(mthis);
+
+  static speak_Callback_1(mthis, __arg_0) native "SpeechSynthesis_speak_Callback";
+  speak_Callback_1_(mthis, __arg_0) => speak_Callback_1(mthis, __arg_0);
+
+  static speak_Callback_2(mthis, __arg_0, __arg_1) native "SpeechSynthesis_speak_Callback";
+  speak_Callback_2_(mthis, __arg_0, __arg_1) => speak_Callback_2(mthis, __arg_0, __arg_1);
+
+  static speak_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SpeechSynthesis_speak_Callback";
+  speak_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => speak_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
   static speaking_Getter(mthis) native "SpeechSynthesis_speaking_Getter";
+  speaking_Getter_(mthis) => speaking_Getter(mthis);
 
-  static cancel_Callback(mthis) native "SpeechSynthesis_cancel_Callback";
-
-  static getVoices_Callback(mthis) native "SpeechSynthesis_getVoices_Callback";
-
-  static pause_Callback(mthis) native "SpeechSynthesis_pause_Callback";
-
-  static resume_Callback(mthis) native "SpeechSynthesis_resume_Callback";
-
-  static speak_Callback_1(mthis, utterance) native "SpeechSynthesis_speak_Callback";
 }
 
-class BlinkSpeechSynthesisEvent {
+class BlinkSpeechSynthesisEvent extends BlinkEvent {
+  static final instance = new BlinkSpeechSynthesisEvent();
+
   static charIndex_Getter(mthis) native "SpeechSynthesisEvent_charIndex_Getter";
+  charIndex_Getter_(mthis) => charIndex_Getter(mthis);
 
   static elapsedTime_Getter(mthis) native "SpeechSynthesisEvent_elapsedTime_Getter";
+  elapsedTime_Getter_(mthis) => elapsedTime_Getter(mthis);
 
   static name_Getter(mthis) native "SpeechSynthesisEvent_name_Getter";
+  name_Getter_(mthis) => name_Getter(mthis);
+
 }
 
-class BlinkSpeechSynthesisUtterance {
-  static constructorCallback_1(text) native "SpeechSynthesisUtterance_constructorCallback";
+class BlinkSpeechSynthesisUtterance extends BlinkEventTarget {
+  static final instance = new BlinkSpeechSynthesisUtterance();
+
+  static constructorCallback_0() native "SpeechSynthesisUtterance_constructorCallback";
+  constructorCallback_0_() => constructorCallback_0();
+
+  static constructorCallback_1(__arg_0) native "SpeechSynthesisUtterance_constructorCallback";
+  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+
+  static constructorCallback_2(__arg_0, __arg_1) native "SpeechSynthesisUtterance_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+
+  static constructorCallback_3(__arg_0, __arg_1, __arg_2) native "SpeechSynthesisUtterance_constructorCallback";
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => constructorCallback_3(__arg_0, __arg_1, __arg_2);
 
   static lang_Getter(mthis) native "SpeechSynthesisUtterance_lang_Getter";
+  lang_Getter_(mthis) => lang_Getter(mthis);
 
-  static lang_Setter(mthis, value) native "SpeechSynthesisUtterance_lang_Setter";
+  static lang_Setter(mthis, __arg_0) native "SpeechSynthesisUtterance_lang_Setter";
+  lang_Setter_(mthis, __arg_0) => lang_Setter(mthis, __arg_0);
+
+  static onboundary_Getter(mthis) native "SpeechSynthesisUtterance_onboundary_Getter";
+  onboundary_Getter_(mthis) => onboundary_Getter(mthis);
+
+  static onboundary_Setter(mthis, __arg_0) native "SpeechSynthesisUtterance_onboundary_Setter";
+  onboundary_Setter_(mthis, __arg_0) => onboundary_Setter(mthis, __arg_0);
+
+  static onend_Getter(mthis) native "SpeechSynthesisUtterance_onend_Getter";
+  onend_Getter_(mthis) => onend_Getter(mthis);
+
+  static onend_Setter(mthis, __arg_0) native "SpeechSynthesisUtterance_onend_Setter";
+  onend_Setter_(mthis, __arg_0) => onend_Setter(mthis, __arg_0);
+
+  static onerror_Getter(mthis) native "SpeechSynthesisUtterance_onerror_Getter";
+  onerror_Getter_(mthis) => onerror_Getter(mthis);
+
+  static onerror_Setter(mthis, __arg_0) native "SpeechSynthesisUtterance_onerror_Setter";
+  onerror_Setter_(mthis, __arg_0) => onerror_Setter(mthis, __arg_0);
+
+  static onmark_Getter(mthis) native "SpeechSynthesisUtterance_onmark_Getter";
+  onmark_Getter_(mthis) => onmark_Getter(mthis);
+
+  static onmark_Setter(mthis, __arg_0) native "SpeechSynthesisUtterance_onmark_Setter";
+  onmark_Setter_(mthis, __arg_0) => onmark_Setter(mthis, __arg_0);
+
+  static onpause_Getter(mthis) native "SpeechSynthesisUtterance_onpause_Getter";
+  onpause_Getter_(mthis) => onpause_Getter(mthis);
+
+  static onpause_Setter(mthis, __arg_0) native "SpeechSynthesisUtterance_onpause_Setter";
+  onpause_Setter_(mthis, __arg_0) => onpause_Setter(mthis, __arg_0);
+
+  static onresume_Getter(mthis) native "SpeechSynthesisUtterance_onresume_Getter";
+  onresume_Getter_(mthis) => onresume_Getter(mthis);
+
+  static onresume_Setter(mthis, __arg_0) native "SpeechSynthesisUtterance_onresume_Setter";
+  onresume_Setter_(mthis, __arg_0) => onresume_Setter(mthis, __arg_0);
+
+  static onstart_Getter(mthis) native "SpeechSynthesisUtterance_onstart_Getter";
+  onstart_Getter_(mthis) => onstart_Getter(mthis);
+
+  static onstart_Setter(mthis, __arg_0) native "SpeechSynthesisUtterance_onstart_Setter";
+  onstart_Setter_(mthis, __arg_0) => onstart_Setter(mthis, __arg_0);
 
   static pitch_Getter(mthis) native "SpeechSynthesisUtterance_pitch_Getter";
+  pitch_Getter_(mthis) => pitch_Getter(mthis);
 
-  static pitch_Setter(mthis, value) native "SpeechSynthesisUtterance_pitch_Setter";
+  static pitch_Setter(mthis, __arg_0) native "SpeechSynthesisUtterance_pitch_Setter";
+  pitch_Setter_(mthis, __arg_0) => pitch_Setter(mthis, __arg_0);
 
   static rate_Getter(mthis) native "SpeechSynthesisUtterance_rate_Getter";
+  rate_Getter_(mthis) => rate_Getter(mthis);
 
-  static rate_Setter(mthis, value) native "SpeechSynthesisUtterance_rate_Setter";
+  static rate_Setter(mthis, __arg_0) native "SpeechSynthesisUtterance_rate_Setter";
+  rate_Setter_(mthis, __arg_0) => rate_Setter(mthis, __arg_0);
 
   static text_Getter(mthis) native "SpeechSynthesisUtterance_text_Getter";
+  text_Getter_(mthis) => text_Getter(mthis);
 
-  static text_Setter(mthis, value) native "SpeechSynthesisUtterance_text_Setter";
+  static text_Setter(mthis, __arg_0) native "SpeechSynthesisUtterance_text_Setter";
+  text_Setter_(mthis, __arg_0) => text_Setter(mthis, __arg_0);
 
   static voice_Getter(mthis) native "SpeechSynthesisUtterance_voice_Getter";
+  voice_Getter_(mthis) => voice_Getter(mthis);
 
-  static voice_Setter(mthis, value) native "SpeechSynthesisUtterance_voice_Setter";
+  static voice_Setter(mthis, __arg_0) native "SpeechSynthesisUtterance_voice_Setter";
+  voice_Setter_(mthis, __arg_0) => voice_Setter(mthis, __arg_0);
 
   static volume_Getter(mthis) native "SpeechSynthesisUtterance_volume_Getter";
+  volume_Getter_(mthis) => volume_Getter(mthis);
 
-  static volume_Setter(mthis, value) native "SpeechSynthesisUtterance_volume_Setter";
+  static volume_Setter(mthis, __arg_0) native "SpeechSynthesisUtterance_volume_Setter";
+  volume_Setter_(mthis, __arg_0) => volume_Setter(mthis, __arg_0);
+
 }
 
 class BlinkSpeechSynthesisVoice {
+  static final instance = new BlinkSpeechSynthesisVoice();
+
   static default_Getter(mthis) native "SpeechSynthesisVoice_default_Getter";
+  default_Getter_(mthis) => default_Getter(mthis);
 
   static lang_Getter(mthis) native "SpeechSynthesisVoice_lang_Getter";
+  lang_Getter_(mthis) => lang_Getter(mthis);
 
   static localService_Getter(mthis) native "SpeechSynthesisVoice_localService_Getter";
+  localService_Getter_(mthis) => localService_Getter(mthis);
 
   static name_Getter(mthis) native "SpeechSynthesisVoice_name_Getter";
+  name_Getter_(mthis) => name_Getter(mthis);
 
   static voiceURI_Getter(mthis) native "SpeechSynthesisVoice_voiceURI_Getter";
+  voiceURI_Getter_(mthis) => voiceURI_Getter(mthis);
+
 }
 
 class BlinkStorage {
+  static final instance = new BlinkStorage();
+
+  static $__delete___Callback_1(mthis, __arg_0) native "Storage___delete___Callback";
+  $__delete___Callback_1_(mthis, __arg_0) => $__delete___Callback_1(mthis, __arg_0);
+
+  static $__getter___Callback_1(mthis, __arg_0) native "Storage___getter___Callback";
+  $__getter___Callback_1_(mthis, __arg_0) => $__getter___Callback_1(mthis, __arg_0);
+
+  static $__setter___Callback_2(mthis, __arg_0, __arg_1) native "Storage___setter___Callback";
+  $__setter___Callback_2_(mthis, __arg_0, __arg_1) => $__setter___Callback_2(mthis, __arg_0, __arg_1);
+
+  static clear_Callback_0(mthis) native "Storage_clear_Callback";
+  clear_Callback_0_(mthis) => clear_Callback_0(mthis);
+
+  static clear_Callback_1(mthis, __arg_0) native "Storage_clear_Callback";
+  clear_Callback_1_(mthis, __arg_0) => clear_Callback_1(mthis, __arg_0);
+
+  static clear_Callback_2(mthis, __arg_0, __arg_1) native "Storage_clear_Callback";
+  clear_Callback_2_(mthis, __arg_0, __arg_1) => clear_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getItem_Callback_0(mthis) native "Storage_getItem_Callback";
+  getItem_Callback_0_(mthis) => getItem_Callback_0(mthis);
+
+  static getItem_Callback_1(mthis, __arg_0) native "Storage_getItem_Callback";
+  getItem_Callback_1_(mthis, __arg_0) => getItem_Callback_1(mthis, __arg_0);
+
+  static getItem_Callback_2(mthis, __arg_0, __arg_1) native "Storage_getItem_Callback";
+  getItem_Callback_2_(mthis, __arg_0, __arg_1) => getItem_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Storage_getItem_Callback";
+  getItem_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static key_Callback_0(mthis) native "Storage_key_Callback";
+  key_Callback_0_(mthis) => key_Callback_0(mthis);
+
+  static key_Callback_1(mthis, __arg_0) native "Storage_key_Callback";
+  key_Callback_1_(mthis, __arg_0) => key_Callback_1(mthis, __arg_0);
+
+  static key_Callback_2(mthis, __arg_0, __arg_1) native "Storage_key_Callback";
+  key_Callback_2_(mthis, __arg_0, __arg_1) => key_Callback_2(mthis, __arg_0, __arg_1);
+
+  static key_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Storage_key_Callback";
+  key_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => key_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
   static length_Getter(mthis) native "Storage_length_Getter";
+  length_Getter_(mthis) => length_Getter(mthis);
 
-  static $__delete___Callback_1(mthis, index_OR_name) native "Storage___delete___Callback";
+  static removeItem_Callback_0(mthis) native "Storage_removeItem_Callback";
+  removeItem_Callback_0_(mthis) => removeItem_Callback_0(mthis);
 
-  static $__getter___Callback_1(mthis, index_OR_name) native "Storage___getter___Callback";
+  static removeItem_Callback_1(mthis, __arg_0) native "Storage_removeItem_Callback";
+  removeItem_Callback_1_(mthis, __arg_0) => removeItem_Callback_1(mthis, __arg_0);
 
-  static $__setter___Callback_2(mthis, index_OR_name, value) native "Storage___setter___Callback";
+  static removeItem_Callback_2(mthis, __arg_0, __arg_1) native "Storage_removeItem_Callback";
+  removeItem_Callback_2_(mthis, __arg_0, __arg_1) => removeItem_Callback_2(mthis, __arg_0, __arg_1);
 
-  static clear_Callback(mthis) native "Storage_clear_Callback";
+  static removeItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Storage_removeItem_Callback";
+  removeItem_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => removeItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
-  static getItem_Callback_1(mthis, key) native "Storage_getItem_Callback";
+  static setItem_Callback_0(mthis) native "Storage_setItem_Callback";
+  setItem_Callback_0_(mthis) => setItem_Callback_0(mthis);
 
-  static key_Callback_1(mthis, index) native "Storage_key_Callback";
+  static setItem_Callback_1(mthis, __arg_0) native "Storage_setItem_Callback";
+  setItem_Callback_1_(mthis, __arg_0) => setItem_Callback_1(mthis, __arg_0);
 
-  static removeItem_Callback_1(mthis, key) native "Storage_removeItem_Callback";
+  static setItem_Callback_2(mthis, __arg_0, __arg_1) native "Storage_setItem_Callback";
+  setItem_Callback_2_(mthis, __arg_0, __arg_1) => setItem_Callback_2(mthis, __arg_0, __arg_1);
 
-  static setItem_Callback_2(mthis, key, data) native "Storage_setItem_Callback";
+  static setItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Storage_setItem_Callback";
+  setItem_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => setItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static setItem_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Storage_setItem_Callback";
+  setItem_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => setItem_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
 }
 
-class BlinkStorageEvent {
-  static constructorCallback(type, options) native "StorageEvent_constructorCallback";
+class BlinkStorageEvent extends BlinkEvent {
+  static final instance = new BlinkStorageEvent();
+
+  static constructorCallback_2(__arg_0, __arg_1) native "StorageEvent_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+
+  static initStorageEvent_Callback_0(mthis) native "StorageEvent_initStorageEvent_Callback";
+  initStorageEvent_Callback_0_(mthis) => initStorageEvent_Callback_0(mthis);
+
+  static initStorageEvent_Callback_1(mthis, __arg_0) native "StorageEvent_initStorageEvent_Callback";
+  initStorageEvent_Callback_1_(mthis, __arg_0) => initStorageEvent_Callback_1(mthis, __arg_0);
+
+  static initStorageEvent_Callback_10(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9) native "StorageEvent_initStorageEvent_Callback";
+  initStorageEvent_Callback_10_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9) => initStorageEvent_Callback_10(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9);
+
+  static initStorageEvent_Callback_2(mthis, __arg_0, __arg_1) native "StorageEvent_initStorageEvent_Callback";
+  initStorageEvent_Callback_2_(mthis, __arg_0, __arg_1) => initStorageEvent_Callback_2(mthis, __arg_0, __arg_1);
+
+  static initStorageEvent_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "StorageEvent_initStorageEvent_Callback";
+  initStorageEvent_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => initStorageEvent_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static initStorageEvent_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "StorageEvent_initStorageEvent_Callback";
+  initStorageEvent_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => initStorageEvent_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static initStorageEvent_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "StorageEvent_initStorageEvent_Callback";
+  initStorageEvent_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => initStorageEvent_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static initStorageEvent_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "StorageEvent_initStorageEvent_Callback";
+  initStorageEvent_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => initStorageEvent_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static initStorageEvent_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) native "StorageEvent_initStorageEvent_Callback";
+  initStorageEvent_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => initStorageEvent_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6);
+
+  static initStorageEvent_Callback_8(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) native "StorageEvent_initStorageEvent_Callback";
+  initStorageEvent_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => initStorageEvent_Callback_8(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7);
+
+  static initStorageEvent_Callback_9(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) native "StorageEvent_initStorageEvent_Callback";
+  initStorageEvent_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => initStorageEvent_Callback_9(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8);
 
   static key_Getter(mthis) native "StorageEvent_key_Getter";
+  key_Getter_(mthis) => key_Getter(mthis);
 
   static newValue_Getter(mthis) native "StorageEvent_newValue_Getter";
+  newValue_Getter_(mthis) => newValue_Getter(mthis);
 
   static oldValue_Getter(mthis) native "StorageEvent_oldValue_Getter";
+  oldValue_Getter_(mthis) => oldValue_Getter(mthis);
 
   static storageArea_Getter(mthis) native "StorageEvent_storageArea_Getter";
+  storageArea_Getter_(mthis) => storageArea_Getter(mthis);
 
   static url_Getter(mthis) native "StorageEvent_url_Getter";
+  url_Getter_(mthis) => url_Getter(mthis);
 
-  static initStorageEvent_Callback_8(mthis, typeArg, canBubbleArg, cancelableArg, keyArg, oldValueArg, newValueArg, urlArg, storageAreaArg) native "StorageEvent_initStorageEvent_Callback";
 }
 
 class BlinkStorageInfo {
+  static final instance = new BlinkStorageInfo();
+
   static quota_Getter(mthis) native "StorageInfo_quota_Getter";
+  quota_Getter_(mthis) => quota_Getter(mthis);
 
   static usage_Getter(mthis) native "StorageInfo_usage_Getter";
+  usage_Getter_(mthis) => usage_Getter(mthis);
+
 }
 
 class BlinkStorageQuota {
+  static final instance = new BlinkStorageQuota();
+
+  static queryInfo_Callback_0(mthis) native "StorageQuota_queryInfo_Callback";
+  queryInfo_Callback_0_(mthis) => queryInfo_Callback_0(mthis);
+
+  static queryInfo_Callback_1(mthis, __arg_0) native "StorageQuota_queryInfo_Callback";
+  queryInfo_Callback_1_(mthis, __arg_0) => queryInfo_Callback_1(mthis, __arg_0);
+
+  static queryInfo_Callback_2(mthis, __arg_0, __arg_1) native "StorageQuota_queryInfo_Callback";
+  queryInfo_Callback_2_(mthis, __arg_0, __arg_1) => queryInfo_Callback_2(mthis, __arg_0, __arg_1);
+
+  static queryInfo_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "StorageQuota_queryInfo_Callback";
+  queryInfo_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => queryInfo_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static requestPersistentQuota_Callback_0(mthis) native "StorageQuota_requestPersistentQuota_Callback";
+  requestPersistentQuota_Callback_0_(mthis) => requestPersistentQuota_Callback_0(mthis);
+
+  static requestPersistentQuota_Callback_1(mthis, __arg_0) native "StorageQuota_requestPersistentQuota_Callback";
+  requestPersistentQuota_Callback_1_(mthis, __arg_0) => requestPersistentQuota_Callback_1(mthis, __arg_0);
+
+  static requestPersistentQuota_Callback_2(mthis, __arg_0, __arg_1) native "StorageQuota_requestPersistentQuota_Callback";
+  requestPersistentQuota_Callback_2_(mthis, __arg_0, __arg_1) => requestPersistentQuota_Callback_2(mthis, __arg_0, __arg_1);
+
+  static requestPersistentQuota_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "StorageQuota_requestPersistentQuota_Callback";
+  requestPersistentQuota_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => requestPersistentQuota_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
   static supportedTypes_Getter(mthis) native "StorageQuota_supportedTypes_Getter";
+  supportedTypes_Getter_(mthis) => supportedTypes_Getter(mthis);
 
-  static queryInfo_Callback_1(mthis, type) native "StorageQuota_queryInfo_Callback";
-
-  static requestPersistentQuota_Callback_1(mthis, newQuota) native "StorageQuota_requestPersistentQuota_Callback";
 }
 
 class BlinkStream {
+  static final instance = new BlinkStream();
+
   static type_Getter(mthis) native "Stream_type_Getter";
+  type_Getter_(mthis) => type_Getter(mthis);
+
 }
 
 class BlinkStyleMedia {
-  static type_Getter(mthis) native "StyleMedia_type_Getter";
+  static final instance = new BlinkStyleMedia();
 
-  static matchMedium_Callback_1(mthis, mediaquery) native "StyleMedia_matchMedium_Callback";
+  static matchMedium_Callback_0(mthis) native "StyleMedia_matchMedium_Callback";
+  matchMedium_Callback_0_(mthis) => matchMedium_Callback_0(mthis);
+
+  static matchMedium_Callback_1(mthis, __arg_0) native "StyleMedia_matchMedium_Callback";
+  matchMedium_Callback_1_(mthis, __arg_0) => matchMedium_Callback_1(mthis, __arg_0);
+
+  static matchMedium_Callback_2(mthis, __arg_0, __arg_1) native "StyleMedia_matchMedium_Callback";
+  matchMedium_Callback_2_(mthis, __arg_0, __arg_1) => matchMedium_Callback_2(mthis, __arg_0, __arg_1);
+
+  static matchMedium_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "StyleMedia_matchMedium_Callback";
+  matchMedium_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => matchMedium_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static type_Getter(mthis) native "StyleMedia_type_Getter";
+  type_Getter_(mthis) => type_Getter(mthis);
+
+}
+
+class BlinkStyleSheet {
+  static final instance = new BlinkStyleSheet();
+
+  static disabled_Getter(mthis) native "StyleSheet_disabled_Getter";
+  disabled_Getter_(mthis) => disabled_Getter(mthis);
+
+  static disabled_Setter(mthis, __arg_0) native "StyleSheet_disabled_Setter";
+  disabled_Setter_(mthis, __arg_0) => disabled_Setter(mthis, __arg_0);
+
+  static href_Getter(mthis) native "StyleSheet_href_Getter";
+  href_Getter_(mthis) => href_Getter(mthis);
+
+  static media_Getter(mthis) native "StyleSheet_media_Getter";
+  media_Getter_(mthis) => media_Getter(mthis);
+
+  static ownerNode_Getter(mthis) native "StyleSheet_ownerNode_Getter";
+  ownerNode_Getter_(mthis) => ownerNode_Getter(mthis);
+
+  static parentStyleSheet_Getter(mthis) native "StyleSheet_parentStyleSheet_Getter";
+  parentStyleSheet_Getter_(mthis) => parentStyleSheet_Getter(mthis);
+
+  static title_Getter(mthis) native "StyleSheet_title_Getter";
+  title_Getter_(mthis) => title_Getter(mthis);
+
+  static type_Getter(mthis) native "StyleSheet_type_Getter";
+  type_Getter_(mthis) => type_Getter(mthis);
+
 }
 
 class BlinkStyleSheetList {
+  static final instance = new BlinkStyleSheetList();
+
+  static $__getter___Callback_1(mthis, __arg_0) native "StyleSheetList___getter___Callback";
+  $__getter___Callback_1_(mthis, __arg_0) => $__getter___Callback_1(mthis, __arg_0);
+
+  static item_Callback_0(mthis) native "StyleSheetList_item_Callback";
+  item_Callback_0_(mthis) => item_Callback_0(mthis);
+
+  static item_Callback_1(mthis, __arg_0) native "StyleSheetList_item_Callback";
+  item_Callback_1_(mthis, __arg_0) => item_Callback_1(mthis, __arg_0);
+
+  static item_Callback_2(mthis, __arg_0, __arg_1) native "StyleSheetList_item_Callback";
+  item_Callback_2_(mthis, __arg_0, __arg_1) => item_Callback_2(mthis, __arg_0, __arg_1);
+
+  static item_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "StyleSheetList_item_Callback";
+  item_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => item_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
   static length_Getter(mthis) native "StyleSheetList_length_Getter";
+  length_Getter_(mthis) => length_Getter(mthis);
 
-  static $__getter___Callback_1(mthis, name) native "StyleSheetList___getter___Callback";
-
-  static item_Callback_1(mthis, index) native "StyleSheetList_item_Callback";
 }
 
-class BlinkSubtleCrypto {}
+class BlinkSubtleCrypto {
+  static final instance = new BlinkSubtleCrypto();
 
-class BlinkTextEvent {
+  static decrypt_Callback_1(mthis, __arg_0) native "SubtleCrypto_decrypt_Callback";
+  decrypt_Callback_1_(mthis, __arg_0) => decrypt_Callback_1(mthis, __arg_0);
+
+  static decrypt_Callback_2(mthis, __arg_0, __arg_1) native "SubtleCrypto_decrypt_Callback";
+  decrypt_Callback_2_(mthis, __arg_0, __arg_1) => decrypt_Callback_2(mthis, __arg_0, __arg_1);
+
+  static decrypt_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SubtleCrypto_decrypt_Callback";
+  decrypt_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => decrypt_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static decrypt_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "SubtleCrypto_decrypt_Callback";
+  decrypt_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => decrypt_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static decrypt_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "SubtleCrypto_decrypt_Callback";
+  decrypt_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => decrypt_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static digest_Callback_0(mthis) native "SubtleCrypto_digest_Callback";
+  digest_Callback_0_(mthis) => digest_Callback_0(mthis);
+
+  static digest_Callback_1(mthis, __arg_0) native "SubtleCrypto_digest_Callback";
+  digest_Callback_1_(mthis, __arg_0) => digest_Callback_1(mthis, __arg_0);
+
+  static digest_Callback_2(mthis, __arg_0, __arg_1) native "SubtleCrypto_digest_Callback";
+  digest_Callback_2_(mthis, __arg_0, __arg_1) => digest_Callback_2(mthis, __arg_0, __arg_1);
+
+  static digest_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SubtleCrypto_digest_Callback";
+  digest_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => digest_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static digest_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "SubtleCrypto_digest_Callback";
+  digest_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => digest_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static encrypt_Callback_1(mthis, __arg_0) native "SubtleCrypto_encrypt_Callback";
+  encrypt_Callback_1_(mthis, __arg_0) => encrypt_Callback_1(mthis, __arg_0);
+
+  static encrypt_Callback_2(mthis, __arg_0, __arg_1) native "SubtleCrypto_encrypt_Callback";
+  encrypt_Callback_2_(mthis, __arg_0, __arg_1) => encrypt_Callback_2(mthis, __arg_0, __arg_1);
+
+  static encrypt_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SubtleCrypto_encrypt_Callback";
+  encrypt_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => encrypt_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static encrypt_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "SubtleCrypto_encrypt_Callback";
+  encrypt_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => encrypt_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static encrypt_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "SubtleCrypto_encrypt_Callback";
+  encrypt_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => encrypt_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static exportKey_Callback_0(mthis) native "SubtleCrypto_exportKey_Callback";
+  exportKey_Callback_0_(mthis) => exportKey_Callback_0(mthis);
+
+  static exportKey_Callback_1(mthis, __arg_0) native "SubtleCrypto_exportKey_Callback";
+  exportKey_Callback_1_(mthis, __arg_0) => exportKey_Callback_1(mthis, __arg_0);
+
+  static exportKey_Callback_2(mthis, __arg_0, __arg_1) native "SubtleCrypto_exportKey_Callback";
+  exportKey_Callback_2_(mthis, __arg_0, __arg_1) => exportKey_Callback_2(mthis, __arg_0, __arg_1);
+
+  static exportKey_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SubtleCrypto_exportKey_Callback";
+  exportKey_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => exportKey_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static exportKey_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "SubtleCrypto_exportKey_Callback";
+  exportKey_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => exportKey_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static generateKey_Callback_1(mthis, __arg_0) native "SubtleCrypto_generateKey_Callback";
+  generateKey_Callback_1_(mthis, __arg_0) => generateKey_Callback_1(mthis, __arg_0);
+
+  static generateKey_Callback_2(mthis, __arg_0, __arg_1) native "SubtleCrypto_generateKey_Callback";
+  generateKey_Callback_2_(mthis, __arg_0, __arg_1) => generateKey_Callback_2(mthis, __arg_0, __arg_1);
+
+  static generateKey_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SubtleCrypto_generateKey_Callback";
+  generateKey_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => generateKey_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static generateKey_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "SubtleCrypto_generateKey_Callback";
+  generateKey_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => generateKey_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static generateKey_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "SubtleCrypto_generateKey_Callback";
+  generateKey_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => generateKey_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static importKey_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SubtleCrypto_importKey_Callback";
+  importKey_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => importKey_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static importKey_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "SubtleCrypto_importKey_Callback";
+  importKey_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => importKey_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static importKey_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "SubtleCrypto_importKey_Callback";
+  importKey_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => importKey_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static importKey_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "SubtleCrypto_importKey_Callback";
+  importKey_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => importKey_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static importKey_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) native "SubtleCrypto_importKey_Callback";
+  importKey_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => importKey_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6);
+
+  static sign_Callback_1(mthis, __arg_0) native "SubtleCrypto_sign_Callback";
+  sign_Callback_1_(mthis, __arg_0) => sign_Callback_1(mthis, __arg_0);
+
+  static sign_Callback_2(mthis, __arg_0, __arg_1) native "SubtleCrypto_sign_Callback";
+  sign_Callback_2_(mthis, __arg_0, __arg_1) => sign_Callback_2(mthis, __arg_0, __arg_1);
+
+  static sign_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SubtleCrypto_sign_Callback";
+  sign_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => sign_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static sign_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "SubtleCrypto_sign_Callback";
+  sign_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => sign_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static sign_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "SubtleCrypto_sign_Callback";
+  sign_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => sign_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static unwrapKey_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "SubtleCrypto_unwrapKey_Callback";
+  unwrapKey_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => unwrapKey_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static unwrapKey_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "SubtleCrypto_unwrapKey_Callback";
+  unwrapKey_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => unwrapKey_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static unwrapKey_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) native "SubtleCrypto_unwrapKey_Callback";
+  unwrapKey_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => unwrapKey_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6);
+
+  static unwrapKey_Callback_8(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) native "SubtleCrypto_unwrapKey_Callback";
+  unwrapKey_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => unwrapKey_Callback_8(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7);
+
+  static unwrapKey_Callback_9(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) native "SubtleCrypto_unwrapKey_Callback";
+  unwrapKey_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => unwrapKey_Callback_9(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8);
+
+  static verify_Callback_2(mthis, __arg_0, __arg_1) native "SubtleCrypto_verify_Callback";
+  verify_Callback_2_(mthis, __arg_0, __arg_1) => verify_Callback_2(mthis, __arg_0, __arg_1);
+
+  static verify_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SubtleCrypto_verify_Callback";
+  verify_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => verify_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static verify_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "SubtleCrypto_verify_Callback";
+  verify_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => verify_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static verify_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "SubtleCrypto_verify_Callback";
+  verify_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => verify_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static verify_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "SubtleCrypto_verify_Callback";
+  verify_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => verify_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static wrapKey_Callback_2(mthis, __arg_0, __arg_1) native "SubtleCrypto_wrapKey_Callback";
+  wrapKey_Callback_2_(mthis, __arg_0, __arg_1) => wrapKey_Callback_2(mthis, __arg_0, __arg_1);
+
+  static wrapKey_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "SubtleCrypto_wrapKey_Callback";
+  wrapKey_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => wrapKey_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static wrapKey_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "SubtleCrypto_wrapKey_Callback";
+  wrapKey_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => wrapKey_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static wrapKey_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "SubtleCrypto_wrapKey_Callback";
+  wrapKey_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => wrapKey_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static wrapKey_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "SubtleCrypto_wrapKey_Callback";
+  wrapKey_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => wrapKey_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+}
+
+class BlinkText extends BlinkCharacterData {
+  static final instance = new BlinkText();
+
+  static constructorCallback_0() native "Text_constructorCallback";
+  constructorCallback_0_() => constructorCallback_0();
+
+  static constructorCallback_1(__arg_0) native "Text_constructorCallback";
+  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+
+  static constructorCallback_2(__arg_0, __arg_1) native "Text_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+
+  static constructorCallback_3(__arg_0, __arg_1, __arg_2) native "Text_constructorCallback";
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => constructorCallback_3(__arg_0, __arg_1, __arg_2);
+
+  static getDestinationInsertionPoints_Callback_0(mthis) native "Text_getDestinationInsertionPoints_Callback";
+  getDestinationInsertionPoints_Callback_0_(mthis) => getDestinationInsertionPoints_Callback_0(mthis);
+
+  static getDestinationInsertionPoints_Callback_1(mthis, __arg_0) native "Text_getDestinationInsertionPoints_Callback";
+  getDestinationInsertionPoints_Callback_1_(mthis, __arg_0) => getDestinationInsertionPoints_Callback_1(mthis, __arg_0);
+
+  static getDestinationInsertionPoints_Callback_2(mthis, __arg_0, __arg_1) native "Text_getDestinationInsertionPoints_Callback";
+  getDestinationInsertionPoints_Callback_2_(mthis, __arg_0, __arg_1) => getDestinationInsertionPoints_Callback_2(mthis, __arg_0, __arg_1);
+
+  static replaceWholeText_Callback_0(mthis) native "Text_replaceWholeText_Callback";
+  replaceWholeText_Callback_0_(mthis) => replaceWholeText_Callback_0(mthis);
+
+  static replaceWholeText_Callback_1(mthis, __arg_0) native "Text_replaceWholeText_Callback";
+  replaceWholeText_Callback_1_(mthis, __arg_0) => replaceWholeText_Callback_1(mthis, __arg_0);
+
+  static replaceWholeText_Callback_2(mthis, __arg_0, __arg_1) native "Text_replaceWholeText_Callback";
+  replaceWholeText_Callback_2_(mthis, __arg_0, __arg_1) => replaceWholeText_Callback_2(mthis, __arg_0, __arg_1);
+
+  static replaceWholeText_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Text_replaceWholeText_Callback";
+  replaceWholeText_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => replaceWholeText_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static splitText_Callback_0(mthis) native "Text_splitText_Callback";
+  splitText_Callback_0_(mthis) => splitText_Callback_0(mthis);
+
+  static splitText_Callback_1(mthis, __arg_0) native "Text_splitText_Callback";
+  splitText_Callback_1_(mthis, __arg_0) => splitText_Callback_1(mthis, __arg_0);
+
+  static splitText_Callback_2(mthis, __arg_0, __arg_1) native "Text_splitText_Callback";
+  splitText_Callback_2_(mthis, __arg_0, __arg_1) => splitText_Callback_2(mthis, __arg_0, __arg_1);
+
+  static splitText_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Text_splitText_Callback";
+  splitText_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => splitText_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static wholeText_Getter(mthis) native "Text_wholeText_Getter";
+  wholeText_Getter_(mthis) => wholeText_Getter(mthis);
+
+}
+
+class BlinkTextDecoder {
+  static final instance = new BlinkTextDecoder();
+
+  static constructorCallback_0() native "TextDecoder_constructorCallback";
+  constructorCallback_0_() => constructorCallback_0();
+
+  static constructorCallback_1(__arg_0) native "TextDecoder_constructorCallback";
+  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+
+  static constructorCallback_2(__arg_0, __arg_1) native "TextDecoder_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+
+  static constructorCallback_3(__arg_0, __arg_1, __arg_2) native "TextDecoder_constructorCallback";
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => constructorCallback_3(__arg_0, __arg_1, __arg_2);
+
+  static constructorCallback_4(__arg_0, __arg_1, __arg_2, __arg_3) native "TextDecoder_constructorCallback";
+  constructorCallback_4_(__arg_0, __arg_1, __arg_2, __arg_3) => constructorCallback_4(__arg_0, __arg_1, __arg_2, __arg_3);
+
+  static decode_Callback_0(mthis) native "TextDecoder_decode_Callback";
+  decode_Callback_0_(mthis) => decode_Callback_0(mthis);
+
+  static decode_Callback_1(mthis, __arg_0) native "TextDecoder_decode_Callback";
+  decode_Callback_1_(mthis, __arg_0) => decode_Callback_1(mthis, __arg_0);
+
+  static decode_Callback_2(mthis, __arg_0, __arg_1) native "TextDecoder_decode_Callback";
+  decode_Callback_2_(mthis, __arg_0, __arg_1) => decode_Callback_2(mthis, __arg_0, __arg_1);
+
+  static decode_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "TextDecoder_decode_Callback";
+  decode_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => decode_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static decode_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "TextDecoder_decode_Callback";
+  decode_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => decode_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static encoding_Getter(mthis) native "TextDecoder_encoding_Getter";
+  encoding_Getter_(mthis) => encoding_Getter(mthis);
+
+  static fatal_Getter(mthis) native "TextDecoder_fatal_Getter";
+  fatal_Getter_(mthis) => fatal_Getter(mthis);
+
+  static ignoreBOM_Getter(mthis) native "TextDecoder_ignoreBOM_Getter";
+  ignoreBOM_Getter_(mthis) => ignoreBOM_Getter(mthis);
+
+}
+
+class BlinkTextEncoder {
+  static final instance = new BlinkTextEncoder();
+
+  static constructorCallback_0() native "TextEncoder_constructorCallback";
+  constructorCallback_0_() => constructorCallback_0();
+
+  static constructorCallback_1(__arg_0) native "TextEncoder_constructorCallback";
+  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+
+  static constructorCallback_2(__arg_0, __arg_1) native "TextEncoder_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+
+  static constructorCallback_3(__arg_0, __arg_1, __arg_2) native "TextEncoder_constructorCallback";
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => constructorCallback_3(__arg_0, __arg_1, __arg_2);
+
+  static encode_Callback_0(mthis) native "TextEncoder_encode_Callback";
+  encode_Callback_0_(mthis) => encode_Callback_0(mthis);
+
+  static encode_Callback_1(mthis, __arg_0) native "TextEncoder_encode_Callback";
+  encode_Callback_1_(mthis, __arg_0) => encode_Callback_1(mthis, __arg_0);
+
+  static encode_Callback_2(mthis, __arg_0, __arg_1) native "TextEncoder_encode_Callback";
+  encode_Callback_2_(mthis, __arg_0, __arg_1) => encode_Callback_2(mthis, __arg_0, __arg_1);
+
+  static encode_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "TextEncoder_encode_Callback";
+  encode_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => encode_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static encoding_Getter(mthis) native "TextEncoder_encoding_Getter";
+  encoding_Getter_(mthis) => encoding_Getter(mthis);
+
+}
+
+class BlinkTextEvent extends BlinkUIEvent {
+  static final instance = new BlinkTextEvent();
+
   static data_Getter(mthis) native "TextEvent_data_Getter";
+  data_Getter_(mthis) => data_Getter(mthis);
 
-  static initTextEvent_Callback_5(mthis, typeArg, canBubbleArg, cancelableArg, viewArg, dataArg) native "TextEvent_initTextEvent_Callback";
+  static initTextEvent_Callback_0(mthis) native "TextEvent_initTextEvent_Callback";
+  initTextEvent_Callback_0_(mthis) => initTextEvent_Callback_0(mthis);
+
+  static initTextEvent_Callback_1(mthis, __arg_0) native "TextEvent_initTextEvent_Callback";
+  initTextEvent_Callback_1_(mthis, __arg_0) => initTextEvent_Callback_1(mthis, __arg_0);
+
+  static initTextEvent_Callback_2(mthis, __arg_0, __arg_1) native "TextEvent_initTextEvent_Callback";
+  initTextEvent_Callback_2_(mthis, __arg_0, __arg_1) => initTextEvent_Callback_2(mthis, __arg_0, __arg_1);
+
+  static initTextEvent_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "TextEvent_initTextEvent_Callback";
+  initTextEvent_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => initTextEvent_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static initTextEvent_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "TextEvent_initTextEvent_Callback";
+  initTextEvent_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => initTextEvent_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static initTextEvent_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "TextEvent_initTextEvent_Callback";
+  initTextEvent_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => initTextEvent_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static initTextEvent_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "TextEvent_initTextEvent_Callback";
+  initTextEvent_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => initTextEvent_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static initTextEvent_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) native "TextEvent_initTextEvent_Callback";
+  initTextEvent_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => initTextEvent_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6);
+
 }
 
 class BlinkTextMetrics {
+  static final instance = new BlinkTextMetrics();
+
   static actualBoundingBoxAscent_Getter(mthis) native "TextMetrics_actualBoundingBoxAscent_Getter";
+  actualBoundingBoxAscent_Getter_(mthis) => actualBoundingBoxAscent_Getter(mthis);
 
   static actualBoundingBoxDescent_Getter(mthis) native "TextMetrics_actualBoundingBoxDescent_Getter";
+  actualBoundingBoxDescent_Getter_(mthis) => actualBoundingBoxDescent_Getter(mthis);
 
   static actualBoundingBoxLeft_Getter(mthis) native "TextMetrics_actualBoundingBoxLeft_Getter";
+  actualBoundingBoxLeft_Getter_(mthis) => actualBoundingBoxLeft_Getter(mthis);
 
   static actualBoundingBoxRight_Getter(mthis) native "TextMetrics_actualBoundingBoxRight_Getter";
+  actualBoundingBoxRight_Getter_(mthis) => actualBoundingBoxRight_Getter(mthis);
 
   static alphabeticBaseline_Getter(mthis) native "TextMetrics_alphabeticBaseline_Getter";
+  alphabeticBaseline_Getter_(mthis) => alphabeticBaseline_Getter(mthis);
 
   static emHeightAscent_Getter(mthis) native "TextMetrics_emHeightAscent_Getter";
+  emHeightAscent_Getter_(mthis) => emHeightAscent_Getter(mthis);
 
   static emHeightDescent_Getter(mthis) native "TextMetrics_emHeightDescent_Getter";
+  emHeightDescent_Getter_(mthis) => emHeightDescent_Getter(mthis);
 
   static fontBoundingBoxAscent_Getter(mthis) native "TextMetrics_fontBoundingBoxAscent_Getter";
+  fontBoundingBoxAscent_Getter_(mthis) => fontBoundingBoxAscent_Getter(mthis);
 
   static fontBoundingBoxDescent_Getter(mthis) native "TextMetrics_fontBoundingBoxDescent_Getter";
+  fontBoundingBoxDescent_Getter_(mthis) => fontBoundingBoxDescent_Getter(mthis);
 
   static hangingBaseline_Getter(mthis) native "TextMetrics_hangingBaseline_Getter";
+  hangingBaseline_Getter_(mthis) => hangingBaseline_Getter(mthis);
 
   static ideographicBaseline_Getter(mthis) native "TextMetrics_ideographicBaseline_Getter";
+  ideographicBaseline_Getter_(mthis) => ideographicBaseline_Getter(mthis);
 
   static width_Getter(mthis) native "TextMetrics_width_Getter";
+  width_Getter_(mthis) => width_Getter(mthis);
+
 }
 
-class BlinkTextTrack {
+class BlinkTextTrack extends BlinkEventTarget {
+  static final instance = new BlinkTextTrack();
+
   static activeCues_Getter(mthis) native "TextTrack_activeCues_Getter";
+  activeCues_Getter_(mthis) => activeCues_Getter(mthis);
+
+  static addCue_Callback_0(mthis) native "TextTrack_addCue_Callback";
+  addCue_Callback_0_(mthis) => addCue_Callback_0(mthis);
+
+  static addCue_Callback_1(mthis, __arg_0) native "TextTrack_addCue_Callback";
+  addCue_Callback_1_(mthis, __arg_0) => addCue_Callback_1(mthis, __arg_0);
+
+  static addCue_Callback_2(mthis, __arg_0, __arg_1) native "TextTrack_addCue_Callback";
+  addCue_Callback_2_(mthis, __arg_0, __arg_1) => addCue_Callback_2(mthis, __arg_0, __arg_1);
+
+  static addCue_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "TextTrack_addCue_Callback";
+  addCue_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => addCue_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static addRegion_Callback_0(mthis) native "TextTrack_addRegion_Callback";
+  addRegion_Callback_0_(mthis) => addRegion_Callback_0(mthis);
+
+  static addRegion_Callback_1(mthis, __arg_0) native "TextTrack_addRegion_Callback";
+  addRegion_Callback_1_(mthis, __arg_0) => addRegion_Callback_1(mthis, __arg_0);
+
+  static addRegion_Callback_2(mthis, __arg_0, __arg_1) native "TextTrack_addRegion_Callback";
+  addRegion_Callback_2_(mthis, __arg_0, __arg_1) => addRegion_Callback_2(mthis, __arg_0, __arg_1);
+
+  static addRegion_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "TextTrack_addRegion_Callback";
+  addRegion_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => addRegion_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
   static cues_Getter(mthis) native "TextTrack_cues_Getter";
+  cues_Getter_(mthis) => cues_Getter(mthis);
 
   static id_Getter(mthis) native "TextTrack_id_Getter";
+  id_Getter_(mthis) => id_Getter(mthis);
 
   static kind_Getter(mthis) native "TextTrack_kind_Getter";
+  kind_Getter_(mthis) => kind_Getter(mthis);
 
   static label_Getter(mthis) native "TextTrack_label_Getter";
+  label_Getter_(mthis) => label_Getter(mthis);
 
   static language_Getter(mthis) native "TextTrack_language_Getter";
+  language_Getter_(mthis) => language_Getter(mthis);
 
   static mode_Getter(mthis) native "TextTrack_mode_Getter";
+  mode_Getter_(mthis) => mode_Getter(mthis);
 
-  static mode_Setter(mthis, value) native "TextTrack_mode_Setter";
+  static mode_Setter(mthis, __arg_0) native "TextTrack_mode_Setter";
+  mode_Setter_(mthis, __arg_0) => mode_Setter(mthis, __arg_0);
+
+  static oncuechange_Getter(mthis) native "TextTrack_oncuechange_Getter";
+  oncuechange_Getter_(mthis) => oncuechange_Getter(mthis);
+
+  static oncuechange_Setter(mthis, __arg_0) native "TextTrack_oncuechange_Setter";
+  oncuechange_Setter_(mthis, __arg_0) => oncuechange_Setter(mthis, __arg_0);
 
   static regions_Getter(mthis) native "TextTrack_regions_Getter";
+  regions_Getter_(mthis) => regions_Getter(mthis);
 
-  static addCue_Callback_1(mthis, cue) native "TextTrack_addCue_Callback";
+  static removeCue_Callback_0(mthis) native "TextTrack_removeCue_Callback";
+  removeCue_Callback_0_(mthis) => removeCue_Callback_0(mthis);
 
-  static addRegion_Callback_1(mthis, region) native "TextTrack_addRegion_Callback";
+  static removeCue_Callback_1(mthis, __arg_0) native "TextTrack_removeCue_Callback";
+  removeCue_Callback_1_(mthis, __arg_0) => removeCue_Callback_1(mthis, __arg_0);
 
-  static removeCue_Callback_1(mthis, cue) native "TextTrack_removeCue_Callback";
+  static removeCue_Callback_2(mthis, __arg_0, __arg_1) native "TextTrack_removeCue_Callback";
+  removeCue_Callback_2_(mthis, __arg_0, __arg_1) => removeCue_Callback_2(mthis, __arg_0, __arg_1);
 
-  static removeRegion_Callback_1(mthis, region) native "TextTrack_removeRegion_Callback";
+  static removeCue_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "TextTrack_removeCue_Callback";
+  removeCue_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => removeCue_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static removeRegion_Callback_0(mthis) native "TextTrack_removeRegion_Callback";
+  removeRegion_Callback_0_(mthis) => removeRegion_Callback_0(mthis);
+
+  static removeRegion_Callback_1(mthis, __arg_0) native "TextTrack_removeRegion_Callback";
+  removeRegion_Callback_1_(mthis, __arg_0) => removeRegion_Callback_1(mthis, __arg_0);
+
+  static removeRegion_Callback_2(mthis, __arg_0, __arg_1) native "TextTrack_removeRegion_Callback";
+  removeRegion_Callback_2_(mthis, __arg_0, __arg_1) => removeRegion_Callback_2(mthis, __arg_0, __arg_1);
+
+  static removeRegion_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "TextTrack_removeRegion_Callback";
+  removeRegion_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => removeRegion_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
 }
 
-class BlinkTextTrackCue {
-  static endTime_Getter(mthis) native "TextTrackCue_endTime_Getter";
+class BlinkTextTrackCue extends BlinkEventTarget {
+  static final instance = new BlinkTextTrackCue();
 
-  static endTime_Setter(mthis, value) native "TextTrackCue_endTime_Setter";
+  static endTime_Getter(mthis) native "TextTrackCue_endTime_Getter";
+  endTime_Getter_(mthis) => endTime_Getter(mthis);
+
+  static endTime_Setter(mthis, __arg_0) native "TextTrackCue_endTime_Setter";
+  endTime_Setter_(mthis, __arg_0) => endTime_Setter(mthis, __arg_0);
 
   static id_Getter(mthis) native "TextTrackCue_id_Getter";
+  id_Getter_(mthis) => id_Getter(mthis);
 
-  static id_Setter(mthis, value) native "TextTrackCue_id_Setter";
+  static id_Setter(mthis, __arg_0) native "TextTrackCue_id_Setter";
+  id_Setter_(mthis, __arg_0) => id_Setter(mthis, __arg_0);
+
+  static onenter_Getter(mthis) native "TextTrackCue_onenter_Getter";
+  onenter_Getter_(mthis) => onenter_Getter(mthis);
+
+  static onenter_Setter(mthis, __arg_0) native "TextTrackCue_onenter_Setter";
+  onenter_Setter_(mthis, __arg_0) => onenter_Setter(mthis, __arg_0);
+
+  static onexit_Getter(mthis) native "TextTrackCue_onexit_Getter";
+  onexit_Getter_(mthis) => onexit_Getter(mthis);
+
+  static onexit_Setter(mthis, __arg_0) native "TextTrackCue_onexit_Setter";
+  onexit_Setter_(mthis, __arg_0) => onexit_Setter(mthis, __arg_0);
 
   static pauseOnExit_Getter(mthis) native "TextTrackCue_pauseOnExit_Getter";
+  pauseOnExit_Getter_(mthis) => pauseOnExit_Getter(mthis);
 
-  static pauseOnExit_Setter(mthis, value) native "TextTrackCue_pauseOnExit_Setter";
+  static pauseOnExit_Setter(mthis, __arg_0) native "TextTrackCue_pauseOnExit_Setter";
+  pauseOnExit_Setter_(mthis, __arg_0) => pauseOnExit_Setter(mthis, __arg_0);
 
   static startTime_Getter(mthis) native "TextTrackCue_startTime_Getter";
+  startTime_Getter_(mthis) => startTime_Getter(mthis);
 
-  static startTime_Setter(mthis, value) native "TextTrackCue_startTime_Setter";
+  static startTime_Setter(mthis, __arg_0) native "TextTrackCue_startTime_Setter";
+  startTime_Setter_(mthis, __arg_0) => startTime_Setter(mthis, __arg_0);
 
   static track_Getter(mthis) native "TextTrackCue_track_Getter";
+  track_Getter_(mthis) => track_Getter(mthis);
+
 }
 
 class BlinkTextTrackCueList {
+  static final instance = new BlinkTextTrackCueList();
+
+  static $__getter___Callback_1(mthis, __arg_0) native "TextTrackCueList___getter___Callback";
+  $__getter___Callback_1_(mthis, __arg_0) => $__getter___Callback_1(mthis, __arg_0);
+
+  static getCueById_Callback_0(mthis) native "TextTrackCueList_getCueById_Callback";
+  getCueById_Callback_0_(mthis) => getCueById_Callback_0(mthis);
+
+  static getCueById_Callback_1(mthis, __arg_0) native "TextTrackCueList_getCueById_Callback";
+  getCueById_Callback_1_(mthis, __arg_0) => getCueById_Callback_1(mthis, __arg_0);
+
+  static getCueById_Callback_2(mthis, __arg_0, __arg_1) native "TextTrackCueList_getCueById_Callback";
+  getCueById_Callback_2_(mthis, __arg_0, __arg_1) => getCueById_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getCueById_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "TextTrackCueList_getCueById_Callback";
+  getCueById_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getCueById_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static item_Callback_0(mthis) native "TextTrackCueList_item_Callback";
+  item_Callback_0_(mthis) => item_Callback_0(mthis);
+
+  static item_Callback_1(mthis, __arg_0) native "TextTrackCueList_item_Callback";
+  item_Callback_1_(mthis, __arg_0) => item_Callback_1(mthis, __arg_0);
+
+  static item_Callback_2(mthis, __arg_0, __arg_1) native "TextTrackCueList_item_Callback";
+  item_Callback_2_(mthis, __arg_0, __arg_1) => item_Callback_2(mthis, __arg_0, __arg_1);
+
+  static item_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "TextTrackCueList_item_Callback";
+  item_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => item_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
   static length_Getter(mthis) native "TextTrackCueList_length_Getter";
+  length_Getter_(mthis) => length_Getter(mthis);
 
-  static getCueById_Callback_1(mthis, id) native "TextTrackCueList_getCueById_Callback";
-
-  static item_Callback_1(mthis, index) native "TextTrackCueList_item_Callback";
 }
 
-class BlinkTextTrackList {
+class BlinkTextTrackList extends BlinkEventTarget {
+  static final instance = new BlinkTextTrackList();
+
+  static $__getter___Callback_1(mthis, __arg_0) native "TextTrackList___getter___Callback";
+  $__getter___Callback_1_(mthis, __arg_0) => $__getter___Callback_1(mthis, __arg_0);
+
+  static getTrackById_Callback_0(mthis) native "TextTrackList_getTrackById_Callback";
+  getTrackById_Callback_0_(mthis) => getTrackById_Callback_0(mthis);
+
+  static getTrackById_Callback_1(mthis, __arg_0) native "TextTrackList_getTrackById_Callback";
+  getTrackById_Callback_1_(mthis, __arg_0) => getTrackById_Callback_1(mthis, __arg_0);
+
+  static getTrackById_Callback_2(mthis, __arg_0, __arg_1) native "TextTrackList_getTrackById_Callback";
+  getTrackById_Callback_2_(mthis, __arg_0, __arg_1) => getTrackById_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getTrackById_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "TextTrackList_getTrackById_Callback";
+  getTrackById_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getTrackById_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static item_Callback_0(mthis) native "TextTrackList_item_Callback";
+  item_Callback_0_(mthis) => item_Callback_0(mthis);
+
+  static item_Callback_1(mthis, __arg_0) native "TextTrackList_item_Callback";
+  item_Callback_1_(mthis, __arg_0) => item_Callback_1(mthis, __arg_0);
+
+  static item_Callback_2(mthis, __arg_0, __arg_1) native "TextTrackList_item_Callback";
+  item_Callback_2_(mthis, __arg_0, __arg_1) => item_Callback_2(mthis, __arg_0, __arg_1);
+
+  static item_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "TextTrackList_item_Callback";
+  item_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => item_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
   static length_Getter(mthis) native "TextTrackList_length_Getter";
+  length_Getter_(mthis) => length_Getter(mthis);
 
-  static getTrackById_Callback_1(mthis, id) native "TextTrackList_getTrackById_Callback";
+  static onaddtrack_Getter(mthis) native "TextTrackList_onaddtrack_Getter";
+  onaddtrack_Getter_(mthis) => onaddtrack_Getter(mthis);
 
-  static item_Callback_1(mthis, index) native "TextTrackList_item_Callback";
+  static onaddtrack_Setter(mthis, __arg_0) native "TextTrackList_onaddtrack_Setter";
+  onaddtrack_Setter_(mthis, __arg_0) => onaddtrack_Setter(mthis, __arg_0);
+
+  static onchange_Getter(mthis) native "TextTrackList_onchange_Getter";
+  onchange_Getter_(mthis) => onchange_Getter(mthis);
+
+  static onchange_Setter(mthis, __arg_0) native "TextTrackList_onchange_Setter";
+  onchange_Setter_(mthis, __arg_0) => onchange_Setter(mthis, __arg_0);
+
+  static onremovetrack_Getter(mthis) native "TextTrackList_onremovetrack_Getter";
+  onremovetrack_Getter_(mthis) => onremovetrack_Getter(mthis);
+
+  static onremovetrack_Setter(mthis, __arg_0) native "TextTrackList_onremovetrack_Setter";
+  onremovetrack_Setter_(mthis, __arg_0) => onremovetrack_Setter(mthis, __arg_0);
+
 }
 
 class BlinkTimeRanges {
+  static final instance = new BlinkTimeRanges();
+
+  static end_Callback_0(mthis) native "TimeRanges_end_Callback";
+  end_Callback_0_(mthis) => end_Callback_0(mthis);
+
+  static end_Callback_1(mthis, __arg_0) native "TimeRanges_end_Callback";
+  end_Callback_1_(mthis, __arg_0) => end_Callback_1(mthis, __arg_0);
+
+  static end_Callback_2(mthis, __arg_0, __arg_1) native "TimeRanges_end_Callback";
+  end_Callback_2_(mthis, __arg_0, __arg_1) => end_Callback_2(mthis, __arg_0, __arg_1);
+
+  static end_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "TimeRanges_end_Callback";
+  end_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => end_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
   static length_Getter(mthis) native "TimeRanges_length_Getter";
+  length_Getter_(mthis) => length_Getter(mthis);
 
-  static end_Callback_1(mthis, index) native "TimeRanges_end_Callback";
+  static start_Callback_0(mthis) native "TimeRanges_start_Callback";
+  start_Callback_0_(mthis) => start_Callback_0(mthis);
 
-  static start_Callback_1(mthis, index) native "TimeRanges_start_Callback";
+  static start_Callback_1(mthis, __arg_0) native "TimeRanges_start_Callback";
+  start_Callback_1_(mthis, __arg_0) => start_Callback_1(mthis, __arg_0);
+
+  static start_Callback_2(mthis, __arg_0, __arg_1) native "TimeRanges_start_Callback";
+  start_Callback_2_(mthis, __arg_0, __arg_1) => start_Callback_2(mthis, __arg_0, __arg_1);
+
+  static start_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "TimeRanges_start_Callback";
+  start_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => start_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
 }
 
 class BlinkTiming {
-  static delay_Getter(mthis) native "Timing_delay_Getter";
+  static final instance = new BlinkTiming();
 
-  static delay_Setter(mthis, value) native "Timing_delay_Setter";
+  static $__getter___Callback_1(mthis, __arg_0) native "Timing___getter___Callback";
+  $__getter___Callback_1_(mthis, __arg_0) => $__getter___Callback_1(mthis, __arg_0);
+
+  static $__setter___Callback_2(mthis, __arg_0, __arg_1) native "Timing___setter___Callback";
+  $__setter___Callback_2_(mthis, __arg_0, __arg_1) => $__setter___Callback_2(mthis, __arg_0, __arg_1);
+
+  static delay_Getter(mthis) native "Timing_delay_Getter";
+  delay_Getter_(mthis) => delay_Getter(mthis);
+
+  static delay_Setter(mthis, __arg_0) native "Timing_delay_Setter";
+  delay_Setter_(mthis, __arg_0) => delay_Setter(mthis, __arg_0);
 
   static direction_Getter(mthis) native "Timing_direction_Getter";
+  direction_Getter_(mthis) => direction_Getter(mthis);
 
-  static direction_Setter(mthis, value) native "Timing_direction_Setter";
+  static direction_Setter(mthis, __arg_0) native "Timing_direction_Setter";
+  direction_Setter_(mthis, __arg_0) => direction_Setter(mthis, __arg_0);
 
   static easing_Getter(mthis) native "Timing_easing_Getter";
+  easing_Getter_(mthis) => easing_Getter(mthis);
 
-  static easing_Setter(mthis, value) native "Timing_easing_Setter";
+  static easing_Setter(mthis, __arg_0) native "Timing_easing_Setter";
+  easing_Setter_(mthis, __arg_0) => easing_Setter(mthis, __arg_0);
 
   static endDelay_Getter(mthis) native "Timing_endDelay_Getter";
+  endDelay_Getter_(mthis) => endDelay_Getter(mthis);
 
-  static endDelay_Setter(mthis, value) native "Timing_endDelay_Setter";
+  static endDelay_Setter(mthis, __arg_0) native "Timing_endDelay_Setter";
+  endDelay_Setter_(mthis, __arg_0) => endDelay_Setter(mthis, __arg_0);
 
   static fill_Getter(mthis) native "Timing_fill_Getter";
+  fill_Getter_(mthis) => fill_Getter(mthis);
 
-  static fill_Setter(mthis, value) native "Timing_fill_Setter";
+  static fill_Setter(mthis, __arg_0) native "Timing_fill_Setter";
+  fill_Setter_(mthis, __arg_0) => fill_Setter(mthis, __arg_0);
 
   static iterationStart_Getter(mthis) native "Timing_iterationStart_Getter";
+  iterationStart_Getter_(mthis) => iterationStart_Getter(mthis);
 
-  static iterationStart_Setter(mthis, value) native "Timing_iterationStart_Setter";
+  static iterationStart_Setter(mthis, __arg_0) native "Timing_iterationStart_Setter";
+  iterationStart_Setter_(mthis, __arg_0) => iterationStart_Setter(mthis, __arg_0);
 
   static iterations_Getter(mthis) native "Timing_iterations_Getter";
+  iterations_Getter_(mthis) => iterations_Getter(mthis);
 
-  static iterations_Setter(mthis, value) native "Timing_iterations_Setter";
+  static iterations_Setter(mthis, __arg_0) native "Timing_iterations_Setter";
+  iterations_Setter_(mthis, __arg_0) => iterations_Setter(mthis, __arg_0);
 
   static playbackRate_Getter(mthis) native "Timing_playbackRate_Getter";
+  playbackRate_Getter_(mthis) => playbackRate_Getter(mthis);
 
-  static playbackRate_Setter(mthis, value) native "Timing_playbackRate_Setter";
+  static playbackRate_Setter(mthis, __arg_0) native "Timing_playbackRate_Setter";
+  playbackRate_Setter_(mthis, __arg_0) => playbackRate_Setter(mthis, __arg_0);
 
-  static $__getter___Callback_1(mthis, name) native "Timing___getter___Callback";
-
-  static $__setter___Callback_2(mthis, name, duration) native "Timing___setter___Callback";
 }
 
 class BlinkTouch {
+  static final instance = new BlinkTouch();
+
   static clientX_Getter(mthis) native "Touch_clientX_Getter";
+  clientX_Getter_(mthis) => clientX_Getter(mthis);
 
   static clientY_Getter(mthis) native "Touch_clientY_Getter";
+  clientY_Getter_(mthis) => clientY_Getter(mthis);
 
   static force_Getter(mthis) native "Touch_force_Getter";
+  force_Getter_(mthis) => force_Getter(mthis);
 
   static identifier_Getter(mthis) native "Touch_identifier_Getter";
+  identifier_Getter_(mthis) => identifier_Getter(mthis);
 
   static pageX_Getter(mthis) native "Touch_pageX_Getter";
+  pageX_Getter_(mthis) => pageX_Getter(mthis);
 
   static pageY_Getter(mthis) native "Touch_pageY_Getter";
+  pageY_Getter_(mthis) => pageY_Getter(mthis);
 
   static radiusX_Getter(mthis) native "Touch_radiusX_Getter";
+  radiusX_Getter_(mthis) => radiusX_Getter(mthis);
 
   static radiusY_Getter(mthis) native "Touch_radiusY_Getter";
+  radiusY_Getter_(mthis) => radiusY_Getter(mthis);
 
   static screenX_Getter(mthis) native "Touch_screenX_Getter";
+  screenX_Getter_(mthis) => screenX_Getter(mthis);
 
   static screenY_Getter(mthis) native "Touch_screenY_Getter";
+  screenY_Getter_(mthis) => screenY_Getter(mthis);
 
   static target_Getter(mthis) native "Touch_target_Getter";
+  target_Getter_(mthis) => target_Getter(mthis);
+
+  static webkitForce_Getter(mthis) native "Touch_webkitForce_Getter";
+  webkitForce_Getter_(mthis) => webkitForce_Getter(mthis);
+
+  static webkitRadiusX_Getter(mthis) native "Touch_webkitRadiusX_Getter";
+  webkitRadiusX_Getter_(mthis) => webkitRadiusX_Getter(mthis);
+
+  static webkitRadiusY_Getter(mthis) native "Touch_webkitRadiusY_Getter";
+  webkitRadiusY_Getter_(mthis) => webkitRadiusY_Getter(mthis);
 
   static webkitRotationAngle_Getter(mthis) native "Touch_webkitRotationAngle_Getter";
+  webkitRotationAngle_Getter_(mthis) => webkitRotationAngle_Getter(mthis);
+
 }
 
-class BlinkTouchEvent {
+class BlinkTouchEvent extends BlinkUIEvent {
+  static final instance = new BlinkTouchEvent();
+
   static altKey_Getter(mthis) native "TouchEvent_altKey_Getter";
+  altKey_Getter_(mthis) => altKey_Getter(mthis);
 
   static changedTouches_Getter(mthis) native "TouchEvent_changedTouches_Getter";
+  changedTouches_Getter_(mthis) => changedTouches_Getter(mthis);
 
   static ctrlKey_Getter(mthis) native "TouchEvent_ctrlKey_Getter";
+  ctrlKey_Getter_(mthis) => ctrlKey_Getter(mthis);
+
+  static initTouchEvent_Callback_0(mthis) native "TouchEvent_initTouchEvent_Callback";
+  initTouchEvent_Callback_0_(mthis) => initTouchEvent_Callback_0(mthis);
+
+  static initTouchEvent_Callback_1(mthis, __arg_0) native "TouchEvent_initTouchEvent_Callback";
+  initTouchEvent_Callback_1_(mthis, __arg_0) => initTouchEvent_Callback_1(mthis, __arg_0);
+
+  static initTouchEvent_Callback_10(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9) native "TouchEvent_initTouchEvent_Callback";
+  initTouchEvent_Callback_10_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9) => initTouchEvent_Callback_10(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9);
+
+  static initTouchEvent_Callback_11(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10) native "TouchEvent_initTouchEvent_Callback";
+  initTouchEvent_Callback_11_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10) => initTouchEvent_Callback_11(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10);
+
+  static initTouchEvent_Callback_12(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11) native "TouchEvent_initTouchEvent_Callback";
+  initTouchEvent_Callback_12_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11) => initTouchEvent_Callback_12(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11);
+
+  static initTouchEvent_Callback_13(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11, __arg_12) native "TouchEvent_initTouchEvent_Callback";
+  initTouchEvent_Callback_13_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11, __arg_12) => initTouchEvent_Callback_13(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11, __arg_12);
+
+  static initTouchEvent_Callback_14(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11, __arg_12, __arg_13) native "TouchEvent_initTouchEvent_Callback";
+  initTouchEvent_Callback_14_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11, __arg_12, __arg_13) => initTouchEvent_Callback_14(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11, __arg_12, __arg_13);
+
+  static initTouchEvent_Callback_15(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11, __arg_12, __arg_13, __arg_14) native "TouchEvent_initTouchEvent_Callback";
+  initTouchEvent_Callback_15_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11, __arg_12, __arg_13, __arg_14) => initTouchEvent_Callback_15(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10, __arg_11, __arg_12, __arg_13, __arg_14);
+
+  static initTouchEvent_Callback_2(mthis, __arg_0, __arg_1) native "TouchEvent_initTouchEvent_Callback";
+  initTouchEvent_Callback_2_(mthis, __arg_0, __arg_1) => initTouchEvent_Callback_2(mthis, __arg_0, __arg_1);
+
+  static initTouchEvent_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "TouchEvent_initTouchEvent_Callback";
+  initTouchEvent_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => initTouchEvent_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static initTouchEvent_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "TouchEvent_initTouchEvent_Callback";
+  initTouchEvent_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => initTouchEvent_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static initTouchEvent_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "TouchEvent_initTouchEvent_Callback";
+  initTouchEvent_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => initTouchEvent_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static initTouchEvent_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "TouchEvent_initTouchEvent_Callback";
+  initTouchEvent_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => initTouchEvent_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static initTouchEvent_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) native "TouchEvent_initTouchEvent_Callback";
+  initTouchEvent_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => initTouchEvent_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6);
+
+  static initTouchEvent_Callback_8(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) native "TouchEvent_initTouchEvent_Callback";
+  initTouchEvent_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => initTouchEvent_Callback_8(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7);
+
+  static initTouchEvent_Callback_9(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) native "TouchEvent_initTouchEvent_Callback";
+  initTouchEvent_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => initTouchEvent_Callback_9(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8);
 
   static metaKey_Getter(mthis) native "TouchEvent_metaKey_Getter";
+  metaKey_Getter_(mthis) => metaKey_Getter(mthis);
 
   static shiftKey_Getter(mthis) native "TouchEvent_shiftKey_Getter";
+  shiftKey_Getter_(mthis) => shiftKey_Getter(mthis);
 
   static targetTouches_Getter(mthis) native "TouchEvent_targetTouches_Getter";
+  targetTouches_Getter_(mthis) => targetTouches_Getter(mthis);
 
   static touches_Getter(mthis) native "TouchEvent_touches_Getter";
+  touches_Getter_(mthis) => touches_Getter(mthis);
 
-  static initTouchEvent_Callback_13(mthis, touches, targetTouches, changedTouches, type, view, unused1, unused2, unused3, unused4, ctrlKey, altKey, shiftKey, metaKey) native "TouchEvent_initTouchEvent_Callback";
 }
 
 class BlinkTouchList {
-  static length_Getter(mthis) native "TouchList_length_Getter";
+  static final instance = new BlinkTouchList();
 
-  static item_Callback_1(mthis, index) native "TouchList_item_Callback";
+  static $__getter___Callback_1(mthis, __arg_0) native "TouchList___getter___Callback";
+  $__getter___Callback_1_(mthis, __arg_0) => $__getter___Callback_1(mthis, __arg_0);
+
+  static item_Callback_0(mthis) native "TouchList_item_Callback";
+  item_Callback_0_(mthis) => item_Callback_0(mthis);
+
+  static item_Callback_1(mthis, __arg_0) native "TouchList_item_Callback";
+  item_Callback_1_(mthis, __arg_0) => item_Callback_1(mthis, __arg_0);
+
+  static item_Callback_2(mthis, __arg_0, __arg_1) native "TouchList_item_Callback";
+  item_Callback_2_(mthis, __arg_0, __arg_1) => item_Callback_2(mthis, __arg_0, __arg_1);
+
+  static item_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "TouchList_item_Callback";
+  item_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => item_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static length_Getter(mthis) native "TouchList_length_Getter";
+  length_Getter_(mthis) => length_Getter(mthis);
+
 }
 
-class BlinkTrackEvent {
-  static constructorCallback(type, options) native "TrackEvent_constructorCallback";
+class BlinkTrackEvent extends BlinkEvent {
+  static final instance = new BlinkTrackEvent();
+
+  static constructorCallback_2(__arg_0, __arg_1) native "TrackEvent_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
 
   static track_Getter(mthis) native "TrackEvent_track_Getter";
+  track_Getter_(mthis) => track_Getter(mthis);
+
 }
 
-class BlinkTransitionEvent {
-  static constructorCallback(type, options) native "TransitionEvent_constructorCallback";
+class BlinkTransitionEvent extends BlinkEvent {
+  static final instance = new BlinkTransitionEvent();
+
+  static constructorCallback_2(__arg_0, __arg_1) native "TransitionEvent_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
 
   static elapsedTime_Getter(mthis) native "TransitionEvent_elapsedTime_Getter";
+  elapsedTime_Getter_(mthis) => elapsedTime_Getter(mthis);
 
   static propertyName_Getter(mthis) native "TransitionEvent_propertyName_Getter";
+  propertyName_Getter_(mthis) => propertyName_Getter(mthis);
 
   static pseudoElement_Getter(mthis) native "TransitionEvent_pseudoElement_Getter";
+  pseudoElement_Getter_(mthis) => pseudoElement_Getter(mthis);
+
 }
 
 class BlinkTreeWalker {
-  static currentNode_Getter(mthis) native "TreeWalker_currentNode_Getter";
+  static final instance = new BlinkTreeWalker();
 
-  static currentNode_Setter(mthis, value) native "TreeWalker_currentNode_Setter";
+  static currentNode_Getter(mthis) native "TreeWalker_currentNode_Getter";
+  currentNode_Getter_(mthis) => currentNode_Getter(mthis);
+
+  static currentNode_Setter(mthis, __arg_0) native "TreeWalker_currentNode_Setter";
+  currentNode_Setter_(mthis, __arg_0) => currentNode_Setter(mthis, __arg_0);
+
+  static expandEntityReferences_Getter(mthis) native "TreeWalker_expandEntityReferences_Getter";
+  expandEntityReferences_Getter_(mthis) => expandEntityReferences_Getter(mthis);
 
   static filter_Getter(mthis) native "TreeWalker_filter_Getter";
+  filter_Getter_(mthis) => filter_Getter(mthis);
+
+  static firstChild_Callback_0(mthis) native "TreeWalker_firstChild_Callback";
+  firstChild_Callback_0_(mthis) => firstChild_Callback_0(mthis);
+
+  static firstChild_Callback_1(mthis, __arg_0) native "TreeWalker_firstChild_Callback";
+  firstChild_Callback_1_(mthis, __arg_0) => firstChild_Callback_1(mthis, __arg_0);
+
+  static firstChild_Callback_2(mthis, __arg_0, __arg_1) native "TreeWalker_firstChild_Callback";
+  firstChild_Callback_2_(mthis, __arg_0, __arg_1) => firstChild_Callback_2(mthis, __arg_0, __arg_1);
+
+  static lastChild_Callback_0(mthis) native "TreeWalker_lastChild_Callback";
+  lastChild_Callback_0_(mthis) => lastChild_Callback_0(mthis);
+
+  static lastChild_Callback_1(mthis, __arg_0) native "TreeWalker_lastChild_Callback";
+  lastChild_Callback_1_(mthis, __arg_0) => lastChild_Callback_1(mthis, __arg_0);
+
+  static lastChild_Callback_2(mthis, __arg_0, __arg_1) native "TreeWalker_lastChild_Callback";
+  lastChild_Callback_2_(mthis, __arg_0, __arg_1) => lastChild_Callback_2(mthis, __arg_0, __arg_1);
+
+  static nextNode_Callback_0(mthis) native "TreeWalker_nextNode_Callback";
+  nextNode_Callback_0_(mthis) => nextNode_Callback_0(mthis);
+
+  static nextNode_Callback_1(mthis, __arg_0) native "TreeWalker_nextNode_Callback";
+  nextNode_Callback_1_(mthis, __arg_0) => nextNode_Callback_1(mthis, __arg_0);
+
+  static nextNode_Callback_2(mthis, __arg_0, __arg_1) native "TreeWalker_nextNode_Callback";
+  nextNode_Callback_2_(mthis, __arg_0, __arg_1) => nextNode_Callback_2(mthis, __arg_0, __arg_1);
+
+  static nextSibling_Callback_0(mthis) native "TreeWalker_nextSibling_Callback";
+  nextSibling_Callback_0_(mthis) => nextSibling_Callback_0(mthis);
+
+  static nextSibling_Callback_1(mthis, __arg_0) native "TreeWalker_nextSibling_Callback";
+  nextSibling_Callback_1_(mthis, __arg_0) => nextSibling_Callback_1(mthis, __arg_0);
+
+  static nextSibling_Callback_2(mthis, __arg_0, __arg_1) native "TreeWalker_nextSibling_Callback";
+  nextSibling_Callback_2_(mthis, __arg_0, __arg_1) => nextSibling_Callback_2(mthis, __arg_0, __arg_1);
+
+  static parentNode_Callback_0(mthis) native "TreeWalker_parentNode_Callback";
+  parentNode_Callback_0_(mthis) => parentNode_Callback_0(mthis);
+
+  static parentNode_Callback_1(mthis, __arg_0) native "TreeWalker_parentNode_Callback";
+  parentNode_Callback_1_(mthis, __arg_0) => parentNode_Callback_1(mthis, __arg_0);
+
+  static parentNode_Callback_2(mthis, __arg_0, __arg_1) native "TreeWalker_parentNode_Callback";
+  parentNode_Callback_2_(mthis, __arg_0, __arg_1) => parentNode_Callback_2(mthis, __arg_0, __arg_1);
+
+  static previousNode_Callback_0(mthis) native "TreeWalker_previousNode_Callback";
+  previousNode_Callback_0_(mthis) => previousNode_Callback_0(mthis);
+
+  static previousNode_Callback_1(mthis, __arg_0) native "TreeWalker_previousNode_Callback";
+  previousNode_Callback_1_(mthis, __arg_0) => previousNode_Callback_1(mthis, __arg_0);
+
+  static previousNode_Callback_2(mthis, __arg_0, __arg_1) native "TreeWalker_previousNode_Callback";
+  previousNode_Callback_2_(mthis, __arg_0, __arg_1) => previousNode_Callback_2(mthis, __arg_0, __arg_1);
+
+  static previousSibling_Callback_0(mthis) native "TreeWalker_previousSibling_Callback";
+  previousSibling_Callback_0_(mthis) => previousSibling_Callback_0(mthis);
+
+  static previousSibling_Callback_1(mthis, __arg_0) native "TreeWalker_previousSibling_Callback";
+  previousSibling_Callback_1_(mthis, __arg_0) => previousSibling_Callback_1(mthis, __arg_0);
+
+  static previousSibling_Callback_2(mthis, __arg_0, __arg_1) native "TreeWalker_previousSibling_Callback";
+  previousSibling_Callback_2_(mthis, __arg_0, __arg_1) => previousSibling_Callback_2(mthis, __arg_0, __arg_1);
 
   static root_Getter(mthis) native "TreeWalker_root_Getter";
+  root_Getter_(mthis) => root_Getter(mthis);
 
   static whatToShow_Getter(mthis) native "TreeWalker_whatToShow_Getter";
+  whatToShow_Getter_(mthis) => whatToShow_Getter(mthis);
 
-  static firstChild_Callback(mthis) native "TreeWalker_firstChild_Callback";
+}
 
-  static lastChild_Callback(mthis) native "TreeWalker_lastChild_Callback";
+class BlinkUIEvent extends BlinkEvent {
+  static final instance = new BlinkUIEvent();
 
-  static nextNode_Callback(mthis) native "TreeWalker_nextNode_Callback";
+  static charCode_Getter(mthis) native "UIEvent_charCode_Getter";
+  charCode_Getter_(mthis) => charCode_Getter(mthis);
 
-  static nextSibling_Callback(mthis) native "TreeWalker_nextSibling_Callback";
+  static constructorCallback_2(__arg_0, __arg_1) native "UIEvent_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
 
-  static parentNode_Callback(mthis) native "TreeWalker_parentNode_Callback";
+  static detail_Getter(mthis) native "UIEvent_detail_Getter";
+  detail_Getter_(mthis) => detail_Getter(mthis);
 
-  static previousNode_Callback(mthis) native "TreeWalker_previousNode_Callback";
+  static initUIEvent_Callback_0(mthis) native "UIEvent_initUIEvent_Callback";
+  initUIEvent_Callback_0_(mthis) => initUIEvent_Callback_0(mthis);
 
-  static previousSibling_Callback(mthis) native "TreeWalker_previousSibling_Callback";
+  static initUIEvent_Callback_1(mthis, __arg_0) native "UIEvent_initUIEvent_Callback";
+  initUIEvent_Callback_1_(mthis, __arg_0) => initUIEvent_Callback_1(mthis, __arg_0);
+
+  static initUIEvent_Callback_2(mthis, __arg_0, __arg_1) native "UIEvent_initUIEvent_Callback";
+  initUIEvent_Callback_2_(mthis, __arg_0, __arg_1) => initUIEvent_Callback_2(mthis, __arg_0, __arg_1);
+
+  static initUIEvent_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "UIEvent_initUIEvent_Callback";
+  initUIEvent_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => initUIEvent_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static initUIEvent_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "UIEvent_initUIEvent_Callback";
+  initUIEvent_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => initUIEvent_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static initUIEvent_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "UIEvent_initUIEvent_Callback";
+  initUIEvent_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => initUIEvent_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static initUIEvent_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "UIEvent_initUIEvent_Callback";
+  initUIEvent_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => initUIEvent_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static initUIEvent_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) native "UIEvent_initUIEvent_Callback";
+  initUIEvent_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => initUIEvent_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6);
+
+  static keyCode_Getter(mthis) native "UIEvent_keyCode_Getter";
+  keyCode_Getter_(mthis) => keyCode_Getter(mthis);
+
+  static layerX_Getter(mthis) native "UIEvent_layerX_Getter";
+  layerX_Getter_(mthis) => layerX_Getter(mthis);
+
+  static layerY_Getter(mthis) native "UIEvent_layerY_Getter";
+  layerY_Getter_(mthis) => layerY_Getter(mthis);
+
+  static pageX_Getter(mthis) native "UIEvent_pageX_Getter";
+  pageX_Getter_(mthis) => pageX_Getter(mthis);
+
+  static pageY_Getter(mthis) native "UIEvent_pageY_Getter";
+  pageY_Getter_(mthis) => pageY_Getter(mthis);
+
+  static view_Getter(mthis) native "UIEvent_view_Getter";
+  view_Getter_(mthis) => view_Getter(mthis);
+
+  static which_Getter(mthis) native "UIEvent_which_Getter";
+  which_Getter_(mthis) => which_Getter(mthis);
+
 }
 
 class BlinkURL {
-  static createObjectURL_Callback_1(blob_OR_source_OR_stream) native "URL_createObjectURL_Callback";
+  static final instance = new BlinkURL();
 
-  static revokeObjectURL_Callback_1(url) native "URL_revokeObjectURL_Callback";
+  static constructorCallback_0() native "URL_constructorCallback";
+  constructorCallback_0_() => constructorCallback_0();
+
+  static constructorCallback_1(__arg_0) native "URL_constructorCallback";
+  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+
+  static constructorCallback_2(__arg_0, __arg_1) native "URL_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+
+  static constructorCallback_3(__arg_0, __arg_1, __arg_2) native "URL_constructorCallback";
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => constructorCallback_3(__arg_0, __arg_1, __arg_2);
+
+  static constructorCallback_4(__arg_0, __arg_1, __arg_2, __arg_3) native "URL_constructorCallback";
+  constructorCallback_4_(__arg_0, __arg_1, __arg_2, __arg_3) => constructorCallback_4(__arg_0, __arg_1, __arg_2, __arg_3);
+
+  static createObjectURL_Callback_0() native "URL_createObjectURL_Callback";
+  createObjectURL_Callback_0_() => createObjectURL_Callback_0();
+
+  static createObjectURL_Callback_1(__arg_0) native "URL_createObjectURL_Callback";
+  createObjectURL_Callback_1_(__arg_0) => createObjectURL_Callback_1(__arg_0);
+
+  static createObjectURL_Callback_2(__arg_0, __arg_1) native "URL_createObjectURL_Callback";
+  createObjectURL_Callback_2_(__arg_0, __arg_1) => createObjectURL_Callback_2(__arg_0, __arg_1);
+
+  static createObjectURL_Callback_3(__arg_0, __arg_1, __arg_2) native "URL_createObjectURL_Callback";
+  createObjectURL_Callback_3_(__arg_0, __arg_1, __arg_2) => createObjectURL_Callback_3(__arg_0, __arg_1, __arg_2);
 
   static hash_Getter(mthis) native "URL_hash_Getter";
+  hash_Getter_(mthis) => hash_Getter(mthis);
 
-  static hash_Setter(mthis, value) native "URL_hash_Setter";
+  static hash_Setter(mthis, __arg_0) native "URL_hash_Setter";
+  hash_Setter_(mthis, __arg_0) => hash_Setter(mthis, __arg_0);
 
   static host_Getter(mthis) native "URL_host_Getter";
+  host_Getter_(mthis) => host_Getter(mthis);
 
-  static host_Setter(mthis, value) native "URL_host_Setter";
+  static host_Setter(mthis, __arg_0) native "URL_host_Setter";
+  host_Setter_(mthis, __arg_0) => host_Setter(mthis, __arg_0);
 
   static hostname_Getter(mthis) native "URL_hostname_Getter";
+  hostname_Getter_(mthis) => hostname_Getter(mthis);
 
-  static hostname_Setter(mthis, value) native "URL_hostname_Setter";
+  static hostname_Setter(mthis, __arg_0) native "URL_hostname_Setter";
+  hostname_Setter_(mthis, __arg_0) => hostname_Setter(mthis, __arg_0);
 
   static href_Getter(mthis) native "URL_href_Getter";
+  href_Getter_(mthis) => href_Getter(mthis);
 
-  static href_Setter(mthis, value) native "URL_href_Setter";
+  static href_Setter(mthis, __arg_0) native "URL_href_Setter";
+  href_Setter_(mthis, __arg_0) => href_Setter(mthis, __arg_0);
 
   static origin_Getter(mthis) native "URL_origin_Getter";
+  origin_Getter_(mthis) => origin_Getter(mthis);
 
   static password_Getter(mthis) native "URL_password_Getter";
+  password_Getter_(mthis) => password_Getter(mthis);
 
-  static password_Setter(mthis, value) native "URL_password_Setter";
+  static password_Setter(mthis, __arg_0) native "URL_password_Setter";
+  password_Setter_(mthis, __arg_0) => password_Setter(mthis, __arg_0);
 
   static pathname_Getter(mthis) native "URL_pathname_Getter";
+  pathname_Getter_(mthis) => pathname_Getter(mthis);
 
-  static pathname_Setter(mthis, value) native "URL_pathname_Setter";
+  static pathname_Setter(mthis, __arg_0) native "URL_pathname_Setter";
+  pathname_Setter_(mthis, __arg_0) => pathname_Setter(mthis, __arg_0);
 
   static port_Getter(mthis) native "URL_port_Getter";
+  port_Getter_(mthis) => port_Getter(mthis);
 
-  static port_Setter(mthis, value) native "URL_port_Setter";
+  static port_Setter(mthis, __arg_0) native "URL_port_Setter";
+  port_Setter_(mthis, __arg_0) => port_Setter(mthis, __arg_0);
 
   static protocol_Getter(mthis) native "URL_protocol_Getter";
+  protocol_Getter_(mthis) => protocol_Getter(mthis);
 
-  static protocol_Setter(mthis, value) native "URL_protocol_Setter";
+  static protocol_Setter(mthis, __arg_0) native "URL_protocol_Setter";
+  protocol_Setter_(mthis, __arg_0) => protocol_Setter(mthis, __arg_0);
+
+  static revokeObjectURL_Callback_0() native "URL_revokeObjectURL_Callback";
+  revokeObjectURL_Callback_0_() => revokeObjectURL_Callback_0();
+
+  static revokeObjectURL_Callback_1(__arg_0) native "URL_revokeObjectURL_Callback";
+  revokeObjectURL_Callback_1_(__arg_0) => revokeObjectURL_Callback_1(__arg_0);
+
+  static revokeObjectURL_Callback_2(__arg_0, __arg_1) native "URL_revokeObjectURL_Callback";
+  revokeObjectURL_Callback_2_(__arg_0, __arg_1) => revokeObjectURL_Callback_2(__arg_0, __arg_1);
+
+  static revokeObjectURL_Callback_3(__arg_0, __arg_1, __arg_2) native "URL_revokeObjectURL_Callback";
+  revokeObjectURL_Callback_3_(__arg_0, __arg_1, __arg_2) => revokeObjectURL_Callback_3(__arg_0, __arg_1, __arg_2);
 
   static search_Getter(mthis) native "URL_search_Getter";
+  search_Getter_(mthis) => search_Getter(mthis);
 
-  static search_Setter(mthis, value) native "URL_search_Setter";
+  static search_Setter(mthis, __arg_0) native "URL_search_Setter";
+  search_Setter_(mthis, __arg_0) => search_Setter(mthis, __arg_0);
+
+  static toString_Callback_0(mthis) native "URL_toString_Callback";
+  toString_Callback_0_(mthis) => toString_Callback_0(mthis);
+
+  static toString_Callback_1(mthis, __arg_0) native "URL_toString_Callback";
+  toString_Callback_1_(mthis, __arg_0) => toString_Callback_1(mthis, __arg_0);
+
+  static toString_Callback_2(mthis, __arg_0, __arg_1) native "URL_toString_Callback";
+  toString_Callback_2_(mthis, __arg_0, __arg_1) => toString_Callback_2(mthis, __arg_0, __arg_1);
 
   static username_Getter(mthis) native "URL_username_Getter";
+  username_Getter_(mthis) => username_Getter(mthis);
 
-  static username_Setter(mthis, value) native "URL_username_Setter";
+  static username_Setter(mthis, __arg_0) native "URL_username_Setter";
+  username_Setter_(mthis, __arg_0) => username_Setter(mthis, __arg_0);
 
-  static toString_Callback(mthis) native "URL_toString_Callback";
 }
 
-class BlinkURLUtilsReadOnly {
-  static hash_Getter(mthis) native "WorkerLocation_hash_Getter";
-
-  static host_Getter(mthis) native "WorkerLocation_host_Getter";
-
-  static hostname_Getter(mthis) native "WorkerLocation_hostname_Getter";
-
-  static href_Getter(mthis) native "WorkerLocation_href_Getter";
-
-  static origin_Getter(mthis) native "WorkerLocation_origin_Getter";
-
-  static pathname_Getter(mthis) native "WorkerLocation_pathname_Getter";
-
-  static port_Getter(mthis) native "WorkerLocation_port_Getter";
-
-  static protocol_Getter(mthis) native "WorkerLocation_protocol_Getter";
-
-  static search_Getter(mthis) native "WorkerLocation_search_Getter";
-
-  static toString_Callback(mthis) native "WorkerLocation_toString_Callback";
-}
-
-class BlinkVTTCue {
-  static constructorCallback_3(startTime, endTime, text) native "VTTCue_constructorCallback";
+class BlinkVTTCue extends BlinkTextTrackCue {
+  static final instance = new BlinkVTTCue();
 
   static align_Getter(mthis) native "VTTCue_align_Getter";
+  align_Getter_(mthis) => align_Getter(mthis);
 
-  static align_Setter(mthis, value) native "VTTCue_align_Setter";
+  static align_Setter(mthis, __arg_0) native "VTTCue_align_Setter";
+  align_Setter_(mthis, __arg_0) => align_Setter(mthis, __arg_0);
+
+  static constructorCallback_1(__arg_0) native "VTTCue_constructorCallback";
+  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+
+  static constructorCallback_2(__arg_0, __arg_1) native "VTTCue_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+
+  static constructorCallback_3(__arg_0, __arg_1, __arg_2) native "VTTCue_constructorCallback";
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => constructorCallback_3(__arg_0, __arg_1, __arg_2);
+
+  static constructorCallback_4(__arg_0, __arg_1, __arg_2, __arg_3) native "VTTCue_constructorCallback";
+  constructorCallback_4_(__arg_0, __arg_1, __arg_2, __arg_3) => constructorCallback_4(__arg_0, __arg_1, __arg_2, __arg_3);
+
+  static constructorCallback_5(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "VTTCue_constructorCallback";
+  constructorCallback_5_(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => constructorCallback_5(__arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static getCueAsHTML_Callback_0(mthis) native "VTTCue_getCueAsHTML_Callback";
+  getCueAsHTML_Callback_0_(mthis) => getCueAsHTML_Callback_0(mthis);
+
+  static getCueAsHTML_Callback_1(mthis, __arg_0) native "VTTCue_getCueAsHTML_Callback";
+  getCueAsHTML_Callback_1_(mthis, __arg_0) => getCueAsHTML_Callback_1(mthis, __arg_0);
+
+  static getCueAsHTML_Callback_2(mthis, __arg_0, __arg_1) native "VTTCue_getCueAsHTML_Callback";
+  getCueAsHTML_Callback_2_(mthis, __arg_0, __arg_1) => getCueAsHTML_Callback_2(mthis, __arg_0, __arg_1);
 
   static line_Getter(mthis) native "VTTCue_line_Getter";
+  line_Getter_(mthis) => line_Getter(mthis);
 
-  static line_Setter(mthis, value) native "VTTCue_line_Setter";
+  static line_Setter(mthis, __arg_0) native "VTTCue_line_Setter";
+  line_Setter_(mthis, __arg_0) => line_Setter(mthis, __arg_0);
 
   static position_Getter(mthis) native "VTTCue_position_Getter";
+  position_Getter_(mthis) => position_Getter(mthis);
 
-  static position_Setter(mthis, value) native "VTTCue_position_Setter";
+  static position_Setter(mthis, __arg_0) native "VTTCue_position_Setter";
+  position_Setter_(mthis, __arg_0) => position_Setter(mthis, __arg_0);
 
   static regionId_Getter(mthis) native "VTTCue_regionId_Getter";
+  regionId_Getter_(mthis) => regionId_Getter(mthis);
 
-  static regionId_Setter(mthis, value) native "VTTCue_regionId_Setter";
+  static regionId_Setter(mthis, __arg_0) native "VTTCue_regionId_Setter";
+  regionId_Setter_(mthis, __arg_0) => regionId_Setter(mthis, __arg_0);
 
   static size_Getter(mthis) native "VTTCue_size_Getter";
+  size_Getter_(mthis) => size_Getter(mthis);
 
-  static size_Setter(mthis, value) native "VTTCue_size_Setter";
+  static size_Setter(mthis, __arg_0) native "VTTCue_size_Setter";
+  size_Setter_(mthis, __arg_0) => size_Setter(mthis, __arg_0);
 
   static snapToLines_Getter(mthis) native "VTTCue_snapToLines_Getter";
+  snapToLines_Getter_(mthis) => snapToLines_Getter(mthis);
 
-  static snapToLines_Setter(mthis, value) native "VTTCue_snapToLines_Setter";
+  static snapToLines_Setter(mthis, __arg_0) native "VTTCue_snapToLines_Setter";
+  snapToLines_Setter_(mthis, __arg_0) => snapToLines_Setter(mthis, __arg_0);
 
   static text_Getter(mthis) native "VTTCue_text_Getter";
+  text_Getter_(mthis) => text_Getter(mthis);
 
-  static text_Setter(mthis, value) native "VTTCue_text_Setter";
+  static text_Setter(mthis, __arg_0) native "VTTCue_text_Setter";
+  text_Setter_(mthis, __arg_0) => text_Setter(mthis, __arg_0);
 
   static vertical_Getter(mthis) native "VTTCue_vertical_Getter";
+  vertical_Getter_(mthis) => vertical_Getter(mthis);
 
-  static vertical_Setter(mthis, value) native "VTTCue_vertical_Setter";
+  static vertical_Setter(mthis, __arg_0) native "VTTCue_vertical_Setter";
+  vertical_Setter_(mthis, __arg_0) => vertical_Setter(mthis, __arg_0);
 
-  static getCueAsHTML_Callback(mthis) native "VTTCue_getCueAsHTML_Callback";
 }
 
 class BlinkVTTRegion {
-  static constructorCallback() native "VTTRegion_constructorCallback";
+  static final instance = new BlinkVTTRegion();
+
+  static constructorCallback_0() native "VTTRegion_constructorCallback";
+  constructorCallback_0_() => constructorCallback_0();
+
+  static constructorCallback_1(__arg_0) native "VTTRegion_constructorCallback";
+  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+
+  static constructorCallback_2(__arg_0, __arg_1) native "VTTRegion_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
 
   static height_Getter(mthis) native "VTTRegion_height_Getter";
+  height_Getter_(mthis) => height_Getter(mthis);
 
-  static height_Setter(mthis, value) native "VTTRegion_height_Setter";
+  static height_Setter(mthis, __arg_0) native "VTTRegion_height_Setter";
+  height_Setter_(mthis, __arg_0) => height_Setter(mthis, __arg_0);
 
   static id_Getter(mthis) native "VTTRegion_id_Getter";
+  id_Getter_(mthis) => id_Getter(mthis);
 
-  static id_Setter(mthis, value) native "VTTRegion_id_Setter";
+  static id_Setter(mthis, __arg_0) native "VTTRegion_id_Setter";
+  id_Setter_(mthis, __arg_0) => id_Setter(mthis, __arg_0);
 
   static regionAnchorX_Getter(mthis) native "VTTRegion_regionAnchorX_Getter";
+  regionAnchorX_Getter_(mthis) => regionAnchorX_Getter(mthis);
 
-  static regionAnchorX_Setter(mthis, value) native "VTTRegion_regionAnchorX_Setter";
+  static regionAnchorX_Setter(mthis, __arg_0) native "VTTRegion_regionAnchorX_Setter";
+  regionAnchorX_Setter_(mthis, __arg_0) => regionAnchorX_Setter(mthis, __arg_0);
 
   static regionAnchorY_Getter(mthis) native "VTTRegion_regionAnchorY_Getter";
+  regionAnchorY_Getter_(mthis) => regionAnchorY_Getter(mthis);
 
-  static regionAnchorY_Setter(mthis, value) native "VTTRegion_regionAnchorY_Setter";
+  static regionAnchorY_Setter(mthis, __arg_0) native "VTTRegion_regionAnchorY_Setter";
+  regionAnchorY_Setter_(mthis, __arg_0) => regionAnchorY_Setter(mthis, __arg_0);
 
   static scroll_Getter(mthis) native "VTTRegion_scroll_Getter";
+  scroll_Getter_(mthis) => scroll_Getter(mthis);
 
-  static scroll_Setter(mthis, value) native "VTTRegion_scroll_Setter";
+  static scroll_Setter(mthis, __arg_0) native "VTTRegion_scroll_Setter";
+  scroll_Setter_(mthis, __arg_0) => scroll_Setter(mthis, __arg_0);
 
   static track_Getter(mthis) native "VTTRegion_track_Getter";
+  track_Getter_(mthis) => track_Getter(mthis);
 
   static viewportAnchorX_Getter(mthis) native "VTTRegion_viewportAnchorX_Getter";
+  viewportAnchorX_Getter_(mthis) => viewportAnchorX_Getter(mthis);
 
-  static viewportAnchorX_Setter(mthis, value) native "VTTRegion_viewportAnchorX_Setter";
+  static viewportAnchorX_Setter(mthis, __arg_0) native "VTTRegion_viewportAnchorX_Setter";
+  viewportAnchorX_Setter_(mthis, __arg_0) => viewportAnchorX_Setter(mthis, __arg_0);
 
   static viewportAnchorY_Getter(mthis) native "VTTRegion_viewportAnchorY_Getter";
+  viewportAnchorY_Getter_(mthis) => viewportAnchorY_Getter(mthis);
 
-  static viewportAnchorY_Setter(mthis, value) native "VTTRegion_viewportAnchorY_Setter";
+  static viewportAnchorY_Setter(mthis, __arg_0) native "VTTRegion_viewportAnchorY_Setter";
+  viewportAnchorY_Setter_(mthis, __arg_0) => viewportAnchorY_Setter(mthis, __arg_0);
 
   static width_Getter(mthis) native "VTTRegion_width_Getter";
+  width_Getter_(mthis) => width_Getter(mthis);
 
-  static width_Setter(mthis, value) native "VTTRegion_width_Setter";
+  static width_Setter(mthis, __arg_0) native "VTTRegion_width_Setter";
+  width_Setter_(mthis, __arg_0) => width_Setter(mthis, __arg_0);
+
 }
 
 class BlinkVTTRegionList {
+  static final instance = new BlinkVTTRegionList();
+
+  static $__getter___Callback_1(mthis, __arg_0) native "VTTRegionList___getter___Callback";
+  $__getter___Callback_1_(mthis, __arg_0) => $__getter___Callback_1(mthis, __arg_0);
+
+  static getRegionById_Callback_0(mthis) native "VTTRegionList_getRegionById_Callback";
+  getRegionById_Callback_0_(mthis) => getRegionById_Callback_0(mthis);
+
+  static getRegionById_Callback_1(mthis, __arg_0) native "VTTRegionList_getRegionById_Callback";
+  getRegionById_Callback_1_(mthis, __arg_0) => getRegionById_Callback_1(mthis, __arg_0);
+
+  static getRegionById_Callback_2(mthis, __arg_0, __arg_1) native "VTTRegionList_getRegionById_Callback";
+  getRegionById_Callback_2_(mthis, __arg_0, __arg_1) => getRegionById_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getRegionById_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "VTTRegionList_getRegionById_Callback";
+  getRegionById_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getRegionById_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static item_Callback_0(mthis) native "VTTRegionList_item_Callback";
+  item_Callback_0_(mthis) => item_Callback_0(mthis);
+
+  static item_Callback_1(mthis, __arg_0) native "VTTRegionList_item_Callback";
+  item_Callback_1_(mthis, __arg_0) => item_Callback_1(mthis, __arg_0);
+
+  static item_Callback_2(mthis, __arg_0, __arg_1) native "VTTRegionList_item_Callback";
+  item_Callback_2_(mthis, __arg_0, __arg_1) => item_Callback_2(mthis, __arg_0, __arg_1);
+
+  static item_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "VTTRegionList_item_Callback";
+  item_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => item_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
   static length_Getter(mthis) native "VTTRegionList_length_Getter";
+  length_Getter_(mthis) => length_Getter(mthis);
 
-  static getRegionById_Callback_1(mthis, id) native "VTTRegionList_getRegionById_Callback";
-
-  static item_Callback_1(mthis, index) native "VTTRegionList_item_Callback";
 }
 
 class BlinkValidityState {
+  static final instance = new BlinkValidityState();
+
   static badInput_Getter(mthis) native "ValidityState_badInput_Getter";
+  badInput_Getter_(mthis) => badInput_Getter(mthis);
 
   static customError_Getter(mthis) native "ValidityState_customError_Getter";
+  customError_Getter_(mthis) => customError_Getter(mthis);
 
   static patternMismatch_Getter(mthis) native "ValidityState_patternMismatch_Getter";
+  patternMismatch_Getter_(mthis) => patternMismatch_Getter(mthis);
 
   static rangeOverflow_Getter(mthis) native "ValidityState_rangeOverflow_Getter";
+  rangeOverflow_Getter_(mthis) => rangeOverflow_Getter(mthis);
 
   static rangeUnderflow_Getter(mthis) native "ValidityState_rangeUnderflow_Getter";
+  rangeUnderflow_Getter_(mthis) => rangeUnderflow_Getter(mthis);
 
   static stepMismatch_Getter(mthis) native "ValidityState_stepMismatch_Getter";
+  stepMismatch_Getter_(mthis) => stepMismatch_Getter(mthis);
 
   static tooLong_Getter(mthis) native "ValidityState_tooLong_Getter";
+  tooLong_Getter_(mthis) => tooLong_Getter(mthis);
 
   static typeMismatch_Getter(mthis) native "ValidityState_typeMismatch_Getter";
+  typeMismatch_Getter_(mthis) => typeMismatch_Getter(mthis);
 
   static valid_Getter(mthis) native "ValidityState_valid_Getter";
+  valid_Getter_(mthis) => valid_Getter(mthis);
 
   static valueMissing_Getter(mthis) native "ValidityState_valueMissing_Getter";
+  valueMissing_Getter_(mthis) => valueMissing_Getter(mthis);
+
 }
 
 class BlinkVideoPlaybackQuality {
+  static final instance = new BlinkVideoPlaybackQuality();
+
   static corruptedVideoFrames_Getter(mthis) native "VideoPlaybackQuality_corruptedVideoFrames_Getter";
+  corruptedVideoFrames_Getter_(mthis) => corruptedVideoFrames_Getter(mthis);
 
   static creationTime_Getter(mthis) native "VideoPlaybackQuality_creationTime_Getter";
+  creationTime_Getter_(mthis) => creationTime_Getter(mthis);
 
   static droppedVideoFrames_Getter(mthis) native "VideoPlaybackQuality_droppedVideoFrames_Getter";
+  droppedVideoFrames_Getter_(mthis) => droppedVideoFrames_Getter(mthis);
 
   static totalVideoFrames_Getter(mthis) native "VideoPlaybackQuality_totalVideoFrames_Getter";
+  totalVideoFrames_Getter_(mthis) => totalVideoFrames_Getter(mthis);
+
 }
 
 class BlinkVideoTrack {
+  static final instance = new BlinkVideoTrack();
+
   static id_Getter(mthis) native "VideoTrack_id_Getter";
+  id_Getter_(mthis) => id_Getter(mthis);
 
   static kind_Getter(mthis) native "VideoTrack_kind_Getter";
+  kind_Getter_(mthis) => kind_Getter(mthis);
 
   static label_Getter(mthis) native "VideoTrack_label_Getter";
+  label_Getter_(mthis) => label_Getter(mthis);
 
   static language_Getter(mthis) native "VideoTrack_language_Getter";
+  language_Getter_(mthis) => language_Getter(mthis);
 
   static selected_Getter(mthis) native "VideoTrack_selected_Getter";
+  selected_Getter_(mthis) => selected_Getter(mthis);
 
-  static selected_Setter(mthis, value) native "VideoTrack_selected_Setter";
+  static selected_Setter(mthis, __arg_0) native "VideoTrack_selected_Setter";
+  selected_Setter_(mthis, __arg_0) => selected_Setter(mthis, __arg_0);
+
 }
 
-class BlinkVideoTrackList {
+class BlinkVideoTrackList extends BlinkEventTarget {
+  static final instance = new BlinkVideoTrackList();
+
+  static $__getter___Callback_1(mthis, __arg_0) native "VideoTrackList___getter___Callback";
+  $__getter___Callback_1_(mthis, __arg_0) => $__getter___Callback_1(mthis, __arg_0);
+
+  static getTrackById_Callback_0(mthis) native "VideoTrackList_getTrackById_Callback";
+  getTrackById_Callback_0_(mthis) => getTrackById_Callback_0(mthis);
+
+  static getTrackById_Callback_1(mthis, __arg_0) native "VideoTrackList_getTrackById_Callback";
+  getTrackById_Callback_1_(mthis, __arg_0) => getTrackById_Callback_1(mthis, __arg_0);
+
+  static getTrackById_Callback_2(mthis, __arg_0, __arg_1) native "VideoTrackList_getTrackById_Callback";
+  getTrackById_Callback_2_(mthis, __arg_0, __arg_1) => getTrackById_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getTrackById_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "VideoTrackList_getTrackById_Callback";
+  getTrackById_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getTrackById_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
   static length_Getter(mthis) native "VideoTrackList_length_Getter";
+  length_Getter_(mthis) => length_Getter(mthis);
+
+  static onaddtrack_Getter(mthis) native "VideoTrackList_onaddtrack_Getter";
+  onaddtrack_Getter_(mthis) => onaddtrack_Getter(mthis);
+
+  static onaddtrack_Setter(mthis, __arg_0) native "VideoTrackList_onaddtrack_Setter";
+  onaddtrack_Setter_(mthis, __arg_0) => onaddtrack_Setter(mthis, __arg_0);
+
+  static onchange_Getter(mthis) native "VideoTrackList_onchange_Getter";
+  onchange_Getter_(mthis) => onchange_Getter(mthis);
+
+  static onchange_Setter(mthis, __arg_0) native "VideoTrackList_onchange_Setter";
+  onchange_Setter_(mthis, __arg_0) => onchange_Setter(mthis, __arg_0);
+
+  static onremovetrack_Getter(mthis) native "VideoTrackList_onremovetrack_Getter";
+  onremovetrack_Getter_(mthis) => onremovetrack_Getter(mthis);
+
+  static onremovetrack_Setter(mthis, __arg_0) native "VideoTrackList_onremovetrack_Setter";
+  onremovetrack_Setter_(mthis, __arg_0) => onremovetrack_Setter(mthis, __arg_0);
 
   static selectedIndex_Getter(mthis) native "VideoTrackList_selectedIndex_Getter";
+  selectedIndex_Getter_(mthis) => selectedIndex_Getter(mthis);
 
-  static $__getter___Callback_1(mthis, index) native "VideoTrackList___getter___Callback";
-
-  static getTrackById_Callback_1(mthis, id) native "VideoTrackList_getTrackById_Callback";
 }
 
-class BlinkWaveShaperNode {
-  static curve_Getter(mthis) native "WaveShaperNode_curve_Getter";
+class BlinkWaveShaperNode extends BlinkAudioNode {
+  static final instance = new BlinkWaveShaperNode();
 
-  static curve_Setter(mthis, value) native "WaveShaperNode_curve_Setter";
+  static curve_Getter(mthis) native "WaveShaperNode_curve_Getter";
+  curve_Getter_(mthis) => curve_Getter(mthis);
+
+  static curve_Setter(mthis, __arg_0) native "WaveShaperNode_curve_Setter";
+  curve_Setter_(mthis, __arg_0) => curve_Setter(mthis, __arg_0);
 
   static oversample_Getter(mthis) native "WaveShaperNode_oversample_Getter";
+  oversample_Getter_(mthis) => oversample_Getter(mthis);
 
-  static oversample_Setter(mthis, value) native "WaveShaperNode_oversample_Setter";
+  static oversample_Setter(mthis, __arg_0) native "WaveShaperNode_oversample_Setter";
+  oversample_Setter_(mthis, __arg_0) => oversample_Setter(mthis, __arg_0);
+
 }
 
 class BlinkWebGLActiveInfo {
+  static final instance = new BlinkWebGLActiveInfo();
+
   static name_Getter(mthis) native "WebGLActiveInfo_name_Getter";
+  name_Getter_(mthis) => name_Getter(mthis);
 
   static size_Getter(mthis) native "WebGLActiveInfo_size_Getter";
+  size_Getter_(mthis) => size_Getter(mthis);
 
   static type_Getter(mthis) native "WebGLActiveInfo_type_Getter";
+  type_Getter_(mthis) => type_Getter(mthis);
+
 }
 
-class BlinkWebGLBuffer {}
+class BlinkWebGLBuffer {
+  static final instance = new BlinkWebGLBuffer();
 
-class BlinkWebGLCompressedTextureATC {}
+}
 
-class BlinkWebGLCompressedTextureETC1 {}
+class BlinkWebGLCompressedTextureATC {
+  static final instance = new BlinkWebGLCompressedTextureATC();
 
-class BlinkWebGLCompressedTexturePVRTC {}
+}
 
-class BlinkWebGLCompressedTextureS3TC {}
+class BlinkWebGLCompressedTextureETC1 {
+  static final instance = new BlinkWebGLCompressedTextureETC1();
+
+}
+
+class BlinkWebGLCompressedTexturePVRTC {
+  static final instance = new BlinkWebGLCompressedTexturePVRTC();
+
+}
+
+class BlinkWebGLCompressedTextureS3TC {
+  static final instance = new BlinkWebGLCompressedTextureS3TC();
+
+}
 
 class BlinkWebGLContextAttributes {
-  static alpha_Getter(mthis) native "WebGLContextAttributes_alpha_Getter";
+  static final instance = new BlinkWebGLContextAttributes();
 
-  static alpha_Setter(mthis, value) native "WebGLContextAttributes_alpha_Setter";
+  static alpha_Getter(mthis) native "WebGLContextAttributes_alpha_Getter";
+  alpha_Getter_(mthis) => alpha_Getter(mthis);
+
+  static alpha_Setter(mthis, __arg_0) native "WebGLContextAttributes_alpha_Setter";
+  alpha_Setter_(mthis, __arg_0) => alpha_Setter(mthis, __arg_0);
 
   static antialias_Getter(mthis) native "WebGLContextAttributes_antialias_Getter";
+  antialias_Getter_(mthis) => antialias_Getter(mthis);
 
-  static antialias_Setter(mthis, value) native "WebGLContextAttributes_antialias_Setter";
+  static antialias_Setter(mthis, __arg_0) native "WebGLContextAttributes_antialias_Setter";
+  antialias_Setter_(mthis, __arg_0) => antialias_Setter(mthis, __arg_0);
 
   static depth_Getter(mthis) native "WebGLContextAttributes_depth_Getter";
+  depth_Getter_(mthis) => depth_Getter(mthis);
 
-  static depth_Setter(mthis, value) native "WebGLContextAttributes_depth_Setter";
+  static depth_Setter(mthis, __arg_0) native "WebGLContextAttributes_depth_Setter";
+  depth_Setter_(mthis, __arg_0) => depth_Setter(mthis, __arg_0);
 
   static failIfMajorPerformanceCaveat_Getter(mthis) native "WebGLContextAttributes_failIfMajorPerformanceCaveat_Getter";
+  failIfMajorPerformanceCaveat_Getter_(mthis) => failIfMajorPerformanceCaveat_Getter(mthis);
 
-  static failIfMajorPerformanceCaveat_Setter(mthis, value) native "WebGLContextAttributes_failIfMajorPerformanceCaveat_Setter";
+  static failIfMajorPerformanceCaveat_Setter(mthis, __arg_0) native "WebGLContextAttributes_failIfMajorPerformanceCaveat_Setter";
+  failIfMajorPerformanceCaveat_Setter_(mthis, __arg_0) => failIfMajorPerformanceCaveat_Setter(mthis, __arg_0);
 
   static premultipliedAlpha_Getter(mthis) native "WebGLContextAttributes_premultipliedAlpha_Getter";
+  premultipliedAlpha_Getter_(mthis) => premultipliedAlpha_Getter(mthis);
 
-  static premultipliedAlpha_Setter(mthis, value) native "WebGLContextAttributes_premultipliedAlpha_Setter";
+  static premultipliedAlpha_Setter(mthis, __arg_0) native "WebGLContextAttributes_premultipliedAlpha_Setter";
+  premultipliedAlpha_Setter_(mthis, __arg_0) => premultipliedAlpha_Setter(mthis, __arg_0);
 
   static preserveDrawingBuffer_Getter(mthis) native "WebGLContextAttributes_preserveDrawingBuffer_Getter";
+  preserveDrawingBuffer_Getter_(mthis) => preserveDrawingBuffer_Getter(mthis);
 
-  static preserveDrawingBuffer_Setter(mthis, value) native "WebGLContextAttributes_preserveDrawingBuffer_Setter";
+  static preserveDrawingBuffer_Setter(mthis, __arg_0) native "WebGLContextAttributes_preserveDrawingBuffer_Setter";
+  preserveDrawingBuffer_Setter_(mthis, __arg_0) => preserveDrawingBuffer_Setter(mthis, __arg_0);
 
   static stencil_Getter(mthis) native "WebGLContextAttributes_stencil_Getter";
+  stencil_Getter_(mthis) => stencil_Getter(mthis);
 
-  static stencil_Setter(mthis, value) native "WebGLContextAttributes_stencil_Setter";
+  static stencil_Setter(mthis, __arg_0) native "WebGLContextAttributes_stencil_Setter";
+  stencil_Setter_(mthis, __arg_0) => stencil_Setter(mthis, __arg_0);
+
 }
 
-class BlinkWebGLContextEvent {
-  static constructorCallback(type, options) native "WebGLContextEvent_constructorCallback";
+class BlinkWebGLContextEvent extends BlinkEvent {
+  static final instance = new BlinkWebGLContextEvent();
+
+  static constructorCallback_2(__arg_0, __arg_1) native "WebGLContextEvent_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
 
   static statusMessage_Getter(mthis) native "WebGLContextEvent_statusMessage_Getter";
+  statusMessage_Getter_(mthis) => statusMessage_Getter(mthis);
+
 }
 
-class BlinkWebGLDebugRendererInfo {}
+class BlinkWebGLDebugRendererInfo {
+  static final instance = new BlinkWebGLDebugRendererInfo();
+
+}
 
 class BlinkWebGLDebugShaders {
-  static getTranslatedShaderSource_Callback_1(mthis, shader) native "WebGLDebugShaders_getTranslatedShaderSource_Callback";
+  static final instance = new BlinkWebGLDebugShaders();
+
+  static getTranslatedShaderSource_Callback_0(mthis) native "WebGLDebugShaders_getTranslatedShaderSource_Callback";
+  getTranslatedShaderSource_Callback_0_(mthis) => getTranslatedShaderSource_Callback_0(mthis);
+
+  static getTranslatedShaderSource_Callback_1(mthis, __arg_0) native "WebGLDebugShaders_getTranslatedShaderSource_Callback";
+  getTranslatedShaderSource_Callback_1_(mthis, __arg_0) => getTranslatedShaderSource_Callback_1(mthis, __arg_0);
+
+  static getTranslatedShaderSource_Callback_2(mthis, __arg_0, __arg_1) native "WebGLDebugShaders_getTranslatedShaderSource_Callback";
+  getTranslatedShaderSource_Callback_2_(mthis, __arg_0, __arg_1) => getTranslatedShaderSource_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getTranslatedShaderSource_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLDebugShaders_getTranslatedShaderSource_Callback";
+  getTranslatedShaderSource_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getTranslatedShaderSource_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
 }
 
-class BlinkWebGLDepthTexture {}
+class BlinkWebGLDepthTexture {
+  static final instance = new BlinkWebGLDepthTexture();
+
+}
 
 class BlinkWebGLDrawBuffers {
-  static drawBuffersWEBGL_Callback_1(mthis, buffers) native "WebGLDrawBuffers_drawBuffersWEBGL_Callback";
+  static final instance = new BlinkWebGLDrawBuffers();
+
+  static drawBuffersWEBGL_Callback_0(mthis) native "WebGLDrawBuffers_drawBuffersWEBGL_Callback";
+  drawBuffersWEBGL_Callback_0_(mthis) => drawBuffersWEBGL_Callback_0(mthis);
+
+  static drawBuffersWEBGL_Callback_1(mthis, __arg_0) native "WebGLDrawBuffers_drawBuffersWEBGL_Callback";
+  drawBuffersWEBGL_Callback_1_(mthis, __arg_0) => drawBuffersWEBGL_Callback_1(mthis, __arg_0);
+
+  static drawBuffersWEBGL_Callback_2(mthis, __arg_0, __arg_1) native "WebGLDrawBuffers_drawBuffersWEBGL_Callback";
+  drawBuffersWEBGL_Callback_2_(mthis, __arg_0, __arg_1) => drawBuffersWEBGL_Callback_2(mthis, __arg_0, __arg_1);
+
+  static drawBuffersWEBGL_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLDrawBuffers_drawBuffersWEBGL_Callback";
+  drawBuffersWEBGL_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => drawBuffersWEBGL_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
 }
 
-class BlinkWebGLFramebuffer {}
+class BlinkWebGLFramebuffer {
+  static final instance = new BlinkWebGLFramebuffer();
+
+}
 
 class BlinkWebGLLoseContext {
-  static loseContext_Callback(mthis) native "WebGLLoseContext_loseContext_Callback";
+  static final instance = new BlinkWebGLLoseContext();
 
-  static restoreContext_Callback(mthis) native "WebGLLoseContext_restoreContext_Callback";
+  static loseContext_Callback_0(mthis) native "WebGLLoseContext_loseContext_Callback";
+  loseContext_Callback_0_(mthis) => loseContext_Callback_0(mthis);
+
+  static loseContext_Callback_1(mthis, __arg_0) native "WebGLLoseContext_loseContext_Callback";
+  loseContext_Callback_1_(mthis, __arg_0) => loseContext_Callback_1(mthis, __arg_0);
+
+  static loseContext_Callback_2(mthis, __arg_0, __arg_1) native "WebGLLoseContext_loseContext_Callback";
+  loseContext_Callback_2_(mthis, __arg_0, __arg_1) => loseContext_Callback_2(mthis, __arg_0, __arg_1);
+
+  static restoreContext_Callback_0(mthis) native "WebGLLoseContext_restoreContext_Callback";
+  restoreContext_Callback_0_(mthis) => restoreContext_Callback_0(mthis);
+
+  static restoreContext_Callback_1(mthis, __arg_0) native "WebGLLoseContext_restoreContext_Callback";
+  restoreContext_Callback_1_(mthis, __arg_0) => restoreContext_Callback_1(mthis, __arg_0);
+
+  static restoreContext_Callback_2(mthis, __arg_0, __arg_1) native "WebGLLoseContext_restoreContext_Callback";
+  restoreContext_Callback_2_(mthis, __arg_0, __arg_1) => restoreContext_Callback_2(mthis, __arg_0, __arg_1);
+
 }
 
-class BlinkWebGLProgram {}
+class BlinkWebGLProgram {
+  static final instance = new BlinkWebGLProgram();
 
-class BlinkWebGLRenderbuffer {}
+}
 
-class BlinkWebGLRenderingContextBase {}
+class BlinkWebGLRenderbuffer {
+  static final instance = new BlinkWebGLRenderbuffer();
+
+}
 
 class BlinkWebGLRenderingContext {
+  static final instance = new BlinkWebGLRenderingContext();
+
+  static activeTexture_Callback_0(mthis) native "WebGLRenderingContext_activeTexture_Callback";
+  activeTexture_Callback_0_(mthis) => activeTexture_Callback_0(mthis);
+
+  static activeTexture_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_activeTexture_Callback";
+  activeTexture_Callback_1_(mthis, __arg_0) => activeTexture_Callback_1(mthis, __arg_0);
+
+  static activeTexture_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_activeTexture_Callback";
+  activeTexture_Callback_2_(mthis, __arg_0, __arg_1) => activeTexture_Callback_2(mthis, __arg_0, __arg_1);
+
+  static activeTexture_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_activeTexture_Callback";
+  activeTexture_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => activeTexture_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static attachShader_Callback_0(mthis) native "WebGLRenderingContext_attachShader_Callback";
+  attachShader_Callback_0_(mthis) => attachShader_Callback_0(mthis);
+
+  static attachShader_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_attachShader_Callback";
+  attachShader_Callback_1_(mthis, __arg_0) => attachShader_Callback_1(mthis, __arg_0);
+
+  static attachShader_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_attachShader_Callback";
+  attachShader_Callback_2_(mthis, __arg_0, __arg_1) => attachShader_Callback_2(mthis, __arg_0, __arg_1);
+
+  static attachShader_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_attachShader_Callback";
+  attachShader_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => attachShader_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static attachShader_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_attachShader_Callback";
+  attachShader_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => attachShader_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static bindAttribLocation_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_bindAttribLocation_Callback";
+  bindAttribLocation_Callback_1_(mthis, __arg_0) => bindAttribLocation_Callback_1(mthis, __arg_0);
+
+  static bindAttribLocation_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_bindAttribLocation_Callback";
+  bindAttribLocation_Callback_2_(mthis, __arg_0, __arg_1) => bindAttribLocation_Callback_2(mthis, __arg_0, __arg_1);
+
+  static bindAttribLocation_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_bindAttribLocation_Callback";
+  bindAttribLocation_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => bindAttribLocation_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static bindAttribLocation_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_bindAttribLocation_Callback";
+  bindAttribLocation_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => bindAttribLocation_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static bindAttribLocation_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "WebGLRenderingContext_bindAttribLocation_Callback";
+  bindAttribLocation_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => bindAttribLocation_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static bindBuffer_Callback_0(mthis) native "WebGLRenderingContext_bindBuffer_Callback";
+  bindBuffer_Callback_0_(mthis) => bindBuffer_Callback_0(mthis);
+
+  static bindBuffer_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_bindBuffer_Callback";
+  bindBuffer_Callback_1_(mthis, __arg_0) => bindBuffer_Callback_1(mthis, __arg_0);
+
+  static bindBuffer_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_bindBuffer_Callback";
+  bindBuffer_Callback_2_(mthis, __arg_0, __arg_1) => bindBuffer_Callback_2(mthis, __arg_0, __arg_1);
+
+  static bindBuffer_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_bindBuffer_Callback";
+  bindBuffer_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => bindBuffer_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static bindBuffer_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_bindBuffer_Callback";
+  bindBuffer_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => bindBuffer_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static bindFramebuffer_Callback_0(mthis) native "WebGLRenderingContext_bindFramebuffer_Callback";
+  bindFramebuffer_Callback_0_(mthis) => bindFramebuffer_Callback_0(mthis);
+
+  static bindFramebuffer_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_bindFramebuffer_Callback";
+  bindFramebuffer_Callback_1_(mthis, __arg_0) => bindFramebuffer_Callback_1(mthis, __arg_0);
+
+  static bindFramebuffer_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_bindFramebuffer_Callback";
+  bindFramebuffer_Callback_2_(mthis, __arg_0, __arg_1) => bindFramebuffer_Callback_2(mthis, __arg_0, __arg_1);
+
+  static bindFramebuffer_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_bindFramebuffer_Callback";
+  bindFramebuffer_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => bindFramebuffer_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static bindFramebuffer_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_bindFramebuffer_Callback";
+  bindFramebuffer_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => bindFramebuffer_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static bindRenderbuffer_Callback_0(mthis) native "WebGLRenderingContext_bindRenderbuffer_Callback";
+  bindRenderbuffer_Callback_0_(mthis) => bindRenderbuffer_Callback_0(mthis);
+
+  static bindRenderbuffer_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_bindRenderbuffer_Callback";
+  bindRenderbuffer_Callback_1_(mthis, __arg_0) => bindRenderbuffer_Callback_1(mthis, __arg_0);
+
+  static bindRenderbuffer_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_bindRenderbuffer_Callback";
+  bindRenderbuffer_Callback_2_(mthis, __arg_0, __arg_1) => bindRenderbuffer_Callback_2(mthis, __arg_0, __arg_1);
+
+  static bindRenderbuffer_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_bindRenderbuffer_Callback";
+  bindRenderbuffer_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => bindRenderbuffer_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static bindRenderbuffer_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_bindRenderbuffer_Callback";
+  bindRenderbuffer_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => bindRenderbuffer_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static bindTexture_Callback_0(mthis) native "WebGLRenderingContext_bindTexture_Callback";
+  bindTexture_Callback_0_(mthis) => bindTexture_Callback_0(mthis);
+
+  static bindTexture_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_bindTexture_Callback";
+  bindTexture_Callback_1_(mthis, __arg_0) => bindTexture_Callback_1(mthis, __arg_0);
+
+  static bindTexture_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_bindTexture_Callback";
+  bindTexture_Callback_2_(mthis, __arg_0, __arg_1) => bindTexture_Callback_2(mthis, __arg_0, __arg_1);
+
+  static bindTexture_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_bindTexture_Callback";
+  bindTexture_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => bindTexture_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static bindTexture_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_bindTexture_Callback";
+  bindTexture_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => bindTexture_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static blendColor_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_blendColor_Callback";
+  blendColor_Callback_2_(mthis, __arg_0, __arg_1) => blendColor_Callback_2(mthis, __arg_0, __arg_1);
+
+  static blendColor_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_blendColor_Callback";
+  blendColor_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => blendColor_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static blendColor_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_blendColor_Callback";
+  blendColor_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => blendColor_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static blendColor_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "WebGLRenderingContext_blendColor_Callback";
+  blendColor_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => blendColor_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static blendColor_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "WebGLRenderingContext_blendColor_Callback";
+  blendColor_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => blendColor_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static blendEquationSeparate_Callback_0(mthis) native "WebGLRenderingContext_blendEquationSeparate_Callback";
+  blendEquationSeparate_Callback_0_(mthis) => blendEquationSeparate_Callback_0(mthis);
+
+  static blendEquationSeparate_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_blendEquationSeparate_Callback";
+  blendEquationSeparate_Callback_1_(mthis, __arg_0) => blendEquationSeparate_Callback_1(mthis, __arg_0);
+
+  static blendEquationSeparate_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_blendEquationSeparate_Callback";
+  blendEquationSeparate_Callback_2_(mthis, __arg_0, __arg_1) => blendEquationSeparate_Callback_2(mthis, __arg_0, __arg_1);
+
+  static blendEquationSeparate_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_blendEquationSeparate_Callback";
+  blendEquationSeparate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => blendEquationSeparate_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static blendEquationSeparate_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_blendEquationSeparate_Callback";
+  blendEquationSeparate_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => blendEquationSeparate_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static blendEquation_Callback_0(mthis) native "WebGLRenderingContext_blendEquation_Callback";
+  blendEquation_Callback_0_(mthis) => blendEquation_Callback_0(mthis);
+
+  static blendEquation_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_blendEquation_Callback";
+  blendEquation_Callback_1_(mthis, __arg_0) => blendEquation_Callback_1(mthis, __arg_0);
+
+  static blendEquation_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_blendEquation_Callback";
+  blendEquation_Callback_2_(mthis, __arg_0, __arg_1) => blendEquation_Callback_2(mthis, __arg_0, __arg_1);
+
+  static blendEquation_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_blendEquation_Callback";
+  blendEquation_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => blendEquation_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static blendFuncSeparate_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_blendFuncSeparate_Callback";
+  blendFuncSeparate_Callback_2_(mthis, __arg_0, __arg_1) => blendFuncSeparate_Callback_2(mthis, __arg_0, __arg_1);
+
+  static blendFuncSeparate_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_blendFuncSeparate_Callback";
+  blendFuncSeparate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => blendFuncSeparate_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static blendFuncSeparate_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_blendFuncSeparate_Callback";
+  blendFuncSeparate_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => blendFuncSeparate_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static blendFuncSeparate_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "WebGLRenderingContext_blendFuncSeparate_Callback";
+  blendFuncSeparate_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => blendFuncSeparate_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static blendFuncSeparate_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "WebGLRenderingContext_blendFuncSeparate_Callback";
+  blendFuncSeparate_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => blendFuncSeparate_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static blendFunc_Callback_0(mthis) native "WebGLRenderingContext_blendFunc_Callback";
+  blendFunc_Callback_0_(mthis) => blendFunc_Callback_0(mthis);
+
+  static blendFunc_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_blendFunc_Callback";
+  blendFunc_Callback_1_(mthis, __arg_0) => blendFunc_Callback_1(mthis, __arg_0);
+
+  static blendFunc_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_blendFunc_Callback";
+  blendFunc_Callback_2_(mthis, __arg_0, __arg_1) => blendFunc_Callback_2(mthis, __arg_0, __arg_1);
+
+  static blendFunc_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_blendFunc_Callback";
+  blendFunc_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => blendFunc_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static blendFunc_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_blendFunc_Callback";
+  blendFunc_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => blendFunc_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static bufferData_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_bufferData_Callback";
+  bufferData_Callback_1_(mthis, __arg_0) => bufferData_Callback_1(mthis, __arg_0);
+
+  static bufferData_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_bufferData_Callback";
+  bufferData_Callback_2_(mthis, __arg_0, __arg_1) => bufferData_Callback_2(mthis, __arg_0, __arg_1);
+
+  static bufferData_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_bufferData_Callback";
+  bufferData_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => bufferData_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static bufferData_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_bufferData_Callback";
+  bufferData_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => bufferData_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static bufferData_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "WebGLRenderingContext_bufferData_Callback";
+  bufferData_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => bufferData_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static bufferSubData_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_bufferSubData_Callback";
+  bufferSubData_Callback_1_(mthis, __arg_0) => bufferSubData_Callback_1(mthis, __arg_0);
+
+  static bufferSubData_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_bufferSubData_Callback";
+  bufferSubData_Callback_2_(mthis, __arg_0, __arg_1) => bufferSubData_Callback_2(mthis, __arg_0, __arg_1);
+
+  static bufferSubData_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_bufferSubData_Callback";
+  bufferSubData_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => bufferSubData_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static bufferSubData_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_bufferSubData_Callback";
+  bufferSubData_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => bufferSubData_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static bufferSubData_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "WebGLRenderingContext_bufferSubData_Callback";
+  bufferSubData_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => bufferSubData_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
   static canvas_Getter(mthis) native "WebGLRenderingContext_canvas_Getter";
+  canvas_Getter_(mthis) => canvas_Getter(mthis);
+
+  static checkFramebufferStatus_Callback_0(mthis) native "WebGLRenderingContext_checkFramebufferStatus_Callback";
+  checkFramebufferStatus_Callback_0_(mthis) => checkFramebufferStatus_Callback_0(mthis);
+
+  static checkFramebufferStatus_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_checkFramebufferStatus_Callback";
+  checkFramebufferStatus_Callback_1_(mthis, __arg_0) => checkFramebufferStatus_Callback_1(mthis, __arg_0);
+
+  static checkFramebufferStatus_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_checkFramebufferStatus_Callback";
+  checkFramebufferStatus_Callback_2_(mthis, __arg_0, __arg_1) => checkFramebufferStatus_Callback_2(mthis, __arg_0, __arg_1);
+
+  static checkFramebufferStatus_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_checkFramebufferStatus_Callback";
+  checkFramebufferStatus_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => checkFramebufferStatus_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static clearColor_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_clearColor_Callback";
+  clearColor_Callback_2_(mthis, __arg_0, __arg_1) => clearColor_Callback_2(mthis, __arg_0, __arg_1);
+
+  static clearColor_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_clearColor_Callback";
+  clearColor_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => clearColor_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static clearColor_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_clearColor_Callback";
+  clearColor_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => clearColor_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static clearColor_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "WebGLRenderingContext_clearColor_Callback";
+  clearColor_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => clearColor_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static clearColor_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "WebGLRenderingContext_clearColor_Callback";
+  clearColor_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => clearColor_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static clearDepth_Callback_0(mthis) native "WebGLRenderingContext_clearDepth_Callback";
+  clearDepth_Callback_0_(mthis) => clearDepth_Callback_0(mthis);
+
+  static clearDepth_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_clearDepth_Callback";
+  clearDepth_Callback_1_(mthis, __arg_0) => clearDepth_Callback_1(mthis, __arg_0);
+
+  static clearDepth_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_clearDepth_Callback";
+  clearDepth_Callback_2_(mthis, __arg_0, __arg_1) => clearDepth_Callback_2(mthis, __arg_0, __arg_1);
+
+  static clearDepth_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_clearDepth_Callback";
+  clearDepth_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => clearDepth_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static clearStencil_Callback_0(mthis) native "WebGLRenderingContext_clearStencil_Callback";
+  clearStencil_Callback_0_(mthis) => clearStencil_Callback_0(mthis);
+
+  static clearStencil_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_clearStencil_Callback";
+  clearStencil_Callback_1_(mthis, __arg_0) => clearStencil_Callback_1(mthis, __arg_0);
+
+  static clearStencil_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_clearStencil_Callback";
+  clearStencil_Callback_2_(mthis, __arg_0, __arg_1) => clearStencil_Callback_2(mthis, __arg_0, __arg_1);
+
+  static clearStencil_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_clearStencil_Callback";
+  clearStencil_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => clearStencil_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static clear_Callback_0(mthis) native "WebGLRenderingContext_clear_Callback";
+  clear_Callback_0_(mthis) => clear_Callback_0(mthis);
+
+  static clear_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_clear_Callback";
+  clear_Callback_1_(mthis, __arg_0) => clear_Callback_1(mthis, __arg_0);
+
+  static clear_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_clear_Callback";
+  clear_Callback_2_(mthis, __arg_0, __arg_1) => clear_Callback_2(mthis, __arg_0, __arg_1);
+
+  static clear_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_clear_Callback";
+  clear_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => clear_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static colorMask_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_colorMask_Callback";
+  colorMask_Callback_2_(mthis, __arg_0, __arg_1) => colorMask_Callback_2(mthis, __arg_0, __arg_1);
+
+  static colorMask_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_colorMask_Callback";
+  colorMask_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => colorMask_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static colorMask_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_colorMask_Callback";
+  colorMask_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => colorMask_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static colorMask_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "WebGLRenderingContext_colorMask_Callback";
+  colorMask_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => colorMask_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static colorMask_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "WebGLRenderingContext_colorMask_Callback";
+  colorMask_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => colorMask_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static compileShader_Callback_0(mthis) native "WebGLRenderingContext_compileShader_Callback";
+  compileShader_Callback_0_(mthis) => compileShader_Callback_0(mthis);
+
+  static compileShader_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_compileShader_Callback";
+  compileShader_Callback_1_(mthis, __arg_0) => compileShader_Callback_1(mthis, __arg_0);
+
+  static compileShader_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_compileShader_Callback";
+  compileShader_Callback_2_(mthis, __arg_0, __arg_1) => compileShader_Callback_2(mthis, __arg_0, __arg_1);
+
+  static compileShader_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_compileShader_Callback";
+  compileShader_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => compileShader_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static compressedTexImage2D_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "WebGLRenderingContext_compressedTexImage2D_Callback";
+  compressedTexImage2D_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => compressedTexImage2D_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static compressedTexImage2D_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "WebGLRenderingContext_compressedTexImage2D_Callback";
+  compressedTexImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => compressedTexImage2D_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static compressedTexImage2D_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) native "WebGLRenderingContext_compressedTexImage2D_Callback";
+  compressedTexImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => compressedTexImage2D_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6);
+
+  static compressedTexImage2D_Callback_8(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) native "WebGLRenderingContext_compressedTexImage2D_Callback";
+  compressedTexImage2D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => compressedTexImage2D_Callback_8(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7);
+
+  static compressedTexImage2D_Callback_9(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) native "WebGLRenderingContext_compressedTexImage2D_Callback";
+  compressedTexImage2D_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => compressedTexImage2D_Callback_9(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8);
+
+  static compressedTexSubImage2D_Callback_10(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9) native "WebGLRenderingContext_compressedTexSubImage2D_Callback";
+  compressedTexSubImage2D_Callback_10_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9) => compressedTexSubImage2D_Callback_10(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9);
+
+  static compressedTexSubImage2D_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "WebGLRenderingContext_compressedTexSubImage2D_Callback";
+  compressedTexSubImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => compressedTexSubImage2D_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static compressedTexSubImage2D_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) native "WebGLRenderingContext_compressedTexSubImage2D_Callback";
+  compressedTexSubImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => compressedTexSubImage2D_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6);
+
+  static compressedTexSubImage2D_Callback_8(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) native "WebGLRenderingContext_compressedTexSubImage2D_Callback";
+  compressedTexSubImage2D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => compressedTexSubImage2D_Callback_8(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7);
+
+  static compressedTexSubImage2D_Callback_9(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) native "WebGLRenderingContext_compressedTexSubImage2D_Callback";
+  compressedTexSubImage2D_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => compressedTexSubImage2D_Callback_9(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8);
+
+  static copyTexImage2D_Callback_10(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9) native "WebGLRenderingContext_copyTexImage2D_Callback";
+  copyTexImage2D_Callback_10_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9) => copyTexImage2D_Callback_10(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9);
+
+  static copyTexImage2D_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "WebGLRenderingContext_copyTexImage2D_Callback";
+  copyTexImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => copyTexImage2D_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static copyTexImage2D_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) native "WebGLRenderingContext_copyTexImage2D_Callback";
+  copyTexImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => copyTexImage2D_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6);
+
+  static copyTexImage2D_Callback_8(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) native "WebGLRenderingContext_copyTexImage2D_Callback";
+  copyTexImage2D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => copyTexImage2D_Callback_8(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7);
+
+  static copyTexImage2D_Callback_9(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) native "WebGLRenderingContext_copyTexImage2D_Callback";
+  copyTexImage2D_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => copyTexImage2D_Callback_9(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8);
+
+  static copyTexSubImage2D_Callback_10(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9) native "WebGLRenderingContext_copyTexSubImage2D_Callback";
+  copyTexSubImage2D_Callback_10_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9) => copyTexSubImage2D_Callback_10(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9);
+
+  static copyTexSubImage2D_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "WebGLRenderingContext_copyTexSubImage2D_Callback";
+  copyTexSubImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => copyTexSubImage2D_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static copyTexSubImage2D_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) native "WebGLRenderingContext_copyTexSubImage2D_Callback";
+  copyTexSubImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => copyTexSubImage2D_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6);
+
+  static copyTexSubImage2D_Callback_8(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) native "WebGLRenderingContext_copyTexSubImage2D_Callback";
+  copyTexSubImage2D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => copyTexSubImage2D_Callback_8(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7);
+
+  static copyTexSubImage2D_Callback_9(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) native "WebGLRenderingContext_copyTexSubImage2D_Callback";
+  copyTexSubImage2D_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => copyTexSubImage2D_Callback_9(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8);
+
+  static createBuffer_Callback_0(mthis) native "WebGLRenderingContext_createBuffer_Callback";
+  createBuffer_Callback_0_(mthis) => createBuffer_Callback_0(mthis);
+
+  static createBuffer_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_createBuffer_Callback";
+  createBuffer_Callback_1_(mthis, __arg_0) => createBuffer_Callback_1(mthis, __arg_0);
+
+  static createBuffer_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_createBuffer_Callback";
+  createBuffer_Callback_2_(mthis, __arg_0, __arg_1) => createBuffer_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createFramebuffer_Callback_0(mthis) native "WebGLRenderingContext_createFramebuffer_Callback";
+  createFramebuffer_Callback_0_(mthis) => createFramebuffer_Callback_0(mthis);
+
+  static createFramebuffer_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_createFramebuffer_Callback";
+  createFramebuffer_Callback_1_(mthis, __arg_0) => createFramebuffer_Callback_1(mthis, __arg_0);
+
+  static createFramebuffer_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_createFramebuffer_Callback";
+  createFramebuffer_Callback_2_(mthis, __arg_0, __arg_1) => createFramebuffer_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createProgram_Callback_0(mthis) native "WebGLRenderingContext_createProgram_Callback";
+  createProgram_Callback_0_(mthis) => createProgram_Callback_0(mthis);
+
+  static createProgram_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_createProgram_Callback";
+  createProgram_Callback_1_(mthis, __arg_0) => createProgram_Callback_1(mthis, __arg_0);
+
+  static createProgram_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_createProgram_Callback";
+  createProgram_Callback_2_(mthis, __arg_0, __arg_1) => createProgram_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createRenderbuffer_Callback_0(mthis) native "WebGLRenderingContext_createRenderbuffer_Callback";
+  createRenderbuffer_Callback_0_(mthis) => createRenderbuffer_Callback_0(mthis);
+
+  static createRenderbuffer_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_createRenderbuffer_Callback";
+  createRenderbuffer_Callback_1_(mthis, __arg_0) => createRenderbuffer_Callback_1(mthis, __arg_0);
+
+  static createRenderbuffer_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_createRenderbuffer_Callback";
+  createRenderbuffer_Callback_2_(mthis, __arg_0, __arg_1) => createRenderbuffer_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createShader_Callback_0(mthis) native "WebGLRenderingContext_createShader_Callback";
+  createShader_Callback_0_(mthis) => createShader_Callback_0(mthis);
+
+  static createShader_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_createShader_Callback";
+  createShader_Callback_1_(mthis, __arg_0) => createShader_Callback_1(mthis, __arg_0);
+
+  static createShader_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_createShader_Callback";
+  createShader_Callback_2_(mthis, __arg_0, __arg_1) => createShader_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createShader_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_createShader_Callback";
+  createShader_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => createShader_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static createTexture_Callback_0(mthis) native "WebGLRenderingContext_createTexture_Callback";
+  createTexture_Callback_0_(mthis) => createTexture_Callback_0(mthis);
+
+  static createTexture_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_createTexture_Callback";
+  createTexture_Callback_1_(mthis, __arg_0) => createTexture_Callback_1(mthis, __arg_0);
+
+  static createTexture_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_createTexture_Callback";
+  createTexture_Callback_2_(mthis, __arg_0, __arg_1) => createTexture_Callback_2(mthis, __arg_0, __arg_1);
+
+  static cullFace_Callback_0(mthis) native "WebGLRenderingContext_cullFace_Callback";
+  cullFace_Callback_0_(mthis) => cullFace_Callback_0(mthis);
+
+  static cullFace_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_cullFace_Callback";
+  cullFace_Callback_1_(mthis, __arg_0) => cullFace_Callback_1(mthis, __arg_0);
+
+  static cullFace_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_cullFace_Callback";
+  cullFace_Callback_2_(mthis, __arg_0, __arg_1) => cullFace_Callback_2(mthis, __arg_0, __arg_1);
+
+  static cullFace_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_cullFace_Callback";
+  cullFace_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => cullFace_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static deleteBuffer_Callback_0(mthis) native "WebGLRenderingContext_deleteBuffer_Callback";
+  deleteBuffer_Callback_0_(mthis) => deleteBuffer_Callback_0(mthis);
+
+  static deleteBuffer_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_deleteBuffer_Callback";
+  deleteBuffer_Callback_1_(mthis, __arg_0) => deleteBuffer_Callback_1(mthis, __arg_0);
+
+  static deleteBuffer_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_deleteBuffer_Callback";
+  deleteBuffer_Callback_2_(mthis, __arg_0, __arg_1) => deleteBuffer_Callback_2(mthis, __arg_0, __arg_1);
+
+  static deleteBuffer_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_deleteBuffer_Callback";
+  deleteBuffer_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => deleteBuffer_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static deleteFramebuffer_Callback_0(mthis) native "WebGLRenderingContext_deleteFramebuffer_Callback";
+  deleteFramebuffer_Callback_0_(mthis) => deleteFramebuffer_Callback_0(mthis);
+
+  static deleteFramebuffer_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_deleteFramebuffer_Callback";
+  deleteFramebuffer_Callback_1_(mthis, __arg_0) => deleteFramebuffer_Callback_1(mthis, __arg_0);
+
+  static deleteFramebuffer_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_deleteFramebuffer_Callback";
+  deleteFramebuffer_Callback_2_(mthis, __arg_0, __arg_1) => deleteFramebuffer_Callback_2(mthis, __arg_0, __arg_1);
+
+  static deleteFramebuffer_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_deleteFramebuffer_Callback";
+  deleteFramebuffer_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => deleteFramebuffer_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static deleteProgram_Callback_0(mthis) native "WebGLRenderingContext_deleteProgram_Callback";
+  deleteProgram_Callback_0_(mthis) => deleteProgram_Callback_0(mthis);
+
+  static deleteProgram_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_deleteProgram_Callback";
+  deleteProgram_Callback_1_(mthis, __arg_0) => deleteProgram_Callback_1(mthis, __arg_0);
+
+  static deleteProgram_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_deleteProgram_Callback";
+  deleteProgram_Callback_2_(mthis, __arg_0, __arg_1) => deleteProgram_Callback_2(mthis, __arg_0, __arg_1);
+
+  static deleteProgram_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_deleteProgram_Callback";
+  deleteProgram_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => deleteProgram_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static deleteRenderbuffer_Callback_0(mthis) native "WebGLRenderingContext_deleteRenderbuffer_Callback";
+  deleteRenderbuffer_Callback_0_(mthis) => deleteRenderbuffer_Callback_0(mthis);
+
+  static deleteRenderbuffer_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_deleteRenderbuffer_Callback";
+  deleteRenderbuffer_Callback_1_(mthis, __arg_0) => deleteRenderbuffer_Callback_1(mthis, __arg_0);
+
+  static deleteRenderbuffer_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_deleteRenderbuffer_Callback";
+  deleteRenderbuffer_Callback_2_(mthis, __arg_0, __arg_1) => deleteRenderbuffer_Callback_2(mthis, __arg_0, __arg_1);
+
+  static deleteRenderbuffer_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_deleteRenderbuffer_Callback";
+  deleteRenderbuffer_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => deleteRenderbuffer_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static deleteShader_Callback_0(mthis) native "WebGLRenderingContext_deleteShader_Callback";
+  deleteShader_Callback_0_(mthis) => deleteShader_Callback_0(mthis);
+
+  static deleteShader_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_deleteShader_Callback";
+  deleteShader_Callback_1_(mthis, __arg_0) => deleteShader_Callback_1(mthis, __arg_0);
+
+  static deleteShader_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_deleteShader_Callback";
+  deleteShader_Callback_2_(mthis, __arg_0, __arg_1) => deleteShader_Callback_2(mthis, __arg_0, __arg_1);
+
+  static deleteShader_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_deleteShader_Callback";
+  deleteShader_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => deleteShader_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static deleteTexture_Callback_0(mthis) native "WebGLRenderingContext_deleteTexture_Callback";
+  deleteTexture_Callback_0_(mthis) => deleteTexture_Callback_0(mthis);
+
+  static deleteTexture_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_deleteTexture_Callback";
+  deleteTexture_Callback_1_(mthis, __arg_0) => deleteTexture_Callback_1(mthis, __arg_0);
+
+  static deleteTexture_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_deleteTexture_Callback";
+  deleteTexture_Callback_2_(mthis, __arg_0, __arg_1) => deleteTexture_Callback_2(mthis, __arg_0, __arg_1);
+
+  static deleteTexture_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_deleteTexture_Callback";
+  deleteTexture_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => deleteTexture_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static depthFunc_Callback_0(mthis) native "WebGLRenderingContext_depthFunc_Callback";
+  depthFunc_Callback_0_(mthis) => depthFunc_Callback_0(mthis);
+
+  static depthFunc_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_depthFunc_Callback";
+  depthFunc_Callback_1_(mthis, __arg_0) => depthFunc_Callback_1(mthis, __arg_0);
+
+  static depthFunc_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_depthFunc_Callback";
+  depthFunc_Callback_2_(mthis, __arg_0, __arg_1) => depthFunc_Callback_2(mthis, __arg_0, __arg_1);
+
+  static depthFunc_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_depthFunc_Callback";
+  depthFunc_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => depthFunc_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static depthMask_Callback_0(mthis) native "WebGLRenderingContext_depthMask_Callback";
+  depthMask_Callback_0_(mthis) => depthMask_Callback_0(mthis);
+
+  static depthMask_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_depthMask_Callback";
+  depthMask_Callback_1_(mthis, __arg_0) => depthMask_Callback_1(mthis, __arg_0);
+
+  static depthMask_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_depthMask_Callback";
+  depthMask_Callback_2_(mthis, __arg_0, __arg_1) => depthMask_Callback_2(mthis, __arg_0, __arg_1);
+
+  static depthMask_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_depthMask_Callback";
+  depthMask_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => depthMask_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static depthRange_Callback_0(mthis) native "WebGLRenderingContext_depthRange_Callback";
+  depthRange_Callback_0_(mthis) => depthRange_Callback_0(mthis);
+
+  static depthRange_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_depthRange_Callback";
+  depthRange_Callback_1_(mthis, __arg_0) => depthRange_Callback_1(mthis, __arg_0);
+
+  static depthRange_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_depthRange_Callback";
+  depthRange_Callback_2_(mthis, __arg_0, __arg_1) => depthRange_Callback_2(mthis, __arg_0, __arg_1);
+
+  static depthRange_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_depthRange_Callback";
+  depthRange_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => depthRange_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static depthRange_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_depthRange_Callback";
+  depthRange_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => depthRange_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static detachShader_Callback_0(mthis) native "WebGLRenderingContext_detachShader_Callback";
+  detachShader_Callback_0_(mthis) => detachShader_Callback_0(mthis);
+
+  static detachShader_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_detachShader_Callback";
+  detachShader_Callback_1_(mthis, __arg_0) => detachShader_Callback_1(mthis, __arg_0);
+
+  static detachShader_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_detachShader_Callback";
+  detachShader_Callback_2_(mthis, __arg_0, __arg_1) => detachShader_Callback_2(mthis, __arg_0, __arg_1);
+
+  static detachShader_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_detachShader_Callback";
+  detachShader_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => detachShader_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static detachShader_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_detachShader_Callback";
+  detachShader_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => detachShader_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static disableVertexAttribArray_Callback_0(mthis) native "WebGLRenderingContext_disableVertexAttribArray_Callback";
+  disableVertexAttribArray_Callback_0_(mthis) => disableVertexAttribArray_Callback_0(mthis);
+
+  static disableVertexAttribArray_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_disableVertexAttribArray_Callback";
+  disableVertexAttribArray_Callback_1_(mthis, __arg_0) => disableVertexAttribArray_Callback_1(mthis, __arg_0);
+
+  static disableVertexAttribArray_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_disableVertexAttribArray_Callback";
+  disableVertexAttribArray_Callback_2_(mthis, __arg_0, __arg_1) => disableVertexAttribArray_Callback_2(mthis, __arg_0, __arg_1);
+
+  static disableVertexAttribArray_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_disableVertexAttribArray_Callback";
+  disableVertexAttribArray_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => disableVertexAttribArray_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static disable_Callback_0(mthis) native "WebGLRenderingContext_disable_Callback";
+  disable_Callback_0_(mthis) => disable_Callback_0(mthis);
+
+  static disable_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_disable_Callback";
+  disable_Callback_1_(mthis, __arg_0) => disable_Callback_1(mthis, __arg_0);
+
+  static disable_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_disable_Callback";
+  disable_Callback_2_(mthis, __arg_0, __arg_1) => disable_Callback_2(mthis, __arg_0, __arg_1);
+
+  static disable_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_disable_Callback";
+  disable_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => disable_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static drawArrays_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_drawArrays_Callback";
+  drawArrays_Callback_1_(mthis, __arg_0) => drawArrays_Callback_1(mthis, __arg_0);
+
+  static drawArrays_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_drawArrays_Callback";
+  drawArrays_Callback_2_(mthis, __arg_0, __arg_1) => drawArrays_Callback_2(mthis, __arg_0, __arg_1);
+
+  static drawArrays_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_drawArrays_Callback";
+  drawArrays_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => drawArrays_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static drawArrays_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_drawArrays_Callback";
+  drawArrays_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => drawArrays_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static drawArrays_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "WebGLRenderingContext_drawArrays_Callback";
+  drawArrays_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => drawArrays_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static drawElements_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_drawElements_Callback";
+  drawElements_Callback_2_(mthis, __arg_0, __arg_1) => drawElements_Callback_2(mthis, __arg_0, __arg_1);
+
+  static drawElements_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_drawElements_Callback";
+  drawElements_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => drawElements_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static drawElements_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_drawElements_Callback";
+  drawElements_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => drawElements_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static drawElements_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "WebGLRenderingContext_drawElements_Callback";
+  drawElements_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => drawElements_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static drawElements_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "WebGLRenderingContext_drawElements_Callback";
+  drawElements_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => drawElements_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
 
   static drawingBufferHeight_Getter(mthis) native "WebGLRenderingContext_drawingBufferHeight_Getter";
+  drawingBufferHeight_Getter_(mthis) => drawingBufferHeight_Getter(mthis);
 
   static drawingBufferWidth_Getter(mthis) native "WebGLRenderingContext_drawingBufferWidth_Getter";
+  drawingBufferWidth_Getter_(mthis) => drawingBufferWidth_Getter(mthis);
+
+  static enableVertexAttribArray_Callback_0(mthis) native "WebGLRenderingContext_enableVertexAttribArray_Callback";
+  enableVertexAttribArray_Callback_0_(mthis) => enableVertexAttribArray_Callback_0(mthis);
+
+  static enableVertexAttribArray_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_enableVertexAttribArray_Callback";
+  enableVertexAttribArray_Callback_1_(mthis, __arg_0) => enableVertexAttribArray_Callback_1(mthis, __arg_0);
+
+  static enableVertexAttribArray_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_enableVertexAttribArray_Callback";
+  enableVertexAttribArray_Callback_2_(mthis, __arg_0, __arg_1) => enableVertexAttribArray_Callback_2(mthis, __arg_0, __arg_1);
+
+  static enableVertexAttribArray_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_enableVertexAttribArray_Callback";
+  enableVertexAttribArray_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => enableVertexAttribArray_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static enable_Callback_0(mthis) native "WebGLRenderingContext_enable_Callback";
+  enable_Callback_0_(mthis) => enable_Callback_0(mthis);
+
+  static enable_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_enable_Callback";
+  enable_Callback_1_(mthis, __arg_0) => enable_Callback_1(mthis, __arg_0);
+
+  static enable_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_enable_Callback";
+  enable_Callback_2_(mthis, __arg_0, __arg_1) => enable_Callback_2(mthis, __arg_0, __arg_1);
+
+  static enable_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_enable_Callback";
+  enable_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => enable_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static finish_Callback_0(mthis) native "WebGLRenderingContext_finish_Callback";
+  finish_Callback_0_(mthis) => finish_Callback_0(mthis);
+
+  static finish_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_finish_Callback";
+  finish_Callback_1_(mthis, __arg_0) => finish_Callback_1(mthis, __arg_0);
+
+  static finish_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_finish_Callback";
+  finish_Callback_2_(mthis, __arg_0, __arg_1) => finish_Callback_2(mthis, __arg_0, __arg_1);
+
+  static flush_Callback_0(mthis) native "WebGLRenderingContext_flush_Callback";
+  flush_Callback_0_(mthis) => flush_Callback_0(mthis);
+
+  static flush_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_flush_Callback";
+  flush_Callback_1_(mthis, __arg_0) => flush_Callback_1(mthis, __arg_0);
+
+  static flush_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_flush_Callback";
+  flush_Callback_2_(mthis, __arg_0, __arg_1) => flush_Callback_2(mthis, __arg_0, __arg_1);
+
+  static framebufferRenderbuffer_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_framebufferRenderbuffer_Callback";
+  framebufferRenderbuffer_Callback_2_(mthis, __arg_0, __arg_1) => framebufferRenderbuffer_Callback_2(mthis, __arg_0, __arg_1);
+
+  static framebufferRenderbuffer_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_framebufferRenderbuffer_Callback";
+  framebufferRenderbuffer_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => framebufferRenderbuffer_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static framebufferRenderbuffer_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_framebufferRenderbuffer_Callback";
+  framebufferRenderbuffer_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => framebufferRenderbuffer_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static framebufferRenderbuffer_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "WebGLRenderingContext_framebufferRenderbuffer_Callback";
+  framebufferRenderbuffer_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => framebufferRenderbuffer_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static framebufferRenderbuffer_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "WebGLRenderingContext_framebufferRenderbuffer_Callback";
+  framebufferRenderbuffer_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => framebufferRenderbuffer_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static framebufferTexture2D_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_framebufferTexture2D_Callback";
+  framebufferTexture2D_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => framebufferTexture2D_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static framebufferTexture2D_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_framebufferTexture2D_Callback";
+  framebufferTexture2D_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => framebufferTexture2D_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static framebufferTexture2D_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "WebGLRenderingContext_framebufferTexture2D_Callback";
+  framebufferTexture2D_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => framebufferTexture2D_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static framebufferTexture2D_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "WebGLRenderingContext_framebufferTexture2D_Callback";
+  framebufferTexture2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => framebufferTexture2D_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static framebufferTexture2D_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) native "WebGLRenderingContext_framebufferTexture2D_Callback";
+  framebufferTexture2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => framebufferTexture2D_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6);
+
+  static frontFace_Callback_0(mthis) native "WebGLRenderingContext_frontFace_Callback";
+  frontFace_Callback_0_(mthis) => frontFace_Callback_0(mthis);
+
+  static frontFace_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_frontFace_Callback";
+  frontFace_Callback_1_(mthis, __arg_0) => frontFace_Callback_1(mthis, __arg_0);
+
+  static frontFace_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_frontFace_Callback";
+  frontFace_Callback_2_(mthis, __arg_0, __arg_1) => frontFace_Callback_2(mthis, __arg_0, __arg_1);
+
+  static frontFace_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_frontFace_Callback";
+  frontFace_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => frontFace_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static generateMipmap_Callback_0(mthis) native "WebGLRenderingContext_generateMipmap_Callback";
+  generateMipmap_Callback_0_(mthis) => generateMipmap_Callback_0(mthis);
+
+  static generateMipmap_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_generateMipmap_Callback";
+  generateMipmap_Callback_1_(mthis, __arg_0) => generateMipmap_Callback_1(mthis, __arg_0);
+
+  static generateMipmap_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_generateMipmap_Callback";
+  generateMipmap_Callback_2_(mthis, __arg_0, __arg_1) => generateMipmap_Callback_2(mthis, __arg_0, __arg_1);
+
+  static generateMipmap_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_generateMipmap_Callback";
+  generateMipmap_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => generateMipmap_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static getActiveAttrib_Callback_0(mthis) native "WebGLRenderingContext_getActiveAttrib_Callback";
+  getActiveAttrib_Callback_0_(mthis) => getActiveAttrib_Callback_0(mthis);
+
+  static getActiveAttrib_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_getActiveAttrib_Callback";
+  getActiveAttrib_Callback_1_(mthis, __arg_0) => getActiveAttrib_Callback_1(mthis, __arg_0);
+
+  static getActiveAttrib_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_getActiveAttrib_Callback";
+  getActiveAttrib_Callback_2_(mthis, __arg_0, __arg_1) => getActiveAttrib_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getActiveAttrib_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_getActiveAttrib_Callback";
+  getActiveAttrib_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getActiveAttrib_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static getActiveAttrib_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_getActiveAttrib_Callback";
+  getActiveAttrib_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => getActiveAttrib_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static getActiveUniform_Callback_0(mthis) native "WebGLRenderingContext_getActiveUniform_Callback";
+  getActiveUniform_Callback_0_(mthis) => getActiveUniform_Callback_0(mthis);
+
+  static getActiveUniform_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_getActiveUniform_Callback";
+  getActiveUniform_Callback_1_(mthis, __arg_0) => getActiveUniform_Callback_1(mthis, __arg_0);
+
+  static getActiveUniform_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_getActiveUniform_Callback";
+  getActiveUniform_Callback_2_(mthis, __arg_0, __arg_1) => getActiveUniform_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getActiveUniform_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_getActiveUniform_Callback";
+  getActiveUniform_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getActiveUniform_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static getActiveUniform_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_getActiveUniform_Callback";
+  getActiveUniform_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => getActiveUniform_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static getAttachedShaders_Callback_0(mthis) native "WebGLRenderingContext_getAttachedShaders_Callback";
+  getAttachedShaders_Callback_0_(mthis) => getAttachedShaders_Callback_0(mthis);
+
+  static getAttachedShaders_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_getAttachedShaders_Callback";
+  getAttachedShaders_Callback_1_(mthis, __arg_0) => getAttachedShaders_Callback_1(mthis, __arg_0);
+
+  static getAttachedShaders_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_getAttachedShaders_Callback";
+  getAttachedShaders_Callback_2_(mthis, __arg_0, __arg_1) => getAttachedShaders_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getAttachedShaders_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_getAttachedShaders_Callback";
+  getAttachedShaders_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getAttachedShaders_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static getAttribLocation_Callback_0(mthis) native "WebGLRenderingContext_getAttribLocation_Callback";
+  getAttribLocation_Callback_0_(mthis) => getAttribLocation_Callback_0(mthis);
+
+  static getAttribLocation_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_getAttribLocation_Callback";
+  getAttribLocation_Callback_1_(mthis, __arg_0) => getAttribLocation_Callback_1(mthis, __arg_0);
+
+  static getAttribLocation_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_getAttribLocation_Callback";
+  getAttribLocation_Callback_2_(mthis, __arg_0, __arg_1) => getAttribLocation_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getAttribLocation_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_getAttribLocation_Callback";
+  getAttribLocation_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getAttribLocation_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static getAttribLocation_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_getAttribLocation_Callback";
+  getAttribLocation_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => getAttribLocation_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static getBufferParameter_Callback_0(mthis) native "WebGLRenderingContext_getBufferParameter_Callback";
+  getBufferParameter_Callback_0_(mthis) => getBufferParameter_Callback_0(mthis);
+
+  static getBufferParameter_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_getBufferParameter_Callback";
+  getBufferParameter_Callback_1_(mthis, __arg_0) => getBufferParameter_Callback_1(mthis, __arg_0);
+
+  static getBufferParameter_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_getBufferParameter_Callback";
+  getBufferParameter_Callback_2_(mthis, __arg_0, __arg_1) => getBufferParameter_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getBufferParameter_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_getBufferParameter_Callback";
+  getBufferParameter_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getBufferParameter_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static getBufferParameter_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_getBufferParameter_Callback";
+  getBufferParameter_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => getBufferParameter_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static getContextAttributes_Callback_0(mthis) native "WebGLRenderingContext_getContextAttributes_Callback";
+  getContextAttributes_Callback_0_(mthis) => getContextAttributes_Callback_0(mthis);
+
+  static getContextAttributes_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_getContextAttributes_Callback";
+  getContextAttributes_Callback_1_(mthis, __arg_0) => getContextAttributes_Callback_1(mthis, __arg_0);
+
+  static getContextAttributes_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_getContextAttributes_Callback";
+  getContextAttributes_Callback_2_(mthis, __arg_0, __arg_1) => getContextAttributes_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getError_Callback_0(mthis) native "WebGLRenderingContext_getError_Callback";
+  getError_Callback_0_(mthis) => getError_Callback_0(mthis);
+
+  static getError_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_getError_Callback";
+  getError_Callback_1_(mthis, __arg_0) => getError_Callback_1(mthis, __arg_0);
+
+  static getError_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_getError_Callback";
+  getError_Callback_2_(mthis, __arg_0, __arg_1) => getError_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getExtension_Callback_0(mthis) native "WebGLRenderingContext_getExtension_Callback";
+  getExtension_Callback_0_(mthis) => getExtension_Callback_0(mthis);
+
+  static getExtension_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_getExtension_Callback";
+  getExtension_Callback_1_(mthis, __arg_0) => getExtension_Callback_1(mthis, __arg_0);
+
+  static getExtension_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_getExtension_Callback";
+  getExtension_Callback_2_(mthis, __arg_0, __arg_1) => getExtension_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getExtension_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_getExtension_Callback";
+  getExtension_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getExtension_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static getFramebufferAttachmentParameter_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_getFramebufferAttachmentParameter_Callback";
+  getFramebufferAttachmentParameter_Callback_1_(mthis, __arg_0) => getFramebufferAttachmentParameter_Callback_1(mthis, __arg_0);
+
+  static getFramebufferAttachmentParameter_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_getFramebufferAttachmentParameter_Callback";
+  getFramebufferAttachmentParameter_Callback_2_(mthis, __arg_0, __arg_1) => getFramebufferAttachmentParameter_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getFramebufferAttachmentParameter_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_getFramebufferAttachmentParameter_Callback";
+  getFramebufferAttachmentParameter_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getFramebufferAttachmentParameter_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static getFramebufferAttachmentParameter_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_getFramebufferAttachmentParameter_Callback";
+  getFramebufferAttachmentParameter_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => getFramebufferAttachmentParameter_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static getFramebufferAttachmentParameter_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "WebGLRenderingContext_getFramebufferAttachmentParameter_Callback";
+  getFramebufferAttachmentParameter_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => getFramebufferAttachmentParameter_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static getParameter_Callback_0(mthis) native "WebGLRenderingContext_getParameter_Callback";
+  getParameter_Callback_0_(mthis) => getParameter_Callback_0(mthis);
+
+  static getParameter_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_getParameter_Callback";
+  getParameter_Callback_1_(mthis, __arg_0) => getParameter_Callback_1(mthis, __arg_0);
+
+  static getParameter_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_getParameter_Callback";
+  getParameter_Callback_2_(mthis, __arg_0, __arg_1) => getParameter_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getParameter_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_getParameter_Callback";
+  getParameter_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getParameter_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static getProgramInfoLog_Callback_0(mthis) native "WebGLRenderingContext_getProgramInfoLog_Callback";
+  getProgramInfoLog_Callback_0_(mthis) => getProgramInfoLog_Callback_0(mthis);
+
+  static getProgramInfoLog_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_getProgramInfoLog_Callback";
+  getProgramInfoLog_Callback_1_(mthis, __arg_0) => getProgramInfoLog_Callback_1(mthis, __arg_0);
+
+  static getProgramInfoLog_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_getProgramInfoLog_Callback";
+  getProgramInfoLog_Callback_2_(mthis, __arg_0, __arg_1) => getProgramInfoLog_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getProgramInfoLog_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_getProgramInfoLog_Callback";
+  getProgramInfoLog_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getProgramInfoLog_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static getProgramParameter_Callback_0(mthis) native "WebGLRenderingContext_getProgramParameter_Callback";
+  getProgramParameter_Callback_0_(mthis) => getProgramParameter_Callback_0(mthis);
+
+  static getProgramParameter_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_getProgramParameter_Callback";
+  getProgramParameter_Callback_1_(mthis, __arg_0) => getProgramParameter_Callback_1(mthis, __arg_0);
+
+  static getProgramParameter_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_getProgramParameter_Callback";
+  getProgramParameter_Callback_2_(mthis, __arg_0, __arg_1) => getProgramParameter_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getProgramParameter_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_getProgramParameter_Callback";
+  getProgramParameter_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getProgramParameter_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static getProgramParameter_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_getProgramParameter_Callback";
+  getProgramParameter_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => getProgramParameter_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static getRenderbufferParameter_Callback_0(mthis) native "WebGLRenderingContext_getRenderbufferParameter_Callback";
+  getRenderbufferParameter_Callback_0_(mthis) => getRenderbufferParameter_Callback_0(mthis);
+
+  static getRenderbufferParameter_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_getRenderbufferParameter_Callback";
+  getRenderbufferParameter_Callback_1_(mthis, __arg_0) => getRenderbufferParameter_Callback_1(mthis, __arg_0);
+
+  static getRenderbufferParameter_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_getRenderbufferParameter_Callback";
+  getRenderbufferParameter_Callback_2_(mthis, __arg_0, __arg_1) => getRenderbufferParameter_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getRenderbufferParameter_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_getRenderbufferParameter_Callback";
+  getRenderbufferParameter_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getRenderbufferParameter_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static getRenderbufferParameter_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_getRenderbufferParameter_Callback";
+  getRenderbufferParameter_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => getRenderbufferParameter_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static getShaderInfoLog_Callback_0(mthis) native "WebGLRenderingContext_getShaderInfoLog_Callback";
+  getShaderInfoLog_Callback_0_(mthis) => getShaderInfoLog_Callback_0(mthis);
+
+  static getShaderInfoLog_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_getShaderInfoLog_Callback";
+  getShaderInfoLog_Callback_1_(mthis, __arg_0) => getShaderInfoLog_Callback_1(mthis, __arg_0);
+
+  static getShaderInfoLog_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_getShaderInfoLog_Callback";
+  getShaderInfoLog_Callback_2_(mthis, __arg_0, __arg_1) => getShaderInfoLog_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getShaderInfoLog_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_getShaderInfoLog_Callback";
+  getShaderInfoLog_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getShaderInfoLog_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static getShaderParameter_Callback_0(mthis) native "WebGLRenderingContext_getShaderParameter_Callback";
+  getShaderParameter_Callback_0_(mthis) => getShaderParameter_Callback_0(mthis);
+
+  static getShaderParameter_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_getShaderParameter_Callback";
+  getShaderParameter_Callback_1_(mthis, __arg_0) => getShaderParameter_Callback_1(mthis, __arg_0);
+
+  static getShaderParameter_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_getShaderParameter_Callback";
+  getShaderParameter_Callback_2_(mthis, __arg_0, __arg_1) => getShaderParameter_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getShaderParameter_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_getShaderParameter_Callback";
+  getShaderParameter_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getShaderParameter_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static getShaderParameter_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_getShaderParameter_Callback";
+  getShaderParameter_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => getShaderParameter_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static getShaderPrecisionFormat_Callback_0(mthis) native "WebGLRenderingContext_getShaderPrecisionFormat_Callback";
+  getShaderPrecisionFormat_Callback_0_(mthis) => getShaderPrecisionFormat_Callback_0(mthis);
+
+  static getShaderPrecisionFormat_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_getShaderPrecisionFormat_Callback";
+  getShaderPrecisionFormat_Callback_1_(mthis, __arg_0) => getShaderPrecisionFormat_Callback_1(mthis, __arg_0);
+
+  static getShaderPrecisionFormat_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_getShaderPrecisionFormat_Callback";
+  getShaderPrecisionFormat_Callback_2_(mthis, __arg_0, __arg_1) => getShaderPrecisionFormat_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getShaderPrecisionFormat_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_getShaderPrecisionFormat_Callback";
+  getShaderPrecisionFormat_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getShaderPrecisionFormat_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static getShaderPrecisionFormat_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_getShaderPrecisionFormat_Callback";
+  getShaderPrecisionFormat_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => getShaderPrecisionFormat_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static getShaderSource_Callback_0(mthis) native "WebGLRenderingContext_getShaderSource_Callback";
+  getShaderSource_Callback_0_(mthis) => getShaderSource_Callback_0(mthis);
+
+  static getShaderSource_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_getShaderSource_Callback";
+  getShaderSource_Callback_1_(mthis, __arg_0) => getShaderSource_Callback_1(mthis, __arg_0);
+
+  static getShaderSource_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_getShaderSource_Callback";
+  getShaderSource_Callback_2_(mthis, __arg_0, __arg_1) => getShaderSource_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getShaderSource_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_getShaderSource_Callback";
+  getShaderSource_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getShaderSource_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static getSupportedExtensions_Callback_0(mthis) native "WebGLRenderingContext_getSupportedExtensions_Callback";
+  getSupportedExtensions_Callback_0_(mthis) => getSupportedExtensions_Callback_0(mthis);
+
+  static getSupportedExtensions_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_getSupportedExtensions_Callback";
+  getSupportedExtensions_Callback_1_(mthis, __arg_0) => getSupportedExtensions_Callback_1(mthis, __arg_0);
+
+  static getSupportedExtensions_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_getSupportedExtensions_Callback";
+  getSupportedExtensions_Callback_2_(mthis, __arg_0, __arg_1) => getSupportedExtensions_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getTexParameter_Callback_0(mthis) native "WebGLRenderingContext_getTexParameter_Callback";
+  getTexParameter_Callback_0_(mthis) => getTexParameter_Callback_0(mthis);
+
+  static getTexParameter_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_getTexParameter_Callback";
+  getTexParameter_Callback_1_(mthis, __arg_0) => getTexParameter_Callback_1(mthis, __arg_0);
+
+  static getTexParameter_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_getTexParameter_Callback";
+  getTexParameter_Callback_2_(mthis, __arg_0, __arg_1) => getTexParameter_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getTexParameter_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_getTexParameter_Callback";
+  getTexParameter_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getTexParameter_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static getTexParameter_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_getTexParameter_Callback";
+  getTexParameter_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => getTexParameter_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static getUniformLocation_Callback_0(mthis) native "WebGLRenderingContext_getUniformLocation_Callback";
+  getUniformLocation_Callback_0_(mthis) => getUniformLocation_Callback_0(mthis);
+
+  static getUniformLocation_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_getUniformLocation_Callback";
+  getUniformLocation_Callback_1_(mthis, __arg_0) => getUniformLocation_Callback_1(mthis, __arg_0);
+
+  static getUniformLocation_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_getUniformLocation_Callback";
+  getUniformLocation_Callback_2_(mthis, __arg_0, __arg_1) => getUniformLocation_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getUniformLocation_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_getUniformLocation_Callback";
+  getUniformLocation_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getUniformLocation_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static getUniformLocation_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_getUniformLocation_Callback";
+  getUniformLocation_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => getUniformLocation_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static getUniform_Callback_0(mthis) native "WebGLRenderingContext_getUniform_Callback";
+  getUniform_Callback_0_(mthis) => getUniform_Callback_0(mthis);
+
+  static getUniform_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_getUniform_Callback";
+  getUniform_Callback_1_(mthis, __arg_0) => getUniform_Callback_1(mthis, __arg_0);
+
+  static getUniform_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_getUniform_Callback";
+  getUniform_Callback_2_(mthis, __arg_0, __arg_1) => getUniform_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getUniform_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_getUniform_Callback";
+  getUniform_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getUniform_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static getUniform_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_getUniform_Callback";
+  getUniform_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => getUniform_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static getVertexAttribOffset_Callback_0(mthis) native "WebGLRenderingContext_getVertexAttribOffset_Callback";
+  getVertexAttribOffset_Callback_0_(mthis) => getVertexAttribOffset_Callback_0(mthis);
+
+  static getVertexAttribOffset_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_getVertexAttribOffset_Callback";
+  getVertexAttribOffset_Callback_1_(mthis, __arg_0) => getVertexAttribOffset_Callback_1(mthis, __arg_0);
+
+  static getVertexAttribOffset_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_getVertexAttribOffset_Callback";
+  getVertexAttribOffset_Callback_2_(mthis, __arg_0, __arg_1) => getVertexAttribOffset_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getVertexAttribOffset_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_getVertexAttribOffset_Callback";
+  getVertexAttribOffset_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getVertexAttribOffset_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static getVertexAttribOffset_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_getVertexAttribOffset_Callback";
+  getVertexAttribOffset_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => getVertexAttribOffset_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static getVertexAttrib_Callback_0(mthis) native "WebGLRenderingContext_getVertexAttrib_Callback";
+  getVertexAttrib_Callback_0_(mthis) => getVertexAttrib_Callback_0(mthis);
+
+  static getVertexAttrib_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_getVertexAttrib_Callback";
+  getVertexAttrib_Callback_1_(mthis, __arg_0) => getVertexAttrib_Callback_1(mthis, __arg_0);
+
+  static getVertexAttrib_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_getVertexAttrib_Callback";
+  getVertexAttrib_Callback_2_(mthis, __arg_0, __arg_1) => getVertexAttrib_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getVertexAttrib_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_getVertexAttrib_Callback";
+  getVertexAttrib_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getVertexAttrib_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static getVertexAttrib_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_getVertexAttrib_Callback";
+  getVertexAttrib_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => getVertexAttrib_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static hint_Callback_0(mthis) native "WebGLRenderingContext_hint_Callback";
+  hint_Callback_0_(mthis) => hint_Callback_0(mthis);
+
+  static hint_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_hint_Callback";
+  hint_Callback_1_(mthis, __arg_0) => hint_Callback_1(mthis, __arg_0);
+
+  static hint_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_hint_Callback";
+  hint_Callback_2_(mthis, __arg_0, __arg_1) => hint_Callback_2(mthis, __arg_0, __arg_1);
+
+  static hint_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_hint_Callback";
+  hint_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => hint_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static hint_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_hint_Callback";
+  hint_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => hint_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static isBuffer_Callback_0(mthis) native "WebGLRenderingContext_isBuffer_Callback";
+  isBuffer_Callback_0_(mthis) => isBuffer_Callback_0(mthis);
+
+  static isBuffer_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_isBuffer_Callback";
+  isBuffer_Callback_1_(mthis, __arg_0) => isBuffer_Callback_1(mthis, __arg_0);
+
+  static isBuffer_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_isBuffer_Callback";
+  isBuffer_Callback_2_(mthis, __arg_0, __arg_1) => isBuffer_Callback_2(mthis, __arg_0, __arg_1);
+
+  static isBuffer_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_isBuffer_Callback";
+  isBuffer_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => isBuffer_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static isContextLost_Callback_0(mthis) native "WebGLRenderingContext_isContextLost_Callback";
+  isContextLost_Callback_0_(mthis) => isContextLost_Callback_0(mthis);
+
+  static isContextLost_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_isContextLost_Callback";
+  isContextLost_Callback_1_(mthis, __arg_0) => isContextLost_Callback_1(mthis, __arg_0);
+
+  static isContextLost_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_isContextLost_Callback";
+  isContextLost_Callback_2_(mthis, __arg_0, __arg_1) => isContextLost_Callback_2(mthis, __arg_0, __arg_1);
+
+  static isEnabled_Callback_0(mthis) native "WebGLRenderingContext_isEnabled_Callback";
+  isEnabled_Callback_0_(mthis) => isEnabled_Callback_0(mthis);
+
+  static isEnabled_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_isEnabled_Callback";
+  isEnabled_Callback_1_(mthis, __arg_0) => isEnabled_Callback_1(mthis, __arg_0);
+
+  static isEnabled_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_isEnabled_Callback";
+  isEnabled_Callback_2_(mthis, __arg_0, __arg_1) => isEnabled_Callback_2(mthis, __arg_0, __arg_1);
+
+  static isEnabled_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_isEnabled_Callback";
+  isEnabled_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => isEnabled_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static isFramebuffer_Callback_0(mthis) native "WebGLRenderingContext_isFramebuffer_Callback";
+  isFramebuffer_Callback_0_(mthis) => isFramebuffer_Callback_0(mthis);
+
+  static isFramebuffer_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_isFramebuffer_Callback";
+  isFramebuffer_Callback_1_(mthis, __arg_0) => isFramebuffer_Callback_1(mthis, __arg_0);
+
+  static isFramebuffer_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_isFramebuffer_Callback";
+  isFramebuffer_Callback_2_(mthis, __arg_0, __arg_1) => isFramebuffer_Callback_2(mthis, __arg_0, __arg_1);
+
+  static isFramebuffer_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_isFramebuffer_Callback";
+  isFramebuffer_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => isFramebuffer_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static isProgram_Callback_0(mthis) native "WebGLRenderingContext_isProgram_Callback";
+  isProgram_Callback_0_(mthis) => isProgram_Callback_0(mthis);
+
+  static isProgram_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_isProgram_Callback";
+  isProgram_Callback_1_(mthis, __arg_0) => isProgram_Callback_1(mthis, __arg_0);
+
+  static isProgram_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_isProgram_Callback";
+  isProgram_Callback_2_(mthis, __arg_0, __arg_1) => isProgram_Callback_2(mthis, __arg_0, __arg_1);
+
+  static isProgram_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_isProgram_Callback";
+  isProgram_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => isProgram_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static isRenderbuffer_Callback_0(mthis) native "WebGLRenderingContext_isRenderbuffer_Callback";
+  isRenderbuffer_Callback_0_(mthis) => isRenderbuffer_Callback_0(mthis);
+
+  static isRenderbuffer_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_isRenderbuffer_Callback";
+  isRenderbuffer_Callback_1_(mthis, __arg_0) => isRenderbuffer_Callback_1(mthis, __arg_0);
+
+  static isRenderbuffer_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_isRenderbuffer_Callback";
+  isRenderbuffer_Callback_2_(mthis, __arg_0, __arg_1) => isRenderbuffer_Callback_2(mthis, __arg_0, __arg_1);
+
+  static isRenderbuffer_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_isRenderbuffer_Callback";
+  isRenderbuffer_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => isRenderbuffer_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static isShader_Callback_0(mthis) native "WebGLRenderingContext_isShader_Callback";
+  isShader_Callback_0_(mthis) => isShader_Callback_0(mthis);
+
+  static isShader_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_isShader_Callback";
+  isShader_Callback_1_(mthis, __arg_0) => isShader_Callback_1(mthis, __arg_0);
+
+  static isShader_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_isShader_Callback";
+  isShader_Callback_2_(mthis, __arg_0, __arg_1) => isShader_Callback_2(mthis, __arg_0, __arg_1);
+
+  static isShader_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_isShader_Callback";
+  isShader_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => isShader_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static isTexture_Callback_0(mthis) native "WebGLRenderingContext_isTexture_Callback";
+  isTexture_Callback_0_(mthis) => isTexture_Callback_0(mthis);
+
+  static isTexture_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_isTexture_Callback";
+  isTexture_Callback_1_(mthis, __arg_0) => isTexture_Callback_1(mthis, __arg_0);
+
+  static isTexture_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_isTexture_Callback";
+  isTexture_Callback_2_(mthis, __arg_0, __arg_1) => isTexture_Callback_2(mthis, __arg_0, __arg_1);
+
+  static isTexture_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_isTexture_Callback";
+  isTexture_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => isTexture_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static lineWidth_Callback_0(mthis) native "WebGLRenderingContext_lineWidth_Callback";
+  lineWidth_Callback_0_(mthis) => lineWidth_Callback_0(mthis);
+
+  static lineWidth_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_lineWidth_Callback";
+  lineWidth_Callback_1_(mthis, __arg_0) => lineWidth_Callback_1(mthis, __arg_0);
+
+  static lineWidth_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_lineWidth_Callback";
+  lineWidth_Callback_2_(mthis, __arg_0, __arg_1) => lineWidth_Callback_2(mthis, __arg_0, __arg_1);
+
+  static lineWidth_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_lineWidth_Callback";
+  lineWidth_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => lineWidth_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static linkProgram_Callback_0(mthis) native "WebGLRenderingContext_linkProgram_Callback";
+  linkProgram_Callback_0_(mthis) => linkProgram_Callback_0(mthis);
+
+  static linkProgram_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_linkProgram_Callback";
+  linkProgram_Callback_1_(mthis, __arg_0) => linkProgram_Callback_1(mthis, __arg_0);
+
+  static linkProgram_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_linkProgram_Callback";
+  linkProgram_Callback_2_(mthis, __arg_0, __arg_1) => linkProgram_Callback_2(mthis, __arg_0, __arg_1);
+
+  static linkProgram_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_linkProgram_Callback";
+  linkProgram_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => linkProgram_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static pixelStorei_Callback_0(mthis) native "WebGLRenderingContext_pixelStorei_Callback";
+  pixelStorei_Callback_0_(mthis) => pixelStorei_Callback_0(mthis);
+
+  static pixelStorei_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_pixelStorei_Callback";
+  pixelStorei_Callback_1_(mthis, __arg_0) => pixelStorei_Callback_1(mthis, __arg_0);
+
+  static pixelStorei_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_pixelStorei_Callback";
+  pixelStorei_Callback_2_(mthis, __arg_0, __arg_1) => pixelStorei_Callback_2(mthis, __arg_0, __arg_1);
+
+  static pixelStorei_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_pixelStorei_Callback";
+  pixelStorei_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => pixelStorei_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static pixelStorei_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_pixelStorei_Callback";
+  pixelStorei_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => pixelStorei_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static polygonOffset_Callback_0(mthis) native "WebGLRenderingContext_polygonOffset_Callback";
+  polygonOffset_Callback_0_(mthis) => polygonOffset_Callback_0(mthis);
+
+  static polygonOffset_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_polygonOffset_Callback";
+  polygonOffset_Callback_1_(mthis, __arg_0) => polygonOffset_Callback_1(mthis, __arg_0);
+
+  static polygonOffset_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_polygonOffset_Callback";
+  polygonOffset_Callback_2_(mthis, __arg_0, __arg_1) => polygonOffset_Callback_2(mthis, __arg_0, __arg_1);
+
+  static polygonOffset_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_polygonOffset_Callback";
+  polygonOffset_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => polygonOffset_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static polygonOffset_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_polygonOffset_Callback";
+  polygonOffset_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => polygonOffset_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static readPixels_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "WebGLRenderingContext_readPixels_Callback";
+  readPixels_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => readPixels_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static readPixels_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "WebGLRenderingContext_readPixels_Callback";
+  readPixels_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => readPixels_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static readPixels_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) native "WebGLRenderingContext_readPixels_Callback";
+  readPixels_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => readPixels_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6);
+
+  static readPixels_Callback_8(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) native "WebGLRenderingContext_readPixels_Callback";
+  readPixels_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => readPixels_Callback_8(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7);
+
+  static readPixels_Callback_9(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) native "WebGLRenderingContext_readPixels_Callback";
+  readPixels_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => readPixels_Callback_9(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8);
+
+  static renderbufferStorage_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_renderbufferStorage_Callback";
+  renderbufferStorage_Callback_2_(mthis, __arg_0, __arg_1) => renderbufferStorage_Callback_2(mthis, __arg_0, __arg_1);
+
+  static renderbufferStorage_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_renderbufferStorage_Callback";
+  renderbufferStorage_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => renderbufferStorage_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static renderbufferStorage_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_renderbufferStorage_Callback";
+  renderbufferStorage_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => renderbufferStorage_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static renderbufferStorage_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "WebGLRenderingContext_renderbufferStorage_Callback";
+  renderbufferStorage_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => renderbufferStorage_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static renderbufferStorage_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "WebGLRenderingContext_renderbufferStorage_Callback";
+  renderbufferStorage_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => renderbufferStorage_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static sampleCoverage_Callback_0(mthis) native "WebGLRenderingContext_sampleCoverage_Callback";
+  sampleCoverage_Callback_0_(mthis) => sampleCoverage_Callback_0(mthis);
+
+  static sampleCoverage_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_sampleCoverage_Callback";
+  sampleCoverage_Callback_1_(mthis, __arg_0) => sampleCoverage_Callback_1(mthis, __arg_0);
+
+  static sampleCoverage_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_sampleCoverage_Callback";
+  sampleCoverage_Callback_2_(mthis, __arg_0, __arg_1) => sampleCoverage_Callback_2(mthis, __arg_0, __arg_1);
+
+  static sampleCoverage_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_sampleCoverage_Callback";
+  sampleCoverage_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => sampleCoverage_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static sampleCoverage_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_sampleCoverage_Callback";
+  sampleCoverage_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => sampleCoverage_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static scissor_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_scissor_Callback";
+  scissor_Callback_2_(mthis, __arg_0, __arg_1) => scissor_Callback_2(mthis, __arg_0, __arg_1);
+
+  static scissor_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_scissor_Callback";
+  scissor_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => scissor_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static scissor_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_scissor_Callback";
+  scissor_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => scissor_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static scissor_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "WebGLRenderingContext_scissor_Callback";
+  scissor_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => scissor_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static scissor_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "WebGLRenderingContext_scissor_Callback";
+  scissor_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => scissor_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static shaderSource_Callback_0(mthis) native "WebGLRenderingContext_shaderSource_Callback";
+  shaderSource_Callback_0_(mthis) => shaderSource_Callback_0(mthis);
+
+  static shaderSource_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_shaderSource_Callback";
+  shaderSource_Callback_1_(mthis, __arg_0) => shaderSource_Callback_1(mthis, __arg_0);
+
+  static shaderSource_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_shaderSource_Callback";
+  shaderSource_Callback_2_(mthis, __arg_0, __arg_1) => shaderSource_Callback_2(mthis, __arg_0, __arg_1);
+
+  static shaderSource_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_shaderSource_Callback";
+  shaderSource_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => shaderSource_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static shaderSource_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_shaderSource_Callback";
+  shaderSource_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => shaderSource_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static stencilFuncSeparate_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_stencilFuncSeparate_Callback";
+  stencilFuncSeparate_Callback_2_(mthis, __arg_0, __arg_1) => stencilFuncSeparate_Callback_2(mthis, __arg_0, __arg_1);
+
+  static stencilFuncSeparate_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_stencilFuncSeparate_Callback";
+  stencilFuncSeparate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => stencilFuncSeparate_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static stencilFuncSeparate_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_stencilFuncSeparate_Callback";
+  stencilFuncSeparate_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => stencilFuncSeparate_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static stencilFuncSeparate_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "WebGLRenderingContext_stencilFuncSeparate_Callback";
+  stencilFuncSeparate_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => stencilFuncSeparate_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static stencilFuncSeparate_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "WebGLRenderingContext_stencilFuncSeparate_Callback";
+  stencilFuncSeparate_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => stencilFuncSeparate_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static stencilFunc_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_stencilFunc_Callback";
+  stencilFunc_Callback_1_(mthis, __arg_0) => stencilFunc_Callback_1(mthis, __arg_0);
+
+  static stencilFunc_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_stencilFunc_Callback";
+  stencilFunc_Callback_2_(mthis, __arg_0, __arg_1) => stencilFunc_Callback_2(mthis, __arg_0, __arg_1);
+
+  static stencilFunc_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_stencilFunc_Callback";
+  stencilFunc_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => stencilFunc_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static stencilFunc_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_stencilFunc_Callback";
+  stencilFunc_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => stencilFunc_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static stencilFunc_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "WebGLRenderingContext_stencilFunc_Callback";
+  stencilFunc_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => stencilFunc_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static stencilMaskSeparate_Callback_0(mthis) native "WebGLRenderingContext_stencilMaskSeparate_Callback";
+  stencilMaskSeparate_Callback_0_(mthis) => stencilMaskSeparate_Callback_0(mthis);
+
+  static stencilMaskSeparate_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_stencilMaskSeparate_Callback";
+  stencilMaskSeparate_Callback_1_(mthis, __arg_0) => stencilMaskSeparate_Callback_1(mthis, __arg_0);
+
+  static stencilMaskSeparate_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_stencilMaskSeparate_Callback";
+  stencilMaskSeparate_Callback_2_(mthis, __arg_0, __arg_1) => stencilMaskSeparate_Callback_2(mthis, __arg_0, __arg_1);
+
+  static stencilMaskSeparate_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_stencilMaskSeparate_Callback";
+  stencilMaskSeparate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => stencilMaskSeparate_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static stencilMaskSeparate_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_stencilMaskSeparate_Callback";
+  stencilMaskSeparate_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => stencilMaskSeparate_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static stencilMask_Callback_0(mthis) native "WebGLRenderingContext_stencilMask_Callback";
+  stencilMask_Callback_0_(mthis) => stencilMask_Callback_0(mthis);
+
+  static stencilMask_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_stencilMask_Callback";
+  stencilMask_Callback_1_(mthis, __arg_0) => stencilMask_Callback_1(mthis, __arg_0);
+
+  static stencilMask_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_stencilMask_Callback";
+  stencilMask_Callback_2_(mthis, __arg_0, __arg_1) => stencilMask_Callback_2(mthis, __arg_0, __arg_1);
+
+  static stencilMask_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_stencilMask_Callback";
+  stencilMask_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => stencilMask_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static stencilOpSeparate_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_stencilOpSeparate_Callback";
+  stencilOpSeparate_Callback_2_(mthis, __arg_0, __arg_1) => stencilOpSeparate_Callback_2(mthis, __arg_0, __arg_1);
+
+  static stencilOpSeparate_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_stencilOpSeparate_Callback";
+  stencilOpSeparate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => stencilOpSeparate_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static stencilOpSeparate_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_stencilOpSeparate_Callback";
+  stencilOpSeparate_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => stencilOpSeparate_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static stencilOpSeparate_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "WebGLRenderingContext_stencilOpSeparate_Callback";
+  stencilOpSeparate_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => stencilOpSeparate_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static stencilOpSeparate_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "WebGLRenderingContext_stencilOpSeparate_Callback";
+  stencilOpSeparate_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => stencilOpSeparate_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static stencilOp_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_stencilOp_Callback";
+  stencilOp_Callback_1_(mthis, __arg_0) => stencilOp_Callback_1(mthis, __arg_0);
+
+  static stencilOp_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_stencilOp_Callback";
+  stencilOp_Callback_2_(mthis, __arg_0, __arg_1) => stencilOp_Callback_2(mthis, __arg_0, __arg_1);
+
+  static stencilOp_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_stencilOp_Callback";
+  stencilOp_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => stencilOp_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static stencilOp_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_stencilOp_Callback";
+  stencilOp_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => stencilOp_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static stencilOp_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "WebGLRenderingContext_stencilOp_Callback";
+  stencilOp_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => stencilOp_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static texImage2D_Callback_10(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9) native "WebGLRenderingContext_texImage2D_Callback";
+  texImage2D_Callback_10_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9) => texImage2D_Callback_10(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9);
+
+  static texImage2D_Callback_11(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10) native "WebGLRenderingContext_texImage2D_Callback";
+  texImage2D_Callback_11_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10) => texImage2D_Callback_11(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10);
+
+  static texImage2D_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_texImage2D_Callback";
+  texImage2D_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => texImage2D_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static texImage2D_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "WebGLRenderingContext_texImage2D_Callback";
+  texImage2D_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => texImage2D_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static texImage2D_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "WebGLRenderingContext_texImage2D_Callback";
+  texImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => texImage2D_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static texImage2D_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) native "WebGLRenderingContext_texImage2D_Callback";
+  texImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => texImage2D_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6);
+
+  static texImage2D_Callback_8(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) native "WebGLRenderingContext_texImage2D_Callback";
+  texImage2D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => texImage2D_Callback_8(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7);
+
+  static texImage2D_Callback_9(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) native "WebGLRenderingContext_texImage2D_Callback";
+  texImage2D_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => texImage2D_Callback_9(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8);
+
+  static texParameterf_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_texParameterf_Callback";
+  texParameterf_Callback_1_(mthis, __arg_0) => texParameterf_Callback_1(mthis, __arg_0);
+
+  static texParameterf_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_texParameterf_Callback";
+  texParameterf_Callback_2_(mthis, __arg_0, __arg_1) => texParameterf_Callback_2(mthis, __arg_0, __arg_1);
+
+  static texParameterf_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_texParameterf_Callback";
+  texParameterf_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => texParameterf_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static texParameterf_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_texParameterf_Callback";
+  texParameterf_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => texParameterf_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static texParameterf_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "WebGLRenderingContext_texParameterf_Callback";
+  texParameterf_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => texParameterf_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static texParameteri_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_texParameteri_Callback";
+  texParameteri_Callback_1_(mthis, __arg_0) => texParameteri_Callback_1(mthis, __arg_0);
+
+  static texParameteri_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_texParameteri_Callback";
+  texParameteri_Callback_2_(mthis, __arg_0, __arg_1) => texParameteri_Callback_2(mthis, __arg_0, __arg_1);
+
+  static texParameteri_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_texParameteri_Callback";
+  texParameteri_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => texParameteri_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static texParameteri_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_texParameteri_Callback";
+  texParameteri_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => texParameteri_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static texParameteri_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "WebGLRenderingContext_texParameteri_Callback";
+  texParameteri_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => texParameteri_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static texSubImage2D_Callback_10(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9) native "WebGLRenderingContext_texSubImage2D_Callback";
+  texSubImage2D_Callback_10_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9) => texSubImage2D_Callback_10(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9);
+
+  static texSubImage2D_Callback_11(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10) native "WebGLRenderingContext_texSubImage2D_Callback";
+  texSubImage2D_Callback_11_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10) => texSubImage2D_Callback_11(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10);
+
+  static texSubImage2D_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "WebGLRenderingContext_texSubImage2D_Callback";
+  texSubImage2D_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => texSubImage2D_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static texSubImage2D_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "WebGLRenderingContext_texSubImage2D_Callback";
+  texSubImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => texSubImage2D_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static texSubImage2D_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) native "WebGLRenderingContext_texSubImage2D_Callback";
+  texSubImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => texSubImage2D_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6);
+
+  static texSubImage2D_Callback_8(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) native "WebGLRenderingContext_texSubImage2D_Callback";
+  texSubImage2D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => texSubImage2D_Callback_8(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7);
+
+  static texSubImage2D_Callback_9(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) native "WebGLRenderingContext_texSubImage2D_Callback";
+  texSubImage2D_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => texSubImage2D_Callback_9(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8);
+
+  static uniform1f_Callback_0(mthis) native "WebGLRenderingContext_uniform1f_Callback";
+  uniform1f_Callback_0_(mthis) => uniform1f_Callback_0(mthis);
+
+  static uniform1f_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_uniform1f_Callback";
+  uniform1f_Callback_1_(mthis, __arg_0) => uniform1f_Callback_1(mthis, __arg_0);
+
+  static uniform1f_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_uniform1f_Callback";
+  uniform1f_Callback_2_(mthis, __arg_0, __arg_1) => uniform1f_Callback_2(mthis, __arg_0, __arg_1);
+
+  static uniform1f_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_uniform1f_Callback";
+  uniform1f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => uniform1f_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static uniform1f_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_uniform1f_Callback";
+  uniform1f_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => uniform1f_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static uniform1fv_Callback_0(mthis) native "WebGLRenderingContext_uniform1fv_Callback";
+  uniform1fv_Callback_0_(mthis) => uniform1fv_Callback_0(mthis);
+
+  static uniform1fv_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_uniform1fv_Callback";
+  uniform1fv_Callback_1_(mthis, __arg_0) => uniform1fv_Callback_1(mthis, __arg_0);
+
+  static uniform1fv_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_uniform1fv_Callback";
+  uniform1fv_Callback_2_(mthis, __arg_0, __arg_1) => uniform1fv_Callback_2(mthis, __arg_0, __arg_1);
+
+  static uniform1fv_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_uniform1fv_Callback";
+  uniform1fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => uniform1fv_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static uniform1fv_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_uniform1fv_Callback";
+  uniform1fv_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => uniform1fv_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static uniform1i_Callback_0(mthis) native "WebGLRenderingContext_uniform1i_Callback";
+  uniform1i_Callback_0_(mthis) => uniform1i_Callback_0(mthis);
+
+  static uniform1i_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_uniform1i_Callback";
+  uniform1i_Callback_1_(mthis, __arg_0) => uniform1i_Callback_1(mthis, __arg_0);
+
+  static uniform1i_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_uniform1i_Callback";
+  uniform1i_Callback_2_(mthis, __arg_0, __arg_1) => uniform1i_Callback_2(mthis, __arg_0, __arg_1);
+
+  static uniform1i_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_uniform1i_Callback";
+  uniform1i_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => uniform1i_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static uniform1i_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_uniform1i_Callback";
+  uniform1i_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => uniform1i_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static uniform1iv_Callback_0(mthis) native "WebGLRenderingContext_uniform1iv_Callback";
+  uniform1iv_Callback_0_(mthis) => uniform1iv_Callback_0(mthis);
 
-  static activeTexture_Callback_1(mthis, texture) native "WebGLRenderingContext_activeTexture_Callback";
+  static uniform1iv_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_uniform1iv_Callback";
+  uniform1iv_Callback_1_(mthis, __arg_0) => uniform1iv_Callback_1(mthis, __arg_0);
 
-  static attachShader_Callback_2(mthis, program, shader) native "WebGLRenderingContext_attachShader_Callback";
+  static uniform1iv_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_uniform1iv_Callback";
+  uniform1iv_Callback_2_(mthis, __arg_0, __arg_1) => uniform1iv_Callback_2(mthis, __arg_0, __arg_1);
 
-  static bindAttribLocation_Callback_3(mthis, program, index, name) native "WebGLRenderingContext_bindAttribLocation_Callback";
+  static uniform1iv_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_uniform1iv_Callback";
+  uniform1iv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => uniform1iv_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
-  static bindBuffer_Callback_2(mthis, target, buffer) native "WebGLRenderingContext_bindBuffer_Callback";
+  static uniform1iv_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_uniform1iv_Callback";
+  uniform1iv_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => uniform1iv_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
 
-  static bindFramebuffer_Callback_2(mthis, target, framebuffer) native "WebGLRenderingContext_bindFramebuffer_Callback";
+  static uniform2f_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_uniform2f_Callback";
+  uniform2f_Callback_1_(mthis, __arg_0) => uniform2f_Callback_1(mthis, __arg_0);
 
-  static bindRenderbuffer_Callback_2(mthis, target, renderbuffer) native "WebGLRenderingContext_bindRenderbuffer_Callback";
+  static uniform2f_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_uniform2f_Callback";
+  uniform2f_Callback_2_(mthis, __arg_0, __arg_1) => uniform2f_Callback_2(mthis, __arg_0, __arg_1);
 
-  static bindTexture_Callback_2(mthis, target, texture) native "WebGLRenderingContext_bindTexture_Callback";
+  static uniform2f_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_uniform2f_Callback";
+  uniform2f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => uniform2f_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
-  static blendColor_Callback_4(mthis, red, green, blue, alpha) native "WebGLRenderingContext_blendColor_Callback";
+  static uniform2f_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_uniform2f_Callback";
+  uniform2f_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => uniform2f_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
 
-  static blendEquation_Callback_1(mthis, mode) native "WebGLRenderingContext_blendEquation_Callback";
+  static uniform2f_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "WebGLRenderingContext_uniform2f_Callback";
+  uniform2f_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => uniform2f_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
 
-  static blendEquationSeparate_Callback_2(mthis, modeRGB, modeAlpha) native "WebGLRenderingContext_blendEquationSeparate_Callback";
+  static uniform2fv_Callback_0(mthis) native "WebGLRenderingContext_uniform2fv_Callback";
+  uniform2fv_Callback_0_(mthis) => uniform2fv_Callback_0(mthis);
 
-  static blendFunc_Callback_2(mthis, sfactor, dfactor) native "WebGLRenderingContext_blendFunc_Callback";
+  static uniform2fv_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_uniform2fv_Callback";
+  uniform2fv_Callback_1_(mthis, __arg_0) => uniform2fv_Callback_1(mthis, __arg_0);
 
-  static blendFuncSeparate_Callback_4(mthis, srcRGB, dstRGB, srcAlpha, dstAlpha) native "WebGLRenderingContext_blendFuncSeparate_Callback";
+  static uniform2fv_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_uniform2fv_Callback";
+  uniform2fv_Callback_2_(mthis, __arg_0, __arg_1) => uniform2fv_Callback_2(mthis, __arg_0, __arg_1);
 
-  static bufferData_Callback_3(mthis, target, data, usage) native "WebGLRenderingContext_bufferData_Callback";
+  static uniform2fv_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_uniform2fv_Callback";
+  uniform2fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => uniform2fv_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
-  static bufferSubData_Callback_3(mthis, target, offset, data) native "WebGLRenderingContext_bufferSubData_Callback";
+  static uniform2fv_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_uniform2fv_Callback";
+  uniform2fv_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => uniform2fv_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
 
-  static checkFramebufferStatus_Callback_1(mthis, target) native "WebGLRenderingContext_checkFramebufferStatus_Callback";
+  static uniform2i_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_uniform2i_Callback";
+  uniform2i_Callback_1_(mthis, __arg_0) => uniform2i_Callback_1(mthis, __arg_0);
 
-  static clear_Callback_1(mthis, mask) native "WebGLRenderingContext_clear_Callback";
+  static uniform2i_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_uniform2i_Callback";
+  uniform2i_Callback_2_(mthis, __arg_0, __arg_1) => uniform2i_Callback_2(mthis, __arg_0, __arg_1);
 
-  static clearColor_Callback_4(mthis, red, green, blue, alpha) native "WebGLRenderingContext_clearColor_Callback";
+  static uniform2i_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_uniform2i_Callback";
+  uniform2i_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => uniform2i_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
-  static clearDepth_Callback_1(mthis, depth) native "WebGLRenderingContext_clearDepth_Callback";
+  static uniform2i_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_uniform2i_Callback";
+  uniform2i_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => uniform2i_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
 
-  static clearStencil_Callback_1(mthis, s) native "WebGLRenderingContext_clearStencil_Callback";
+  static uniform2i_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "WebGLRenderingContext_uniform2i_Callback";
+  uniform2i_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => uniform2i_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
 
-  static colorMask_Callback_4(mthis, red, green, blue, alpha) native "WebGLRenderingContext_colorMask_Callback";
+  static uniform2iv_Callback_0(mthis) native "WebGLRenderingContext_uniform2iv_Callback";
+  uniform2iv_Callback_0_(mthis) => uniform2iv_Callback_0(mthis);
 
-  static compileShader_Callback_1(mthis, shader) native "WebGLRenderingContext_compileShader_Callback";
+  static uniform2iv_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_uniform2iv_Callback";
+  uniform2iv_Callback_1_(mthis, __arg_0) => uniform2iv_Callback_1(mthis, __arg_0);
 
-  static compressedTexImage2D_Callback_7(mthis, target, level, internalformat, width, height, border, data) native "WebGLRenderingContext_compressedTexImage2D_Callback";
+  static uniform2iv_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_uniform2iv_Callback";
+  uniform2iv_Callback_2_(mthis, __arg_0, __arg_1) => uniform2iv_Callback_2(mthis, __arg_0, __arg_1);
 
-  static compressedTexSubImage2D_Callback_8(mthis, target, level, xoffset, yoffset, width, height, format, data) native "WebGLRenderingContext_compressedTexSubImage2D_Callback";
+  static uniform2iv_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_uniform2iv_Callback";
+  uniform2iv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => uniform2iv_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
-  static copyTexImage2D_Callback_8(mthis, target, level, internalformat, x, y, width, height, border) native "WebGLRenderingContext_copyTexImage2D_Callback";
+  static uniform2iv_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_uniform2iv_Callback";
+  uniform2iv_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => uniform2iv_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
 
-  static copyTexSubImage2D_Callback_8(mthis, target, level, xoffset, yoffset, x, y, width, height) native "WebGLRenderingContext_copyTexSubImage2D_Callback";
+  static uniform3f_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_uniform3f_Callback";
+  uniform3f_Callback_2_(mthis, __arg_0, __arg_1) => uniform3f_Callback_2(mthis, __arg_0, __arg_1);
 
-  static createBuffer_Callback(mthis) native "WebGLRenderingContext_createBuffer_Callback";
+  static uniform3f_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_uniform3f_Callback";
+  uniform3f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => uniform3f_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
-  static createFramebuffer_Callback(mthis) native "WebGLRenderingContext_createFramebuffer_Callback";
+  static uniform3f_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_uniform3f_Callback";
+  uniform3f_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => uniform3f_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
 
-  static createProgram_Callback(mthis) native "WebGLRenderingContext_createProgram_Callback";
+  static uniform3f_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "WebGLRenderingContext_uniform3f_Callback";
+  uniform3f_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => uniform3f_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
 
-  static createRenderbuffer_Callback(mthis) native "WebGLRenderingContext_createRenderbuffer_Callback";
+  static uniform3f_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "WebGLRenderingContext_uniform3f_Callback";
+  uniform3f_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => uniform3f_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
 
-  static createShader_Callback_1(mthis, type) native "WebGLRenderingContext_createShader_Callback";
+  static uniform3fv_Callback_0(mthis) native "WebGLRenderingContext_uniform3fv_Callback";
+  uniform3fv_Callback_0_(mthis) => uniform3fv_Callback_0(mthis);
 
-  static createTexture_Callback(mthis) native "WebGLRenderingContext_createTexture_Callback";
+  static uniform3fv_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_uniform3fv_Callback";
+  uniform3fv_Callback_1_(mthis, __arg_0) => uniform3fv_Callback_1(mthis, __arg_0);
 
-  static cullFace_Callback_1(mthis, mode) native "WebGLRenderingContext_cullFace_Callback";
+  static uniform3fv_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_uniform3fv_Callback";
+  uniform3fv_Callback_2_(mthis, __arg_0, __arg_1) => uniform3fv_Callback_2(mthis, __arg_0, __arg_1);
 
-  static deleteBuffer_Callback_1(mthis, buffer) native "WebGLRenderingContext_deleteBuffer_Callback";
+  static uniform3fv_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_uniform3fv_Callback";
+  uniform3fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => uniform3fv_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
-  static deleteFramebuffer_Callback_1(mthis, framebuffer) native "WebGLRenderingContext_deleteFramebuffer_Callback";
+  static uniform3fv_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_uniform3fv_Callback";
+  uniform3fv_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => uniform3fv_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
 
-  static deleteProgram_Callback_1(mthis, program) native "WebGLRenderingContext_deleteProgram_Callback";
+  static uniform3i_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_uniform3i_Callback";
+  uniform3i_Callback_2_(mthis, __arg_0, __arg_1) => uniform3i_Callback_2(mthis, __arg_0, __arg_1);
 
-  static deleteRenderbuffer_Callback_1(mthis, renderbuffer) native "WebGLRenderingContext_deleteRenderbuffer_Callback";
+  static uniform3i_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_uniform3i_Callback";
+  uniform3i_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => uniform3i_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
-  static deleteShader_Callback_1(mthis, shader) native "WebGLRenderingContext_deleteShader_Callback";
+  static uniform3i_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_uniform3i_Callback";
+  uniform3i_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => uniform3i_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
 
-  static deleteTexture_Callback_1(mthis, texture) native "WebGLRenderingContext_deleteTexture_Callback";
+  static uniform3i_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "WebGLRenderingContext_uniform3i_Callback";
+  uniform3i_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => uniform3i_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
 
-  static depthFunc_Callback_1(mthis, func) native "WebGLRenderingContext_depthFunc_Callback";
+  static uniform3i_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "WebGLRenderingContext_uniform3i_Callback";
+  uniform3i_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => uniform3i_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
 
-  static depthMask_Callback_1(mthis, flag) native "WebGLRenderingContext_depthMask_Callback";
+  static uniform3iv_Callback_0(mthis) native "WebGLRenderingContext_uniform3iv_Callback";
+  uniform3iv_Callback_0_(mthis) => uniform3iv_Callback_0(mthis);
 
-  static depthRange_Callback_2(mthis, zNear, zFar) native "WebGLRenderingContext_depthRange_Callback";
+  static uniform3iv_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_uniform3iv_Callback";
+  uniform3iv_Callback_1_(mthis, __arg_0) => uniform3iv_Callback_1(mthis, __arg_0);
 
-  static detachShader_Callback_2(mthis, program, shader) native "WebGLRenderingContext_detachShader_Callback";
+  static uniform3iv_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_uniform3iv_Callback";
+  uniform3iv_Callback_2_(mthis, __arg_0, __arg_1) => uniform3iv_Callback_2(mthis, __arg_0, __arg_1);
 
-  static disable_Callback_1(mthis, cap) native "WebGLRenderingContext_disable_Callback";
+  static uniform3iv_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_uniform3iv_Callback";
+  uniform3iv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => uniform3iv_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
-  static disableVertexAttribArray_Callback_1(mthis, index) native "WebGLRenderingContext_disableVertexAttribArray_Callback";
+  static uniform3iv_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_uniform3iv_Callback";
+  uniform3iv_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => uniform3iv_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
 
-  static drawArrays_Callback_3(mthis, mode, first, count) native "WebGLRenderingContext_drawArrays_Callback";
+  static uniform4f_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_uniform4f_Callback";
+  uniform4f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => uniform4f_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
-  static drawElements_Callback_4(mthis, mode, count, type, offset) native "WebGLRenderingContext_drawElements_Callback";
+  static uniform4f_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_uniform4f_Callback";
+  uniform4f_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => uniform4f_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
 
-  static enable_Callback_1(mthis, cap) native "WebGLRenderingContext_enable_Callback";
+  static uniform4f_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "WebGLRenderingContext_uniform4f_Callback";
+  uniform4f_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => uniform4f_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
 
-  static enableVertexAttribArray_Callback_1(mthis, index) native "WebGLRenderingContext_enableVertexAttribArray_Callback";
+  static uniform4f_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "WebGLRenderingContext_uniform4f_Callback";
+  uniform4f_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => uniform4f_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
 
-  static finish_Callback(mthis) native "WebGLRenderingContext_finish_Callback";
+  static uniform4f_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) native "WebGLRenderingContext_uniform4f_Callback";
+  uniform4f_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => uniform4f_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6);
 
-  static flush_Callback(mthis) native "WebGLRenderingContext_flush_Callback";
+  static uniform4fv_Callback_0(mthis) native "WebGLRenderingContext_uniform4fv_Callback";
+  uniform4fv_Callback_0_(mthis) => uniform4fv_Callback_0(mthis);
 
-  static framebufferRenderbuffer_Callback_4(mthis, target, attachment, renderbuffertarget, renderbuffer) native "WebGLRenderingContext_framebufferRenderbuffer_Callback";
+  static uniform4fv_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_uniform4fv_Callback";
+  uniform4fv_Callback_1_(mthis, __arg_0) => uniform4fv_Callback_1(mthis, __arg_0);
 
-  static framebufferTexture2D_Callback_5(mthis, target, attachment, textarget, texture, level) native "WebGLRenderingContext_framebufferTexture2D_Callback";
+  static uniform4fv_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_uniform4fv_Callback";
+  uniform4fv_Callback_2_(mthis, __arg_0, __arg_1) => uniform4fv_Callback_2(mthis, __arg_0, __arg_1);
 
-  static frontFace_Callback_1(mthis, mode) native "WebGLRenderingContext_frontFace_Callback";
+  static uniform4fv_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_uniform4fv_Callback";
+  uniform4fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => uniform4fv_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
-  static generateMipmap_Callback_1(mthis, target) native "WebGLRenderingContext_generateMipmap_Callback";
+  static uniform4fv_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_uniform4fv_Callback";
+  uniform4fv_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => uniform4fv_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
 
-  static getActiveAttrib_Callback_2(mthis, program, index) native "WebGLRenderingContext_getActiveAttrib_Callback";
+  static uniform4i_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_uniform4i_Callback";
+  uniform4i_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => uniform4i_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
-  static getActiveUniform_Callback_2(mthis, program, index) native "WebGLRenderingContext_getActiveUniform_Callback";
+  static uniform4i_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_uniform4i_Callback";
+  uniform4i_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => uniform4i_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
 
-  static getAttachedShaders_Callback_1(mthis, program) native "WebGLRenderingContext_getAttachedShaders_Callback";
+  static uniform4i_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "WebGLRenderingContext_uniform4i_Callback";
+  uniform4i_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => uniform4i_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
 
-  static getAttribLocation_Callback_2(mthis, program, name) native "WebGLRenderingContext_getAttribLocation_Callback";
+  static uniform4i_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "WebGLRenderingContext_uniform4i_Callback";
+  uniform4i_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => uniform4i_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
 
-  static getBufferParameter_Callback_2(mthis, target, pname) native "WebGLRenderingContext_getBufferParameter_Callback";
+  static uniform4i_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) native "WebGLRenderingContext_uniform4i_Callback";
+  uniform4i_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => uniform4i_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6);
 
-  static getContextAttributes_Callback(mthis) native "WebGLRenderingContext_getContextAttributes_Callback";
+  static uniform4iv_Callback_0(mthis) native "WebGLRenderingContext_uniform4iv_Callback";
+  uniform4iv_Callback_0_(mthis) => uniform4iv_Callback_0(mthis);
 
-  static getError_Callback(mthis) native "WebGLRenderingContext_getError_Callback";
+  static uniform4iv_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_uniform4iv_Callback";
+  uniform4iv_Callback_1_(mthis, __arg_0) => uniform4iv_Callback_1(mthis, __arg_0);
 
-  static getExtension_Callback_1(mthis, name) native "WebGLRenderingContext_getExtension_Callback";
+  static uniform4iv_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_uniform4iv_Callback";
+  uniform4iv_Callback_2_(mthis, __arg_0, __arg_1) => uniform4iv_Callback_2(mthis, __arg_0, __arg_1);
 
-  static getFramebufferAttachmentParameter_Callback_3(mthis, target, attachment, pname) native "WebGLRenderingContext_getFramebufferAttachmentParameter_Callback";
+  static uniform4iv_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_uniform4iv_Callback";
+  uniform4iv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => uniform4iv_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
-  static getParameter_Callback_1(mthis, pname) native "WebGLRenderingContext_getParameter_Callback";
+  static uniform4iv_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_uniform4iv_Callback";
+  uniform4iv_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => uniform4iv_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
 
-  static getProgramInfoLog_Callback_1(mthis, program) native "WebGLRenderingContext_getProgramInfoLog_Callback";
+  static uniformMatrix2fv_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_uniformMatrix2fv_Callback";
+  uniformMatrix2fv_Callback_1_(mthis, __arg_0) => uniformMatrix2fv_Callback_1(mthis, __arg_0);
 
-  static getProgramParameter_Callback_2(mthis, program, pname) native "WebGLRenderingContext_getProgramParameter_Callback";
+  static uniformMatrix2fv_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_uniformMatrix2fv_Callback";
+  uniformMatrix2fv_Callback_2_(mthis, __arg_0, __arg_1) => uniformMatrix2fv_Callback_2(mthis, __arg_0, __arg_1);
 
-  static getRenderbufferParameter_Callback_2(mthis, target, pname) native "WebGLRenderingContext_getRenderbufferParameter_Callback";
+  static uniformMatrix2fv_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_uniformMatrix2fv_Callback";
+  uniformMatrix2fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => uniformMatrix2fv_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
-  static getShaderInfoLog_Callback_1(mthis, shader) native "WebGLRenderingContext_getShaderInfoLog_Callback";
+  static uniformMatrix2fv_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_uniformMatrix2fv_Callback";
+  uniformMatrix2fv_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => uniformMatrix2fv_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
 
-  static getShaderParameter_Callback_2(mthis, shader, pname) native "WebGLRenderingContext_getShaderParameter_Callback";
+  static uniformMatrix2fv_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "WebGLRenderingContext_uniformMatrix2fv_Callback";
+  uniformMatrix2fv_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => uniformMatrix2fv_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
 
-  static getShaderPrecisionFormat_Callback_2(mthis, shadertype, precisiontype) native "WebGLRenderingContext_getShaderPrecisionFormat_Callback";
+  static uniformMatrix3fv_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_uniformMatrix3fv_Callback";
+  uniformMatrix3fv_Callback_1_(mthis, __arg_0) => uniformMatrix3fv_Callback_1(mthis, __arg_0);
 
-  static getShaderSource_Callback_1(mthis, shader) native "WebGLRenderingContext_getShaderSource_Callback";
+  static uniformMatrix3fv_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_uniformMatrix3fv_Callback";
+  uniformMatrix3fv_Callback_2_(mthis, __arg_0, __arg_1) => uniformMatrix3fv_Callback_2(mthis, __arg_0, __arg_1);
 
-  static getSupportedExtensions_Callback(mthis) native "WebGLRenderingContext_getSupportedExtensions_Callback";
+  static uniformMatrix3fv_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_uniformMatrix3fv_Callback";
+  uniformMatrix3fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => uniformMatrix3fv_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
-  static getTexParameter_Callback_2(mthis, target, pname) native "WebGLRenderingContext_getTexParameter_Callback";
+  static uniformMatrix3fv_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_uniformMatrix3fv_Callback";
+  uniformMatrix3fv_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => uniformMatrix3fv_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
 
-  static getUniform_Callback_2(mthis, program, location) native "WebGLRenderingContext_getUniform_Callback";
+  static uniformMatrix3fv_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "WebGLRenderingContext_uniformMatrix3fv_Callback";
+  uniformMatrix3fv_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => uniformMatrix3fv_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
 
-  static getUniformLocation_Callback_2(mthis, program, name) native "WebGLRenderingContext_getUniformLocation_Callback";
+  static uniformMatrix4fv_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_uniformMatrix4fv_Callback";
+  uniformMatrix4fv_Callback_1_(mthis, __arg_0) => uniformMatrix4fv_Callback_1(mthis, __arg_0);
 
-  static getVertexAttrib_Callback_2(mthis, index, pname) native "WebGLRenderingContext_getVertexAttrib_Callback";
+  static uniformMatrix4fv_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_uniformMatrix4fv_Callback";
+  uniformMatrix4fv_Callback_2_(mthis, __arg_0, __arg_1) => uniformMatrix4fv_Callback_2(mthis, __arg_0, __arg_1);
 
-  static getVertexAttribOffset_Callback_2(mthis, index, pname) native "WebGLRenderingContext_getVertexAttribOffset_Callback";
+  static uniformMatrix4fv_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_uniformMatrix4fv_Callback";
+  uniformMatrix4fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => uniformMatrix4fv_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
-  static hint_Callback_2(mthis, target, mode) native "WebGLRenderingContext_hint_Callback";
+  static uniformMatrix4fv_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_uniformMatrix4fv_Callback";
+  uniformMatrix4fv_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => uniformMatrix4fv_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
 
-  static isBuffer_Callback_1(mthis, buffer) native "WebGLRenderingContext_isBuffer_Callback";
+  static uniformMatrix4fv_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "WebGLRenderingContext_uniformMatrix4fv_Callback";
+  uniformMatrix4fv_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => uniformMatrix4fv_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
 
-  static isContextLost_Callback(mthis) native "WebGLRenderingContext_isContextLost_Callback";
+  static useProgram_Callback_0(mthis) native "WebGLRenderingContext_useProgram_Callback";
+  useProgram_Callback_0_(mthis) => useProgram_Callback_0(mthis);
 
-  static isEnabled_Callback_1(mthis, cap) native "WebGLRenderingContext_isEnabled_Callback";
+  static useProgram_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_useProgram_Callback";
+  useProgram_Callback_1_(mthis, __arg_0) => useProgram_Callback_1(mthis, __arg_0);
 
-  static isFramebuffer_Callback_1(mthis, framebuffer) native "WebGLRenderingContext_isFramebuffer_Callback";
+  static useProgram_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_useProgram_Callback";
+  useProgram_Callback_2_(mthis, __arg_0, __arg_1) => useProgram_Callback_2(mthis, __arg_0, __arg_1);
 
-  static isProgram_Callback_1(mthis, program) native "WebGLRenderingContext_isProgram_Callback";
+  static useProgram_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_useProgram_Callback";
+  useProgram_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => useProgram_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
-  static isRenderbuffer_Callback_1(mthis, renderbuffer) native "WebGLRenderingContext_isRenderbuffer_Callback";
+  static validateProgram_Callback_0(mthis) native "WebGLRenderingContext_validateProgram_Callback";
+  validateProgram_Callback_0_(mthis) => validateProgram_Callback_0(mthis);
 
-  static isShader_Callback_1(mthis, shader) native "WebGLRenderingContext_isShader_Callback";
+  static validateProgram_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_validateProgram_Callback";
+  validateProgram_Callback_1_(mthis, __arg_0) => validateProgram_Callback_1(mthis, __arg_0);
 
-  static isTexture_Callback_1(mthis, texture) native "WebGLRenderingContext_isTexture_Callback";
+  static validateProgram_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_validateProgram_Callback";
+  validateProgram_Callback_2_(mthis, __arg_0, __arg_1) => validateProgram_Callback_2(mthis, __arg_0, __arg_1);
 
-  static lineWidth_Callback_1(mthis, width) native "WebGLRenderingContext_lineWidth_Callback";
+  static validateProgram_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_validateProgram_Callback";
+  validateProgram_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => validateProgram_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
-  static linkProgram_Callback_1(mthis, program) native "WebGLRenderingContext_linkProgram_Callback";
+  static vertexAttrib1f_Callback_0(mthis) native "WebGLRenderingContext_vertexAttrib1f_Callback";
+  vertexAttrib1f_Callback_0_(mthis) => vertexAttrib1f_Callback_0(mthis);
 
-  static pixelStorei_Callback_2(mthis, pname, param) native "WebGLRenderingContext_pixelStorei_Callback";
+  static vertexAttrib1f_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_vertexAttrib1f_Callback";
+  vertexAttrib1f_Callback_1_(mthis, __arg_0) => vertexAttrib1f_Callback_1(mthis, __arg_0);
 
-  static polygonOffset_Callback_2(mthis, factor, units) native "WebGLRenderingContext_polygonOffset_Callback";
+  static vertexAttrib1f_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_vertexAttrib1f_Callback";
+  vertexAttrib1f_Callback_2_(mthis, __arg_0, __arg_1) => vertexAttrib1f_Callback_2(mthis, __arg_0, __arg_1);
 
-  static readPixels_Callback_7(mthis, x, y, width, height, format, type, pixels) native "WebGLRenderingContext_readPixels_Callback";
+  static vertexAttrib1f_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_vertexAttrib1f_Callback";
+  vertexAttrib1f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => vertexAttrib1f_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
-  static renderbufferStorage_Callback_4(mthis, target, internalformat, width, height) native "WebGLRenderingContext_renderbufferStorage_Callback";
+  static vertexAttrib1f_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_vertexAttrib1f_Callback";
+  vertexAttrib1f_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => vertexAttrib1f_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
 
-  static sampleCoverage_Callback_2(mthis, value, invert) native "WebGLRenderingContext_sampleCoverage_Callback";
+  static vertexAttrib1fv_Callback_0(mthis) native "WebGLRenderingContext_vertexAttrib1fv_Callback";
+  vertexAttrib1fv_Callback_0_(mthis) => vertexAttrib1fv_Callback_0(mthis);
 
-  static scissor_Callback_4(mthis, x, y, width, height) native "WebGLRenderingContext_scissor_Callback";
+  static vertexAttrib1fv_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_vertexAttrib1fv_Callback";
+  vertexAttrib1fv_Callback_1_(mthis, __arg_0) => vertexAttrib1fv_Callback_1(mthis, __arg_0);
 
-  static shaderSource_Callback_2(mthis, shader, string) native "WebGLRenderingContext_shaderSource_Callback";
+  static vertexAttrib1fv_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_vertexAttrib1fv_Callback";
+  vertexAttrib1fv_Callback_2_(mthis, __arg_0, __arg_1) => vertexAttrib1fv_Callback_2(mthis, __arg_0, __arg_1);
 
-  static stencilFunc_Callback_3(mthis, func, ref, mask) native "WebGLRenderingContext_stencilFunc_Callback";
+  static vertexAttrib1fv_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_vertexAttrib1fv_Callback";
+  vertexAttrib1fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => vertexAttrib1fv_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
-  static stencilFuncSeparate_Callback_4(mthis, face, func, ref, mask) native "WebGLRenderingContext_stencilFuncSeparate_Callback";
+  static vertexAttrib1fv_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_vertexAttrib1fv_Callback";
+  vertexAttrib1fv_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => vertexAttrib1fv_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
 
-  static stencilMask_Callback_1(mthis, mask) native "WebGLRenderingContext_stencilMask_Callback";
+  static vertexAttrib2f_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_vertexAttrib2f_Callback";
+  vertexAttrib2f_Callback_1_(mthis, __arg_0) => vertexAttrib2f_Callback_1(mthis, __arg_0);
 
-  static stencilMaskSeparate_Callback_2(mthis, face, mask) native "WebGLRenderingContext_stencilMaskSeparate_Callback";
+  static vertexAttrib2f_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_vertexAttrib2f_Callback";
+  vertexAttrib2f_Callback_2_(mthis, __arg_0, __arg_1) => vertexAttrib2f_Callback_2(mthis, __arg_0, __arg_1);
 
-  static stencilOp_Callback_3(mthis, fail, zfail, zpass) native "WebGLRenderingContext_stencilOp_Callback";
+  static vertexAttrib2f_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_vertexAttrib2f_Callback";
+  vertexAttrib2f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => vertexAttrib2f_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
-  static stencilOpSeparate_Callback_4(mthis, face, fail, zfail, zpass) native "WebGLRenderingContext_stencilOpSeparate_Callback";
+  static vertexAttrib2f_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_vertexAttrib2f_Callback";
+  vertexAttrib2f_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => vertexAttrib2f_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
 
-  static texImage2D_Callback_9(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels) native "WebGLRenderingContext_texImage2D_Callback";
+  static vertexAttrib2f_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "WebGLRenderingContext_vertexAttrib2f_Callback";
+  vertexAttrib2f_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => vertexAttrib2f_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
 
-  static texImage2D_Callback_6(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext_texImage2D_Callback";
+  static vertexAttrib2fv_Callback_0(mthis) native "WebGLRenderingContext_vertexAttrib2fv_Callback";
+  vertexAttrib2fv_Callback_0_(mthis) => vertexAttrib2fv_Callback_0(mthis);
 
-  static texParameterf_Callback_3(mthis, target, pname, param) native "WebGLRenderingContext_texParameterf_Callback";
+  static vertexAttrib2fv_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_vertexAttrib2fv_Callback";
+  vertexAttrib2fv_Callback_1_(mthis, __arg_0) => vertexAttrib2fv_Callback_1(mthis, __arg_0);
 
-  static texParameteri_Callback_3(mthis, target, pname, param) native "WebGLRenderingContext_texParameteri_Callback";
+  static vertexAttrib2fv_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_vertexAttrib2fv_Callback";
+  vertexAttrib2fv_Callback_2_(mthis, __arg_0, __arg_1) => vertexAttrib2fv_Callback_2(mthis, __arg_0, __arg_1);
 
-  static texSubImage2D_Callback_9(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels) native "WebGLRenderingContext_texSubImage2D_Callback";
+  static vertexAttrib2fv_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_vertexAttrib2fv_Callback";
+  vertexAttrib2fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => vertexAttrib2fv_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
-  static texSubImage2D_Callback_7(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext_texSubImage2D_Callback";
+  static vertexAttrib2fv_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_vertexAttrib2fv_Callback";
+  vertexAttrib2fv_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => vertexAttrib2fv_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
 
-  static uniform1f_Callback_2(mthis, location, x) native "WebGLRenderingContext_uniform1f_Callback";
+  static vertexAttrib3f_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_vertexAttrib3f_Callback";
+  vertexAttrib3f_Callback_2_(mthis, __arg_0, __arg_1) => vertexAttrib3f_Callback_2(mthis, __arg_0, __arg_1);
 
-  static uniform1fv_Callback_2(mthis, location, v) native "WebGLRenderingContext_uniform1fv_Callback";
+  static vertexAttrib3f_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_vertexAttrib3f_Callback";
+  vertexAttrib3f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => vertexAttrib3f_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
-  static uniform1i_Callback_2(mthis, location, x) native "WebGLRenderingContext_uniform1i_Callback";
+  static vertexAttrib3f_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_vertexAttrib3f_Callback";
+  vertexAttrib3f_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => vertexAttrib3f_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
 
-  static uniform1iv_Callback_2(mthis, location, v) native "WebGLRenderingContext_uniform1iv_Callback";
+  static vertexAttrib3f_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "WebGLRenderingContext_vertexAttrib3f_Callback";
+  vertexAttrib3f_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => vertexAttrib3f_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
 
-  static uniform2f_Callback_3(mthis, location, x, y) native "WebGLRenderingContext_uniform2f_Callback";
+  static vertexAttrib3f_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "WebGLRenderingContext_vertexAttrib3f_Callback";
+  vertexAttrib3f_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => vertexAttrib3f_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
 
-  static uniform2fv_Callback_2(mthis, location, v) native "WebGLRenderingContext_uniform2fv_Callback";
+  static vertexAttrib3fv_Callback_0(mthis) native "WebGLRenderingContext_vertexAttrib3fv_Callback";
+  vertexAttrib3fv_Callback_0_(mthis) => vertexAttrib3fv_Callback_0(mthis);
 
-  static uniform2i_Callback_3(mthis, location, x, y) native "WebGLRenderingContext_uniform2i_Callback";
+  static vertexAttrib3fv_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_vertexAttrib3fv_Callback";
+  vertexAttrib3fv_Callback_1_(mthis, __arg_0) => vertexAttrib3fv_Callback_1(mthis, __arg_0);
 
-  static uniform2iv_Callback_2(mthis, location, v) native "WebGLRenderingContext_uniform2iv_Callback";
+  static vertexAttrib3fv_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_vertexAttrib3fv_Callback";
+  vertexAttrib3fv_Callback_2_(mthis, __arg_0, __arg_1) => vertexAttrib3fv_Callback_2(mthis, __arg_0, __arg_1);
 
-  static uniform3f_Callback_4(mthis, location, x, y, z) native "WebGLRenderingContext_uniform3f_Callback";
+  static vertexAttrib3fv_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_vertexAttrib3fv_Callback";
+  vertexAttrib3fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => vertexAttrib3fv_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
-  static uniform3fv_Callback_2(mthis, location, v) native "WebGLRenderingContext_uniform3fv_Callback";
+  static vertexAttrib3fv_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_vertexAttrib3fv_Callback";
+  vertexAttrib3fv_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => vertexAttrib3fv_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
 
-  static uniform3i_Callback_4(mthis, location, x, y, z) native "WebGLRenderingContext_uniform3i_Callback";
+  static vertexAttrib4f_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_vertexAttrib4f_Callback";
+  vertexAttrib4f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => vertexAttrib4f_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
-  static uniform3iv_Callback_2(mthis, location, v) native "WebGLRenderingContext_uniform3iv_Callback";
+  static vertexAttrib4f_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_vertexAttrib4f_Callback";
+  vertexAttrib4f_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => vertexAttrib4f_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
 
-  static uniform4f_Callback_5(mthis, location, x, y, z, w) native "WebGLRenderingContext_uniform4f_Callback";
+  static vertexAttrib4f_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "WebGLRenderingContext_vertexAttrib4f_Callback";
+  vertexAttrib4f_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => vertexAttrib4f_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
 
-  static uniform4fv_Callback_2(mthis, location, v) native "WebGLRenderingContext_uniform4fv_Callback";
+  static vertexAttrib4f_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "WebGLRenderingContext_vertexAttrib4f_Callback";
+  vertexAttrib4f_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => vertexAttrib4f_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
 
-  static uniform4i_Callback_5(mthis, location, x, y, z, w) native "WebGLRenderingContext_uniform4i_Callback";
+  static vertexAttrib4f_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) native "WebGLRenderingContext_vertexAttrib4f_Callback";
+  vertexAttrib4f_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => vertexAttrib4f_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6);
 
-  static uniform4iv_Callback_2(mthis, location, v) native "WebGLRenderingContext_uniform4iv_Callback";
+  static vertexAttrib4fv_Callback_0(mthis) native "WebGLRenderingContext_vertexAttrib4fv_Callback";
+  vertexAttrib4fv_Callback_0_(mthis) => vertexAttrib4fv_Callback_0(mthis);
 
-  static uniformMatrix2fv_Callback_3(mthis, location, transpose, array) native "WebGLRenderingContext_uniformMatrix2fv_Callback";
+  static vertexAttrib4fv_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_vertexAttrib4fv_Callback";
+  vertexAttrib4fv_Callback_1_(mthis, __arg_0) => vertexAttrib4fv_Callback_1(mthis, __arg_0);
 
-  static uniformMatrix3fv_Callback_3(mthis, location, transpose, array) native "WebGLRenderingContext_uniformMatrix3fv_Callback";
+  static vertexAttrib4fv_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_vertexAttrib4fv_Callback";
+  vertexAttrib4fv_Callback_2_(mthis, __arg_0, __arg_1) => vertexAttrib4fv_Callback_2(mthis, __arg_0, __arg_1);
 
-  static uniformMatrix4fv_Callback_3(mthis, location, transpose, array) native "WebGLRenderingContext_uniformMatrix4fv_Callback";
+  static vertexAttrib4fv_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_vertexAttrib4fv_Callback";
+  vertexAttrib4fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => vertexAttrib4fv_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
-  static useProgram_Callback_1(mthis, program) native "WebGLRenderingContext_useProgram_Callback";
+  static vertexAttrib4fv_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_vertexAttrib4fv_Callback";
+  vertexAttrib4fv_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => vertexAttrib4fv_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
 
-  static validateProgram_Callback_1(mthis, program) native "WebGLRenderingContext_validateProgram_Callback";
+  static vertexAttribPointer_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_vertexAttribPointer_Callback";
+  vertexAttribPointer_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => vertexAttribPointer_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
 
-  static vertexAttrib1f_Callback_2(mthis, indx, x) native "WebGLRenderingContext_vertexAttrib1f_Callback";
+  static vertexAttribPointer_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "WebGLRenderingContext_vertexAttribPointer_Callback";
+  vertexAttribPointer_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => vertexAttribPointer_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
 
-  static vertexAttrib1fv_Callback_2(mthis, indx, values) native "WebGLRenderingContext_vertexAttrib1fv_Callback";
+  static vertexAttribPointer_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "WebGLRenderingContext_vertexAttribPointer_Callback";
+  vertexAttribPointer_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => vertexAttribPointer_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
 
-  static vertexAttrib2f_Callback_3(mthis, indx, x, y) native "WebGLRenderingContext_vertexAttrib2f_Callback";
+  static vertexAttribPointer_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) native "WebGLRenderingContext_vertexAttribPointer_Callback";
+  vertexAttribPointer_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => vertexAttribPointer_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6);
 
-  static vertexAttrib2fv_Callback_2(mthis, indx, values) native "WebGLRenderingContext_vertexAttrib2fv_Callback";
+  static vertexAttribPointer_Callback_8(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) native "WebGLRenderingContext_vertexAttribPointer_Callback";
+  vertexAttribPointer_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => vertexAttribPointer_Callback_8(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7);
 
-  static vertexAttrib3f_Callback_4(mthis, indx, x, y, z) native "WebGLRenderingContext_vertexAttrib3f_Callback";
+  static viewport_Callback_2(mthis, __arg_0, __arg_1) native "WebGLRenderingContext_viewport_Callback";
+  viewport_Callback_2_(mthis, __arg_0, __arg_1) => viewport_Callback_2(mthis, __arg_0, __arg_1);
 
-  static vertexAttrib3fv_Callback_2(mthis, indx, values) native "WebGLRenderingContext_vertexAttrib3fv_Callback";
+  static viewport_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebGLRenderingContext_viewport_Callback";
+  viewport_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => viewport_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
-  static vertexAttrib4f_Callback_5(mthis, indx, x, y, z, w) native "WebGLRenderingContext_vertexAttrib4f_Callback";
+  static viewport_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebGLRenderingContext_viewport_Callback";
+  viewport_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => viewport_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
 
-  static vertexAttrib4fv_Callback_2(mthis, indx, values) native "WebGLRenderingContext_vertexAttrib4fv_Callback";
+  static viewport_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "WebGLRenderingContext_viewport_Callback";
+  viewport_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => viewport_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
 
-  static vertexAttribPointer_Callback_6(mthis, indx, size, type, normalized, stride, offset) native "WebGLRenderingContext_vertexAttribPointer_Callback";
+  static viewport_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "WebGLRenderingContext_viewport_Callback";
+  viewport_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => viewport_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
 
-  static viewport_Callback_4(mthis, x, y, width, height) native "WebGLRenderingContext_viewport_Callback";
 }
 
-class BlinkWebGLShader {}
+class BlinkWebGLShader {
+  static final instance = new BlinkWebGLShader();
+
+}
 
 class BlinkWebGLShaderPrecisionFormat {
+  static final instance = new BlinkWebGLShaderPrecisionFormat();
+
   static precision_Getter(mthis) native "WebGLShaderPrecisionFormat_precision_Getter";
+  precision_Getter_(mthis) => precision_Getter(mthis);
 
   static rangeMax_Getter(mthis) native "WebGLShaderPrecisionFormat_rangeMax_Getter";
+  rangeMax_Getter_(mthis) => rangeMax_Getter(mthis);
 
   static rangeMin_Getter(mthis) native "WebGLShaderPrecisionFormat_rangeMin_Getter";
+  rangeMin_Getter_(mthis) => rangeMin_Getter(mthis);
+
 }
 
-class BlinkWebGLTexture {}
+class BlinkWebGLTexture {
+  static final instance = new BlinkWebGLTexture();
 
-class BlinkWebGLUniformLocation {}
+}
 
-class BlinkWebGLVertexArrayObjectOES {}
+class BlinkWebGLUniformLocation {
+  static final instance = new BlinkWebGLUniformLocation();
 
-class BlinkWebKitAnimationEvent {
-  static constructorCallback(type, options) native "WebKitAnimationEvent_constructorCallback";
+}
+
+class BlinkWebGLVertexArrayObjectOES {
+  static final instance = new BlinkWebGLVertexArrayObjectOES();
+
+}
+
+class BlinkWebKitAnimationEvent extends BlinkEvent {
+  static final instance = new BlinkWebKitAnimationEvent();
 
   static animationName_Getter(mthis) native "WebKitAnimationEvent_animationName_Getter";
+  animationName_Getter_(mthis) => animationName_Getter(mthis);
+
+  static constructorCallback_2(__arg_0, __arg_1) native "WebKitAnimationEvent_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
 
   static elapsedTime_Getter(mthis) native "WebKitAnimationEvent_elapsedTime_Getter";
+  elapsedTime_Getter_(mthis) => elapsedTime_Getter(mthis);
+
 }
 
-class BlinkWebKitCSSFilterRule {
+class BlinkWebKitCSSFilterRule extends BlinkCSSRule {
+  static final instance = new BlinkWebKitCSSFilterRule();
+
   static style_Getter(mthis) native "WebKitCSSFilterRule_style_Getter";
+  style_Getter_(mthis) => style_Getter(mthis);
+
 }
 
-class BlinkWebKitCSSFilterValue {}
+class BlinkWebKitCSSFilterValue extends BlinkCSSValueList {
+  static final instance = new BlinkWebKitCSSFilterValue();
+
+  static $__getter___Callback_1(mthis, __arg_0) native "WebKitCSSFilterValue___getter___Callback";
+  $__getter___Callback_1_(mthis, __arg_0) => $__getter___Callback_1(mthis, __arg_0);
+
+  static operationType_Getter(mthis) native "WebKitCSSFilterValue_operationType_Getter";
+  operationType_Getter_(mthis) => operationType_Getter(mthis);
+
+}
 
 class BlinkWebKitCSSMatrix {
-  static constructorCallback_1(cssValue) native "WebKitCSSMatrix_constructorCallback";
+  static final instance = new BlinkWebKitCSSMatrix();
+
+  static a_Getter(mthis) native "WebKitCSSMatrix_a_Getter";
+  a_Getter_(mthis) => a_Getter(mthis);
+
+  static a_Setter(mthis, __arg_0) native "WebKitCSSMatrix_a_Setter";
+  a_Setter_(mthis, __arg_0) => a_Setter(mthis, __arg_0);
+
+  static b_Getter(mthis) native "WebKitCSSMatrix_b_Getter";
+  b_Getter_(mthis) => b_Getter(mthis);
+
+  static b_Setter(mthis, __arg_0) native "WebKitCSSMatrix_b_Setter";
+  b_Setter_(mthis, __arg_0) => b_Setter(mthis, __arg_0);
+
+  static c_Getter(mthis) native "WebKitCSSMatrix_c_Getter";
+  c_Getter_(mthis) => c_Getter(mthis);
+
+  static c_Setter(mthis, __arg_0) native "WebKitCSSMatrix_c_Setter";
+  c_Setter_(mthis, __arg_0) => c_Setter(mthis, __arg_0);
+
+  static constructorCallback_0() native "WebKitCSSMatrix_constructorCallback";
+  constructorCallback_0_() => constructorCallback_0();
+
+  static constructorCallback_1(__arg_0) native "WebKitCSSMatrix_constructorCallback";
+  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+
+  static constructorCallback_2(__arg_0, __arg_1) native "WebKitCSSMatrix_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+
+  static constructorCallback_3(__arg_0, __arg_1, __arg_2) native "WebKitCSSMatrix_constructorCallback";
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => constructorCallback_3(__arg_0, __arg_1, __arg_2);
+
+  static d_Getter(mthis) native "WebKitCSSMatrix_d_Getter";
+  d_Getter_(mthis) => d_Getter(mthis);
+
+  static d_Setter(mthis, __arg_0) native "WebKitCSSMatrix_d_Setter";
+  d_Setter_(mthis, __arg_0) => d_Setter(mthis, __arg_0);
+
+  static e_Getter(mthis) native "WebKitCSSMatrix_e_Getter";
+  e_Getter_(mthis) => e_Getter(mthis);
+
+  static e_Setter(mthis, __arg_0) native "WebKitCSSMatrix_e_Setter";
+  e_Setter_(mthis, __arg_0) => e_Setter(mthis, __arg_0);
+
+  static f_Getter(mthis) native "WebKitCSSMatrix_f_Getter";
+  f_Getter_(mthis) => f_Getter(mthis);
+
+  static f_Setter(mthis, __arg_0) native "WebKitCSSMatrix_f_Setter";
+  f_Setter_(mthis, __arg_0) => f_Setter(mthis, __arg_0);
+
+  static inverse_Callback_0(mthis) native "WebKitCSSMatrix_inverse_Callback";
+  inverse_Callback_0_(mthis) => inverse_Callback_0(mthis);
+
+  static inverse_Callback_1(mthis, __arg_0) native "WebKitCSSMatrix_inverse_Callback";
+  inverse_Callback_1_(mthis, __arg_0) => inverse_Callback_1(mthis, __arg_0);
+
+  static inverse_Callback_2(mthis, __arg_0, __arg_1) native "WebKitCSSMatrix_inverse_Callback";
+  inverse_Callback_2_(mthis, __arg_0, __arg_1) => inverse_Callback_2(mthis, __arg_0, __arg_1);
+
+  static m11_Getter(mthis) native "WebKitCSSMatrix_m11_Getter";
+  m11_Getter_(mthis) => m11_Getter(mthis);
+
+  static m11_Setter(mthis, __arg_0) native "WebKitCSSMatrix_m11_Setter";
+  m11_Setter_(mthis, __arg_0) => m11_Setter(mthis, __arg_0);
+
+  static m12_Getter(mthis) native "WebKitCSSMatrix_m12_Getter";
+  m12_Getter_(mthis) => m12_Getter(mthis);
+
+  static m12_Setter(mthis, __arg_0) native "WebKitCSSMatrix_m12_Setter";
+  m12_Setter_(mthis, __arg_0) => m12_Setter(mthis, __arg_0);
+
+  static m13_Getter(mthis) native "WebKitCSSMatrix_m13_Getter";
+  m13_Getter_(mthis) => m13_Getter(mthis);
+
+  static m13_Setter(mthis, __arg_0) native "WebKitCSSMatrix_m13_Setter";
+  m13_Setter_(mthis, __arg_0) => m13_Setter(mthis, __arg_0);
+
+  static m14_Getter(mthis) native "WebKitCSSMatrix_m14_Getter";
+  m14_Getter_(mthis) => m14_Getter(mthis);
+
+  static m14_Setter(mthis, __arg_0) native "WebKitCSSMatrix_m14_Setter";
+  m14_Setter_(mthis, __arg_0) => m14_Setter(mthis, __arg_0);
+
+  static m21_Getter(mthis) native "WebKitCSSMatrix_m21_Getter";
+  m21_Getter_(mthis) => m21_Getter(mthis);
+
+  static m21_Setter(mthis, __arg_0) native "WebKitCSSMatrix_m21_Setter";
+  m21_Setter_(mthis, __arg_0) => m21_Setter(mthis, __arg_0);
+
+  static m22_Getter(mthis) native "WebKitCSSMatrix_m22_Getter";
+  m22_Getter_(mthis) => m22_Getter(mthis);
+
+  static m22_Setter(mthis, __arg_0) native "WebKitCSSMatrix_m22_Setter";
+  m22_Setter_(mthis, __arg_0) => m22_Setter(mthis, __arg_0);
+
+  static m23_Getter(mthis) native "WebKitCSSMatrix_m23_Getter";
+  m23_Getter_(mthis) => m23_Getter(mthis);
+
+  static m23_Setter(mthis, __arg_0) native "WebKitCSSMatrix_m23_Setter";
+  m23_Setter_(mthis, __arg_0) => m23_Setter(mthis, __arg_0);
+
+  static m24_Getter(mthis) native "WebKitCSSMatrix_m24_Getter";
+  m24_Getter_(mthis) => m24_Getter(mthis);
+
+  static m24_Setter(mthis, __arg_0) native "WebKitCSSMatrix_m24_Setter";
+  m24_Setter_(mthis, __arg_0) => m24_Setter(mthis, __arg_0);
+
+  static m31_Getter(mthis) native "WebKitCSSMatrix_m31_Getter";
+  m31_Getter_(mthis) => m31_Getter(mthis);
+
+  static m31_Setter(mthis, __arg_0) native "WebKitCSSMatrix_m31_Setter";
+  m31_Setter_(mthis, __arg_0) => m31_Setter(mthis, __arg_0);
+
+  static m32_Getter(mthis) native "WebKitCSSMatrix_m32_Getter";
+  m32_Getter_(mthis) => m32_Getter(mthis);
+
+  static m32_Setter(mthis, __arg_0) native "WebKitCSSMatrix_m32_Setter";
+  m32_Setter_(mthis, __arg_0) => m32_Setter(mthis, __arg_0);
+
+  static m33_Getter(mthis) native "WebKitCSSMatrix_m33_Getter";
+  m33_Getter_(mthis) => m33_Getter(mthis);
+
+  static m33_Setter(mthis, __arg_0) native "WebKitCSSMatrix_m33_Setter";
+  m33_Setter_(mthis, __arg_0) => m33_Setter(mthis, __arg_0);
+
+  static m34_Getter(mthis) native "WebKitCSSMatrix_m34_Getter";
+  m34_Getter_(mthis) => m34_Getter(mthis);
+
+  static m34_Setter(mthis, __arg_0) native "WebKitCSSMatrix_m34_Setter";
+  m34_Setter_(mthis, __arg_0) => m34_Setter(mthis, __arg_0);
+
+  static m41_Getter(mthis) native "WebKitCSSMatrix_m41_Getter";
+  m41_Getter_(mthis) => m41_Getter(mthis);
+
+  static m41_Setter(mthis, __arg_0) native "WebKitCSSMatrix_m41_Setter";
+  m41_Setter_(mthis, __arg_0) => m41_Setter(mthis, __arg_0);
+
+  static m42_Getter(mthis) native "WebKitCSSMatrix_m42_Getter";
+  m42_Getter_(mthis) => m42_Getter(mthis);
+
+  static m42_Setter(mthis, __arg_0) native "WebKitCSSMatrix_m42_Setter";
+  m42_Setter_(mthis, __arg_0) => m42_Setter(mthis, __arg_0);
+
+  static m43_Getter(mthis) native "WebKitCSSMatrix_m43_Getter";
+  m43_Getter_(mthis) => m43_Getter(mthis);
+
+  static m43_Setter(mthis, __arg_0) native "WebKitCSSMatrix_m43_Setter";
+  m43_Setter_(mthis, __arg_0) => m43_Setter(mthis, __arg_0);
+
+  static m44_Getter(mthis) native "WebKitCSSMatrix_m44_Getter";
+  m44_Getter_(mthis) => m44_Getter(mthis);
+
+  static m44_Setter(mthis, __arg_0) native "WebKitCSSMatrix_m44_Setter";
+  m44_Setter_(mthis, __arg_0) => m44_Setter(mthis, __arg_0);
+
+  static multiply_Callback_0(mthis) native "WebKitCSSMatrix_multiply_Callback";
+  multiply_Callback_0_(mthis) => multiply_Callback_0(mthis);
+
+  static multiply_Callback_1(mthis, __arg_0) native "WebKitCSSMatrix_multiply_Callback";
+  multiply_Callback_1_(mthis, __arg_0) => multiply_Callback_1(mthis, __arg_0);
+
+  static multiply_Callback_2(mthis, __arg_0, __arg_1) native "WebKitCSSMatrix_multiply_Callback";
+  multiply_Callback_2_(mthis, __arg_0, __arg_1) => multiply_Callback_2(mthis, __arg_0, __arg_1);
+
+  static multiply_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebKitCSSMatrix_multiply_Callback";
+  multiply_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => multiply_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static rotateAxisAngle_Callback_0(mthis) native "WebKitCSSMatrix_rotateAxisAngle_Callback";
+  rotateAxisAngle_Callback_0_(mthis) => rotateAxisAngle_Callback_0(mthis);
+
+  static rotateAxisAngle_Callback_1(mthis, __arg_0) native "WebKitCSSMatrix_rotateAxisAngle_Callback";
+  rotateAxisAngle_Callback_1_(mthis, __arg_0) => rotateAxisAngle_Callback_1(mthis, __arg_0);
+
+  static rotateAxisAngle_Callback_2(mthis, __arg_0, __arg_1) native "WebKitCSSMatrix_rotateAxisAngle_Callback";
+  rotateAxisAngle_Callback_2_(mthis, __arg_0, __arg_1) => rotateAxisAngle_Callback_2(mthis, __arg_0, __arg_1);
+
+  static rotateAxisAngle_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebKitCSSMatrix_rotateAxisAngle_Callback";
+  rotateAxisAngle_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => rotateAxisAngle_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static rotateAxisAngle_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebKitCSSMatrix_rotateAxisAngle_Callback";
+  rotateAxisAngle_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => rotateAxisAngle_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static rotateAxisAngle_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "WebKitCSSMatrix_rotateAxisAngle_Callback";
+  rotateAxisAngle_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => rotateAxisAngle_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static rotateAxisAngle_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "WebKitCSSMatrix_rotateAxisAngle_Callback";
+  rotateAxisAngle_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => rotateAxisAngle_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static rotate_Callback_0(mthis) native "WebKitCSSMatrix_rotate_Callback";
+  rotate_Callback_0_(mthis) => rotate_Callback_0(mthis);
+
+  static rotate_Callback_1(mthis, __arg_0) native "WebKitCSSMatrix_rotate_Callback";
+  rotate_Callback_1_(mthis, __arg_0) => rotate_Callback_1(mthis, __arg_0);
+
+  static rotate_Callback_2(mthis, __arg_0, __arg_1) native "WebKitCSSMatrix_rotate_Callback";
+  rotate_Callback_2_(mthis, __arg_0, __arg_1) => rotate_Callback_2(mthis, __arg_0, __arg_1);
+
+  static rotate_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebKitCSSMatrix_rotate_Callback";
+  rotate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => rotate_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static rotate_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebKitCSSMatrix_rotate_Callback";
+  rotate_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => rotate_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static rotate_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "WebKitCSSMatrix_rotate_Callback";
+  rotate_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => rotate_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static scale_Callback_0(mthis) native "WebKitCSSMatrix_scale_Callback";
+  scale_Callback_0_(mthis) => scale_Callback_0(mthis);
+
+  static scale_Callback_1(mthis, __arg_0) native "WebKitCSSMatrix_scale_Callback";
+  scale_Callback_1_(mthis, __arg_0) => scale_Callback_1(mthis, __arg_0);
+
+  static scale_Callback_2(mthis, __arg_0, __arg_1) native "WebKitCSSMatrix_scale_Callback";
+  scale_Callback_2_(mthis, __arg_0, __arg_1) => scale_Callback_2(mthis, __arg_0, __arg_1);
+
+  static scale_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebKitCSSMatrix_scale_Callback";
+  scale_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => scale_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static scale_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebKitCSSMatrix_scale_Callback";
+  scale_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => scale_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static scale_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "WebKitCSSMatrix_scale_Callback";
+  scale_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => scale_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static setMatrixValue_Callback_0(mthis) native "WebKitCSSMatrix_setMatrixValue_Callback";
+  setMatrixValue_Callback_0_(mthis) => setMatrixValue_Callback_0(mthis);
+
+  static setMatrixValue_Callback_1(mthis, __arg_0) native "WebKitCSSMatrix_setMatrixValue_Callback";
+  setMatrixValue_Callback_1_(mthis, __arg_0) => setMatrixValue_Callback_1(mthis, __arg_0);
+
+  static setMatrixValue_Callback_2(mthis, __arg_0, __arg_1) native "WebKitCSSMatrix_setMatrixValue_Callback";
+  setMatrixValue_Callback_2_(mthis, __arg_0, __arg_1) => setMatrixValue_Callback_2(mthis, __arg_0, __arg_1);
+
+  static setMatrixValue_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebKitCSSMatrix_setMatrixValue_Callback";
+  setMatrixValue_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => setMatrixValue_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static skewX_Callback_0(mthis) native "WebKitCSSMatrix_skewX_Callback";
+  skewX_Callback_0_(mthis) => skewX_Callback_0(mthis);
+
+  static skewX_Callback_1(mthis, __arg_0) native "WebKitCSSMatrix_skewX_Callback";
+  skewX_Callback_1_(mthis, __arg_0) => skewX_Callback_1(mthis, __arg_0);
+
+  static skewX_Callback_2(mthis, __arg_0, __arg_1) native "WebKitCSSMatrix_skewX_Callback";
+  skewX_Callback_2_(mthis, __arg_0, __arg_1) => skewX_Callback_2(mthis, __arg_0, __arg_1);
+
+  static skewX_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebKitCSSMatrix_skewX_Callback";
+  skewX_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => skewX_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static skewY_Callback_0(mthis) native "WebKitCSSMatrix_skewY_Callback";
+  skewY_Callback_0_(mthis) => skewY_Callback_0(mthis);
+
+  static skewY_Callback_1(mthis, __arg_0) native "WebKitCSSMatrix_skewY_Callback";
+  skewY_Callback_1_(mthis, __arg_0) => skewY_Callback_1(mthis, __arg_0);
+
+  static skewY_Callback_2(mthis, __arg_0, __arg_1) native "WebKitCSSMatrix_skewY_Callback";
+  skewY_Callback_2_(mthis, __arg_0, __arg_1) => skewY_Callback_2(mthis, __arg_0, __arg_1);
+
+  static skewY_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebKitCSSMatrix_skewY_Callback";
+  skewY_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => skewY_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static translate_Callback_0(mthis) native "WebKitCSSMatrix_translate_Callback";
+  translate_Callback_0_(mthis) => translate_Callback_0(mthis);
+
+  static translate_Callback_1(mthis, __arg_0) native "WebKitCSSMatrix_translate_Callback";
+  translate_Callback_1_(mthis, __arg_0) => translate_Callback_1(mthis, __arg_0);
+
+  static translate_Callback_2(mthis, __arg_0, __arg_1) native "WebKitCSSMatrix_translate_Callback";
+  translate_Callback_2_(mthis, __arg_0, __arg_1) => translate_Callback_2(mthis, __arg_0, __arg_1);
+
+  static translate_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebKitCSSMatrix_translate_Callback";
+  translate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => translate_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static translate_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebKitCSSMatrix_translate_Callback";
+  translate_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => translate_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static translate_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "WebKitCSSMatrix_translate_Callback";
+  translate_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => translate_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
 }
 
-class BlinkWebKitCSSTransformValue {}
+class BlinkWebKitCSSTransformValue extends BlinkCSSValueList {
+  static final instance = new BlinkWebKitCSSTransformValue();
+
+  static $__getter___Callback_1(mthis, __arg_0) native "WebKitCSSTransformValue___getter___Callback";
+  $__getter___Callback_1_(mthis, __arg_0) => $__getter___Callback_1(mthis, __arg_0);
+
+  static operationType_Getter(mthis) native "WebKitCSSTransformValue_operationType_Getter";
+  operationType_Getter_(mthis) => operationType_Getter(mthis);
+
+}
+
+class BlinkWebKitGamepad {
+  static final instance = new BlinkWebKitGamepad();
+
+  static axes_Getter(mthis) native "WebKitGamepad_axes_Getter";
+  axes_Getter_(mthis) => axes_Getter(mthis);
+
+  static buttons_Getter(mthis) native "WebKitGamepad_buttons_Getter";
+  buttons_Getter_(mthis) => buttons_Getter(mthis);
+
+  static connected_Getter(mthis) native "WebKitGamepad_connected_Getter";
+  connected_Getter_(mthis) => connected_Getter(mthis);
+
+  static id_Getter(mthis) native "WebKitGamepad_id_Getter";
+  id_Getter_(mthis) => id_Getter(mthis);
+
+  static index_Getter(mthis) native "WebKitGamepad_index_Getter";
+  index_Getter_(mthis) => index_Getter(mthis);
+
+  static mapping_Getter(mthis) native "WebKitGamepad_mapping_Getter";
+  mapping_Getter_(mthis) => mapping_Getter(mthis);
+
+  static timestamp_Getter(mthis) native "WebKitGamepad_timestamp_Getter";
+  timestamp_Getter_(mthis) => timestamp_Getter(mthis);
+
+}
+
+class BlinkWebKitGamepadList {
+  static final instance = new BlinkWebKitGamepadList();
+
+  static $__getter___Callback_1(mthis, __arg_0) native "WebKitGamepadList___getter___Callback";
+  $__getter___Callback_1_(mthis, __arg_0) => $__getter___Callback_1(mthis, __arg_0);
+
+  static item_Callback_0(mthis) native "WebKitGamepadList_item_Callback";
+  item_Callback_0_(mthis) => item_Callback_0(mthis);
+
+  static item_Callback_1(mthis, __arg_0) native "WebKitGamepadList_item_Callback";
+  item_Callback_1_(mthis, __arg_0) => item_Callback_1(mthis, __arg_0);
+
+  static item_Callback_2(mthis, __arg_0, __arg_1) native "WebKitGamepadList_item_Callback";
+  item_Callback_2_(mthis, __arg_0, __arg_1) => item_Callback_2(mthis, __arg_0, __arg_1);
+
+  static item_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebKitGamepadList_item_Callback";
+  item_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => item_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static length_Getter(mthis) native "WebKitGamepadList_length_Getter";
+  length_Getter_(mthis) => length_Getter(mthis);
+
+}
 
 class BlinkWebKitPoint {
-  static constructorCallback_2(x, y) native "WebKitPoint_constructorCallback";
+  static final instance = new BlinkWebKitPoint();
+
+  static constructorCallback_0() native "WebKitPoint_constructorCallback";
+  constructorCallback_0_() => constructorCallback_0();
+
+  static constructorCallback_1(__arg_0) native "WebKitPoint_constructorCallback";
+  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+
+  static constructorCallback_2(__arg_0, __arg_1) native "WebKitPoint_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+
+  static constructorCallback_3(__arg_0, __arg_1, __arg_2) native "WebKitPoint_constructorCallback";
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => constructorCallback_3(__arg_0, __arg_1, __arg_2);
+
+  static constructorCallback_4(__arg_0, __arg_1, __arg_2, __arg_3) native "WebKitPoint_constructorCallback";
+  constructorCallback_4_(__arg_0, __arg_1, __arg_2, __arg_3) => constructorCallback_4(__arg_0, __arg_1, __arg_2, __arg_3);
 
   static x_Getter(mthis) native "WebKitPoint_x_Getter";
+  x_Getter_(mthis) => x_Getter(mthis);
 
-  static x_Setter(mthis, value) native "WebKitPoint_x_Setter";
+  static x_Setter(mthis, __arg_0) native "WebKitPoint_x_Setter";
+  x_Setter_(mthis, __arg_0) => x_Setter(mthis, __arg_0);
 
   static y_Getter(mthis) native "WebKitPoint_y_Getter";
+  y_Getter_(mthis) => y_Getter(mthis);
 
-  static y_Setter(mthis, value) native "WebKitPoint_y_Setter";
+  static y_Setter(mthis, __arg_0) native "WebKitPoint_y_Setter";
+  y_Setter_(mthis, __arg_0) => y_Setter(mthis, __arg_0);
+
 }
 
-class BlinkWebSocket {
-  static constructorCallback_1(url) native "WebSocket_constructorCallback";
+class BlinkWebSocket extends BlinkEventTarget {
+  static final instance = new BlinkWebSocket();
 
-  static constructorCallback_2(url, protocol_OR_protocols) native "WebSocket_constructorCallback";
+  static URL_Getter(mthis) native "WebSocket_URL_Getter";
+  URL_Getter_(mthis) => URL_Getter(mthis);
 
   static binaryType_Getter(mthis) native "WebSocket_binaryType_Getter";
+  binaryType_Getter_(mthis) => binaryType_Getter(mthis);
 
-  static binaryType_Setter(mthis, value) native "WebSocket_binaryType_Setter";
+  static binaryType_Setter(mthis, __arg_0) native "WebSocket_binaryType_Setter";
+  binaryType_Setter_(mthis, __arg_0) => binaryType_Setter(mthis, __arg_0);
 
   static bufferedAmount_Getter(mthis) native "WebSocket_bufferedAmount_Getter";
+  bufferedAmount_Getter_(mthis) => bufferedAmount_Getter(mthis);
+
+  static close_Callback_0(mthis) native "WebSocket_close_Callback";
+  close_Callback_0_(mthis) => close_Callback_0(mthis);
+
+  static close_Callback_1(mthis, __arg_0) native "WebSocket_close_Callback";
+  close_Callback_1_(mthis, __arg_0) => close_Callback_1(mthis, __arg_0);
+
+  static close_Callback_2(mthis, __arg_0, __arg_1) native "WebSocket_close_Callback";
+  close_Callback_2_(mthis, __arg_0, __arg_1) => close_Callback_2(mthis, __arg_0, __arg_1);
+
+  static close_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebSocket_close_Callback";
+  close_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => close_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static close_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WebSocket_close_Callback";
+  close_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => close_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static constructorCallback_0() native "WebSocket_constructorCallback";
+  constructorCallback_0_() => constructorCallback_0();
+
+  static constructorCallback_1(__arg_0) native "WebSocket_constructorCallback";
+  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+
+  static constructorCallback_2(__arg_0, __arg_1) native "WebSocket_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+
+  static constructorCallback_3(__arg_0, __arg_1, __arg_2) native "WebSocket_constructorCallback";
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => constructorCallback_3(__arg_0, __arg_1, __arg_2);
+
+  static constructorCallback_4(__arg_0, __arg_1, __arg_2, __arg_3) native "WebSocket_constructorCallback";
+  constructorCallback_4_(__arg_0, __arg_1, __arg_2, __arg_3) => constructorCallback_4(__arg_0, __arg_1, __arg_2, __arg_3);
 
   static extensions_Getter(mthis) native "WebSocket_extensions_Getter";
+  extensions_Getter_(mthis) => extensions_Getter(mthis);
+
+  static onclose_Getter(mthis) native "WebSocket_onclose_Getter";
+  onclose_Getter_(mthis) => onclose_Getter(mthis);
+
+  static onclose_Setter(mthis, __arg_0) native "WebSocket_onclose_Setter";
+  onclose_Setter_(mthis, __arg_0) => onclose_Setter(mthis, __arg_0);
+
+  static onerror_Getter(mthis) native "WebSocket_onerror_Getter";
+  onerror_Getter_(mthis) => onerror_Getter(mthis);
+
+  static onerror_Setter(mthis, __arg_0) native "WebSocket_onerror_Setter";
+  onerror_Setter_(mthis, __arg_0) => onerror_Setter(mthis, __arg_0);
+
+  static onmessage_Getter(mthis) native "WebSocket_onmessage_Getter";
+  onmessage_Getter_(mthis) => onmessage_Getter(mthis);
+
+  static onmessage_Setter(mthis, __arg_0) native "WebSocket_onmessage_Setter";
+  onmessage_Setter_(mthis, __arg_0) => onmessage_Setter(mthis, __arg_0);
+
+  static onopen_Getter(mthis) native "WebSocket_onopen_Getter";
+  onopen_Getter_(mthis) => onopen_Getter(mthis);
+
+  static onopen_Setter(mthis, __arg_0) native "WebSocket_onopen_Setter";
+  onopen_Setter_(mthis, __arg_0) => onopen_Setter(mthis, __arg_0);
 
   static protocol_Getter(mthis) native "WebSocket_protocol_Getter";
+  protocol_Getter_(mthis) => protocol_Getter(mthis);
 
   static readyState_Getter(mthis) native "WebSocket_readyState_Getter";
+  readyState_Getter_(mthis) => readyState_Getter(mthis);
+
+  static send_Callback_0(mthis) native "WebSocket_send_Callback";
+  send_Callback_0_(mthis) => send_Callback_0(mthis);
+
+  static send_Callback_1(mthis, __arg_0) native "WebSocket_send_Callback";
+  send_Callback_1_(mthis, __arg_0) => send_Callback_1(mthis, __arg_0);
+
+  static send_Callback_2(mthis, __arg_0, __arg_1) native "WebSocket_send_Callback";
+  send_Callback_2_(mthis, __arg_0, __arg_1) => send_Callback_2(mthis, __arg_0, __arg_1);
+
+  static send_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WebSocket_send_Callback";
+  send_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => send_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
   static url_Getter(mthis) native "WebSocket_url_Getter";
+  url_Getter_(mthis) => url_Getter(mthis);
 
-  static close_Callback_2(mthis, code, reason) native "WebSocket_close_Callback";
-
-  static close_Callback_1(mthis, code) native "WebSocket_close_Callback";
-
-  static close_Callback(mthis) native "WebSocket_close_Callback";
-
-  static send_Callback_1(mthis, data) native "WebSocket_send_Callback";
 }
 
-class BlinkWheelEvent {
-  static constructorCallback(type, options) native "WheelEvent_constructorCallback";
+class BlinkWheelEvent extends BlinkMouseEvent {
+  static final instance = new BlinkWheelEvent();
+
+  static constructorCallback_2(__arg_0, __arg_1) native "WheelEvent_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
 
   static deltaMode_Getter(mthis) native "WheelEvent_deltaMode_Getter";
+  deltaMode_Getter_(mthis) => deltaMode_Getter(mthis);
 
   static deltaX_Getter(mthis) native "WheelEvent_deltaX_Getter";
+  deltaX_Getter_(mthis) => deltaX_Getter(mthis);
 
   static deltaY_Getter(mthis) native "WheelEvent_deltaY_Getter";
+  deltaY_Getter_(mthis) => deltaY_Getter(mthis);
 
   static deltaZ_Getter(mthis) native "WheelEvent_deltaZ_Getter";
+  deltaZ_Getter_(mthis) => deltaZ_Getter(mthis);
 
   static wheelDeltaX_Getter(mthis) native "WheelEvent_wheelDeltaX_Getter";
+  wheelDeltaX_Getter_(mthis) => wheelDeltaX_Getter(mthis);
 
   static wheelDeltaY_Getter(mthis) native "WheelEvent_wheelDeltaY_Getter";
+  wheelDeltaY_Getter_(mthis) => wheelDeltaY_Getter(mthis);
+
 }
 
-class BlinkWindow {
+class BlinkWindow extends BlinkEventTarget {
+  static final instance = new BlinkWindow();
+
+  static $__getter___Callback_1(mthis, __arg_0) native "Window___getter___Callback";
+  $__getter___Callback_1_(mthis, __arg_0) => $__getter___Callback_1(mthis, __arg_0);
+
   static CSS_Getter(mthis) native "Window_CSS_Getter";
+  CSS_Getter_(mthis) => CSS_Getter(mthis);
+
+  static alert_Callback_0(mthis) native "Window_alert_Callback";
+  alert_Callback_0_(mthis) => alert_Callback_0(mthis);
+
+  static alert_Callback_1(mthis, __arg_0) native "Window_alert_Callback";
+  alert_Callback_1_(mthis, __arg_0) => alert_Callback_1(mthis, __arg_0);
+
+  static alert_Callback_2(mthis, __arg_0, __arg_1) native "Window_alert_Callback";
+  alert_Callback_2_(mthis, __arg_0, __arg_1) => alert_Callback_2(mthis, __arg_0, __arg_1);
+
+  static alert_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Window_alert_Callback";
+  alert_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => alert_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
   static applicationCache_Getter(mthis) native "Window_applicationCache_Getter";
+  applicationCache_Getter_(mthis) => applicationCache_Getter(mthis);
+
+  static atob_Callback_0(mthis) native "Window_atob_Callback";
+  atob_Callback_0_(mthis) => atob_Callback_0(mthis);
+
+  static atob_Callback_1(mthis, __arg_0) native "Window_atob_Callback";
+  atob_Callback_1_(mthis, __arg_0) => atob_Callback_1(mthis, __arg_0);
+
+  static atob_Callback_2(mthis, __arg_0, __arg_1) native "Window_atob_Callback";
+  atob_Callback_2_(mthis, __arg_0, __arg_1) => atob_Callback_2(mthis, __arg_0, __arg_1);
+
+  static atob_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Window_atob_Callback";
+  atob_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => atob_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static blur_Callback_0(mthis) native "Window_blur_Callback";
+  blur_Callback_0_(mthis) => blur_Callback_0(mthis);
+
+  static blur_Callback_1(mthis, __arg_0) native "Window_blur_Callback";
+  blur_Callback_1_(mthis, __arg_0) => blur_Callback_1(mthis, __arg_0);
+
+  static blur_Callback_2(mthis, __arg_0, __arg_1) native "Window_blur_Callback";
+  blur_Callback_2_(mthis, __arg_0, __arg_1) => blur_Callback_2(mthis, __arg_0, __arg_1);
+
+  static btoa_Callback_0(mthis) native "Window_btoa_Callback";
+  btoa_Callback_0_(mthis) => btoa_Callback_0(mthis);
+
+  static btoa_Callback_1(mthis, __arg_0) native "Window_btoa_Callback";
+  btoa_Callback_1_(mthis, __arg_0) => btoa_Callback_1(mthis, __arg_0);
+
+  static btoa_Callback_2(mthis, __arg_0, __arg_1) native "Window_btoa_Callback";
+  btoa_Callback_2_(mthis, __arg_0, __arg_1) => btoa_Callback_2(mthis, __arg_0, __arg_1);
+
+  static btoa_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Window_btoa_Callback";
+  btoa_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => btoa_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static cancelAnimationFrame_Callback_0(mthis) native "Window_cancelAnimationFrame_Callback";
+  cancelAnimationFrame_Callback_0_(mthis) => cancelAnimationFrame_Callback_0(mthis);
+
+  static cancelAnimationFrame_Callback_1(mthis, __arg_0) native "Window_cancelAnimationFrame_Callback";
+  cancelAnimationFrame_Callback_1_(mthis, __arg_0) => cancelAnimationFrame_Callback_1(mthis, __arg_0);
+
+  static cancelAnimationFrame_Callback_2(mthis, __arg_0, __arg_1) native "Window_cancelAnimationFrame_Callback";
+  cancelAnimationFrame_Callback_2_(mthis, __arg_0, __arg_1) => cancelAnimationFrame_Callback_2(mthis, __arg_0, __arg_1);
+
+  static cancelAnimationFrame_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Window_cancelAnimationFrame_Callback";
+  cancelAnimationFrame_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => cancelAnimationFrame_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static captureEvents_Callback_0(mthis) native "Window_captureEvents_Callback";
+  captureEvents_Callback_0_(mthis) => captureEvents_Callback_0(mthis);
+
+  static captureEvents_Callback_1(mthis, __arg_0) native "Window_captureEvents_Callback";
+  captureEvents_Callback_1_(mthis, __arg_0) => captureEvents_Callback_1(mthis, __arg_0);
+
+  static captureEvents_Callback_2(mthis, __arg_0, __arg_1) native "Window_captureEvents_Callback";
+  captureEvents_Callback_2_(mthis, __arg_0, __arg_1) => captureEvents_Callback_2(mthis, __arg_0, __arg_1);
+
+  static clearInterval_Callback_0(mthis) native "Window_clearInterval_Callback";
+  clearInterval_Callback_0_(mthis) => clearInterval_Callback_0(mthis);
+
+  static clearInterval_Callback_1(mthis, __arg_0) native "Window_clearInterval_Callback";
+  clearInterval_Callback_1_(mthis, __arg_0) => clearInterval_Callback_1(mthis, __arg_0);
+
+  static clearInterval_Callback_2(mthis, __arg_0, __arg_1) native "Window_clearInterval_Callback";
+  clearInterval_Callback_2_(mthis, __arg_0, __arg_1) => clearInterval_Callback_2(mthis, __arg_0, __arg_1);
+
+  static clearInterval_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Window_clearInterval_Callback";
+  clearInterval_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => clearInterval_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static clearTimeout_Callback_0(mthis) native "Window_clearTimeout_Callback";
+  clearTimeout_Callback_0_(mthis) => clearTimeout_Callback_0(mthis);
+
+  static clearTimeout_Callback_1(mthis, __arg_0) native "Window_clearTimeout_Callback";
+  clearTimeout_Callback_1_(mthis, __arg_0) => clearTimeout_Callback_1(mthis, __arg_0);
+
+  static clearTimeout_Callback_2(mthis, __arg_0, __arg_1) native "Window_clearTimeout_Callback";
+  clearTimeout_Callback_2_(mthis, __arg_0, __arg_1) => clearTimeout_Callback_2(mthis, __arg_0, __arg_1);
+
+  static clearTimeout_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Window_clearTimeout_Callback";
+  clearTimeout_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => clearTimeout_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static close_Callback_0(mthis) native "Window_close_Callback";
+  close_Callback_0_(mthis) => close_Callback_0(mthis);
+
+  static close_Callback_1(mthis, __arg_0) native "Window_close_Callback";
+  close_Callback_1_(mthis, __arg_0) => close_Callback_1(mthis, __arg_0);
+
+  static close_Callback_2(mthis, __arg_0, __arg_1) native "Window_close_Callback";
+  close_Callback_2_(mthis, __arg_0, __arg_1) => close_Callback_2(mthis, __arg_0, __arg_1);
 
   static closed_Getter(mthis) native "Window_closed_Getter";
+  closed_Getter_(mthis) => closed_Getter(mthis);
+
+  static confirm_Callback_0(mthis) native "Window_confirm_Callback";
+  confirm_Callback_0_(mthis) => confirm_Callback_0(mthis);
+
+  static confirm_Callback_1(mthis, __arg_0) native "Window_confirm_Callback";
+  confirm_Callback_1_(mthis, __arg_0) => confirm_Callback_1(mthis, __arg_0);
+
+  static confirm_Callback_2(mthis, __arg_0, __arg_1) native "Window_confirm_Callback";
+  confirm_Callback_2_(mthis, __arg_0, __arg_1) => confirm_Callback_2(mthis, __arg_0, __arg_1);
+
+  static confirm_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Window_confirm_Callback";
+  confirm_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => confirm_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
   static console_Getter(mthis) native "Window_console_Getter";
+  console_Getter_(mthis) => console_Getter(mthis);
 
   static crypto_Getter(mthis) native "Window_crypto_Getter";
+  crypto_Getter_(mthis) => crypto_Getter(mthis);
 
   static defaultStatus_Getter(mthis) native "Window_defaultStatus_Getter";
+  defaultStatus_Getter_(mthis) => defaultStatus_Getter(mthis);
 
-  static defaultStatus_Setter(mthis, value) native "Window_defaultStatus_Setter";
+  static defaultStatus_Setter(mthis, __arg_0) native "Window_defaultStatus_Setter";
+  defaultStatus_Setter_(mthis, __arg_0) => defaultStatus_Setter(mthis, __arg_0);
 
   static defaultstatus_Getter(mthis) native "Window_defaultstatus_Getter";
+  defaultstatus_Getter_(mthis) => defaultstatus_Getter(mthis);
 
-  static defaultstatus_Setter(mthis, value) native "Window_defaultstatus_Setter";
+  static defaultstatus_Setter(mthis, __arg_0) native "Window_defaultstatus_Setter";
+  defaultstatus_Setter_(mthis, __arg_0) => defaultstatus_Setter(mthis, __arg_0);
 
   static devicePixelRatio_Getter(mthis) native "Window_devicePixelRatio_Getter";
+  devicePixelRatio_Getter_(mthis) => devicePixelRatio_Getter(mthis);
 
   static document_Getter(mthis) native "Window_document_Getter";
+  document_Getter_(mthis) => document_Getter(mthis);
+
+  static event_Getter(mthis) native "Window_event_Getter";
+  event_Getter_(mthis) => event_Getter(mthis);
+
+  static event_Setter(mthis, __arg_0) native "Window_event_Setter";
+  event_Setter_(mthis, __arg_0) => event_Setter(mthis, __arg_0);
+
+  static find_Callback_0(mthis) native "Window_find_Callback";
+  find_Callback_0_(mthis) => find_Callback_0(mthis);
+
+  static find_Callback_1(mthis, __arg_0) native "Window_find_Callback";
+  find_Callback_1_(mthis, __arg_0) => find_Callback_1(mthis, __arg_0);
+
+  static find_Callback_2(mthis, __arg_0, __arg_1) native "Window_find_Callback";
+  find_Callback_2_(mthis, __arg_0, __arg_1) => find_Callback_2(mthis, __arg_0, __arg_1);
+
+  static find_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Window_find_Callback";
+  find_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => find_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static find_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Window_find_Callback";
+  find_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => find_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static find_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "Window_find_Callback";
+  find_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => find_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static find_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "Window_find_Callback";
+  find_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => find_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static find_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) native "Window_find_Callback";
+  find_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => find_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6);
+
+  static find_Callback_8(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) native "Window_find_Callback";
+  find_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => find_Callback_8(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7);
+
+  static find_Callback_9(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) native "Window_find_Callback";
+  find_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => find_Callback_9(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8);
+
+  static focus_Callback_0(mthis) native "Window_focus_Callback";
+  focus_Callback_0_(mthis) => focus_Callback_0(mthis);
+
+  static focus_Callback_1(mthis, __arg_0) native "Window_focus_Callback";
+  focus_Callback_1_(mthis, __arg_0) => focus_Callback_1(mthis, __arg_0);
+
+  static focus_Callback_2(mthis, __arg_0, __arg_1) native "Window_focus_Callback";
+  focus_Callback_2_(mthis, __arg_0, __arg_1) => focus_Callback_2(mthis, __arg_0, __arg_1);
+
+  static frameElement_Getter(mthis) native "Window_frameElement_Getter";
+  frameElement_Getter_(mthis) => frameElement_Getter(mthis);
+
+  static frames_Getter(mthis) native "Window_frames_Getter";
+  frames_Getter_(mthis) => frames_Getter(mthis);
+
+  static getComputedStyle_Callback_0(mthis) native "Window_getComputedStyle_Callback";
+  getComputedStyle_Callback_0_(mthis) => getComputedStyle_Callback_0(mthis);
+
+  static getComputedStyle_Callback_1(mthis, __arg_0) native "Window_getComputedStyle_Callback";
+  getComputedStyle_Callback_1_(mthis, __arg_0) => getComputedStyle_Callback_1(mthis, __arg_0);
+
+  static getComputedStyle_Callback_2(mthis, __arg_0, __arg_1) native "Window_getComputedStyle_Callback";
+  getComputedStyle_Callback_2_(mthis, __arg_0, __arg_1) => getComputedStyle_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getComputedStyle_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Window_getComputedStyle_Callback";
+  getComputedStyle_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getComputedStyle_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static getComputedStyle_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Window_getComputedStyle_Callback";
+  getComputedStyle_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => getComputedStyle_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static getMatchedCSSRules_Callback_0(mthis) native "Window_getMatchedCSSRules_Callback";
+  getMatchedCSSRules_Callback_0_(mthis) => getMatchedCSSRules_Callback_0(mthis);
+
+  static getMatchedCSSRules_Callback_1(mthis, __arg_0) native "Window_getMatchedCSSRules_Callback";
+  getMatchedCSSRules_Callback_1_(mthis, __arg_0) => getMatchedCSSRules_Callback_1(mthis, __arg_0);
+
+  static getMatchedCSSRules_Callback_2(mthis, __arg_0, __arg_1) native "Window_getMatchedCSSRules_Callback";
+  getMatchedCSSRules_Callback_2_(mthis, __arg_0, __arg_1) => getMatchedCSSRules_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getMatchedCSSRules_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Window_getMatchedCSSRules_Callback";
+  getMatchedCSSRules_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getMatchedCSSRules_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static getMatchedCSSRules_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Window_getMatchedCSSRules_Callback";
+  getMatchedCSSRules_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => getMatchedCSSRules_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static getSelection_Callback_0(mthis) native "Window_getSelection_Callback";
+  getSelection_Callback_0_(mthis) => getSelection_Callback_0(mthis);
+
+  static getSelection_Callback_1(mthis, __arg_0) native "Window_getSelection_Callback";
+  getSelection_Callback_1_(mthis, __arg_0) => getSelection_Callback_1(mthis, __arg_0);
+
+  static getSelection_Callback_2(mthis, __arg_0, __arg_1) native "Window_getSelection_Callback";
+  getSelection_Callback_2_(mthis, __arg_0, __arg_1) => getSelection_Callback_2(mthis, __arg_0, __arg_1);
 
   static history_Getter(mthis) native "Window_history_Getter";
+  history_Getter_(mthis) => history_Getter(mthis);
 
   static indexedDB_Getter(mthis) native "Window_indexedDB_Getter";
+  indexedDB_Getter_(mthis) => indexedDB_Getter(mthis);
 
   static innerHeight_Getter(mthis) native "Window_innerHeight_Getter";
+  innerHeight_Getter_(mthis) => innerHeight_Getter(mthis);
 
   static innerWidth_Getter(mthis) native "Window_innerWidth_Getter";
+  innerWidth_Getter_(mthis) => innerWidth_Getter(mthis);
+
+  static length_Getter(mthis) native "Window_length_Getter";
+  length_Getter_(mthis) => length_Getter(mthis);
 
   static localStorage_Getter(mthis) native "Window_localStorage_Getter";
+  localStorage_Getter_(mthis) => localStorage_Getter(mthis);
 
   static location_Getter(mthis) native "Window_location_Getter";
+  location_Getter_(mthis) => location_Getter(mthis);
+
+  static location_Setter(mthis, __arg_0) native "Window_location_Setter";
+  location_Setter_(mthis, __arg_0) => location_Setter(mthis, __arg_0);
 
   static locationbar_Getter(mthis) native "Window_locationbar_Getter";
+  locationbar_Getter_(mthis) => locationbar_Getter(mthis);
+
+  static matchMedia_Callback_0(mthis) native "Window_matchMedia_Callback";
+  matchMedia_Callback_0_(mthis) => matchMedia_Callback_0(mthis);
+
+  static matchMedia_Callback_1(mthis, __arg_0) native "Window_matchMedia_Callback";
+  matchMedia_Callback_1_(mthis, __arg_0) => matchMedia_Callback_1(mthis, __arg_0);
+
+  static matchMedia_Callback_2(mthis, __arg_0, __arg_1) native "Window_matchMedia_Callback";
+  matchMedia_Callback_2_(mthis, __arg_0, __arg_1) => matchMedia_Callback_2(mthis, __arg_0, __arg_1);
+
+  static matchMedia_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Window_matchMedia_Callback";
+  matchMedia_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => matchMedia_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
   static menubar_Getter(mthis) native "Window_menubar_Getter";
+  menubar_Getter_(mthis) => menubar_Getter(mthis);
+
+  static moveBy_Callback_0(mthis) native "Window_moveBy_Callback";
+  moveBy_Callback_0_(mthis) => moveBy_Callback_0(mthis);
+
+  static moveBy_Callback_1(mthis, __arg_0) native "Window_moveBy_Callback";
+  moveBy_Callback_1_(mthis, __arg_0) => moveBy_Callback_1(mthis, __arg_0);
+
+  static moveBy_Callback_2(mthis, __arg_0, __arg_1) native "Window_moveBy_Callback";
+  moveBy_Callback_2_(mthis, __arg_0, __arg_1) => moveBy_Callback_2(mthis, __arg_0, __arg_1);
+
+  static moveBy_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Window_moveBy_Callback";
+  moveBy_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => moveBy_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static moveBy_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Window_moveBy_Callback";
+  moveBy_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => moveBy_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static moveTo_Callback_0(mthis) native "Window_moveTo_Callback";
+  moveTo_Callback_0_(mthis) => moveTo_Callback_0(mthis);
+
+  static moveTo_Callback_1(mthis, __arg_0) native "Window_moveTo_Callback";
+  moveTo_Callback_1_(mthis, __arg_0) => moveTo_Callback_1(mthis, __arg_0);
+
+  static moveTo_Callback_2(mthis, __arg_0, __arg_1) native "Window_moveTo_Callback";
+  moveTo_Callback_2_(mthis, __arg_0, __arg_1) => moveTo_Callback_2(mthis, __arg_0, __arg_1);
+
+  static moveTo_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Window_moveTo_Callback";
+  moveTo_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => moveTo_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static moveTo_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Window_moveTo_Callback";
+  moveTo_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => moveTo_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
 
   static name_Getter(mthis) native "Window_name_Getter";
+  name_Getter_(mthis) => name_Getter(mthis);
 
-  static name_Setter(mthis, value) native "Window_name_Setter";
+  static name_Setter(mthis, __arg_0) native "Window_name_Setter";
+  name_Setter_(mthis, __arg_0) => name_Setter(mthis, __arg_0);
 
   static navigator_Getter(mthis) native "Window_navigator_Getter";
+  navigator_Getter_(mthis) => navigator_Getter(mthis);
 
   static offscreenBuffering_Getter(mthis) native "Window_offscreenBuffering_Getter";
+  offscreenBuffering_Getter_(mthis) => offscreenBuffering_Getter(mthis);
+
+  static onabort_Getter(mthis) native "Window_onabort_Getter";
+  onabort_Getter_(mthis) => onabort_Getter(mthis);
+
+  static onabort_Setter(mthis, __arg_0) native "Window_onabort_Setter";
+  onabort_Setter_(mthis, __arg_0) => onabort_Setter(mthis, __arg_0);
+
+  static onanimationend_Getter(mthis) native "Window_onanimationend_Getter";
+  onanimationend_Getter_(mthis) => onanimationend_Getter(mthis);
+
+  static onanimationend_Setter(mthis, __arg_0) native "Window_onanimationend_Setter";
+  onanimationend_Setter_(mthis, __arg_0) => onanimationend_Setter(mthis, __arg_0);
+
+  static onanimationiteration_Getter(mthis) native "Window_onanimationiteration_Getter";
+  onanimationiteration_Getter_(mthis) => onanimationiteration_Getter(mthis);
+
+  static onanimationiteration_Setter(mthis, __arg_0) native "Window_onanimationiteration_Setter";
+  onanimationiteration_Setter_(mthis, __arg_0) => onanimationiteration_Setter(mthis, __arg_0);
+
+  static onanimationstart_Getter(mthis) native "Window_onanimationstart_Getter";
+  onanimationstart_Getter_(mthis) => onanimationstart_Getter(mthis);
+
+  static onanimationstart_Setter(mthis, __arg_0) native "Window_onanimationstart_Setter";
+  onanimationstart_Setter_(mthis, __arg_0) => onanimationstart_Setter(mthis, __arg_0);
+
+  static onautocomplete_Getter(mthis) native "Window_onautocomplete_Getter";
+  onautocomplete_Getter_(mthis) => onautocomplete_Getter(mthis);
+
+  static onautocomplete_Setter(mthis, __arg_0) native "Window_onautocomplete_Setter";
+  onautocomplete_Setter_(mthis, __arg_0) => onautocomplete_Setter(mthis, __arg_0);
+
+  static onautocompleteerror_Getter(mthis) native "Window_onautocompleteerror_Getter";
+  onautocompleteerror_Getter_(mthis) => onautocompleteerror_Getter(mthis);
+
+  static onautocompleteerror_Setter(mthis, __arg_0) native "Window_onautocompleteerror_Setter";
+  onautocompleteerror_Setter_(mthis, __arg_0) => onautocompleteerror_Setter(mthis, __arg_0);
+
+  static onbeforeunload_Getter(mthis) native "Window_onbeforeunload_Getter";
+  onbeforeunload_Getter_(mthis) => onbeforeunload_Getter(mthis);
+
+  static onbeforeunload_Setter(mthis, __arg_0) native "Window_onbeforeunload_Setter";
+  onbeforeunload_Setter_(mthis, __arg_0) => onbeforeunload_Setter(mthis, __arg_0);
+
+  static onblur_Getter(mthis) native "Window_onblur_Getter";
+  onblur_Getter_(mthis) => onblur_Getter(mthis);
+
+  static onblur_Setter(mthis, __arg_0) native "Window_onblur_Setter";
+  onblur_Setter_(mthis, __arg_0) => onblur_Setter(mthis, __arg_0);
+
+  static oncancel_Getter(mthis) native "Window_oncancel_Getter";
+  oncancel_Getter_(mthis) => oncancel_Getter(mthis);
+
+  static oncancel_Setter(mthis, __arg_0) native "Window_oncancel_Setter";
+  oncancel_Setter_(mthis, __arg_0) => oncancel_Setter(mthis, __arg_0);
+
+  static oncanplay_Getter(mthis) native "Window_oncanplay_Getter";
+  oncanplay_Getter_(mthis) => oncanplay_Getter(mthis);
+
+  static oncanplay_Setter(mthis, __arg_0) native "Window_oncanplay_Setter";
+  oncanplay_Setter_(mthis, __arg_0) => oncanplay_Setter(mthis, __arg_0);
+
+  static oncanplaythrough_Getter(mthis) native "Window_oncanplaythrough_Getter";
+  oncanplaythrough_Getter_(mthis) => oncanplaythrough_Getter(mthis);
+
+  static oncanplaythrough_Setter(mthis, __arg_0) native "Window_oncanplaythrough_Setter";
+  oncanplaythrough_Setter_(mthis, __arg_0) => oncanplaythrough_Setter(mthis, __arg_0);
+
+  static onchange_Getter(mthis) native "Window_onchange_Getter";
+  onchange_Getter_(mthis) => onchange_Getter(mthis);
+
+  static onchange_Setter(mthis, __arg_0) native "Window_onchange_Setter";
+  onchange_Setter_(mthis, __arg_0) => onchange_Setter(mthis, __arg_0);
+
+  static onclick_Getter(mthis) native "Window_onclick_Getter";
+  onclick_Getter_(mthis) => onclick_Getter(mthis);
+
+  static onclick_Setter(mthis, __arg_0) native "Window_onclick_Setter";
+  onclick_Setter_(mthis, __arg_0) => onclick_Setter(mthis, __arg_0);
+
+  static onclose_Getter(mthis) native "Window_onclose_Getter";
+  onclose_Getter_(mthis) => onclose_Getter(mthis);
+
+  static onclose_Setter(mthis, __arg_0) native "Window_onclose_Setter";
+  onclose_Setter_(mthis, __arg_0) => onclose_Setter(mthis, __arg_0);
+
+  static oncontextmenu_Getter(mthis) native "Window_oncontextmenu_Getter";
+  oncontextmenu_Getter_(mthis) => oncontextmenu_Getter(mthis);
+
+  static oncontextmenu_Setter(mthis, __arg_0) native "Window_oncontextmenu_Setter";
+  oncontextmenu_Setter_(mthis, __arg_0) => oncontextmenu_Setter(mthis, __arg_0);
+
+  static oncuechange_Getter(mthis) native "Window_oncuechange_Getter";
+  oncuechange_Getter_(mthis) => oncuechange_Getter(mthis);
+
+  static oncuechange_Setter(mthis, __arg_0) native "Window_oncuechange_Setter";
+  oncuechange_Setter_(mthis, __arg_0) => oncuechange_Setter(mthis, __arg_0);
+
+  static ondblclick_Getter(mthis) native "Window_ondblclick_Getter";
+  ondblclick_Getter_(mthis) => ondblclick_Getter(mthis);
+
+  static ondblclick_Setter(mthis, __arg_0) native "Window_ondblclick_Setter";
+  ondblclick_Setter_(mthis, __arg_0) => ondblclick_Setter(mthis, __arg_0);
+
+  static ondevicelight_Getter(mthis) native "Window_ondevicelight_Getter";
+  ondevicelight_Getter_(mthis) => ondevicelight_Getter(mthis);
+
+  static ondevicelight_Setter(mthis, __arg_0) native "Window_ondevicelight_Setter";
+  ondevicelight_Setter_(mthis, __arg_0) => ondevicelight_Setter(mthis, __arg_0);
+
+  static ondevicemotion_Getter(mthis) native "Window_ondevicemotion_Getter";
+  ondevicemotion_Getter_(mthis) => ondevicemotion_Getter(mthis);
+
+  static ondevicemotion_Setter(mthis, __arg_0) native "Window_ondevicemotion_Setter";
+  ondevicemotion_Setter_(mthis, __arg_0) => ondevicemotion_Setter(mthis, __arg_0);
+
+  static ondeviceorientation_Getter(mthis) native "Window_ondeviceorientation_Getter";
+  ondeviceorientation_Getter_(mthis) => ondeviceorientation_Getter(mthis);
+
+  static ondeviceorientation_Setter(mthis, __arg_0) native "Window_ondeviceorientation_Setter";
+  ondeviceorientation_Setter_(mthis, __arg_0) => ondeviceorientation_Setter(mthis, __arg_0);
+
+  static ondrag_Getter(mthis) native "Window_ondrag_Getter";
+  ondrag_Getter_(mthis) => ondrag_Getter(mthis);
+
+  static ondrag_Setter(mthis, __arg_0) native "Window_ondrag_Setter";
+  ondrag_Setter_(mthis, __arg_0) => ondrag_Setter(mthis, __arg_0);
+
+  static ondragend_Getter(mthis) native "Window_ondragend_Getter";
+  ondragend_Getter_(mthis) => ondragend_Getter(mthis);
+
+  static ondragend_Setter(mthis, __arg_0) native "Window_ondragend_Setter";
+  ondragend_Setter_(mthis, __arg_0) => ondragend_Setter(mthis, __arg_0);
+
+  static ondragenter_Getter(mthis) native "Window_ondragenter_Getter";
+  ondragenter_Getter_(mthis) => ondragenter_Getter(mthis);
+
+  static ondragenter_Setter(mthis, __arg_0) native "Window_ondragenter_Setter";
+  ondragenter_Setter_(mthis, __arg_0) => ondragenter_Setter(mthis, __arg_0);
+
+  static ondragleave_Getter(mthis) native "Window_ondragleave_Getter";
+  ondragleave_Getter_(mthis) => ondragleave_Getter(mthis);
+
+  static ondragleave_Setter(mthis, __arg_0) native "Window_ondragleave_Setter";
+  ondragleave_Setter_(mthis, __arg_0) => ondragleave_Setter(mthis, __arg_0);
+
+  static ondragover_Getter(mthis) native "Window_ondragover_Getter";
+  ondragover_Getter_(mthis) => ondragover_Getter(mthis);
+
+  static ondragover_Setter(mthis, __arg_0) native "Window_ondragover_Setter";
+  ondragover_Setter_(mthis, __arg_0) => ondragover_Setter(mthis, __arg_0);
+
+  static ondragstart_Getter(mthis) native "Window_ondragstart_Getter";
+  ondragstart_Getter_(mthis) => ondragstart_Getter(mthis);
+
+  static ondragstart_Setter(mthis, __arg_0) native "Window_ondragstart_Setter";
+  ondragstart_Setter_(mthis, __arg_0) => ondragstart_Setter(mthis, __arg_0);
+
+  static ondrop_Getter(mthis) native "Window_ondrop_Getter";
+  ondrop_Getter_(mthis) => ondrop_Getter(mthis);
+
+  static ondrop_Setter(mthis, __arg_0) native "Window_ondrop_Setter";
+  ondrop_Setter_(mthis, __arg_0) => ondrop_Setter(mthis, __arg_0);
+
+  static ondurationchange_Getter(mthis) native "Window_ondurationchange_Getter";
+  ondurationchange_Getter_(mthis) => ondurationchange_Getter(mthis);
+
+  static ondurationchange_Setter(mthis, __arg_0) native "Window_ondurationchange_Setter";
+  ondurationchange_Setter_(mthis, __arg_0) => ondurationchange_Setter(mthis, __arg_0);
+
+  static onemptied_Getter(mthis) native "Window_onemptied_Getter";
+  onemptied_Getter_(mthis) => onemptied_Getter(mthis);
+
+  static onemptied_Setter(mthis, __arg_0) native "Window_onemptied_Setter";
+  onemptied_Setter_(mthis, __arg_0) => onemptied_Setter(mthis, __arg_0);
+
+  static onended_Getter(mthis) native "Window_onended_Getter";
+  onended_Getter_(mthis) => onended_Getter(mthis);
+
+  static onended_Setter(mthis, __arg_0) native "Window_onended_Setter";
+  onended_Setter_(mthis, __arg_0) => onended_Setter(mthis, __arg_0);
+
+  static onerror_Getter(mthis) native "Window_onerror_Getter";
+  onerror_Getter_(mthis) => onerror_Getter(mthis);
+
+  static onerror_Setter(mthis, __arg_0) native "Window_onerror_Setter";
+  onerror_Setter_(mthis, __arg_0) => onerror_Setter(mthis, __arg_0);
+
+  static onfocus_Getter(mthis) native "Window_onfocus_Getter";
+  onfocus_Getter_(mthis) => onfocus_Getter(mthis);
+
+  static onfocus_Setter(mthis, __arg_0) native "Window_onfocus_Setter";
+  onfocus_Setter_(mthis, __arg_0) => onfocus_Setter(mthis, __arg_0);
+
+  static onhashchange_Getter(mthis) native "Window_onhashchange_Getter";
+  onhashchange_Getter_(mthis) => onhashchange_Getter(mthis);
+
+  static onhashchange_Setter(mthis, __arg_0) native "Window_onhashchange_Setter";
+  onhashchange_Setter_(mthis, __arg_0) => onhashchange_Setter(mthis, __arg_0);
+
+  static oninput_Getter(mthis) native "Window_oninput_Getter";
+  oninput_Getter_(mthis) => oninput_Getter(mthis);
+
+  static oninput_Setter(mthis, __arg_0) native "Window_oninput_Setter";
+  oninput_Setter_(mthis, __arg_0) => oninput_Setter(mthis, __arg_0);
+
+  static oninvalid_Getter(mthis) native "Window_oninvalid_Getter";
+  oninvalid_Getter_(mthis) => oninvalid_Getter(mthis);
+
+  static oninvalid_Setter(mthis, __arg_0) native "Window_oninvalid_Setter";
+  oninvalid_Setter_(mthis, __arg_0) => oninvalid_Setter(mthis, __arg_0);
+
+  static onkeydown_Getter(mthis) native "Window_onkeydown_Getter";
+  onkeydown_Getter_(mthis) => onkeydown_Getter(mthis);
+
+  static onkeydown_Setter(mthis, __arg_0) native "Window_onkeydown_Setter";
+  onkeydown_Setter_(mthis, __arg_0) => onkeydown_Setter(mthis, __arg_0);
+
+  static onkeypress_Getter(mthis) native "Window_onkeypress_Getter";
+  onkeypress_Getter_(mthis) => onkeypress_Getter(mthis);
+
+  static onkeypress_Setter(mthis, __arg_0) native "Window_onkeypress_Setter";
+  onkeypress_Setter_(mthis, __arg_0) => onkeypress_Setter(mthis, __arg_0);
+
+  static onkeyup_Getter(mthis) native "Window_onkeyup_Getter";
+  onkeyup_Getter_(mthis) => onkeyup_Getter(mthis);
+
+  static onkeyup_Setter(mthis, __arg_0) native "Window_onkeyup_Setter";
+  onkeyup_Setter_(mthis, __arg_0) => onkeyup_Setter(mthis, __arg_0);
+
+  static onlanguagechange_Getter(mthis) native "Window_onlanguagechange_Getter";
+  onlanguagechange_Getter_(mthis) => onlanguagechange_Getter(mthis);
+
+  static onlanguagechange_Setter(mthis, __arg_0) native "Window_onlanguagechange_Setter";
+  onlanguagechange_Setter_(mthis, __arg_0) => onlanguagechange_Setter(mthis, __arg_0);
+
+  static onload_Getter(mthis) native "Window_onload_Getter";
+  onload_Getter_(mthis) => onload_Getter(mthis);
+
+  static onload_Setter(mthis, __arg_0) native "Window_onload_Setter";
+  onload_Setter_(mthis, __arg_0) => onload_Setter(mthis, __arg_0);
+
+  static onloadeddata_Getter(mthis) native "Window_onloadeddata_Getter";
+  onloadeddata_Getter_(mthis) => onloadeddata_Getter(mthis);
+
+  static onloadeddata_Setter(mthis, __arg_0) native "Window_onloadeddata_Setter";
+  onloadeddata_Setter_(mthis, __arg_0) => onloadeddata_Setter(mthis, __arg_0);
+
+  static onloadedmetadata_Getter(mthis) native "Window_onloadedmetadata_Getter";
+  onloadedmetadata_Getter_(mthis) => onloadedmetadata_Getter(mthis);
+
+  static onloadedmetadata_Setter(mthis, __arg_0) native "Window_onloadedmetadata_Setter";
+  onloadedmetadata_Setter_(mthis, __arg_0) => onloadedmetadata_Setter(mthis, __arg_0);
+
+  static onloadstart_Getter(mthis) native "Window_onloadstart_Getter";
+  onloadstart_Getter_(mthis) => onloadstart_Getter(mthis);
+
+  static onloadstart_Setter(mthis, __arg_0) native "Window_onloadstart_Setter";
+  onloadstart_Setter_(mthis, __arg_0) => onloadstart_Setter(mthis, __arg_0);
+
+  static onmessage_Getter(mthis) native "Window_onmessage_Getter";
+  onmessage_Getter_(mthis) => onmessage_Getter(mthis);
+
+  static onmessage_Setter(mthis, __arg_0) native "Window_onmessage_Setter";
+  onmessage_Setter_(mthis, __arg_0) => onmessage_Setter(mthis, __arg_0);
+
+  static onmousedown_Getter(mthis) native "Window_onmousedown_Getter";
+  onmousedown_Getter_(mthis) => onmousedown_Getter(mthis);
+
+  static onmousedown_Setter(mthis, __arg_0) native "Window_onmousedown_Setter";
+  onmousedown_Setter_(mthis, __arg_0) => onmousedown_Setter(mthis, __arg_0);
+
+  static onmouseenter_Getter(mthis) native "Window_onmouseenter_Getter";
+  onmouseenter_Getter_(mthis) => onmouseenter_Getter(mthis);
+
+  static onmouseenter_Setter(mthis, __arg_0) native "Window_onmouseenter_Setter";
+  onmouseenter_Setter_(mthis, __arg_0) => onmouseenter_Setter(mthis, __arg_0);
+
+  static onmouseleave_Getter(mthis) native "Window_onmouseleave_Getter";
+  onmouseleave_Getter_(mthis) => onmouseleave_Getter(mthis);
+
+  static onmouseleave_Setter(mthis, __arg_0) native "Window_onmouseleave_Setter";
+  onmouseleave_Setter_(mthis, __arg_0) => onmouseleave_Setter(mthis, __arg_0);
+
+  static onmousemove_Getter(mthis) native "Window_onmousemove_Getter";
+  onmousemove_Getter_(mthis) => onmousemove_Getter(mthis);
+
+  static onmousemove_Setter(mthis, __arg_0) native "Window_onmousemove_Setter";
+  onmousemove_Setter_(mthis, __arg_0) => onmousemove_Setter(mthis, __arg_0);
+
+  static onmouseout_Getter(mthis) native "Window_onmouseout_Getter";
+  onmouseout_Getter_(mthis) => onmouseout_Getter(mthis);
+
+  static onmouseout_Setter(mthis, __arg_0) native "Window_onmouseout_Setter";
+  onmouseout_Setter_(mthis, __arg_0) => onmouseout_Setter(mthis, __arg_0);
+
+  static onmouseover_Getter(mthis) native "Window_onmouseover_Getter";
+  onmouseover_Getter_(mthis) => onmouseover_Getter(mthis);
+
+  static onmouseover_Setter(mthis, __arg_0) native "Window_onmouseover_Setter";
+  onmouseover_Setter_(mthis, __arg_0) => onmouseover_Setter(mthis, __arg_0);
+
+  static onmouseup_Getter(mthis) native "Window_onmouseup_Getter";
+  onmouseup_Getter_(mthis) => onmouseup_Getter(mthis);
+
+  static onmouseup_Setter(mthis, __arg_0) native "Window_onmouseup_Setter";
+  onmouseup_Setter_(mthis, __arg_0) => onmouseup_Setter(mthis, __arg_0);
+
+  static onmousewheel_Getter(mthis) native "Window_onmousewheel_Getter";
+  onmousewheel_Getter_(mthis) => onmousewheel_Getter(mthis);
+
+  static onmousewheel_Setter(mthis, __arg_0) native "Window_onmousewheel_Setter";
+  onmousewheel_Setter_(mthis, __arg_0) => onmousewheel_Setter(mthis, __arg_0);
+
+  static onoffline_Getter(mthis) native "Window_onoffline_Getter";
+  onoffline_Getter_(mthis) => onoffline_Getter(mthis);
+
+  static onoffline_Setter(mthis, __arg_0) native "Window_onoffline_Setter";
+  onoffline_Setter_(mthis, __arg_0) => onoffline_Setter(mthis, __arg_0);
+
+  static ononline_Getter(mthis) native "Window_ononline_Getter";
+  ononline_Getter_(mthis) => ononline_Getter(mthis);
+
+  static ononline_Setter(mthis, __arg_0) native "Window_ononline_Setter";
+  ononline_Setter_(mthis, __arg_0) => ononline_Setter(mthis, __arg_0);
+
+  static onorientationchange_Getter(mthis) native "Window_onorientationchange_Getter";
+  onorientationchange_Getter_(mthis) => onorientationchange_Getter(mthis);
+
+  static onorientationchange_Setter(mthis, __arg_0) native "Window_onorientationchange_Setter";
+  onorientationchange_Setter_(mthis, __arg_0) => onorientationchange_Setter(mthis, __arg_0);
+
+  static onpagehide_Getter(mthis) native "Window_onpagehide_Getter";
+  onpagehide_Getter_(mthis) => onpagehide_Getter(mthis);
+
+  static onpagehide_Setter(mthis, __arg_0) native "Window_onpagehide_Setter";
+  onpagehide_Setter_(mthis, __arg_0) => onpagehide_Setter(mthis, __arg_0);
+
+  static onpageshow_Getter(mthis) native "Window_onpageshow_Getter";
+  onpageshow_Getter_(mthis) => onpageshow_Getter(mthis);
+
+  static onpageshow_Setter(mthis, __arg_0) native "Window_onpageshow_Setter";
+  onpageshow_Setter_(mthis, __arg_0) => onpageshow_Setter(mthis, __arg_0);
+
+  static onpause_Getter(mthis) native "Window_onpause_Getter";
+  onpause_Getter_(mthis) => onpause_Getter(mthis);
+
+  static onpause_Setter(mthis, __arg_0) native "Window_onpause_Setter";
+  onpause_Setter_(mthis, __arg_0) => onpause_Setter(mthis, __arg_0);
+
+  static onplay_Getter(mthis) native "Window_onplay_Getter";
+  onplay_Getter_(mthis) => onplay_Getter(mthis);
+
+  static onplay_Setter(mthis, __arg_0) native "Window_onplay_Setter";
+  onplay_Setter_(mthis, __arg_0) => onplay_Setter(mthis, __arg_0);
+
+  static onplaying_Getter(mthis) native "Window_onplaying_Getter";
+  onplaying_Getter_(mthis) => onplaying_Getter(mthis);
+
+  static onplaying_Setter(mthis, __arg_0) native "Window_onplaying_Setter";
+  onplaying_Setter_(mthis, __arg_0) => onplaying_Setter(mthis, __arg_0);
+
+  static onpopstate_Getter(mthis) native "Window_onpopstate_Getter";
+  onpopstate_Getter_(mthis) => onpopstate_Getter(mthis);
+
+  static onpopstate_Setter(mthis, __arg_0) native "Window_onpopstate_Setter";
+  onpopstate_Setter_(mthis, __arg_0) => onpopstate_Setter(mthis, __arg_0);
+
+  static onprogress_Getter(mthis) native "Window_onprogress_Getter";
+  onprogress_Getter_(mthis) => onprogress_Getter(mthis);
+
+  static onprogress_Setter(mthis, __arg_0) native "Window_onprogress_Setter";
+  onprogress_Setter_(mthis, __arg_0) => onprogress_Setter(mthis, __arg_0);
+
+  static onratechange_Getter(mthis) native "Window_onratechange_Getter";
+  onratechange_Getter_(mthis) => onratechange_Getter(mthis);
+
+  static onratechange_Setter(mthis, __arg_0) native "Window_onratechange_Setter";
+  onratechange_Setter_(mthis, __arg_0) => onratechange_Setter(mthis, __arg_0);
+
+  static onreset_Getter(mthis) native "Window_onreset_Getter";
+  onreset_Getter_(mthis) => onreset_Getter(mthis);
+
+  static onreset_Setter(mthis, __arg_0) native "Window_onreset_Setter";
+  onreset_Setter_(mthis, __arg_0) => onreset_Setter(mthis, __arg_0);
+
+  static onresize_Getter(mthis) native "Window_onresize_Getter";
+  onresize_Getter_(mthis) => onresize_Getter(mthis);
+
+  static onresize_Setter(mthis, __arg_0) native "Window_onresize_Setter";
+  onresize_Setter_(mthis, __arg_0) => onresize_Setter(mthis, __arg_0);
+
+  static onscroll_Getter(mthis) native "Window_onscroll_Getter";
+  onscroll_Getter_(mthis) => onscroll_Getter(mthis);
+
+  static onscroll_Setter(mthis, __arg_0) native "Window_onscroll_Setter";
+  onscroll_Setter_(mthis, __arg_0) => onscroll_Setter(mthis, __arg_0);
+
+  static onsearch_Getter(mthis) native "Window_onsearch_Getter";
+  onsearch_Getter_(mthis) => onsearch_Getter(mthis);
+
+  static onsearch_Setter(mthis, __arg_0) native "Window_onsearch_Setter";
+  onsearch_Setter_(mthis, __arg_0) => onsearch_Setter(mthis, __arg_0);
+
+  static onseeked_Getter(mthis) native "Window_onseeked_Getter";
+  onseeked_Getter_(mthis) => onseeked_Getter(mthis);
+
+  static onseeked_Setter(mthis, __arg_0) native "Window_onseeked_Setter";
+  onseeked_Setter_(mthis, __arg_0) => onseeked_Setter(mthis, __arg_0);
+
+  static onseeking_Getter(mthis) native "Window_onseeking_Getter";
+  onseeking_Getter_(mthis) => onseeking_Getter(mthis);
+
+  static onseeking_Setter(mthis, __arg_0) native "Window_onseeking_Setter";
+  onseeking_Setter_(mthis, __arg_0) => onseeking_Setter(mthis, __arg_0);
+
+  static onselect_Getter(mthis) native "Window_onselect_Getter";
+  onselect_Getter_(mthis) => onselect_Getter(mthis);
+
+  static onselect_Setter(mthis, __arg_0) native "Window_onselect_Setter";
+  onselect_Setter_(mthis, __arg_0) => onselect_Setter(mthis, __arg_0);
+
+  static onshow_Getter(mthis) native "Window_onshow_Getter";
+  onshow_Getter_(mthis) => onshow_Getter(mthis);
+
+  static onshow_Setter(mthis, __arg_0) native "Window_onshow_Setter";
+  onshow_Setter_(mthis, __arg_0) => onshow_Setter(mthis, __arg_0);
+
+  static onstalled_Getter(mthis) native "Window_onstalled_Getter";
+  onstalled_Getter_(mthis) => onstalled_Getter(mthis);
+
+  static onstalled_Setter(mthis, __arg_0) native "Window_onstalled_Setter";
+  onstalled_Setter_(mthis, __arg_0) => onstalled_Setter(mthis, __arg_0);
+
+  static onstorage_Getter(mthis) native "Window_onstorage_Getter";
+  onstorage_Getter_(mthis) => onstorage_Getter(mthis);
+
+  static onstorage_Setter(mthis, __arg_0) native "Window_onstorage_Setter";
+  onstorage_Setter_(mthis, __arg_0) => onstorage_Setter(mthis, __arg_0);
+
+  static onsubmit_Getter(mthis) native "Window_onsubmit_Getter";
+  onsubmit_Getter_(mthis) => onsubmit_Getter(mthis);
+
+  static onsubmit_Setter(mthis, __arg_0) native "Window_onsubmit_Setter";
+  onsubmit_Setter_(mthis, __arg_0) => onsubmit_Setter(mthis, __arg_0);
+
+  static onsuspend_Getter(mthis) native "Window_onsuspend_Getter";
+  onsuspend_Getter_(mthis) => onsuspend_Getter(mthis);
+
+  static onsuspend_Setter(mthis, __arg_0) native "Window_onsuspend_Setter";
+  onsuspend_Setter_(mthis, __arg_0) => onsuspend_Setter(mthis, __arg_0);
+
+  static ontimeupdate_Getter(mthis) native "Window_ontimeupdate_Getter";
+  ontimeupdate_Getter_(mthis) => ontimeupdate_Getter(mthis);
+
+  static ontimeupdate_Setter(mthis, __arg_0) native "Window_ontimeupdate_Setter";
+  ontimeupdate_Setter_(mthis, __arg_0) => ontimeupdate_Setter(mthis, __arg_0);
+
+  static ontoggle_Getter(mthis) native "Window_ontoggle_Getter";
+  ontoggle_Getter_(mthis) => ontoggle_Getter(mthis);
+
+  static ontoggle_Setter(mthis, __arg_0) native "Window_ontoggle_Setter";
+  ontoggle_Setter_(mthis, __arg_0) => ontoggle_Setter(mthis, __arg_0);
+
+  static ontouchcancel_Getter(mthis) native "Window_ontouchcancel_Getter";
+  ontouchcancel_Getter_(mthis) => ontouchcancel_Getter(mthis);
+
+  static ontouchcancel_Setter(mthis, __arg_0) native "Window_ontouchcancel_Setter";
+  ontouchcancel_Setter_(mthis, __arg_0) => ontouchcancel_Setter(mthis, __arg_0);
+
+  static ontouchend_Getter(mthis) native "Window_ontouchend_Getter";
+  ontouchend_Getter_(mthis) => ontouchend_Getter(mthis);
+
+  static ontouchend_Setter(mthis, __arg_0) native "Window_ontouchend_Setter";
+  ontouchend_Setter_(mthis, __arg_0) => ontouchend_Setter(mthis, __arg_0);
+
+  static ontouchmove_Getter(mthis) native "Window_ontouchmove_Getter";
+  ontouchmove_Getter_(mthis) => ontouchmove_Getter(mthis);
+
+  static ontouchmove_Setter(mthis, __arg_0) native "Window_ontouchmove_Setter";
+  ontouchmove_Setter_(mthis, __arg_0) => ontouchmove_Setter(mthis, __arg_0);
+
+  static ontouchstart_Getter(mthis) native "Window_ontouchstart_Getter";
+  ontouchstart_Getter_(mthis) => ontouchstart_Getter(mthis);
+
+  static ontouchstart_Setter(mthis, __arg_0) native "Window_ontouchstart_Setter";
+  ontouchstart_Setter_(mthis, __arg_0) => ontouchstart_Setter(mthis, __arg_0);
+
+  static ontransitionend_Getter(mthis) native "Window_ontransitionend_Getter";
+  ontransitionend_Getter_(mthis) => ontransitionend_Getter(mthis);
+
+  static ontransitionend_Setter(mthis, __arg_0) native "Window_ontransitionend_Setter";
+  ontransitionend_Setter_(mthis, __arg_0) => ontransitionend_Setter(mthis, __arg_0);
+
+  static onunload_Getter(mthis) native "Window_onunload_Getter";
+  onunload_Getter_(mthis) => onunload_Getter(mthis);
+
+  static onunload_Setter(mthis, __arg_0) native "Window_onunload_Setter";
+  onunload_Setter_(mthis, __arg_0) => onunload_Setter(mthis, __arg_0);
+
+  static onvolumechange_Getter(mthis) native "Window_onvolumechange_Getter";
+  onvolumechange_Getter_(mthis) => onvolumechange_Getter(mthis);
+
+  static onvolumechange_Setter(mthis, __arg_0) native "Window_onvolumechange_Setter";
+  onvolumechange_Setter_(mthis, __arg_0) => onvolumechange_Setter(mthis, __arg_0);
+
+  static onwaiting_Getter(mthis) native "Window_onwaiting_Getter";
+  onwaiting_Getter_(mthis) => onwaiting_Getter(mthis);
+
+  static onwaiting_Setter(mthis, __arg_0) native "Window_onwaiting_Setter";
+  onwaiting_Setter_(mthis, __arg_0) => onwaiting_Setter(mthis, __arg_0);
+
+  static onwebkitanimationend_Getter(mthis) native "Window_onwebkitanimationend_Getter";
+  onwebkitanimationend_Getter_(mthis) => onwebkitanimationend_Getter(mthis);
+
+  static onwebkitanimationend_Setter(mthis, __arg_0) native "Window_onwebkitanimationend_Setter";
+  onwebkitanimationend_Setter_(mthis, __arg_0) => onwebkitanimationend_Setter(mthis, __arg_0);
+
+  static onwebkitanimationiteration_Getter(mthis) native "Window_onwebkitanimationiteration_Getter";
+  onwebkitanimationiteration_Getter_(mthis) => onwebkitanimationiteration_Getter(mthis);
+
+  static onwebkitanimationiteration_Setter(mthis, __arg_0) native "Window_onwebkitanimationiteration_Setter";
+  onwebkitanimationiteration_Setter_(mthis, __arg_0) => onwebkitanimationiteration_Setter(mthis, __arg_0);
+
+  static onwebkitanimationstart_Getter(mthis) native "Window_onwebkitanimationstart_Getter";
+  onwebkitanimationstart_Getter_(mthis) => onwebkitanimationstart_Getter(mthis);
+
+  static onwebkitanimationstart_Setter(mthis, __arg_0) native "Window_onwebkitanimationstart_Setter";
+  onwebkitanimationstart_Setter_(mthis, __arg_0) => onwebkitanimationstart_Setter(mthis, __arg_0);
+
+  static onwebkittransitionend_Getter(mthis) native "Window_onwebkittransitionend_Getter";
+  onwebkittransitionend_Getter_(mthis) => onwebkittransitionend_Getter(mthis);
+
+  static onwebkittransitionend_Setter(mthis, __arg_0) native "Window_onwebkittransitionend_Setter";
+  onwebkittransitionend_Setter_(mthis, __arg_0) => onwebkittransitionend_Setter(mthis, __arg_0);
+
+  static onwheel_Getter(mthis) native "Window_onwheel_Getter";
+  onwheel_Getter_(mthis) => onwheel_Getter(mthis);
+
+  static onwheel_Setter(mthis, __arg_0) native "Window_onwheel_Setter";
+  onwheel_Setter_(mthis, __arg_0) => onwheel_Setter(mthis, __arg_0);
+
+  static openDatabase_Callback_2(mthis, __arg_0, __arg_1) native "Window_openDatabase_Callback";
+  openDatabase_Callback_2_(mthis, __arg_0, __arg_1) => openDatabase_Callback_2(mthis, __arg_0, __arg_1);
+
+  static openDatabase_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Window_openDatabase_Callback";
+  openDatabase_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => openDatabase_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static openDatabase_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Window_openDatabase_Callback";
+  openDatabase_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => openDatabase_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static openDatabase_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "Window_openDatabase_Callback";
+  openDatabase_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => openDatabase_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static openDatabase_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "Window_openDatabase_Callback";
+  openDatabase_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => openDatabase_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static openDatabase_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) native "Window_openDatabase_Callback";
+  openDatabase_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => openDatabase_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6);
+
+  static open_Callback_0(mthis) native "Window_open_Callback";
+  open_Callback_0_(mthis) => open_Callback_0(mthis);
+
+  static open_Callback_1(mthis, __arg_0) native "Window_open_Callback";
+  open_Callback_1_(mthis, __arg_0) => open_Callback_1(mthis, __arg_0);
+
+  static open_Callback_2(mthis, __arg_0, __arg_1) native "Window_open_Callback";
+  open_Callback_2_(mthis, __arg_0, __arg_1) => open_Callback_2(mthis, __arg_0, __arg_1);
+
+  static open_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Window_open_Callback";
+  open_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => open_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static open_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Window_open_Callback";
+  open_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => open_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static open_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "Window_open_Callback";
+  open_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => open_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
 
   static opener_Getter(mthis) native "Window_opener_Getter";
+  opener_Getter_(mthis) => opener_Getter(mthis);
 
-  static opener_Setter(mthis, value) native "Window_opener_Setter";
+  static opener_Setter(mthis, __arg_0) native "Window_opener_Setter";
+  opener_Setter_(mthis, __arg_0) => opener_Setter(mthis, __arg_0);
 
   static orientation_Getter(mthis) native "Window_orientation_Getter";
+  orientation_Getter_(mthis) => orientation_Getter(mthis);
 
   static outerHeight_Getter(mthis) native "Window_outerHeight_Getter";
+  outerHeight_Getter_(mthis) => outerHeight_Getter(mthis);
 
   static outerWidth_Getter(mthis) native "Window_outerWidth_Getter";
+  outerWidth_Getter_(mthis) => outerWidth_Getter(mthis);
 
   static pageXOffset_Getter(mthis) native "Window_pageXOffset_Getter";
+  pageXOffset_Getter_(mthis) => pageXOffset_Getter(mthis);
 
   static pageYOffset_Getter(mthis) native "Window_pageYOffset_Getter";
+  pageYOffset_Getter_(mthis) => pageYOffset_Getter(mthis);
 
   static parent_Getter(mthis) native "Window_parent_Getter";
+  parent_Getter_(mthis) => parent_Getter(mthis);
 
   static performance_Getter(mthis) native "Window_performance_Getter";
+  performance_Getter_(mthis) => performance_Getter(mthis);
 
-  static screen_Getter(mthis) native "Window_screen_Getter";
+  static personalbar_Getter(mthis) native "Window_personalbar_Getter";
+  personalbar_Getter_(mthis) => personalbar_Getter(mthis);
+
+  static postMessage_Callback_0(mthis) native "Window_postMessage_Callback";
+  postMessage_Callback_0_(mthis) => postMessage_Callback_0(mthis);
+
+  static postMessage_Callback_1(mthis, __arg_0) native "Window_postMessage_Callback";
+  postMessage_Callback_1_(mthis, __arg_0) => postMessage_Callback_1(mthis, __arg_0);
+
+  static postMessage_Callback_2(mthis, __arg_0, __arg_1) native "Window_postMessage_Callback";
+  postMessage_Callback_2_(mthis, __arg_0, __arg_1) => postMessage_Callback_2(mthis, __arg_0, __arg_1);
+
+  static postMessage_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Window_postMessage_Callback";
+  postMessage_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => postMessage_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static postMessage_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Window_postMessage_Callback";
+  postMessage_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => postMessage_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static postMessage_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "Window_postMessage_Callback";
+  postMessage_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => postMessage_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static print_Callback_0(mthis) native "Window_print_Callback";
+  print_Callback_0_(mthis) => print_Callback_0(mthis);
+
+  static print_Callback_1(mthis, __arg_0) native "Window_print_Callback";
+  print_Callback_1_(mthis, __arg_0) => print_Callback_1(mthis, __arg_0);
+
+  static print_Callback_2(mthis, __arg_0, __arg_1) native "Window_print_Callback";
+  print_Callback_2_(mthis, __arg_0, __arg_1) => print_Callback_2(mthis, __arg_0, __arg_1);
+
+  static releaseEvents_Callback_0(mthis) native "Window_releaseEvents_Callback";
+  releaseEvents_Callback_0_(mthis) => releaseEvents_Callback_0(mthis);
+
+  static releaseEvents_Callback_1(mthis, __arg_0) native "Window_releaseEvents_Callback";
+  releaseEvents_Callback_1_(mthis, __arg_0) => releaseEvents_Callback_1(mthis, __arg_0);
+
+  static releaseEvents_Callback_2(mthis, __arg_0, __arg_1) native "Window_releaseEvents_Callback";
+  releaseEvents_Callback_2_(mthis, __arg_0, __arg_1) => releaseEvents_Callback_2(mthis, __arg_0, __arg_1);
+
+  static requestAnimationFrame_Callback_0(mthis) native "Window_requestAnimationFrame_Callback";
+  requestAnimationFrame_Callback_0_(mthis) => requestAnimationFrame_Callback_0(mthis);
+
+  static requestAnimationFrame_Callback_1(mthis, __arg_0) native "Window_requestAnimationFrame_Callback";
+  requestAnimationFrame_Callback_1_(mthis, __arg_0) => requestAnimationFrame_Callback_1(mthis, __arg_0);
+
+  static requestAnimationFrame_Callback_2(mthis, __arg_0, __arg_1) native "Window_requestAnimationFrame_Callback";
+  requestAnimationFrame_Callback_2_(mthis, __arg_0, __arg_1) => requestAnimationFrame_Callback_2(mthis, __arg_0, __arg_1);
+
+  static requestAnimationFrame_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Window_requestAnimationFrame_Callback";
+  requestAnimationFrame_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => requestAnimationFrame_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static resizeBy_Callback_0(mthis) native "Window_resizeBy_Callback";
+  resizeBy_Callback_0_(mthis) => resizeBy_Callback_0(mthis);
+
+  static resizeBy_Callback_1(mthis, __arg_0) native "Window_resizeBy_Callback";
+  resizeBy_Callback_1_(mthis, __arg_0) => resizeBy_Callback_1(mthis, __arg_0);
+
+  static resizeBy_Callback_2(mthis, __arg_0, __arg_1) native "Window_resizeBy_Callback";
+  resizeBy_Callback_2_(mthis, __arg_0, __arg_1) => resizeBy_Callback_2(mthis, __arg_0, __arg_1);
+
+  static resizeBy_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Window_resizeBy_Callback";
+  resizeBy_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => resizeBy_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static resizeBy_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Window_resizeBy_Callback";
+  resizeBy_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => resizeBy_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static resizeTo_Callback_0(mthis) native "Window_resizeTo_Callback";
+  resizeTo_Callback_0_(mthis) => resizeTo_Callback_0(mthis);
+
+  static resizeTo_Callback_1(mthis, __arg_0) native "Window_resizeTo_Callback";
+  resizeTo_Callback_1_(mthis, __arg_0) => resizeTo_Callback_1(mthis, __arg_0);
+
+  static resizeTo_Callback_2(mthis, __arg_0, __arg_1) native "Window_resizeTo_Callback";
+  resizeTo_Callback_2_(mthis, __arg_0, __arg_1) => resizeTo_Callback_2(mthis, __arg_0, __arg_1);
+
+  static resizeTo_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Window_resizeTo_Callback";
+  resizeTo_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => resizeTo_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static resizeTo_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Window_resizeTo_Callback";
+  resizeTo_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => resizeTo_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
 
   static screenLeft_Getter(mthis) native "Window_screenLeft_Getter";
+  screenLeft_Getter_(mthis) => screenLeft_Getter(mthis);
 
   static screenTop_Getter(mthis) native "Window_screenTop_Getter";
+  screenTop_Getter_(mthis) => screenTop_Getter(mthis);
 
   static screenX_Getter(mthis) native "Window_screenX_Getter";
+  screenX_Getter_(mthis) => screenX_Getter(mthis);
 
   static screenY_Getter(mthis) native "Window_screenY_Getter";
+  screenY_Getter_(mthis) => screenY_Getter(mthis);
+
+  static screen_Getter(mthis) native "Window_screen_Getter";
+  screen_Getter_(mthis) => screen_Getter(mthis);
+
+  static scrollBy_Callback_0(mthis) native "Window_scrollBy_Callback";
+  scrollBy_Callback_0_(mthis) => scrollBy_Callback_0(mthis);
+
+  static scrollBy_Callback_1(mthis, __arg_0) native "Window_scrollBy_Callback";
+  scrollBy_Callback_1_(mthis, __arg_0) => scrollBy_Callback_1(mthis, __arg_0);
+
+  static scrollBy_Callback_2(mthis, __arg_0, __arg_1) native "Window_scrollBy_Callback";
+  scrollBy_Callback_2_(mthis, __arg_0, __arg_1) => scrollBy_Callback_2(mthis, __arg_0, __arg_1);
+
+  static scrollBy_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Window_scrollBy_Callback";
+  scrollBy_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => scrollBy_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static scrollBy_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Window_scrollBy_Callback";
+  scrollBy_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => scrollBy_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static scrollBy_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "Window_scrollBy_Callback";
+  scrollBy_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => scrollBy_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static scrollTo_Callback_0(mthis) native "Window_scrollTo_Callback";
+  scrollTo_Callback_0_(mthis) => scrollTo_Callback_0(mthis);
+
+  static scrollTo_Callback_1(mthis, __arg_0) native "Window_scrollTo_Callback";
+  scrollTo_Callback_1_(mthis, __arg_0) => scrollTo_Callback_1(mthis, __arg_0);
+
+  static scrollTo_Callback_2(mthis, __arg_0, __arg_1) native "Window_scrollTo_Callback";
+  scrollTo_Callback_2_(mthis, __arg_0, __arg_1) => scrollTo_Callback_2(mthis, __arg_0, __arg_1);
+
+  static scrollTo_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Window_scrollTo_Callback";
+  scrollTo_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => scrollTo_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static scrollTo_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Window_scrollTo_Callback";
+  scrollTo_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => scrollTo_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static scrollTo_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "Window_scrollTo_Callback";
+  scrollTo_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => scrollTo_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
 
   static scrollX_Getter(mthis) native "Window_scrollX_Getter";
+  scrollX_Getter_(mthis) => scrollX_Getter(mthis);
 
   static scrollY_Getter(mthis) native "Window_scrollY_Getter";
+  scrollY_Getter_(mthis) => scrollY_Getter(mthis);
+
+  static scroll_Callback_0(mthis) native "Window_scroll_Callback";
+  scroll_Callback_0_(mthis) => scroll_Callback_0(mthis);
+
+  static scroll_Callback_1(mthis, __arg_0) native "Window_scroll_Callback";
+  scroll_Callback_1_(mthis, __arg_0) => scroll_Callback_1(mthis, __arg_0);
+
+  static scroll_Callback_2(mthis, __arg_0, __arg_1) native "Window_scroll_Callback";
+  scroll_Callback_2_(mthis, __arg_0, __arg_1) => scroll_Callback_2(mthis, __arg_0, __arg_1);
+
+  static scroll_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Window_scroll_Callback";
+  scroll_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => scroll_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static scroll_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Window_scroll_Callback";
+  scroll_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => scroll_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static scroll_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "Window_scroll_Callback";
+  scroll_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => scroll_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
 
   static scrollbars_Getter(mthis) native "Window_scrollbars_Getter";
+  scrollbars_Getter_(mthis) => scrollbars_Getter(mthis);
 
   static self_Getter(mthis) native "Window_self_Getter";
+  self_Getter_(mthis) => self_Getter(mthis);
 
   static sessionStorage_Getter(mthis) native "Window_sessionStorage_Getter";
+  sessionStorage_Getter_(mthis) => sessionStorage_Getter(mthis);
+
+  static setInterval_Callback_0(mthis) native "Window_setInterval_Callback";
+  setInterval_Callback_0_(mthis) => setInterval_Callback_0(mthis);
+
+  static setInterval_Callback_1(mthis, __arg_0) native "Window_setInterval_Callback";
+  setInterval_Callback_1_(mthis, __arg_0) => setInterval_Callback_1(mthis, __arg_0);
+
+  static setInterval_Callback_2(mthis, __arg_0, __arg_1) native "Window_setInterval_Callback";
+  setInterval_Callback_2_(mthis, __arg_0, __arg_1) => setInterval_Callback_2(mthis, __arg_0, __arg_1);
+
+  static setInterval_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Window_setInterval_Callback";
+  setInterval_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => setInterval_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static setInterval_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Window_setInterval_Callback";
+  setInterval_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => setInterval_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static setTimeout_Callback_0(mthis) native "Window_setTimeout_Callback";
+  setTimeout_Callback_0_(mthis) => setTimeout_Callback_0(mthis);
+
+  static setTimeout_Callback_1(mthis, __arg_0) native "Window_setTimeout_Callback";
+  setTimeout_Callback_1_(mthis, __arg_0) => setTimeout_Callback_1(mthis, __arg_0);
+
+  static setTimeout_Callback_2(mthis, __arg_0, __arg_1) native "Window_setTimeout_Callback";
+  setTimeout_Callback_2_(mthis, __arg_0, __arg_1) => setTimeout_Callback_2(mthis, __arg_0, __arg_1);
+
+  static setTimeout_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Window_setTimeout_Callback";
+  setTimeout_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => setTimeout_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static setTimeout_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Window_setTimeout_Callback";
+  setTimeout_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => setTimeout_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static showModalDialog_Callback_0(mthis) native "Window_showModalDialog_Callback";
+  showModalDialog_Callback_0_(mthis) => showModalDialog_Callback_0(mthis);
+
+  static showModalDialog_Callback_1(mthis, __arg_0) native "Window_showModalDialog_Callback";
+  showModalDialog_Callback_1_(mthis, __arg_0) => showModalDialog_Callback_1(mthis, __arg_0);
+
+  static showModalDialog_Callback_2(mthis, __arg_0, __arg_1) native "Window_showModalDialog_Callback";
+  showModalDialog_Callback_2_(mthis, __arg_0, __arg_1) => showModalDialog_Callback_2(mthis, __arg_0, __arg_1);
+
+  static showModalDialog_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Window_showModalDialog_Callback";
+  showModalDialog_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => showModalDialog_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static showModalDialog_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Window_showModalDialog_Callback";
+  showModalDialog_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => showModalDialog_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static showModalDialog_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "Window_showModalDialog_Callback";
+  showModalDialog_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => showModalDialog_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
 
   static speechSynthesis_Getter(mthis) native "Window_speechSynthesis_Getter";
+  speechSynthesis_Getter_(mthis) => speechSynthesis_Getter(mthis);
 
   static status_Getter(mthis) native "Window_status_Getter";
+  status_Getter_(mthis) => status_Getter(mthis);
 
-  static status_Setter(mthis, value) native "Window_status_Setter";
+  static status_Setter(mthis, __arg_0) native "Window_status_Setter";
+  status_Setter_(mthis, __arg_0) => status_Setter(mthis, __arg_0);
 
   static statusbar_Getter(mthis) native "Window_statusbar_Getter";
+  statusbar_Getter_(mthis) => statusbar_Getter(mthis);
+
+  static stop_Callback_0(mthis) native "Window_stop_Callback";
+  stop_Callback_0_(mthis) => stop_Callback_0(mthis);
+
+  static stop_Callback_1(mthis, __arg_0) native "Window_stop_Callback";
+  stop_Callback_1_(mthis, __arg_0) => stop_Callback_1(mthis, __arg_0);
+
+  static stop_Callback_2(mthis, __arg_0, __arg_1) native "Window_stop_Callback";
+  stop_Callback_2_(mthis, __arg_0, __arg_1) => stop_Callback_2(mthis, __arg_0, __arg_1);
 
   static styleMedia_Getter(mthis) native "Window_styleMedia_Getter";
+  styleMedia_Getter_(mthis) => styleMedia_Getter(mthis);
 
   static toolbar_Getter(mthis) native "Window_toolbar_Getter";
+  toolbar_Getter_(mthis) => toolbar_Getter(mthis);
 
   static top_Getter(mthis) native "Window_top_Getter";
+  top_Getter_(mthis) => top_Getter(mthis);
+
+  static webkitRequestFileSystem_Callback_1(mthis, __arg_0) native "Window_webkitRequestFileSystem_Callback";
+  webkitRequestFileSystem_Callback_1_(mthis, __arg_0) => webkitRequestFileSystem_Callback_1(mthis, __arg_0);
+
+  static webkitRequestFileSystem_Callback_2(mthis, __arg_0, __arg_1) native "Window_webkitRequestFileSystem_Callback";
+  webkitRequestFileSystem_Callback_2_(mthis, __arg_0, __arg_1) => webkitRequestFileSystem_Callback_2(mthis, __arg_0, __arg_1);
+
+  static webkitRequestFileSystem_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Window_webkitRequestFileSystem_Callback";
+  webkitRequestFileSystem_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => webkitRequestFileSystem_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static webkitRequestFileSystem_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Window_webkitRequestFileSystem_Callback";
+  webkitRequestFileSystem_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => webkitRequestFileSystem_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static webkitRequestFileSystem_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "Window_webkitRequestFileSystem_Callback";
+  webkitRequestFileSystem_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => webkitRequestFileSystem_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static webkitRequestFileSystem_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "Window_webkitRequestFileSystem_Callback";
+  webkitRequestFileSystem_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => webkitRequestFileSystem_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static webkitResolveLocalFileSystemURL_Callback_0(mthis) native "Window_webkitResolveLocalFileSystemURL_Callback";
+  webkitResolveLocalFileSystemURL_Callback_0_(mthis) => webkitResolveLocalFileSystemURL_Callback_0(mthis);
+
+  static webkitResolveLocalFileSystemURL_Callback_1(mthis, __arg_0) native "Window_webkitResolveLocalFileSystemURL_Callback";
+  webkitResolveLocalFileSystemURL_Callback_1_(mthis, __arg_0) => webkitResolveLocalFileSystemURL_Callback_1(mthis, __arg_0);
+
+  static webkitResolveLocalFileSystemURL_Callback_2(mthis, __arg_0, __arg_1) native "Window_webkitResolveLocalFileSystemURL_Callback";
+  webkitResolveLocalFileSystemURL_Callback_2_(mthis, __arg_0, __arg_1) => webkitResolveLocalFileSystemURL_Callback_2(mthis, __arg_0, __arg_1);
+
+  static webkitResolveLocalFileSystemURL_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Window_webkitResolveLocalFileSystemURL_Callback";
+  webkitResolveLocalFileSystemURL_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => webkitResolveLocalFileSystemURL_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static webkitResolveLocalFileSystemURL_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Window_webkitResolveLocalFileSystemURL_Callback";
+  webkitResolveLocalFileSystemURL_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => webkitResolveLocalFileSystemURL_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static webkitResolveLocalFileSystemURL_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "Window_webkitResolveLocalFileSystemURL_Callback";
+  webkitResolveLocalFileSystemURL_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => webkitResolveLocalFileSystemURL_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static webkitStorageInfo_Getter(mthis) native "Window_webkitStorageInfo_Getter";
+  webkitStorageInfo_Getter_(mthis) => webkitStorageInfo_Getter(mthis);
 
   static window_Getter(mthis) native "Window_window_Getter";
+  window_Getter_(mthis) => window_Getter(mthis);
 
-  static $__getter___Callback_1(mthis, index_OR_name) native "Window___getter___Callback";
-
-  static alert_Callback_1(mthis, message) native "Window_alert_Callback";
-
-  static alert_Callback(mthis) native "Window_alert_Callback";
-
-  static cancelAnimationFrame_Callback_1(mthis, id) native "Window_cancelAnimationFrame_Callback";
-
-  static close_Callback(mthis) native "Window_close_Callback";
-
-  static confirm_Callback_1(mthis, message) native "Window_confirm_Callback";
-
-  static confirm_Callback(mthis) native "Window_confirm_Callback";
-
-  static find_Callback_7(mthis, string, caseSensitive, backwards, wrap, wholeWord, searchInFrames, showDialog) native "Window_find_Callback";
-
-  static getComputedStyle_Callback_2(mthis, element, pseudoElement) native "Window_getComputedStyle_Callback";
-
-  static getMatchedCSSRules_Callback_2(mthis, element, pseudoElement) native "Window_getMatchedCSSRules_Callback";
-
-  static getSelection_Callback(mthis) native "Window_getSelection_Callback";
-
-  static matchMedia_Callback_1(mthis, query) native "Window_matchMedia_Callback";
-
-  static moveBy_Callback_2(mthis, x, y) native "Window_moveBy_Callback";
-
-  static moveTo_Callback_2(mthis, x, y) native "Window_moveTo_Callback";
-
-  static open_Callback_3(mthis, url, name, options) native "Window_open_Callback";
-
-  static openDatabase_Callback_5(mthis, name, version, displayName, estimatedSize, creationCallback) native "Window_openDatabase_Callback";
-
-  static openDatabase_Callback_4(mthis, name, version, displayName, estimatedSize) native "Window_openDatabase_Callback";
-
-  static postMessage_Callback_3(mthis, message, targetOrigin, transfer) native "Window_postMessage_Callback";
-
-  static print_Callback(mthis) native "Window_print_Callback";
-
-  static requestAnimationFrame_Callback_1(mthis, callback) native "Window_requestAnimationFrame_Callback";
-
-  static resizeBy_Callback_2(mthis, x, y) native "Window_resizeBy_Callback";
-
-  static resizeTo_Callback_2(mthis, width, height) native "Window_resizeTo_Callback";
-
-  static scroll_Callback_3(mthis, x, y, scrollOptions) native "Window_scroll_Callback";
-
-  static scroll_Callback_2(mthis, x, y) native "Window_scroll_Callback";
-
-  static scrollBy_Callback_3(mthis, x, y, scrollOptions) native "Window_scrollBy_Callback";
-
-  static scrollBy_Callback_2(mthis, x, y) native "Window_scrollBy_Callback";
-
-  static scrollTo_Callback_3(mthis, x, y, scrollOptions) native "Window_scrollTo_Callback";
-
-  static scrollTo_Callback_2(mthis, x, y) native "Window_scrollTo_Callback";
-
-  static showModalDialog_Callback_3(mthis, url, dialogArgs, featureArgs) native "Window_showModalDialog_Callback";
-
-  static stop_Callback(mthis) native "Window_stop_Callback";
-
-  static webkitRequestFileSystem_Callback_4(mthis, type, size, successCallback, errorCallback) native "Window_webkitRequestFileSystem_Callback";
-
-  static webkitRequestFileSystem_Callback_3(mthis, type, size, successCallback) native "Window_webkitRequestFileSystem_Callback";
-
-  static webkitResolveLocalFileSystemURL_Callback_3(mthis, url, successCallback, errorCallback) native "Window_webkitResolveLocalFileSystemURL_Callback";
-
-  static webkitResolveLocalFileSystemURL_Callback_2(mthis, url, successCallback) native "Window_webkitResolveLocalFileSystemURL_Callback";
-
-  static atob_Callback_1(mthis, string) native "Window_atob_Callback";
-
-  static btoa_Callback_1(mthis, string) native "Window_btoa_Callback";
-
-  static clearInterval_Callback_1(mthis, handle) native "Window_clearInterval_Callback";
-
-  static clearTimeout_Callback_1(mthis, handle) native "Window_clearTimeout_Callback";
-
-  static setInterval_Callback_2(mthis, handler, timeout) native "Window_setInterval_Callback";
-
-  static setTimeout_Callback_2(mthis, handler, timeout) native "Window_setTimeout_Callback";
 }
 
-class BlinkWorker {
-  static constructorCallback_1(scriptUrl) native "Worker_constructorCallback";
+class BlinkWorker extends BlinkEventTarget {
+  static final instance = new BlinkWorker();
 
-  static postMessage_Callback_2(mthis, message, transfer) native "Worker_postMessage_Callback";
+  static constructorCallback_0() native "Worker_constructorCallback";
+  constructorCallback_0_() => constructorCallback_0();
 
-  static terminate_Callback(mthis) native "Worker_terminate_Callback";
+  static constructorCallback_1(__arg_0) native "Worker_constructorCallback";
+  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+
+  static constructorCallback_2(__arg_0, __arg_1) native "Worker_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+
+  static constructorCallback_3(__arg_0, __arg_1, __arg_2) native "Worker_constructorCallback";
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => constructorCallback_3(__arg_0, __arg_1, __arg_2);
+
+  static onerror_Getter(mthis) native "Worker_onerror_Getter";
+  onerror_Getter_(mthis) => onerror_Getter(mthis);
+
+  static onerror_Setter(mthis, __arg_0) native "Worker_onerror_Setter";
+  onerror_Setter_(mthis, __arg_0) => onerror_Setter(mthis, __arg_0);
+
+  static onmessage_Getter(mthis) native "Worker_onmessage_Getter";
+  onmessage_Getter_(mthis) => onmessage_Getter(mthis);
+
+  static onmessage_Setter(mthis, __arg_0) native "Worker_onmessage_Setter";
+  onmessage_Setter_(mthis, __arg_0) => onmessage_Setter(mthis, __arg_0);
+
+  static postMessage_Callback_0(mthis) native "Worker_postMessage_Callback";
+  postMessage_Callback_0_(mthis) => postMessage_Callback_0(mthis);
+
+  static postMessage_Callback_1(mthis, __arg_0) native "Worker_postMessage_Callback";
+  postMessage_Callback_1_(mthis, __arg_0) => postMessage_Callback_1(mthis, __arg_0);
+
+  static postMessage_Callback_2(mthis, __arg_0, __arg_1) native "Worker_postMessage_Callback";
+  postMessage_Callback_2_(mthis, __arg_0, __arg_1) => postMessage_Callback_2(mthis, __arg_0, __arg_1);
+
+  static postMessage_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Worker_postMessage_Callback";
+  postMessage_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => postMessage_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static postMessage_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "Worker_postMessage_Callback";
+  postMessage_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => postMessage_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static terminate_Callback_0(mthis) native "Worker_terminate_Callback";
+  terminate_Callback_0_(mthis) => terminate_Callback_0(mthis);
+
+  static terminate_Callback_1(mthis, __arg_0) native "Worker_terminate_Callback";
+  terminate_Callback_1_(mthis, __arg_0) => terminate_Callback_1(mthis, __arg_0);
+
+  static terminate_Callback_2(mthis, __arg_0, __arg_1) native "Worker_terminate_Callback";
+  terminate_Callback_2_(mthis, __arg_0, __arg_1) => terminate_Callback_2(mthis, __arg_0, __arg_1);
+
 }
 
-class BlinkWorkerConsole {}
+class BlinkWorkerConsole extends BlinkConsoleBase {
+  static final instance = new BlinkWorkerConsole();
 
-class BlinkWorkerLocation {}
+}
 
-class BlinkWorkerNavigator {}
+class BlinkWorkerGlobalScope extends BlinkEventTarget {
+  static final instance = new BlinkWorkerGlobalScope();
+
+  static atob_Callback_0(mthis) native "WorkerGlobalScope_atob_Callback";
+  atob_Callback_0_(mthis) => atob_Callback_0(mthis);
+
+  static atob_Callback_1(mthis, __arg_0) native "WorkerGlobalScope_atob_Callback";
+  atob_Callback_1_(mthis, __arg_0) => atob_Callback_1(mthis, __arg_0);
+
+  static atob_Callback_2(mthis, __arg_0, __arg_1) native "WorkerGlobalScope_atob_Callback";
+  atob_Callback_2_(mthis, __arg_0, __arg_1) => atob_Callback_2(mthis, __arg_0, __arg_1);
+
+  static atob_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WorkerGlobalScope_atob_Callback";
+  atob_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => atob_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static btoa_Callback_0(mthis) native "WorkerGlobalScope_btoa_Callback";
+  btoa_Callback_0_(mthis) => btoa_Callback_0(mthis);
+
+  static btoa_Callback_1(mthis, __arg_0) native "WorkerGlobalScope_btoa_Callback";
+  btoa_Callback_1_(mthis, __arg_0) => btoa_Callback_1(mthis, __arg_0);
+
+  static btoa_Callback_2(mthis, __arg_0, __arg_1) native "WorkerGlobalScope_btoa_Callback";
+  btoa_Callback_2_(mthis, __arg_0, __arg_1) => btoa_Callback_2(mthis, __arg_0, __arg_1);
+
+  static btoa_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WorkerGlobalScope_btoa_Callback";
+  btoa_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => btoa_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static clearInterval_Callback_0(mthis) native "WorkerGlobalScope_clearInterval_Callback";
+  clearInterval_Callback_0_(mthis) => clearInterval_Callback_0(mthis);
+
+  static clearInterval_Callback_1(mthis, __arg_0) native "WorkerGlobalScope_clearInterval_Callback";
+  clearInterval_Callback_1_(mthis, __arg_0) => clearInterval_Callback_1(mthis, __arg_0);
+
+  static clearInterval_Callback_2(mthis, __arg_0, __arg_1) native "WorkerGlobalScope_clearInterval_Callback";
+  clearInterval_Callback_2_(mthis, __arg_0, __arg_1) => clearInterval_Callback_2(mthis, __arg_0, __arg_1);
+
+  static clearInterval_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WorkerGlobalScope_clearInterval_Callback";
+  clearInterval_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => clearInterval_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static clearTimeout_Callback_0(mthis) native "WorkerGlobalScope_clearTimeout_Callback";
+  clearTimeout_Callback_0_(mthis) => clearTimeout_Callback_0(mthis);
+
+  static clearTimeout_Callback_1(mthis, __arg_0) native "WorkerGlobalScope_clearTimeout_Callback";
+  clearTimeout_Callback_1_(mthis, __arg_0) => clearTimeout_Callback_1(mthis, __arg_0);
+
+  static clearTimeout_Callback_2(mthis, __arg_0, __arg_1) native "WorkerGlobalScope_clearTimeout_Callback";
+  clearTimeout_Callback_2_(mthis, __arg_0, __arg_1) => clearTimeout_Callback_2(mthis, __arg_0, __arg_1);
+
+  static clearTimeout_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WorkerGlobalScope_clearTimeout_Callback";
+  clearTimeout_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => clearTimeout_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static close_Callback_0(mthis) native "WorkerGlobalScope_close_Callback";
+  close_Callback_0_(mthis) => close_Callback_0(mthis);
+
+  static close_Callback_1(mthis, __arg_0) native "WorkerGlobalScope_close_Callback";
+  close_Callback_1_(mthis, __arg_0) => close_Callback_1(mthis, __arg_0);
+
+  static close_Callback_2(mthis, __arg_0, __arg_1) native "WorkerGlobalScope_close_Callback";
+  close_Callback_2_(mthis, __arg_0, __arg_1) => close_Callback_2(mthis, __arg_0, __arg_1);
+
+  static console_Getter(mthis) native "WorkerGlobalScope_console_Getter";
+  console_Getter_(mthis) => console_Getter(mthis);
+
+  static createImageBitmap_Callback_0(mthis) native "WorkerGlobalScope_createImageBitmap_Callback";
+  createImageBitmap_Callback_0_(mthis) => createImageBitmap_Callback_0(mthis);
+
+  static createImageBitmap_Callback_1(mthis, __arg_0) native "WorkerGlobalScope_createImageBitmap_Callback";
+  createImageBitmap_Callback_1_(mthis, __arg_0) => createImageBitmap_Callback_1(mthis, __arg_0);
+
+  static createImageBitmap_Callback_2(mthis, __arg_0, __arg_1) native "WorkerGlobalScope_createImageBitmap_Callback";
+  createImageBitmap_Callback_2_(mthis, __arg_0, __arg_1) => createImageBitmap_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createImageBitmap_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WorkerGlobalScope_createImageBitmap_Callback";
+  createImageBitmap_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => createImageBitmap_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static createImageBitmap_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WorkerGlobalScope_createImageBitmap_Callback";
+  createImageBitmap_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => createImageBitmap_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static createImageBitmap_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "WorkerGlobalScope_createImageBitmap_Callback";
+  createImageBitmap_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => createImageBitmap_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static createImageBitmap_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "WorkerGlobalScope_createImageBitmap_Callback";
+  createImageBitmap_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => createImageBitmap_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static createImageBitmap_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) native "WorkerGlobalScope_createImageBitmap_Callback";
+  createImageBitmap_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => createImageBitmap_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6);
+
+  static crypto_Getter(mthis) native "WorkerGlobalScope_crypto_Getter";
+  crypto_Getter_(mthis) => crypto_Getter(mthis);
+
+  static importScripts_Callback_0(mthis) native "WorkerGlobalScope_importScripts_Callback";
+  importScripts_Callback_0_(mthis) => importScripts_Callback_0(mthis);
+
+  static importScripts_Callback_1(mthis, __arg_0) native "WorkerGlobalScope_importScripts_Callback";
+  importScripts_Callback_1_(mthis, __arg_0) => importScripts_Callback_1(mthis, __arg_0);
+
+  static importScripts_Callback_2(mthis, __arg_0, __arg_1) native "WorkerGlobalScope_importScripts_Callback";
+  importScripts_Callback_2_(mthis, __arg_0, __arg_1) => importScripts_Callback_2(mthis, __arg_0, __arg_1);
+
+  static importScripts_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WorkerGlobalScope_importScripts_Callback";
+  importScripts_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => importScripts_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static indexedDB_Getter(mthis) native "WorkerGlobalScope_indexedDB_Getter";
+  indexedDB_Getter_(mthis) => indexedDB_Getter(mthis);
+
+  static location_Getter(mthis) native "WorkerGlobalScope_location_Getter";
+  location_Getter_(mthis) => location_Getter(mthis);
+
+  static navigator_Getter(mthis) native "WorkerGlobalScope_navigator_Getter";
+  navigator_Getter_(mthis) => navigator_Getter(mthis);
+
+  static onerror_Getter(mthis) native "WorkerGlobalScope_onerror_Getter";
+  onerror_Getter_(mthis) => onerror_Getter(mthis);
+
+  static onerror_Setter(mthis, __arg_0) native "WorkerGlobalScope_onerror_Setter";
+  onerror_Setter_(mthis, __arg_0) => onerror_Setter(mthis, __arg_0);
+
+  static openDatabaseSync_Callback_2(mthis, __arg_0, __arg_1) native "WorkerGlobalScope_openDatabaseSync_Callback";
+  openDatabaseSync_Callback_2_(mthis, __arg_0, __arg_1) => openDatabaseSync_Callback_2(mthis, __arg_0, __arg_1);
+
+  static openDatabaseSync_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WorkerGlobalScope_openDatabaseSync_Callback";
+  openDatabaseSync_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => openDatabaseSync_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static openDatabaseSync_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WorkerGlobalScope_openDatabaseSync_Callback";
+  openDatabaseSync_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => openDatabaseSync_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static openDatabaseSync_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "WorkerGlobalScope_openDatabaseSync_Callback";
+  openDatabaseSync_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => openDatabaseSync_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static openDatabaseSync_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "WorkerGlobalScope_openDatabaseSync_Callback";
+  openDatabaseSync_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => openDatabaseSync_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static openDatabaseSync_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) native "WorkerGlobalScope_openDatabaseSync_Callback";
+  openDatabaseSync_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => openDatabaseSync_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6);
+
+  static openDatabase_Callback_2(mthis, __arg_0, __arg_1) native "WorkerGlobalScope_openDatabase_Callback";
+  openDatabase_Callback_2_(mthis, __arg_0, __arg_1) => openDatabase_Callback_2(mthis, __arg_0, __arg_1);
+
+  static openDatabase_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WorkerGlobalScope_openDatabase_Callback";
+  openDatabase_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => openDatabase_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static openDatabase_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WorkerGlobalScope_openDatabase_Callback";
+  openDatabase_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => openDatabase_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static openDatabase_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "WorkerGlobalScope_openDatabase_Callback";
+  openDatabase_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => openDatabase_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static openDatabase_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "WorkerGlobalScope_openDatabase_Callback";
+  openDatabase_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => openDatabase_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static openDatabase_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) native "WorkerGlobalScope_openDatabase_Callback";
+  openDatabase_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => openDatabase_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6);
+
+  static performance_Getter(mthis) native "WorkerGlobalScope_performance_Getter";
+  performance_Getter_(mthis) => performance_Getter(mthis);
+
+  static self_Getter(mthis) native "WorkerGlobalScope_self_Getter";
+  self_Getter_(mthis) => self_Getter(mthis);
+
+  static setInterval_Callback_0(mthis) native "WorkerGlobalScope_setInterval_Callback";
+  setInterval_Callback_0_(mthis) => setInterval_Callback_0(mthis);
+
+  static setInterval_Callback_1(mthis, __arg_0) native "WorkerGlobalScope_setInterval_Callback";
+  setInterval_Callback_1_(mthis, __arg_0) => setInterval_Callback_1(mthis, __arg_0);
+
+  static setInterval_Callback_2(mthis, __arg_0, __arg_1) native "WorkerGlobalScope_setInterval_Callback";
+  setInterval_Callback_2_(mthis, __arg_0, __arg_1) => setInterval_Callback_2(mthis, __arg_0, __arg_1);
+
+  static setInterval_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WorkerGlobalScope_setInterval_Callback";
+  setInterval_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => setInterval_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static setInterval_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WorkerGlobalScope_setInterval_Callback";
+  setInterval_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => setInterval_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static setTimeout_Callback_0(mthis) native "WorkerGlobalScope_setTimeout_Callback";
+  setTimeout_Callback_0_(mthis) => setTimeout_Callback_0(mthis);
+
+  static setTimeout_Callback_1(mthis, __arg_0) native "WorkerGlobalScope_setTimeout_Callback";
+  setTimeout_Callback_1_(mthis, __arg_0) => setTimeout_Callback_1(mthis, __arg_0);
+
+  static setTimeout_Callback_2(mthis, __arg_0, __arg_1) native "WorkerGlobalScope_setTimeout_Callback";
+  setTimeout_Callback_2_(mthis, __arg_0, __arg_1) => setTimeout_Callback_2(mthis, __arg_0, __arg_1);
+
+  static setTimeout_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WorkerGlobalScope_setTimeout_Callback";
+  setTimeout_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => setTimeout_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static setTimeout_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WorkerGlobalScope_setTimeout_Callback";
+  setTimeout_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => setTimeout_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static webkitRequestFileSystemSync_Callback_0(mthis) native "WorkerGlobalScope_webkitRequestFileSystemSync_Callback";
+  webkitRequestFileSystemSync_Callback_0_(mthis) => webkitRequestFileSystemSync_Callback_0(mthis);
+
+  static webkitRequestFileSystemSync_Callback_1(mthis, __arg_0) native "WorkerGlobalScope_webkitRequestFileSystemSync_Callback";
+  webkitRequestFileSystemSync_Callback_1_(mthis, __arg_0) => webkitRequestFileSystemSync_Callback_1(mthis, __arg_0);
+
+  static webkitRequestFileSystemSync_Callback_2(mthis, __arg_0, __arg_1) native "WorkerGlobalScope_webkitRequestFileSystemSync_Callback";
+  webkitRequestFileSystemSync_Callback_2_(mthis, __arg_0, __arg_1) => webkitRequestFileSystemSync_Callback_2(mthis, __arg_0, __arg_1);
+
+  static webkitRequestFileSystemSync_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WorkerGlobalScope_webkitRequestFileSystemSync_Callback";
+  webkitRequestFileSystemSync_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => webkitRequestFileSystemSync_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static webkitRequestFileSystemSync_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WorkerGlobalScope_webkitRequestFileSystemSync_Callback";
+  webkitRequestFileSystemSync_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => webkitRequestFileSystemSync_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static webkitRequestFileSystem_Callback_0(mthis) native "WorkerGlobalScope_webkitRequestFileSystem_Callback";
+  webkitRequestFileSystem_Callback_0_(mthis) => webkitRequestFileSystem_Callback_0(mthis);
+
+  static webkitRequestFileSystem_Callback_1(mthis, __arg_0) native "WorkerGlobalScope_webkitRequestFileSystem_Callback";
+  webkitRequestFileSystem_Callback_1_(mthis, __arg_0) => webkitRequestFileSystem_Callback_1(mthis, __arg_0);
+
+  static webkitRequestFileSystem_Callback_2(mthis, __arg_0, __arg_1) native "WorkerGlobalScope_webkitRequestFileSystem_Callback";
+  webkitRequestFileSystem_Callback_2_(mthis, __arg_0, __arg_1) => webkitRequestFileSystem_Callback_2(mthis, __arg_0, __arg_1);
+
+  static webkitRequestFileSystem_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WorkerGlobalScope_webkitRequestFileSystem_Callback";
+  webkitRequestFileSystem_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => webkitRequestFileSystem_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static webkitRequestFileSystem_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WorkerGlobalScope_webkitRequestFileSystem_Callback";
+  webkitRequestFileSystem_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => webkitRequestFileSystem_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static webkitRequestFileSystem_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "WorkerGlobalScope_webkitRequestFileSystem_Callback";
+  webkitRequestFileSystem_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => webkitRequestFileSystem_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static webkitRequestFileSystem_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "WorkerGlobalScope_webkitRequestFileSystem_Callback";
+  webkitRequestFileSystem_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => webkitRequestFileSystem_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static webkitResolveLocalFileSystemSyncURL_Callback_0(mthis) native "WorkerGlobalScope_webkitResolveLocalFileSystemSyncURL_Callback";
+  webkitResolveLocalFileSystemSyncURL_Callback_0_(mthis) => webkitResolveLocalFileSystemSyncURL_Callback_0(mthis);
+
+  static webkitResolveLocalFileSystemSyncURL_Callback_1(mthis, __arg_0) native "WorkerGlobalScope_webkitResolveLocalFileSystemSyncURL_Callback";
+  webkitResolveLocalFileSystemSyncURL_Callback_1_(mthis, __arg_0) => webkitResolveLocalFileSystemSyncURL_Callback_1(mthis, __arg_0);
+
+  static webkitResolveLocalFileSystemSyncURL_Callback_2(mthis, __arg_0, __arg_1) native "WorkerGlobalScope_webkitResolveLocalFileSystemSyncURL_Callback";
+  webkitResolveLocalFileSystemSyncURL_Callback_2_(mthis, __arg_0, __arg_1) => webkitResolveLocalFileSystemSyncURL_Callback_2(mthis, __arg_0, __arg_1);
+
+  static webkitResolveLocalFileSystemSyncURL_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WorkerGlobalScope_webkitResolveLocalFileSystemSyncURL_Callback";
+  webkitResolveLocalFileSystemSyncURL_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => webkitResolveLocalFileSystemSyncURL_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static webkitResolveLocalFileSystemURL_Callback_0(mthis) native "WorkerGlobalScope_webkitResolveLocalFileSystemURL_Callback";
+  webkitResolveLocalFileSystemURL_Callback_0_(mthis) => webkitResolveLocalFileSystemURL_Callback_0(mthis);
+
+  static webkitResolveLocalFileSystemURL_Callback_1(mthis, __arg_0) native "WorkerGlobalScope_webkitResolveLocalFileSystemURL_Callback";
+  webkitResolveLocalFileSystemURL_Callback_1_(mthis, __arg_0) => webkitResolveLocalFileSystemURL_Callback_1(mthis, __arg_0);
+
+  static webkitResolveLocalFileSystemURL_Callback_2(mthis, __arg_0, __arg_1) native "WorkerGlobalScope_webkitResolveLocalFileSystemURL_Callback";
+  webkitResolveLocalFileSystemURL_Callback_2_(mthis, __arg_0, __arg_1) => webkitResolveLocalFileSystemURL_Callback_2(mthis, __arg_0, __arg_1);
+
+  static webkitResolveLocalFileSystemURL_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "WorkerGlobalScope_webkitResolveLocalFileSystemURL_Callback";
+  webkitResolveLocalFileSystemURL_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => webkitResolveLocalFileSystemURL_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static webkitResolveLocalFileSystemURL_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "WorkerGlobalScope_webkitResolveLocalFileSystemURL_Callback";
+  webkitResolveLocalFileSystemURL_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => webkitResolveLocalFileSystemURL_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static webkitResolveLocalFileSystemURL_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "WorkerGlobalScope_webkitResolveLocalFileSystemURL_Callback";
+  webkitResolveLocalFileSystemURL_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => webkitResolveLocalFileSystemURL_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+}
+
+class BlinkWorkerLocation {
+  static final instance = new BlinkWorkerLocation();
+
+  static hash_Getter(mthis) native "WorkerLocation_hash_Getter";
+  hash_Getter_(mthis) => hash_Getter(mthis);
+
+  static host_Getter(mthis) native "WorkerLocation_host_Getter";
+  host_Getter_(mthis) => host_Getter(mthis);
+
+  static hostname_Getter(mthis) native "WorkerLocation_hostname_Getter";
+  hostname_Getter_(mthis) => hostname_Getter(mthis);
+
+  static href_Getter(mthis) native "WorkerLocation_href_Getter";
+  href_Getter_(mthis) => href_Getter(mthis);
+
+  static origin_Getter(mthis) native "WorkerLocation_origin_Getter";
+  origin_Getter_(mthis) => origin_Getter(mthis);
+
+  static pathname_Getter(mthis) native "WorkerLocation_pathname_Getter";
+  pathname_Getter_(mthis) => pathname_Getter(mthis);
+
+  static port_Getter(mthis) native "WorkerLocation_port_Getter";
+  port_Getter_(mthis) => port_Getter(mthis);
+
+  static protocol_Getter(mthis) native "WorkerLocation_protocol_Getter";
+  protocol_Getter_(mthis) => protocol_Getter(mthis);
+
+  static search_Getter(mthis) native "WorkerLocation_search_Getter";
+  search_Getter_(mthis) => search_Getter(mthis);
+
+  static toString_Callback_0(mthis) native "WorkerLocation_toString_Callback";
+  toString_Callback_0_(mthis) => toString_Callback_0(mthis);
+
+  static toString_Callback_1(mthis, __arg_0) native "WorkerLocation_toString_Callback";
+  toString_Callback_1_(mthis, __arg_0) => toString_Callback_1(mthis, __arg_0);
+
+  static toString_Callback_2(mthis, __arg_0, __arg_1) native "WorkerLocation_toString_Callback";
+  toString_Callback_2_(mthis, __arg_0, __arg_1) => toString_Callback_2(mthis, __arg_0, __arg_1);
+
+}
+
+class BlinkWorkerNavigator {
+  static final instance = new BlinkWorkerNavigator();
+
+  static appCodeName_Getter(mthis) native "WorkerNavigator_appCodeName_Getter";
+  appCodeName_Getter_(mthis) => appCodeName_Getter(mthis);
+
+  static appName_Getter(mthis) native "WorkerNavigator_appName_Getter";
+  appName_Getter_(mthis) => appName_Getter(mthis);
+
+  static appVersion_Getter(mthis) native "WorkerNavigator_appVersion_Getter";
+  appVersion_Getter_(mthis) => appVersion_Getter(mthis);
+
+  static connection_Getter(mthis) native "WorkerNavigator_connection_Getter";
+  connection_Getter_(mthis) => connection_Getter(mthis);
+
+  static dartEnabled_Getter(mthis) native "WorkerNavigator_dartEnabled_Getter";
+  dartEnabled_Getter_(mthis) => dartEnabled_Getter(mthis);
+
+  static hardwareConcurrency_Getter(mthis) native "WorkerNavigator_hardwareConcurrency_Getter";
+  hardwareConcurrency_Getter_(mthis) => hardwareConcurrency_Getter(mthis);
+
+  static onLine_Getter(mthis) native "WorkerNavigator_onLine_Getter";
+  onLine_Getter_(mthis) => onLine_Getter(mthis);
+
+  static platform_Getter(mthis) native "WorkerNavigator_platform_Getter";
+  platform_Getter_(mthis) => platform_Getter(mthis);
+
+  static product_Getter(mthis) native "WorkerNavigator_product_Getter";
+  product_Getter_(mthis) => product_Getter(mthis);
+
+  static userAgent_Getter(mthis) native "WorkerNavigator_userAgent_Getter";
+  userAgent_Getter_(mthis) => userAgent_Getter(mthis);
+
+  static webkitPersistentStorage_Getter(mthis) native "WorkerNavigator_webkitPersistentStorage_Getter";
+  webkitPersistentStorage_Getter_(mthis) => webkitPersistentStorage_Getter(mthis);
+
+  static webkitTemporaryStorage_Getter(mthis) native "WorkerNavigator_webkitTemporaryStorage_Getter";
+  webkitTemporaryStorage_Getter_(mthis) => webkitTemporaryStorage_Getter(mthis);
+
+}
 
 class BlinkWorkerPerformance {
-  static memory_Getter(mthis) native "WorkerPerformance_memory_Getter";
+  static final instance = new BlinkWorkerPerformance();
 
-  static now_Callback(mthis) native "WorkerPerformance_now_Callback";
+  static memory_Getter(mthis) native "WorkerPerformance_memory_Getter";
+  memory_Getter_(mthis) => memory_Getter(mthis);
+
+  static now_Callback_0(mthis) native "WorkerPerformance_now_Callback";
+  now_Callback_0_(mthis) => now_Callback_0(mthis);
+
+  static now_Callback_1(mthis, __arg_0) native "WorkerPerformance_now_Callback";
+  now_Callback_1_(mthis, __arg_0) => now_Callback_1(mthis, __arg_0);
+
+  static now_Callback_2(mthis, __arg_0, __arg_1) native "WorkerPerformance_now_Callback";
+  now_Callback_2_(mthis, __arg_0, __arg_1) => now_Callback_2(mthis, __arg_0, __arg_1);
+
 }
 
-class BlinkXMLDocument {}
+class BlinkXMLDocument extends BlinkDocument {
+  static final instance = new BlinkXMLDocument();
 
-class BlinkXMLHttpRequestEventTarget {}
+}
 
-class BlinkXMLHttpRequest {
-  static constructorCallback() native "XMLHttpRequest_constructorCallback";
+class BlinkXMLHttpRequest extends BlinkXMLHttpRequestEventTarget {
+  static final instance = new BlinkXMLHttpRequest();
+
+  static abort_Callback_0(mthis) native "XMLHttpRequest_abort_Callback";
+  abort_Callback_0_(mthis) => abort_Callback_0(mthis);
+
+  static abort_Callback_1(mthis, __arg_0) native "XMLHttpRequest_abort_Callback";
+  abort_Callback_1_(mthis, __arg_0) => abort_Callback_1(mthis, __arg_0);
+
+  static abort_Callback_2(mthis, __arg_0, __arg_1) native "XMLHttpRequest_abort_Callback";
+  abort_Callback_2_(mthis, __arg_0, __arg_1) => abort_Callback_2(mthis, __arg_0, __arg_1);
+
+  static constructorCallback_0() native "XMLHttpRequest_constructorCallback";
+  constructorCallback_0_() => constructorCallback_0();
+
+  static constructorCallback_1(__arg_0) native "XMLHttpRequest_constructorCallback";
+  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+
+  static constructorCallback_2(__arg_0, __arg_1) native "XMLHttpRequest_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+
+  static constructorCallback_3(__arg_0, __arg_1, __arg_2) native "XMLHttpRequest_constructorCallback";
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => constructorCallback_3(__arg_0, __arg_1, __arg_2);
+
+  static getAllResponseHeaders_Callback_0(mthis) native "XMLHttpRequest_getAllResponseHeaders_Callback";
+  getAllResponseHeaders_Callback_0_(mthis) => getAllResponseHeaders_Callback_0(mthis);
+
+  static getAllResponseHeaders_Callback_1(mthis, __arg_0) native "XMLHttpRequest_getAllResponseHeaders_Callback";
+  getAllResponseHeaders_Callback_1_(mthis, __arg_0) => getAllResponseHeaders_Callback_1(mthis, __arg_0);
+
+  static getAllResponseHeaders_Callback_2(mthis, __arg_0, __arg_1) native "XMLHttpRequest_getAllResponseHeaders_Callback";
+  getAllResponseHeaders_Callback_2_(mthis, __arg_0, __arg_1) => getAllResponseHeaders_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getResponseHeader_Callback_0(mthis) native "XMLHttpRequest_getResponseHeader_Callback";
+  getResponseHeader_Callback_0_(mthis) => getResponseHeader_Callback_0(mthis);
+
+  static getResponseHeader_Callback_1(mthis, __arg_0) native "XMLHttpRequest_getResponseHeader_Callback";
+  getResponseHeader_Callback_1_(mthis, __arg_0) => getResponseHeader_Callback_1(mthis, __arg_0);
+
+  static getResponseHeader_Callback_2(mthis, __arg_0, __arg_1) native "XMLHttpRequest_getResponseHeader_Callback";
+  getResponseHeader_Callback_2_(mthis, __arg_0, __arg_1) => getResponseHeader_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getResponseHeader_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "XMLHttpRequest_getResponseHeader_Callback";
+  getResponseHeader_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getResponseHeader_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static onreadystatechange_Getter(mthis) native "XMLHttpRequest_onreadystatechange_Getter";
+  onreadystatechange_Getter_(mthis) => onreadystatechange_Getter(mthis);
+
+  static onreadystatechange_Setter(mthis, __arg_0) native "XMLHttpRequest_onreadystatechange_Setter";
+  onreadystatechange_Setter_(mthis, __arg_0) => onreadystatechange_Setter(mthis, __arg_0);
+
+  static open_Callback_0(mthis) native "XMLHttpRequest_open_Callback";
+  open_Callback_0_(mthis) => open_Callback_0(mthis);
+
+  static open_Callback_1(mthis, __arg_0) native "XMLHttpRequest_open_Callback";
+  open_Callback_1_(mthis, __arg_0) => open_Callback_1(mthis, __arg_0);
+
+  static open_Callback_2(mthis, __arg_0, __arg_1) native "XMLHttpRequest_open_Callback";
+  open_Callback_2_(mthis, __arg_0, __arg_1) => open_Callback_2(mthis, __arg_0, __arg_1);
+
+  static open_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "XMLHttpRequest_open_Callback";
+  open_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => open_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static open_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "XMLHttpRequest_open_Callback";
+  open_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => open_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static open_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "XMLHttpRequest_open_Callback";
+  open_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => open_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static open_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "XMLHttpRequest_open_Callback";
+  open_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => open_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static open_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) native "XMLHttpRequest_open_Callback";
+  open_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => open_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6);
+
+  static overrideMimeType_Callback_0(mthis) native "XMLHttpRequest_overrideMimeType_Callback";
+  overrideMimeType_Callback_0_(mthis) => overrideMimeType_Callback_0(mthis);
+
+  static overrideMimeType_Callback_1(mthis, __arg_0) native "XMLHttpRequest_overrideMimeType_Callback";
+  overrideMimeType_Callback_1_(mthis, __arg_0) => overrideMimeType_Callback_1(mthis, __arg_0);
+
+  static overrideMimeType_Callback_2(mthis, __arg_0, __arg_1) native "XMLHttpRequest_overrideMimeType_Callback";
+  overrideMimeType_Callback_2_(mthis, __arg_0, __arg_1) => overrideMimeType_Callback_2(mthis, __arg_0, __arg_1);
+
+  static overrideMimeType_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "XMLHttpRequest_overrideMimeType_Callback";
+  overrideMimeType_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => overrideMimeType_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
   static readyState_Getter(mthis) native "XMLHttpRequest_readyState_Getter";
-
-  static response_Getter(mthis) native "XMLHttpRequest_response_Getter";
+  readyState_Getter_(mthis) => readyState_Getter(mthis);
 
   static responseText_Getter(mthis) native "XMLHttpRequest_responseText_Getter";
+  responseText_Getter_(mthis) => responseText_Getter(mthis);
 
   static responseType_Getter(mthis) native "XMLHttpRequest_responseType_Getter";
+  responseType_Getter_(mthis) => responseType_Getter(mthis);
 
-  static responseType_Setter(mthis, value) native "XMLHttpRequest_responseType_Setter";
+  static responseType_Setter(mthis, __arg_0) native "XMLHttpRequest_responseType_Setter";
+  responseType_Setter_(mthis, __arg_0) => responseType_Setter(mthis, __arg_0);
 
   static responseURL_Getter(mthis) native "XMLHttpRequest_responseURL_Getter";
+  responseURL_Getter_(mthis) => responseURL_Getter(mthis);
 
   static responseXML_Getter(mthis) native "XMLHttpRequest_responseXML_Getter";
+  responseXML_Getter_(mthis) => responseXML_Getter(mthis);
 
-  static status_Getter(mthis) native "XMLHttpRequest_status_Getter";
+  static response_Getter(mthis) native "XMLHttpRequest_response_Getter";
+  response_Getter_(mthis) => response_Getter(mthis);
+
+  static send_Callback_0(mthis) native "XMLHttpRequest_send_Callback";
+  send_Callback_0_(mthis) => send_Callback_0(mthis);
+
+  static send_Callback_1(mthis, __arg_0) native "XMLHttpRequest_send_Callback";
+  send_Callback_1_(mthis, __arg_0) => send_Callback_1(mthis, __arg_0);
+
+  static send_Callback_2(mthis, __arg_0, __arg_1) native "XMLHttpRequest_send_Callback";
+  send_Callback_2_(mthis, __arg_0, __arg_1) => send_Callback_2(mthis, __arg_0, __arg_1);
+
+  static send_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "XMLHttpRequest_send_Callback";
+  send_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => send_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static setRequestHeader_Callback_0(mthis) native "XMLHttpRequest_setRequestHeader_Callback";
+  setRequestHeader_Callback_0_(mthis) => setRequestHeader_Callback_0(mthis);
+
+  static setRequestHeader_Callback_1(mthis, __arg_0) native "XMLHttpRequest_setRequestHeader_Callback";
+  setRequestHeader_Callback_1_(mthis, __arg_0) => setRequestHeader_Callback_1(mthis, __arg_0);
+
+  static setRequestHeader_Callback_2(mthis, __arg_0, __arg_1) native "XMLHttpRequest_setRequestHeader_Callback";
+  setRequestHeader_Callback_2_(mthis, __arg_0, __arg_1) => setRequestHeader_Callback_2(mthis, __arg_0, __arg_1);
+
+  static setRequestHeader_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "XMLHttpRequest_setRequestHeader_Callback";
+  setRequestHeader_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => setRequestHeader_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static setRequestHeader_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "XMLHttpRequest_setRequestHeader_Callback";
+  setRequestHeader_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => setRequestHeader_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
 
   static statusText_Getter(mthis) native "XMLHttpRequest_statusText_Getter";
+  statusText_Getter_(mthis) => statusText_Getter(mthis);
+
+  static status_Getter(mthis) native "XMLHttpRequest_status_Getter";
+  status_Getter_(mthis) => status_Getter(mthis);
 
   static timeout_Getter(mthis) native "XMLHttpRequest_timeout_Getter";
+  timeout_Getter_(mthis) => timeout_Getter(mthis);
 
-  static timeout_Setter(mthis, value) native "XMLHttpRequest_timeout_Setter";
+  static timeout_Setter(mthis, __arg_0) native "XMLHttpRequest_timeout_Setter";
+  timeout_Setter_(mthis, __arg_0) => timeout_Setter(mthis, __arg_0);
 
   static upload_Getter(mthis) native "XMLHttpRequest_upload_Getter";
+  upload_Getter_(mthis) => upload_Getter(mthis);
 
   static withCredentials_Getter(mthis) native "XMLHttpRequest_withCredentials_Getter";
+  withCredentials_Getter_(mthis) => withCredentials_Getter(mthis);
 
-  static withCredentials_Setter(mthis, value) native "XMLHttpRequest_withCredentials_Setter";
+  static withCredentials_Setter(mthis, __arg_0) native "XMLHttpRequest_withCredentials_Setter";
+  withCredentials_Setter_(mthis, __arg_0) => withCredentials_Setter(mthis, __arg_0);
 
-  static abort_Callback(mthis) native "XMLHttpRequest_abort_Callback";
-
-  static getAllResponseHeaders_Callback(mthis) native "XMLHttpRequest_getAllResponseHeaders_Callback";
-
-  static getResponseHeader_Callback_1(mthis, header) native "XMLHttpRequest_getResponseHeader_Callback";
-
-  static open_Callback_5(mthis, method, url, async, user, password) native "XMLHttpRequest_open_Callback";
-
-  static overrideMimeType_Callback_1(mthis, override) native "XMLHttpRequest_overrideMimeType_Callback";
-
-  static send_Callback_1(mthis, data) native "XMLHttpRequest_send_Callback";
-
-  static setRequestHeader_Callback_2(mthis, header, value) native "XMLHttpRequest_setRequestHeader_Callback";
 }
 
-class BlinkXMLHttpRequestProgressEvent {}
+class BlinkXMLHttpRequestEventTarget extends BlinkEventTarget {
+  static final instance = new BlinkXMLHttpRequestEventTarget();
 
-class BlinkXMLHttpRequestUpload {}
+  static onabort_Getter(mthis) native "XMLHttpRequestEventTarget_onabort_Getter";
+  onabort_Getter_(mthis) => onabort_Getter(mthis);
+
+  static onabort_Setter(mthis, __arg_0) native "XMLHttpRequestEventTarget_onabort_Setter";
+  onabort_Setter_(mthis, __arg_0) => onabort_Setter(mthis, __arg_0);
+
+  static onerror_Getter(mthis) native "XMLHttpRequestEventTarget_onerror_Getter";
+  onerror_Getter_(mthis) => onerror_Getter(mthis);
+
+  static onerror_Setter(mthis, __arg_0) native "XMLHttpRequestEventTarget_onerror_Setter";
+  onerror_Setter_(mthis, __arg_0) => onerror_Setter(mthis, __arg_0);
+
+  static onload_Getter(mthis) native "XMLHttpRequestEventTarget_onload_Getter";
+  onload_Getter_(mthis) => onload_Getter(mthis);
+
+  static onload_Setter(mthis, __arg_0) native "XMLHttpRequestEventTarget_onload_Setter";
+  onload_Setter_(mthis, __arg_0) => onload_Setter(mthis, __arg_0);
+
+  static onloadend_Getter(mthis) native "XMLHttpRequestEventTarget_onloadend_Getter";
+  onloadend_Getter_(mthis) => onloadend_Getter(mthis);
+
+  static onloadend_Setter(mthis, __arg_0) native "XMLHttpRequestEventTarget_onloadend_Setter";
+  onloadend_Setter_(mthis, __arg_0) => onloadend_Setter(mthis, __arg_0);
+
+  static onloadstart_Getter(mthis) native "XMLHttpRequestEventTarget_onloadstart_Getter";
+  onloadstart_Getter_(mthis) => onloadstart_Getter(mthis);
+
+  static onloadstart_Setter(mthis, __arg_0) native "XMLHttpRequestEventTarget_onloadstart_Setter";
+  onloadstart_Setter_(mthis, __arg_0) => onloadstart_Setter(mthis, __arg_0);
+
+  static onprogress_Getter(mthis) native "XMLHttpRequestEventTarget_onprogress_Getter";
+  onprogress_Getter_(mthis) => onprogress_Getter(mthis);
+
+  static onprogress_Setter(mthis, __arg_0) native "XMLHttpRequestEventTarget_onprogress_Setter";
+  onprogress_Setter_(mthis, __arg_0) => onprogress_Setter(mthis, __arg_0);
+
+  static ontimeout_Getter(mthis) native "XMLHttpRequestEventTarget_ontimeout_Getter";
+  ontimeout_Getter_(mthis) => ontimeout_Getter(mthis);
+
+  static ontimeout_Setter(mthis, __arg_0) native "XMLHttpRequestEventTarget_ontimeout_Setter";
+  ontimeout_Setter_(mthis, __arg_0) => ontimeout_Setter(mthis, __arg_0);
+
+}
+
+class BlinkXMLHttpRequestProgressEvent extends BlinkProgressEvent {
+  static final instance = new BlinkXMLHttpRequestProgressEvent();
+
+  static position_Getter(mthis) native "XMLHttpRequestProgressEvent_position_Getter";
+  position_Getter_(mthis) => position_Getter(mthis);
+
+  static totalSize_Getter(mthis) native "XMLHttpRequestProgressEvent_totalSize_Getter";
+  totalSize_Getter_(mthis) => totalSize_Getter(mthis);
+
+}
+
+class BlinkXMLHttpRequestUpload extends BlinkXMLHttpRequestEventTarget {
+  static final instance = new BlinkXMLHttpRequestUpload();
+
+}
 
 class BlinkXMLSerializer {
-  static constructorCallback() native "XMLSerializer_constructorCallback";
+  static final instance = new BlinkXMLSerializer();
 
-  static serializeToString_Callback_1(mthis, node) native "XMLSerializer_serializeToString_Callback";
+  static constructorCallback_0() native "XMLSerializer_constructorCallback";
+  constructorCallback_0_() => constructorCallback_0();
+
+  static constructorCallback_1(__arg_0) native "XMLSerializer_constructorCallback";
+  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+
+  static constructorCallback_2(__arg_0, __arg_1) native "XMLSerializer_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+
+  static serializeToString_Callback_0(mthis) native "XMLSerializer_serializeToString_Callback";
+  serializeToString_Callback_0_(mthis) => serializeToString_Callback_0(mthis);
+
+  static serializeToString_Callback_1(mthis, __arg_0) native "XMLSerializer_serializeToString_Callback";
+  serializeToString_Callback_1_(mthis, __arg_0) => serializeToString_Callback_1(mthis, __arg_0);
+
+  static serializeToString_Callback_2(mthis, __arg_0, __arg_1) native "XMLSerializer_serializeToString_Callback";
+  serializeToString_Callback_2_(mthis, __arg_0, __arg_1) => serializeToString_Callback_2(mthis, __arg_0, __arg_1);
+
+  static serializeToString_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "XMLSerializer_serializeToString_Callback";
+  serializeToString_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => serializeToString_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
 }
 
 class BlinkXPathEvaluator {
-  static constructorCallback() native "XPathEvaluator_constructorCallback";
+  static final instance = new BlinkXPathEvaluator();
 
-  static createExpression_Callback_2(mthis, expression, resolver) native "XPathEvaluator_createExpression_Callback";
+  static constructorCallback_0() native "XPathEvaluator_constructorCallback";
+  constructorCallback_0_() => constructorCallback_0();
 
-  static createNSResolver_Callback_1(mthis, nodeResolver) native "XPathEvaluator_createNSResolver_Callback";
+  static constructorCallback_1(__arg_0) native "XPathEvaluator_constructorCallback";
+  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
 
-  static evaluate_Callback_5(mthis, expression, contextNode, resolver, type, inResult) native "XPathEvaluator_evaluate_Callback";
+  static constructorCallback_2(__arg_0, __arg_1) native "XPathEvaluator_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+
+  static createExpression_Callback_0(mthis) native "XPathEvaluator_createExpression_Callback";
+  createExpression_Callback_0_(mthis) => createExpression_Callback_0(mthis);
+
+  static createExpression_Callback_1(mthis, __arg_0) native "XPathEvaluator_createExpression_Callback";
+  createExpression_Callback_1_(mthis, __arg_0) => createExpression_Callback_1(mthis, __arg_0);
+
+  static createExpression_Callback_2(mthis, __arg_0, __arg_1) native "XPathEvaluator_createExpression_Callback";
+  createExpression_Callback_2_(mthis, __arg_0, __arg_1) => createExpression_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createExpression_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "XPathEvaluator_createExpression_Callback";
+  createExpression_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => createExpression_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static createExpression_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "XPathEvaluator_createExpression_Callback";
+  createExpression_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => createExpression_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static createNSResolver_Callback_0(mthis) native "XPathEvaluator_createNSResolver_Callback";
+  createNSResolver_Callback_0_(mthis) => createNSResolver_Callback_0(mthis);
+
+  static createNSResolver_Callback_1(mthis, __arg_0) native "XPathEvaluator_createNSResolver_Callback";
+  createNSResolver_Callback_1_(mthis, __arg_0) => createNSResolver_Callback_1(mthis, __arg_0);
+
+  static createNSResolver_Callback_2(mthis, __arg_0, __arg_1) native "XPathEvaluator_createNSResolver_Callback";
+  createNSResolver_Callback_2_(mthis, __arg_0, __arg_1) => createNSResolver_Callback_2(mthis, __arg_0, __arg_1);
+
+  static createNSResolver_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "XPathEvaluator_createNSResolver_Callback";
+  createNSResolver_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => createNSResolver_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static evaluate_Callback_0(mthis) native "XPathEvaluator_evaluate_Callback";
+  evaluate_Callback_0_(mthis) => evaluate_Callback_0(mthis);
+
+  static evaluate_Callback_1(mthis, __arg_0) native "XPathEvaluator_evaluate_Callback";
+  evaluate_Callback_1_(mthis, __arg_0) => evaluate_Callback_1(mthis, __arg_0);
+
+  static evaluate_Callback_2(mthis, __arg_0, __arg_1) native "XPathEvaluator_evaluate_Callback";
+  evaluate_Callback_2_(mthis, __arg_0, __arg_1) => evaluate_Callback_2(mthis, __arg_0, __arg_1);
+
+  static evaluate_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "XPathEvaluator_evaluate_Callback";
+  evaluate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => evaluate_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static evaluate_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "XPathEvaluator_evaluate_Callback";
+  evaluate_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => evaluate_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static evaluate_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "XPathEvaluator_evaluate_Callback";
+  evaluate_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => evaluate_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static evaluate_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "XPathEvaluator_evaluate_Callback";
+  evaluate_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => evaluate_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+
+  static evaluate_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) native "XPathEvaluator_evaluate_Callback";
+  evaluate_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => evaluate_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6);
+
 }
 
 class BlinkXPathExpression {
-  static evaluate_Callback_3(mthis, contextNode, type, inResult) native "XPathExpression_evaluate_Callback";
+  static final instance = new BlinkXPathExpression();
+
+  static evaluate_Callback_0(mthis) native "XPathExpression_evaluate_Callback";
+  evaluate_Callback_0_(mthis) => evaluate_Callback_0(mthis);
+
+  static evaluate_Callback_1(mthis, __arg_0) native "XPathExpression_evaluate_Callback";
+  evaluate_Callback_1_(mthis, __arg_0) => evaluate_Callback_1(mthis, __arg_0);
+
+  static evaluate_Callback_2(mthis, __arg_0, __arg_1) native "XPathExpression_evaluate_Callback";
+  evaluate_Callback_2_(mthis, __arg_0, __arg_1) => evaluate_Callback_2(mthis, __arg_0, __arg_1);
+
+  static evaluate_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "XPathExpression_evaluate_Callback";
+  evaluate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => evaluate_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static evaluate_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "XPathExpression_evaluate_Callback";
+  evaluate_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => evaluate_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static evaluate_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "XPathExpression_evaluate_Callback";
+  evaluate_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => evaluate_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
 }
 
 class BlinkXPathNSResolver {
-  static lookupNamespaceURI_Callback_1(mthis, prefix) native "XPathNSResolver_lookupNamespaceURI_Callback";
+  static final instance = new BlinkXPathNSResolver();
+
+  static lookupNamespaceURI_Callback_0(mthis) native "XPathNSResolver_lookupNamespaceURI_Callback";
+  lookupNamespaceURI_Callback_0_(mthis) => lookupNamespaceURI_Callback_0(mthis);
+
+  static lookupNamespaceURI_Callback_1(mthis, __arg_0) native "XPathNSResolver_lookupNamespaceURI_Callback";
+  lookupNamespaceURI_Callback_1_(mthis, __arg_0) => lookupNamespaceURI_Callback_1(mthis, __arg_0);
+
+  static lookupNamespaceURI_Callback_2(mthis, __arg_0, __arg_1) native "XPathNSResolver_lookupNamespaceURI_Callback";
+  lookupNamespaceURI_Callback_2_(mthis, __arg_0, __arg_1) => lookupNamespaceURI_Callback_2(mthis, __arg_0, __arg_1);
+
+  static lookupNamespaceURI_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "XPathNSResolver_lookupNamespaceURI_Callback";
+  lookupNamespaceURI_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => lookupNamespaceURI_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
 }
 
 class BlinkXPathResult {
+  static final instance = new BlinkXPathResult();
+
   static booleanValue_Getter(mthis) native "XPathResult_booleanValue_Getter";
+  booleanValue_Getter_(mthis) => booleanValue_Getter(mthis);
 
   static invalidIteratorState_Getter(mthis) native "XPathResult_invalidIteratorState_Getter";
+  invalidIteratorState_Getter_(mthis) => invalidIteratorState_Getter(mthis);
+
+  static iterateNext_Callback_0(mthis) native "XPathResult_iterateNext_Callback";
+  iterateNext_Callback_0_(mthis) => iterateNext_Callback_0(mthis);
+
+  static iterateNext_Callback_1(mthis, __arg_0) native "XPathResult_iterateNext_Callback";
+  iterateNext_Callback_1_(mthis, __arg_0) => iterateNext_Callback_1(mthis, __arg_0);
+
+  static iterateNext_Callback_2(mthis, __arg_0, __arg_1) native "XPathResult_iterateNext_Callback";
+  iterateNext_Callback_2_(mthis, __arg_0, __arg_1) => iterateNext_Callback_2(mthis, __arg_0, __arg_1);
 
   static numberValue_Getter(mthis) native "XPathResult_numberValue_Getter";
+  numberValue_Getter_(mthis) => numberValue_Getter(mthis);
 
   static resultType_Getter(mthis) native "XPathResult_resultType_Getter";
+  resultType_Getter_(mthis) => resultType_Getter(mthis);
 
   static singleNodeValue_Getter(mthis) native "XPathResult_singleNodeValue_Getter";
+  singleNodeValue_Getter_(mthis) => singleNodeValue_Getter(mthis);
+
+  static snapshotItem_Callback_0(mthis) native "XPathResult_snapshotItem_Callback";
+  snapshotItem_Callback_0_(mthis) => snapshotItem_Callback_0(mthis);
+
+  static snapshotItem_Callback_1(mthis, __arg_0) native "XPathResult_snapshotItem_Callback";
+  snapshotItem_Callback_1_(mthis, __arg_0) => snapshotItem_Callback_1(mthis, __arg_0);
+
+  static snapshotItem_Callback_2(mthis, __arg_0, __arg_1) native "XPathResult_snapshotItem_Callback";
+  snapshotItem_Callback_2_(mthis, __arg_0, __arg_1) => snapshotItem_Callback_2(mthis, __arg_0, __arg_1);
+
+  static snapshotItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "XPathResult_snapshotItem_Callback";
+  snapshotItem_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => snapshotItem_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
 
   static snapshotLength_Getter(mthis) native "XPathResult_snapshotLength_Getter";
+  snapshotLength_Getter_(mthis) => snapshotLength_Getter(mthis);
 
   static stringValue_Getter(mthis) native "XPathResult_stringValue_Getter";
+  stringValue_Getter_(mthis) => stringValue_Getter(mthis);
 
-  static iterateNext_Callback(mthis) native "XPathResult_iterateNext_Callback";
-
-  static snapshotItem_Callback_1(mthis, index) native "XPathResult_snapshotItem_Callback";
 }
 
 class BlinkXSLTProcessor {
-  static constructorCallback() native "XSLTProcessor_constructorCallback";
+  static final instance = new BlinkXSLTProcessor();
 
-  static clearParameters_Callback(mthis) native "XSLTProcessor_clearParameters_Callback";
+  static clearParameters_Callback_0(mthis) native "XSLTProcessor_clearParameters_Callback";
+  clearParameters_Callback_0_(mthis) => clearParameters_Callback_0(mthis);
 
-  static getParameter_Callback_2(mthis, namespaceURI, localName) native "XSLTProcessor_getParameter_Callback";
+  static clearParameters_Callback_1(mthis, __arg_0) native "XSLTProcessor_clearParameters_Callback";
+  clearParameters_Callback_1_(mthis, __arg_0) => clearParameters_Callback_1(mthis, __arg_0);
 
-  static importStylesheet_Callback_1(mthis, stylesheet) native "XSLTProcessor_importStylesheet_Callback";
+  static clearParameters_Callback_2(mthis, __arg_0, __arg_1) native "XSLTProcessor_clearParameters_Callback";
+  clearParameters_Callback_2_(mthis, __arg_0, __arg_1) => clearParameters_Callback_2(mthis, __arg_0, __arg_1);
 
-  static removeParameter_Callback_2(mthis, namespaceURI, localName) native "XSLTProcessor_removeParameter_Callback";
+  static constructorCallback_0() native "XSLTProcessor_constructorCallback";
+  constructorCallback_0_() => constructorCallback_0();
 
-  static reset_Callback(mthis) native "XSLTProcessor_reset_Callback";
+  static constructorCallback_1(__arg_0) native "XSLTProcessor_constructorCallback";
+  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
 
-  static setParameter_Callback_3(mthis, namespaceURI, localName, value) native "XSLTProcessor_setParameter_Callback";
+  static constructorCallback_2(__arg_0, __arg_1) native "XSLTProcessor_constructorCallback";
+  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
 
-  static transformToDocument_Callback_1(mthis, source) native "XSLTProcessor_transformToDocument_Callback";
+  static getParameter_Callback_0(mthis) native "XSLTProcessor_getParameter_Callback";
+  getParameter_Callback_0_(mthis) => getParameter_Callback_0(mthis);
 
-  static transformToFragment_Callback_2(mthis, source, docVal) native "XSLTProcessor_transformToFragment_Callback";
+  static getParameter_Callback_1(mthis, __arg_0) native "XSLTProcessor_getParameter_Callback";
+  getParameter_Callback_1_(mthis, __arg_0) => getParameter_Callback_1(mthis, __arg_0);
+
+  static getParameter_Callback_2(mthis, __arg_0, __arg_1) native "XSLTProcessor_getParameter_Callback";
+  getParameter_Callback_2_(mthis, __arg_0, __arg_1) => getParameter_Callback_2(mthis, __arg_0, __arg_1);
+
+  static getParameter_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "XSLTProcessor_getParameter_Callback";
+  getParameter_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getParameter_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static getParameter_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "XSLTProcessor_getParameter_Callback";
+  getParameter_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => getParameter_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static importStylesheet_Callback_0(mthis) native "XSLTProcessor_importStylesheet_Callback";
+  importStylesheet_Callback_0_(mthis) => importStylesheet_Callback_0(mthis);
+
+  static importStylesheet_Callback_1(mthis, __arg_0) native "XSLTProcessor_importStylesheet_Callback";
+  importStylesheet_Callback_1_(mthis, __arg_0) => importStylesheet_Callback_1(mthis, __arg_0);
+
+  static importStylesheet_Callback_2(mthis, __arg_0, __arg_1) native "XSLTProcessor_importStylesheet_Callback";
+  importStylesheet_Callback_2_(mthis, __arg_0, __arg_1) => importStylesheet_Callback_2(mthis, __arg_0, __arg_1);
+
+  static importStylesheet_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "XSLTProcessor_importStylesheet_Callback";
+  importStylesheet_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => importStylesheet_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static removeParameter_Callback_0(mthis) native "XSLTProcessor_removeParameter_Callback";
+  removeParameter_Callback_0_(mthis) => removeParameter_Callback_0(mthis);
+
+  static removeParameter_Callback_1(mthis, __arg_0) native "XSLTProcessor_removeParameter_Callback";
+  removeParameter_Callback_1_(mthis, __arg_0) => removeParameter_Callback_1(mthis, __arg_0);
+
+  static removeParameter_Callback_2(mthis, __arg_0, __arg_1) native "XSLTProcessor_removeParameter_Callback";
+  removeParameter_Callback_2_(mthis, __arg_0, __arg_1) => removeParameter_Callback_2(mthis, __arg_0, __arg_1);
+
+  static removeParameter_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "XSLTProcessor_removeParameter_Callback";
+  removeParameter_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => removeParameter_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static removeParameter_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "XSLTProcessor_removeParameter_Callback";
+  removeParameter_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => removeParameter_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static reset_Callback_0(mthis) native "XSLTProcessor_reset_Callback";
+  reset_Callback_0_(mthis) => reset_Callback_0(mthis);
+
+  static reset_Callback_1(mthis, __arg_0) native "XSLTProcessor_reset_Callback";
+  reset_Callback_1_(mthis, __arg_0) => reset_Callback_1(mthis, __arg_0);
+
+  static reset_Callback_2(mthis, __arg_0, __arg_1) native "XSLTProcessor_reset_Callback";
+  reset_Callback_2_(mthis, __arg_0, __arg_1) => reset_Callback_2(mthis, __arg_0, __arg_1);
+
+  static setParameter_Callback_1(mthis, __arg_0) native "XSLTProcessor_setParameter_Callback";
+  setParameter_Callback_1_(mthis, __arg_0) => setParameter_Callback_1(mthis, __arg_0);
+
+  static setParameter_Callback_2(mthis, __arg_0, __arg_1) native "XSLTProcessor_setParameter_Callback";
+  setParameter_Callback_2_(mthis, __arg_0, __arg_1) => setParameter_Callback_2(mthis, __arg_0, __arg_1);
+
+  static setParameter_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "XSLTProcessor_setParameter_Callback";
+  setParameter_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => setParameter_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static setParameter_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "XSLTProcessor_setParameter_Callback";
+  setParameter_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => setParameter_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
+  static setParameter_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "XSLTProcessor_setParameter_Callback";
+  setParameter_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => setParameter_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+
+  static transformToDocument_Callback_0(mthis) native "XSLTProcessor_transformToDocument_Callback";
+  transformToDocument_Callback_0_(mthis) => transformToDocument_Callback_0(mthis);
+
+  static transformToDocument_Callback_1(mthis, __arg_0) native "XSLTProcessor_transformToDocument_Callback";
+  transformToDocument_Callback_1_(mthis, __arg_0) => transformToDocument_Callback_1(mthis, __arg_0);
+
+  static transformToDocument_Callback_2(mthis, __arg_0, __arg_1) native "XSLTProcessor_transformToDocument_Callback";
+  transformToDocument_Callback_2_(mthis, __arg_0, __arg_1) => transformToDocument_Callback_2(mthis, __arg_0, __arg_1);
+
+  static transformToDocument_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "XSLTProcessor_transformToDocument_Callback";
+  transformToDocument_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => transformToDocument_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static transformToFragment_Callback_0(mthis) native "XSLTProcessor_transformToFragment_Callback";
+  transformToFragment_Callback_0_(mthis) => transformToFragment_Callback_0(mthis);
+
+  static transformToFragment_Callback_1(mthis, __arg_0) native "XSLTProcessor_transformToFragment_Callback";
+  transformToFragment_Callback_1_(mthis, __arg_0) => transformToFragment_Callback_1(mthis, __arg_0);
+
+  static transformToFragment_Callback_2(mthis, __arg_0, __arg_1) native "XSLTProcessor_transformToFragment_Callback";
+  transformToFragment_Callback_2_(mthis, __arg_0, __arg_1) => transformToFragment_Callback_2(mthis, __arg_0, __arg_1);
+
+  static transformToFragment_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "XSLTProcessor_transformToFragment_Callback";
+  transformToFragment_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => transformToFragment_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+
+  static transformToFragment_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "XSLTProcessor_transformToFragment_Callback";
+  transformToFragment_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => transformToFragment_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+
 }
 
 
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-
 // _Utils native entry points
 class Blink_Utils {
   static window() native "Utils_window";
@@ -9173,4 +30482,4 @@
   static remove(_DOMStringMap, key) native "DOMStringMap_remove_Callback";
 
   static get_keys(_DOMStringMap) native "DOMStringMap_getKeys_Callback";
-}
\ No newline at end of file
+}
diff --git a/sdk/lib/_internal/compiler/implementation/constant_system.dart b/sdk/lib/_internal/compiler/implementation/constant_system.dart
index 110efca..36b98d7 100644
--- a/sdk/lib/_internal/compiler/implementation/constant_system.dart
+++ b/sdk/lib/_internal/compiler/implementation/constant_system.dart
@@ -46,6 +46,8 @@
   BinaryOperation get subtract;
   BinaryOperation get truncatingDivide;
 
+  BinaryOperation get codeUnitAt;
+
   const ConstantSystem();
 
   ConstantValue createInt(int i);
diff --git a/sdk/lib/_internal/compiler/implementation/constant_system_dart.dart b/sdk/lib/_internal/compiler/implementation/constant_system_dart.dart
index 624d967..1cc239d 100644
--- a/sdk/lib/_internal/compiler/implementation/constant_system_dart.dart
+++ b/sdk/lib/_internal/compiler/implementation/constant_system_dart.dart
@@ -318,6 +318,37 @@
   apply(left, right) => identical(left, right);
 }
 
+abstract class CodeUnitAtOperation implements BinaryOperation {
+  final String name = 'charCodeAt';
+  const CodeUnitAtOperation();
+  apply(left, right) => left.codeUnitAt(right);
+}
+
+class CodeUnitAtConstantOperation extends CodeUnitAtOperation {
+  const CodeUnitAtConstantOperation();
+  ConstantValue fold(ConstantValue left, ConstantValue right) {
+    // 'a'.codeUnitAt(0) is not a constant expression.
+    return null;
+  }
+}
+
+class CodeUnitAtRuntimeOperation extends CodeUnitAtOperation {
+  const CodeUnitAtRuntimeOperation();
+  IntConstantValue fold(ConstantValue left, ConstantValue right) {
+    if (left.isString && right.isInt) {
+      StringConstantValue stringConstant = left;
+      IntConstantValue indexConstant = right;
+      DartString dartString = stringConstant.primitiveValue;
+      int index = indexConstant.primitiveValue;
+      if (index < 0 || index >= dartString.length) return null;
+      String string = dartString.slowToString();
+      int value = string.codeUnitAt(index);
+      return DART_CONSTANT_SYSTEM.createInt(value);
+    }
+    return null;
+  }
+}
+
 /**
  * A constant system implementing the Dart semantics. This system relies on
  * the underlying runtime-system. That is, if dart2js is run in an environment
@@ -347,6 +378,7 @@
   final shiftRight = const ShiftRightOperation();
   final subtract = const SubtractOperation();
   final truncatingDivide = const TruncatingDivideOperation();
+  final codeUnitAt = const CodeUnitAtConstantOperation();
 
   const DartConstantSystem();
 
diff --git a/sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_builder.dart b/sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_builder.dart
index 850ff3c..5a006dc 100644
--- a/sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_builder.dart
@@ -162,6 +162,16 @@
   SubbuildFunction subbuild(N node) {
     return (IrBuilder builder) => withBuilder(builder, () => build(node));
   }
+
+  /// Returns a closure that takes an [IrBuilder] and builds the sequence of
+  /// [nodes] in its context using [build].
+  // TODO(johnniwinther): Type [nodes] as `Iterable<N>` when `NodeList` uses
+  // `List` instead of `Link`.
+  SubbuildFunction subbuildSequence(/*Iterable<N>*/ nodes) {
+    return (IrBuilder builder) {
+      return withBuilder(builder, () => builder.buildSequence(nodes, build));
+    };
+  }
 }
 
 /// Shared state between nested builders.
@@ -260,16 +270,24 @@
 
   bool get isOpen => _root == null || _current != null;
 
+  /// True if [element] is a local variable, local function, or parameter that
+  /// is accessed from an inner function. Recursive self-references in a local
+  /// function count as closure accesses.
+  ///
+  /// If `true`, [element] is a [LocalElement].
+  bool isClosureVariable(Element element) {
+    return state.closureLocals.contains(element);
+  }
+
   /// Create a parameter for [parameterElement] and add it to the current
   /// environment.
   ///
   /// [isClosureVariable] marks whether [parameterElement] is accessed from an
   /// inner function.
-  void createParameter(LocalElement parameterElement,
-                       {bool isClosureVariable: false}) {
+  void createParameter(LocalElement parameterElement) {
     ir.Parameter parameter = new ir.Parameter(parameterElement);
     _parameters.add(parameter);
-    if (isClosureVariable) {
+    if (isClosureVariable(parameterElement)) {
       add(new ir.SetClosureVariable(parameterElement, parameter));
     } else {
       environment.extend(parameterElement, parameter);
@@ -289,15 +307,14 @@
   /// [isClosureVariable] marks whether [variableElement] is accessed from an
   /// inner function.
   void declareLocalVariable(LocalVariableElement variableElement,
-                            {ir.Primitive initialValue,
-                             bool isClosureVariable: false}) {
+                            {ir.Primitive initialValue}) {
     assert(isOpen);
     if (initialValue == null) {
       // TODO(kmillikin): Consider pooling constants.
       // The initial value is null.
       initialValue = buildNullLiteral();
     }
-    if (isClosureVariable) {
+    if (isClosureVariable(variableElement)) {
       add(new ir.SetClosureVariable(variableElement,
                                     initialValue,
                                     isDeclaration: true));
@@ -420,10 +437,28 @@
 
   }
 
-  /// Create a get access of [local].
-  ir.Primitive buildLocalGet(Element local) {
+  /// Create a read access of [local].
+  ir.Primitive buildLocalGet(LocalElement local) {
     assert(isOpen);
-    return environment.lookup(local);
+    if (isClosureVariable(local)) {
+      ir.Primitive result = new ir.GetClosureVariable(local);
+      add(new ir.LetPrim(result));
+      return result;
+    } else {
+      return environment.lookup(local);
+    }
+  }
+
+  /// Create a write access to [local].
+  ir.Primitive buildLocalSet(LocalElement local, ir.Primitive valueToStore) {
+    assert(isOpen);
+    if (isClosureVariable(local)) {
+      add(new ir.SetClosureVariable(local, valueToStore));
+    } else {
+      valueToStore.useElementAsHint(local);
+      environment.update(local, valueToStore);
+    }
+    return valueToStore;
   }
 
   /// Create a get access of the static [element].
@@ -491,7 +526,7 @@
 
   }
 
-  /// Create a dynamic invocation on [receiver] with method name and arguments
+  /// Create a dynamic invocation on [receiver] with method name and argument
   /// structure defined by [selector] and argument values defined by
   /// [arguments].
   ir.Primitive buildDynamicInvocation(ir.Definition receiver,
@@ -502,7 +537,7 @@
         (k) => new ir.InvokeMethod(receiver, selector, k, arguments));
   }
 
-  /// Create a static invocation of [element] with arguments structure defined
+  /// Create a static invocation of [element] with argument structure defined
   /// by [selector] and argument values defined by [arguments].
   ir.Primitive buildStaticInvocation(Element element,
                                      Selector selector,
@@ -511,6 +546,18 @@
         (k) => new ir.InvokeStatic(element, selector, k, arguments));
   }
 
+  /// Create a constructor invocation of [element] on [type] with argument
+  /// structure defined by [selector] and argument values defined by
+  /// [arguments].
+  ir.Primitive buildConstructorInvocation(FunctionElement element,
+                                         Selector selector,
+                                         DartType type,
+                                         List<ir.Definition> arguments) {
+    assert(isOpen);
+    return continueWithExpression(
+        (k) => new ir.InvokeConstructor(type, element, selector, k, arguments));
+  }
+
   /// Creates an if-then-else statement with the provided [condition] where the
   /// then and else branches are created through the [buildThenPart] and
   /// [buildElsePart] functions, respectively.
@@ -582,6 +629,154 @@
     }
   }
 
+  /// Invoke a join-point continuation that contains arguments for all local
+  /// variables.
+  ///
+  /// Given the continuation and a list of uninitialized invocations, fill
+  /// in each invocation with the continuation and appropriate arguments.
+  void invokeFullJoin(ir.Continuation join,
+                      JumpCollector jumps,
+                      {recursive: false}) {
+    join.isRecursive = recursive;
+    for (int i = 0; i < jumps.length; ++i) {
+      Environment currentEnvironment = jumps.environments[i];
+      ir.InvokeContinuation invoke = jumps.invocations[i];
+      invoke.continuation = new ir.Reference(join);
+      invoke.arguments = new List<ir.Reference>.generate(
+          join.parameters.length,
+          (i) => new ir.Reference(currentEnvironment[i]));
+      invoke.isRecursive = recursive;
+    }
+  }
+
+  /// Creates a for loop in which the initializer, condition, body, update are
+  /// created by [buildInitializer], [buildCondition], [buildBody] and
+  /// [buildUpdate], respectively.
+  ///
+  /// The jump [target] is used to identify which `break` and `continue`
+  /// statements that have this `for` statement as their target.
+  void buildFor({SubbuildFunction buildInitializer,
+                 SubbuildFunction buildCondition,
+                 SubbuildFunction buildBody,
+                 SubbuildFunction buildUpdate,
+                 JumpTarget target}) {
+    assert(isOpen);
+
+    // For loops use four named continuations: the entry to the condition,
+    // the entry to the body, the loop exit, and the loop successor (break).
+    // The CPS translation of
+    // [[for (initializer; condition; update) body; successor]] is:
+    //
+    // [[initializer]];
+    // let cont loop(x, ...) =
+    //     let prim cond = [[condition]] in
+    //     let cont break() = [[successor]] in
+    //     let cont exit() = break(v, ...) in
+    //     let cont body() =
+    //       let cont continue(x, ...) = [[update]]; loop(v, ...) in
+    //       [[body]]; continue(v, ...) in
+    //     branch cond (body, exit) in
+    // loop(v, ...)
+    //
+    // If there are no breaks in the body, the break continuation is inlined
+    // in the exit continuation (i.e., the translation of the successor
+    // statement occurs in the exit continuation).  If there is only one
+    // invocation of the continue continuation (i.e., no continues in the
+    // body), the continue continuation is inlined in the body.
+
+    buildInitializer(this);
+
+    IrBuilder condBuilder = new IrBuilder.recursive(this);
+    ir.Primitive condition = buildCondition(condBuilder);
+    if (condition == null) {
+      // If the condition is empty then the body is entered unconditionally.
+      condition = condBuilder.buildBooleanLiteral(true);
+    }
+
+    JumpCollector breakCollector = new JumpCollector(target);
+    JumpCollector continueCollector = new JumpCollector(target);
+    state.breakCollectors.add(breakCollector);
+    state.continueCollectors.add(continueCollector);
+
+    IrBuilder bodyBuilder = new IrBuilder.delimited(condBuilder);
+    buildBody(bodyBuilder);
+    assert(state.breakCollectors.last == breakCollector);
+    assert(state.continueCollectors.last == continueCollector);
+    state.breakCollectors.removeLast();
+    state.continueCollectors.removeLast();
+
+    // The binding of the continue continuation should occur as late as
+    // possible, that is, at the nearest common ancestor of all the continue
+    // sites in the body.  However, that is difficult to compute here, so it
+    // is instead placed just outside the body of the body continuation.
+    bool hasContinues = !continueCollector.isEmpty;
+    IrBuilder updateBuilder = hasContinues
+        ? new IrBuilder.recursive(condBuilder)
+        : bodyBuilder;
+    buildUpdate(updateBuilder);
+
+    // Create body entry and loop exit continuations and a branch to them.
+    ir.Continuation bodyContinuation = new ir.Continuation([]);
+    ir.Continuation exitContinuation = new ir.Continuation([]);
+    ir.LetCont branch =
+        new ir.LetCont(exitContinuation,
+            new ir.LetCont(bodyContinuation,
+                new ir.Branch(new ir.IsTrue(condition),
+                              bodyContinuation,
+                              exitContinuation)));
+    // If there are breaks in the body, then there must be a join-point
+    // continuation for the normal exit and the breaks.
+    bool hasBreaks = !breakCollector.isEmpty;
+    ir.LetCont letJoin;
+    if (hasBreaks) {
+      letJoin = new ir.LetCont(null, branch);
+      condBuilder.add(letJoin);
+      condBuilder._current = branch;
+    } else {
+      condBuilder.add(branch);
+    }
+    ir.Continuation continueContinuation;
+    if (hasContinues) {
+      // If there are continues in the body, we need a named continue
+      // continuation as a join point.
+      continueContinuation = new ir.Continuation(updateBuilder._parameters);
+      if (bodyBuilder.isOpen) continueCollector.addJump(bodyBuilder);
+      invokeFullJoin(continueContinuation, continueCollector);
+    }
+    ir.Continuation loopContinuation =
+        new ir.Continuation(condBuilder._parameters);
+    if (updateBuilder.isOpen) {
+      JumpCollector backEdges = new JumpCollector(null);
+      backEdges.addJump(updateBuilder);
+      invokeFullJoin(loopContinuation, backEdges, recursive: true);
+    }
+
+    // Fill in the body and possible continue continuation bodies.  Do this
+    // only after it is guaranteed that they are not empty.
+    if (hasContinues) {
+      continueContinuation.body = updateBuilder._root;
+      bodyContinuation.body =
+          new ir.LetCont(continueContinuation, bodyBuilder._root);
+    } else {
+      bodyContinuation.body = bodyBuilder._root;
+    }
+
+    loopContinuation.body = condBuilder._root;
+    add(new ir.LetCont(loopContinuation,
+            new ir.InvokeContinuation(loopContinuation,
+                environment.index2value)));
+    if (hasBreaks) {
+      _current = branch;
+      environment = condBuilder.environment;
+      breakCollector.addJump(this);
+      letJoin.continuation = createJoin(environment.length, breakCollector);
+      _current = letJoin;
+    } else {
+      _current = condBuilder._current;
+      environment = condBuilder.environment;
+    }
+  }
+
   /// Create a return statement `return value;` or `return;` if [value] is
   /// null.
   void buildReturn([ir.Primitive value]) {
@@ -597,6 +792,30 @@
     _current = null;
   }
 
+  /// Create a blocks of [statements] by applying [build] to all reachable
+  /// statements. The first statement is assumed to be reachable.
+  // TODO(johnniwinther): Type [statements] as `Iterable` when `NodeList` uses
+  // `List` instead of `Link`.
+  void buildBlock(var statements, build(statement)) {
+    // Build(Block(stamements), C) = C'
+    //   where C' = statements.fold(Build, C)
+    assert(isOpen);
+    return buildSequence(statements, build);
+  }
+
+  /// Creates a sequence of [nodes] by applying [build] to all reachable nodes.
+  ///
+  /// The first node in the sequence does not need to be reachable.
+  // TODO(johnniwinther): Type [nodes] as `Iterable` when `NodeList` uses
+  // `List` instead of `Link`.
+  void buildSequence(var nodes, build(node)) {
+    for (var node in nodes) {
+      if (!isOpen) return;
+      build(node);
+    }
+  }
+
+
   // Build(BreakStatement L, C) = C[InvokeContinuation(...)]
   //
   // The continuation and arguments are filled in later after translating
diff --git a/sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_builder_visitor.dart b/sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_builder_visitor.dart
index 9b20c5e..085a1c6 100644
--- a/sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_builder_visitor.dart
+++ b/sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_builder_visitor.dart
@@ -162,9 +162,7 @@
         () {
       FunctionSignature signature = element.functionSignature;
       signature.orderedForEachParameter((ParameterElement parameterElement) {
-        irBuilder.createParameter(
-            parameterElement,
-            isClosureVariable: isClosureVariable(parameterElement));
+        irBuilder.createParameter(parameterElement);
       });
 
       List<ConstantExpression> defaults = new List<ConstantExpression>();
@@ -180,15 +178,8 @@
   ir.Primitive visit(ast.Node node) => node.accept(this);
 
   // ==== Statements ====
-  // Build(Block(stamements), C) = C'
-  //   where C' = statements.fold(Build, C)
-  ir.Primitive visitBlock(ast.Block node) {
-    assert(irBuilder.isOpen);
-    for (ast.Node n in node.statements.nodes) {
-      visit(n);
-      if (!irBuilder.isOpen) return null;
-    }
-    return null;
+  visitBlock(ast.Block node) {
+    irBuilder.buildBlock(node.statements.nodes, build);
   }
 
   ir.Primitive visitBreakStatement(ast.BreakStatement node) {
@@ -219,163 +210,28 @@
     return null;
   }
 
-  /// Invoke a join-point continuation that contains arguments for all local
-  /// variables.
-  ///
-  /// Given the continuation and a list of uninitialized invocations, fill
-  /// in each invocation with the continuation and appropriate arguments.
-  void invokeFullJoin(ir.Continuation join,
-                      JumpCollector jumps,
-                      {recursive: false}) {
-    join.isRecursive = recursive;
-    for (int i = 0; i < jumps.length; ++i) {
-      Environment currentEnvironment = jumps.environments[i];
-      ir.InvokeContinuation invoke = jumps.invocations[i];
-      invoke.continuation = new ir.Reference(join);
-      invoke.arguments = new List<ir.Reference>.generate(
-          join.parameters.length,
-          (i) => new ir.Reference(currentEnvironment[i]));
-      invoke.isRecursive = recursive;
-    }
-  }
-
-  ir.Primitive visitFor(ast.For node) {
-    assert(irBuilder.isOpen);
+  visitFor(ast.For node) {
     // TODO(kmillikin,sigurdm): Handle closure variables declared in a for-loop.
     if (node.initializer is ast.VariableDefinitions) {
       ast.VariableDefinitions definitions = node.initializer;
       for (ast.Node definition in definitions.definitions.nodes) {
         Element element = elements[definition];
-        if (isClosureVariable(element)) {
+        if (irBuilder.isClosureVariable(element)) {
           return giveup(definition, 'Closure variable in for loop initializer');
         }
       }
     }
 
-    // For loops use four named continuations: the entry to the condition,
-    // the entry to the body, the loop exit, and the loop successor (break).
-    // The CPS translation of
-    // [[for (initializer; condition; update) body; successor]] is:
-    //
-    // [[initializer]];
-    // let cont loop(x, ...) =
-    //     let prim cond = [[condition]] in
-    //     let cont break() = [[successor]] in
-    //     let cont exit() = break(v, ...) in
-    //     let cont body() =
-    //       let cont continue(x, ...) = [[update]]; loop(v, ...) in
-    //       [[body]]; continue(v, ...) in
-    //     branch cond (body, exit) in
-    // loop(v, ...)
-    //
-    // If there are no breaks in the body, the break continuation is inlined
-    // in the exit continuation (i.e., the translation of the successor
-    // statement occurs in the exit continuation).  If there is only one
-    // invocation of the continue continuation (i.e., no continues in the
-    // body), the continue continuation is inlined in the body.
-
-    if (node.initializer != null) visit(node.initializer);
-
-    IrBuilder condBuilder = new IrBuilder.recursive(irBuilder);
-    ir.Primitive condition;
-    if (node.condition == null) {
-      // If the condition is empty then the body is entered unconditionally.
-      condition = condBuilder.buildBooleanLiteral(true);
-    } else {
-      condition = withBuilder(condBuilder, () => visit(node.condition));
-    }
-
     JumpTarget target = elements.getTargetDefinition(node);
-    JumpCollector breakCollector = new JumpCollector(target);
-    JumpCollector continueCollector = new JumpCollector(target);
-    irBuilder.state.breakCollectors.add(breakCollector);
-    irBuilder.state.continueCollectors.add(continueCollector);
-
-    IrBuilder bodyBuilder = new IrBuilder.delimited(condBuilder);
-    withBuilder(bodyBuilder, () => visit(node.body));
-    assert(irBuilder.state.breakCollectors.last == breakCollector);
-    assert(irBuilder.state.continueCollectors.last == continueCollector);
-    irBuilder.state.breakCollectors.removeLast();
-    irBuilder.state.continueCollectors.removeLast();
-
-    // The binding of the continue continuation should occur as late as
-    // possible, that is, at the nearest common ancestor of all the continue
-    // sites in the body.  However, that is difficult to compute here, so it
-    // is instead placed just outside the body of the body continuation.
-    bool hasContinues = !continueCollector.isEmpty;
-    IrBuilder updateBuilder = hasContinues
-        ? new IrBuilder.recursive(condBuilder)
-        : bodyBuilder;
-    for (ast.Node n in node.update) {
-      if (!updateBuilder.isOpen) break;
-      withBuilder(updateBuilder, () => visit(n));
-    }
-
-    // Create body entry and loop exit continuations and a branch to them.
-    ir.Continuation bodyContinuation = new ir.Continuation([]);
-    ir.Continuation exitContinuation = new ir.Continuation([]);
-    ir.LetCont branch =
-        new ir.LetCont(exitContinuation,
-            new ir.LetCont(bodyContinuation,
-                new ir.Branch(new ir.IsTrue(condition),
-                              bodyContinuation,
-                              exitContinuation)));
-    // If there are breaks in the body, then there must be a join-point
-    // continuation for the normal exit and the breaks.
-    bool hasBreaks = !breakCollector.isEmpty;
-    ir.LetCont letJoin;
-    if (hasBreaks) {
-      letJoin = new ir.LetCont(null, branch);
-      condBuilder.add(letJoin);
-      condBuilder._current = branch;
-    } else {
-      condBuilder.add(branch);
-    }
-    ir.Continuation continueContinuation;
-    if (hasContinues) {
-      // If there are continues in the body, we need a named continue
-      // continuation as a join point.
-      continueContinuation = new ir.Continuation(updateBuilder._parameters);
-      if (bodyBuilder.isOpen) continueCollector.addJump(bodyBuilder);
-      invokeFullJoin(continueContinuation, continueCollector);
-    }
-    ir.Continuation loopContinuation =
-        new ir.Continuation(condBuilder._parameters);
-    if (updateBuilder.isOpen) {
-      JumpCollector backEdges = new JumpCollector(null);
-      backEdges.addJump(updateBuilder);
-      invokeFullJoin(loopContinuation, backEdges, recursive: true);
-    }
-
-    // Fill in the body and possible continue continuation bodies.  Do this
-    // only after it is guaranteed that they are not empty.
-    if (hasContinues) {
-      continueContinuation.body = updateBuilder._root;
-      bodyContinuation.body =
-          new ir.LetCont(continueContinuation, bodyBuilder._root);
-    } else {
-      bodyContinuation.body = bodyBuilder._root;
-    }
-
-    loopContinuation.body = condBuilder._root;
-    irBuilder.add(new ir.LetCont(loopContinuation,
-            new ir.InvokeContinuation(loopContinuation,
-                irBuilder.environment.index2value)));
-    if (hasBreaks) {
-      irBuilder._current = branch;
-      irBuilder.environment = condBuilder.environment;
-      breakCollector.addJump(irBuilder);
-      letJoin.continuation =
-          irBuilder.createJoin(irBuilder.environment.length, breakCollector);
-      irBuilder._current = letJoin;
-    } else {
-      irBuilder._current = condBuilder._current;
-      irBuilder.environment = condBuilder.environment;
-    }
-    return null;
+    irBuilder.buildFor(
+        buildInitializer: subbuild(node.initializer),
+        buildCondition: subbuild(node.condition),
+        buildBody: subbuild(node.body),
+        buildUpdate: subbuildSequence(node.update),
+        target: target);
   }
 
-   visitIf(ast.If node) {
+  visitIf(ast.If node) {
     irBuilder.buildIf(
         build(node.condition),
         subbuild(node.thenPart),
@@ -448,7 +304,8 @@
     ir.Continuation loopContinuation =
         new ir.Continuation(condBuilder._parameters);
     if (bodyBuilder.isOpen) continueCollector.addJump(bodyBuilder);
-    invokeFullJoin(loopContinuation, continueCollector, recursive: true);
+    irBuilder.invokeFullJoin(
+        loopContinuation, continueCollector, recursive: true);
     bodyContinuation.body = bodyBuilder._root;
 
     loopContinuation.body = condBuilder._root;
@@ -528,7 +385,7 @@
         new ir.InvokeMethod(iterator, new Selector.getter("current", null),
             currentInvoked, emptyArguments)));
     if (Elements.isLocal(variableElement)) {
-      withBuilder(bodyBuilder, () => setLocal(variableElement, currentValue));
+      bodyBuilder.buildLocalSet(variableElement, currentValue);
     } else if (Elements.isStaticOrTopLevel(variableElement)) {
       withBuilder(bodyBuilder,
           () => setStatic(variableElement, selector, currentValue));
@@ -568,7 +425,8 @@
     ir.Continuation loopContinuation =
         new ir.Continuation(condBuilder._parameters);
     if (bodyBuilder.isOpen) continueCollector.addJump(bodyBuilder);
-    invokeFullJoin(loopContinuation, continueCollector, recursive: true);
+    irBuilder.invokeFullJoin(
+        loopContinuation, continueCollector, recursive: true);
     bodyContinuation.body = bodyBuilder._root;
 
     loopContinuation.body = condBuilder._root;
@@ -612,9 +470,7 @@
         } else {
           assert(definition is ast.Identifier);
         }
-        irBuilder.declareLocalVariable(element,
-            initialValue: initialValue,
-            isClosureVariable: isClosureVariable(element));
+        irBuilder.declareLocalVariable(element, initialValue: initialValue);
       }
     }
     return null;
@@ -785,7 +641,7 @@
     ir.Primitive closureTarget;
     if (element == null) {
       closureTarget = visit(node.selector);
-    } else if (isClosureVariable(element)) {
+    } else if (irBuilder.isClosureVariable(element)) {
       LocalElement local = element;
       closureTarget = new ir.GetClosureVariable(local);
       irBuilder.add(new ir.LetPrim(closureTarget));
@@ -839,10 +695,6 @@
     if (element != null && element.isConst) {
       // Reference to constant local, top-level or static field
       result = translateConstant(node);
-    } else if (isClosureVariable(element)) {
-      LocalElement local = element;
-      result = new ir.GetClosureVariable(local);
-      irBuilder.add(new ir.LetPrim(result));
     } else if (Elements.isLocal(element)) {
       // Reference to local variable
       result = irBuilder.buildLocalGet(element);
@@ -995,25 +847,6 @@
     }
   }
 
-  /// True if [element] is a local variable, local function, or parameter that
-  /// is accessed from an inner function. Recursive self-references in a local
-  /// function count as closure accesses.
-  ///
-  /// If `true`, [element] is a [LocalElement].
-  bool isClosureVariable(Element element) {
-    return irBuilder.state.closureLocals.contains(element);
-  }
-
-  void setLocal(Element element, ir.Primitive valueToStore) {
-    if (isClosureVariable(element)) {
-      LocalElement local = element;
-      irBuilder.add(new ir.SetClosureVariable(local, valueToStore));
-    } else {
-      valueToStore.useElementAsHint(element);
-      irBuilder.environment.update(element, valueToStore);
-    }
-  }
-
   void setStatic(Element element,
                  Selector selector,
                  ir.Primitive valueToStore) {
@@ -1104,7 +937,7 @@
     }
 
     if (Elements.isLocal(element)) {
-      setLocal(element, valueToStore);
+      irBuilder.buildLocalSet(element, valueToStore);
     } else if ((!node.isSuperCall && Elements.isErroneousElement(element)) ||
                 Elements.isStaticOrTopLevel(element)) {
       setStatic(element, elements.getSelector(node), valueToStore);
@@ -1129,18 +962,18 @@
   }
 
   ir.Primitive visitNewExpression(ast.NewExpression node) {
-    assert(irBuilder.isOpen);
     if (node.isConst) {
       return translateConstant(node);
     }
     FunctionElement element = elements[node.send];
     Selector selector = elements.getSelector(node.send);
-    ast.Node selectorNode = node.send.selector;
     DartType type = elements.getType(node);
-    List<ir.Primitive> args =
+    ast.Node selectorNode = node.send.selector;
+    List<ir.Definition> arguments =
         node.send.arguments.mapToList(visit, growable:false);
-    return irBuilder.continueWithExpression(
-        (k) => new ir.InvokeConstructor(type, element,selector, k, args));
+    return irBuilder.buildConstructorInvocation(
+        element, selector, type, arguments);
+
   }
 
   ir.Primitive visitStringJuxtaposition(ast.StringJuxtaposition node) {
@@ -1190,7 +1023,7 @@
   ir.Primitive visitFunctionDeclaration(ast.FunctionDeclaration node) {
     LocalFunctionElement element = elements[node.function];
     ir.FunctionDefinition inner = makeSubFunction(node.function);
-    if (isClosureVariable(element)) {
+    if (irBuilder.isClosureVariable(element)) {
       irBuilder.add(new ir.DeclareFunction(element, inner));
     } else {
       ir.CreateFunction prim = new ir.CreateFunction(inner);
diff --git a/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_inferrer.dart b/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_inferrer.dart
index 4e2afbd..53107a1 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_inferrer.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_inferrer.dart
@@ -341,7 +341,9 @@
                                ast.Node node,
                                Element enclosing,
                                [TypeInformation elementType, int length]) {
-    bool isTypedArray = (compiler.typedDataClass != null) &&
+    bool isTypedArray =
+        compiler.typedDataClass != null &&
+        classWorld.isInstantiated(compiler.typedDataClass) &&
         type.type.satisfies(compiler.typedDataClass, classWorld);
     bool isConst = (type.type == compiler.typesTask.constListType);
     bool isFixed = (type.type == compiler.typesTask.fixedListType) ||
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart b/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
index 0375ea8..dfd5a92 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
@@ -2074,9 +2074,11 @@
     // Just checking for [:TypedData:] is not sufficient, as it is an
     // abstract class any user-defined class can implement. So we also
     // check for the interface [JavaScriptIndexingBehavior].
-    return compiler.typedDataClass != null
-        && mask.satisfies(compiler.typedDataClass, compiler.world)
-        && mask.satisfies(jsIndexingBehaviorInterface, compiler.world);
+    return
+        compiler.typedDataClass != null &&
+        compiler.world.isInstantiated(compiler.typedDataClass) &&
+        mask.satisfies(compiler.typedDataClass, compiler.world) &&
+        mask.satisfies(jsIndexingBehaviorInterface, compiler.world);
   }
 
   bool couldBeTypedArray(TypeMask mask) {
@@ -2084,11 +2086,13 @@
         !type1.intersection(type2, compiler.world).isEmpty;
     // TODO(herhut): Maybe cache the TypeMask for typedDataClass and
     //               jsIndexingBehaviourInterface.
-    return compiler.typedDataClass != null &&
-           intersects(mask, new TypeMask.subtype(compiler.typedDataClass,
-                                                 compiler.world)) &&
-           intersects(mask, new TypeMask.subtype(jsIndexingBehaviorInterface,
-                                                 compiler.world));
+    return
+        compiler.typedDataClass != null &&
+        compiler.world.isInstantiated(compiler.typedDataClass) &&
+        intersects(mask,
+            new TypeMask.subtype(compiler.typedDataClass, compiler.world)) &&
+        intersects(mask,
+            new TypeMask.subtype(jsIndexingBehaviorInterface, compiler.world));
   }
 
   /// Returns all static fields that are referenced through [targetsUsed].
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/constant_system_javascript.dart b/sdk/lib/_internal/compiler/implementation/js_backend/constant_system_javascript.dart
index 10a279d..3d6e72f 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/constant_system_javascript.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/constant_system_javascript.dart
@@ -174,6 +174,7 @@
       const JavaScriptBinaryArithmeticOperation(const SubtractOperation());
   final truncatingDivide = const JavaScriptBinaryArithmeticOperation(
       const TruncatingDivideOperation());
+  final codeUnitAt = const CodeUnitAtRuntimeOperation();
 
   const JavaScriptConstantSystem();
 
@@ -341,4 +342,4 @@
     result.addAll(values);
     return result;
   }
-}
\ No newline at end of file
+}
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/invoke_dynamic_specializers.dart b/sdk/lib/_internal/compiler/implementation/ssa/invoke_dynamic_specializers.dart
index d9fc286..5511118 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/invoke_dynamic_specializers.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/invoke_dynamic_specializers.dart
@@ -69,6 +69,12 @@
       } else if (selector.name == '>=') {
         return const GreaterEqualSpecializer();
       }
+    } else if (selector.kind == SelectorKind.CALL) {
+      if (selector.argumentCount == 1 && selector.namedArguments.length == 0) {
+        if (selector.name == 'codeUnitAt') {
+          return const CodeUnitAtSpecializer();
+        }
+      }
     }
     return const InvokeDynamicSpecializer();
   }
@@ -726,3 +732,18 @@
         instruction.selector, backend.boolType);
   }
 }
+
+class CodeUnitAtSpecializer extends InvokeDynamicSpecializer {
+  const CodeUnitAtSpecializer();
+
+  BinaryOperation operation(ConstantSystem constantSystem) {
+    return constantSystem.codeUnitAt;
+  }
+
+  HInstruction tryConvertToBuiltin(HInvokeDynamic instruction,
+                                   Compiler compiler) {
+    // TODO(sra): Implement a builtin HCodeUnitAt instruction and the same index
+    // bounds checking optimizations as for HIndex.
+    return null;
+  }
+}
diff --git a/sdk/lib/_internal/compiler/implementation/tree/nodes.dart b/sdk/lib/_internal/compiler/implementation/tree/nodes.dart
index 505d283..5bb147e 100644
--- a/sdk/lib/_internal/compiler/implementation/tree/nodes.dart
+++ b/sdk/lib/_internal/compiler/implementation/tree/nodes.dart
@@ -667,8 +667,10 @@
   For asFor() => this;
 
   Expression get condition {
-    if (conditionStatement is ExpressionStatement) {
-      return conditionStatement.asExpressionStatement().expression;
+    ExpressionStatement expressionStatement =
+        conditionStatement.asExpressionStatement();
+    if (expressionStatement != null) {
+      return expressionStatement.expression;
     } else {
       return null;
     }
diff --git a/sdk/lib/_internal/compiler/implementation/world.dart b/sdk/lib/_internal/compiler/implementation/world.dart
index b10e308..4391cdb 100644
--- a/sdk/lib/_internal/compiler/implementation/world.dart
+++ b/sdk/lib/_internal/compiler/implementation/world.dart
@@ -112,18 +112,17 @@
       invariant(cls, cls.isDeclaration,
                 message: '$cls must be the declaration.') &&
       invariant(cls, cls.isResolved,
-                message: '$cls must be resolved.');
-    // TODO(johnniwinther): Enable check for instantiation:
-    // (!mustBeInstantiated ||
-    //   invariant(cls, isInstantiated(cls),
-    //             message: '$cls is not instantiated.'));
+                message: '$cls must be resolved.') &&
+      (!mustBeInstantiated ||
+       invariant(cls, isInstantiated(cls),
+                 message: '$cls is not instantiated.'));
  }
 
   /// Returns `true` if [x] is a subtype of [y], that is, if [x] implements an
   /// instance of [y].
   bool isSubtypeOf(ClassElement x, ClassElement y) {
-    assert(checkInvariants(x, mustBeInstantiated: true));
-    assert(checkInvariants(y));
+    assert(checkInvariants(x));
+    assert(checkInvariants(y, mustBeInstantiated: false));
 
     if (y == objectClass) return true;
     if (x == objectClass) return false;
diff --git a/sdk/lib/_internal/compiler/js_lib/convert_patch.dart b/sdk/lib/_internal/compiler/js_lib/convert_patch.dart
index dd7244d..2686ca6 100644
--- a/sdk/lib/_internal/compiler/js_lib/convert_patch.dart
+++ b/sdk/lib/_internal/compiler/js_lib/convert_patch.dart
@@ -337,3 +337,35 @@
   static _newJavaScriptObject()
       => JS('=Object', 'Object.create(null)');
 }
+
+@patch class JsonDecoder {
+  @patch
+  StringConversionSink startChunkedConversion(Sink<Object> sink) {
+    return new _JsonDecoderSink(_reviver, sink);
+  }
+}
+
+/**
+ * Implements the chunked conversion from a JSON string to its corresponding
+ * object.
+ *
+ * The sink only creates one object, but its input can be chunked.
+ */
+// TODO(floitsch): don't accumulate everything before starting to decode.
+class _JsonDecoderSink extends _StringSinkConversionSink {
+  final _Reviver _reviver;
+  final Sink<Object> _sink;
+
+  _JsonDecoderSink(this._reviver, this._sink)
+      : super(new StringBuffer());
+
+  void close() {
+    super.close();
+    StringBuffer buffer = _stringSink;
+    String accumulated = buffer.toString();
+    buffer.clear();
+    Object decoded = _parseJson(accumulated, _reviver);
+    _sink.add(decoded);
+    _sink.close();
+  }
+}
diff --git a/sdk/lib/_internal/compiler/js_lib/interceptors.dart b/sdk/lib/_internal/compiler/js_lib/interceptors.dart
index ea4d901..e70b106 100644
--- a/sdk/lib/_internal/compiler/js_lib/interceptors.dart
+++ b/sdk/lib/_internal/compiler/js_lib/interceptors.dart
@@ -23,6 +23,7 @@
                               initNativeDispatch,
                               initNativeDispatchFlag,
                               regExpGetNative,
+                              regExpCaptureCount,
                               stringContainsUnchecked,
                               stringLastIndexOfUnchecked,
                               stringReplaceAllFuncUnchecked,
diff --git a/sdk/lib/_internal/compiler/js_lib/js_string.dart b/sdk/lib/_internal/compiler/js_lib/js_string.dart
index ec1ece1..c7fd9ab 100644
--- a/sdk/lib/_internal/compiler/js_lib/js_string.dart
+++ b/sdk/lib/_internal/compiler/js_lib/js_string.dart
@@ -83,14 +83,42 @@
     checkNull(pattern);
     if (pattern is String) {
       return JS('JSExtendableArray', r'#.split(#)', this, pattern);
-    } else if (pattern is JSSyntaxRegExp) {
+    } else if (pattern is JSSyntaxRegExp && regExpCaptureCount(pattern) == 0) {
       var re = regExpGetNative(pattern);
       return JS('JSExtendableArray', r'#.split(#)', this, re);
     } else {
-      throw "String.split(Pattern) UNIMPLEMENTED";
+      return _defaultSplit(pattern);
     }
   }
 
+  List<String> _defaultSplit(Pattern pattern) {
+    List<String> result = <String>[];
+    // End of most recent match. That is, start of next part to add to result.
+    int start = 0;
+    // Length of most recent match.
+    // Set >0, so no match on the empty string causes the result to be [""].
+    int length = 1;
+    for (var match in pattern.allMatches(this)) {
+      int matchStart = match.start;
+      int matchEnd = match.end;
+      length = matchEnd - matchStart;
+      if (length == 0 && start == matchStart) {
+        // An empty match right after another match is ignored.
+        // This includes an empty match at the start of the string.
+        continue;
+      }
+      int end = matchStart;
+      result.add(this.substring(start, end));
+      start = matchEnd;
+    }
+    if (start < this.length || length > 0) {
+      // An empty match at the end of the string does not cause a "" at the end.
+      // A non-empty match ending at the end of the string does add a "".
+      result.add(this.substring(start));
+    }
+    return result;
+  }
+
   bool startsWith(Pattern pattern, [int index = 0]) {
     checkInt(index);
     if (index < 0 || index > this.length) {
diff --git a/sdk/lib/_internal/compiler/js_lib/regexp_helper.dart b/sdk/lib/_internal/compiler/js_lib/regexp_helper.dart
index 7f930eb..4bdf754 100644
--- a/sdk/lib/_internal/compiler/js_lib/regexp_helper.dart
+++ b/sdk/lib/_internal/compiler/js_lib/regexp_helper.dart
@@ -22,12 +22,31 @@
   return nativeRegexp;
 }
 
+/**
+ * Computes the number of captures in a regexp.
+ *
+ * This currently involves creating a new RegExp object with a different
+ * source and running it against the empty string (the last part is usually
+ * fast).
+ *
+ * The JSSyntaxRegExp could cache the result, and set the cache any time
+ * it finds a match.
+ */
+int regExpCaptureCount(JSSyntaxRegExp regexp) {
+  var nativeAnchoredRegExp = regexp._nativeAnchoredVersion;
+  var match = JS('JSExtendableArray', "#.exec('')", nativeAnchoredRegExp);
+  // The native-anchored regexp always have one capture more than the original,
+  // and always matches the empty string.
+  return match.length - 2;
+}
+
 class JSSyntaxRegExp implements RegExp {
   final String pattern;
   final _nativeRegExp;
   var _nativeGlobalRegExp;
   var _nativeAnchoredRegExp;
 
+  String toString() => "RegExp/$pattern/";
 
   JSSyntaxRegExp(String source,
                  { bool multiLine: false,
diff --git a/sdk/lib/convert/json.dart b/sdk/lib/convert/json.dart
index 910b8cc..4b7817f 100644
--- a/sdk/lib/convert/json.dart
+++ b/sdk/lib/convert/json.dart
@@ -326,39 +326,12 @@
    *
    * The output [sink] receives exactly one decoded element through `add`.
    */
-  StringConversionSink startChunkedConversion(Sink<Object> sink) {
-    return new _JsonDecoderSink(_reviver, sink);
-  }
+  external StringConversionSink startChunkedConversion(Sink<Object> sink);
 
   // Override the base-classes bind, to provide a better type.
   Stream<Object> bind(Stream<String> stream) => super.bind(stream);
 }
 
-/**
- * Implements the chunked conversion from a JSON string to its corresponding
- * object.
- *
- * The sink only creates one object, but its input can be chunked.
- */
-// TODO(floitsch): don't accumulate everything before starting to decode.
-class _JsonDecoderSink extends _StringSinkConversionSink {
-  final _Reviver _reviver;
-  final Sink<Object> _sink;
-
-  _JsonDecoderSink(this._reviver, this._sink)
-      : super(new StringBuffer());
-
-  void close() {
-    super.close();
-    StringBuffer buffer = _stringSink;
-    String accumulated = buffer.toString();
-    buffer.clear();
-    Object decoded = _parseJson(accumulated, _reviver);
-    _sink.add(decoded);
-    _sink.close();
-  }
-}
-
 // Internal optimized JSON parsing implementation.
 external _parseJson(String source, reviver(key, value));
 
diff --git a/sdk/lib/core/string.dart b/sdk/lib/core/string.dart
index 90e6b50..8c8f8f0 100644
--- a/sdk/lib/core/string.dart
+++ b/sdk/lib/core/string.dart
@@ -463,11 +463,30 @@
   String replaceAllMapped(Pattern from, String replace(Match match));
 
   /**
-   * Splits the string at matches of [pattern]. Returns
-   * a list of substrings.
+   * Splits the string at matches of [pattern] and returns a list of substrings.
    *
-   * Splitting with an empty string pattern (`''`) splits at UTF-16 code unit
-   * boundaries and not at rune boundaries:
+   * Finds all the matches of `pattern` in this string,
+   * and returns the list of the substrings between the matches.
+   *
+   *     var string = "Hello world!";
+   *     string.split(" ");                      // ['Hello', 'world!'];
+   *
+   * Empty matches at the beginning and end of the strings are ignored,
+   * and so are empty matches right after another match.
+   *
+   *     var string = "abba";
+   *     string.split(new RegExp(r"b*"));        // ['a', 'a']
+   *                                             // not ['', 'a', 'a', '']
+   *
+   * If this string is empty, the result is an empty list if `pattern` matches
+   * the empty string, and it is `[""]` if the pattern doesn't match.
+   *
+   *     var string = '';
+   *     string.split('');                       // []
+   *     string.split("a");                      // ['']
+   *
+   * Splitting with an empty pattern splits the string into single-code unit
+   * strings.
    *
    *     var string = 'Pub';
    *     string.split('');                       // ['P', 'u', 'b']
@@ -476,15 +495,18 @@
    *       return new String.fromCharCode(unit);
    *     }).toList();                            // ['P', 'u', 'b']
    *
+   * Splitting happens at UTF-16 code unit boundaries,
+   * and not at rune boundaries:
+   *
    *     // String made up of two code units, but one rune.
    *     string = '\u{1D11E}';
-   *     string.split('').length;                 // 2
+   *     string.split('').length;                 // 2 surrogate values
    *
-   * You should [map] the runes unless you are certain that the string is in
-   * the basic multilingual plane (meaning that each code unit represents a
-   * rune):
+   * To get a list of strings containing the individual runes of a string,
+   * you should not use split. You can instead map each rune to a string
+   * as follows:
    *
-   *     string.runes.map((rune) => new String.fromCharCode(rune));
+   *     string.runes.map((rune) => new String.fromCharCode(rune)).toList();
    */
   List<String> split(Pattern pattern);
 
diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart
index 1c465c6..88a4020 100644
--- a/sdk/lib/html/dart2js/html_dart2js.dart
+++ b/sdk/lib/html/dart2js/html_dart2js.dart
@@ -127,7 +127,6 @@
 
 @DocsEditable()
 @DomName('AbstractWorker')
-@Native("AbstractWorker")
 abstract class AbstractWorker extends Interceptor implements EventTarget {
   // To suppress missing implicit constructor warnings.
   factory AbstractWorker._() { throw new UnsupportedError("Not supported"); }
@@ -21251,7 +21250,7 @@
 
 @DomName('Navigator')
 @Native("Navigator")
-class Navigator extends NavigatorCpu implements NavigatorLanguage, NavigatorOnLine, NavigatorID {
+class Navigator extends Interceptor implements NavigatorCpu, NavigatorLanguage, NavigatorOnLine, NavigatorID {
 
   @DomName('Navigator.language')
   String get language => JS('String', '#.language || #.userLanguage', this,
@@ -21454,6 +21453,13 @@
   @Experimental() // untriaged
   void unregisterProtocolHandler(String scheme, String url) native;
 
+  // From NavigatorCPU
+
+  @DomName('Navigator.hardwareConcurrency')
+  @DocsEditable()
+  @Experimental() // untriaged
+  final int hardwareConcurrency;
+
   // From NavigatorID
 
   @DomName('Navigator.appCodeName')
@@ -21510,14 +21516,10 @@
 @DocsEditable()
 @DomName('NavigatorCPU')
 @Experimental() // untriaged
-@Native("NavigatorCPU")
-class NavigatorCpu extends Interceptor {
+abstract class NavigatorCpu extends Interceptor {
   // To suppress missing implicit constructor warnings.
   factory NavigatorCpu._() { throw new UnsupportedError("Not supported"); }
 
-  @DomName('NavigatorCPU.hardwareConcurrency')
-  @DocsEditable()
-  @Experimental() // untriaged
   final int hardwareConcurrency;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -21554,19 +21556,12 @@
 @DocsEditable()
 @DomName('NavigatorLanguage')
 @Experimental() // untriaged
-@Native("NavigatorLanguage")
-class NavigatorLanguage extends Interceptor {
+abstract class NavigatorLanguage extends Interceptor {
   // To suppress missing implicit constructor warnings.
   factory NavigatorLanguage._() { throw new UnsupportedError("Not supported"); }
 
-  @DomName('NavigatorLanguage.language')
-  @DocsEditable()
-  @Experimental() // untriaged
   final String language;
 
-  @DomName('NavigatorLanguage.languages')
-  @DocsEditable()
-  @Experimental() // untriaged
   final List<String> languages;
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -33904,10 +33899,12 @@
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/workers.html#workernavigator
 @Experimental()
 @Native("WorkerNavigator")
-abstract class _WorkerNavigator extends NavigatorCpu implements NavigatorOnLine, NavigatorID {
+abstract class _WorkerNavigator extends Interceptor implements NavigatorCpu, NavigatorOnLine, NavigatorID {
   // To suppress missing implicit constructor warnings.
   factory _WorkerNavigator._() { throw new UnsupportedError("Not supported"); }
 
+  // From NavigatorCPU
+
   // From NavigatorID
 
   // From NavigatorOnLine
diff --git a/sdk/lib/html/dartium/html_dartium.dart b/sdk/lib/html/dartium/html_dartium.dart
index e1b8b5e..25dbbf9 100644
--- a/sdk/lib/html/dartium/html_dartium.dart
+++ b/sdk/lib/html/dartium/html_dartium.dart
@@ -666,147 +666,147 @@
 
   @DomName('HTMLAnchorElement.download')
   @DocsEditable()
-  String get download => _blink.BlinkHTMLAnchorElement.download_Getter(this);
+  String get download => _blink.BlinkHTMLAnchorElement.instance.download_Getter_(this);
 
   @DomName('HTMLAnchorElement.download')
   @DocsEditable()
-  void set download(String value) => _blink.BlinkHTMLAnchorElement.download_Setter(this, value);
+  void set download(String value) => _blink.BlinkHTMLAnchorElement.instance.download_Setter_(this, value);
 
   @DomName('HTMLAnchorElement.hreflang')
   @DocsEditable()
-  String get hreflang => _blink.BlinkHTMLAnchorElement.hreflang_Getter(this);
+  String get hreflang => _blink.BlinkHTMLAnchorElement.instance.hreflang_Getter_(this);
 
   @DomName('HTMLAnchorElement.hreflang')
   @DocsEditable()
-  void set hreflang(String value) => _blink.BlinkHTMLAnchorElement.hreflang_Setter(this, value);
+  void set hreflang(String value) => _blink.BlinkHTMLAnchorElement.instance.hreflang_Setter_(this, value);
 
   @DomName('HTMLAnchorElement.integrity')
   @DocsEditable()
   @Experimental() // untriaged
-  String get integrity => _blink.BlinkHTMLAnchorElement.integrity_Getter(this);
+  String get integrity => _blink.BlinkHTMLAnchorElement.instance.integrity_Getter_(this);
 
   @DomName('HTMLAnchorElement.integrity')
   @DocsEditable()
   @Experimental() // untriaged
-  void set integrity(String value) => _blink.BlinkHTMLAnchorElement.integrity_Setter(this, value);
+  void set integrity(String value) => _blink.BlinkHTMLAnchorElement.instance.integrity_Setter_(this, value);
 
   @DomName('HTMLAnchorElement.rel')
   @DocsEditable()
-  String get rel => _blink.BlinkHTMLAnchorElement.rel_Getter(this);
+  String get rel => _blink.BlinkHTMLAnchorElement.instance.rel_Getter_(this);
 
   @DomName('HTMLAnchorElement.rel')
   @DocsEditable()
-  void set rel(String value) => _blink.BlinkHTMLAnchorElement.rel_Setter(this, value);
+  void set rel(String value) => _blink.BlinkHTMLAnchorElement.instance.rel_Setter_(this, value);
 
   @DomName('HTMLAnchorElement.target')
   @DocsEditable()
-  String get target => _blink.BlinkHTMLAnchorElement.target_Getter(this);
+  String get target => _blink.BlinkHTMLAnchorElement.instance.target_Getter_(this);
 
   @DomName('HTMLAnchorElement.target')
   @DocsEditable()
-  void set target(String value) => _blink.BlinkHTMLAnchorElement.target_Setter(this, value);
+  void set target(String value) => _blink.BlinkHTMLAnchorElement.instance.target_Setter_(this, value);
 
   @DomName('HTMLAnchorElement.type')
   @DocsEditable()
-  String get type => _blink.BlinkHTMLAnchorElement.type_Getter(this);
+  String get type => _blink.BlinkHTMLAnchorElement.instance.type_Getter_(this);
 
   @DomName('HTMLAnchorElement.type')
   @DocsEditable()
-  void set type(String value) => _blink.BlinkHTMLAnchorElement.type_Setter(this, value);
+  void set type(String value) => _blink.BlinkHTMLAnchorElement.instance.type_Setter_(this, value);
 
   @DomName('HTMLAnchorElement.hash')
   @DocsEditable()
-  String get hash => _blink.BlinkHTMLAnchorElement.hash_Getter(this);
+  String get hash => _blink.BlinkHTMLAnchorElement.instance.hash_Getter_(this);
 
   @DomName('HTMLAnchorElement.hash')
   @DocsEditable()
-  void set hash(String value) => _blink.BlinkHTMLAnchorElement.hash_Setter(this, value);
+  void set hash(String value) => _blink.BlinkHTMLAnchorElement.instance.hash_Setter_(this, value);
 
   @DomName('HTMLAnchorElement.host')
   @DocsEditable()
-  String get host => _blink.BlinkHTMLAnchorElement.host_Getter(this);
+  String get host => _blink.BlinkHTMLAnchorElement.instance.host_Getter_(this);
 
   @DomName('HTMLAnchorElement.host')
   @DocsEditable()
-  void set host(String value) => _blink.BlinkHTMLAnchorElement.host_Setter(this, value);
+  void set host(String value) => _blink.BlinkHTMLAnchorElement.instance.host_Setter_(this, value);
 
   @DomName('HTMLAnchorElement.hostname')
   @DocsEditable()
-  String get hostname => _blink.BlinkHTMLAnchorElement.hostname_Getter(this);
+  String get hostname => _blink.BlinkHTMLAnchorElement.instance.hostname_Getter_(this);
 
   @DomName('HTMLAnchorElement.hostname')
   @DocsEditable()
-  void set hostname(String value) => _blink.BlinkHTMLAnchorElement.hostname_Setter(this, value);
+  void set hostname(String value) => _blink.BlinkHTMLAnchorElement.instance.hostname_Setter_(this, value);
 
   @DomName('HTMLAnchorElement.href')
   @DocsEditable()
-  String get href => _blink.BlinkHTMLAnchorElement.href_Getter(this);
+  String get href => _blink.BlinkHTMLAnchorElement.instance.href_Getter_(this);
 
   @DomName('HTMLAnchorElement.href')
   @DocsEditable()
-  void set href(String value) => _blink.BlinkHTMLAnchorElement.href_Setter(this, value);
+  void set href(String value) => _blink.BlinkHTMLAnchorElement.instance.href_Setter_(this, value);
 
   @DomName('HTMLAnchorElement.origin')
   @DocsEditable()
   // WebKit only
   @Experimental() // non-standard
-  String get origin => _blink.BlinkHTMLAnchorElement.origin_Getter(this);
+  String get origin => _blink.BlinkHTMLAnchorElement.instance.origin_Getter_(this);
 
   @DomName('HTMLAnchorElement.password')
   @DocsEditable()
   @Experimental() // untriaged
-  String get password => _blink.BlinkHTMLAnchorElement.password_Getter(this);
+  String get password => _blink.BlinkHTMLAnchorElement.instance.password_Getter_(this);
 
   @DomName('HTMLAnchorElement.password')
   @DocsEditable()
   @Experimental() // untriaged
-  void set password(String value) => _blink.BlinkHTMLAnchorElement.password_Setter(this, value);
+  void set password(String value) => _blink.BlinkHTMLAnchorElement.instance.password_Setter_(this, value);
 
   @DomName('HTMLAnchorElement.pathname')
   @DocsEditable()
-  String get pathname => _blink.BlinkHTMLAnchorElement.pathname_Getter(this);
+  String get pathname => _blink.BlinkHTMLAnchorElement.instance.pathname_Getter_(this);
 
   @DomName('HTMLAnchorElement.pathname')
   @DocsEditable()
-  void set pathname(String value) => _blink.BlinkHTMLAnchorElement.pathname_Setter(this, value);
+  void set pathname(String value) => _blink.BlinkHTMLAnchorElement.instance.pathname_Setter_(this, value);
 
   @DomName('HTMLAnchorElement.port')
   @DocsEditable()
-  String get port => _blink.BlinkHTMLAnchorElement.port_Getter(this);
+  String get port => _blink.BlinkHTMLAnchorElement.instance.port_Getter_(this);
 
   @DomName('HTMLAnchorElement.port')
   @DocsEditable()
-  void set port(String value) => _blink.BlinkHTMLAnchorElement.port_Setter(this, value);
+  void set port(String value) => _blink.BlinkHTMLAnchorElement.instance.port_Setter_(this, value);
 
   @DomName('HTMLAnchorElement.protocol')
   @DocsEditable()
-  String get protocol => _blink.BlinkHTMLAnchorElement.protocol_Getter(this);
+  String get protocol => _blink.BlinkHTMLAnchorElement.instance.protocol_Getter_(this);
 
   @DomName('HTMLAnchorElement.protocol')
   @DocsEditable()
-  void set protocol(String value) => _blink.BlinkHTMLAnchorElement.protocol_Setter(this, value);
+  void set protocol(String value) => _blink.BlinkHTMLAnchorElement.instance.protocol_Setter_(this, value);
 
   @DomName('HTMLAnchorElement.search')
   @DocsEditable()
-  String get search => _blink.BlinkHTMLAnchorElement.search_Getter(this);
+  String get search => _blink.BlinkHTMLAnchorElement.instance.search_Getter_(this);
 
   @DomName('HTMLAnchorElement.search')
   @DocsEditable()
-  void set search(String value) => _blink.BlinkHTMLAnchorElement.search_Setter(this, value);
+  void set search(String value) => _blink.BlinkHTMLAnchorElement.instance.search_Setter_(this, value);
 
   @DomName('HTMLAnchorElement.username')
   @DocsEditable()
   @Experimental() // untriaged
-  String get username => _blink.BlinkHTMLAnchorElement.username_Getter(this);
+  String get username => _blink.BlinkHTMLAnchorElement.instance.username_Getter_(this);
 
   @DomName('HTMLAnchorElement.username')
   @DocsEditable()
   @Experimental() // untriaged
-  void set username(String value) => _blink.BlinkHTMLAnchorElement.username_Setter(this, value);
+  void set username(String value) => _blink.BlinkHTMLAnchorElement.instance.username_Setter_(this, value);
 
   @DomName('HTMLAnchorElement.toString')
   @DocsEditable()
-  String toString() => _blink.BlinkHTMLAnchorElement.toString_Callback(this);
+  String toString() => _blink.BlinkHTMLAnchorElement.instance.toString_Callback_0_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -827,13 +827,13 @@
   @DocsEditable()
   factory Animation(Element target, List<Map> keyframes, [timingInput]) {
     if ((keyframes is List<Map> || keyframes == null) && (target is Element || target == null) && timingInput == null) {
-      return _blink.BlinkAnimation.constructorCallback_2(target, keyframes);
+      return _blink.BlinkAnimation.instance.constructorCallback_2_(target, keyframes);
     }
     if ((timingInput is num || timingInput == null) && (keyframes is List<Map> || keyframes == null) && (target is Element || target == null)) {
-      return _blink.BlinkAnimation.constructorCallback_3(target, keyframes, timingInput);
+      return _blink.BlinkAnimation.instance.constructorCallback_3_(target, keyframes, timingInput);
     }
     if ((timingInput is Map || timingInput == null) && (keyframes is List<Map> || keyframes == null) && (target is Element || target == null)) {
-      return _blink.BlinkAnimation.constructorCallback_3(target, keyframes, timingInput);
+      return _blink.BlinkAnimation.instance.constructorCallback_3_(target, keyframes, timingInput);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
@@ -872,11 +872,11 @@
 
   @DomName('WebKitAnimationEvent.animationName')
   @DocsEditable()
-  String get animationName => _blink.BlinkWebKitAnimationEvent.animationName_Getter(this);
+  String get animationName => _blink.BlinkWebKitAnimationEvent.instance.animationName_Getter_(this);
 
   @DomName('WebKitAnimationEvent.elapsedTime')
   @DocsEditable()
-  double get elapsedTime => _blink.BlinkWebKitAnimationEvent.elapsedTime_Getter(this);
+  double get elapsedTime => _blink.BlinkWebKitAnimationEvent.instance.elapsedTime_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -896,42 +896,42 @@
   @DomName('AnimationNode.activeDuration')
   @DocsEditable()
   @Experimental() // untriaged
-  double get activeDuration => _blink.BlinkAnimationNode.activeDuration_Getter(this);
+  double get activeDuration => _blink.BlinkAnimationNode.instance.activeDuration_Getter_(this);
 
   @DomName('AnimationNode.currentIteration')
   @DocsEditable()
   @Experimental() // untriaged
-  int get currentIteration => _blink.BlinkAnimationNode.currentIteration_Getter(this);
+  int get currentIteration => _blink.BlinkAnimationNode.instance.currentIteration_Getter_(this);
 
   @DomName('AnimationNode.duration')
   @DocsEditable()
   @Experimental() // untriaged
-  double get duration => _blink.BlinkAnimationNode.duration_Getter(this);
+  double get duration => _blink.BlinkAnimationNode.instance.duration_Getter_(this);
 
   @DomName('AnimationNode.endTime')
   @DocsEditable()
   @Experimental() // untriaged
-  double get endTime => _blink.BlinkAnimationNode.endTime_Getter(this);
+  double get endTime => _blink.BlinkAnimationNode.instance.endTime_Getter_(this);
 
   @DomName('AnimationNode.localTime')
   @DocsEditable()
   @Experimental() // untriaged
-  double get localTime => _blink.BlinkAnimationNode.localTime_Getter(this);
+  double get localTime => _blink.BlinkAnimationNode.instance.localTime_Getter_(this);
 
   @DomName('AnimationNode.player')
   @DocsEditable()
   @Experimental() // untriaged
-  AnimationPlayer get player => _blink.BlinkAnimationNode.player_Getter(this);
+  AnimationPlayer get player => _blink.BlinkAnimationNode.instance.player_Getter_(this);
 
   @DomName('AnimationNode.startTime')
   @DocsEditable()
   @Experimental() // untriaged
-  double get startTime => _blink.BlinkAnimationNode.startTime_Getter(this);
+  double get startTime => _blink.BlinkAnimationNode.instance.startTime_Getter_(this);
 
   @DomName('AnimationNode.timing')
   @DocsEditable()
   @Experimental() // untriaged
-  Timing get timing => _blink.BlinkAnimationNode.timing_Getter(this);
+  Timing get timing => _blink.BlinkAnimationNode.instance.timing_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -951,77 +951,77 @@
   @DomName('AnimationPlayer.currentTime')
   @DocsEditable()
   @Experimental() // untriaged
-  num get currentTime => _blink.BlinkAnimationPlayer.currentTime_Getter(this);
+  num get currentTime => _blink.BlinkAnimationPlayer.instance.currentTime_Getter_(this);
 
   @DomName('AnimationPlayer.currentTime')
   @DocsEditable()
   @Experimental() // untriaged
-  void set currentTime(num value) => _blink.BlinkAnimationPlayer.currentTime_Setter(this, value);
+  void set currentTime(num value) => _blink.BlinkAnimationPlayer.instance.currentTime_Setter_(this, value);
 
   @DomName('AnimationPlayer.finished')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get finished => _blink.BlinkAnimationPlayer.finished_Getter(this);
+  bool get finished => _blink.BlinkAnimationPlayer.instance.finished_Getter_(this);
 
   @DomName('AnimationPlayer.paused')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get paused => _blink.BlinkAnimationPlayer.paused_Getter(this);
+  bool get paused => _blink.BlinkAnimationPlayer.instance.paused_Getter_(this);
 
   @DomName('AnimationPlayer.playbackRate')
   @DocsEditable()
   @Experimental() // untriaged
-  num get playbackRate => _blink.BlinkAnimationPlayer.playbackRate_Getter(this);
+  num get playbackRate => _blink.BlinkAnimationPlayer.instance.playbackRate_Getter_(this);
 
   @DomName('AnimationPlayer.playbackRate')
   @DocsEditable()
   @Experimental() // untriaged
-  void set playbackRate(num value) => _blink.BlinkAnimationPlayer.playbackRate_Setter(this, value);
+  void set playbackRate(num value) => _blink.BlinkAnimationPlayer.instance.playbackRate_Setter_(this, value);
 
   @DomName('AnimationPlayer.source')
   @DocsEditable()
   @Experimental() // untriaged
-  AnimationNode get source => _blink.BlinkAnimationPlayer.source_Getter(this);
+  AnimationNode get source => _blink.BlinkAnimationPlayer.instance.source_Getter_(this);
 
   @DomName('AnimationPlayer.source')
   @DocsEditable()
   @Experimental() // untriaged
-  void set source(AnimationNode value) => _blink.BlinkAnimationPlayer.source_Setter(this, value);
+  void set source(AnimationNode value) => _blink.BlinkAnimationPlayer.instance.source_Setter_(this, value);
 
   @DomName('AnimationPlayer.startTime')
   @DocsEditable()
   @Experimental() // untriaged
-  num get startTime => _blink.BlinkAnimationPlayer.startTime_Getter(this);
+  num get startTime => _blink.BlinkAnimationPlayer.instance.startTime_Getter_(this);
 
   @DomName('AnimationPlayer.startTime')
   @DocsEditable()
   @Experimental() // untriaged
-  void set startTime(num value) => _blink.BlinkAnimationPlayer.startTime_Setter(this, value);
+  void set startTime(num value) => _blink.BlinkAnimationPlayer.instance.startTime_Setter_(this, value);
 
   @DomName('AnimationPlayer.cancel')
   @DocsEditable()
   @Experimental() // untriaged
-  void cancel() => _blink.BlinkAnimationPlayer.cancel_Callback(this);
+  void cancel() => _blink.BlinkAnimationPlayer.instance.cancel_Callback_0_(this);
 
   @DomName('AnimationPlayer.finish')
   @DocsEditable()
   @Experimental() // untriaged
-  void finish() => _blink.BlinkAnimationPlayer.finish_Callback(this);
+  void finish() => _blink.BlinkAnimationPlayer.instance.finish_Callback_0_(this);
 
   @DomName('AnimationPlayer.pause')
   @DocsEditable()
   @Experimental() // untriaged
-  void pause() => _blink.BlinkAnimationPlayer.pause_Callback(this);
+  void pause() => _blink.BlinkAnimationPlayer.instance.pause_Callback_0_(this);
 
   @DomName('AnimationPlayer.play')
   @DocsEditable()
   @Experimental() // untriaged
-  void play() => _blink.BlinkAnimationPlayer.play_Callback(this);
+  void play() => _blink.BlinkAnimationPlayer.instance.play_Callback_0_(this);
 
   @DomName('AnimationPlayer.reverse')
   @DocsEditable()
   @Experimental() // untriaged
-  void reverse() => _blink.BlinkAnimationPlayer.reverse_Callback(this);
+  void reverse() => _blink.BlinkAnimationPlayer.instance.reverse_Callback_0_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1041,12 +1041,12 @@
   @DomName('AnimationPlayerEvent.currentTime')
   @DocsEditable()
   @Experimental() // untriaged
-  double get currentTime => _blink.BlinkAnimationPlayerEvent.currentTime_Getter(this);
+  double get currentTime => _blink.BlinkAnimationPlayerEvent.instance.currentTime_Getter_(this);
 
   @DomName('AnimationPlayerEvent.timelineTime')
   @DocsEditable()
   @Experimental() // untriaged
-  double get timelineTime => _blink.BlinkAnimationPlayerEvent.timelineTime_Getter(this);
+  double get timelineTime => _blink.BlinkAnimationPlayerEvent.instance.timelineTime_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1066,17 +1066,17 @@
   @DomName('AnimationTimeline.currentTime')
   @DocsEditable()
   @Experimental() // untriaged
-  double get currentTime => _blink.BlinkAnimationTimeline.currentTime_Getter(this);
+  double get currentTime => _blink.BlinkAnimationTimeline.instance.currentTime_Getter_(this);
 
   @DomName('AnimationTimeline.getAnimationPlayers')
   @DocsEditable()
   @Experimental() // untriaged
-  List<AnimationPlayer> getAnimationPlayers() => _blink.BlinkAnimationTimeline.getAnimationPlayers_Callback(this);
+  List<AnimationPlayer> getAnimationPlayers() => _blink.BlinkAnimationTimeline.instance.getAnimationPlayers_Callback_0_(this);
 
   @DomName('AnimationTimeline.play')
   @DocsEditable()
   @Experimental() // untriaged
-  AnimationPlayer play(AnimationNode source) => _blink.BlinkAnimationTimeline.play_Callback_1(this, source);
+  AnimationPlayer play(AnimationNode source) => _blink.BlinkAnimationTimeline.instance.play_Callback_1_(this, source);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1210,19 +1210,19 @@
 
   @DomName('ApplicationCache.status')
   @DocsEditable()
-  int get status => _blink.BlinkApplicationCache.status_Getter(this);
+  int get status => _blink.BlinkApplicationCache.instance.status_Getter_(this);
 
   @DomName('ApplicationCache.abort')
   @DocsEditable()
-  void abort() => _blink.BlinkApplicationCache.abort_Callback(this);
+  void abort() => _blink.BlinkApplicationCache.instance.abort_Callback_0_(this);
 
   @DomName('ApplicationCache.swapCache')
   @DocsEditable()
-  void swapCache() => _blink.BlinkApplicationCache.swapCache_Callback(this);
+  void swapCache() => _blink.BlinkApplicationCache.instance.swapCache_Callback_0_(this);
 
   @DomName('ApplicationCache.update')
   @DocsEditable()
-  void update() => _blink.BlinkApplicationCache.update_Callback(this);
+  void update() => _blink.BlinkApplicationCache.instance.update_Callback_0_(this);
 
   /// Stream of `cached` events handled by this [ApplicationCache].
   @DomName('ApplicationCache.oncached')
@@ -1282,22 +1282,22 @@
   @DomName('ApplicationCacheErrorEvent.message')
   @DocsEditable()
   @Experimental() // untriaged
-  String get message => _blink.BlinkApplicationCacheErrorEvent.message_Getter(this);
+  String get message => _blink.BlinkApplicationCacheErrorEvent.instance.message_Getter_(this);
 
   @DomName('ApplicationCacheErrorEvent.reason')
   @DocsEditable()
   @Experimental() // untriaged
-  String get reason => _blink.BlinkApplicationCacheErrorEvent.reason_Getter(this);
+  String get reason => _blink.BlinkApplicationCacheErrorEvent.instance.reason_Getter_(this);
 
   @DomName('ApplicationCacheErrorEvent.status')
   @DocsEditable()
   @Experimental() // untriaged
-  int get status => _blink.BlinkApplicationCacheErrorEvent.status_Getter(this);
+  int get status => _blink.BlinkApplicationCacheErrorEvent.instance.status_Getter_(this);
 
   @DomName('ApplicationCacheErrorEvent.url')
   @DocsEditable()
   @Experimental() // untriaged
-  String get url => _blink.BlinkApplicationCacheErrorEvent.url_Getter(this);
+  String get url => _blink.BlinkApplicationCacheErrorEvent.instance.url_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1335,129 +1335,129 @@
 
   @DomName('HTMLAreaElement.alt')
   @DocsEditable()
-  String get alt => _blink.BlinkHTMLAreaElement.alt_Getter(this);
+  String get alt => _blink.BlinkHTMLAreaElement.instance.alt_Getter_(this);
 
   @DomName('HTMLAreaElement.alt')
   @DocsEditable()
-  void set alt(String value) => _blink.BlinkHTMLAreaElement.alt_Setter(this, value);
+  void set alt(String value) => _blink.BlinkHTMLAreaElement.instance.alt_Setter_(this, value);
 
   @DomName('HTMLAreaElement.coords')
   @DocsEditable()
-  String get coords => _blink.BlinkHTMLAreaElement.coords_Getter(this);
+  String get coords => _blink.BlinkHTMLAreaElement.instance.coords_Getter_(this);
 
   @DomName('HTMLAreaElement.coords')
   @DocsEditable()
-  void set coords(String value) => _blink.BlinkHTMLAreaElement.coords_Setter(this, value);
+  void set coords(String value) => _blink.BlinkHTMLAreaElement.instance.coords_Setter_(this, value);
 
   @DomName('HTMLAreaElement.shape')
   @DocsEditable()
-  String get shape => _blink.BlinkHTMLAreaElement.shape_Getter(this);
+  String get shape => _blink.BlinkHTMLAreaElement.instance.shape_Getter_(this);
 
   @DomName('HTMLAreaElement.shape')
   @DocsEditable()
-  void set shape(String value) => _blink.BlinkHTMLAreaElement.shape_Setter(this, value);
+  void set shape(String value) => _blink.BlinkHTMLAreaElement.instance.shape_Setter_(this, value);
 
   @DomName('HTMLAreaElement.target')
   @DocsEditable()
-  String get target => _blink.BlinkHTMLAreaElement.target_Getter(this);
+  String get target => _blink.BlinkHTMLAreaElement.instance.target_Getter_(this);
 
   @DomName('HTMLAreaElement.target')
   @DocsEditable()
-  void set target(String value) => _blink.BlinkHTMLAreaElement.target_Setter(this, value);
+  void set target(String value) => _blink.BlinkHTMLAreaElement.instance.target_Setter_(this, value);
 
   @DomName('HTMLAreaElement.hash')
   @DocsEditable()
-  String get hash => _blink.BlinkHTMLAreaElement.hash_Getter(this);
+  String get hash => _blink.BlinkHTMLAreaElement.instance.hash_Getter_(this);
 
   @DomName('HTMLAreaElement.hash')
   @DocsEditable()
-  void set hash(String value) => _blink.BlinkHTMLAreaElement.hash_Setter(this, value);
+  void set hash(String value) => _blink.BlinkHTMLAreaElement.instance.hash_Setter_(this, value);
 
   @DomName('HTMLAreaElement.host')
   @DocsEditable()
-  String get host => _blink.BlinkHTMLAreaElement.host_Getter(this);
+  String get host => _blink.BlinkHTMLAreaElement.instance.host_Getter_(this);
 
   @DomName('HTMLAreaElement.host')
   @DocsEditable()
-  void set host(String value) => _blink.BlinkHTMLAreaElement.host_Setter(this, value);
+  void set host(String value) => _blink.BlinkHTMLAreaElement.instance.host_Setter_(this, value);
 
   @DomName('HTMLAreaElement.hostname')
   @DocsEditable()
-  String get hostname => _blink.BlinkHTMLAreaElement.hostname_Getter(this);
+  String get hostname => _blink.BlinkHTMLAreaElement.instance.hostname_Getter_(this);
 
   @DomName('HTMLAreaElement.hostname')
   @DocsEditable()
-  void set hostname(String value) => _blink.BlinkHTMLAreaElement.hostname_Setter(this, value);
+  void set hostname(String value) => _blink.BlinkHTMLAreaElement.instance.hostname_Setter_(this, value);
 
   @DomName('HTMLAreaElement.href')
   @DocsEditable()
-  String get href => _blink.BlinkHTMLAreaElement.href_Getter(this);
+  String get href => _blink.BlinkHTMLAreaElement.instance.href_Getter_(this);
 
   @DomName('HTMLAreaElement.href')
   @DocsEditable()
-  void set href(String value) => _blink.BlinkHTMLAreaElement.href_Setter(this, value);
+  void set href(String value) => _blink.BlinkHTMLAreaElement.instance.href_Setter_(this, value);
 
   @DomName('HTMLAreaElement.origin')
   @DocsEditable()
   @Experimental() // untriaged
-  String get origin => _blink.BlinkHTMLAreaElement.origin_Getter(this);
+  String get origin => _blink.BlinkHTMLAreaElement.instance.origin_Getter_(this);
 
   @DomName('HTMLAreaElement.password')
   @DocsEditable()
   @Experimental() // untriaged
-  String get password => _blink.BlinkHTMLAreaElement.password_Getter(this);
+  String get password => _blink.BlinkHTMLAreaElement.instance.password_Getter_(this);
 
   @DomName('HTMLAreaElement.password')
   @DocsEditable()
   @Experimental() // untriaged
-  void set password(String value) => _blink.BlinkHTMLAreaElement.password_Setter(this, value);
+  void set password(String value) => _blink.BlinkHTMLAreaElement.instance.password_Setter_(this, value);
 
   @DomName('HTMLAreaElement.pathname')
   @DocsEditable()
-  String get pathname => _blink.BlinkHTMLAreaElement.pathname_Getter(this);
+  String get pathname => _blink.BlinkHTMLAreaElement.instance.pathname_Getter_(this);
 
   @DomName('HTMLAreaElement.pathname')
   @DocsEditable()
-  void set pathname(String value) => _blink.BlinkHTMLAreaElement.pathname_Setter(this, value);
+  void set pathname(String value) => _blink.BlinkHTMLAreaElement.instance.pathname_Setter_(this, value);
 
   @DomName('HTMLAreaElement.port')
   @DocsEditable()
-  String get port => _blink.BlinkHTMLAreaElement.port_Getter(this);
+  String get port => _blink.BlinkHTMLAreaElement.instance.port_Getter_(this);
 
   @DomName('HTMLAreaElement.port')
   @DocsEditable()
-  void set port(String value) => _blink.BlinkHTMLAreaElement.port_Setter(this, value);
+  void set port(String value) => _blink.BlinkHTMLAreaElement.instance.port_Setter_(this, value);
 
   @DomName('HTMLAreaElement.protocol')
   @DocsEditable()
-  String get protocol => _blink.BlinkHTMLAreaElement.protocol_Getter(this);
+  String get protocol => _blink.BlinkHTMLAreaElement.instance.protocol_Getter_(this);
 
   @DomName('HTMLAreaElement.protocol')
   @DocsEditable()
-  void set protocol(String value) => _blink.BlinkHTMLAreaElement.protocol_Setter(this, value);
+  void set protocol(String value) => _blink.BlinkHTMLAreaElement.instance.protocol_Setter_(this, value);
 
   @DomName('HTMLAreaElement.search')
   @DocsEditable()
-  String get search => _blink.BlinkHTMLAreaElement.search_Getter(this);
+  String get search => _blink.BlinkHTMLAreaElement.instance.search_Getter_(this);
 
   @DomName('HTMLAreaElement.search')
   @DocsEditable()
-  void set search(String value) => _blink.BlinkHTMLAreaElement.search_Setter(this, value);
+  void set search(String value) => _blink.BlinkHTMLAreaElement.instance.search_Setter_(this, value);
 
   @DomName('HTMLAreaElement.username')
   @DocsEditable()
   @Experimental() // untriaged
-  String get username => _blink.BlinkHTMLAreaElement.username_Getter(this);
+  String get username => _blink.BlinkHTMLAreaElement.instance.username_Getter_(this);
 
   @DomName('HTMLAreaElement.username')
   @DocsEditable()
   @Experimental() // untriaged
-  void set username(String value) => _blink.BlinkHTMLAreaElement.username_Setter(this, value);
+  void set username(String value) => _blink.BlinkHTMLAreaElement.instance.username_Setter_(this, value);
 
   @DomName('HTMLAreaElement.toString')
   @DocsEditable()
   @Experimental() // untriaged
-  String toString() => _blink.BlinkHTMLAreaElement.toString_Callback(this);
+  String toString() => _blink.BlinkHTMLAreaElement.instance.toString_Callback_0_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1476,7 +1476,7 @@
   @DomName('HTMLAudioElement.HTMLAudioElement')
   @DocsEditable()
   factory AudioElement([String src]) {
-    return _blink.BlinkHTMLAudioElement.constructorCallback_1(src);
+    return _blink.BlinkHTMLAudioElement.instance.constructorCallback_1_(src);
   }
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
@@ -1503,32 +1503,32 @@
   @DomName('AudioTrack.enabled')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get enabled => _blink.BlinkAudioTrack.enabled_Getter(this);
+  bool get enabled => _blink.BlinkAudioTrack.instance.enabled_Getter_(this);
 
   @DomName('AudioTrack.enabled')
   @DocsEditable()
   @Experimental() // untriaged
-  void set enabled(bool value) => _blink.BlinkAudioTrack.enabled_Setter(this, value);
+  void set enabled(bool value) => _blink.BlinkAudioTrack.instance.enabled_Setter_(this, value);
 
   @DomName('AudioTrack.id')
   @DocsEditable()
   @Experimental() // untriaged
-  String get id => _blink.BlinkAudioTrack.id_Getter(this);
+  String get id => _blink.BlinkAudioTrack.instance.id_Getter_(this);
 
   @DomName('AudioTrack.kind')
   @DocsEditable()
   @Experimental() // untriaged
-  String get kind => _blink.BlinkAudioTrack.kind_Getter(this);
+  String get kind => _blink.BlinkAudioTrack.instance.kind_Getter_(this);
 
   @DomName('AudioTrack.label')
   @DocsEditable()
   @Experimental() // untriaged
-  String get label => _blink.BlinkAudioTrack.label_Getter(this);
+  String get label => _blink.BlinkAudioTrack.instance.label_Getter_(this);
 
   @DomName('AudioTrack.language')
   @DocsEditable()
   @Experimental() // untriaged
-  String get language => _blink.BlinkAudioTrack.language_Getter(this);
+  String get language => _blink.BlinkAudioTrack.instance.language_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1553,17 +1553,17 @@
   @DomName('AudioTrackList.length')
   @DocsEditable()
   @Experimental() // untriaged
-  int get length => _blink.BlinkAudioTrackList.length_Getter(this);
+  int get length => _blink.BlinkAudioTrackList.instance.length_Getter_(this);
 
   @DomName('AudioTrackList.__getter__')
   @DocsEditable()
   @Experimental() // untriaged
-  AudioTrack __getter__(int index) => _blink.BlinkAudioTrackList.$__getter___Callback_1(this, index);
+  AudioTrack __getter__(int index) => _blink.BlinkAudioTrackList.instance.$__getter___Callback_1_(this, index);
 
   @DomName('AudioTrackList.getTrackById')
   @DocsEditable()
   @Experimental() // untriaged
-  AudioTrack getTrackById(String id) => _blink.BlinkAudioTrackList.getTrackById_Callback_1(this, id);
+  AudioTrack getTrackById(String id) => _blink.BlinkAudioTrackList.instance.getTrackById_Callback_1_(this, id);
 
   @DomName('AudioTrackList.onchange')
   @DocsEditable()
@@ -1588,7 +1588,7 @@
 
   @DomName('AutocompleteErrorEvent.reason')
   @DocsEditable()
-  String get reason => _blink.BlinkAutocompleteErrorEvent.reason_Getter(this);
+  String get reason => _blink.BlinkAutocompleteErrorEvent.instance.reason_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1632,7 +1632,7 @@
 
   @DomName('BarProp.visible')
   @DocsEditable()
-  bool get visible => _blink.BlinkBarProp.visible_Getter(this);
+  bool get visible => _blink.BlinkBarProp.instance.visible_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1660,19 +1660,19 @@
 
   @DomName('HTMLBaseElement.href')
   @DocsEditable()
-  String get href => _blink.BlinkHTMLBaseElement.href_Getter(this);
+  String get href => _blink.BlinkHTMLBaseElement.instance.href_Getter_(this);
 
   @DomName('HTMLBaseElement.href')
   @DocsEditable()
-  void set href(String value) => _blink.BlinkHTMLBaseElement.href_Setter(this, value);
+  void set href(String value) => _blink.BlinkHTMLBaseElement.instance.href_Setter_(this, value);
 
   @DomName('HTMLBaseElement.target')
   @DocsEditable()
-  String get target => _blink.BlinkHTMLBaseElement.target_Getter(this);
+  String get target => _blink.BlinkHTMLBaseElement.instance.target_Getter_(this);
 
   @DomName('HTMLBaseElement.target')
   @DocsEditable()
-  void set target(String value) => _blink.BlinkHTMLBaseElement.target_Setter(this, value);
+  void set target(String value) => _blink.BlinkHTMLBaseElement.instance.target_Setter_(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1692,19 +1692,19 @@
 
   @DomName('BatteryManager.charging')
   @DocsEditable()
-  bool get charging => _blink.BlinkBatteryManager.charging_Getter(this);
+  bool get charging => _blink.BlinkBatteryManager.instance.charging_Getter_(this);
 
   @DomName('BatteryManager.chargingTime')
   @DocsEditable()
-  double get chargingTime => _blink.BlinkBatteryManager.chargingTime_Getter(this);
+  double get chargingTime => _blink.BlinkBatteryManager.instance.chargingTime_Getter_(this);
 
   @DomName('BatteryManager.dischargingTime')
   @DocsEditable()
-  double get dischargingTime => _blink.BlinkBatteryManager.dischargingTime_Getter(this);
+  double get dischargingTime => _blink.BlinkBatteryManager.instance.dischargingTime_Getter_(this);
 
   @DomName('BatteryManager.level')
   @DocsEditable()
-  double get level => _blink.BlinkBatteryManager.level_Getter(this);
+  double get level => _blink.BlinkBatteryManager.instance.level_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1722,11 +1722,11 @@
 
   @DomName('BeforeUnloadEvent.returnValue')
   @DocsEditable()
-  String get returnValue => _blink.BlinkBeforeUnloadEvent.returnValue_Getter(this);
+  String get returnValue => _blink.BlinkBeforeUnloadEvent.instance.returnValue_Getter_(this);
 
   @DomName('BeforeUnloadEvent.returnValue')
   @DocsEditable()
-  void set returnValue(String value) => _blink.BlinkBeforeUnloadEvent.returnValue_Setter(this, value);
+  void set returnValue(String value) => _blink.BlinkBeforeUnloadEvent.instance.returnValue_Setter_(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1744,32 +1744,32 @@
   factory Blob(List blobParts, [String type, String endings]) => _create(blobParts, type, endings);
 
   @DocsEditable()
-  static Blob _create(blobParts, type, endings) => _blink.BlinkBlob.constructorCallback_3(blobParts, type, endings);
+  static Blob _create(blobParts, type, endings) => _blink.BlinkBlob.instance.constructorCallback_3_(blobParts, type, endings);
 
   @DomName('Blob.size')
   @DocsEditable()
-  int get size => _blink.BlinkBlob.size_Getter(this);
+  int get size => _blink.BlinkBlob.instance.size_Getter_(this);
 
   @DomName('Blob.type')
   @DocsEditable()
-  String get type => _blink.BlinkBlob.type_Getter(this);
+  String get type => _blink.BlinkBlob.instance.type_Getter_(this);
 
   @DomName('Blob.close')
   @DocsEditable()
   @Experimental() // untriaged
-  void close() => _blink.BlinkBlob.close_Callback(this);
+  void close() => _blink.BlinkBlob.instance.close_Callback_0_(this);
 
   Blob slice([int start, int end, String contentType]) {
     if (contentType != null) {
-      return _blink.BlinkBlob.slice_Callback_3(this, start, end, contentType);
+      return _blink.BlinkBlob.instance.slice_Callback_3_(this, start, end, contentType);
     }
     if (end != null) {
-      return _blink.BlinkBlob.slice_Callback_2(this, start, end);
+      return _blink.BlinkBlob.instance.slice_Callback_2_(this, start, end);
     }
     if (start != null) {
-      return _blink.BlinkBlob.slice_Callback_1(this, start);
+      return _blink.BlinkBlob.instance.slice_Callback_1_(this, start);
     }
-    return _blink.BlinkBlob.slice_Callback(this);
+    return _blink.BlinkBlob.instance.slice_Callback_0_(this);
   }
 
 }
@@ -2012,112 +2012,112 @@
 
   @DomName('HTMLButtonElement.autofocus')
   @DocsEditable()
-  bool get autofocus => _blink.BlinkHTMLButtonElement.autofocus_Getter(this);
+  bool get autofocus => _blink.BlinkHTMLButtonElement.instance.autofocus_Getter_(this);
 
   @DomName('HTMLButtonElement.autofocus')
   @DocsEditable()
-  void set autofocus(bool value) => _blink.BlinkHTMLButtonElement.autofocus_Setter(this, value);
+  void set autofocus(bool value) => _blink.BlinkHTMLButtonElement.instance.autofocus_Setter_(this, value);
 
   @DomName('HTMLButtonElement.disabled')
   @DocsEditable()
-  bool get disabled => _blink.BlinkHTMLButtonElement.disabled_Getter(this);
+  bool get disabled => _blink.BlinkHTMLButtonElement.instance.disabled_Getter_(this);
 
   @DomName('HTMLButtonElement.disabled')
   @DocsEditable()
-  void set disabled(bool value) => _blink.BlinkHTMLButtonElement.disabled_Setter(this, value);
+  void set disabled(bool value) => _blink.BlinkHTMLButtonElement.instance.disabled_Setter_(this, value);
 
   @DomName('HTMLButtonElement.form')
   @DocsEditable()
-  FormElement get form => _blink.BlinkHTMLButtonElement.form_Getter(this);
+  FormElement get form => _blink.BlinkHTMLButtonElement.instance.form_Getter_(this);
 
   @DomName('HTMLButtonElement.formAction')
   @DocsEditable()
-  String get formAction => _blink.BlinkHTMLButtonElement.formAction_Getter(this);
+  String get formAction => _blink.BlinkHTMLButtonElement.instance.formAction_Getter_(this);
 
   @DomName('HTMLButtonElement.formAction')
   @DocsEditable()
-  void set formAction(String value) => _blink.BlinkHTMLButtonElement.formAction_Setter(this, value);
+  void set formAction(String value) => _blink.BlinkHTMLButtonElement.instance.formAction_Setter_(this, value);
 
   @DomName('HTMLButtonElement.formEnctype')
   @DocsEditable()
-  String get formEnctype => _blink.BlinkHTMLButtonElement.formEnctype_Getter(this);
+  String get formEnctype => _blink.BlinkHTMLButtonElement.instance.formEnctype_Getter_(this);
 
   @DomName('HTMLButtonElement.formEnctype')
   @DocsEditable()
-  void set formEnctype(String value) => _blink.BlinkHTMLButtonElement.formEnctype_Setter(this, value);
+  void set formEnctype(String value) => _blink.BlinkHTMLButtonElement.instance.formEnctype_Setter_(this, value);
 
   @DomName('HTMLButtonElement.formMethod')
   @DocsEditable()
-  String get formMethod => _blink.BlinkHTMLButtonElement.formMethod_Getter(this);
+  String get formMethod => _blink.BlinkHTMLButtonElement.instance.formMethod_Getter_(this);
 
   @DomName('HTMLButtonElement.formMethod')
   @DocsEditable()
-  void set formMethod(String value) => _blink.BlinkHTMLButtonElement.formMethod_Setter(this, value);
+  void set formMethod(String value) => _blink.BlinkHTMLButtonElement.instance.formMethod_Setter_(this, value);
 
   @DomName('HTMLButtonElement.formNoValidate')
   @DocsEditable()
-  bool get formNoValidate => _blink.BlinkHTMLButtonElement.formNoValidate_Getter(this);
+  bool get formNoValidate => _blink.BlinkHTMLButtonElement.instance.formNoValidate_Getter_(this);
 
   @DomName('HTMLButtonElement.formNoValidate')
   @DocsEditable()
-  void set formNoValidate(bool value) => _blink.BlinkHTMLButtonElement.formNoValidate_Setter(this, value);
+  void set formNoValidate(bool value) => _blink.BlinkHTMLButtonElement.instance.formNoValidate_Setter_(this, value);
 
   @DomName('HTMLButtonElement.formTarget')
   @DocsEditable()
-  String get formTarget => _blink.BlinkHTMLButtonElement.formTarget_Getter(this);
+  String get formTarget => _blink.BlinkHTMLButtonElement.instance.formTarget_Getter_(this);
 
   @DomName('HTMLButtonElement.formTarget')
   @DocsEditable()
-  void set formTarget(String value) => _blink.BlinkHTMLButtonElement.formTarget_Setter(this, value);
+  void set formTarget(String value) => _blink.BlinkHTMLButtonElement.instance.formTarget_Setter_(this, value);
 
   @DomName('HTMLButtonElement.labels')
   @DocsEditable()
   @Unstable()
-  List<Node> get labels => _blink.BlinkHTMLButtonElement.labels_Getter(this);
+  List<Node> get labels => _blink.BlinkHTMLButtonElement.instance.labels_Getter_(this);
 
   @DomName('HTMLButtonElement.name')
   @DocsEditable()
-  String get name => _blink.BlinkHTMLButtonElement.name_Getter(this);
+  String get name => _blink.BlinkHTMLButtonElement.instance.name_Getter_(this);
 
   @DomName('HTMLButtonElement.name')
   @DocsEditable()
-  void set name(String value) => _blink.BlinkHTMLButtonElement.name_Setter(this, value);
+  void set name(String value) => _blink.BlinkHTMLButtonElement.instance.name_Setter_(this, value);
 
   @DomName('HTMLButtonElement.type')
   @DocsEditable()
-  String get type => _blink.BlinkHTMLButtonElement.type_Getter(this);
+  String get type => _blink.BlinkHTMLButtonElement.instance.type_Getter_(this);
 
   @DomName('HTMLButtonElement.type')
   @DocsEditable()
-  void set type(String value) => _blink.BlinkHTMLButtonElement.type_Setter(this, value);
+  void set type(String value) => _blink.BlinkHTMLButtonElement.instance.type_Setter_(this, value);
 
   @DomName('HTMLButtonElement.validationMessage')
   @DocsEditable()
-  String get validationMessage => _blink.BlinkHTMLButtonElement.validationMessage_Getter(this);
+  String get validationMessage => _blink.BlinkHTMLButtonElement.instance.validationMessage_Getter_(this);
 
   @DomName('HTMLButtonElement.validity')
   @DocsEditable()
-  ValidityState get validity => _blink.BlinkHTMLButtonElement.validity_Getter(this);
+  ValidityState get validity => _blink.BlinkHTMLButtonElement.instance.validity_Getter_(this);
 
   @DomName('HTMLButtonElement.value')
   @DocsEditable()
-  String get value => _blink.BlinkHTMLButtonElement.value_Getter(this);
+  String get value => _blink.BlinkHTMLButtonElement.instance.value_Getter_(this);
 
   @DomName('HTMLButtonElement.value')
   @DocsEditable()
-  void set value(String value) => _blink.BlinkHTMLButtonElement.value_Setter(this, value);
+  void set value(String value) => _blink.BlinkHTMLButtonElement.instance.value_Setter_(this, value);
 
   @DomName('HTMLButtonElement.willValidate')
   @DocsEditable()
-  bool get willValidate => _blink.BlinkHTMLButtonElement.willValidate_Getter(this);
+  bool get willValidate => _blink.BlinkHTMLButtonElement.instance.willValidate_Getter_(this);
 
   @DomName('HTMLButtonElement.checkValidity')
   @DocsEditable()
-  bool checkValidity() => _blink.BlinkHTMLButtonElement.checkValidity_Callback(this);
+  bool checkValidity() => _blink.BlinkHTMLButtonElement.instance.checkValidity_Callback_0_(this);
 
   @DomName('HTMLButtonElement.setCustomValidity')
   @DocsEditable()
-  void setCustomValidity(String error) => _blink.BlinkHTMLButtonElement.setCustomValidity_Callback_1(this, error);
+  void setCustomValidity(String error) => _blink.BlinkHTMLButtonElement.instance.setCustomValidity_Callback_1_(this, error);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2153,27 +2153,27 @@
   @DomName('CacheStorage.create')
   @DocsEditable()
   @Experimental() // untriaged
-  Future create(String cacheName) => _blink.BlinkCacheStorage.create_Callback_1(this, cacheName);
+  Future create(String cacheName) => _blink.BlinkCacheStorage.instance.create_Callback_1_(this, cacheName);
 
   @DomName('CacheStorage.delete')
   @DocsEditable()
   @Experimental() // untriaged
-  Future delete(String cacheName) => _blink.BlinkCacheStorage.delete_Callback_1(this, cacheName);
+  Future delete(String cacheName) => _blink.BlinkCacheStorage.instance.delete_Callback_1_(this, cacheName);
 
   @DomName('CacheStorage.get')
   @DocsEditable()
   @Experimental() // untriaged
-  Future get(String cacheName) => _blink.BlinkCacheStorage.get_Callback_1(this, cacheName);
+  Future get(String cacheName) => _blink.BlinkCacheStorage.instance.get_Callback_1_(this, cacheName);
 
   @DomName('CacheStorage.has')
   @DocsEditable()
   @Experimental() // untriaged
-  Future has(String cacheName) => _blink.BlinkCacheStorage.has_Callback_1(this, cacheName);
+  Future has(String cacheName) => _blink.BlinkCacheStorage.instance.has_Callback_1_(this, cacheName);
 
   @DomName('CacheStorage.keys')
   @DocsEditable()
   @Experimental() // untriaged
-  Future keys() => _blink.BlinkCacheStorage.keys_Callback(this);
+  Future keys() => _blink.BlinkCacheStorage.instance.keys_Callback_0_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2193,21 +2193,21 @@
 
   @DomName('Canvas2DContextAttributes.alpha')
   @DocsEditable()
-  bool get alpha => _blink.BlinkCanvas2DContextAttributes.alpha_Getter(this);
+  bool get alpha => _blink.BlinkCanvas2DContextAttributes.instance.alpha_Getter_(this);
 
   @DomName('Canvas2DContextAttributes.alpha')
   @DocsEditable()
-  void set alpha(bool value) => _blink.BlinkCanvas2DContextAttributes.alpha_Setter(this, value);
+  void set alpha(bool value) => _blink.BlinkCanvas2DContextAttributes.instance.alpha_Setter_(this, value);
 
   @DomName('Canvas2DContextAttributes.storage')
   @DocsEditable()
   @Experimental() // untriaged
-  String get storage => _blink.BlinkCanvas2DContextAttributes.storage_Getter(this);
+  String get storage => _blink.BlinkCanvas2DContextAttributes.instance.storage_Getter_(this);
 
   @DomName('Canvas2DContextAttributes.storage')
   @DocsEditable()
   @Experimental() // untriaged
-  void set storage(String value) => _blink.BlinkCanvas2DContextAttributes.storage_Setter(this, value);
+  void set storage(String value) => _blink.BlinkCanvas2DContextAttributes.instance.storage_Setter_(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2258,30 +2258,30 @@
   /// The height of this canvas element in CSS pixels.
   @DomName('HTMLCanvasElement.height')
   @DocsEditable()
-  int get height => _blink.BlinkHTMLCanvasElement.height_Getter(this);
+  int get height => _blink.BlinkHTMLCanvasElement.instance.height_Getter_(this);
 
   /// The height of this canvas element in CSS pixels.
   @DomName('HTMLCanvasElement.height')
   @DocsEditable()
-  void set height(int value) => _blink.BlinkHTMLCanvasElement.height_Setter(this, value);
+  void set height(int value) => _blink.BlinkHTMLCanvasElement.instance.height_Setter_(this, value);
 
   /// The width of this canvas element in CSS pixels.
   @DomName('HTMLCanvasElement.width')
   @DocsEditable()
-  int get width => _blink.BlinkHTMLCanvasElement.width_Getter(this);
+  int get width => _blink.BlinkHTMLCanvasElement.instance.width_Getter_(this);
 
   /// The width of this canvas element in CSS pixels.
   @DomName('HTMLCanvasElement.width')
   @DocsEditable()
-  void set width(int value) => _blink.BlinkHTMLCanvasElement.width_Setter(this, value);
+  void set width(int value) => _blink.BlinkHTMLCanvasElement.instance.width_Setter_(this, value);
 
   @DomName('HTMLCanvasElement.getContext')
   @DocsEditable()
-  Object getContext(String contextId, [Map attrs]) => _blink.BlinkHTMLCanvasElement.getContext_Callback_2(this, contextId, attrs);
+  Object getContext(String contextId, [Map attrs]) => _blink.BlinkHTMLCanvasElement.instance.getContext_Callback_2_(this, contextId, attrs);
 
   @DomName('HTMLCanvasElement.toDataURL')
   @DocsEditable()
-  String _toDataUrl(String type, [num quality]) => _blink.BlinkHTMLCanvasElement.toDataURL_Callback_2(this, type, quality);
+  String _toDataUrl(String type, [num quality]) => _blink.BlinkHTMLCanvasElement.instance.toDataURL_Callback_2_(this, type, quality);
 
   /// Stream of `webglcontextlost` events handled by this [CanvasElement].
   @DomName('HTMLCanvasElement.onwebglcontextlost')
@@ -2424,7 +2424,7 @@
    */
   @DomName('CanvasGradient.addColorStop')
   @DocsEditable()
-  void addColorStop(num offset, String color) => _blink.BlinkCanvasGradient.addColorStop_Callback_2(this, offset, color);
+  void addColorStop(num offset, String color) => _blink.BlinkCanvasGradient.instance.addColorStop_Callback_2_(this, offset, color);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2485,49 +2485,49 @@
   @DomName('CanvasRenderingContext2D.canvas')
   @DocsEditable()
   @Experimental() // untriaged
-  CanvasElement get canvas => _blink.BlinkCanvasRenderingContext2D.canvas_Getter(this);
+  CanvasElement get canvas => _blink.BlinkCanvasRenderingContext2D.instance.canvas_Getter_(this);
 
   @DomName('CanvasRenderingContext2D.currentTransform')
   @DocsEditable()
   @Experimental() // untriaged
-  Matrix get currentTransform => _blink.BlinkCanvasRenderingContext2D.currentTransform_Getter(this);
+  Matrix get currentTransform => _blink.BlinkCanvasRenderingContext2D.instance.currentTransform_Getter_(this);
 
   @DomName('CanvasRenderingContext2D.currentTransform')
   @DocsEditable()
   @Experimental() // untriaged
-  void set currentTransform(Matrix value) => _blink.BlinkCanvasRenderingContext2D.currentTransform_Setter(this, value);
+  void set currentTransform(Matrix value) => _blink.BlinkCanvasRenderingContext2D.instance.currentTransform_Setter_(this, value);
 
   @DomName('CanvasRenderingContext2D.fillStyle')
   @DocsEditable()
-  Object get fillStyle => _blink.BlinkCanvasRenderingContext2D.fillStyle_Getter(this);
+  Object get fillStyle => _blink.BlinkCanvasRenderingContext2D.instance.fillStyle_Getter_(this);
 
   @DomName('CanvasRenderingContext2D.fillStyle')
   @DocsEditable()
-  void set fillStyle(Object value) => _blink.BlinkCanvasRenderingContext2D.fillStyle_Setter(this, value);
+  void set fillStyle(Object value) => _blink.BlinkCanvasRenderingContext2D.instance.fillStyle_Setter_(this, value);
 
   @DomName('CanvasRenderingContext2D.font')
   @DocsEditable()
-  String get font => _blink.BlinkCanvasRenderingContext2D.font_Getter(this);
+  String get font => _blink.BlinkCanvasRenderingContext2D.instance.font_Getter_(this);
 
   @DomName('CanvasRenderingContext2D.font')
   @DocsEditable()
-  void set font(String value) => _blink.BlinkCanvasRenderingContext2D.font_Setter(this, value);
+  void set font(String value) => _blink.BlinkCanvasRenderingContext2D.instance.font_Setter_(this, value);
 
   @DomName('CanvasRenderingContext2D.globalAlpha')
   @DocsEditable()
-  num get globalAlpha => _blink.BlinkCanvasRenderingContext2D.globalAlpha_Getter(this);
+  num get globalAlpha => _blink.BlinkCanvasRenderingContext2D.instance.globalAlpha_Getter_(this);
 
   @DomName('CanvasRenderingContext2D.globalAlpha')
   @DocsEditable()
-  void set globalAlpha(num value) => _blink.BlinkCanvasRenderingContext2D.globalAlpha_Setter(this, value);
+  void set globalAlpha(num value) => _blink.BlinkCanvasRenderingContext2D.instance.globalAlpha_Setter_(this, value);
 
   @DomName('CanvasRenderingContext2D.globalCompositeOperation')
   @DocsEditable()
-  String get globalCompositeOperation => _blink.BlinkCanvasRenderingContext2D.globalCompositeOperation_Getter(this);
+  String get globalCompositeOperation => _blink.BlinkCanvasRenderingContext2D.instance.globalCompositeOperation_Getter_(this);
 
   @DomName('CanvasRenderingContext2D.globalCompositeOperation')
   @DocsEditable()
-  void set globalCompositeOperation(String value) => _blink.BlinkCanvasRenderingContext2D.globalCompositeOperation_Setter(this, value);
+  void set globalCompositeOperation(String value) => _blink.BlinkCanvasRenderingContext2D.instance.globalCompositeOperation_Setter_(this, value);
 
   /**
    * Whether images and patterns on this canvas will be smoothed when this
@@ -2542,7 +2542,7 @@
   @DomName('CanvasRenderingContext2D.imageSmoothingEnabled')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get imageSmoothingEnabled => _blink.BlinkCanvasRenderingContext2D.imageSmoothingEnabled_Getter(this);
+  bool get imageSmoothingEnabled => _blink.BlinkCanvasRenderingContext2D.instance.imageSmoothingEnabled_Getter_(this);
 
   /**
    * Whether images and patterns on this canvas will be smoothed when this
@@ -2557,141 +2557,141 @@
   @DomName('CanvasRenderingContext2D.imageSmoothingEnabled')
   @DocsEditable()
   @Experimental() // untriaged
-  void set imageSmoothingEnabled(bool value) => _blink.BlinkCanvasRenderingContext2D.imageSmoothingEnabled_Setter(this, value);
+  void set imageSmoothingEnabled(bool value) => _blink.BlinkCanvasRenderingContext2D.instance.imageSmoothingEnabled_Setter_(this, value);
 
   @DomName('CanvasRenderingContext2D.lineCap')
   @DocsEditable()
-  String get lineCap => _blink.BlinkCanvasRenderingContext2D.lineCap_Getter(this);
+  String get lineCap => _blink.BlinkCanvasRenderingContext2D.instance.lineCap_Getter_(this);
 
   @DomName('CanvasRenderingContext2D.lineCap')
   @DocsEditable()
-  void set lineCap(String value) => _blink.BlinkCanvasRenderingContext2D.lineCap_Setter(this, value);
+  void set lineCap(String value) => _blink.BlinkCanvasRenderingContext2D.instance.lineCap_Setter_(this, value);
 
   @DomName('CanvasRenderingContext2D.lineDashOffset')
   @DocsEditable()
-  num get lineDashOffset => _blink.BlinkCanvasRenderingContext2D.lineDashOffset_Getter(this);
+  num get lineDashOffset => _blink.BlinkCanvasRenderingContext2D.instance.lineDashOffset_Getter_(this);
 
   @DomName('CanvasRenderingContext2D.lineDashOffset')
   @DocsEditable()
-  void set lineDashOffset(num value) => _blink.BlinkCanvasRenderingContext2D.lineDashOffset_Setter(this, value);
+  void set lineDashOffset(num value) => _blink.BlinkCanvasRenderingContext2D.instance.lineDashOffset_Setter_(this, value);
 
   @DomName('CanvasRenderingContext2D.lineJoin')
   @DocsEditable()
-  String get lineJoin => _blink.BlinkCanvasRenderingContext2D.lineJoin_Getter(this);
+  String get lineJoin => _blink.BlinkCanvasRenderingContext2D.instance.lineJoin_Getter_(this);
 
   @DomName('CanvasRenderingContext2D.lineJoin')
   @DocsEditable()
-  void set lineJoin(String value) => _blink.BlinkCanvasRenderingContext2D.lineJoin_Setter(this, value);
+  void set lineJoin(String value) => _blink.BlinkCanvasRenderingContext2D.instance.lineJoin_Setter_(this, value);
 
   @DomName('CanvasRenderingContext2D.lineWidth')
   @DocsEditable()
-  num get lineWidth => _blink.BlinkCanvasRenderingContext2D.lineWidth_Getter(this);
+  num get lineWidth => _blink.BlinkCanvasRenderingContext2D.instance.lineWidth_Getter_(this);
 
   @DomName('CanvasRenderingContext2D.lineWidth')
   @DocsEditable()
-  void set lineWidth(num value) => _blink.BlinkCanvasRenderingContext2D.lineWidth_Setter(this, value);
+  void set lineWidth(num value) => _blink.BlinkCanvasRenderingContext2D.instance.lineWidth_Setter_(this, value);
 
   @DomName('CanvasRenderingContext2D.miterLimit')
   @DocsEditable()
-  num get miterLimit => _blink.BlinkCanvasRenderingContext2D.miterLimit_Getter(this);
+  num get miterLimit => _blink.BlinkCanvasRenderingContext2D.instance.miterLimit_Getter_(this);
 
   @DomName('CanvasRenderingContext2D.miterLimit')
   @DocsEditable()
-  void set miterLimit(num value) => _blink.BlinkCanvasRenderingContext2D.miterLimit_Setter(this, value);
+  void set miterLimit(num value) => _blink.BlinkCanvasRenderingContext2D.instance.miterLimit_Setter_(this, value);
 
   @DomName('CanvasRenderingContext2D.shadowBlur')
   @DocsEditable()
-  num get shadowBlur => _blink.BlinkCanvasRenderingContext2D.shadowBlur_Getter(this);
+  num get shadowBlur => _blink.BlinkCanvasRenderingContext2D.instance.shadowBlur_Getter_(this);
 
   @DomName('CanvasRenderingContext2D.shadowBlur')
   @DocsEditable()
-  void set shadowBlur(num value) => _blink.BlinkCanvasRenderingContext2D.shadowBlur_Setter(this, value);
+  void set shadowBlur(num value) => _blink.BlinkCanvasRenderingContext2D.instance.shadowBlur_Setter_(this, value);
 
   @DomName('CanvasRenderingContext2D.shadowColor')
   @DocsEditable()
-  String get shadowColor => _blink.BlinkCanvasRenderingContext2D.shadowColor_Getter(this);
+  String get shadowColor => _blink.BlinkCanvasRenderingContext2D.instance.shadowColor_Getter_(this);
 
   @DomName('CanvasRenderingContext2D.shadowColor')
   @DocsEditable()
-  void set shadowColor(String value) => _blink.BlinkCanvasRenderingContext2D.shadowColor_Setter(this, value);
+  void set shadowColor(String value) => _blink.BlinkCanvasRenderingContext2D.instance.shadowColor_Setter_(this, value);
 
   @DomName('CanvasRenderingContext2D.shadowOffsetX')
   @DocsEditable()
-  num get shadowOffsetX => _blink.BlinkCanvasRenderingContext2D.shadowOffsetX_Getter(this);
+  num get shadowOffsetX => _blink.BlinkCanvasRenderingContext2D.instance.shadowOffsetX_Getter_(this);
 
   @DomName('CanvasRenderingContext2D.shadowOffsetX')
   @DocsEditable()
-  void set shadowOffsetX(num value) => _blink.BlinkCanvasRenderingContext2D.shadowOffsetX_Setter(this, value);
+  void set shadowOffsetX(num value) => _blink.BlinkCanvasRenderingContext2D.instance.shadowOffsetX_Setter_(this, value);
 
   @DomName('CanvasRenderingContext2D.shadowOffsetY')
   @DocsEditable()
-  num get shadowOffsetY => _blink.BlinkCanvasRenderingContext2D.shadowOffsetY_Getter(this);
+  num get shadowOffsetY => _blink.BlinkCanvasRenderingContext2D.instance.shadowOffsetY_Getter_(this);
 
   @DomName('CanvasRenderingContext2D.shadowOffsetY')
   @DocsEditable()
-  void set shadowOffsetY(num value) => _blink.BlinkCanvasRenderingContext2D.shadowOffsetY_Setter(this, value);
+  void set shadowOffsetY(num value) => _blink.BlinkCanvasRenderingContext2D.instance.shadowOffsetY_Setter_(this, value);
 
   @DomName('CanvasRenderingContext2D.strokeStyle')
   @DocsEditable()
-  Object get strokeStyle => _blink.BlinkCanvasRenderingContext2D.strokeStyle_Getter(this);
+  Object get strokeStyle => _blink.BlinkCanvasRenderingContext2D.instance.strokeStyle_Getter_(this);
 
   @DomName('CanvasRenderingContext2D.strokeStyle')
   @DocsEditable()
-  void set strokeStyle(Object value) => _blink.BlinkCanvasRenderingContext2D.strokeStyle_Setter(this, value);
+  void set strokeStyle(Object value) => _blink.BlinkCanvasRenderingContext2D.instance.strokeStyle_Setter_(this, value);
 
   @DomName('CanvasRenderingContext2D.textAlign')
   @DocsEditable()
-  String get textAlign => _blink.BlinkCanvasRenderingContext2D.textAlign_Getter(this);
+  String get textAlign => _blink.BlinkCanvasRenderingContext2D.instance.textAlign_Getter_(this);
 
   @DomName('CanvasRenderingContext2D.textAlign')
   @DocsEditable()
-  void set textAlign(String value) => _blink.BlinkCanvasRenderingContext2D.textAlign_Setter(this, value);
+  void set textAlign(String value) => _blink.BlinkCanvasRenderingContext2D.instance.textAlign_Setter_(this, value);
 
   @DomName('CanvasRenderingContext2D.textBaseline')
   @DocsEditable()
-  String get textBaseline => _blink.BlinkCanvasRenderingContext2D.textBaseline_Getter(this);
+  String get textBaseline => _blink.BlinkCanvasRenderingContext2D.instance.textBaseline_Getter_(this);
 
   @DomName('CanvasRenderingContext2D.textBaseline')
   @DocsEditable()
-  void set textBaseline(String value) => _blink.BlinkCanvasRenderingContext2D.textBaseline_Setter(this, value);
+  void set textBaseline(String value) => _blink.BlinkCanvasRenderingContext2D.instance.textBaseline_Setter_(this, value);
 
   void addHitRegion([Map options]) {
     if (options != null) {
-      _blink.BlinkCanvasRenderingContext2D.addHitRegion_Callback_1(this, options);
+      _blink.BlinkCanvasRenderingContext2D.instance.addHitRegion_Callback_1_(this, options);
       return;
     }
-    _blink.BlinkCanvasRenderingContext2D.addHitRegion_Callback(this);
+    _blink.BlinkCanvasRenderingContext2D.instance.addHitRegion_Callback_0_(this);
     return;
   }
 
   @DomName('CanvasRenderingContext2D.beginPath')
   @DocsEditable()
-  void beginPath() => _blink.BlinkCanvasRenderingContext2D.beginPath_Callback(this);
+  void beginPath() => _blink.BlinkCanvasRenderingContext2D.instance.beginPath_Callback_0_(this);
 
   @DomName('CanvasRenderingContext2D.clearHitRegions')
   @DocsEditable()
   @Experimental() // untriaged
-  void clearHitRegions() => _blink.BlinkCanvasRenderingContext2D.clearHitRegions_Callback(this);
+  void clearHitRegions() => _blink.BlinkCanvasRenderingContext2D.instance.clearHitRegions_Callback_0_(this);
 
   @DomName('CanvasRenderingContext2D.clearRect')
   @DocsEditable()
-  void clearRect(num x, num y, num width, num height) => _blink.BlinkCanvasRenderingContext2D.clearRect_Callback_4(this, x, y, width, height);
+  void clearRect(num x, num y, num width, num height) => _blink.BlinkCanvasRenderingContext2D.instance.clearRect_Callback_4_(this, x, y, width, height);
 
   void clip([path_OR_winding, String winding]) {
     if (path_OR_winding == null && winding == null) {
-      _blink.BlinkCanvasRenderingContext2D.clip_Callback(this);
+      _blink.BlinkCanvasRenderingContext2D.instance.clip_Callback_0_(this);
       return;
     }
     if ((path_OR_winding is String) && winding == null) {
-      _blink.BlinkCanvasRenderingContext2D.clip_Callback_1(this, path_OR_winding);
+      _blink.BlinkCanvasRenderingContext2D.instance.clip_Callback_1_(this, path_OR_winding);
       return;
     }
     if ((path_OR_winding is Path2D) && winding == null) {
-      _blink.BlinkCanvasRenderingContext2D.clip_Callback_1(this, path_OR_winding);
+      _blink.BlinkCanvasRenderingContext2D.instance.clip_Callback_1_(this, path_OR_winding);
       return;
     }
     if ((winding is String) && (path_OR_winding is Path2D)) {
-      _blink.BlinkCanvasRenderingContext2D.clip_Callback_2(this, path_OR_winding, winding);
+      _blink.BlinkCanvasRenderingContext2D.instance.clip_Callback_2_(this, path_OR_winding, winding);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -2699,41 +2699,41 @@
 
   @DomName('CanvasRenderingContext2D.createImageData')
   @DocsEditable()
-  ImageData createImageData(num sw, num sh) => _blink.BlinkCanvasRenderingContext2D.createImageData_Callback_2(this, sw, sh);
+  ImageData createImageData(num sw, num sh) => _blink.BlinkCanvasRenderingContext2D.instance.createImageData_Callback_2_(this, sw, sh);
 
   @DomName('CanvasRenderingContext2D.createImageDataFromImageData')
   @DocsEditable()
-  ImageData createImageDataFromImageData(ImageData imagedata) => _blink.BlinkCanvasRenderingContext2D.createImageData_Callback_1(this, imagedata);
+  ImageData createImageDataFromImageData(ImageData imagedata) => _blink.BlinkCanvasRenderingContext2D.instance.createImageData_Callback_1_(this, imagedata);
 
   @DomName('CanvasRenderingContext2D.createLinearGradient')
   @DocsEditable()
-  CanvasGradient createLinearGradient(num x0, num y0, num x1, num y1) => _blink.BlinkCanvasRenderingContext2D.createLinearGradient_Callback_4(this, x0, y0, x1, y1);
+  CanvasGradient createLinearGradient(num x0, num y0, num x1, num y1) => _blink.BlinkCanvasRenderingContext2D.instance.createLinearGradient_Callback_4_(this, x0, y0, x1, y1);
 
   CanvasPattern createPattern(canvas_OR_image, String repetitionType) {
     if ((repetitionType is String || repetitionType == null) && (canvas_OR_image is CanvasElement)) {
-      return _blink.BlinkCanvasRenderingContext2D.createPattern_Callback_2(this, canvas_OR_image, repetitionType);
+      return _blink.BlinkCanvasRenderingContext2D.instance.createPattern_Callback_2_(this, canvas_OR_image, repetitionType);
     }
     if ((repetitionType is String || repetitionType == null) && (canvas_OR_image is VideoElement)) {
-      return _blink.BlinkCanvasRenderingContext2D.createPattern_Callback_2(this, canvas_OR_image, repetitionType);
+      return _blink.BlinkCanvasRenderingContext2D.instance.createPattern_Callback_2_(this, canvas_OR_image, repetitionType);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
   @DomName('CanvasRenderingContext2D.createPatternFromImage')
   @DocsEditable()
-  CanvasPattern createPatternFromImage(ImageElement image, String repetitionType) => _blink.BlinkCanvasRenderingContext2D.createPattern_Callback_2(this, image, repetitionType);
+  CanvasPattern createPatternFromImage(ImageElement image, String repetitionType) => _blink.BlinkCanvasRenderingContext2D.instance.createPattern_Callback_2_(this, image, repetitionType);
 
   @DomName('CanvasRenderingContext2D.createRadialGradient')
   @DocsEditable()
-  CanvasGradient createRadialGradient(num x0, num y0, num r0, num x1, num y1, num r1) => _blink.BlinkCanvasRenderingContext2D.createRadialGradient_Callback_6(this, x0, y0, r0, x1, y1, r1);
+  CanvasGradient createRadialGradient(num x0, num y0, num r0, num x1, num y1, num r1) => _blink.BlinkCanvasRenderingContext2D.instance.createRadialGradient_Callback_6_(this, x0, y0, r0, x1, y1, r1);
 
   void drawFocusIfNeeded(element_OR_path, [Element element]) {
     if ((element_OR_path is Element) && element == null) {
-      _blink.BlinkCanvasRenderingContext2D.drawFocusIfNeeded_Callback_1(this, element_OR_path);
+      _blink.BlinkCanvasRenderingContext2D.instance.drawFocusIfNeeded_Callback_1_(this, element_OR_path);
       return;
     }
     if ((element is Element) && (element_OR_path is Path2D)) {
-      _blink.BlinkCanvasRenderingContext2D.drawFocusIfNeeded_Callback_2(this, element_OR_path, element);
+      _blink.BlinkCanvasRenderingContext2D.instance.drawFocusIfNeeded_Callback_2_(this, element_OR_path, element);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -2741,51 +2741,51 @@
 
   void _drawImage(canvas_OR_image_OR_imageBitmap_OR_video, num sx_OR_x, num sy_OR_y, [num sw_OR_width, num height_OR_sh, num dx, num dy, num dw, num dh]) {
     if ((sy_OR_y is num) && (sx_OR_x is num) && (canvas_OR_image_OR_imageBitmap_OR_video is ImageElement) && sw_OR_width == null && height_OR_sh == null && dx == null && dy == null && dw == null && dh == null) {
-      _blink.BlinkCanvasRenderingContext2D.drawImage_Callback_3(this, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y);
+      _blink.BlinkCanvasRenderingContext2D.instance.drawImage_Callback_3_(this, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y);
       return;
     }
     if ((height_OR_sh is num) && (sw_OR_width is num) && (sy_OR_y is num) && (sx_OR_x is num) && (canvas_OR_image_OR_imageBitmap_OR_video is ImageElement) && dx == null && dy == null && dw == null && dh == null) {
-      _blink.BlinkCanvasRenderingContext2D.drawImage_Callback_5(this, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
+      _blink.BlinkCanvasRenderingContext2D.instance.drawImage_Callback_5_(this, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
       return;
     }
     if ((dh is num) && (dw is num) && (dy is num) && (dx is num) && (height_OR_sh is num) && (sw_OR_width is num) && (sy_OR_y is num) && (sx_OR_x is num) && (canvas_OR_image_OR_imageBitmap_OR_video is ImageElement)) {
-      _blink.BlinkCanvasRenderingContext2D.drawImage_Callback_9(this, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
+      _blink.BlinkCanvasRenderingContext2D.instance.drawImage_Callback_9_(this, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
       return;
     }
     if ((sy_OR_y is num) && (sx_OR_x is num) && (canvas_OR_image_OR_imageBitmap_OR_video is CanvasElement) && sw_OR_width == null && height_OR_sh == null && dx == null && dy == null && dw == null && dh == null) {
-      _blink.BlinkCanvasRenderingContext2D.drawImage_Callback_3(this, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y);
+      _blink.BlinkCanvasRenderingContext2D.instance.drawImage_Callback_3_(this, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y);
       return;
     }
     if ((height_OR_sh is num) && (sw_OR_width is num) && (sy_OR_y is num) && (sx_OR_x is num) && (canvas_OR_image_OR_imageBitmap_OR_video is CanvasElement) && dx == null && dy == null && dw == null && dh == null) {
-      _blink.BlinkCanvasRenderingContext2D.drawImage_Callback_5(this, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
+      _blink.BlinkCanvasRenderingContext2D.instance.drawImage_Callback_5_(this, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
       return;
     }
     if ((dh is num) && (dw is num) && (dy is num) && (dx is num) && (height_OR_sh is num) && (sw_OR_width is num) && (sy_OR_y is num) && (sx_OR_x is num) && (canvas_OR_image_OR_imageBitmap_OR_video is CanvasElement)) {
-      _blink.BlinkCanvasRenderingContext2D.drawImage_Callback_9(this, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
+      _blink.BlinkCanvasRenderingContext2D.instance.drawImage_Callback_9_(this, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
       return;
     }
     if ((sy_OR_y is num) && (sx_OR_x is num) && (canvas_OR_image_OR_imageBitmap_OR_video is VideoElement) && sw_OR_width == null && height_OR_sh == null && dx == null && dy == null && dw == null && dh == null) {
-      _blink.BlinkCanvasRenderingContext2D.drawImage_Callback_3(this, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y);
+      _blink.BlinkCanvasRenderingContext2D.instance.drawImage_Callback_3_(this, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y);
       return;
     }
     if ((height_OR_sh is num) && (sw_OR_width is num) && (sy_OR_y is num) && (sx_OR_x is num) && (canvas_OR_image_OR_imageBitmap_OR_video is VideoElement) && dx == null && dy == null && dw == null && dh == null) {
-      _blink.BlinkCanvasRenderingContext2D.drawImage_Callback_5(this, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
+      _blink.BlinkCanvasRenderingContext2D.instance.drawImage_Callback_5_(this, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
       return;
     }
     if ((dh is num) && (dw is num) && (dy is num) && (dx is num) && (height_OR_sh is num) && (sw_OR_width is num) && (sy_OR_y is num) && (sx_OR_x is num) && (canvas_OR_image_OR_imageBitmap_OR_video is VideoElement)) {
-      _blink.BlinkCanvasRenderingContext2D.drawImage_Callback_9(this, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
+      _blink.BlinkCanvasRenderingContext2D.instance.drawImage_Callback_9_(this, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
       return;
     }
     if ((sy_OR_y is num) && (sx_OR_x is num) && (canvas_OR_image_OR_imageBitmap_OR_video is ImageBitmap) && sw_OR_width == null && height_OR_sh == null && dx == null && dy == null && dw == null && dh == null) {
-      _blink.BlinkCanvasRenderingContext2D.drawImage_Callback_3(this, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y);
+      _blink.BlinkCanvasRenderingContext2D.instance.drawImage_Callback_3_(this, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y);
       return;
     }
     if ((height_OR_sh is num) && (sw_OR_width is num) && (sy_OR_y is num) && (sx_OR_x is num) && (canvas_OR_image_OR_imageBitmap_OR_video is ImageBitmap) && dx == null && dy == null && dw == null && dh == null) {
-      _blink.BlinkCanvasRenderingContext2D.drawImage_Callback_5(this, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
+      _blink.BlinkCanvasRenderingContext2D.instance.drawImage_Callback_5_(this, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
       return;
     }
     if ((dh is num) && (dw is num) && (dy is num) && (dx is num) && (height_OR_sh is num) && (sw_OR_width is num) && (sy_OR_y is num) && (sx_OR_x is num) && (canvas_OR_image_OR_imageBitmap_OR_video is ImageBitmap)) {
-      _blink.BlinkCanvasRenderingContext2D.drawImage_Callback_9(this, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
+      _blink.BlinkCanvasRenderingContext2D.instance.drawImage_Callback_9_(this, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -2793,19 +2793,19 @@
 
   void fill([path_OR_winding, String winding]) {
     if (path_OR_winding == null && winding == null) {
-      _blink.BlinkCanvasRenderingContext2D.fill_Callback(this);
+      _blink.BlinkCanvasRenderingContext2D.instance.fill_Callback_0_(this);
       return;
     }
     if ((path_OR_winding is String) && winding == null) {
-      _blink.BlinkCanvasRenderingContext2D.fill_Callback_1(this, path_OR_winding);
+      _blink.BlinkCanvasRenderingContext2D.instance.fill_Callback_1_(this, path_OR_winding);
       return;
     }
     if ((path_OR_winding is Path2D) && winding == null) {
-      _blink.BlinkCanvasRenderingContext2D.fill_Callback_1(this, path_OR_winding);
+      _blink.BlinkCanvasRenderingContext2D.instance.fill_Callback_1_(this, path_OR_winding);
       return;
     }
     if ((winding is String) && (path_OR_winding is Path2D)) {
-      _blink.BlinkCanvasRenderingContext2D.fill_Callback_2(this, path_OR_winding, winding);
+      _blink.BlinkCanvasRenderingContext2D.instance.fill_Callback_2_(this, path_OR_winding, winding);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -2813,14 +2813,14 @@
 
   @DomName('CanvasRenderingContext2D.fillRect')
   @DocsEditable()
-  void fillRect(num x, num y, num width, num height) => _blink.BlinkCanvasRenderingContext2D.fillRect_Callback_4(this, x, y, width, height);
+  void fillRect(num x, num y, num width, num height) => _blink.BlinkCanvasRenderingContext2D.instance.fillRect_Callback_4_(this, x, y, width, height);
 
   void fillText(String text, num x, num y, [num maxWidth]) {
     if (maxWidth != null) {
-      _blink.BlinkCanvasRenderingContext2D.fillText_Callback_4(this, text, x, y, maxWidth);
+      _blink.BlinkCanvasRenderingContext2D.instance.fillText_Callback_4_(this, text, x, y, maxWidth);
       return;
     }
-    _blink.BlinkCanvasRenderingContext2D.fillText_Callback_3(this, text, x, y);
+    _blink.BlinkCanvasRenderingContext2D.instance.fillText_Callback_3_(this, text, x, y);
     return;
   }
 
@@ -2828,58 +2828,58 @@
   @DocsEditable()
   // http://wiki.whatwg.org/wiki/CanvasOpaque#Suggested_IDL
   @Experimental()
-  Canvas2DContextAttributes getContextAttributes() => _blink.BlinkCanvasRenderingContext2D.getContextAttributes_Callback(this);
+  Canvas2DContextAttributes getContextAttributes() => _blink.BlinkCanvasRenderingContext2D.instance.getContextAttributes_Callback_0_(this);
 
   @DomName('CanvasRenderingContext2D.getImageData')
   @DocsEditable()
-  ImageData getImageData(num sx, num sy, num sw, num sh) => _blink.BlinkCanvasRenderingContext2D.getImageData_Callback_4(this, sx, sy, sw, sh);
+  ImageData getImageData(num sx, num sy, num sw, num sh) => _blink.BlinkCanvasRenderingContext2D.instance.getImageData_Callback_4_(this, sx, sy, sw, sh);
 
   @DomName('CanvasRenderingContext2D.getLineDash')
   @DocsEditable()
-  List<num> _getLineDash() => _blink.BlinkCanvasRenderingContext2D.getLineDash_Callback(this);
+  List<num> _getLineDash() => _blink.BlinkCanvasRenderingContext2D.instance.getLineDash_Callback_0_(this);
 
   @DomName('CanvasRenderingContext2D.isContextLost')
   @DocsEditable()
   @Experimental() // untriaged
-  bool isContextLost() => _blink.BlinkCanvasRenderingContext2D.isContextLost_Callback(this);
+  bool isContextLost() => _blink.BlinkCanvasRenderingContext2D.instance.isContextLost_Callback_0_(this);
 
   bool isPointInPath(path_OR_x, num x_OR_y, [winding_OR_y, String winding]) {
     if ((x_OR_y is num) && (path_OR_x is num) && winding_OR_y == null && winding == null) {
-      return _blink.BlinkCanvasRenderingContext2D.isPointInPath_Callback_2(this, path_OR_x, x_OR_y);
+      return _blink.BlinkCanvasRenderingContext2D.instance.isPointInPath_Callback_2_(this, path_OR_x, x_OR_y);
     }
     if ((winding_OR_y is String) && (x_OR_y is num) && (path_OR_x is num) && winding == null) {
-      return _blink.BlinkCanvasRenderingContext2D.isPointInPath_Callback_3(this, path_OR_x, x_OR_y, winding_OR_y);
+      return _blink.BlinkCanvasRenderingContext2D.instance.isPointInPath_Callback_3_(this, path_OR_x, x_OR_y, winding_OR_y);
     }
     if ((winding_OR_y is num) && (x_OR_y is num) && (path_OR_x is Path2D) && winding == null) {
-      return _blink.BlinkCanvasRenderingContext2D.isPointInPath_Callback_3(this, path_OR_x, x_OR_y, winding_OR_y);
+      return _blink.BlinkCanvasRenderingContext2D.instance.isPointInPath_Callback_3_(this, path_OR_x, x_OR_y, winding_OR_y);
     }
     if ((winding is String) && (winding_OR_y is num) && (x_OR_y is num) && (path_OR_x is Path2D)) {
-      return _blink.BlinkCanvasRenderingContext2D.isPointInPath_Callback_4(this, path_OR_x, x_OR_y, winding_OR_y, winding);
+      return _blink.BlinkCanvasRenderingContext2D.instance.isPointInPath_Callback_4_(this, path_OR_x, x_OR_y, winding_OR_y, winding);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
   bool isPointInStroke(path_OR_x, num x_OR_y, [num y]) {
     if ((x_OR_y is num) && (path_OR_x is num) && y == null) {
-      return _blink.BlinkCanvasRenderingContext2D.isPointInStroke_Callback_2(this, path_OR_x, x_OR_y);
+      return _blink.BlinkCanvasRenderingContext2D.instance.isPointInStroke_Callback_2_(this, path_OR_x, x_OR_y);
     }
     if ((y is num) && (x_OR_y is num) && (path_OR_x is Path2D)) {
-      return _blink.BlinkCanvasRenderingContext2D.isPointInStroke_Callback_3(this, path_OR_x, x_OR_y, y);
+      return _blink.BlinkCanvasRenderingContext2D.instance.isPointInStroke_Callback_3_(this, path_OR_x, x_OR_y, y);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
   @DomName('CanvasRenderingContext2D.measureText')
   @DocsEditable()
-  TextMetrics measureText(String text) => _blink.BlinkCanvasRenderingContext2D.measureText_Callback_1(this, text);
+  TextMetrics measureText(String text) => _blink.BlinkCanvasRenderingContext2D.instance.measureText_Callback_1_(this, text);
 
   void putImageData(ImageData imagedata, num dx, num dy, [num dirtyX, num dirtyY, num dirtyWidth, num dirtyHeight]) {
     if ((dy is num) && (dx is num) && (imagedata is ImageData) && dirtyX == null && dirtyY == null && dirtyWidth == null && dirtyHeight == null) {
-      _blink.BlinkCanvasRenderingContext2D.putImageData_Callback_3(this, imagedata, dx, dy);
+      _blink.BlinkCanvasRenderingContext2D.instance.putImageData_Callback_3_(this, imagedata, dx, dy);
       return;
     }
     if ((dirtyHeight is num) && (dirtyWidth is num) && (dirtyY is num) && (dirtyX is num) && (dy is num) && (dx is num) && (imagedata is ImageData)) {
-      _blink.BlinkCanvasRenderingContext2D.putImageData_Callback_7(this, imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight);
+      _blink.BlinkCanvasRenderingContext2D.instance.putImageData_Callback_7_(this, imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -2888,53 +2888,53 @@
   @DomName('CanvasRenderingContext2D.removeHitRegion')
   @DocsEditable()
   @Experimental() // untriaged
-  void removeHitRegion(String id) => _blink.BlinkCanvasRenderingContext2D.removeHitRegion_Callback_1(this, id);
+  void removeHitRegion(String id) => _blink.BlinkCanvasRenderingContext2D.instance.removeHitRegion_Callback_1_(this, id);
 
   @DomName('CanvasRenderingContext2D.resetTransform')
   @DocsEditable()
   @Experimental() // untriaged
-  void resetTransform() => _blink.BlinkCanvasRenderingContext2D.resetTransform_Callback(this);
+  void resetTransform() => _blink.BlinkCanvasRenderingContext2D.instance.resetTransform_Callback_0_(this);
 
   @DomName('CanvasRenderingContext2D.restore')
   @DocsEditable()
-  void restore() => _blink.BlinkCanvasRenderingContext2D.restore_Callback(this);
+  void restore() => _blink.BlinkCanvasRenderingContext2D.instance.restore_Callback_0_(this);
 
   @DomName('CanvasRenderingContext2D.rotate')
   @DocsEditable()
-  void rotate(num angle) => _blink.BlinkCanvasRenderingContext2D.rotate_Callback_1(this, angle);
+  void rotate(num angle) => _blink.BlinkCanvasRenderingContext2D.instance.rotate_Callback_1_(this, angle);
 
   @DomName('CanvasRenderingContext2D.save')
   @DocsEditable()
-  void save() => _blink.BlinkCanvasRenderingContext2D.save_Callback(this);
+  void save() => _blink.BlinkCanvasRenderingContext2D.instance.save_Callback_0_(this);
 
   @DomName('CanvasRenderingContext2D.scale')
   @DocsEditable()
-  void scale(num x, num y) => _blink.BlinkCanvasRenderingContext2D.scale_Callback_2(this, x, y);
+  void scale(num x, num y) => _blink.BlinkCanvasRenderingContext2D.instance.scale_Callback_2_(this, x, y);
 
   void scrollPathIntoView([Path2D path]) {
     if (path != null) {
-      _blink.BlinkCanvasRenderingContext2D.scrollPathIntoView_Callback_1(this, path);
+      _blink.BlinkCanvasRenderingContext2D.instance.scrollPathIntoView_Callback_1_(this, path);
       return;
     }
-    _blink.BlinkCanvasRenderingContext2D.scrollPathIntoView_Callback(this);
+    _blink.BlinkCanvasRenderingContext2D.instance.scrollPathIntoView_Callback_0_(this);
     return;
   }
 
   @DomName('CanvasRenderingContext2D.setLineDash')
   @DocsEditable()
-  void setLineDash(List<num> dash) => _blink.BlinkCanvasRenderingContext2D.setLineDash_Callback_1(this, dash);
+  void setLineDash(List<num> dash) => _blink.BlinkCanvasRenderingContext2D.instance.setLineDash_Callback_1_(this, dash);
 
   @DomName('CanvasRenderingContext2D.setTransform')
   @DocsEditable()
-  void setTransform(num a, num b, num c, num d, num e, num f) => _blink.BlinkCanvasRenderingContext2D.setTransform_Callback_6(this, a, b, c, d, e, f);
+  void setTransform(num a, num b, num c, num d, num e, num f) => _blink.BlinkCanvasRenderingContext2D.instance.setTransform_Callback_6_(this, a, b, c, d, e, f);
 
   void stroke([Path2D path]) {
     if (path == null) {
-      _blink.BlinkCanvasRenderingContext2D.stroke_Callback(this);
+      _blink.BlinkCanvasRenderingContext2D.instance.stroke_Callback_0_(this);
       return;
     }
     if ((path is Path2D)) {
-      _blink.BlinkCanvasRenderingContext2D.stroke_Callback_1(this, path);
+      _blink.BlinkCanvasRenderingContext2D.instance.stroke_Callback_1_(this, path);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -2942,61 +2942,61 @@
 
   @DomName('CanvasRenderingContext2D.strokeRect')
   @DocsEditable()
-  void strokeRect(num x, num y, num width, num height) => _blink.BlinkCanvasRenderingContext2D.strokeRect_Callback_4(this, x, y, width, height);
+  void strokeRect(num x, num y, num width, num height) => _blink.BlinkCanvasRenderingContext2D.instance.strokeRect_Callback_4_(this, x, y, width, height);
 
   void strokeText(String text, num x, num y, [num maxWidth]) {
     if (maxWidth != null) {
-      _blink.BlinkCanvasRenderingContext2D.strokeText_Callback_4(this, text, x, y, maxWidth);
+      _blink.BlinkCanvasRenderingContext2D.instance.strokeText_Callback_4_(this, text, x, y, maxWidth);
       return;
     }
-    _blink.BlinkCanvasRenderingContext2D.strokeText_Callback_3(this, text, x, y);
+    _blink.BlinkCanvasRenderingContext2D.instance.strokeText_Callback_3_(this, text, x, y);
     return;
   }
 
   @DomName('CanvasRenderingContext2D.transform')
   @DocsEditable()
-  void transform(num a, num b, num c, num d, num e, num f) => _blink.BlinkCanvasRenderingContext2D.transform_Callback_6(this, a, b, c, d, e, f);
+  void transform(num a, num b, num c, num d, num e, num f) => _blink.BlinkCanvasRenderingContext2D.instance.transform_Callback_6_(this, a, b, c, d, e, f);
 
   @DomName('CanvasRenderingContext2D.translate')
   @DocsEditable()
-  void translate(num x, num y) => _blink.BlinkCanvasRenderingContext2D.translate_Callback_2(this, x, y);
+  void translate(num x, num y) => _blink.BlinkCanvasRenderingContext2D.instance.translate_Callback_2_(this, x, y);
 
   @DomName('CanvasRenderingContext2D.arc')
   @DocsEditable()
-  void _arc(num x, num y, num radius, num startAngle, num endAngle, bool anticlockwise) => _blink.BlinkCanvasRenderingContext2D.arc_Callback_6(this, x, y, radius, startAngle, endAngle, anticlockwise);
+  void _arc(num x, num y, num radius, num startAngle, num endAngle, bool anticlockwise) => _blink.BlinkCanvasRenderingContext2D.instance.arc_Callback_6_(this, x, y, radius, startAngle, endAngle, anticlockwise);
 
   @DomName('CanvasRenderingContext2D.arcTo')
   @DocsEditable()
-  void arcTo(num x1, num y1, num x2, num y2, num radius) => _blink.BlinkCanvasRenderingContext2D.arcTo_Callback_5(this, x1, y1, x2, y2, radius);
+  void arcTo(num x1, num y1, num x2, num y2, num radius) => _blink.BlinkCanvasRenderingContext2D.instance.arcTo_Callback_5_(this, x1, y1, x2, y2, radius);
 
   @DomName('CanvasRenderingContext2D.bezierCurveTo')
   @DocsEditable()
-  void bezierCurveTo(num cp1x, num cp1y, num cp2x, num cp2y, num x, num y) => _blink.BlinkCanvasRenderingContext2D.bezierCurveTo_Callback_6(this, cp1x, cp1y, cp2x, cp2y, x, y);
+  void bezierCurveTo(num cp1x, num cp1y, num cp2x, num cp2y, num x, num y) => _blink.BlinkCanvasRenderingContext2D.instance.bezierCurveTo_Callback_6_(this, cp1x, cp1y, cp2x, cp2y, x, y);
 
   @DomName('CanvasRenderingContext2D.closePath')
   @DocsEditable()
-  void closePath() => _blink.BlinkCanvasRenderingContext2D.closePath_Callback(this);
+  void closePath() => _blink.BlinkCanvasRenderingContext2D.instance.closePath_Callback_0_(this);
 
   @DomName('CanvasRenderingContext2D.ellipse')
   @DocsEditable()
   @Experimental() // untriaged
-  void ellipse(num x, num y, num radiusX, num radiusY, num rotation, num startAngle, num endAngle, bool anticlockwise) => _blink.BlinkCanvasRenderingContext2D.ellipse_Callback_8(this, x, y, radiusX, radiusY, rotation, startAngle, endAngle, anticlockwise);
+  void ellipse(num x, num y, num radiusX, num radiusY, num rotation, num startAngle, num endAngle, bool anticlockwise) => _blink.BlinkCanvasRenderingContext2D.instance.ellipse_Callback_8_(this, x, y, radiusX, radiusY, rotation, startAngle, endAngle, anticlockwise);
 
   @DomName('CanvasRenderingContext2D.lineTo')
   @DocsEditable()
-  void lineTo(num x, num y) => _blink.BlinkCanvasRenderingContext2D.lineTo_Callback_2(this, x, y);
+  void lineTo(num x, num y) => _blink.BlinkCanvasRenderingContext2D.instance.lineTo_Callback_2_(this, x, y);
 
   @DomName('CanvasRenderingContext2D.moveTo')
   @DocsEditable()
-  void moveTo(num x, num y) => _blink.BlinkCanvasRenderingContext2D.moveTo_Callback_2(this, x, y);
+  void moveTo(num x, num y) => _blink.BlinkCanvasRenderingContext2D.instance.moveTo_Callback_2_(this, x, y);
 
   @DomName('CanvasRenderingContext2D.quadraticCurveTo')
   @DocsEditable()
-  void quadraticCurveTo(num cpx, num cpy, num x, num y) => _blink.BlinkCanvasRenderingContext2D.quadraticCurveTo_Callback_4(this, cpx, cpy, x, y);
+  void quadraticCurveTo(num cpx, num cpy, num x, num y) => _blink.BlinkCanvasRenderingContext2D.instance.quadraticCurveTo_Callback_4_(this, cpx, cpy, x, y);
 
   @DomName('CanvasRenderingContext2D.rect')
   @DocsEditable()
-  void rect(num x, num y, num width, num height) => _blink.BlinkCanvasRenderingContext2D.rect_Callback_4(this, x, y, width, height);
+  void rect(num x, num y, num width, num height) => _blink.BlinkCanvasRenderingContext2D.instance.rect_Callback_4_(this, x, y, width, height);
 
 
   /**
@@ -3248,43 +3248,43 @@
 
   @DomName('CharacterData.data')
   @DocsEditable()
-  String get data => _blink.BlinkCharacterData.data_Getter(this);
+  String get data => _blink.BlinkCharacterData.instance.data_Getter_(this);
 
   @DomName('CharacterData.data')
   @DocsEditable()
-  void set data(String value) => _blink.BlinkCharacterData.data_Setter(this, value);
+  void set data(String value) => _blink.BlinkCharacterData.instance.data_Setter_(this, value);
 
   @DomName('CharacterData.length')
   @DocsEditable()
-  int get length => _blink.BlinkCharacterData.length_Getter(this);
+  int get length => _blink.BlinkCharacterData.instance.length_Getter_(this);
 
   @DomName('CharacterData.appendData')
   @DocsEditable()
-  void appendData(String data) => _blink.BlinkCharacterData.appendData_Callback_1(this, data);
+  void appendData(String data) => _blink.BlinkCharacterData.instance.appendData_Callback_1_(this, data);
 
   @DomName('CharacterData.deleteData')
   @DocsEditable()
-  void deleteData(int offset, int length) => _blink.BlinkCharacterData.deleteData_Callback_2(this, offset, length);
+  void deleteData(int offset, int length) => _blink.BlinkCharacterData.instance.deleteData_Callback_2_(this, offset, length);
 
   @DomName('CharacterData.insertData')
   @DocsEditable()
-  void insertData(int offset, String data) => _blink.BlinkCharacterData.insertData_Callback_2(this, offset, data);
+  void insertData(int offset, String data) => _blink.BlinkCharacterData.instance.insertData_Callback_2_(this, offset, data);
 
   @DomName('CharacterData.replaceData')
   @DocsEditable()
-  void replaceData(int offset, int length, String data) => _blink.BlinkCharacterData.replaceData_Callback_3(this, offset, length, data);
+  void replaceData(int offset, int length, String data) => _blink.BlinkCharacterData.instance.replaceData_Callback_3_(this, offset, length, data);
 
   @DomName('CharacterData.substringData')
   @DocsEditable()
-  String substringData(int offset, int length) => _blink.BlinkCharacterData.substringData_Callback_2(this, offset, length);
+  String substringData(int offset, int length) => _blink.BlinkCharacterData.instance.substringData_Callback_2_(this, offset, length);
 
   @DomName('CharacterData.nextElementSibling')
   @DocsEditable()
-  Element get nextElementSibling => _blink.BlinkCharacterData.nextElementSibling_Getter(this);
+  Element get nextElementSibling => _blink.BlinkCharacterData.instance.nextElementSibling_Getter_(this);
 
   @DomName('CharacterData.previousElementSibling')
   @DocsEditable()
-  Element get previousElementSibling => _blink.BlinkCharacterData.previousElementSibling_Getter(this);
+  Element get previousElementSibling => _blink.BlinkCharacterData.instance.previousElementSibling_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3304,17 +3304,17 @@
   @DomName('ChildNode.nextElementSibling')
   @DocsEditable()
   @Experimental() // untriaged
-  Element get nextElementSibling => _blink.BlinkChildNode.nextElementSibling_Getter(this);
+  Element get nextElementSibling;
 
   @DomName('ChildNode.previousElementSibling')
   @DocsEditable()
   @Experimental() // untriaged
-  Element get previousElementSibling => _blink.BlinkChildNode.previousElementSibling_Getter(this);
+  Element get previousElementSibling;
 
   @DomName('ChildNode.remove')
   @DocsEditable()
   @Experimental() // untriaged
-  void remove() => _blink.BlinkChildNode.remove_Callback(this);
+  void remove();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3334,7 +3334,7 @@
   @DomName('CircularRegion.CircularRegion')
   @DocsEditable()
   factory CircularRegion(Map init) {
-    return _blink.BlinkCircularRegion.constructorCallback_1(init);
+    return _blink.BlinkCircularRegion.instance.constructorCallback_1_(init);
   }
 
   @DomName('CircularRegion.MAX_RADIUS')
@@ -3350,17 +3350,17 @@
   @DomName('CircularRegion.latitude')
   @DocsEditable()
   @Experimental() // untriaged
-  double get latitude => _blink.BlinkCircularRegion.latitude_Getter(this);
+  double get latitude => _blink.BlinkCircularRegion.instance.latitude_Getter_(this);
 
   @DomName('CircularRegion.longitude')
   @DocsEditable()
   @Experimental() // untriaged
-  double get longitude => _blink.BlinkCircularRegion.longitude_Getter(this);
+  double get longitude => _blink.BlinkCircularRegion.instance.longitude_Getter_(this);
 
   @DomName('CircularRegion.radius')
   @DocsEditable()
   @Experimental() // untriaged
-  double get radius => _blink.BlinkCircularRegion.radius_Getter(this);
+  double get radius => _blink.BlinkCircularRegion.instance.radius_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3378,15 +3378,15 @@
 
   @DomName('CloseEvent.code')
   @DocsEditable()
-  int get code => _blink.BlinkCloseEvent.code_Getter(this);
+  int get code => _blink.BlinkCloseEvent.instance.code_Getter_(this);
 
   @DomName('CloseEvent.reason')
   @DocsEditable()
-  String get reason => _blink.BlinkCloseEvent.reason_Getter(this);
+  String get reason => _blink.BlinkCloseEvent.instance.reason_Getter_(this);
 
   @DomName('CloseEvent.wasClean')
   @DocsEditable()
-  bool get wasClean => _blink.BlinkCloseEvent.wasClean_Getter(this);
+  bool get wasClean => _blink.BlinkCloseEvent.instance.wasClean_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3404,9 +3404,9 @@
   @DocsEditable()
   factory Comment([String data]) {
     if (data != null) {
-      return _blink.BlinkComment.constructorCallback_1(data);
+      return _blink.BlinkComment.instance.constructorCallback_1_(data);
     }
-    return _blink.BlinkComment.constructorCallback();
+    return _blink.BlinkComment.instance.constructorCallback_0_();
   }
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -3434,25 +3434,25 @@
   @DomName('CompositionEvent.activeSegmentEnd')
   @DocsEditable()
   @Experimental() // untriaged
-  int get activeSegmentEnd => _blink.BlinkCompositionEvent.activeSegmentEnd_Getter(this);
+  int get activeSegmentEnd => _blink.BlinkCompositionEvent.instance.activeSegmentEnd_Getter_(this);
 
   @DomName('CompositionEvent.activeSegmentStart')
   @DocsEditable()
   @Experimental() // untriaged
-  int get activeSegmentStart => _blink.BlinkCompositionEvent.activeSegmentStart_Getter(this);
+  int get activeSegmentStart => _blink.BlinkCompositionEvent.instance.activeSegmentStart_Getter_(this);
 
   @DomName('CompositionEvent.data')
   @DocsEditable()
-  String get data => _blink.BlinkCompositionEvent.data_Getter(this);
+  String get data => _blink.BlinkCompositionEvent.instance.data_Getter_(this);
 
   @DomName('CompositionEvent.getSegments')
   @DocsEditable()
   @Experimental() // untriaged
-  List<int> getSegments() => _blink.BlinkCompositionEvent.getSegments_Callback(this);
+  List<int> getSegments() => _blink.BlinkCompositionEvent.instance.getSegments_Callback_0_(this);
 
   @DomName('CompositionEvent.initCompositionEvent')
   @DocsEditable()
-  void _initCompositionEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Window viewArg, String dataArg) => _blink.BlinkCompositionEvent.initCompositionEvent_Callback_5(this, typeArg, canBubbleArg, cancelableArg, viewArg, dataArg);
+  void _initCompositionEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Window viewArg, String dataArg) => _blink.BlinkCompositionEvent.instance.initCompositionEvent_Callback_5_(this, typeArg, canBubbleArg, cancelableArg, viewArg, dataArg);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3471,7 +3471,7 @@
   @DomName('Console.memory')
   @DocsEditable()
   @Experimental()
-  MemoryInfo get memory => _blink.BlinkConsole.memory_Getter(this);
+  MemoryInfo get memory => _blink.BlinkConsole.instance.memory_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3491,117 +3491,117 @@
   @DomName('ConsoleBase.assertCondition')
   @DocsEditable()
   @Experimental() // untriaged
-  void assertCondition(bool condition, Object arg) => _blink.BlinkConsoleBase.assert_Callback_2(this, condition, arg);
+  void assertCondition(bool condition, Object arg) => _blink.BlinkConsoleBase.instance.assert_Callback_2_(this, condition, arg);
 
   @DomName('ConsoleBase.clear')
   @DocsEditable()
   @Experimental() // untriaged
-  void clear(Object arg) => _blink.BlinkConsoleBase.clear_Callback_1(this, arg);
+  void clear(Object arg) => _blink.BlinkConsoleBase.instance.clear_Callback_1_(this, arg);
 
   @DomName('ConsoleBase.count')
   @DocsEditable()
   @Experimental() // untriaged
-  void count(Object arg) => _blink.BlinkConsoleBase.count_Callback_1(this, arg);
+  void count(Object arg) => _blink.BlinkConsoleBase.instance.count_Callback_1_(this, arg);
 
   @DomName('ConsoleBase.debug')
   @DocsEditable()
   @Experimental() // untriaged
-  void debug(Object arg) => _blink.BlinkConsoleBase.debug_Callback_1(this, arg);
+  void debug(Object arg) => _blink.BlinkConsoleBase.instance.debug_Callback_1_(this, arg);
 
   @DomName('ConsoleBase.dir')
   @DocsEditable()
   @Experimental() // untriaged
-  void dir(Object arg) => _blink.BlinkConsoleBase.dir_Callback_1(this, arg);
+  void dir(Object arg) => _blink.BlinkConsoleBase.instance.dir_Callback_1_(this, arg);
 
   @DomName('ConsoleBase.dirxml')
   @DocsEditable()
   @Experimental() // untriaged
-  void dirxml(Object arg) => _blink.BlinkConsoleBase.dirxml_Callback_1(this, arg);
+  void dirxml(Object arg) => _blink.BlinkConsoleBase.instance.dirxml_Callback_1_(this, arg);
 
   @DomName('ConsoleBase.error')
   @DocsEditable()
   @Experimental() // untriaged
-  void error(Object arg) => _blink.BlinkConsoleBase.error_Callback_1(this, arg);
+  void error(Object arg) => _blink.BlinkConsoleBase.instance.error_Callback_1_(this, arg);
 
   @DomName('ConsoleBase.group')
   @DocsEditable()
   @Experimental() // untriaged
-  void group(Object arg) => _blink.BlinkConsoleBase.group_Callback_1(this, arg);
+  void group(Object arg) => _blink.BlinkConsoleBase.instance.group_Callback_1_(this, arg);
 
   @DomName('ConsoleBase.groupCollapsed')
   @DocsEditable()
   @Experimental() // untriaged
-  void groupCollapsed(Object arg) => _blink.BlinkConsoleBase.groupCollapsed_Callback_1(this, arg);
+  void groupCollapsed(Object arg) => _blink.BlinkConsoleBase.instance.groupCollapsed_Callback_1_(this, arg);
 
   @DomName('ConsoleBase.groupEnd')
   @DocsEditable()
   @Experimental() // untriaged
-  void groupEnd() => _blink.BlinkConsoleBase.groupEnd_Callback(this);
+  void groupEnd() => _blink.BlinkConsoleBase.instance.groupEnd_Callback_0_(this);
 
   @DomName('ConsoleBase.info')
   @DocsEditable()
   @Experimental() // untriaged
-  void info(Object arg) => _blink.BlinkConsoleBase.info_Callback_1(this, arg);
+  void info(Object arg) => _blink.BlinkConsoleBase.instance.info_Callback_1_(this, arg);
 
   @DomName('ConsoleBase.log')
   @DocsEditable()
   @Experimental() // untriaged
-  void log(Object arg) => _blink.BlinkConsoleBase.log_Callback_1(this, arg);
+  void log(Object arg) => _blink.BlinkConsoleBase.instance.log_Callback_1_(this, arg);
 
   @DomName('ConsoleBase.markTimeline')
   @DocsEditable()
   @Experimental() // untriaged
-  void markTimeline(String title) => _blink.BlinkConsoleBase.markTimeline_Callback_1(this, title);
+  void markTimeline(String title) => _blink.BlinkConsoleBase.instance.markTimeline_Callback_1_(this, title);
 
   @DomName('ConsoleBase.profile')
   @DocsEditable()
   @Experimental() // untriaged
-  void profile(String title) => _blink.BlinkConsoleBase.profile_Callback_1(this, title);
+  void profile(String title) => _blink.BlinkConsoleBase.instance.profile_Callback_1_(this, title);
 
   @DomName('ConsoleBase.profileEnd')
   @DocsEditable()
   @Experimental() // untriaged
-  void profileEnd(String title) => _blink.BlinkConsoleBase.profileEnd_Callback_1(this, title);
+  void profileEnd(String title) => _blink.BlinkConsoleBase.instance.profileEnd_Callback_1_(this, title);
 
   @DomName('ConsoleBase.table')
   @DocsEditable()
   @Experimental() // untriaged
-  void table(Object arg) => _blink.BlinkConsoleBase.table_Callback_1(this, arg);
+  void table(Object arg) => _blink.BlinkConsoleBase.instance.table_Callback_1_(this, arg);
 
   @DomName('ConsoleBase.time')
   @DocsEditable()
   @Experimental() // untriaged
-  void time(String title) => _blink.BlinkConsoleBase.time_Callback_1(this, title);
+  void time(String title) => _blink.BlinkConsoleBase.instance.time_Callback_1_(this, title);
 
   @DomName('ConsoleBase.timeEnd')
   @DocsEditable()
   @Experimental() // untriaged
-  void timeEnd(String title) => _blink.BlinkConsoleBase.timeEnd_Callback_1(this, title);
+  void timeEnd(String title) => _blink.BlinkConsoleBase.instance.timeEnd_Callback_1_(this, title);
 
   @DomName('ConsoleBase.timeStamp')
   @DocsEditable()
   @Experimental() // untriaged
-  void timeStamp(String title) => _blink.BlinkConsoleBase.timeStamp_Callback_1(this, title);
+  void timeStamp(String title) => _blink.BlinkConsoleBase.instance.timeStamp_Callback_1_(this, title);
 
   @DomName('ConsoleBase.timeline')
   @DocsEditable()
   @Experimental() // untriaged
-  void timeline(String title) => _blink.BlinkConsoleBase.timeline_Callback_1(this, title);
+  void timeline(String title) => _blink.BlinkConsoleBase.instance.timeline_Callback_1_(this, title);
 
   @DomName('ConsoleBase.timelineEnd')
   @DocsEditable()
   @Experimental() // untriaged
-  void timelineEnd(String title) => _blink.BlinkConsoleBase.timelineEnd_Callback_1(this, title);
+  void timelineEnd(String title) => _blink.BlinkConsoleBase.instance.timelineEnd_Callback_1_(this, title);
 
   @DomName('ConsoleBase.trace')
   @DocsEditable()
   @Experimental() // untriaged
-  void trace(Object arg) => _blink.BlinkConsoleBase.trace_Callback_1(this, arg);
+  void trace(Object arg) => _blink.BlinkConsoleBase.instance.trace_Callback_1_(this, arg);
 
   @DomName('ConsoleBase.warn')
   @DocsEditable()
   @Experimental() // untriaged
-  void warn(Object arg) => _blink.BlinkConsoleBase.warn_Callback_1(this, arg);
+  void warn(Object arg) => _blink.BlinkConsoleBase.instance.warn_Callback_1_(this, arg);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3635,15 +3635,15 @@
 
   @DomName('HTMLContentElement.select')
   @DocsEditable()
-  String get select => _blink.BlinkHTMLContentElement.select_Getter(this);
+  String get select => _blink.BlinkHTMLContentElement.instance.select_Getter_(this);
 
   @DomName('HTMLContentElement.select')
   @DocsEditable()
-  void set select(String value) => _blink.BlinkHTMLContentElement.select_Setter(this, value);
+  void set select(String value) => _blink.BlinkHTMLContentElement.instance.select_Setter_(this, value);
 
   @DomName('HTMLContentElement.getDistributedNodes')
   @DocsEditable()
-  List<Node> getDistributedNodes() => _blink.BlinkHTMLContentElement.getDistributedNodes_Callback(this);
+  List<Node> getDistributedNodes() => _blink.BlinkHTMLContentElement.instance.getDistributedNodes_Callback_0_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3661,31 +3661,31 @@
 
   @DomName('Coordinates.accuracy')
   @DocsEditable()
-  double get accuracy => _blink.BlinkCoordinates.accuracy_Getter(this);
+  double get accuracy => _blink.BlinkCoordinates.instance.accuracy_Getter_(this);
 
   @DomName('Coordinates.altitude')
   @DocsEditable()
-  double get altitude => _blink.BlinkCoordinates.altitude_Getter(this);
+  double get altitude => _blink.BlinkCoordinates.instance.altitude_Getter_(this);
 
   @DomName('Coordinates.altitudeAccuracy')
   @DocsEditable()
-  double get altitudeAccuracy => _blink.BlinkCoordinates.altitudeAccuracy_Getter(this);
+  double get altitudeAccuracy => _blink.BlinkCoordinates.instance.altitudeAccuracy_Getter_(this);
 
   @DomName('Coordinates.heading')
   @DocsEditable()
-  double get heading => _blink.BlinkCoordinates.heading_Getter(this);
+  double get heading => _blink.BlinkCoordinates.instance.heading_Getter_(this);
 
   @DomName('Coordinates.latitude')
   @DocsEditable()
-  double get latitude => _blink.BlinkCoordinates.latitude_Getter(this);
+  double get latitude => _blink.BlinkCoordinates.instance.latitude_Getter_(this);
 
   @DomName('Coordinates.longitude')
   @DocsEditable()
-  double get longitude => _blink.BlinkCoordinates.longitude_Getter(this);
+  double get longitude => _blink.BlinkCoordinates.instance.longitude_Getter_(this);
 
   @DomName('Coordinates.speed')
   @DocsEditable()
-  double get speed => _blink.BlinkCoordinates.speed_Getter(this);
+  double get speed => _blink.BlinkCoordinates.instance.speed_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3705,17 +3705,17 @@
   @DomName('Credential.avatarURL')
   @DocsEditable()
   @Experimental() // untriaged
-  String get avatarUrl => _blink.BlinkCredential.avatarURL_Getter(this);
+  String get avatarUrl => _blink.BlinkCredential.instance.avatarURL_Getter_(this);
 
   @DomName('Credential.id')
   @DocsEditable()
   @Experimental() // untriaged
-  String get id => _blink.BlinkCredential.id_Getter(this);
+  String get id => _blink.BlinkCredential.instance.id_Getter_(this);
 
   @DomName('Credential.name')
   @DocsEditable()
   @Experimental() // untriaged
-  String get name => _blink.BlinkCredential.name_Getter(this);
+  String get name => _blink.BlinkCredential.instance.name_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3734,28 +3734,28 @@
 
   Future notifyFailedSignIn([Credential credential]) {
     if (credential != null) {
-      return _blink.BlinkCredentialsContainer.notifyFailedSignIn_Callback_1(this, credential);
+      return _blink.BlinkCredentialsContainer.instance.notifyFailedSignIn_Callback_1_(this, credential);
     }
-    return _blink.BlinkCredentialsContainer.notifyFailedSignIn_Callback(this);
+    return _blink.BlinkCredentialsContainer.instance.notifyFailedSignIn_Callback_0_(this);
   }
 
   Future notifySignedIn([Credential credential]) {
     if (credential != null) {
-      return _blink.BlinkCredentialsContainer.notifySignedIn_Callback_1(this, credential);
+      return _blink.BlinkCredentialsContainer.instance.notifySignedIn_Callback_1_(this, credential);
     }
-    return _blink.BlinkCredentialsContainer.notifySignedIn_Callback(this);
+    return _blink.BlinkCredentialsContainer.instance.notifySignedIn_Callback_0_(this);
   }
 
   @DomName('CredentialsContainer.notifySignedOut')
   @DocsEditable()
   @Experimental() // untriaged
-  Future notifySignedOut() => _blink.BlinkCredentialsContainer.notifySignedOut_Callback(this);
+  Future notifySignedOut() => _blink.BlinkCredentialsContainer.instance.notifySignedOut_Callback_0_(this);
 
   Future request([Map options]) {
     if (options != null) {
-      return _blink.BlinkCredentialsContainer.request_Callback_1(this, options);
+      return _blink.BlinkCredentialsContainer.instance.request_Callback_1_(this, options);
     }
-    return _blink.BlinkCredentialsContainer.request_Callback(this);
+    return _blink.BlinkCredentialsContainer.instance.request_Callback_0_(this);
   }
 
 }
@@ -3782,11 +3782,11 @@
   @DomName('Crypto.subtle')
   @DocsEditable()
   @Experimental() // untriaged
-  _SubtleCrypto get subtle => _blink.BlinkCrypto.subtle_Getter(this);
+  _SubtleCrypto get subtle => _blink.BlinkCrypto.instance.subtle_Getter_(this);
 
   @DomName('Crypto.getRandomValues')
   @DocsEditable()
-  TypedData getRandomValues(TypedData array) => _blink.BlinkCrypto.getRandomValues_Callback_1(this, array);
+  TypedData getRandomValues(TypedData array) => _blink.BlinkCrypto.instance.getRandomValues_Callback_1_(this, array);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3806,22 +3806,22 @@
   @DomName('CryptoKey.algorithm')
   @DocsEditable()
   @Experimental() // untriaged
-  Object get algorithm => _blink.BlinkCryptoKey.algorithm_Getter(this);
+  Object get algorithm => _blink.BlinkCryptoKey.instance.algorithm_Getter_(this);
 
   @DomName('CryptoKey.extractable')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get extractable => _blink.BlinkCryptoKey.extractable_Getter(this);
+  bool get extractable => _blink.BlinkCryptoKey.instance.extractable_Getter_(this);
 
   @DomName('CryptoKey.type')
   @DocsEditable()
   @Experimental() // untriaged
-  String get type => _blink.BlinkCryptoKey.type_Getter(this);
+  String get type => _blink.BlinkCryptoKey.instance.type_Getter_(this);
 
   @DomName('CryptoKey.usages')
   @DocsEditable()
   @Experimental() // untriaged
-  List<String> get usages => _blink.BlinkCryptoKey.usages_Getter(this);
+  List<String> get usages => _blink.BlinkCryptoKey.instance.usages_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3841,11 +3841,11 @@
 
   @DomName('CSS.supports')
   @DocsEditable()
-  bool supports(String property, String value) => _blink.BlinkCSS.supports_Callback_2(this, property, value);
+  bool supports(String property, String value) => _blink.BlinkCSS.instance.supports_Callback_2_(this, property, value);
 
   @DomName('CSS.supportsCondition')
   @DocsEditable()
-  bool supportsCondition(String conditionText) => _blink.BlinkCSS.supports_Callback_1(this, conditionText);
+  bool supportsCondition(String conditionText) => _blink.BlinkCSS.instance.supports_Callback_1_(this, conditionText);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3865,11 +3865,11 @@
 
   @DomName('CSSCharsetRule.encoding')
   @DocsEditable()
-  String get encoding => _blink.BlinkCSSCharsetRule.encoding_Getter(this);
+  String get encoding => _blink.BlinkCSSCharsetRule.instance.encoding_Getter_(this);
 
   @DomName('CSSCharsetRule.encoding')
   @DocsEditable()
-  void set encoding(String value) => _blink.BlinkCSSCharsetRule.encoding_Setter(this, value);
+  void set encoding(String value) => _blink.BlinkCSSCharsetRule.instance.encoding_Setter_(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3891,7 +3891,7 @@
 
   @DomName('WebKitCSSFilterRule.style')
   @DocsEditable()
-  CssStyleDeclaration get style => _blink.BlinkWebKitCSSFilterRule.style_Getter(this);
+  CssStyleDeclaration get style => _blink.BlinkWebKitCSSFilterRule.instance.style_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3909,7 +3909,7 @@
 
   @DomName('CSSFontFaceRule.style')
   @DocsEditable()
-  CssStyleDeclaration get style => _blink.BlinkCSSFontFaceRule.style_Getter(this);
+  CssStyleDeclaration get style => _blink.BlinkCSSFontFaceRule.instance.style_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3927,15 +3927,15 @@
 
   @DomName('CSSImportRule.href')
   @DocsEditable()
-  String get href => _blink.BlinkCSSImportRule.href_Getter(this);
+  String get href => _blink.BlinkCSSImportRule.instance.href_Getter_(this);
 
   @DomName('CSSImportRule.media')
   @DocsEditable()
-  MediaList get media => _blink.BlinkCSSImportRule.media_Getter(this);
+  MediaList get media => _blink.BlinkCSSImportRule.instance.media_Getter_(this);
 
   @DomName('CSSImportRule.styleSheet')
   @DocsEditable()
-  CssStyleSheet get styleSheet => _blink.BlinkCSSImportRule.styleSheet_Getter(this);
+  CssStyleSheet get styleSheet => _blink.BlinkCSSImportRule.instance.styleSheet_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3955,17 +3955,17 @@
   @DomName('CSSKeyframeRule.keyText')
   @DocsEditable()
   @Experimental() // untriaged
-  String get keyText => _blink.BlinkCSSKeyframeRule.keyText_Getter(this);
+  String get keyText => _blink.BlinkCSSKeyframeRule.instance.keyText_Getter_(this);
 
   @DomName('CSSKeyframeRule.keyText')
   @DocsEditable()
   @Experimental() // untriaged
-  void set keyText(String value) => _blink.BlinkCSSKeyframeRule.keyText_Setter(this, value);
+  void set keyText(String value) => _blink.BlinkCSSKeyframeRule.instance.keyText_Setter_(this, value);
 
   @DomName('CSSKeyframeRule.style')
   @DocsEditable()
   @Experimental() // untriaged
-  CssStyleDeclaration get style => _blink.BlinkCSSKeyframeRule.style_Getter(this);
+  CssStyleDeclaration get style => _blink.BlinkCSSKeyframeRule.instance.style_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3985,37 +3985,37 @@
   @DomName('CSSKeyframesRule.cssRules')
   @DocsEditable()
   @Experimental() // untriaged
-  List<CssRule> get cssRules => _blink.BlinkCSSKeyframesRule.cssRules_Getter(this);
+  List<CssRule> get cssRules => _blink.BlinkCSSKeyframesRule.instance.cssRules_Getter_(this);
 
   @DomName('CSSKeyframesRule.name')
   @DocsEditable()
   @Experimental() // untriaged
-  String get name => _blink.BlinkCSSKeyframesRule.name_Getter(this);
+  String get name => _blink.BlinkCSSKeyframesRule.instance.name_Getter_(this);
 
   @DomName('CSSKeyframesRule.name')
   @DocsEditable()
   @Experimental() // untriaged
-  void set name(String value) => _blink.BlinkCSSKeyframesRule.name_Setter(this, value);
+  void set name(String value) => _blink.BlinkCSSKeyframesRule.instance.name_Setter_(this, value);
 
   @DomName('CSSKeyframesRule.__getter__')
   @DocsEditable()
   @Experimental() // untriaged
-  CssKeyframeRule __getter__(int index) => _blink.BlinkCSSKeyframesRule.$__getter___Callback_1(this, index);
+  CssKeyframeRule __getter__(int index) => _blink.BlinkCSSKeyframesRule.instance.$__getter___Callback_1_(this, index);
 
   @DomName('CSSKeyframesRule.deleteRule')
   @DocsEditable()
   @Experimental() // untriaged
-  void deleteRule(String key) => _blink.BlinkCSSKeyframesRule.deleteRule_Callback_1(this, key);
+  void deleteRule(String key) => _blink.BlinkCSSKeyframesRule.instance.deleteRule_Callback_1_(this, key);
 
   @DomName('CSSKeyframesRule.findRule')
   @DocsEditable()
   @Experimental() // untriaged
-  CssKeyframeRule findRule(String key) => _blink.BlinkCSSKeyframesRule.findRule_Callback_1(this, key);
+  CssKeyframeRule findRule(String key) => _blink.BlinkCSSKeyframesRule.instance.findRule_Callback_1_(this, key);
 
   @DomName('CSSKeyframesRule.insertRule')
   @DocsEditable()
   @Experimental() // untriaged
-  void appendRule(String rule) => _blink.BlinkCSSKeyframesRule.insertRule_Callback_1(this, rule);
+  void appendRule(String rule) => _blink.BlinkCSSKeyframesRule.instance.insertRule_Callback_1_(this, rule);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4033,19 +4033,19 @@
 
   @DomName('CSSMediaRule.cssRules')
   @DocsEditable()
-  List<CssRule> get cssRules => _blink.BlinkCSSMediaRule.cssRules_Getter(this);
+  List<CssRule> get cssRules => _blink.BlinkCSSMediaRule.instance.cssRules_Getter_(this);
 
   @DomName('CSSMediaRule.media')
   @DocsEditable()
-  MediaList get media => _blink.BlinkCSSMediaRule.media_Getter(this);
+  MediaList get media => _blink.BlinkCSSMediaRule.instance.media_Getter_(this);
 
   @DomName('CSSMediaRule.deleteRule')
   @DocsEditable()
-  void deleteRule(int index) => _blink.BlinkCSSMediaRule.deleteRule_Callback_1(this, index);
+  void deleteRule(int index) => _blink.BlinkCSSMediaRule.instance.deleteRule_Callback_1_(this, index);
 
   @DomName('CSSMediaRule.insertRule')
   @DocsEditable()
-  int insertRule(String rule, int index) => _blink.BlinkCSSMediaRule.insertRule_Callback_2(this, rule, index);
+  int insertRule(String rule, int index) => _blink.BlinkCSSMediaRule.instance.insertRule_Callback_2_(this, rule, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4063,15 +4063,15 @@
 
   @DomName('CSSPageRule.selectorText')
   @DocsEditable()
-  String get selectorText => _blink.BlinkCSSPageRule.selectorText_Getter(this);
+  String get selectorText => _blink.BlinkCSSPageRule.instance.selectorText_Getter_(this);
 
   @DomName('CSSPageRule.selectorText')
   @DocsEditable()
-  void set selectorText(String value) => _blink.BlinkCSSPageRule.selectorText_Setter(this, value);
+  void set selectorText(String value) => _blink.BlinkCSSPageRule.instance.selectorText_Setter_(this, value);
 
   @DomName('CSSPageRule.style')
   @DocsEditable()
-  CssStyleDeclaration get style => _blink.BlinkCSSPageRule.style_Getter(this);
+  CssStyleDeclaration get style => _blink.BlinkCSSPageRule.instance.style_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4150,23 +4150,23 @@
 
   @DomName('CSSRule.cssText')
   @DocsEditable()
-  String get cssText => _blink.BlinkCSSRule.cssText_Getter(this);
+  String get cssText => _blink.BlinkCSSRule.instance.cssText_Getter_(this);
 
   @DomName('CSSRule.cssText')
   @DocsEditable()
-  void set cssText(String value) => _blink.BlinkCSSRule.cssText_Setter(this, value);
+  void set cssText(String value) => _blink.BlinkCSSRule.instance.cssText_Setter_(this, value);
 
   @DomName('CSSRule.parentRule')
   @DocsEditable()
-  CssRule get parentRule => _blink.BlinkCSSRule.parentRule_Getter(this);
+  CssRule get parentRule => _blink.BlinkCSSRule.instance.parentRule_Getter_(this);
 
   @DomName('CSSRule.parentStyleSheet')
   @DocsEditable()
-  CssStyleSheet get parentStyleSheet => _blink.BlinkCSSRule.parentStyleSheet_Getter(this);
+  CssStyleSheet get parentStyleSheet => _blink.BlinkCSSRule.instance.parentStyleSheet_Getter_(this);
 
   @DomName('CSSRule.type')
   @DocsEditable()
-  int get type => _blink.BlinkCSSRule.type_Getter(this);
+  int get type => _blink.BlinkCSSRule.instance.type_Getter_(this);
 
 }
 
@@ -4263,53 +4263,53 @@
 
   @DomName('CSSStyleDeclaration.cssText')
   @DocsEditable()
-  String get cssText => _blink.BlinkCSSStyleDeclaration.cssText_Getter(this);
+  String get cssText => _blink.BlinkCSSStyleDeclaration.instance.cssText_Getter_(this);
 
   @DomName('CSSStyleDeclaration.cssText')
   @DocsEditable()
-  void set cssText(String value) => _blink.BlinkCSSStyleDeclaration.cssText_Setter(this, value);
+  void set cssText(String value) => _blink.BlinkCSSStyleDeclaration.instance.cssText_Setter_(this, value);
 
   @DomName('CSSStyleDeclaration.length')
   @DocsEditable()
-  int get length => _blink.BlinkCSSStyleDeclaration.length_Getter(this);
+  int get length => _blink.BlinkCSSStyleDeclaration.instance.length_Getter_(this);
 
   @DomName('CSSStyleDeclaration.parentRule')
   @DocsEditable()
-  CssRule get parentRule => _blink.BlinkCSSStyleDeclaration.parentRule_Getter(this);
+  CssRule get parentRule => _blink.BlinkCSSStyleDeclaration.instance.parentRule_Getter_(this);
 
   @DomName('CSSStyleDeclaration.__getter__')
   @DocsEditable()
   @Experimental() // untriaged
-  Object __getter__(String name) => _blink.BlinkCSSStyleDeclaration.$__getter___Callback_1(this, name);
+  Object __getter__(String name) => _blink.BlinkCSSStyleDeclaration.instance.$__getter___Callback_1_(this, name);
 
   @DomName('CSSStyleDeclaration.__propertyQuery__')
   @DocsEditable()
   @Experimental() // untriaged
-  bool __propertyQuery__(String name) => _blink.BlinkCSSStyleDeclaration.$__propertyQuery___Callback_1(this, name);
+  bool __propertyQuery__(String name) => _blink.BlinkCSSStyleDeclaration.instance.$__propertyQuery___Callback_1_(this, name);
 
   @DomName('CSSStyleDeclaration.__setter__')
   @DocsEditable()
-  void __setter__(String propertyName, String propertyValue) => _blink.BlinkCSSStyleDeclaration.$__setter___Callback_2(this, propertyName, propertyValue);
+  void __setter__(String propertyName, String propertyValue) => _blink.BlinkCSSStyleDeclaration.instance.$__setter___Callback_2_(this, propertyName, propertyValue);
 
   @DomName('CSSStyleDeclaration.getPropertyPriority')
   @DocsEditable()
-  String getPropertyPriority(String propertyName) => _blink.BlinkCSSStyleDeclaration.getPropertyPriority_Callback_1(this, propertyName);
+  String getPropertyPriority(String propertyName) => _blink.BlinkCSSStyleDeclaration.instance.getPropertyPriority_Callback_1_(this, propertyName);
 
   @DomName('CSSStyleDeclaration.getPropertyValue')
   @DocsEditable()
-  String _getPropertyValue(String propertyName) => _blink.BlinkCSSStyleDeclaration.getPropertyValue_Callback_1(this, propertyName);
+  String _getPropertyValue(String propertyName) => _blink.BlinkCSSStyleDeclaration.instance.getPropertyValue_Callback_1_(this, propertyName);
 
   @DomName('CSSStyleDeclaration.item')
   @DocsEditable()
-  String item(int index) => _blink.BlinkCSSStyleDeclaration.item_Callback_1(this, index);
+  String item(int index) => _blink.BlinkCSSStyleDeclaration.instance.item_Callback_1_(this, index);
 
   @DomName('CSSStyleDeclaration.removeProperty')
   @DocsEditable()
-  String removeProperty(String propertyName) => _blink.BlinkCSSStyleDeclaration.removeProperty_Callback_1(this, propertyName);
+  String removeProperty(String propertyName) => _blink.BlinkCSSStyleDeclaration.instance.removeProperty_Callback_1_(this, propertyName);
 
   @DomName('CSSStyleDeclaration.setProperty')
   @DocsEditable()
-  void _setProperty(String propertyName, String value, String priority) => _blink.BlinkCSSStyleDeclaration.setProperty_Callback_3(this, propertyName, value, priority);
+  void _setProperty(String propertyName, String value, String priority) => _blink.BlinkCSSStyleDeclaration.instance.setProperty_Callback_3_(this, propertyName, value, priority);
 
 }
 
@@ -7440,15 +7440,15 @@
 
   @DomName('CSSStyleRule.selectorText')
   @DocsEditable()
-  String get selectorText => _blink.BlinkCSSStyleRule.selectorText_Getter(this);
+  String get selectorText => _blink.BlinkCSSStyleRule.instance.selectorText_Getter_(this);
 
   @DomName('CSSStyleRule.selectorText')
   @DocsEditable()
-  void set selectorText(String value) => _blink.BlinkCSSStyleRule.selectorText_Setter(this, value);
+  void set selectorText(String value) => _blink.BlinkCSSStyleRule.instance.selectorText_Setter_(this, value);
 
   @DomName('CSSStyleRule.style')
   @DocsEditable()
-  CssStyleDeclaration get style => _blink.BlinkCSSStyleRule.style_Getter(this);
+  CssStyleDeclaration get style => _blink.BlinkCSSStyleRule.instance.style_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7466,39 +7466,39 @@
 
   @DomName('CSSStyleSheet.cssRules')
   @DocsEditable()
-  List<CssRule> get cssRules => _blink.BlinkCSSStyleSheet.cssRules_Getter(this);
+  List<CssRule> get cssRules => _blink.BlinkCSSStyleSheet.instance.cssRules_Getter_(this);
 
   @DomName('CSSStyleSheet.ownerRule')
   @DocsEditable()
-  CssRule get ownerRule => _blink.BlinkCSSStyleSheet.ownerRule_Getter(this);
+  CssRule get ownerRule => _blink.BlinkCSSStyleSheet.instance.ownerRule_Getter_(this);
 
   @DomName('CSSStyleSheet.rules')
   @DocsEditable()
   @Experimental() // non-standard
-  List<CssRule> get rules => _blink.BlinkCSSStyleSheet.rules_Getter(this);
+  List<CssRule> get rules => _blink.BlinkCSSStyleSheet.instance.rules_Getter_(this);
 
   int addRule(String selector, String style, [int index]) {
     if (index != null) {
-      return _blink.BlinkCSSStyleSheet.addRule_Callback_3(this, selector, style, index);
+      return _blink.BlinkCSSStyleSheet.instance.addRule_Callback_3_(this, selector, style, index);
     }
-    return _blink.BlinkCSSStyleSheet.addRule_Callback_2(this, selector, style);
+    return _blink.BlinkCSSStyleSheet.instance.addRule_Callback_2_(this, selector, style);
   }
 
   @DomName('CSSStyleSheet.deleteRule')
   @DocsEditable()
-  void deleteRule(int index) => _blink.BlinkCSSStyleSheet.deleteRule_Callback_1(this, index);
+  void deleteRule(int index) => _blink.BlinkCSSStyleSheet.instance.deleteRule_Callback_1_(this, index);
 
   int insertRule(String rule, [int index]) {
     if (index != null) {
-      return _blink.BlinkCSSStyleSheet.insertRule_Callback_2(this, rule, index);
+      return _blink.BlinkCSSStyleSheet.instance.insertRule_Callback_2_(this, rule, index);
     }
-    return _blink.BlinkCSSStyleSheet.insertRule_Callback_1(this, rule);
+    return _blink.BlinkCSSStyleSheet.instance.insertRule_Callback_1_(this, rule);
   }
 
   @DomName('CSSStyleSheet.removeRule')
   @DocsEditable()
   @Experimental() // non-standard
-  void removeRule(int index) => _blink.BlinkCSSStyleSheet.removeRule_Callback_1(this, index);
+  void removeRule(int index) => _blink.BlinkCSSStyleSheet.instance.removeRule_Callback_1_(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7516,19 +7516,19 @@
 
   @DomName('CSSSupportsRule.conditionText')
   @DocsEditable()
-  String get conditionText => _blink.BlinkCSSSupportsRule.conditionText_Getter(this);
+  String get conditionText => _blink.BlinkCSSSupportsRule.instance.conditionText_Getter_(this);
 
   @DomName('CSSSupportsRule.cssRules')
   @DocsEditable()
-  List<CssRule> get cssRules => _blink.BlinkCSSSupportsRule.cssRules_Getter(this);
+  List<CssRule> get cssRules => _blink.BlinkCSSSupportsRule.instance.cssRules_Getter_(this);
 
   @DomName('CSSSupportsRule.deleteRule')
   @DocsEditable()
-  void deleteRule(int index) => _blink.BlinkCSSSupportsRule.deleteRule_Callback_1(this, index);
+  void deleteRule(int index) => _blink.BlinkCSSSupportsRule.instance.deleteRule_Callback_1_(this, index);
 
   @DomName('CSSSupportsRule.insertRule')
   @DocsEditable()
-  int insertRule(String rule, int index) => _blink.BlinkCSSSupportsRule.insertRule_Callback_2(this, rule, index);
+  int insertRule(String rule, int index) => _blink.BlinkCSSSupportsRule.instance.insertRule_Callback_2_(this, rule, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7548,7 +7548,7 @@
   @DomName('CSSViewportRule.style')
   @DocsEditable()
   @Experimental() // untriaged
-  CssStyleDeclaration get style => _blink.BlinkCSSViewportRule.style_Getter(this);
+  CssStyleDeclaration get style => _blink.BlinkCSSViewportRule.instance.style_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7596,11 +7596,11 @@
 
   @DomName('CustomEvent.detail')
   @DocsEditable()
-  Object get _detail => _blink.BlinkCustomEvent.detail_Getter(this);
+  Object get _detail => _blink.BlinkCustomEvent.instance.detail_Getter_(this);
 
   @DomName('CustomEvent.initCustomEvent')
   @DocsEditable()
-  void _initCustomEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Object detailArg) => _blink.BlinkCustomEvent.initCustomEvent_Callback_4(this, typeArg, canBubbleArg, cancelableArg, detailArg);
+  void _initCustomEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Object detailArg) => _blink.BlinkCustomEvent.instance.initCustomEvent_Callback_4_(this, typeArg, canBubbleArg, cancelableArg, detailArg);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7659,7 +7659,7 @@
 
   @DomName('HTMLDataListElement.options')
   @DocsEditable()
-  List<Node> get options => _blink.BlinkHTMLDataListElement.options_Getter(this);
+  List<Node> get options => _blink.BlinkHTMLDataListElement.instance.options_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7679,61 +7679,61 @@
   @DomName('DataTransfer.dropEffect')
   @DocsEditable()
   @Experimental() // untriaged
-  String get dropEffect => _blink.BlinkDataTransfer.dropEffect_Getter(this);
+  String get dropEffect => _blink.BlinkDataTransfer.instance.dropEffect_Getter_(this);
 
   @DomName('DataTransfer.dropEffect')
   @DocsEditable()
   @Experimental() // untriaged
-  void set dropEffect(String value) => _blink.BlinkDataTransfer.dropEffect_Setter(this, value);
+  void set dropEffect(String value) => _blink.BlinkDataTransfer.instance.dropEffect_Setter_(this, value);
 
   @DomName('DataTransfer.effectAllowed')
   @DocsEditable()
   @Experimental() // untriaged
-  String get effectAllowed => _blink.BlinkDataTransfer.effectAllowed_Getter(this);
+  String get effectAllowed => _blink.BlinkDataTransfer.instance.effectAllowed_Getter_(this);
 
   @DomName('DataTransfer.effectAllowed')
   @DocsEditable()
   @Experimental() // untriaged
-  void set effectAllowed(String value) => _blink.BlinkDataTransfer.effectAllowed_Setter(this, value);
+  void set effectAllowed(String value) => _blink.BlinkDataTransfer.instance.effectAllowed_Setter_(this, value);
 
   @DomName('DataTransfer.files')
   @DocsEditable()
   @Experimental() // untriaged
-  List<File> get files => _blink.BlinkDataTransfer.files_Getter(this);
+  List<File> get files => _blink.BlinkDataTransfer.instance.files_Getter_(this);
 
   @DomName('DataTransfer.items')
   @DocsEditable()
   @Experimental() // untriaged
-  DataTransferItemList get items => _blink.BlinkDataTransfer.items_Getter(this);
+  DataTransferItemList get items => _blink.BlinkDataTransfer.instance.items_Getter_(this);
 
   @DomName('DataTransfer.types')
   @DocsEditable()
   @Experimental() // untriaged
-  List<String> get types => _blink.BlinkDataTransfer.types_Getter(this);
+  List<String> get types => _blink.BlinkDataTransfer.instance.types_Getter_(this);
 
   void clearData([String type]) {
     if (type != null) {
-      _blink.BlinkDataTransfer.clearData_Callback_1(this, type);
+      _blink.BlinkDataTransfer.instance.clearData_Callback_1_(this, type);
       return;
     }
-    _blink.BlinkDataTransfer.clearData_Callback(this);
+    _blink.BlinkDataTransfer.instance.clearData_Callback_0_(this);
     return;
   }
 
   @DomName('DataTransfer.getData')
   @DocsEditable()
   @Experimental() // untriaged
-  String getData(String type) => _blink.BlinkDataTransfer.getData_Callback_1(this, type);
+  String getData(String type) => _blink.BlinkDataTransfer.instance.getData_Callback_1_(this, type);
 
   @DomName('DataTransfer.setData')
   @DocsEditable()
   @Experimental() // untriaged
-  void setData(String type, String data) => _blink.BlinkDataTransfer.setData_Callback_2(this, type, data);
+  void setData(String type, String data) => _blink.BlinkDataTransfer.instance.setData_Callback_2_(this, type, data);
 
   @DomName('DataTransfer.setDragImage')
   @DocsEditable()
   @Experimental() // untriaged
-  void setDragImage(Element image, int x, int y) => _blink.BlinkDataTransfer.setDragImage_Callback_3(this, image, x, y);
+  void setDragImage(Element image, int x, int y) => _blink.BlinkDataTransfer.instance.setDragImage_Callback_3_(this, image, x, y);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7753,19 +7753,19 @@
 
   @DomName('DataTransferItem.kind')
   @DocsEditable()
-  String get kind => _blink.BlinkDataTransferItem.kind_Getter(this);
+  String get kind => _blink.BlinkDataTransferItem.instance.kind_Getter_(this);
 
   @DomName('DataTransferItem.type')
   @DocsEditable()
-  String get type => _blink.BlinkDataTransferItem.type_Getter(this);
+  String get type => _blink.BlinkDataTransferItem.instance.type_Getter_(this);
 
   @DomName('DataTransferItem.getAsFile')
   @DocsEditable()
-  Blob getAsFile() => _blink.BlinkDataTransferItem.getAsFile_Callback(this);
+  Blob getAsFile() => _blink.BlinkDataTransferItem.instance.getAsFile_Callback_0_(this);
 
   @DomName('DataTransferItem.getAsString')
   @DocsEditable()
-  void _getAsString(_StringCallback callback) => _blink.BlinkDataTransferItem.getAsString_Callback_1(this, callback);
+  void _getAsString(_StringCallback callback) => _blink.BlinkDataTransferItem.instance.getAsString_Callback_1_(this, callback);
 
   Future<String> getAsString() {
     var completer = new Completer<String>();
@@ -7779,7 +7779,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
-  Entry getAsEntry() => _blink.BlinkDataTransferItem.webkitGetAsEntry_Callback(this);
+  Entry getAsEntry() => _blink.BlinkDataTransferItem.instance.webkitGetAsEntry_Callback_0_(this);
 
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -7797,39 +7797,39 @@
 
   @DomName('DataTransferItemList.length')
   @DocsEditable()
-  int get length => _blink.BlinkDataTransferItemList.length_Getter(this);
+  int get length => _blink.BlinkDataTransferItemList.instance.length_Getter_(this);
 
   @DomName('DataTransferItemList.__getter__')
   @DocsEditable()
   @Experimental() // untriaged
-  DataTransferItem __getter__(int index) => _blink.BlinkDataTransferItemList.$__getter___Callback_1(this, index);
+  DataTransferItem __getter__(int index) => _blink.BlinkDataTransferItemList.instance.$__getter___Callback_1_(this, index);
 
   DataTransferItem add(data_OR_file, [String type]) {
     if ((type is String) && (data_OR_file is String)) {
-      return _blink.BlinkDataTransferItemList.add_Callback_2(this, data_OR_file, type);
+      return _blink.BlinkDataTransferItemList.instance.add_Callback_2_(this, data_OR_file, type);
     }
     if ((data_OR_file is File || data_OR_file == null) && type == null) {
-      return _blink.BlinkDataTransferItemList.add_Callback_1(this, data_OR_file);
+      return _blink.BlinkDataTransferItemList.instance.add_Callback_1_(this, data_OR_file);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
   @DomName('DataTransferItemList.addData')
   @DocsEditable()
-  DataTransferItem addData(String data, String type) => _blink.BlinkDataTransferItemList.add_Callback_2(this, data, type);
+  DataTransferItem addData(String data, String type) => _blink.BlinkDataTransferItemList.instance.add_Callback_2_(this, data, type);
 
   @DomName('DataTransferItemList.addFile')
   @DocsEditable()
-  DataTransferItem addFile(File file) => _blink.BlinkDataTransferItemList.add_Callback_1(this, file);
+  DataTransferItem addFile(File file) => _blink.BlinkDataTransferItemList.instance.add_Callback_1_(this, file);
 
   @DomName('DataTransferItemList.clear')
   @DocsEditable()
-  void clear() => _blink.BlinkDataTransferItemList.clear_Callback(this);
+  void clear() => _blink.BlinkDataTransferItemList.instance.clear_Callback_0_(this);
 
   @DomName('DataTransferItemList.remove')
   @DocsEditable()
   @Experimental() // untriaged
-  void remove(int index) => _blink.BlinkDataTransferItemList.remove_Callback_1(this, index);
+  void remove(int index) => _blink.BlinkDataTransferItemList.instance.remove_Callback_1_(this, index);
 
 
   DataTransferItem operator[] (int index) {
@@ -7876,7 +7876,7 @@
   @DomName('DedicatedWorkerGlobalScope.postMessage')
   @DocsEditable()
   @Experimental() // untriaged
-  void postMessage(Object message, [List<MessagePort> transfer]) => _blink.BlinkDedicatedWorkerGlobalScope.postMessage_Callback_2(this, message, transfer);
+  void postMessage(Object message, [List<MessagePort> transfer]) => _blink.BlinkDedicatedWorkerGlobalScope.instance.postMessage_Callback_2_(this, message, transfer);
 
   /// Stream of `message` events handled by this [DedicatedWorkerGlobalScope].
   @DomName('DedicatedWorkerGlobalScope.onmessage')
@@ -7911,27 +7911,27 @@
 
   void queryUsageAndQuota(int storageType, [StorageUsageCallback usageCallback, StorageErrorCallback errorCallback]) {
     if (errorCallback != null) {
-      _blink.BlinkDeprecatedStorageInfo.queryUsageAndQuota_Callback_3(this, storageType, usageCallback, errorCallback);
+      _blink.BlinkDeprecatedStorageInfo.instance.queryUsageAndQuota_Callback_3_(this, storageType, usageCallback, errorCallback);
       return;
     }
     if (usageCallback != null) {
-      _blink.BlinkDeprecatedStorageInfo.queryUsageAndQuota_Callback_2(this, storageType, usageCallback);
+      _blink.BlinkDeprecatedStorageInfo.instance.queryUsageAndQuota_Callback_2_(this, storageType, usageCallback);
       return;
     }
-    _blink.BlinkDeprecatedStorageInfo.queryUsageAndQuota_Callback_1(this, storageType);
+    _blink.BlinkDeprecatedStorageInfo.instance.queryUsageAndQuota_Callback_1_(this, storageType);
     return;
   }
 
   void requestQuota(int storageType, int newQuotaInBytes, [StorageQuotaCallback quotaCallback, StorageErrorCallback errorCallback]) {
     if (errorCallback != null) {
-      _blink.BlinkDeprecatedStorageInfo.requestQuota_Callback_4(this, storageType, newQuotaInBytes, quotaCallback, errorCallback);
+      _blink.BlinkDeprecatedStorageInfo.instance.requestQuota_Callback_4_(this, storageType, newQuotaInBytes, quotaCallback, errorCallback);
       return;
     }
     if (quotaCallback != null) {
-      _blink.BlinkDeprecatedStorageInfo.requestQuota_Callback_3(this, storageType, newQuotaInBytes, quotaCallback);
+      _blink.BlinkDeprecatedStorageInfo.instance.requestQuota_Callback_3_(this, storageType, newQuotaInBytes, quotaCallback);
       return;
     }
-    _blink.BlinkDeprecatedStorageInfo.requestQuota_Callback_2(this, storageType, newQuotaInBytes);
+    _blink.BlinkDeprecatedStorageInfo.instance.requestQuota_Callback_2_(this, storageType, newQuotaInBytes);
     return;
   }
 
@@ -7952,23 +7952,23 @@
 
   void queryUsageAndQuota(StorageUsageCallback usageCallback, [StorageErrorCallback errorCallback]) {
     if (errorCallback != null) {
-      _blink.BlinkDeprecatedStorageQuota.queryUsageAndQuota_Callback_2(this, usageCallback, errorCallback);
+      _blink.BlinkDeprecatedStorageQuota.instance.queryUsageAndQuota_Callback_2_(this, usageCallback, errorCallback);
       return;
     }
-    _blink.BlinkDeprecatedStorageQuota.queryUsageAndQuota_Callback_1(this, usageCallback);
+    _blink.BlinkDeprecatedStorageQuota.instance.queryUsageAndQuota_Callback_1_(this, usageCallback);
     return;
   }
 
   void requestQuota(int newQuotaInBytes, [StorageQuotaCallback quotaCallback, StorageErrorCallback errorCallback]) {
     if (errorCallback != null) {
-      _blink.BlinkDeprecatedStorageQuota.requestQuota_Callback_3(this, newQuotaInBytes, quotaCallback, errorCallback);
+      _blink.BlinkDeprecatedStorageQuota.instance.requestQuota_Callback_3_(this, newQuotaInBytes, quotaCallback, errorCallback);
       return;
     }
     if (quotaCallback != null) {
-      _blink.BlinkDeprecatedStorageQuota.requestQuota_Callback_2(this, newQuotaInBytes, quotaCallback);
+      _blink.BlinkDeprecatedStorageQuota.instance.requestQuota_Callback_2_(this, newQuotaInBytes, quotaCallback);
       return;
     }
-    _blink.BlinkDeprecatedStorageQuota.requestQuota_Callback_1(this, newQuotaInBytes);
+    _blink.BlinkDeprecatedStorageQuota.instance.requestQuota_Callback_1_(this, newQuotaInBytes);
     return;
   }
 
@@ -8004,11 +8004,11 @@
 
   @DomName('HTMLDetailsElement.open')
   @DocsEditable()
-  bool get open => _blink.BlinkHTMLDetailsElement.open_Getter(this);
+  bool get open => _blink.BlinkHTMLDetailsElement.instance.open_Getter_(this);
 
   @DomName('HTMLDetailsElement.open')
   @DocsEditable()
-  void set open(bool value) => _blink.BlinkHTMLDetailsElement.open_Setter(this, value);
+  void set open(bool value) => _blink.BlinkHTMLDetailsElement.instance.open_Setter_(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -8028,15 +8028,15 @@
 
   @DomName('DeviceAcceleration.x')
   @DocsEditable()
-  double get x => _blink.BlinkDeviceAcceleration.x_Getter(this);
+  double get x => _blink.BlinkDeviceAcceleration.instance.x_Getter_(this);
 
   @DomName('DeviceAcceleration.y')
   @DocsEditable()
-  double get y => _blink.BlinkDeviceAcceleration.y_Getter(this);
+  double get y => _blink.BlinkDeviceAcceleration.instance.y_Getter_(this);
 
   @DomName('DeviceAcceleration.z')
   @DocsEditable()
-  double get z => _blink.BlinkDeviceAcceleration.z_Getter(this);
+  double get z => _blink.BlinkDeviceAcceleration.instance.z_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -8056,7 +8056,7 @@
   @DomName('DeviceLightEvent.value')
   @DocsEditable()
   @Experimental() // untriaged
-  double get value => _blink.BlinkDeviceLightEvent.value_Getter(this);
+  double get value => _blink.BlinkDeviceLightEvent.instance.value_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -8076,24 +8076,24 @@
 
   @DomName('DeviceMotionEvent.acceleration')
   @DocsEditable()
-  DeviceAcceleration get acceleration => _blink.BlinkDeviceMotionEvent.acceleration_Getter(this);
+  DeviceAcceleration get acceleration => _blink.BlinkDeviceMotionEvent.instance.acceleration_Getter_(this);
 
   @DomName('DeviceMotionEvent.accelerationIncludingGravity')
   @DocsEditable()
-  DeviceAcceleration get accelerationIncludingGravity => _blink.BlinkDeviceMotionEvent.accelerationIncludingGravity_Getter(this);
+  DeviceAcceleration get accelerationIncludingGravity => _blink.BlinkDeviceMotionEvent.instance.accelerationIncludingGravity_Getter_(this);
 
   @DomName('DeviceMotionEvent.interval')
   @DocsEditable()
-  double get interval => _blink.BlinkDeviceMotionEvent.interval_Getter(this);
+  double get interval => _blink.BlinkDeviceMotionEvent.instance.interval_Getter_(this);
 
   @DomName('DeviceMotionEvent.rotationRate')
   @DocsEditable()
-  DeviceRotationRate get rotationRate => _blink.BlinkDeviceMotionEvent.rotationRate_Getter(this);
+  DeviceRotationRate get rotationRate => _blink.BlinkDeviceMotionEvent.instance.rotationRate_Getter_(this);
 
   @DomName('DeviceMotionEvent.initDeviceMotionEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  void initDeviceMotionEvent(String type, bool bubbles, bool cancelable, DeviceAcceleration acceleration, DeviceAcceleration accelerationIncludingGravity, DeviceRotationRate rotationRate, num interval) => _blink.BlinkDeviceMotionEvent.initDeviceMotionEvent_Callback_7(this, type, bubbles, cancelable, acceleration, accelerationIncludingGravity, rotationRate, interval);
+  void initDeviceMotionEvent(String type, bool bubbles, bool cancelable, DeviceAcceleration acceleration, DeviceAcceleration accelerationIncludingGravity, DeviceRotationRate rotationRate, num interval) => _blink.BlinkDeviceMotionEvent.instance.initDeviceMotionEvent_Callback_7_(this, type, bubbles, cancelable, acceleration, accelerationIncludingGravity, rotationRate, interval);
 
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -8119,23 +8119,23 @@
 
   @DomName('DeviceOrientationEvent.absolute')
   @DocsEditable()
-  bool get absolute => _blink.BlinkDeviceOrientationEvent.absolute_Getter(this);
+  bool get absolute => _blink.BlinkDeviceOrientationEvent.instance.absolute_Getter_(this);
 
   @DomName('DeviceOrientationEvent.alpha')
   @DocsEditable()
-  double get alpha => _blink.BlinkDeviceOrientationEvent.alpha_Getter(this);
+  double get alpha => _blink.BlinkDeviceOrientationEvent.instance.alpha_Getter_(this);
 
   @DomName('DeviceOrientationEvent.beta')
   @DocsEditable()
-  double get beta => _blink.BlinkDeviceOrientationEvent.beta_Getter(this);
+  double get beta => _blink.BlinkDeviceOrientationEvent.instance.beta_Getter_(this);
 
   @DomName('DeviceOrientationEvent.gamma')
   @DocsEditable()
-  double get gamma => _blink.BlinkDeviceOrientationEvent.gamma_Getter(this);
+  double get gamma => _blink.BlinkDeviceOrientationEvent.instance.gamma_Getter_(this);
 
   @DomName('DeviceOrientationEvent.initDeviceOrientationEvent')
   @DocsEditable()
-  void _initDeviceOrientationEvent(String type, bool bubbles, bool cancelable, num alpha, num beta, num gamma, bool absolute) => _blink.BlinkDeviceOrientationEvent.initDeviceOrientationEvent_Callback_7(this, type, bubbles, cancelable, alpha, beta, gamma, absolute);
+  void _initDeviceOrientationEvent(String type, bool bubbles, bool cancelable, num alpha, num beta, num gamma, bool absolute) => _blink.BlinkDeviceOrientationEvent.instance.initDeviceOrientationEvent_Callback_7_(this, type, bubbles, cancelable, alpha, beta, gamma, absolute);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -8155,15 +8155,15 @@
 
   @DomName('DeviceRotationRate.alpha')
   @DocsEditable()
-  double get alpha => _blink.BlinkDeviceRotationRate.alpha_Getter(this);
+  double get alpha => _blink.BlinkDeviceRotationRate.instance.alpha_Getter_(this);
 
   @DomName('DeviceRotationRate.beta')
   @DocsEditable()
-  double get beta => _blink.BlinkDeviceRotationRate.beta_Getter(this);
+  double get beta => _blink.BlinkDeviceRotationRate.instance.beta_Getter_(this);
 
   @DomName('DeviceRotationRate.gamma')
   @DocsEditable()
-  double get gamma => _blink.BlinkDeviceRotationRate.gamma_Getter(this);
+  double get gamma => _blink.BlinkDeviceRotationRate.instance.gamma_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -8188,33 +8188,33 @@
 
   @DomName('HTMLDialogElement.open')
   @DocsEditable()
-  bool get open => _blink.BlinkHTMLDialogElement.open_Getter(this);
+  bool get open => _blink.BlinkHTMLDialogElement.instance.open_Getter_(this);
 
   @DomName('HTMLDialogElement.open')
   @DocsEditable()
-  void set open(bool value) => _blink.BlinkHTMLDialogElement.open_Setter(this, value);
+  void set open(bool value) => _blink.BlinkHTMLDialogElement.instance.open_Setter_(this, value);
 
   @DomName('HTMLDialogElement.returnValue')
   @DocsEditable()
   @Experimental() // untriaged
-  String get returnValue => _blink.BlinkHTMLDialogElement.returnValue_Getter(this);
+  String get returnValue => _blink.BlinkHTMLDialogElement.instance.returnValue_Getter_(this);
 
   @DomName('HTMLDialogElement.returnValue')
   @DocsEditable()
   @Experimental() // untriaged
-  void set returnValue(String value) => _blink.BlinkHTMLDialogElement.returnValue_Setter(this, value);
+  void set returnValue(String value) => _blink.BlinkHTMLDialogElement.instance.returnValue_Setter_(this, value);
 
   @DomName('HTMLDialogElement.close')
   @DocsEditable()
-  void close(String returnValue) => _blink.BlinkHTMLDialogElement.close_Callback_1(this, returnValue);
+  void close(String returnValue) => _blink.BlinkHTMLDialogElement.instance.close_Callback_1_(this, returnValue);
 
   @DomName('HTMLDialogElement.show')
   @DocsEditable()
-  void show() => _blink.BlinkHTMLDialogElement.show_Callback(this);
+  void show() => _blink.BlinkHTMLDialogElement.instance.show_Callback_0_(this);
 
   @DomName('HTMLDialogElement.showModal')
   @DocsEditable()
-  void showModal() => _blink.BlinkHTMLDialogElement.showModal_Callback(this);
+  void showModal() => _blink.BlinkHTMLDialogElement.instance.showModal_Callback_0_(this);
 
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -8268,22 +8268,22 @@
 
   @DomName('DirectoryEntry.createReader')
   @DocsEditable()
-  DirectoryReader createReader() => _blink.BlinkDirectoryEntry.createReader_Callback(this);
+  DirectoryReader createReader() => _blink.BlinkDirectoryEntry.instance.createReader_Callback_0_(this);
 
   void __getDirectory(String path, {Map options, _EntryCallback successCallback, _ErrorCallback errorCallback}) {
     if (errorCallback != null) {
-      _blink.BlinkDirectoryEntry.getDirectory_Callback_4(this, path, options, successCallback, errorCallback);
+      _blink.BlinkDirectoryEntry.instance.getDirectory_Callback_4_(this, path, options, successCallback, errorCallback);
       return;
     }
     if (successCallback != null) {
-      _blink.BlinkDirectoryEntry.getDirectory_Callback_3(this, path, options, successCallback);
+      _blink.BlinkDirectoryEntry.instance.getDirectory_Callback_3_(this, path, options, successCallback);
       return;
     }
     if (options != null) {
-      _blink.BlinkDirectoryEntry.getDirectory_Callback_2(this, path, options);
+      _blink.BlinkDirectoryEntry.instance.getDirectory_Callback_2_(this, path, options);
       return;
     }
-    _blink.BlinkDirectoryEntry.getDirectory_Callback_1(this, path);
+    _blink.BlinkDirectoryEntry.instance.getDirectory_Callback_1_(this, path);
     return;
   }
 
@@ -8297,18 +8297,18 @@
 
   void __getFile(String path, {Map options, _EntryCallback successCallback, _ErrorCallback errorCallback}) {
     if (errorCallback != null) {
-      _blink.BlinkDirectoryEntry.getFile_Callback_4(this, path, options, successCallback, errorCallback);
+      _blink.BlinkDirectoryEntry.instance.getFile_Callback_4_(this, path, options, successCallback, errorCallback);
       return;
     }
     if (successCallback != null) {
-      _blink.BlinkDirectoryEntry.getFile_Callback_3(this, path, options, successCallback);
+      _blink.BlinkDirectoryEntry.instance.getFile_Callback_3_(this, path, options, successCallback);
       return;
     }
     if (options != null) {
-      _blink.BlinkDirectoryEntry.getFile_Callback_2(this, path, options);
+      _blink.BlinkDirectoryEntry.instance.getFile_Callback_2_(this, path, options);
       return;
     }
-    _blink.BlinkDirectoryEntry.getFile_Callback_1(this, path);
+    _blink.BlinkDirectoryEntry.instance.getFile_Callback_1_(this, path);
     return;
   }
 
@@ -8322,10 +8322,10 @@
 
   void _removeRecursively(VoidCallback successCallback, [_ErrorCallback errorCallback]) {
     if (errorCallback != null) {
-      _blink.BlinkDirectoryEntry.removeRecursively_Callback_2(this, successCallback, errorCallback);
+      _blink.BlinkDirectoryEntry.instance.removeRecursively_Callback_2_(this, successCallback, errorCallback);
       return;
     }
-    _blink.BlinkDirectoryEntry.removeRecursively_Callback_1(this, successCallback);
+    _blink.BlinkDirectoryEntry.instance.removeRecursively_Callback_1_(this, successCallback);
     return;
   }
 
@@ -8355,10 +8355,10 @@
 
   void _readEntries(_EntriesCallback successCallback, [_ErrorCallback errorCallback]) {
     if (errorCallback != null) {
-      _blink.BlinkDirectoryReader.readEntries_Callback_2(this, successCallback, errorCallback);
+      _blink.BlinkDirectoryReader.instance.readEntries_Callback_2_(this, successCallback, errorCallback);
       return;
     }
-    _blink.BlinkDirectoryReader.readEntries_Callback_1(this, successCallback);
+    _blink.BlinkDirectoryReader.instance.readEntries_Callback_1_(this, successCallback);
     return;
   }
 
@@ -8474,129 +8474,129 @@
   @DomName('Document.activeElement')
   @DocsEditable()
   @Experimental() // untriaged
-  Element get activeElement => _blink.BlinkDocument.activeElement_Getter(this);
+  Element get activeElement => _blink.BlinkDocument.instance.activeElement_Getter_(this);
 
   @DomName('Document.body')
   @DocsEditable()
-  HtmlElement get _body => _blink.BlinkDocument.body_Getter(this);
+  HtmlElement get _body => _blink.BlinkDocument.instance.body_Getter_(this);
 
   @DomName('Document.body')
   @DocsEditable()
-  void set _body(HtmlElement value) => _blink.BlinkDocument.body_Setter(this, value);
+  void set _body(HtmlElement value) => _blink.BlinkDocument.instance.body_Setter_(this, value);
 
   @DomName('Document.contentType')
   @DocsEditable()
   @Experimental() // untriaged
-  String get contentType => _blink.BlinkDocument.contentType_Getter(this);
+  String get contentType => _blink.BlinkDocument.instance.contentType_Getter_(this);
 
   @DomName('Document.cookie')
   @DocsEditable()
-  String get cookie => _blink.BlinkDocument.cookie_Getter(this);
+  String get cookie => _blink.BlinkDocument.instance.cookie_Getter_(this);
 
   @DomName('Document.cookie')
   @DocsEditable()
-  void set cookie(String value) => _blink.BlinkDocument.cookie_Setter(this, value);
+  void set cookie(String value) => _blink.BlinkDocument.instance.cookie_Setter_(this, value);
 
   @DomName('Document.currentScript')
   @DocsEditable()
   @Experimental() // untriaged
-  ScriptElement get currentScript => _blink.BlinkDocument.currentScript_Getter(this);
+  ScriptElement get currentScript => _blink.BlinkDocument.instance.currentScript_Getter_(this);
 
   @DomName('Document.defaultView')
   @DocsEditable()
-  WindowBase get window => _blink.BlinkDocument.defaultView_Getter(this);
+  WindowBase get window => _blink.BlinkDocument.instance.defaultView_Getter_(this);
 
   @DomName('Document.documentElement')
   @DocsEditable()
-  Element get documentElement => _blink.BlinkDocument.documentElement_Getter(this);
+  Element get documentElement => _blink.BlinkDocument.instance.documentElement_Getter_(this);
 
   @DomName('Document.domain')
   @DocsEditable()
-  String get domain => _blink.BlinkDocument.domain_Getter(this);
+  String get domain => _blink.BlinkDocument.instance.domain_Getter_(this);
 
   @DomName('Document.fonts')
   @DocsEditable()
   @Experimental() // untriaged
-  FontFaceSet get fonts => _blink.BlinkDocument.fonts_Getter(this);
+  FontFaceSet get fonts => _blink.BlinkDocument.instance.fonts_Getter_(this);
 
   @DomName('Document.fullscreenElement')
   @DocsEditable()
   @Experimental() // untriaged
-  Element get fullscreenElement => _blink.BlinkDocument.fullscreenElement_Getter(this);
+  Element get fullscreenElement => _blink.BlinkDocument.instance.fullscreenElement_Getter_(this);
 
   @DomName('Document.fullscreenEnabled')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get fullscreenEnabled => _blink.BlinkDocument.fullscreenEnabled_Getter(this);
+  bool get fullscreenEnabled => _blink.BlinkDocument.instance.fullscreenEnabled_Getter_(this);
 
   @DomName('Document.head')
   @DocsEditable()
-  HeadElement get _head => _blink.BlinkDocument.head_Getter(this);
+  HeadElement get _head => _blink.BlinkDocument.instance.head_Getter_(this);
 
   @DomName('Document.hidden')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get hidden => _blink.BlinkDocument.hidden_Getter(this);
+  bool get hidden => _blink.BlinkDocument.instance.hidden_Getter_(this);
 
   @DomName('Document.implementation')
   @DocsEditable()
-  DomImplementation get implementation => _blink.BlinkDocument.implementation_Getter(this);
+  DomImplementation get implementation => _blink.BlinkDocument.instance.implementation_Getter_(this);
 
   @DomName('Document.lastModified')
   @DocsEditable()
-  String get _lastModified => _blink.BlinkDocument.lastModified_Getter(this);
+  String get _lastModified => _blink.BlinkDocument.instance.lastModified_Getter_(this);
 
   @DomName('Document.pointerLockElement')
   @DocsEditable()
   @Experimental() // untriaged
-  Element get pointerLockElement => _blink.BlinkDocument.pointerLockElement_Getter(this);
+  Element get pointerLockElement => _blink.BlinkDocument.instance.pointerLockElement_Getter_(this);
 
   @DomName('Document.preferredStylesheetSet')
   @DocsEditable()
-  String get _preferredStylesheetSet => _blink.BlinkDocument.preferredStylesheetSet_Getter(this);
+  String get _preferredStylesheetSet => _blink.BlinkDocument.instance.preferredStylesheetSet_Getter_(this);
 
   @DomName('Document.readyState')
   @DocsEditable()
-  String get readyState => _blink.BlinkDocument.readyState_Getter(this);
+  String get readyState => _blink.BlinkDocument.instance.readyState_Getter_(this);
 
   @DomName('Document.referrer')
   @DocsEditable()
-  String get _referrer => _blink.BlinkDocument.referrer_Getter(this);
+  String get _referrer => _blink.BlinkDocument.instance.referrer_Getter_(this);
 
   @DomName('Document.rootElement')
   @DocsEditable()
   @Experimental() // untriaged
-  SvgSvgElement get rootElement => _blink.BlinkDocument.rootElement_Getter(this);
+  SvgSvgElement get rootElement => _blink.BlinkDocument.instance.rootElement_Getter_(this);
 
   @DomName('Document.selectedStylesheetSet')
   @DocsEditable()
-  String get _selectedStylesheetSet => _blink.BlinkDocument.selectedStylesheetSet_Getter(this);
+  String get _selectedStylesheetSet => _blink.BlinkDocument.instance.selectedStylesheetSet_Getter_(this);
 
   @DomName('Document.selectedStylesheetSet')
   @DocsEditable()
-  void set _selectedStylesheetSet(String value) => _blink.BlinkDocument.selectedStylesheetSet_Setter(this, value);
+  void set _selectedStylesheetSet(String value) => _blink.BlinkDocument.instance.selectedStylesheetSet_Setter_(this, value);
 
   @DomName('Document.styleSheets')
   @DocsEditable()
-  List<StyleSheet> get _styleSheets => _blink.BlinkDocument.styleSheets_Getter(this);
+  List<StyleSheet> get _styleSheets => _blink.BlinkDocument.instance.styleSheets_Getter_(this);
 
   @DomName('Document.timeline')
   @DocsEditable()
   @Experimental() // untriaged
-  AnimationTimeline get timeline => _blink.BlinkDocument.timeline_Getter(this);
+  AnimationTimeline get timeline => _blink.BlinkDocument.instance.timeline_Getter_(this);
 
   @DomName('Document.title')
   @DocsEditable()
-  String get _title => _blink.BlinkDocument.title_Getter(this);
+  String get _title => _blink.BlinkDocument.instance.title_Getter_(this);
 
   @DomName('Document.title')
   @DocsEditable()
-  void set _title(String value) => _blink.BlinkDocument.title_Setter(this, value);
+  void set _title(String value) => _blink.BlinkDocument.instance.title_Setter_(this, value);
 
   @DomName('Document.visibilityState')
   @DocsEditable()
   @Experimental() // untriaged
-  String get visibilityState => _blink.BlinkDocument.visibilityState_Getter(this);
+  String get visibilityState => _blink.BlinkDocument.instance.visibilityState_Getter_(this);
 
   @DomName('Document.webkitFullscreenElement')
   @DocsEditable()
@@ -8604,7 +8604,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html#dom-document-fullscreenelement
-  Element get _webkitFullscreenElement => _blink.BlinkDocument.webkitFullscreenElement_Getter(this);
+  Element get _webkitFullscreenElement => _blink.BlinkDocument.instance.webkitFullscreenElement_Getter_(this);
 
   @DomName('Document.webkitFullscreenEnabled')
   @DocsEditable()
@@ -8612,7 +8612,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html#dom-document-fullscreenenabled
-  bool get _webkitFullscreenEnabled => _blink.BlinkDocument.webkitFullscreenEnabled_Getter(this);
+  bool get _webkitFullscreenEnabled => _blink.BlinkDocument.instance.webkitFullscreenEnabled_Getter_(this);
 
   @DomName('Document.webkitHidden')
   @DocsEditable()
@@ -8620,7 +8620,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/PageVisibility/Overview.html#document
-  bool get _webkitHidden => _blink.BlinkDocument.webkitHidden_Getter(this);
+  bool get _webkitHidden => _blink.BlinkDocument.instance.webkitHidden_Getter_(this);
 
   @DomName('Document.webkitVisibilityState')
   @DocsEditable()
@@ -8628,134 +8628,134 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/PageVisibility/Overview.html#dom-document-visibilitystate
-  String get _webkitVisibilityState => _blink.BlinkDocument.webkitVisibilityState_Getter(this);
+  String get _webkitVisibilityState => _blink.BlinkDocument.instance.webkitVisibilityState_Getter_(this);
 
   @DomName('Document.adoptNode')
   @DocsEditable()
-  Node adoptNode(Node node) => _blink.BlinkDocument.adoptNode_Callback_1(this, node);
+  Node adoptNode(Node node) => _blink.BlinkDocument.instance.adoptNode_Callback_1_(this, node);
 
   @DomName('Document.caretRangeFromPoint')
   @DocsEditable()
   // http://www.w3.org/TR/2009/WD-cssom-view-20090804/#dom-documentview-caretrangefrompoint
   @Experimental()
-  Range _caretRangeFromPoint(int x, int y) => _blink.BlinkDocument.caretRangeFromPoint_Callback_2(this, x, y);
+  Range _caretRangeFromPoint(int x, int y) => _blink.BlinkDocument.instance.caretRangeFromPoint_Callback_2_(this, x, y);
 
   @DomName('Document.createDocumentFragment')
   @DocsEditable()
-  DocumentFragment createDocumentFragment() => _blink.BlinkDocument.createDocumentFragment_Callback(this);
+  DocumentFragment createDocumentFragment() => _blink.BlinkDocument.instance.createDocumentFragment_Callback_0_(this);
 
   @DomName('Document.createElement')
   @DocsEditable()
-  Element _createElement(String localName_OR_tagName, [String typeExtension]) => _blink.BlinkDocument.createElement_Callback_2(this, localName_OR_tagName, typeExtension);
+  Element _createElement(String localName_OR_tagName, [String typeExtension]) => _blink.BlinkDocument.instance.createElement_Callback_2_(this, localName_OR_tagName, typeExtension);
 
   @DomName('Document.createElementNS')
   @DocsEditable()
-  Element createElementNS(String namespaceURI, String qualifiedName, [String typeExtension]) => _blink.BlinkDocument.createElementNS_Callback_3(this, namespaceURI, qualifiedName, typeExtension);
+  Element createElementNS(String namespaceURI, String qualifiedName, [String typeExtension]) => _blink.BlinkDocument.instance.createElementNS_Callback_3_(this, namespaceURI, qualifiedName, typeExtension);
 
   @DomName('Document.createEvent')
   @DocsEditable()
-  Event _createEvent(String eventType) => _blink.BlinkDocument.createEvent_Callback_1(this, eventType);
+  Event _createEvent(String eventType) => _blink.BlinkDocument.instance.createEvent_Callback_1_(this, eventType);
 
   NodeIterator _createNodeIterator(Node root, [int whatToShow, NodeFilter filter]) {
     if (whatToShow != null) {
-      return _blink.BlinkDocument.createNodeIterator_Callback_3(this, root, whatToShow, filter);
+      return _blink.BlinkDocument.instance.createNodeIterator_Callback_3_(this, root, whatToShow, filter);
     }
-    return _blink.BlinkDocument.createNodeIterator_Callback_1(this, root);
+    return _blink.BlinkDocument.instance.createNodeIterator_Callback_1_(this, root);
   }
 
   @DomName('Document.createRange')
   @DocsEditable()
-  Range createRange() => _blink.BlinkDocument.createRange_Callback(this);
+  Range createRange() => _blink.BlinkDocument.instance.createRange_Callback_0_(this);
 
   @DomName('Document.createTextNode')
   @DocsEditable()
-  Text _createTextNode(String data) => _blink.BlinkDocument.createTextNode_Callback_1(this, data);
+  Text _createTextNode(String data) => _blink.BlinkDocument.instance.createTextNode_Callback_1_(this, data);
 
   @DomName('Document.createTouch')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
-  Touch _createTouch(Window window, EventTarget target, int identifier, num pageX, num pageY, num screenX, num screenY, num webkitRadiusX, num webkitRadiusY, num webkitRotationAngle, num webkitForce) => _blink.BlinkDocument.createTouch_Callback_11(this, window, target, identifier, pageX, pageY, screenX, screenY, webkitRadiusX, webkitRadiusY, webkitRotationAngle, webkitForce);
+  Touch _createTouch(Window window, EventTarget target, int identifier, num pageX, num pageY, num screenX, num screenY, num webkitRadiusX, num webkitRadiusY, num webkitRotationAngle, num webkitForce) => _blink.BlinkDocument.instance.createTouch_Callback_11_(this, window, target, identifier, pageX, pageY, screenX, screenY, webkitRadiusX, webkitRadiusY, webkitRotationAngle, webkitForce);
 
   @DomName('Document.createTouchList')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
-  TouchList _createTouchList(Touch touches) => _blink.BlinkDocument.createTouchList_Callback_1(this, touches);
+  TouchList _createTouchList(Touch touches) => _blink.BlinkDocument.instance.createTouchList_Callback_1_(this, touches);
 
   TreeWalker _createTreeWalker(Node root, [int whatToShow, NodeFilter filter]) {
     if (whatToShow != null) {
-      return _blink.BlinkDocument.createTreeWalker_Callback_3(this, root, whatToShow, filter);
+      return _blink.BlinkDocument.instance.createTreeWalker_Callback_3_(this, root, whatToShow, filter);
     }
-    return _blink.BlinkDocument.createTreeWalker_Callback_1(this, root);
+    return _blink.BlinkDocument.instance.createTreeWalker_Callback_1_(this, root);
   }
 
   @DomName('Document.elementFromPoint')
   @DocsEditable()
-  Element _elementFromPoint(int x, int y) => _blink.BlinkDocument.elementFromPoint_Callback_2(this, x, y);
+  Element _elementFromPoint(int x, int y) => _blink.BlinkDocument.instance.elementFromPoint_Callback_2_(this, x, y);
 
   @DomName('Document.execCommand')
   @DocsEditable()
-  bool execCommand(String command, bool userInterface, String value) => _blink.BlinkDocument.execCommand_Callback_3(this, command, userInterface, value);
+  bool execCommand(String command, bool userInterface, String value) => _blink.BlinkDocument.instance.execCommand_Callback_3_(this, command, userInterface, value);
 
   @DomName('Document.exitFullscreen')
   @DocsEditable()
   @Experimental() // untriaged
-  void exitFullscreen() => _blink.BlinkDocument.exitFullscreen_Callback(this);
+  void exitFullscreen() => _blink.BlinkDocument.instance.exitFullscreen_Callback_0_(this);
 
   @DomName('Document.exitPointerLock')
   @DocsEditable()
   @Experimental() // untriaged
-  void exitPointerLock() => _blink.BlinkDocument.exitPointerLock_Callback(this);
+  void exitPointerLock() => _blink.BlinkDocument.instance.exitPointerLock_Callback_0_(this);
 
   @DomName('Document.getCSSCanvasContext')
   @DocsEditable()
   // https://developer.apple.com/library/safari/#documentation/AppleApplications/Reference/SafariCSSRef/Articles/Functions.html
   @Experimental() // non-standard
-  Object _getCssCanvasContext(String contextId, String name, int width, int height) => _blink.BlinkDocument.getCSSCanvasContext_Callback_4(this, contextId, name, width, height);
+  Object _getCssCanvasContext(String contextId, String name, int width, int height) => _blink.BlinkDocument.instance.getCSSCanvasContext_Callback_4_(this, contextId, name, width, height);
 
   @DomName('Document.getElementById')
   @DocsEditable()
-  Element getElementById(String elementId) => _blink.BlinkDocument.getElementById_Callback_1(this, elementId);
+  Element getElementById(String elementId) => _blink.BlinkDocument.instance.getElementById_Callback_1_(this, elementId);
 
   @DomName('Document.getElementsByClassName')
   @DocsEditable()
-  List<Node> getElementsByClassName(String classNames) => _blink.BlinkDocument.getElementsByClassName_Callback_1(this, classNames);
+  List<Node> getElementsByClassName(String classNames) => _blink.BlinkDocument.instance.getElementsByClassName_Callback_1_(this, classNames);
 
   @DomName('Document.getElementsByName')
   @DocsEditable()
-  List<Node> getElementsByName(String elementName) => _blink.BlinkDocument.getElementsByName_Callback_1(this, elementName);
+  List<Node> getElementsByName(String elementName) => _blink.BlinkDocument.instance.getElementsByName_Callback_1_(this, elementName);
 
   @DomName('Document.getElementsByTagName')
   @DocsEditable()
-  List<Node> getElementsByTagName(String localName) => _blink.BlinkDocument.getElementsByTagName_Callback_1(this, localName);
+  List<Node> getElementsByTagName(String localName) => _blink.BlinkDocument.instance.getElementsByTagName_Callback_1_(this, localName);
 
   Node importNode(Node node, [bool deep]) {
     if (deep != null) {
-      return _blink.BlinkDocument.importNode_Callback_2(this, node, deep);
+      return _blink.BlinkDocument.instance.importNode_Callback_2_(this, node, deep);
     }
-    return _blink.BlinkDocument.importNode_Callback_1(this, node);
+    return _blink.BlinkDocument.instance.importNode_Callback_1_(this, node);
   }
 
   @DomName('Document.queryCommandEnabled')
   @DocsEditable()
-  bool queryCommandEnabled(String command) => _blink.BlinkDocument.queryCommandEnabled_Callback_1(this, command);
+  bool queryCommandEnabled(String command) => _blink.BlinkDocument.instance.queryCommandEnabled_Callback_1_(this, command);
 
   @DomName('Document.queryCommandIndeterm')
   @DocsEditable()
-  bool queryCommandIndeterm(String command) => _blink.BlinkDocument.queryCommandIndeterm_Callback_1(this, command);
+  bool queryCommandIndeterm(String command) => _blink.BlinkDocument.instance.queryCommandIndeterm_Callback_1_(this, command);
 
   @DomName('Document.queryCommandState')
   @DocsEditable()
-  bool queryCommandState(String command) => _blink.BlinkDocument.queryCommandState_Callback_1(this, command);
+  bool queryCommandState(String command) => _blink.BlinkDocument.instance.queryCommandState_Callback_1_(this, command);
 
   @DomName('Document.queryCommandSupported')
   @DocsEditable()
-  bool queryCommandSupported(String command) => _blink.BlinkDocument.queryCommandSupported_Callback_1(this, command);
+  bool queryCommandSupported(String command) => _blink.BlinkDocument.instance.queryCommandSupported_Callback_1_(this, command);
 
   @DomName('Document.queryCommandValue')
   @DocsEditable()
-  String queryCommandValue(String command) => _blink.BlinkDocument.queryCommandValue_Callback_1(this, command);
+  String queryCommandValue(String command) => _blink.BlinkDocument.instance.queryCommandValue_Callback_1_(this, command);
 
   @DomName('Document.webkitExitFullscreen')
   @DocsEditable()
@@ -8763,23 +8763,23 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html#dom-document-exitfullscreen
-  void _webkitExitFullscreen() => _blink.BlinkDocument.webkitExitFullscreen_Callback(this);
+  void _webkitExitFullscreen() => _blink.BlinkDocument.instance.webkitExitFullscreen_Callback_0_(this);
 
   @DomName('Document.childElementCount')
   @DocsEditable()
-  int get _childElementCount => _blink.BlinkDocument.childElementCount_Getter(this);
+  int get _childElementCount => _blink.BlinkDocument.instance.childElementCount_Getter_(this);
 
   @DomName('Document.children')
   @DocsEditable()
-  List<Node> get _children => _blink.BlinkDocument.children_Getter(this);
+  List<Node> get _children => _blink.BlinkDocument.instance.children_Getter_(this);
 
   @DomName('Document.firstElementChild')
   @DocsEditable()
-  Element get _firstElementChild => _blink.BlinkDocument.firstElementChild_Getter(this);
+  Element get _firstElementChild => _blink.BlinkDocument.instance.firstElementChild_Getter_(this);
 
   @DomName('Document.lastElementChild')
   @DocsEditable()
-  Element get _lastElementChild => _blink.BlinkDocument.lastElementChild_Getter(this);
+  Element get _lastElementChild => _blink.BlinkDocument.instance.lastElementChild_Getter_(this);
 
   /**
    * Finds the first descendant element of this document that matches the
@@ -8800,11 +8800,11 @@
    */
   @DomName('Document.querySelector')
   @DocsEditable()
-  Element querySelector(String selectors) => _blink.BlinkDocument.querySelector_Callback_1(this, selectors);
+  Element querySelector(String selectors) => _blink.BlinkDocument.instance.querySelector_Callback_1_(this, selectors);
 
   @DomName('Document.querySelectorAll')
   @DocsEditable()
-  List<Node> _querySelectorAll(String selectors) => _blink.BlinkDocument.querySelectorAll_Callback_1(this, selectors);
+  List<Node> _querySelectorAll(String selectors) => _blink.BlinkDocument.instance.querySelectorAll_Callback_1_(this, selectors);
 
   /// Stream of `abort` events handled by this [Document].
   @DomName('Document.onabort')
@@ -9349,19 +9349,19 @@
   @DomName('DocumentFragment.getElementById')
   @DocsEditable()
   @Experimental() // untriaged
-  Element getElementById(String elementId) => _blink.BlinkDocumentFragment.getElementById_Callback_1(this, elementId);
+  Element getElementById(String elementId) => _blink.BlinkDocumentFragment.instance.getElementById_Callback_1_(this, elementId);
 
   @DomName('DocumentFragment.childElementCount')
   @DocsEditable()
-  int get _childElementCount => _blink.BlinkDocumentFragment.childElementCount_Getter(this);
+  int get _childElementCount => _blink.BlinkDocumentFragment.instance.childElementCount_Getter_(this);
 
   @DomName('DocumentFragment.firstElementChild')
   @DocsEditable()
-  Element get _firstElementChild => _blink.BlinkDocumentFragment.firstElementChild_Getter(this);
+  Element get _firstElementChild => _blink.BlinkDocumentFragment.instance.firstElementChild_Getter_(this);
 
   @DomName('DocumentFragment.lastElementChild')
   @DocsEditable()
-  Element get _lastElementChild => _blink.BlinkDocumentFragment.lastElementChild_Getter(this);
+  Element get _lastElementChild => _blink.BlinkDocumentFragment.instance.lastElementChild_Getter_(this);
 
   /**
    * Finds the first descendant element of this document fragment that matches
@@ -9377,11 +9377,11 @@
    */
   @DomName('DocumentFragment.querySelector')
   @DocsEditable()
-  Element querySelector(String selectors) => _blink.BlinkDocumentFragment.querySelector_Callback_1(this, selectors);
+  Element querySelector(String selectors) => _blink.BlinkDocumentFragment.instance.querySelector_Callback_1_(this, selectors);
 
   @DomName('DocumentFragment.querySelectorAll')
   @DocsEditable()
-  List<Node> _querySelectorAll(String selectors) => _blink.BlinkDocumentFragment.querySelectorAll_Callback_1(this, selectors);
+  List<Node> _querySelectorAll(String selectors) => _blink.BlinkDocumentFragment.instance.querySelectorAll_Callback_1_(this, selectors);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -9400,17 +9400,17 @@
   @DomName('DOMError.DOMError')
   @DocsEditable()
   factory DomError(String name, [String message]) {
-    return _blink.BlinkDOMError.constructorCallback_2(name, message);
+    return _blink.BlinkDOMError.instance.constructorCallback_2_(name, message);
   }
 
   @DomName('DOMError.message')
   @DocsEditable()
   @Experimental() // untriaged
-  String get message => _blink.BlinkDOMError.message_Getter(this);
+  String get message => _blink.BlinkDOMError.instance.message_Getter_(this);
 
   @DomName('DOMError.name')
   @DocsEditable()
-  String get name => _blink.BlinkDOMError.name_Getter(this);
+  String get name => _blink.BlinkDOMError.instance.name_Getter_(this);
 
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -9449,15 +9449,15 @@
 
   @DomName('DOMException.message')
   @DocsEditable()
-  String get message => _blink.BlinkDOMException.message_Getter(this);
+  String get message => _blink.BlinkDOMException.instance.message_Getter_(this);
 
   @DomName('DOMException.name')
   @DocsEditable()
-  String get name => _blink.BlinkDOMException.name_Getter(this);
+  String get name => _blink.BlinkDOMException.instance.name_Getter_(this);
 
   @DomName('DOMException.toString')
   @DocsEditable()
-  String toString() => _blink.BlinkDOMException.toString_Callback(this);
+  String toString() => _blink.BlinkDOMException.instance.toString_Callback_0_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -9475,19 +9475,19 @@
 
   @DomName('DOMImplementation.createDocument')
   @DocsEditable()
-  XmlDocument createDocument(String namespaceURI, String qualifiedName, _DocumentType doctype) => _blink.BlinkDOMImplementation.createDocument_Callback_3(this, namespaceURI, qualifiedName, doctype);
+  XmlDocument createDocument(String namespaceURI, String qualifiedName, _DocumentType doctype) => _blink.BlinkDOMImplementation.instance.createDocument_Callback_3_(this, namespaceURI, qualifiedName, doctype);
 
   @DomName('DOMImplementation.createDocumentType')
   @DocsEditable()
-  _DocumentType createDocumentType(String qualifiedName, String publicId, String systemId) => _blink.BlinkDOMImplementation.createDocumentType_Callback_3(this, qualifiedName, publicId, systemId);
+  _DocumentType createDocumentType(String qualifiedName, String publicId, String systemId) => _blink.BlinkDOMImplementation.instance.createDocumentType_Callback_3_(this, qualifiedName, publicId, systemId);
 
   @DomName('DOMImplementation.createHTMLDocument')
   @DocsEditable()
-  HtmlDocument createHtmlDocument(String title) => _blink.BlinkDOMImplementation.createHTMLDocument_Callback_1(this, title);
+  HtmlDocument createHtmlDocument(String title) => _blink.BlinkDOMImplementation.instance.createHTMLDocument_Callback_1_(this, title);
 
   @DomName('DOMImplementation.hasFeature')
   @DocsEditable()
-  bool hasFeature(String feature, String version) => _blink.BlinkDOMImplementation.hasFeature_Callback_2(this, feature, version);
+  bool hasFeature(String feature, String version) => _blink.BlinkDOMImplementation.instance.hasFeature_Callback_2_(this, feature, version);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -9508,10 +9508,10 @@
   @DocsEditable()
   factory DomMatrix([DomMatrixReadOnly other]) {
     if (other == null) {
-      return _blink.BlinkDOMMatrix.constructorCallback();
+      return _blink.BlinkDOMMatrix.instance.constructorCallback_0_();
     }
     if ((other is DomMatrixReadOnly || other == null)) {
-      return _blink.BlinkDOMMatrix.constructorCallback_1(other);
+      return _blink.BlinkDOMMatrix.instance.constructorCallback_1_(other);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
@@ -9519,222 +9519,222 @@
   @DomName('DOMMatrix.a')
   @DocsEditable()
   @Experimental() // untriaged
-  num get a => _blink.BlinkDOMMatrix.a_Getter(this);
+  num get a => _blink.BlinkDOMMatrix.instance.a_Getter_(this);
 
   @DomName('DOMMatrix.a')
   @DocsEditable()
   @Experimental() // untriaged
-  void set a(num value) => _blink.BlinkDOMMatrix.a_Setter(this, value);
+  void set a(num value) => _blink.BlinkDOMMatrix.instance.a_Setter_(this, value);
 
   @DomName('DOMMatrix.b')
   @DocsEditable()
   @Experimental() // untriaged
-  num get b => _blink.BlinkDOMMatrix.b_Getter(this);
+  num get b => _blink.BlinkDOMMatrix.instance.b_Getter_(this);
 
   @DomName('DOMMatrix.b')
   @DocsEditable()
   @Experimental() // untriaged
-  void set b(num value) => _blink.BlinkDOMMatrix.b_Setter(this, value);
+  void set b(num value) => _blink.BlinkDOMMatrix.instance.b_Setter_(this, value);
 
   @DomName('DOMMatrix.c')
   @DocsEditable()
   @Experimental() // untriaged
-  num get c => _blink.BlinkDOMMatrix.c_Getter(this);
+  num get c => _blink.BlinkDOMMatrix.instance.c_Getter_(this);
 
   @DomName('DOMMatrix.c')
   @DocsEditable()
   @Experimental() // untriaged
-  void set c(num value) => _blink.BlinkDOMMatrix.c_Setter(this, value);
+  void set c(num value) => _blink.BlinkDOMMatrix.instance.c_Setter_(this, value);
 
   @DomName('DOMMatrix.d')
   @DocsEditable()
   @Experimental() // untriaged
-  num get d => _blink.BlinkDOMMatrix.d_Getter(this);
+  num get d => _blink.BlinkDOMMatrix.instance.d_Getter_(this);
 
   @DomName('DOMMatrix.d')
   @DocsEditable()
   @Experimental() // untriaged
-  void set d(num value) => _blink.BlinkDOMMatrix.d_Setter(this, value);
+  void set d(num value) => _blink.BlinkDOMMatrix.instance.d_Setter_(this, value);
 
   @DomName('DOMMatrix.e')
   @DocsEditable()
   @Experimental() // untriaged
-  num get e => _blink.BlinkDOMMatrix.e_Getter(this);
+  num get e => _blink.BlinkDOMMatrix.instance.e_Getter_(this);
 
   @DomName('DOMMatrix.e')
   @DocsEditable()
   @Experimental() // untriaged
-  void set e(num value) => _blink.BlinkDOMMatrix.e_Setter(this, value);
+  void set e(num value) => _blink.BlinkDOMMatrix.instance.e_Setter_(this, value);
 
   @DomName('DOMMatrix.f')
   @DocsEditable()
   @Experimental() // untriaged
-  num get f => _blink.BlinkDOMMatrix.f_Getter(this);
+  num get f => _blink.BlinkDOMMatrix.instance.f_Getter_(this);
 
   @DomName('DOMMatrix.f')
   @DocsEditable()
   @Experimental() // untriaged
-  void set f(num value) => _blink.BlinkDOMMatrix.f_Setter(this, value);
+  void set f(num value) => _blink.BlinkDOMMatrix.instance.f_Setter_(this, value);
 
   @DomName('DOMMatrix.m11')
   @DocsEditable()
   @Experimental() // untriaged
-  num get m11 => _blink.BlinkDOMMatrix.m11_Getter(this);
+  num get m11 => _blink.BlinkDOMMatrix.instance.m11_Getter_(this);
 
   @DomName('DOMMatrix.m11')
   @DocsEditable()
   @Experimental() // untriaged
-  void set m11(num value) => _blink.BlinkDOMMatrix.m11_Setter(this, value);
+  void set m11(num value) => _blink.BlinkDOMMatrix.instance.m11_Setter_(this, value);
 
   @DomName('DOMMatrix.m12')
   @DocsEditable()
   @Experimental() // untriaged
-  num get m12 => _blink.BlinkDOMMatrix.m12_Getter(this);
+  num get m12 => _blink.BlinkDOMMatrix.instance.m12_Getter_(this);
 
   @DomName('DOMMatrix.m12')
   @DocsEditable()
   @Experimental() // untriaged
-  void set m12(num value) => _blink.BlinkDOMMatrix.m12_Setter(this, value);
+  void set m12(num value) => _blink.BlinkDOMMatrix.instance.m12_Setter_(this, value);
 
   @DomName('DOMMatrix.m13')
   @DocsEditable()
   @Experimental() // untriaged
-  num get m13 => _blink.BlinkDOMMatrix.m13_Getter(this);
+  num get m13 => _blink.BlinkDOMMatrix.instance.m13_Getter_(this);
 
   @DomName('DOMMatrix.m13')
   @DocsEditable()
   @Experimental() // untriaged
-  void set m13(num value) => _blink.BlinkDOMMatrix.m13_Setter(this, value);
+  void set m13(num value) => _blink.BlinkDOMMatrix.instance.m13_Setter_(this, value);
 
   @DomName('DOMMatrix.m14')
   @DocsEditable()
   @Experimental() // untriaged
-  num get m14 => _blink.BlinkDOMMatrix.m14_Getter(this);
+  num get m14 => _blink.BlinkDOMMatrix.instance.m14_Getter_(this);
 
   @DomName('DOMMatrix.m14')
   @DocsEditable()
   @Experimental() // untriaged
-  void set m14(num value) => _blink.BlinkDOMMatrix.m14_Setter(this, value);
+  void set m14(num value) => _blink.BlinkDOMMatrix.instance.m14_Setter_(this, value);
 
   @DomName('DOMMatrix.m21')
   @DocsEditable()
   @Experimental() // untriaged
-  num get m21 => _blink.BlinkDOMMatrix.m21_Getter(this);
+  num get m21 => _blink.BlinkDOMMatrix.instance.m21_Getter_(this);
 
   @DomName('DOMMatrix.m21')
   @DocsEditable()
   @Experimental() // untriaged
-  void set m21(num value) => _blink.BlinkDOMMatrix.m21_Setter(this, value);
+  void set m21(num value) => _blink.BlinkDOMMatrix.instance.m21_Setter_(this, value);
 
   @DomName('DOMMatrix.m22')
   @DocsEditable()
   @Experimental() // untriaged
-  num get m22 => _blink.BlinkDOMMatrix.m22_Getter(this);
+  num get m22 => _blink.BlinkDOMMatrix.instance.m22_Getter_(this);
 
   @DomName('DOMMatrix.m22')
   @DocsEditable()
   @Experimental() // untriaged
-  void set m22(num value) => _blink.BlinkDOMMatrix.m22_Setter(this, value);
+  void set m22(num value) => _blink.BlinkDOMMatrix.instance.m22_Setter_(this, value);
 
   @DomName('DOMMatrix.m23')
   @DocsEditable()
   @Experimental() // untriaged
-  num get m23 => _blink.BlinkDOMMatrix.m23_Getter(this);
+  num get m23 => _blink.BlinkDOMMatrix.instance.m23_Getter_(this);
 
   @DomName('DOMMatrix.m23')
   @DocsEditable()
   @Experimental() // untriaged
-  void set m23(num value) => _blink.BlinkDOMMatrix.m23_Setter(this, value);
+  void set m23(num value) => _blink.BlinkDOMMatrix.instance.m23_Setter_(this, value);
 
   @DomName('DOMMatrix.m24')
   @DocsEditable()
   @Experimental() // untriaged
-  num get m24 => _blink.BlinkDOMMatrix.m24_Getter(this);
+  num get m24 => _blink.BlinkDOMMatrix.instance.m24_Getter_(this);
 
   @DomName('DOMMatrix.m24')
   @DocsEditable()
   @Experimental() // untriaged
-  void set m24(num value) => _blink.BlinkDOMMatrix.m24_Setter(this, value);
+  void set m24(num value) => _blink.BlinkDOMMatrix.instance.m24_Setter_(this, value);
 
   @DomName('DOMMatrix.m31')
   @DocsEditable()
   @Experimental() // untriaged
-  num get m31 => _blink.BlinkDOMMatrix.m31_Getter(this);
+  num get m31 => _blink.BlinkDOMMatrix.instance.m31_Getter_(this);
 
   @DomName('DOMMatrix.m31')
   @DocsEditable()
   @Experimental() // untriaged
-  void set m31(num value) => _blink.BlinkDOMMatrix.m31_Setter(this, value);
+  void set m31(num value) => _blink.BlinkDOMMatrix.instance.m31_Setter_(this, value);
 
   @DomName('DOMMatrix.m32')
   @DocsEditable()
   @Experimental() // untriaged
-  num get m32 => _blink.BlinkDOMMatrix.m32_Getter(this);
+  num get m32 => _blink.BlinkDOMMatrix.instance.m32_Getter_(this);
 
   @DomName('DOMMatrix.m32')
   @DocsEditable()
   @Experimental() // untriaged
-  void set m32(num value) => _blink.BlinkDOMMatrix.m32_Setter(this, value);
+  void set m32(num value) => _blink.BlinkDOMMatrix.instance.m32_Setter_(this, value);
 
   @DomName('DOMMatrix.m33')
   @DocsEditable()
   @Experimental() // untriaged
-  num get m33 => _blink.BlinkDOMMatrix.m33_Getter(this);
+  num get m33 => _blink.BlinkDOMMatrix.instance.m33_Getter_(this);
 
   @DomName('DOMMatrix.m33')
   @DocsEditable()
   @Experimental() // untriaged
-  void set m33(num value) => _blink.BlinkDOMMatrix.m33_Setter(this, value);
+  void set m33(num value) => _blink.BlinkDOMMatrix.instance.m33_Setter_(this, value);
 
   @DomName('DOMMatrix.m34')
   @DocsEditable()
   @Experimental() // untriaged
-  num get m34 => _blink.BlinkDOMMatrix.m34_Getter(this);
+  num get m34 => _blink.BlinkDOMMatrix.instance.m34_Getter_(this);
 
   @DomName('DOMMatrix.m34')
   @DocsEditable()
   @Experimental() // untriaged
-  void set m34(num value) => _blink.BlinkDOMMatrix.m34_Setter(this, value);
+  void set m34(num value) => _blink.BlinkDOMMatrix.instance.m34_Setter_(this, value);
 
   @DomName('DOMMatrix.m41')
   @DocsEditable()
   @Experimental() // untriaged
-  num get m41 => _blink.BlinkDOMMatrix.m41_Getter(this);
+  num get m41 => _blink.BlinkDOMMatrix.instance.m41_Getter_(this);
 
   @DomName('DOMMatrix.m41')
   @DocsEditable()
   @Experimental() // untriaged
-  void set m41(num value) => _blink.BlinkDOMMatrix.m41_Setter(this, value);
+  void set m41(num value) => _blink.BlinkDOMMatrix.instance.m41_Setter_(this, value);
 
   @DomName('DOMMatrix.m42')
   @DocsEditable()
   @Experimental() // untriaged
-  num get m42 => _blink.BlinkDOMMatrix.m42_Getter(this);
+  num get m42 => _blink.BlinkDOMMatrix.instance.m42_Getter_(this);
 
   @DomName('DOMMatrix.m42')
   @DocsEditable()
   @Experimental() // untriaged
-  void set m42(num value) => _blink.BlinkDOMMatrix.m42_Setter(this, value);
+  void set m42(num value) => _blink.BlinkDOMMatrix.instance.m42_Setter_(this, value);
 
   @DomName('DOMMatrix.m43')
   @DocsEditable()
   @Experimental() // untriaged
-  num get m43 => _blink.BlinkDOMMatrix.m43_Getter(this);
+  num get m43 => _blink.BlinkDOMMatrix.instance.m43_Getter_(this);
 
   @DomName('DOMMatrix.m43')
   @DocsEditable()
   @Experimental() // untriaged
-  void set m43(num value) => _blink.BlinkDOMMatrix.m43_Setter(this, value);
+  void set m43(num value) => _blink.BlinkDOMMatrix.instance.m43_Setter_(this, value);
 
   @DomName('DOMMatrix.m44')
   @DocsEditable()
   @Experimental() // untriaged
-  num get m44 => _blink.BlinkDOMMatrix.m44_Getter(this);
+  num get m44 => _blink.BlinkDOMMatrix.instance.m44_Getter_(this);
 
   @DomName('DOMMatrix.m44')
   @DocsEditable()
   @Experimental() // untriaged
-  void set m44(num value) => _blink.BlinkDOMMatrix.m44_Setter(this, value);
+  void set m44(num value) => _blink.BlinkDOMMatrix.instance.m44_Setter_(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -9754,122 +9754,122 @@
   @DomName('DOMMatrixReadOnly.a')
   @DocsEditable()
   @Experimental() // untriaged
-  double get a => _blink.BlinkDOMMatrixReadOnly.a_Getter(this);
+  double get a => _blink.BlinkDOMMatrixReadOnly.instance.a_Getter_(this);
 
   @DomName('DOMMatrixReadOnly.b')
   @DocsEditable()
   @Experimental() // untriaged
-  double get b => _blink.BlinkDOMMatrixReadOnly.b_Getter(this);
+  double get b => _blink.BlinkDOMMatrixReadOnly.instance.b_Getter_(this);
 
   @DomName('DOMMatrixReadOnly.c')
   @DocsEditable()
   @Experimental() // untriaged
-  double get c => _blink.BlinkDOMMatrixReadOnly.c_Getter(this);
+  double get c => _blink.BlinkDOMMatrixReadOnly.instance.c_Getter_(this);
 
   @DomName('DOMMatrixReadOnly.d')
   @DocsEditable()
   @Experimental() // untriaged
-  double get d => _blink.BlinkDOMMatrixReadOnly.d_Getter(this);
+  double get d => _blink.BlinkDOMMatrixReadOnly.instance.d_Getter_(this);
 
   @DomName('DOMMatrixReadOnly.e')
   @DocsEditable()
   @Experimental() // untriaged
-  double get e => _blink.BlinkDOMMatrixReadOnly.e_Getter(this);
+  double get e => _blink.BlinkDOMMatrixReadOnly.instance.e_Getter_(this);
 
   @DomName('DOMMatrixReadOnly.f')
   @DocsEditable()
   @Experimental() // untriaged
-  double get f => _blink.BlinkDOMMatrixReadOnly.f_Getter(this);
+  double get f => _blink.BlinkDOMMatrixReadOnly.instance.f_Getter_(this);
 
   @DomName('DOMMatrixReadOnly.is2D')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get is2D => _blink.BlinkDOMMatrixReadOnly.is2D_Getter(this);
+  bool get is2D => _blink.BlinkDOMMatrixReadOnly.instance.is2D_Getter_(this);
 
   @DomName('DOMMatrixReadOnly.isIdentity')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get isIdentity => _blink.BlinkDOMMatrixReadOnly.isIdentity_Getter(this);
+  bool get isIdentity => _blink.BlinkDOMMatrixReadOnly.instance.isIdentity_Getter_(this);
 
   @DomName('DOMMatrixReadOnly.m11')
   @DocsEditable()
   @Experimental() // untriaged
-  double get m11 => _blink.BlinkDOMMatrixReadOnly.m11_Getter(this);
+  double get m11 => _blink.BlinkDOMMatrixReadOnly.instance.m11_Getter_(this);
 
   @DomName('DOMMatrixReadOnly.m12')
   @DocsEditable()
   @Experimental() // untriaged
-  double get m12 => _blink.BlinkDOMMatrixReadOnly.m12_Getter(this);
+  double get m12 => _blink.BlinkDOMMatrixReadOnly.instance.m12_Getter_(this);
 
   @DomName('DOMMatrixReadOnly.m13')
   @DocsEditable()
   @Experimental() // untriaged
-  double get m13 => _blink.BlinkDOMMatrixReadOnly.m13_Getter(this);
+  double get m13 => _blink.BlinkDOMMatrixReadOnly.instance.m13_Getter_(this);
 
   @DomName('DOMMatrixReadOnly.m14')
   @DocsEditable()
   @Experimental() // untriaged
-  double get m14 => _blink.BlinkDOMMatrixReadOnly.m14_Getter(this);
+  double get m14 => _blink.BlinkDOMMatrixReadOnly.instance.m14_Getter_(this);
 
   @DomName('DOMMatrixReadOnly.m21')
   @DocsEditable()
   @Experimental() // untriaged
-  double get m21 => _blink.BlinkDOMMatrixReadOnly.m21_Getter(this);
+  double get m21 => _blink.BlinkDOMMatrixReadOnly.instance.m21_Getter_(this);
 
   @DomName('DOMMatrixReadOnly.m22')
   @DocsEditable()
   @Experimental() // untriaged
-  double get m22 => _blink.BlinkDOMMatrixReadOnly.m22_Getter(this);
+  double get m22 => _blink.BlinkDOMMatrixReadOnly.instance.m22_Getter_(this);
 
   @DomName('DOMMatrixReadOnly.m23')
   @DocsEditable()
   @Experimental() // untriaged
-  double get m23 => _blink.BlinkDOMMatrixReadOnly.m23_Getter(this);
+  double get m23 => _blink.BlinkDOMMatrixReadOnly.instance.m23_Getter_(this);
 
   @DomName('DOMMatrixReadOnly.m24')
   @DocsEditable()
   @Experimental() // untriaged
-  double get m24 => _blink.BlinkDOMMatrixReadOnly.m24_Getter(this);
+  double get m24 => _blink.BlinkDOMMatrixReadOnly.instance.m24_Getter_(this);
 
   @DomName('DOMMatrixReadOnly.m31')
   @DocsEditable()
   @Experimental() // untriaged
-  double get m31 => _blink.BlinkDOMMatrixReadOnly.m31_Getter(this);
+  double get m31 => _blink.BlinkDOMMatrixReadOnly.instance.m31_Getter_(this);
 
   @DomName('DOMMatrixReadOnly.m32')
   @DocsEditable()
   @Experimental() // untriaged
-  double get m32 => _blink.BlinkDOMMatrixReadOnly.m32_Getter(this);
+  double get m32 => _blink.BlinkDOMMatrixReadOnly.instance.m32_Getter_(this);
 
   @DomName('DOMMatrixReadOnly.m33')
   @DocsEditable()
   @Experimental() // untriaged
-  double get m33 => _blink.BlinkDOMMatrixReadOnly.m33_Getter(this);
+  double get m33 => _blink.BlinkDOMMatrixReadOnly.instance.m33_Getter_(this);
 
   @DomName('DOMMatrixReadOnly.m34')
   @DocsEditable()
   @Experimental() // untriaged
-  double get m34 => _blink.BlinkDOMMatrixReadOnly.m34_Getter(this);
+  double get m34 => _blink.BlinkDOMMatrixReadOnly.instance.m34_Getter_(this);
 
   @DomName('DOMMatrixReadOnly.m41')
   @DocsEditable()
   @Experimental() // untriaged
-  double get m41 => _blink.BlinkDOMMatrixReadOnly.m41_Getter(this);
+  double get m41 => _blink.BlinkDOMMatrixReadOnly.instance.m41_Getter_(this);
 
   @DomName('DOMMatrixReadOnly.m42')
   @DocsEditable()
   @Experimental() // untriaged
-  double get m42 => _blink.BlinkDOMMatrixReadOnly.m42_Getter(this);
+  double get m42 => _blink.BlinkDOMMatrixReadOnly.instance.m42_Getter_(this);
 
   @DomName('DOMMatrixReadOnly.m43')
   @DocsEditable()
   @Experimental() // untriaged
-  double get m43 => _blink.BlinkDOMMatrixReadOnly.m43_Getter(this);
+  double get m43 => _blink.BlinkDOMMatrixReadOnly.instance.m43_Getter_(this);
 
   @DomName('DOMMatrixReadOnly.m44')
   @DocsEditable()
   @Experimental() // untriaged
-  double get m44 => _blink.BlinkDOMMatrixReadOnly.m44_Getter(this);
+  double get m44 => _blink.BlinkDOMMatrixReadOnly.instance.m44_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -9888,12 +9888,12 @@
   @DomName('DOMParser.DOMParser')
   @DocsEditable()
   factory DomParser() {
-    return _blink.BlinkDOMParser.constructorCallback();
+    return _blink.BlinkDOMParser.instance.constructorCallback_0_();
   }
 
   @DomName('DOMParser.parseFromString')
   @DocsEditable()
-  Document parseFromString(String str, String contentType) => _blink.BlinkDOMParser.parseFromString_Callback_2(this, str, contentType);
+  Document parseFromString(String str, String contentType) => _blink.BlinkDOMParser.instance.parseFromString_Callback_2_(this, str, contentType);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -9914,19 +9914,19 @@
   @DocsEditable()
   factory DomPoint([point_OR_x, num y, num z, num w]) {
     if (point_OR_x == null && y == null && z == null && w == null) {
-      return _blink.BlinkDOMPoint.constructorCallback();
+      return _blink.BlinkDOMPoint.instance.constructorCallback_0_();
     }
     if ((point_OR_x is Map || point_OR_x == null) && y == null && z == null && w == null) {
-      return _blink.BlinkDOMPoint.constructorCallback_1(point_OR_x);
+      return _blink.BlinkDOMPoint.instance.constructorCallback_1_(point_OR_x);
     }
     if ((y is num || y == null) && (point_OR_x is num || point_OR_x == null) && z == null && w == null) {
-      return _blink.BlinkDOMPoint.constructorCallback_2(point_OR_x, y);
+      return _blink.BlinkDOMPoint.instance.constructorCallback_2_(point_OR_x, y);
     }
     if ((z is num || z == null) && (y is num || y == null) && (point_OR_x is num || point_OR_x == null) && w == null) {
-      return _blink.BlinkDOMPoint.constructorCallback_3(point_OR_x, y, z);
+      return _blink.BlinkDOMPoint.instance.constructorCallback_3_(point_OR_x, y, z);
     }
     if ((w is num || w == null) && (z is num || z == null) && (y is num || y == null) && (point_OR_x is num || point_OR_x == null)) {
-      return _blink.BlinkDOMPoint.constructorCallback_4(point_OR_x, y, z, w);
+      return _blink.BlinkDOMPoint.instance.constructorCallback_4_(point_OR_x, y, z, w);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
@@ -9934,42 +9934,42 @@
   @DomName('DOMPoint.w')
   @DocsEditable()
   @Experimental() // untriaged
-  num get w => _blink.BlinkDOMPoint.w_Getter(this);
+  num get w => _blink.BlinkDOMPoint.instance.w_Getter_(this);
 
   @DomName('DOMPoint.w')
   @DocsEditable()
   @Experimental() // untriaged
-  void set w(num value) => _blink.BlinkDOMPoint.w_Setter(this, value);
+  void set w(num value) => _blink.BlinkDOMPoint.instance.w_Setter_(this, value);
 
   @DomName('DOMPoint.x')
   @DocsEditable()
   @Experimental() // untriaged
-  num get x => _blink.BlinkDOMPoint.x_Getter(this);
+  num get x => _blink.BlinkDOMPoint.instance.x_Getter_(this);
 
   @DomName('DOMPoint.x')
   @DocsEditable()
   @Experimental() // untriaged
-  void set x(num value) => _blink.BlinkDOMPoint.x_Setter(this, value);
+  void set x(num value) => _blink.BlinkDOMPoint.instance.x_Setter_(this, value);
 
   @DomName('DOMPoint.y')
   @DocsEditable()
   @Experimental() // untriaged
-  num get y => _blink.BlinkDOMPoint.y_Getter(this);
+  num get y => _blink.BlinkDOMPoint.instance.y_Getter_(this);
 
   @DomName('DOMPoint.y')
   @DocsEditable()
   @Experimental() // untriaged
-  void set y(num value) => _blink.BlinkDOMPoint.y_Setter(this, value);
+  void set y(num value) => _blink.BlinkDOMPoint.instance.y_Setter_(this, value);
 
   @DomName('DOMPoint.z')
   @DocsEditable()
   @Experimental() // untriaged
-  num get z => _blink.BlinkDOMPoint.z_Getter(this);
+  num get z => _blink.BlinkDOMPoint.instance.z_Getter_(this);
 
   @DomName('DOMPoint.z')
   @DocsEditable()
   @Experimental() // untriaged
-  void set z(num value) => _blink.BlinkDOMPoint.z_Setter(this, value);
+  void set z(num value) => _blink.BlinkDOMPoint.instance.z_Setter_(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -9989,28 +9989,28 @@
   @DomName('DOMPointReadOnly.DOMPointReadOnly')
   @DocsEditable()
   factory DomPointReadOnly(num x, num y, num z, num w) {
-    return _blink.BlinkDOMPointReadOnly.constructorCallback_4(x, y, z, w);
+    return _blink.BlinkDOMPointReadOnly.instance.constructorCallback_4_(x, y, z, w);
   }
 
   @DomName('DOMPointReadOnly.w')
   @DocsEditable()
   @Experimental() // untriaged
-  double get w => _blink.BlinkDOMPointReadOnly.w_Getter(this);
+  double get w => _blink.BlinkDOMPointReadOnly.instance.w_Getter_(this);
 
   @DomName('DOMPointReadOnly.x')
   @DocsEditable()
   @Experimental() // untriaged
-  double get x => _blink.BlinkDOMPointReadOnly.x_Getter(this);
+  double get x => _blink.BlinkDOMPointReadOnly.instance.x_Getter_(this);
 
   @DomName('DOMPointReadOnly.y')
   @DocsEditable()
   @Experimental() // untriaged
-  double get y => _blink.BlinkDOMPointReadOnly.y_Getter(this);
+  double get y => _blink.BlinkDOMPointReadOnly.instance.y_Getter_(this);
 
   @DomName('DOMPointReadOnly.z')
   @DocsEditable()
   @Experimental() // untriaged
-  double get z => _blink.BlinkDOMPointReadOnly.z_Getter(this);
+  double get z => _blink.BlinkDOMPointReadOnly.instance.z_Getter_(this);
 
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -10118,48 +10118,48 @@
   @DomName('DOMRectReadOnly.DOMRectReadOnly')
   @DocsEditable()
   factory DomRectReadOnly(num x, num y, num width, num height) {
-    return _blink.BlinkDOMRectReadOnly.constructorCallback_4(x, y, width, height);
+    return _blink.BlinkDOMRectReadOnly.instance.constructorCallback_4_(x, y, width, height);
   }
 
   @DomName('DOMRectReadOnly.bottom')
   @DocsEditable()
   @Experimental() // untriaged
-  double get bottom => _blink.BlinkDOMRectReadOnly.bottom_Getter(this);
+  double get bottom => _blink.BlinkDOMRectReadOnly.instance.bottom_Getter_(this);
 
   @DomName('DOMRectReadOnly.height')
   @DocsEditable()
   @Experimental() // untriaged
-  double get height => _blink.BlinkDOMRectReadOnly.height_Getter(this);
+  double get height => _blink.BlinkDOMRectReadOnly.instance.height_Getter_(this);
 
   @DomName('DOMRectReadOnly.left')
   @DocsEditable()
   @Experimental() // untriaged
-  double get left => _blink.BlinkDOMRectReadOnly.left_Getter(this);
+  double get left => _blink.BlinkDOMRectReadOnly.instance.left_Getter_(this);
 
   @DomName('DOMRectReadOnly.right')
   @DocsEditable()
   @Experimental() // untriaged
-  double get right => _blink.BlinkDOMRectReadOnly.right_Getter(this);
+  double get right => _blink.BlinkDOMRectReadOnly.instance.right_Getter_(this);
 
   @DomName('DOMRectReadOnly.top')
   @DocsEditable()
   @Experimental() // untriaged
-  double get top => _blink.BlinkDOMRectReadOnly.top_Getter(this);
+  double get top => _blink.BlinkDOMRectReadOnly.instance.top_Getter_(this);
 
   @DomName('DOMRectReadOnly.width')
   @DocsEditable()
   @Experimental() // untriaged
-  double get width => _blink.BlinkDOMRectReadOnly.width_Getter(this);
+  double get width => _blink.BlinkDOMRectReadOnly.instance.width_Getter_(this);
 
   @DomName('DOMRectReadOnly.x')
   @DocsEditable()
   @Experimental() // untriaged
-  double get x => _blink.BlinkDOMRectReadOnly.x_Getter(this);
+  double get x => _blink.BlinkDOMRectReadOnly.instance.x_Getter_(this);
 
   @DomName('DOMRectReadOnly.y')
   @DocsEditable()
   @Experimental() // untriaged
-  double get y => _blink.BlinkDOMRectReadOnly.y_Getter(this);
+  double get y => _blink.BlinkDOMRectReadOnly.instance.y_Getter_(this);
 }
 
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -10177,15 +10177,15 @@
 
   @DomName('DOMSettableTokenList.value')
   @DocsEditable()
-  String get value => _blink.BlinkDOMSettableTokenList.value_Getter(this);
+  String get value => _blink.BlinkDOMSettableTokenList.instance.value_Getter_(this);
 
   @DomName('DOMSettableTokenList.value')
   @DocsEditable()
-  void set value(String value) => _blink.BlinkDOMSettableTokenList.value_Setter(this, value);
+  void set value(String value) => _blink.BlinkDOMSettableTokenList.instance.value_Setter_(this, value);
 
   @DomName('DOMSettableTokenList.__getter__')
   @DocsEditable()
-  String __getter__(int index) => _blink.BlinkDOMSettableTokenList.$__getter___Callback_1(this, index);
+  String __getter__(int index) => _blink.BlinkDOMSettableTokenList.instance.$__getter___Callback_1_(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -10203,15 +10203,15 @@
 
   @DomName('DOMStringList.length')
   @DocsEditable()
-  int get length => _blink.BlinkDOMStringList.length_Getter(this);
+  int get length => _blink.BlinkDOMStringList.instance.length_Getter_(this);
 
   String operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _blink.BlinkDOMStringList.item_Callback_1(this, index);
+    return _blink.BlinkDOMStringList.instance.item_Callback_1_(this, index);
   }
 
-  String _nativeIndexedGetter(int index) => _blink.BlinkDOMStringList.item_Callback_1(this, index);
+  String _nativeIndexedGetter(int index) => _blink.BlinkDOMStringList.instance.item_Callback_1_(this, index);
 
   void operator[]=(int index, String value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -10253,11 +10253,11 @@
 
   @DomName('DOMStringList.contains')
   @DocsEditable()
-  bool contains(String string) => _blink.BlinkDOMStringList.contains_Callback_1(this, string);
+  bool contains(String string) => _blink.BlinkDOMStringList.instance.contains_Callback_1_(this, string);
 
   @DomName('DOMStringList.item')
   @DocsEditable()
-  String item(int index) => _blink.BlinkDOMStringList.item_Callback_1(this, index);
+  String item(int index) => _blink.BlinkDOMStringList.instance.item_Callback_1_(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -10275,31 +10275,31 @@
 
   bool __delete__(index_OR_name) {
     if ((index_OR_name is int || index_OR_name == null)) {
-      return _blink.BlinkDOMStringMap.$__delete___Callback_1(this, index_OR_name);
+      return _blink.BlinkDOMStringMap.instance.$__delete___Callback_1_(this, index_OR_name);
     }
     if ((index_OR_name is String || index_OR_name == null)) {
-      return _blink.BlinkDOMStringMap.$__delete___Callback_1(this, index_OR_name);
+      return _blink.BlinkDOMStringMap.instance.$__delete___Callback_1_(this, index_OR_name);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
   String __getter__(index_OR_name) {
     if ((index_OR_name is int || index_OR_name == null)) {
-      return _blink.BlinkDOMStringMap.$__getter___Callback_1(this, index_OR_name);
+      return _blink.BlinkDOMStringMap.instance.$__getter___Callback_1_(this, index_OR_name);
     }
     if ((index_OR_name is String || index_OR_name == null)) {
-      return _blink.BlinkDOMStringMap.$__getter___Callback_1(this, index_OR_name);
+      return _blink.BlinkDOMStringMap.instance.$__getter___Callback_1_(this, index_OR_name);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
   void __setter__(index_OR_name, String value) {
     if ((value is String || value == null) && (index_OR_name is int || index_OR_name == null)) {
-      _blink.BlinkDOMStringMap.$__setter___Callback_2(this, index_OR_name, value);
+      _blink.BlinkDOMStringMap.instance.$__setter___Callback_2_(this, index_OR_name, value);
       return;
     }
     if ((value is String || value == null) && (index_OR_name is String || index_OR_name == null)) {
-      _blink.BlinkDOMStringMap.$__setter___Callback_2(this, index_OR_name, value);
+      _blink.BlinkDOMStringMap.instance.$__setter___Callback_2_(this, index_OR_name, value);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -10321,31 +10321,31 @@
 
   @DomName('DOMTokenList.length')
   @DocsEditable()
-  int get length => _blink.BlinkDOMTokenList.length_Getter(this);
+  int get length => _blink.BlinkDOMTokenList.instance.length_Getter_(this);
 
   @DomName('DOMTokenList.add')
   @DocsEditable()
   @Experimental() // untriaged
-  void add(String tokens) => _blink.BlinkDOMTokenList.add_Callback_1(this, tokens);
+  void add(String tokens) => _blink.BlinkDOMTokenList.instance.add_Callback_1_(this, tokens);
 
   @DomName('DOMTokenList.contains')
   @DocsEditable()
-  bool contains(String token) => _blink.BlinkDOMTokenList.contains_Callback_1(this, token);
+  bool contains(String token) => _blink.BlinkDOMTokenList.instance.contains_Callback_1_(this, token);
 
   @DomName('DOMTokenList.item')
   @DocsEditable()
-  String item(int index) => _blink.BlinkDOMTokenList.item_Callback_1(this, index);
+  String item(int index) => _blink.BlinkDOMTokenList.instance.item_Callback_1_(this, index);
 
   @DomName('DOMTokenList.remove')
   @DocsEditable()
   @Experimental() // untriaged
-  void remove(String tokens) => _blink.BlinkDOMTokenList.remove_Callback_1(this, tokens);
+  void remove(String tokens) => _blink.BlinkDOMTokenList.instance.remove_Callback_1_(this, tokens);
 
   bool toggle(String token, [bool force]) {
     if (force != null) {
-      return _blink.BlinkDOMTokenList.toggle_Callback_2(this, token, force);
+      return _blink.BlinkDOMTokenList.instance.toggle_Callback_2_(this, token, force);
     }
-    return _blink.BlinkDOMTokenList.toggle_Callback_1(this, token);
+    return _blink.BlinkDOMTokenList.instance.toggle_Callback_1_(this, token);
   }
 
 }
@@ -13157,154 +13157,154 @@
 
   @DomName('Element.attributes')
   @DocsEditable()
-  _NamedNodeMap get _attributes => _blink.BlinkElement.attributes_Getter(this);
+  _NamedNodeMap get _attributes => _blink.BlinkElement.instance.attributes_Getter_(this);
 
   @DomName('Element.className')
   @DocsEditable()
-  String get className => _blink.BlinkElement.className_Getter(this);
+  String get className => _blink.BlinkElement.instance.className_Getter_(this);
 
   @DomName('Element.className')
   @DocsEditable()
-  void set className(String value) => _blink.BlinkElement.className_Setter(this, value);
+  void set className(String value) => _blink.BlinkElement.instance.className_Setter_(this, value);
 
   @DomName('Element.clientHeight')
   @DocsEditable()
-  int get _clientHeight => _blink.BlinkElement.clientHeight_Getter(this);
+  int get _clientHeight => _blink.BlinkElement.instance.clientHeight_Getter_(this);
 
   @DomName('Element.clientLeft')
   @DocsEditable()
-  int get _clientLeft => _blink.BlinkElement.clientLeft_Getter(this);
+  int get _clientLeft => _blink.BlinkElement.instance.clientLeft_Getter_(this);
 
   @DomName('Element.clientTop')
   @DocsEditable()
-  int get _clientTop => _blink.BlinkElement.clientTop_Getter(this);
+  int get _clientTop => _blink.BlinkElement.instance.clientTop_Getter_(this);
 
   @DomName('Element.clientWidth')
   @DocsEditable()
-  int get _clientWidth => _blink.BlinkElement.clientWidth_Getter(this);
+  int get _clientWidth => _blink.BlinkElement.instance.clientWidth_Getter_(this);
 
   @DomName('Element.id')
   @DocsEditable()
-  String get id => _blink.BlinkElement.id_Getter(this);
+  String get id => _blink.BlinkElement.instance.id_Getter_(this);
 
   @DomName('Element.id')
   @DocsEditable()
-  void set id(String value) => _blink.BlinkElement.id_Setter(this, value);
+  void set id(String value) => _blink.BlinkElement.instance.id_Setter_(this, value);
 
   @DomName('Element.innerHTML')
   @DocsEditable()
-  String get _innerHtml => _blink.BlinkElement.innerHTML_Getter(this);
+  String get _innerHtml => _blink.BlinkElement.instance.innerHTML_Getter_(this);
 
   @DomName('Element.innerHTML')
   @DocsEditable()
-  void set _innerHtml(String value) => _blink.BlinkElement.innerHTML_Setter(this, value);
+  void set _innerHtml(String value) => _blink.BlinkElement.instance.innerHTML_Setter_(this, value);
 
   @DomName('Element.localName')
   @DocsEditable()
   @Experimental() // untriaged
-  String get _localName => _blink.BlinkElement.localName_Getter(this);
+  String get _localName => _blink.BlinkElement.instance.localName_Getter_(this);
 
   @DomName('Element.namespaceURI')
   @DocsEditable()
   @Experimental() // untriaged
-  String get _namespaceUri => _blink.BlinkElement.namespaceURI_Getter(this);
+  String get _namespaceUri => _blink.BlinkElement.instance.namespaceURI_Getter_(this);
 
   @DomName('Element.offsetHeight')
   @DocsEditable()
-  int get _offsetHeight => _blink.BlinkElement.offsetHeight_Getter(this);
+  int get _offsetHeight => _blink.BlinkElement.instance.offsetHeight_Getter_(this);
 
   @DomName('Element.offsetLeft')
   @DocsEditable()
-  int get _offsetLeft => _blink.BlinkElement.offsetLeft_Getter(this);
+  int get _offsetLeft => _blink.BlinkElement.instance.offsetLeft_Getter_(this);
 
   @DomName('Element.offsetParent')
   @DocsEditable()
-  Element get offsetParent => _blink.BlinkElement.offsetParent_Getter(this);
+  Element get offsetParent => _blink.BlinkElement.instance.offsetParent_Getter_(this);
 
   @DomName('Element.offsetTop')
   @DocsEditable()
-  int get _offsetTop => _blink.BlinkElement.offsetTop_Getter(this);
+  int get _offsetTop => _blink.BlinkElement.instance.offsetTop_Getter_(this);
 
   @DomName('Element.offsetWidth')
   @DocsEditable()
-  int get _offsetWidth => _blink.BlinkElement.offsetWidth_Getter(this);
+  int get _offsetWidth => _blink.BlinkElement.instance.offsetWidth_Getter_(this);
 
   @DomName('Element.outerHTML')
   @DocsEditable()
-  String get outerHtml => _blink.BlinkElement.outerHTML_Getter(this);
+  String get outerHtml => _blink.BlinkElement.instance.outerHTML_Getter_(this);
 
   @DomName('Element.scrollHeight')
   @DocsEditable()
-  int get _scrollHeight => _blink.BlinkElement.scrollHeight_Getter(this);
+  int get _scrollHeight => _blink.BlinkElement.instance.scrollHeight_Getter_(this);
 
   @DomName('Element.scrollLeft')
   @DocsEditable()
-  int get _scrollLeft => _blink.BlinkElement.scrollLeft_Getter(this);
+  int get _scrollLeft => _blink.BlinkElement.instance.scrollLeft_Getter_(this);
 
   @DomName('Element.scrollLeft')
   @DocsEditable()
-  void set _scrollLeft(int value) => _blink.BlinkElement.scrollLeft_Setter(this, value);
+  void set _scrollLeft(int value) => _blink.BlinkElement.instance.scrollLeft_Setter_(this, value);
 
   @DomName('Element.scrollTop')
   @DocsEditable()
-  int get _scrollTop => _blink.BlinkElement.scrollTop_Getter(this);
+  int get _scrollTop => _blink.BlinkElement.instance.scrollTop_Getter_(this);
 
   @DomName('Element.scrollTop')
   @DocsEditable()
-  void set _scrollTop(int value) => _blink.BlinkElement.scrollTop_Setter(this, value);
+  void set _scrollTop(int value) => _blink.BlinkElement.instance.scrollTop_Setter_(this, value);
 
   @DomName('Element.scrollWidth')
   @DocsEditable()
-  int get _scrollWidth => _blink.BlinkElement.scrollWidth_Getter(this);
+  int get _scrollWidth => _blink.BlinkElement.instance.scrollWidth_Getter_(this);
 
   @DomName('Element.shadowRoot')
   @DocsEditable()
   // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#api-shadow-aware-create-shadow-root
   @Experimental()
-  ShadowRoot get shadowRoot => _blink.BlinkElement.shadowRoot_Getter(this);
+  ShadowRoot get shadowRoot => _blink.BlinkElement.instance.shadowRoot_Getter_(this);
 
   @DomName('Element.style')
   @DocsEditable()
-  CssStyleDeclaration get style => _blink.BlinkElement.style_Getter(this);
+  CssStyleDeclaration get style => _blink.BlinkElement.instance.style_Getter_(this);
 
   @DomName('Element.tagName')
   @DocsEditable()
-  String get tagName => _blink.BlinkElement.tagName_Getter(this);
+  String get tagName => _blink.BlinkElement.instance.tagName_Getter_(this);
 
   @DomName('Element.animate')
   @DocsEditable()
   @Experimental() // untriaged
-  AnimationPlayer animate(Object effect, [Object timing]) => _blink.BlinkElement.animate_Callback_2(this, effect, timing);
+  AnimationPlayer animate(Object effect, [Object timing]) => _blink.BlinkElement.instance.animate_Callback_2_(this, effect, timing);
 
   @DomName('Element.blur')
   @DocsEditable()
-  void blur() => _blink.BlinkElement.blur_Callback(this);
+  void blur() => _blink.BlinkElement.instance.blur_Callback_0_(this);
 
   @DomName('Element.createShadowRoot')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME, '25')
   @Experimental()
   // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#api-shadow-aware-create-shadow-root
-  ShadowRoot createShadowRoot() => _blink.BlinkElement.createShadowRoot_Callback(this);
+  ShadowRoot createShadowRoot() => _blink.BlinkElement.instance.createShadowRoot_Callback_0_(this);
 
   @DomName('Element.focus')
   @DocsEditable()
-  void focus() => _blink.BlinkElement.focus_Callback(this);
+  void focus() => _blink.BlinkElement.instance.focus_Callback_0_(this);
 
   @DomName('Element.getAnimationPlayers')
   @DocsEditable()
   @Experimental() // untriaged
-  List<AnimationPlayer> getAnimationPlayers() => _blink.BlinkElement.getAnimationPlayers_Callback(this);
+  List<AnimationPlayer> getAnimationPlayers() => _blink.BlinkElement.instance.getAnimationPlayers_Callback_0_(this);
 
   @DomName('Element.getAttribute')
   @DocsEditable()
   @Experimental() // untriaged
-  String getAttribute(String name) => _blink.BlinkElement.getAttribute_Callback_1(this, name);
+  String getAttribute(String name) => _blink.BlinkElement.instance.getAttribute_Callback_1_(this, name);
 
   @DomName('Element.getAttributeNS')
   @DocsEditable()
   @Experimental() // untriaged
-  String getAttributeNS(String namespaceURI, String localName) => _blink.BlinkElement.getAttributeNS_Callback_2(this, namespaceURI, localName);
+  String getAttributeNS(String namespaceURI, String localName) => _blink.BlinkElement.instance.getAttributeNS_Callback_2_(this, namespaceURI, localName);
 
   /**
    * Returns the smallest bounding rectangle that encompasses this element's
@@ -13321,7 +13321,7 @@
    */
   @DomName('Element.getBoundingClientRect')
   @DocsEditable()
-  Rectangle getBoundingClientRect() => _blink.BlinkElement.getBoundingClientRect_Callback(this);
+  Rectangle getBoundingClientRect() => _blink.BlinkElement.instance.getBoundingClientRect_Callback_0_(this);
 
   /**
    * Returns a list of bounding rectangles for each box associated with this
@@ -13338,7 +13338,7 @@
    */
   @DomName('Element.getClientRects')
   @DocsEditable()
-  List<Rectangle> getClientRects() => _blink.BlinkElement.getClientRects_Callback(this);
+  List<Rectangle> getClientRects() => _blink.BlinkElement.instance.getClientRects_Callback_0_(this);
 
   /**
    * Returns a list of shadow DOM insertion points to which this element is
@@ -13353,7 +13353,7 @@
   @DomName('Element.getDestinationInsertionPoints')
   @DocsEditable()
   @Experimental() // untriaged
-  List<Node> getDestinationInsertionPoints() => _blink.BlinkElement.getDestinationInsertionPoints_Callback(this);
+  List<Node> getDestinationInsertionPoints() => _blink.BlinkElement.instance.getDestinationInsertionPoints_Callback_0_(this);
 
   /**
    * Returns a list of nodes with the given class name inside this element.
@@ -13368,111 +13368,111 @@
    */
   @DomName('Element.getElementsByClassName')
   @DocsEditable()
-  List<Node> getElementsByClassName(String classNames) => _blink.BlinkElement.getElementsByClassName_Callback_1(this, classNames);
+  List<Node> getElementsByClassName(String classNames) => _blink.BlinkElement.instance.getElementsByClassName_Callback_1_(this, classNames);
 
   @DomName('Element.getElementsByTagName')
   @DocsEditable()
-  List<Node> _getElementsByTagName(String name) => _blink.BlinkElement.getElementsByTagName_Callback_1(this, name);
+  List<Node> _getElementsByTagName(String name) => _blink.BlinkElement.instance.getElementsByTagName_Callback_1_(this, name);
 
   @DomName('Element.hasAttribute')
   @DocsEditable()
-  bool _hasAttribute(String name) => _blink.BlinkElement.hasAttribute_Callback_1(this, name);
+  bool _hasAttribute(String name) => _blink.BlinkElement.instance.hasAttribute_Callback_1_(this, name);
 
   @DomName('Element.hasAttributeNS')
   @DocsEditable()
-  bool _hasAttributeNS(String namespaceURI, String localName) => _blink.BlinkElement.hasAttributeNS_Callback_2(this, namespaceURI, localName);
+  bool _hasAttributeNS(String namespaceURI, String localName) => _blink.BlinkElement.instance.hasAttributeNS_Callback_2_(this, namespaceURI, localName);
 
   @DomName('Element.insertAdjacentElement')
   @DocsEditable()
   @Experimental() // untriaged
-  Element insertAdjacentElement(String where, Element element) => _blink.BlinkElement.insertAdjacentElement_Callback_2(this, where, element);
+  Element insertAdjacentElement(String where, Element element) => _blink.BlinkElement.instance.insertAdjacentElement_Callback_2_(this, where, element);
 
   @DomName('Element.insertAdjacentHTML')
   @DocsEditable()
   @Experimental() // untriaged
-  void insertAdjacentHtml(String where, String html) => _blink.BlinkElement.insertAdjacentHTML_Callback_2(this, where, html);
+  void insertAdjacentHtml(String where, String html) => _blink.BlinkElement.instance.insertAdjacentHTML_Callback_2_(this, where, html);
 
   @DomName('Element.insertAdjacentText')
   @DocsEditable()
   @Experimental() // untriaged
-  void insertAdjacentText(String where, String text) => _blink.BlinkElement.insertAdjacentText_Callback_2(this, where, text);
+  void insertAdjacentText(String where, String text) => _blink.BlinkElement.instance.insertAdjacentText_Callback_2_(this, where, text);
 
   @DomName('Element.matches')
   @DocsEditable()
   @Experimental() // untriaged
-  bool matches(String selectors) => _blink.BlinkElement.matches_Callback_1(this, selectors);
+  bool matches(String selectors) => _blink.BlinkElement.instance.matches_Callback_1_(this, selectors);
 
   @DomName('Element.removeAttribute')
   @DocsEditable()
-  void _removeAttribute(String name) => _blink.BlinkElement.removeAttribute_Callback_1(this, name);
+  void _removeAttribute(String name) => _blink.BlinkElement.instance.removeAttribute_Callback_1_(this, name);
 
   @DomName('Element.removeAttributeNS')
   @DocsEditable()
-  void _removeAttributeNS(String namespaceURI, String localName) => _blink.BlinkElement.removeAttributeNS_Callback_2(this, namespaceURI, localName);
+  void _removeAttributeNS(String namespaceURI, String localName) => _blink.BlinkElement.instance.removeAttributeNS_Callback_2_(this, namespaceURI, localName);
 
   @DomName('Element.requestFullscreen')
   @DocsEditable()
   @Experimental() // untriaged
-  void requestFullscreen() => _blink.BlinkElement.requestFullscreen_Callback(this);
+  void requestFullscreen() => _blink.BlinkElement.instance.requestFullscreen_Callback_0_(this);
 
   @DomName('Element.requestPointerLock')
   @DocsEditable()
   @Experimental() // untriaged
-  void requestPointerLock() => _blink.BlinkElement.requestPointerLock_Callback(this);
+  void requestPointerLock() => _blink.BlinkElement.instance.requestPointerLock_Callback_0_(this);
 
   void _scrollIntoView([bool alignWithTop]) {
     if (alignWithTop != null) {
-      _blink.BlinkElement.scrollIntoView_Callback_1(this, alignWithTop);
+      _blink.BlinkElement.instance.scrollIntoView_Callback_1_(this, alignWithTop);
       return;
     }
-    _blink.BlinkElement.scrollIntoView_Callback(this);
+    _blink.BlinkElement.instance.scrollIntoView_Callback_0_(this);
     return;
   }
 
   void _scrollIntoViewIfNeeded([bool centerIfNeeded]) {
     if (centerIfNeeded != null) {
-      _blink.BlinkElement.scrollIntoViewIfNeeded_Callback_1(this, centerIfNeeded);
+      _blink.BlinkElement.instance.scrollIntoViewIfNeeded_Callback_1_(this, centerIfNeeded);
       return;
     }
-    _blink.BlinkElement.scrollIntoViewIfNeeded_Callback(this);
+    _blink.BlinkElement.instance.scrollIntoViewIfNeeded_Callback_0_(this);
     return;
   }
 
   @DomName('Element.setAttribute')
   @DocsEditable()
-  void setAttribute(String name, String value) => _blink.BlinkElement.setAttribute_Callback_2(this, name, value);
+  void setAttribute(String name, String value) => _blink.BlinkElement.instance.setAttribute_Callback_2_(this, name, value);
 
   @DomName('Element.setAttributeNS')
   @DocsEditable()
-  void setAttributeNS(String namespaceURI, String qualifiedName, String value) => _blink.BlinkElement.setAttributeNS_Callback_3(this, namespaceURI, qualifiedName, value);
+  void setAttributeNS(String namespaceURI, String qualifiedName, String value) => _blink.BlinkElement.instance.setAttributeNS_Callback_3_(this, namespaceURI, qualifiedName, value);
 
   @DomName('Element.nextElementSibling')
   @DocsEditable()
-  Element get nextElementSibling => _blink.BlinkElement.nextElementSibling_Getter(this);
+  Element get nextElementSibling => _blink.BlinkElement.instance.nextElementSibling_Getter_(this);
 
   @DomName('Element.previousElementSibling')
   @DocsEditable()
-  Element get previousElementSibling => _blink.BlinkElement.previousElementSibling_Getter(this);
+  Element get previousElementSibling => _blink.BlinkElement.instance.previousElementSibling_Getter_(this);
 
   @DomName('Element.remove')
   @DocsEditable()
-  void remove() => _blink.BlinkElement.remove_Callback(this);
+  void remove() => _blink.BlinkElement.instance.remove_Callback_0_(this);
 
   @DomName('Element.childElementCount')
   @DocsEditable()
-  int get _childElementCount => _blink.BlinkElement.childElementCount_Getter(this);
+  int get _childElementCount => _blink.BlinkElement.instance.childElementCount_Getter_(this);
 
   @DomName('Element.children')
   @DocsEditable()
-  List<Node> get _children => _blink.BlinkElement.children_Getter(this);
+  List<Node> get _children => _blink.BlinkElement.instance.children_Getter_(this);
 
   @DomName('Element.firstElementChild')
   @DocsEditable()
-  Element get _firstElementChild => _blink.BlinkElement.firstElementChild_Getter(this);
+  Element get _firstElementChild => _blink.BlinkElement.instance.firstElementChild_Getter_(this);
 
   @DomName('Element.lastElementChild')
   @DocsEditable()
-  Element get _lastElementChild => _blink.BlinkElement.lastElementChild_Getter(this);
+  Element get _lastElementChild => _blink.BlinkElement.instance.lastElementChild_Getter_(this);
 
   /**
    * Finds the first descendant element of this element that matches the
@@ -13492,11 +13492,11 @@
    */
   @DomName('Element.querySelector')
   @DocsEditable()
-  Element querySelector(String selectors) => _blink.BlinkElement.querySelector_Callback_1(this, selectors);
+  Element querySelector(String selectors) => _blink.BlinkElement.instance.querySelector_Callback_1_(this, selectors);
 
   @DomName('Element.querySelectorAll')
   @DocsEditable()
-  List<Node> _querySelectorAll(String selectors) => _blink.BlinkElement.querySelectorAll_Callback_1(this, selectors);
+  List<Node> _querySelectorAll(String selectors) => _blink.BlinkElement.instance.querySelectorAll_Callback_1_(this, selectors);
 
   /// Stream of `abort` events handled by this [Element].
   @DomName('Element.onabort')
@@ -14022,61 +14022,61 @@
 
   @DomName('HTMLEmbedElement.height')
   @DocsEditable()
-  String get height => _blink.BlinkHTMLEmbedElement.height_Getter(this);
+  String get height => _blink.BlinkHTMLEmbedElement.instance.height_Getter_(this);
 
   @DomName('HTMLEmbedElement.height')
   @DocsEditable()
-  void set height(String value) => _blink.BlinkHTMLEmbedElement.height_Setter(this, value);
+  void set height(String value) => _blink.BlinkHTMLEmbedElement.instance.height_Setter_(this, value);
 
   @DomName('HTMLEmbedElement.integrity')
   @DocsEditable()
   @Experimental() // untriaged
-  String get integrity => _blink.BlinkHTMLEmbedElement.integrity_Getter(this);
+  String get integrity => _blink.BlinkHTMLEmbedElement.instance.integrity_Getter_(this);
 
   @DomName('HTMLEmbedElement.integrity')
   @DocsEditable()
   @Experimental() // untriaged
-  void set integrity(String value) => _blink.BlinkHTMLEmbedElement.integrity_Setter(this, value);
+  void set integrity(String value) => _blink.BlinkHTMLEmbedElement.instance.integrity_Setter_(this, value);
 
   @DomName('HTMLEmbedElement.name')
   @DocsEditable()
-  String get name => _blink.BlinkHTMLEmbedElement.name_Getter(this);
+  String get name => _blink.BlinkHTMLEmbedElement.instance.name_Getter_(this);
 
   @DomName('HTMLEmbedElement.name')
   @DocsEditable()
-  void set name(String value) => _blink.BlinkHTMLEmbedElement.name_Setter(this, value);
+  void set name(String value) => _blink.BlinkHTMLEmbedElement.instance.name_Setter_(this, value);
 
   @DomName('HTMLEmbedElement.src')
   @DocsEditable()
-  String get src => _blink.BlinkHTMLEmbedElement.src_Getter(this);
+  String get src => _blink.BlinkHTMLEmbedElement.instance.src_Getter_(this);
 
   @DomName('HTMLEmbedElement.src')
   @DocsEditable()
-  void set src(String value) => _blink.BlinkHTMLEmbedElement.src_Setter(this, value);
+  void set src(String value) => _blink.BlinkHTMLEmbedElement.instance.src_Setter_(this, value);
 
   @DomName('HTMLEmbedElement.type')
   @DocsEditable()
-  String get type => _blink.BlinkHTMLEmbedElement.type_Getter(this);
+  String get type => _blink.BlinkHTMLEmbedElement.instance.type_Getter_(this);
 
   @DomName('HTMLEmbedElement.type')
   @DocsEditable()
-  void set type(String value) => _blink.BlinkHTMLEmbedElement.type_Setter(this, value);
+  void set type(String value) => _blink.BlinkHTMLEmbedElement.instance.type_Setter_(this, value);
 
   @DomName('HTMLEmbedElement.width')
   @DocsEditable()
-  String get width => _blink.BlinkHTMLEmbedElement.width_Getter(this);
+  String get width => _blink.BlinkHTMLEmbedElement.instance.width_Getter_(this);
 
   @DomName('HTMLEmbedElement.width')
   @DocsEditable()
-  void set width(String value) => _blink.BlinkHTMLEmbedElement.width_Setter(this, value);
+  void set width(String value) => _blink.BlinkHTMLEmbedElement.instance.width_Setter_(this, value);
 
   @DomName('HTMLEmbedElement.__getter__')
   @DocsEditable()
-  bool __getter__(index_OR_name) => _blink.BlinkHTMLEmbedElement.$__getter___Callback_1(this, index_OR_name);
+  bool __getter__(index_OR_name) => _blink.BlinkHTMLEmbedElement.instance.$__getter___Callback_1_(this, index_OR_name);
 
   @DomName('HTMLEmbedElement.__setter__')
   @DocsEditable()
-  void __setter__(index_OR_name, Node value) => _blink.BlinkHTMLEmbedElement.$__setter___Callback_2(this, index_OR_name, value);
+  void __setter__(index_OR_name, Node value) => _blink.BlinkHTMLEmbedElement.instance.$__setter___Callback_2_(this, index_OR_name, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14107,38 +14107,38 @@
 
   @DomName('Entry.filesystem')
   @DocsEditable()
-  FileSystem get filesystem => _blink.BlinkEntry.filesystem_Getter(this);
+  FileSystem get filesystem => _blink.BlinkEntry.instance.filesystem_Getter_(this);
 
   @DomName('Entry.fullPath')
   @DocsEditable()
-  String get fullPath => _blink.BlinkEntry.fullPath_Getter(this);
+  String get fullPath => _blink.BlinkEntry.instance.fullPath_Getter_(this);
 
   @DomName('Entry.isDirectory')
   @DocsEditable()
-  bool get isDirectory => _blink.BlinkEntry.isDirectory_Getter(this);
+  bool get isDirectory => _blink.BlinkEntry.instance.isDirectory_Getter_(this);
 
   @DomName('Entry.isFile')
   @DocsEditable()
-  bool get isFile => _blink.BlinkEntry.isFile_Getter(this);
+  bool get isFile => _blink.BlinkEntry.instance.isFile_Getter_(this);
 
   @DomName('Entry.name')
   @DocsEditable()
-  String get name => _blink.BlinkEntry.name_Getter(this);
+  String get name => _blink.BlinkEntry.instance.name_Getter_(this);
 
   void _copyTo(DirectoryEntry parent, {String name, _EntryCallback successCallback, _ErrorCallback errorCallback}) {
     if (errorCallback != null) {
-      _blink.BlinkEntry.copyTo_Callback_4(this, parent, name, successCallback, errorCallback);
+      _blink.BlinkEntry.instance.copyTo_Callback_4_(this, parent, name, successCallback, errorCallback);
       return;
     }
     if (successCallback != null) {
-      _blink.BlinkEntry.copyTo_Callback_3(this, parent, name, successCallback);
+      _blink.BlinkEntry.instance.copyTo_Callback_3_(this, parent, name, successCallback);
       return;
     }
     if (name != null) {
-      _blink.BlinkEntry.copyTo_Callback_2(this, parent, name);
+      _blink.BlinkEntry.instance.copyTo_Callback_2_(this, parent, name);
       return;
     }
-    _blink.BlinkEntry.copyTo_Callback_1(this, parent);
+    _blink.BlinkEntry.instance.copyTo_Callback_1_(this, parent);
     return;
   }
 
@@ -14152,10 +14152,10 @@
 
   void _getMetadata(MetadataCallback successCallback, [_ErrorCallback errorCallback]) {
     if (errorCallback != null) {
-      _blink.BlinkEntry.getMetadata_Callback_2(this, successCallback, errorCallback);
+      _blink.BlinkEntry.instance.getMetadata_Callback_2_(this, successCallback, errorCallback);
       return;
     }
-    _blink.BlinkEntry.getMetadata_Callback_1(this, successCallback);
+    _blink.BlinkEntry.instance.getMetadata_Callback_1_(this, successCallback);
     return;
   }
 
@@ -14169,14 +14169,14 @@
 
   void _getParent([_EntryCallback successCallback, _ErrorCallback errorCallback]) {
     if (errorCallback != null) {
-      _blink.BlinkEntry.getParent_Callback_2(this, successCallback, errorCallback);
+      _blink.BlinkEntry.instance.getParent_Callback_2_(this, successCallback, errorCallback);
       return;
     }
     if (successCallback != null) {
-      _blink.BlinkEntry.getParent_Callback_1(this, successCallback);
+      _blink.BlinkEntry.instance.getParent_Callback_1_(this, successCallback);
       return;
     }
-    _blink.BlinkEntry.getParent_Callback(this);
+    _blink.BlinkEntry.instance.getParent_Callback_0_(this);
     return;
   }
 
@@ -14190,18 +14190,18 @@
 
   void _moveTo(DirectoryEntry parent, {String name, _EntryCallback successCallback, _ErrorCallback errorCallback}) {
     if (errorCallback != null) {
-      _blink.BlinkEntry.moveTo_Callback_4(this, parent, name, successCallback, errorCallback);
+      _blink.BlinkEntry.instance.moveTo_Callback_4_(this, parent, name, successCallback, errorCallback);
       return;
     }
     if (successCallback != null) {
-      _blink.BlinkEntry.moveTo_Callback_3(this, parent, name, successCallback);
+      _blink.BlinkEntry.instance.moveTo_Callback_3_(this, parent, name, successCallback);
       return;
     }
     if (name != null) {
-      _blink.BlinkEntry.moveTo_Callback_2(this, parent, name);
+      _blink.BlinkEntry.instance.moveTo_Callback_2_(this, parent, name);
       return;
     }
-    _blink.BlinkEntry.moveTo_Callback_1(this, parent);
+    _blink.BlinkEntry.instance.moveTo_Callback_1_(this, parent);
     return;
   }
 
@@ -14215,10 +14215,10 @@
 
   void _remove(VoidCallback successCallback, [_ErrorCallback errorCallback]) {
     if (errorCallback != null) {
-      _blink.BlinkEntry.remove_Callback_2(this, successCallback, errorCallback);
+      _blink.BlinkEntry.instance.remove_Callback_2_(this, successCallback, errorCallback);
       return;
     }
-    _blink.BlinkEntry.remove_Callback_1(this, successCallback);
+    _blink.BlinkEntry.instance.remove_Callback_1_(this, successCallback);
     return;
   }
 
@@ -14232,7 +14232,7 @@
 
   @DomName('Entry.toURL')
   @DocsEditable()
-  String toUrl() => _blink.BlinkEntry.toURL_Callback(this);
+  String toUrl() => _blink.BlinkEntry.instance.toURL_Callback_0_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14274,24 +14274,24 @@
   @DomName('ErrorEvent.colno')
   @DocsEditable()
   @Experimental() // untriaged
-  int get colno => _blink.BlinkErrorEvent.colno_Getter(this);
+  int get colno => _blink.BlinkErrorEvent.instance.colno_Getter_(this);
 
   @DomName('ErrorEvent.error')
   @DocsEditable()
   @Experimental() // untriaged
-  Object get error => _blink.BlinkErrorEvent.error_Getter(this);
+  Object get error => _blink.BlinkErrorEvent.instance.error_Getter_(this);
 
   @DomName('ErrorEvent.filename')
   @DocsEditable()
-  String get filename => _blink.BlinkErrorEvent.filename_Getter(this);
+  String get filename => _blink.BlinkErrorEvent.instance.filename_Getter_(this);
 
   @DomName('ErrorEvent.lineno')
   @DocsEditable()
-  int get lineno => _blink.BlinkErrorEvent.lineno_Getter(this);
+  int get lineno => _blink.BlinkErrorEvent.instance.lineno_Getter_(this);
 
   @DomName('ErrorEvent.message')
   @DocsEditable()
-  String get message => _blink.BlinkErrorEvent.message_Getter(this);
+  String get message => _blink.BlinkErrorEvent.instance.message_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14394,11 +14394,11 @@
 
   @DomName('Event.bubbles')
   @DocsEditable()
-  bool get bubbles => _blink.BlinkEvent.bubbles_Getter(this);
+  bool get bubbles => _blink.BlinkEvent.instance.bubbles_Getter_(this);
 
   @DomName('Event.cancelable')
   @DocsEditable()
-  bool get cancelable => _blink.BlinkEvent.cancelable_Getter(this);
+  bool get cancelable => _blink.BlinkEvent.instance.cancelable_Getter_(this);
 
   /**
    * Access to the system's clipboard data during copy, cut, and paste events.
@@ -14416,19 +14416,19 @@
   @Experimental()
   // Part of copy/paste
   @Experimental() // nonstandard
-  DataTransfer get clipboardData => _blink.BlinkEvent.clipboardData_Getter(this);
+  DataTransfer get clipboardData => _blink.BlinkEvent.instance.clipboardData_Getter_(this);
 
   @DomName('Event.currentTarget')
   @DocsEditable()
-  EventTarget get currentTarget => _blink.BlinkEvent.currentTarget_Getter(this);
+  EventTarget get currentTarget => _blink.BlinkEvent.instance.currentTarget_Getter_(this);
 
   @DomName('Event.defaultPrevented')
   @DocsEditable()
-  bool get defaultPrevented => _blink.BlinkEvent.defaultPrevented_Getter(this);
+  bool get defaultPrevented => _blink.BlinkEvent.instance.defaultPrevented_Getter_(this);
 
   @DomName('Event.eventPhase')
   @DocsEditable()
-  int get eventPhase => _blink.BlinkEvent.eventPhase_Getter(this);
+  int get eventPhase => _blink.BlinkEvent.instance.eventPhase_Getter_(this);
 
   /**
    * This event's path, taking into account shadow DOM.
@@ -14443,35 +14443,35 @@
   @DocsEditable()
   // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#extensions-to-event
   @Experimental()
-  List<Node> get path => _blink.BlinkEvent.path_Getter(this);
+  List<Node> get path => _blink.BlinkEvent.instance.path_Getter_(this);
 
   @DomName('Event.target')
   @DocsEditable()
-  EventTarget get target => _blink.BlinkEvent.target_Getter(this);
+  EventTarget get target => _blink.BlinkEvent.instance.target_Getter_(this);
 
   @DomName('Event.timeStamp')
   @DocsEditable()
-  int get timeStamp => _blink.BlinkEvent.timeStamp_Getter(this);
+  int get timeStamp => _blink.BlinkEvent.instance.timeStamp_Getter_(this);
 
   @DomName('Event.type')
   @DocsEditable()
-  String get type => _blink.BlinkEvent.type_Getter(this);
+  String get type => _blink.BlinkEvent.instance.type_Getter_(this);
 
   @DomName('Event.initEvent')
   @DocsEditable()
-  void _initEvent(String eventTypeArg, bool canBubbleArg, bool cancelableArg) => _blink.BlinkEvent.initEvent_Callback_3(this, eventTypeArg, canBubbleArg, cancelableArg);
+  void _initEvent(String eventTypeArg, bool canBubbleArg, bool cancelableArg) => _blink.BlinkEvent.instance.initEvent_Callback_3_(this, eventTypeArg, canBubbleArg, cancelableArg);
 
   @DomName('Event.preventDefault')
   @DocsEditable()
-  void preventDefault() => _blink.BlinkEvent.preventDefault_Callback(this);
+  void preventDefault() => _blink.BlinkEvent.instance.preventDefault_Callback_0_(this);
 
   @DomName('Event.stopImmediatePropagation')
   @DocsEditable()
-  void stopImmediatePropagation() => _blink.BlinkEvent.stopImmediatePropagation_Callback(this);
+  void stopImmediatePropagation() => _blink.BlinkEvent.instance.stopImmediatePropagation_Callback_0_(this);
 
   @DomName('Event.stopPropagation')
   @DocsEditable()
-  void stopPropagation() => _blink.BlinkEvent.stopPropagation_Callback(this);
+  void stopPropagation() => _blink.BlinkEvent.instance.stopPropagation_Callback_0_(this);
 
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -14526,9 +14526,9 @@
   @DocsEditable()
   static EventSource _factoryEventSource(String url, [Map eventSourceInit]) {
     if (eventSourceInit != null) {
-      return _blink.BlinkEventSource.constructorCallback_2(url, eventSourceInit);
+      return _blink.BlinkEventSource.instance.constructorCallback_2_(url, eventSourceInit);
     }
-    return _blink.BlinkEventSource.constructorCallback_1(url);
+    return _blink.BlinkEventSource.instance.constructorCallback_1_(url);
   }
 
   @DomName('EventSource.CLOSED')
@@ -14545,19 +14545,19 @@
 
   @DomName('EventSource.readyState')
   @DocsEditable()
-  int get readyState => _blink.BlinkEventSource.readyState_Getter(this);
+  int get readyState => _blink.BlinkEventSource.instance.readyState_Getter_(this);
 
   @DomName('EventSource.url')
   @DocsEditable()
-  String get url => _blink.BlinkEventSource.url_Getter(this);
+  String get url => _blink.BlinkEventSource.instance.url_Getter_(this);
 
   @DomName('EventSource.withCredentials')
   @DocsEditable()
-  bool get withCredentials => _blink.BlinkEventSource.withCredentials_Getter(this);
+  bool get withCredentials => _blink.BlinkEventSource.instance.withCredentials_Getter_(this);
 
   @DomName('EventSource.close')
   @DocsEditable()
-  void close() => _blink.BlinkEventSource.close_Callback(this);
+  void close() => _blink.BlinkEventSource.instance.close_Callback_0_(this);
 
   /// Stream of `error` events handled by this [EventSource].
   @DomName('EventSource.onerror')
@@ -14701,39 +14701,39 @@
 
   void _addEventListener([String type, EventListener listener, bool useCapture]) {
     if (useCapture != null) {
-      _blink.BlinkEventTarget.addEventListener_Callback_3(this, type, listener, useCapture);
+      _blink.BlinkEventTarget.instance.addEventListener_Callback_3_(this, type, listener, useCapture);
       return;
     }
     if (listener != null) {
-      _blink.BlinkEventTarget.addEventListener_Callback_2(this, type, listener);
+      _blink.BlinkEventTarget.instance.addEventListener_Callback_2_(this, type, listener);
       return;
     }
     if (type != null) {
-      _blink.BlinkEventTarget.addEventListener_Callback_1(this, type);
+      _blink.BlinkEventTarget.instance.addEventListener_Callback_1_(this, type);
       return;
     }
-    _blink.BlinkEventTarget.addEventListener_Callback(this);
+    _blink.BlinkEventTarget.instance.addEventListener_Callback_0_(this);
     return;
   }
 
   @DomName('EventTarget.dispatchEvent')
   @DocsEditable()
-  bool dispatchEvent(Event event) => _blink.BlinkEventTarget.dispatchEvent_Callback_1(this, event);
+  bool dispatchEvent(Event event) => _blink.BlinkEventTarget.instance.dispatchEvent_Callback_1_(this, event);
 
   void _removeEventListener([String type, EventListener listener, bool useCapture]) {
     if (useCapture != null) {
-      _blink.BlinkEventTarget.removeEventListener_Callback_3(this, type, listener, useCapture);
+      _blink.BlinkEventTarget.instance.removeEventListener_Callback_3_(this, type, listener, useCapture);
       return;
     }
     if (listener != null) {
-      _blink.BlinkEventTarget.removeEventListener_Callback_2(this, type, listener);
+      _blink.BlinkEventTarget.instance.removeEventListener_Callback_2_(this, type, listener);
       return;
     }
     if (type != null) {
-      _blink.BlinkEventTarget.removeEventListener_Callback_1(this, type);
+      _blink.BlinkEventTarget.instance.removeEventListener_Callback_1_(this, type);
       return;
     }
-    _blink.BlinkEventTarget.removeEventListener_Callback(this);
+    _blink.BlinkEventTarget.instance.removeEventListener_Callback_0_(this);
     return;
   }
 
@@ -14755,13 +14755,13 @@
   @DomName('FederatedCredential.FederatedCredential')
   @DocsEditable()
   factory FederatedCredential(String id, String name, String avatarURL, String federation) {
-    return _blink.BlinkFederatedCredential.constructorCallback_4(id, name, avatarURL, federation);
+    return _blink.BlinkFederatedCredential.instance.constructorCallback_4_(id, name, avatarURL, federation);
   }
 
   @DomName('FederatedCredential.federation')
   @DocsEditable()
   @Experimental() // untriaged
-  String get federation => _blink.BlinkFederatedCredential.federation_Getter(this);
+  String get federation => _blink.BlinkFederatedCredential.instance.federation_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14781,22 +14781,22 @@
   @DomName('FetchBodyStream.asArrayBuffer')
   @DocsEditable()
   @Experimental() // untriaged
-  Future asArrayBuffer() => _blink.BlinkFetchBodyStream.asArrayBuffer_Callback(this);
+  Future asArrayBuffer() => _blink.BlinkFetchBodyStream.instance.asArrayBuffer_Callback_0_(this);
 
   @DomName('FetchBodyStream.asBlob')
   @DocsEditable()
   @Experimental() // untriaged
-  Future asBlob() => _blink.BlinkFetchBodyStream.asBlob_Callback(this);
+  Future asBlob() => _blink.BlinkFetchBodyStream.instance.asBlob_Callback_0_(this);
 
   @DomName('FetchBodyStream.asJSON')
   @DocsEditable()
   @Experimental() // untriaged
-  Future asJson() => _blink.BlinkFetchBodyStream.asJSON_Callback(this);
+  Future asJson() => _blink.BlinkFetchBodyStream.instance.asJSON_Callback_0_(this);
 
   @DomName('FetchBodyStream.asText')
   @DocsEditable()
   @Experimental() // untriaged
-  Future asText() => _blink.BlinkFetchBodyStream.asText_Callback(this);
+  Future asText() => _blink.BlinkFetchBodyStream.instance.asText_Callback_0_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14816,17 +14816,17 @@
   @DomName('FetchEvent.isReload')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get isReload => _blink.BlinkFetchEvent.isReload_Getter(this);
+  bool get isReload => _blink.BlinkFetchEvent.instance.isReload_Getter_(this);
 
   @DomName('FetchEvent.request')
   @DocsEditable()
   @Experimental() // untriaged
-  _Request get request => _blink.BlinkFetchEvent.request_Getter(this);
+  _Request get request => _blink.BlinkFetchEvent.instance.request_Getter_(this);
 
   @DomName('FetchEvent.respondWith')
   @DocsEditable()
   @Experimental() // untriaged
-  void respondWith(Object value) => _blink.BlinkFetchEvent.respondWith_Callback_1(this, value);
+  void respondWith(Object value) => _blink.BlinkFetchEvent.instance.respondWith_Callback_1_(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14855,51 +14855,51 @@
 
   @DomName('HTMLFieldSetElement.disabled')
   @DocsEditable()
-  bool get disabled => _blink.BlinkHTMLFieldSetElement.disabled_Getter(this);
+  bool get disabled => _blink.BlinkHTMLFieldSetElement.instance.disabled_Getter_(this);
 
   @DomName('HTMLFieldSetElement.disabled')
   @DocsEditable()
-  void set disabled(bool value) => _blink.BlinkHTMLFieldSetElement.disabled_Setter(this, value);
+  void set disabled(bool value) => _blink.BlinkHTMLFieldSetElement.instance.disabled_Setter_(this, value);
 
   @DomName('HTMLFieldSetElement.elements')
   @DocsEditable()
-  List<Node> get elements => _blink.BlinkHTMLFieldSetElement.elements_Getter(this);
+  List<Node> get elements => _blink.BlinkHTMLFieldSetElement.instance.elements_Getter_(this);
 
   @DomName('HTMLFieldSetElement.form')
   @DocsEditable()
-  FormElement get form => _blink.BlinkHTMLFieldSetElement.form_Getter(this);
+  FormElement get form => _blink.BlinkHTMLFieldSetElement.instance.form_Getter_(this);
 
   @DomName('HTMLFieldSetElement.name')
   @DocsEditable()
-  String get name => _blink.BlinkHTMLFieldSetElement.name_Getter(this);
+  String get name => _blink.BlinkHTMLFieldSetElement.instance.name_Getter_(this);
 
   @DomName('HTMLFieldSetElement.name')
   @DocsEditable()
-  void set name(String value) => _blink.BlinkHTMLFieldSetElement.name_Setter(this, value);
+  void set name(String value) => _blink.BlinkHTMLFieldSetElement.instance.name_Setter_(this, value);
 
   @DomName('HTMLFieldSetElement.type')
   @DocsEditable()
-  String get type => _blink.BlinkHTMLFieldSetElement.type_Getter(this);
+  String get type => _blink.BlinkHTMLFieldSetElement.instance.type_Getter_(this);
 
   @DomName('HTMLFieldSetElement.validationMessage')
   @DocsEditable()
-  String get validationMessage => _blink.BlinkHTMLFieldSetElement.validationMessage_Getter(this);
+  String get validationMessage => _blink.BlinkHTMLFieldSetElement.instance.validationMessage_Getter_(this);
 
   @DomName('HTMLFieldSetElement.validity')
   @DocsEditable()
-  ValidityState get validity => _blink.BlinkHTMLFieldSetElement.validity_Getter(this);
+  ValidityState get validity => _blink.BlinkHTMLFieldSetElement.instance.validity_Getter_(this);
 
   @DomName('HTMLFieldSetElement.willValidate')
   @DocsEditable()
-  bool get willValidate => _blink.BlinkHTMLFieldSetElement.willValidate_Getter(this);
+  bool get willValidate => _blink.BlinkHTMLFieldSetElement.instance.willValidate_Getter_(this);
 
   @DomName('HTMLFieldSetElement.checkValidity')
   @DocsEditable()
-  bool checkValidity() => _blink.BlinkHTMLFieldSetElement.checkValidity_Callback(this);
+  bool checkValidity() => _blink.BlinkHTMLFieldSetElement.instance.checkValidity_Callback_0_(this);
 
   @DomName('HTMLFieldSetElement.setCustomValidity')
   @DocsEditable()
-  void setCustomValidity(String error) => _blink.BlinkHTMLFieldSetElement.setCustomValidity_Callback_1(this, error);
+  void setCustomValidity(String error) => _blink.BlinkHTMLFieldSetElement.instance.setCustomValidity_Callback_1_(this, error);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14918,15 +14918,15 @@
   @DomName('File.lastModified')
   @DocsEditable()
   @Experimental() // untriaged
-  int get lastModified => _blink.BlinkFile.lastModified_Getter(this);
+  int get lastModified => _blink.BlinkFile.instance.lastModified_Getter_(this);
 
   @DomName('File.lastModifiedDate')
   @DocsEditable()
-  DateTime get lastModifiedDate => _blink.BlinkFile.lastModifiedDate_Getter(this);
+  DateTime get lastModifiedDate => _blink.BlinkFile.instance.lastModifiedDate_Getter_(this);
 
   @DomName('File.name')
   @DocsEditable()
-  String get name => _blink.BlinkFile.name_Getter(this);
+  String get name => _blink.BlinkFile.instance.name_Getter_(this);
 
   @DomName('File.webkitRelativePath')
   @DocsEditable()
@@ -14934,7 +14934,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://plus.sandbox.google.com/+AddyOsmani/posts/Dk5UhZ6zfF3
-  String get relativePath => _blink.BlinkFile.webkitRelativePath_Getter(this);
+  String get relativePath => _blink.BlinkFile.instance.webkitRelativePath_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14965,10 +14965,10 @@
 
   void _createWriter(_FileWriterCallback successCallback, [_ErrorCallback errorCallback]) {
     if (errorCallback != null) {
-      _blink.BlinkFileEntry.createWriter_Callback_2(this, successCallback, errorCallback);
+      _blink.BlinkFileEntry.instance.createWriter_Callback_2_(this, successCallback, errorCallback);
       return;
     }
-    _blink.BlinkFileEntry.createWriter_Callback_1(this, successCallback);
+    _blink.BlinkFileEntry.instance.createWriter_Callback_1_(this, successCallback);
     return;
   }
 
@@ -14982,10 +14982,10 @@
 
   void _file(_FileCallback successCallback, [_ErrorCallback errorCallback]) {
     if (errorCallback != null) {
-      _blink.BlinkFileEntry.file_Callback_2(this, successCallback, errorCallback);
+      _blink.BlinkFileEntry.instance.file_Callback_2_(this, successCallback, errorCallback);
       return;
     }
-    _blink.BlinkFileEntry.file_Callback_1(this, successCallback);
+    _blink.BlinkFileEntry.instance.file_Callback_1_(this, successCallback);
     return;
   }
 
@@ -15063,7 +15063,7 @@
 
   @DomName('FileError.code')
   @DocsEditable()
-  int get code => _blink.BlinkFileError.code_Getter(this);
+  int get code => _blink.BlinkFileError.instance.code_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -15081,15 +15081,15 @@
 
   @DomName('FileList.length')
   @DocsEditable()
-  int get length => _blink.BlinkFileList.length_Getter(this);
+  int get length => _blink.BlinkFileList.instance.length_Getter_(this);
 
   File operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _blink.BlinkFileList.item_Callback_1(this, index);
+    return _blink.BlinkFileList.instance.item_Callback_1_(this, index);
   }
 
-  File _nativeIndexedGetter(int index) => _blink.BlinkFileList.item_Callback_1(this, index);
+  File _nativeIndexedGetter(int index) => _blink.BlinkFileList.instance.item_Callback_1_(this, index);
 
   void operator[]=(int index, File value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -15131,7 +15131,7 @@
 
   @DomName('FileList.item')
   @DocsEditable()
-  File item(int index) => _blink.BlinkFileList.item_Callback_1(this, index);
+  File item(int index) => _blink.BlinkFileList.instance.item_Callback_1_(this, index);
 
 }
 // Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
@@ -15219,7 +15219,7 @@
   @DomName('FileReader.FileReader')
   @DocsEditable()
   factory FileReader() {
-    return _blink.BlinkFileReader.constructorCallback();
+    return _blink.BlinkFileReader.instance.constructorCallback_0_();
   }
 
   @DomName('FileReader.DONE')
@@ -15236,34 +15236,34 @@
 
   @DomName('FileReader.error')
   @DocsEditable()
-  FileError get error => _blink.BlinkFileReader.error_Getter(this);
+  FileError get error => _blink.BlinkFileReader.instance.error_Getter_(this);
 
   @DomName('FileReader.readyState')
   @DocsEditable()
-  int get readyState => _blink.BlinkFileReader.readyState_Getter(this);
+  int get readyState => _blink.BlinkFileReader.instance.readyState_Getter_(this);
 
   @DomName('FileReader.result')
   @DocsEditable()
-  Object get _result => _blink.BlinkFileReader.result_Getter(this);
+  Object get _result => _blink.BlinkFileReader.instance.result_Getter_(this);
 
   @DomName('FileReader.abort')
   @DocsEditable()
-  void abort() => _blink.BlinkFileReader.abort_Callback(this);
+  void abort() => _blink.BlinkFileReader.instance.abort_Callback_0_(this);
 
   @DomName('FileReader.readAsArrayBuffer')
   @DocsEditable()
-  void readAsArrayBuffer(Blob blob) => _blink.BlinkFileReader.readAsArrayBuffer_Callback_1(this, blob);
+  void readAsArrayBuffer(Blob blob) => _blink.BlinkFileReader.instance.readAsArrayBuffer_Callback_1_(this, blob);
 
   @DomName('FileReader.readAsDataURL')
   @DocsEditable()
-  void readAsDataUrl(Blob blob) => _blink.BlinkFileReader.readAsDataURL_Callback_1(this, blob);
+  void readAsDataUrl(Blob blob) => _blink.BlinkFileReader.instance.readAsDataURL_Callback_1_(this, blob);
 
   void readAsText(Blob blob, [String encoding]) {
     if (encoding != null) {
-      _blink.BlinkFileReader.readAsText_Callback_2(this, blob, encoding);
+      _blink.BlinkFileReader.instance.readAsText_Callback_2_(this, blob, encoding);
       return;
     }
-    _blink.BlinkFileReader.readAsText_Callback_1(this, blob);
+    _blink.BlinkFileReader.instance.readAsText_Callback_1_(this, blob);
     return;
   }
 
@@ -15315,7 +15315,7 @@
   @DomName('Stream.type')
   @DocsEditable()
   @Experimental() // untriaged
-  String get type => _blink.BlinkStream.type_Getter(this);
+  String get type => _blink.BlinkStream.instance.type_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -15339,11 +15339,11 @@
 
   @DomName('DOMFileSystem.name')
   @DocsEditable()
-  String get name => _blink.BlinkDOMFileSystem.name_Getter(this);
+  String get name => _blink.BlinkDOMFileSystem.instance.name_Getter_(this);
 
   @DomName('DOMFileSystem.root')
   @DocsEditable()
-  DirectoryEntry get root => _blink.BlinkDOMFileSystem.root_Getter(this);
+  DirectoryEntry get root => _blink.BlinkDOMFileSystem.instance.root_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -15446,35 +15446,35 @@
 
   @DomName('FileWriter.error')
   @DocsEditable()
-  FileError get error => _blink.BlinkFileWriter.error_Getter(this);
+  FileError get error => _blink.BlinkFileWriter.instance.error_Getter_(this);
 
   @DomName('FileWriter.length')
   @DocsEditable()
-  int get length => _blink.BlinkFileWriter.length_Getter(this);
+  int get length => _blink.BlinkFileWriter.instance.length_Getter_(this);
 
   @DomName('FileWriter.position')
   @DocsEditable()
-  int get position => _blink.BlinkFileWriter.position_Getter(this);
+  int get position => _blink.BlinkFileWriter.instance.position_Getter_(this);
 
   @DomName('FileWriter.readyState')
   @DocsEditable()
-  int get readyState => _blink.BlinkFileWriter.readyState_Getter(this);
+  int get readyState => _blink.BlinkFileWriter.instance.readyState_Getter_(this);
 
   @DomName('FileWriter.abort')
   @DocsEditable()
-  void abort() => _blink.BlinkFileWriter.abort_Callback(this);
+  void abort() => _blink.BlinkFileWriter.instance.abort_Callback_0_(this);
 
   @DomName('FileWriter.seek')
   @DocsEditable()
-  void seek(int position) => _blink.BlinkFileWriter.seek_Callback_1(this, position);
+  void seek(int position) => _blink.BlinkFileWriter.instance.seek_Callback_1_(this, position);
 
   @DomName('FileWriter.truncate')
   @DocsEditable()
-  void truncate(int size) => _blink.BlinkFileWriter.truncate_Callback_1(this, size);
+  void truncate(int size) => _blink.BlinkFileWriter.instance.truncate_Callback_1_(this, size);
 
   @DomName('FileWriter.write')
   @DocsEditable()
-  void write(Blob data) => _blink.BlinkFileWriter.write_Callback_1(this, data);
+  void write(Blob data) => _blink.BlinkFileWriter.instance.write_Callback_1_(this, data);
 
   /// Stream of `abort` events handled by this [FileWriter].
   @DomName('FileWriter.onabort')
@@ -15533,7 +15533,7 @@
 
   @DomName('FocusEvent.relatedTarget')
   @DocsEditable()
-  EventTarget get relatedTarget => _blink.BlinkFocusEvent.relatedTarget_Getter(this);
+  EventTarget get relatedTarget => _blink.BlinkFocusEvent.instance.relatedTarget_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -15554,22 +15554,22 @@
   @DocsEditable()
   factory FontFace(String family, source, [Map descriptors]) {
     if ((source is String || source == null) && (family is String || family == null) && descriptors == null) {
-      return _blink.BlinkFontFace.constructorCallback_2(family, source);
+      return _blink.BlinkFontFace.instance.constructorCallback_2_(family, source);
     }
     if ((descriptors is Map || descriptors == null) && (source is String || source == null) && (family is String || family == null)) {
-      return _blink.BlinkFontFace.constructorCallback_3(family, source, descriptors);
+      return _blink.BlinkFontFace.instance.constructorCallback_3_(family, source, descriptors);
     }
     if ((source is TypedData || source == null) && (family is String || family == null) && descriptors == null) {
-      return _blink.BlinkFontFace.constructorCallback_2(family, source);
+      return _blink.BlinkFontFace.instance.constructorCallback_2_(family, source);
     }
     if ((descriptors is Map || descriptors == null) && (source is TypedData || source == null) && (family is String || family == null)) {
-      return _blink.BlinkFontFace.constructorCallback_3(family, source, descriptors);
+      return _blink.BlinkFontFace.instance.constructorCallback_3_(family, source, descriptors);
     }
     if ((source is ByteBuffer || source == null) && (family is String || family == null) && descriptors == null) {
-      return _blink.BlinkFontFace.constructorCallback_2(family, source);
+      return _blink.BlinkFontFace.instance.constructorCallback_2_(family, source);
     }
     if ((descriptors is Map || descriptors == null) && (source is ByteBuffer || source == null) && (family is String || family == null)) {
-      return _blink.BlinkFontFace.constructorCallback_3(family, source, descriptors);
+      return _blink.BlinkFontFace.instance.constructorCallback_3_(family, source, descriptors);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
@@ -15577,87 +15577,87 @@
   @DomName('FontFace.family')
   @DocsEditable()
   @Experimental() // untriaged
-  String get family => _blink.BlinkFontFace.family_Getter(this);
+  String get family => _blink.BlinkFontFace.instance.family_Getter_(this);
 
   @DomName('FontFace.family')
   @DocsEditable()
   @Experimental() // untriaged
-  void set family(String value) => _blink.BlinkFontFace.family_Setter(this, value);
+  void set family(String value) => _blink.BlinkFontFace.instance.family_Setter_(this, value);
 
   @DomName('FontFace.featureSettings')
   @DocsEditable()
   @Experimental() // untriaged
-  String get featureSettings => _blink.BlinkFontFace.featureSettings_Getter(this);
+  String get featureSettings => _blink.BlinkFontFace.instance.featureSettings_Getter_(this);
 
   @DomName('FontFace.featureSettings')
   @DocsEditable()
   @Experimental() // untriaged
-  void set featureSettings(String value) => _blink.BlinkFontFace.featureSettings_Setter(this, value);
+  void set featureSettings(String value) => _blink.BlinkFontFace.instance.featureSettings_Setter_(this, value);
 
   @DomName('FontFace.loaded')
   @DocsEditable()
   @Experimental() // untriaged
-  Future get loaded => _blink.BlinkFontFace.loaded_Getter(this);
+  Future get loaded => _blink.BlinkFontFace.instance.loaded_Getter_(this);
 
   @DomName('FontFace.status')
   @DocsEditable()
   @Experimental() // untriaged
-  String get status => _blink.BlinkFontFace.status_Getter(this);
+  String get status => _blink.BlinkFontFace.instance.status_Getter_(this);
 
   @DomName('FontFace.stretch')
   @DocsEditable()
   @Experimental() // untriaged
-  String get stretch => _blink.BlinkFontFace.stretch_Getter(this);
+  String get stretch => _blink.BlinkFontFace.instance.stretch_Getter_(this);
 
   @DomName('FontFace.stretch')
   @DocsEditable()
   @Experimental() // untriaged
-  void set stretch(String value) => _blink.BlinkFontFace.stretch_Setter(this, value);
+  void set stretch(String value) => _blink.BlinkFontFace.instance.stretch_Setter_(this, value);
 
   @DomName('FontFace.style')
   @DocsEditable()
   @Experimental() // untriaged
-  String get style => _blink.BlinkFontFace.style_Getter(this);
+  String get style => _blink.BlinkFontFace.instance.style_Getter_(this);
 
   @DomName('FontFace.style')
   @DocsEditable()
   @Experimental() // untriaged
-  void set style(String value) => _blink.BlinkFontFace.style_Setter(this, value);
+  void set style(String value) => _blink.BlinkFontFace.instance.style_Setter_(this, value);
 
   @DomName('FontFace.unicodeRange')
   @DocsEditable()
   @Experimental() // untriaged
-  String get unicodeRange => _blink.BlinkFontFace.unicodeRange_Getter(this);
+  String get unicodeRange => _blink.BlinkFontFace.instance.unicodeRange_Getter_(this);
 
   @DomName('FontFace.unicodeRange')
   @DocsEditable()
   @Experimental() // untriaged
-  void set unicodeRange(String value) => _blink.BlinkFontFace.unicodeRange_Setter(this, value);
+  void set unicodeRange(String value) => _blink.BlinkFontFace.instance.unicodeRange_Setter_(this, value);
 
   @DomName('FontFace.variant')
   @DocsEditable()
   @Experimental() // untriaged
-  String get variant => _blink.BlinkFontFace.variant_Getter(this);
+  String get variant => _blink.BlinkFontFace.instance.variant_Getter_(this);
 
   @DomName('FontFace.variant')
   @DocsEditable()
   @Experimental() // untriaged
-  void set variant(String value) => _blink.BlinkFontFace.variant_Setter(this, value);
+  void set variant(String value) => _blink.BlinkFontFace.instance.variant_Setter_(this, value);
 
   @DomName('FontFace.weight')
   @DocsEditable()
   @Experimental() // untriaged
-  String get weight => _blink.BlinkFontFace.weight_Getter(this);
+  String get weight => _blink.BlinkFontFace.instance.weight_Getter_(this);
 
   @DomName('FontFace.weight')
   @DocsEditable()
   @Experimental() // untriaged
-  void set weight(String value) => _blink.BlinkFontFace.weight_Setter(this, value);
+  void set weight(String value) => _blink.BlinkFontFace.instance.weight_Setter_(this, value);
 
   @DomName('FontFace.load')
   @DocsEditable()
   @Experimental() // untriaged
-  Future load() => _blink.BlinkFontFace.load_Callback(this);
+  Future load() => _blink.BlinkFontFace.instance.load_Callback_0_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -15677,46 +15677,46 @@
   @DomName('FontFaceSet.size')
   @DocsEditable()
   @Experimental() // untriaged
-  int get size => _blink.BlinkFontFaceSet.size_Getter(this);
+  int get size => _blink.BlinkFontFaceSet.instance.size_Getter_(this);
 
   @DomName('FontFaceSet.status')
   @DocsEditable()
   @Experimental() // untriaged
-  String get status => _blink.BlinkFontFaceSet.status_Getter(this);
+  String get status => _blink.BlinkFontFaceSet.instance.status_Getter_(this);
 
   @DomName('FontFaceSet.add')
   @DocsEditable()
   @Experimental() // untriaged
-  void add(FontFace fontFace) => _blink.BlinkFontFaceSet.add_Callback_1(this, fontFace);
+  void add(FontFace fontFace) => _blink.BlinkFontFaceSet.instance.add_Callback_1_(this, fontFace);
 
   @DomName('FontFaceSet.check')
   @DocsEditable()
   @Experimental() // untriaged
-  bool check(String font, String text) => _blink.BlinkFontFaceSet.check_Callback_2(this, font, text);
+  bool check(String font, String text) => _blink.BlinkFontFaceSet.instance.check_Callback_2_(this, font, text);
 
   @DomName('FontFaceSet.clear')
   @DocsEditable()
   @Experimental() // untriaged
-  void clear() => _blink.BlinkFontFaceSet.clear_Callback(this);
+  void clear() => _blink.BlinkFontFaceSet.instance.clear_Callback_0_(this);
 
   @DomName('FontFaceSet.delete')
   @DocsEditable()
   @Experimental() // untriaged
-  bool delete(FontFace fontFace) => _blink.BlinkFontFaceSet.delete_Callback_1(this, fontFace);
+  bool delete(FontFace fontFace) => _blink.BlinkFontFaceSet.instance.delete_Callback_1_(this, fontFace);
 
   void forEach(FontFaceSetForEachCallback callback, [Object thisArg]) {
     if (thisArg != null) {
-      _blink.BlinkFontFaceSet.forEach_Callback_2(this, callback, thisArg);
+      _blink.BlinkFontFaceSet.instance.forEach_Callback_2_(this, callback, thisArg);
       return;
     }
-    _blink.BlinkFontFaceSet.forEach_Callback_1(this, callback);
+    _blink.BlinkFontFaceSet.instance.forEach_Callback_1_(this, callback);
     return;
   }
 
   @DomName('FontFaceSet.has')
   @DocsEditable()
   @Experimental() // untriaged
-  bool has(FontFace fontFace) => _blink.BlinkFontFaceSet.has_Callback_1(this, fontFace);
+  bool has(FontFace fontFace) => _blink.BlinkFontFaceSet.instance.has_Callback_1_(this, fontFace);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -15746,7 +15746,7 @@
   @DomName('FontFaceSetLoadEvent.fontfaces')
   @DocsEditable()
   @Experimental() // untriaged
-  List<FontFace> get fontfaces => _blink.BlinkFontFaceSetLoadEvent.fontfaces_Getter(this);
+  List<FontFace> get fontfaces => _blink.BlinkFontFaceSetLoadEvent.instance.fontfaces_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -15771,18 +15771,18 @@
   factory FormData([FormElement form]) => _create(form);
 
   @DocsEditable()
-  static FormData _create(form) => _blink.BlinkFormData.constructorCallback_1(form);
+  static FormData _create(form) => _blink.BlinkFormData.instance.constructorCallback_1_(form);
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
 
   @DomName('FormData.append')
   @DocsEditable()
-  void append(String name, String value) => _blink.BlinkFormData.append_Callback_2(this, name, value);
+  void append(String name, String value) => _blink.BlinkFormData.instance.append_Callback_2_(this, name, value);
 
   @DomName('FormData.appendBlob')
   @DocsEditable()
-  void appendBlob(String name, Blob value, [String filename]) => _blink.BlinkFormData.append_Callback_3(this, name, value, filename);
+  void appendBlob(String name, Blob value, [String filename]) => _blink.BlinkFormData.instance.append_Callback_3_(this, name, value, filename);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -15810,111 +15810,111 @@
 
   @DomName('HTMLFormElement.acceptCharset')
   @DocsEditable()
-  String get acceptCharset => _blink.BlinkHTMLFormElement.acceptCharset_Getter(this);
+  String get acceptCharset => _blink.BlinkHTMLFormElement.instance.acceptCharset_Getter_(this);
 
   @DomName('HTMLFormElement.acceptCharset')
   @DocsEditable()
-  void set acceptCharset(String value) => _blink.BlinkHTMLFormElement.acceptCharset_Setter(this, value);
+  void set acceptCharset(String value) => _blink.BlinkHTMLFormElement.instance.acceptCharset_Setter_(this, value);
 
   @DomName('HTMLFormElement.action')
   @DocsEditable()
-  String get action => _blink.BlinkHTMLFormElement.action_Getter(this);
+  String get action => _blink.BlinkHTMLFormElement.instance.action_Getter_(this);
 
   @DomName('HTMLFormElement.action')
   @DocsEditable()
-  void set action(String value) => _blink.BlinkHTMLFormElement.action_Setter(this, value);
+  void set action(String value) => _blink.BlinkHTMLFormElement.instance.action_Setter_(this, value);
 
   @DomName('HTMLFormElement.autocomplete')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/association-of-controls-and-forms.html#autofilling-form-controls:-the-autocomplete-attribute
   @Experimental()
-  String get autocomplete => _blink.BlinkHTMLFormElement.autocomplete_Getter(this);
+  String get autocomplete => _blink.BlinkHTMLFormElement.instance.autocomplete_Getter_(this);
 
   @DomName('HTMLFormElement.autocomplete')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/association-of-controls-and-forms.html#autofilling-form-controls:-the-autocomplete-attribute
   @Experimental()
-  void set autocomplete(String value) => _blink.BlinkHTMLFormElement.autocomplete_Setter(this, value);
+  void set autocomplete(String value) => _blink.BlinkHTMLFormElement.instance.autocomplete_Setter_(this, value);
 
   @DomName('HTMLFormElement.encoding')
   @DocsEditable()
-  String get encoding => _blink.BlinkHTMLFormElement.encoding_Getter(this);
+  String get encoding => _blink.BlinkHTMLFormElement.instance.encoding_Getter_(this);
 
   @DomName('HTMLFormElement.encoding')
   @DocsEditable()
-  void set encoding(String value) => _blink.BlinkHTMLFormElement.encoding_Setter(this, value);
+  void set encoding(String value) => _blink.BlinkHTMLFormElement.instance.encoding_Setter_(this, value);
 
   @DomName('HTMLFormElement.enctype')
   @DocsEditable()
-  String get enctype => _blink.BlinkHTMLFormElement.enctype_Getter(this);
+  String get enctype => _blink.BlinkHTMLFormElement.instance.enctype_Getter_(this);
 
   @DomName('HTMLFormElement.enctype')
   @DocsEditable()
-  void set enctype(String value) => _blink.BlinkHTMLFormElement.enctype_Setter(this, value);
+  void set enctype(String value) => _blink.BlinkHTMLFormElement.instance.enctype_Setter_(this, value);
 
   @DomName('HTMLFormElement.length')
   @DocsEditable()
-  int get length => _blink.BlinkHTMLFormElement.length_Getter(this);
+  int get length => _blink.BlinkHTMLFormElement.instance.length_Getter_(this);
 
   @DomName('HTMLFormElement.method')
   @DocsEditable()
-  String get method => _blink.BlinkHTMLFormElement.method_Getter(this);
+  String get method => _blink.BlinkHTMLFormElement.instance.method_Getter_(this);
 
   @DomName('HTMLFormElement.method')
   @DocsEditable()
-  void set method(String value) => _blink.BlinkHTMLFormElement.method_Setter(this, value);
+  void set method(String value) => _blink.BlinkHTMLFormElement.instance.method_Setter_(this, value);
 
   @DomName('HTMLFormElement.name')
   @DocsEditable()
-  String get name => _blink.BlinkHTMLFormElement.name_Getter(this);
+  String get name => _blink.BlinkHTMLFormElement.instance.name_Getter_(this);
 
   @DomName('HTMLFormElement.name')
   @DocsEditable()
-  void set name(String value) => _blink.BlinkHTMLFormElement.name_Setter(this, value);
+  void set name(String value) => _blink.BlinkHTMLFormElement.instance.name_Setter_(this, value);
 
   @DomName('HTMLFormElement.noValidate')
   @DocsEditable()
-  bool get noValidate => _blink.BlinkHTMLFormElement.noValidate_Getter(this);
+  bool get noValidate => _blink.BlinkHTMLFormElement.instance.noValidate_Getter_(this);
 
   @DomName('HTMLFormElement.noValidate')
   @DocsEditable()
-  void set noValidate(bool value) => _blink.BlinkHTMLFormElement.noValidate_Setter(this, value);
+  void set noValidate(bool value) => _blink.BlinkHTMLFormElement.instance.noValidate_Setter_(this, value);
 
   @DomName('HTMLFormElement.target')
   @DocsEditable()
-  String get target => _blink.BlinkHTMLFormElement.target_Getter(this);
+  String get target => _blink.BlinkHTMLFormElement.instance.target_Getter_(this);
 
   @DomName('HTMLFormElement.target')
   @DocsEditable()
-  void set target(String value) => _blink.BlinkHTMLFormElement.target_Setter(this, value);
+  void set target(String value) => _blink.BlinkHTMLFormElement.instance.target_Setter_(this, value);
 
   Element __getter__(index_OR_name) {
     if ((index_OR_name is int || index_OR_name == null)) {
-      return _blink.BlinkHTMLFormElement.$__getter___Callback_1(this, index_OR_name);
+      return _blink.BlinkHTMLFormElement.instance.$__getter___Callback_1_(this, index_OR_name);
     }
     if ((index_OR_name is String || index_OR_name == null)) {
-      return _blink.BlinkHTMLFormElement.$__getter___Callback_1(this, index_OR_name);
+      return _blink.BlinkHTMLFormElement.instance.$__getter___Callback_1_(this, index_OR_name);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
   @DomName('HTMLFormElement.checkValidity')
   @DocsEditable()
-  bool checkValidity() => _blink.BlinkHTMLFormElement.checkValidity_Callback(this);
+  bool checkValidity() => _blink.BlinkHTMLFormElement.instance.checkValidity_Callback_0_(this);
 
   @DomName('HTMLFormElement.requestAutocomplete')
   @DocsEditable()
   // http://lists.whatwg.org/htdig.cgi/whatwg-whatwg.org/2012-October/037711.html
   @Experimental()
-  void requestAutocomplete(Map details) => _blink.BlinkHTMLFormElement.requestAutocomplete_Callback_1(this, details);
+  void requestAutocomplete(Map details) => _blink.BlinkHTMLFormElement.instance.requestAutocomplete_Callback_1_(this, details);
 
   @DomName('HTMLFormElement.reset')
   @DocsEditable()
-  void reset() => _blink.BlinkHTMLFormElement.reset_Callback(this);
+  void reset() => _blink.BlinkHTMLFormElement.instance.reset_Callback_0_(this);
 
   @DomName('HTMLFormElement.submit')
   @DocsEditable()
-  void submit() => _blink.BlinkHTMLFormElement.submit_Callback(this);
+  void submit() => _blink.BlinkHTMLFormElement.instance.submit_Callback_0_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -15934,29 +15934,29 @@
 
   @DomName('Gamepad.axes')
   @DocsEditable()
-  List<num> get axes => _blink.BlinkGamepad.axes_Getter(this);
+  List<num> get axes => _blink.BlinkGamepad.instance.axes_Getter_(this);
 
   @DomName('Gamepad.connected')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get connected => _blink.BlinkGamepad.connected_Getter(this);
+  bool get connected => _blink.BlinkGamepad.instance.connected_Getter_(this);
 
   @DomName('Gamepad.id')
   @DocsEditable()
-  String get id => _blink.BlinkGamepad.id_Getter(this);
+  String get id => _blink.BlinkGamepad.instance.id_Getter_(this);
 
   @DomName('Gamepad.index')
   @DocsEditable()
-  int get index => _blink.BlinkGamepad.index_Getter(this);
+  int get index => _blink.BlinkGamepad.instance.index_Getter_(this);
 
   @DomName('Gamepad.mapping')
   @DocsEditable()
   @Experimental() // untriaged
-  String get mapping => _blink.BlinkGamepad.mapping_Getter(this);
+  String get mapping => _blink.BlinkGamepad.instance.mapping_Getter_(this);
 
   @DomName('Gamepad.timestamp')
   @DocsEditable()
-  int get timestamp => _blink.BlinkGamepad.timestamp_Getter(this);
+  int get timestamp => _blink.BlinkGamepad.instance.timestamp_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -15976,12 +15976,12 @@
   @DomName('GamepadButton.pressed')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get pressed => _blink.BlinkGamepadButton.pressed_Getter(this);
+  bool get pressed => _blink.BlinkGamepadButton.instance.pressed_Getter_(this);
 
   @DomName('GamepadButton.value')
   @DocsEditable()
   @Experimental() // untriaged
-  double get value => _blink.BlinkGamepadButton.value_Getter(this);
+  double get value => _blink.BlinkGamepadButton.instance.value_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16001,7 +16001,7 @@
   @DomName('GamepadEvent.gamepad')
   @DocsEditable()
   @Experimental() // untriaged
-  Gamepad get gamepad => _blink.BlinkGamepadEvent.gamepad_Getter(this);
+  Gamepad get gamepad => _blink.BlinkGamepadEvent.instance.gamepad_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16021,17 +16021,17 @@
   @DomName('Geofencing.getRegisteredRegions')
   @DocsEditable()
   @Experimental() // untriaged
-  Future getRegisteredRegions() => _blink.BlinkGeofencing.getRegisteredRegions_Callback(this);
+  Future getRegisteredRegions() => _blink.BlinkGeofencing.instance.getRegisteredRegions_Callback_0_(this);
 
   @DomName('Geofencing.registerRegion')
   @DocsEditable()
   @Experimental() // untriaged
-  Future registerRegion(GeofencingRegion region) => _blink.BlinkGeofencing.registerRegion_Callback_1(this, region);
+  Future registerRegion(GeofencingRegion region) => _blink.BlinkGeofencing.instance.registerRegion_Callback_1_(this, region);
 
   @DomName('Geofencing.unregisterRegion')
   @DocsEditable()
   @Experimental() // untriaged
-  Future unregisterRegion(String regionId) => _blink.BlinkGeofencing.unregisterRegion_Callback_1(this, regionId);
+  Future unregisterRegion(String regionId) => _blink.BlinkGeofencing.instance.unregisterRegion_Callback_1_(this, regionId);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16051,7 +16051,7 @@
   @DomName('GeofencingRegion.id')
   @DocsEditable()
   @Experimental() // untriaged
-  String get id => _blink.BlinkGeofencingRegion.id_Getter(this);
+  String get id => _blink.BlinkGeofencingRegion.instance.id_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16139,29 +16139,29 @@
 
   @DomName('Geolocation.clearWatch')
   @DocsEditable()
-  void _clearWatch(int watchID) => _blink.BlinkGeolocation.clearWatch_Callback_1(this, watchID);
+  void _clearWatch(int watchID) => _blink.BlinkGeolocation.instance.clearWatch_Callback_1_(this, watchID);
 
   void _getCurrentPosition(_PositionCallback successCallback, [_PositionErrorCallback errorCallback, Map options]) {
     if (options != null) {
-      _blink.BlinkGeolocation.getCurrentPosition_Callback_3(this, successCallback, errorCallback, options);
+      _blink.BlinkGeolocation.instance.getCurrentPosition_Callback_3_(this, successCallback, errorCallback, options);
       return;
     }
     if (errorCallback != null) {
-      _blink.BlinkGeolocation.getCurrentPosition_Callback_2(this, successCallback, errorCallback);
+      _blink.BlinkGeolocation.instance.getCurrentPosition_Callback_2_(this, successCallback, errorCallback);
       return;
     }
-    _blink.BlinkGeolocation.getCurrentPosition_Callback_1(this, successCallback);
+    _blink.BlinkGeolocation.instance.getCurrentPosition_Callback_1_(this, successCallback);
     return;
   }
 
   int _watchPosition(_PositionCallback successCallback, [_PositionErrorCallback errorCallback, Map options]) {
     if (options != null) {
-      return _blink.BlinkGeolocation.watchPosition_Callback_3(this, successCallback, errorCallback, options);
+      return _blink.BlinkGeolocation.instance.watchPosition_Callback_3_(this, successCallback, errorCallback, options);
     }
     if (errorCallback != null) {
-      return _blink.BlinkGeolocation.watchPosition_Callback_2(this, successCallback, errorCallback);
+      return _blink.BlinkGeolocation.instance.watchPosition_Callback_2_(this, successCallback, errorCallback);
     }
-    return _blink.BlinkGeolocation.watchPosition_Callback_1(this, successCallback);
+    return _blink.BlinkGeolocation.instance.watchPosition_Callback_1_(this, successCallback);
   }
 }
 
@@ -16181,11 +16181,11 @@
 
   @DomName('Geoposition.coords')
   @DocsEditable()
-  Coordinates get coords => _blink.BlinkGeoposition.coords_Getter(this);
+  Coordinates get coords => _blink.BlinkGeoposition.instance.coords_Getter_(this);
 
   @DomName('Geoposition.timestamp')
   @DocsEditable()
-  int get timestamp => _blink.BlinkGeoposition.timestamp_Getter(this);
+  int get timestamp => _blink.BlinkGeoposition.instance.timestamp_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16749,12 +16749,12 @@
   @DomName('HTMLHRElement.color')
   @DocsEditable()
   @Experimental() // untriaged
-  String get color => _blink.BlinkHTMLHRElement.color_Getter(this);
+  String get color => _blink.BlinkHTMLHRElement.instance.color_Getter_(this);
 
   @DomName('HTMLHRElement.color')
   @DocsEditable()
   @Experimental() // untriaged
-  void set color(String value) => _blink.BlinkHTMLHRElement.color_Setter(this, value);
+  void set color(String value) => _blink.BlinkHTMLHRElement.instance.color_Setter_(this, value);
 
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -16784,15 +16784,15 @@
 
   @DomName('HashChangeEvent.newURL')
   @DocsEditable()
-  String get newUrl => _blink.BlinkHashChangeEvent.newURL_Getter(this);
+  String get newUrl => _blink.BlinkHashChangeEvent.instance.newURL_Getter_(this);
 
   @DomName('HashChangeEvent.oldURL')
   @DocsEditable()
-  String get oldUrl => _blink.BlinkHashChangeEvent.oldURL_Getter(this);
+  String get oldUrl => _blink.BlinkHashChangeEvent.instance.oldURL_Getter_(this);
 
   @DomName('HashChangeEvent.initHashChangeEvent')
   @DocsEditable()
-  void _initHashChangeEvent(String type, bool canBubble, bool cancelable, String oldURL, String newURL) => _blink.BlinkHashChangeEvent.initHashChangeEvent_Callback_5(this, type, canBubble, cancelable, oldURL, newURL);
+  void _initHashChangeEvent(String type, bool canBubble, bool cancelable, String oldURL, String newURL) => _blink.BlinkHashChangeEvent.instance.initHashChangeEvent_Callback_5_(this, type, canBubble, cancelable, oldURL, newURL);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16837,13 +16837,13 @@
   @DocsEditable()
   factory Headers([input]) {
     if (input == null) {
-      return _blink.BlinkHeaders.constructorCallback();
+      return _blink.BlinkHeaders.instance.constructorCallback_0_();
     }
     if ((input is Headers || input == null)) {
-      return _blink.BlinkHeaders.constructorCallback_1(input);
+      return _blink.BlinkHeaders.instance.constructorCallback_1_(input);
     }
     if ((input is Map || input == null)) {
-      return _blink.BlinkHeaders.constructorCallback_1(input);
+      return _blink.BlinkHeaders.instance.constructorCallback_1_(input);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
@@ -16851,14 +16851,14 @@
   @DomName('Headers.size')
   @DocsEditable()
   @Experimental() // untriaged
-  int get size => _blink.BlinkHeaders.size_Getter(this);
+  int get size => _blink.BlinkHeaders.instance.size_Getter_(this);
 
   void forEach(HeadersForEachCallback callback, [Object thisArg]) {
     if (thisArg != null) {
-      _blink.BlinkHeaders.forEach_Callback_2(this, callback, thisArg);
+      _blink.BlinkHeaders.instance.forEach_Callback_2_(this, callback, thisArg);
       return;
     }
-    _blink.BlinkHeaders.forEach_Callback_1(this, callback);
+    _blink.BlinkHeaders.instance.forEach_Callback_1_(this, callback);
     return;
   }
 
@@ -16940,23 +16940,23 @@
 
   @DomName('History.length')
   @DocsEditable()
-  int get length => _blink.BlinkHistory.length_Getter(this);
+  int get length => _blink.BlinkHistory.instance.length_Getter_(this);
 
   @DomName('History.state')
   @DocsEditable()
-  dynamic get state => _blink.BlinkHistory.state_Getter(this);
+  dynamic get state => _blink.BlinkHistory.instance.state_Getter_(this);
 
   @DomName('History.back')
   @DocsEditable()
-  void back() => _blink.BlinkHistory.back_Callback(this);
+  void back() => _blink.BlinkHistory.instance.back_Callback_0_(this);
 
   @DomName('History.forward')
   @DocsEditable()
-  void forward() => _blink.BlinkHistory.forward_Callback(this);
+  void forward() => _blink.BlinkHistory.instance.forward_Callback_0_(this);
 
   @DomName('History.go')
   @DocsEditable()
-  void go(int distance) => _blink.BlinkHistory.go_Callback_1(this, distance);
+  void go(int distance) => _blink.BlinkHistory.instance.go_Callback_1_(this, distance);
 
   @DomName('History.pushState')
   @DocsEditable()
@@ -16964,7 +16964,7 @@
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.IE, '10')
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  void pushState(Object data, String title, [String url]) => _blink.BlinkHistory.pushState_Callback_3(this, data, title, url);
+  void pushState(Object data, String title, [String url]) => _blink.BlinkHistory.instance.pushState_Callback_3_(this, data, title, url);
 
   @DomName('History.replaceState')
   @DocsEditable()
@@ -16972,7 +16972,7 @@
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.IE, '10')
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  void replaceState(Object data, String title, [String url]) => _blink.BlinkHistory.replaceState_Callback_3(this, data, title, url);
+  void replaceState(Object data, String title, [String url]) => _blink.BlinkHistory.instance.replaceState_Callback_3_(this, data, title, url);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -16989,15 +16989,15 @@
 
   @DomName('HTMLCollection.length')
   @DocsEditable()
-  int get length => _blink.BlinkHTMLCollection.length_Getter(this);
+  int get length => _blink.BlinkHTMLCollection.instance.length_Getter_(this);
 
   Node operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _blink.BlinkHTMLCollection.item_Callback_1(this, index);
+    return _blink.BlinkHTMLCollection.instance.item_Callback_1_(this, index);
   }
 
-  Node _nativeIndexedGetter(int index) => _blink.BlinkHTMLCollection.item_Callback_1(this, index);
+  Node _nativeIndexedGetter(int index) => _blink.BlinkHTMLCollection.instance.item_Callback_1_(this, index);
 
   void operator[]=(int index, Node value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -17039,11 +17039,11 @@
 
   @DomName('HTMLCollection.item')
   @DocsEditable()
-  Element item(int index) => _blink.BlinkHTMLCollection.item_Callback_1(this, index);
+  Element item(int index) => _blink.BlinkHTMLCollection.instance.item_Callback_1_(this, index);
 
   @DomName('HTMLCollection.namedItem')
   @DocsEditable()
-  Element namedItem(String name) => _blink.BlinkHTMLCollection.namedItem_Callback_1(this, name);
+  Element namedItem(String name) => _blink.BlinkHTMLCollection.instance.namedItem_Callback_1_(this, name);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -17596,88 +17596,88 @@
 
   @DomName('HTMLElement.contentEditable')
   @DocsEditable()
-  String get contentEditable => _blink.BlinkHTMLElement.contentEditable_Getter(this);
+  String get contentEditable => _blink.BlinkHTMLElement.instance.contentEditable_Getter_(this);
 
   @DomName('HTMLElement.contentEditable')
   @DocsEditable()
-  void set contentEditable(String value) => _blink.BlinkHTMLElement.contentEditable_Setter(this, value);
+  void set contentEditable(String value) => _blink.BlinkHTMLElement.instance.contentEditable_Setter_(this, value);
 
   @DomName('HTMLElement.dir')
   @DocsEditable()
-  String get dir => _blink.BlinkHTMLElement.dir_Getter(this);
+  String get dir => _blink.BlinkHTMLElement.instance.dir_Getter_(this);
 
   @DomName('HTMLElement.dir')
   @DocsEditable()
-  void set dir(String value) => _blink.BlinkHTMLElement.dir_Setter(this, value);
+  void set dir(String value) => _blink.BlinkHTMLElement.instance.dir_Setter_(this, value);
 
   @DomName('HTMLElement.draggable')
   @DocsEditable()
-  bool get draggable => _blink.BlinkHTMLElement.draggable_Getter(this);
+  bool get draggable => _blink.BlinkHTMLElement.instance.draggable_Getter_(this);
 
   @DomName('HTMLElement.draggable')
   @DocsEditable()
-  void set draggable(bool value) => _blink.BlinkHTMLElement.draggable_Setter(this, value);
+  void set draggable(bool value) => _blink.BlinkHTMLElement.instance.draggable_Setter_(this, value);
 
   @DomName('HTMLElement.hidden')
   @DocsEditable()
-  bool get hidden => _blink.BlinkHTMLElement.hidden_Getter(this);
+  bool get hidden => _blink.BlinkHTMLElement.instance.hidden_Getter_(this);
 
   @DomName('HTMLElement.hidden')
   @DocsEditable()
-  void set hidden(bool value) => _blink.BlinkHTMLElement.hidden_Setter(this, value);
+  void set hidden(bool value) => _blink.BlinkHTMLElement.instance.hidden_Setter_(this, value);
 
   @DomName('HTMLElement.inputMethodContext')
   @DocsEditable()
   @Experimental() // untriaged
-  InputMethodContext get inputMethodContext => _blink.BlinkHTMLElement.inputMethodContext_Getter(this);
+  InputMethodContext get inputMethodContext => _blink.BlinkHTMLElement.instance.inputMethodContext_Getter_(this);
 
   @DomName('HTMLElement.isContentEditable')
   @DocsEditable()
-  bool get isContentEditable => _blink.BlinkHTMLElement.isContentEditable_Getter(this);
+  bool get isContentEditable => _blink.BlinkHTMLElement.instance.isContentEditable_Getter_(this);
 
   @DomName('HTMLElement.lang')
   @DocsEditable()
-  String get lang => _blink.BlinkHTMLElement.lang_Getter(this);
+  String get lang => _blink.BlinkHTMLElement.instance.lang_Getter_(this);
 
   @DomName('HTMLElement.lang')
   @DocsEditable()
-  void set lang(String value) => _blink.BlinkHTMLElement.lang_Setter(this, value);
+  void set lang(String value) => _blink.BlinkHTMLElement.instance.lang_Setter_(this, value);
 
   @DomName('HTMLElement.spellcheck')
   @DocsEditable()
   // http://blog.whatwg.org/the-road-to-html-5-spellchecking
   @Experimental() // nonstandard
-  bool get spellcheck => _blink.BlinkHTMLElement.spellcheck_Getter(this);
+  bool get spellcheck => _blink.BlinkHTMLElement.instance.spellcheck_Getter_(this);
 
   @DomName('HTMLElement.spellcheck')
   @DocsEditable()
   // http://blog.whatwg.org/the-road-to-html-5-spellchecking
   @Experimental() // nonstandard
-  void set spellcheck(bool value) => _blink.BlinkHTMLElement.spellcheck_Setter(this, value);
+  void set spellcheck(bool value) => _blink.BlinkHTMLElement.instance.spellcheck_Setter_(this, value);
 
   @DomName('HTMLElement.tabIndex')
   @DocsEditable()
-  int get tabIndex => _blink.BlinkHTMLElement.tabIndex_Getter(this);
+  int get tabIndex => _blink.BlinkHTMLElement.instance.tabIndex_Getter_(this);
 
   @DomName('HTMLElement.tabIndex')
   @DocsEditable()
-  void set tabIndex(int value) => _blink.BlinkHTMLElement.tabIndex_Setter(this, value);
+  void set tabIndex(int value) => _blink.BlinkHTMLElement.instance.tabIndex_Setter_(this, value);
 
   @DomName('HTMLElement.title')
   @DocsEditable()
-  String get title => _blink.BlinkHTMLElement.title_Getter(this);
+  String get title => _blink.BlinkHTMLElement.instance.title_Getter_(this);
 
   @DomName('HTMLElement.title')
   @DocsEditable()
-  void set title(String value) => _blink.BlinkHTMLElement.title_Setter(this, value);
+  void set title(String value) => _blink.BlinkHTMLElement.instance.title_Setter_(this, value);
 
   @DomName('HTMLElement.translate')
   @DocsEditable()
-  bool get translate => _blink.BlinkHTMLElement.translate_Getter(this);
+  bool get translate => _blink.BlinkHTMLElement.instance.translate_Getter_(this);
 
   @DomName('HTMLElement.translate')
   @DocsEditable()
-  void set translate(bool value) => _blink.BlinkHTMLElement.translate_Setter(this, value);
+  void set translate(bool value) => _blink.BlinkHTMLElement.instance.translate_Setter_(this, value);
 
   @DomName('HTMLElement.webkitdropzone')
   @DocsEditable()
@@ -17685,7 +17685,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#the-dropzone-attribute
-  String get dropzone => _blink.BlinkHTMLElement.webkitdropzone_Getter(this);
+  String get dropzone => _blink.BlinkHTMLElement.instance.webkitdropzone_Getter_(this);
 
   @DomName('HTMLElement.webkitdropzone')
   @DocsEditable()
@@ -17693,11 +17693,11 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#the-dropzone-attribute
-  void set dropzone(String value) => _blink.BlinkHTMLElement.webkitdropzone_Setter(this, value);
+  void set dropzone(String value) => _blink.BlinkHTMLElement.instance.webkitdropzone_Setter_(this, value);
 
   @DomName('HTMLElement.click')
   @DocsEditable()
-  void click() => _blink.BlinkHTMLElement.click_Callback(this);
+  void click() => _blink.BlinkHTMLElement.instance.click_Callback_0_(this);
 
   @DomName('HTMLElement.onabort')
   @DocsEditable()
@@ -17975,7 +17975,7 @@
 
   @DomName('HTMLFormControlsCollection.namedItem')
   @DocsEditable()
-  Object namedItem(String name) => _blink.BlinkHTMLFormControlsCollection.namedItem_Callback_1(this, name);
+  Object namedItem(String name) => _blink.BlinkHTMLFormControlsCollection.instance.namedItem_Callback_1_(this, name);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -18378,7 +18378,7 @@
   factory HttpRequest() => _create();
 
   @DocsEditable()
-  static HttpRequest _create() => _blink.BlinkXMLHttpRequest.constructorCallback();
+  static HttpRequest _create() => _blink.BlinkXMLHttpRequest.instance.constructorCallback_0_();
 
   @DomName('XMLHttpRequest.DONE')
   @DocsEditable()
@@ -18434,7 +18434,7 @@
    */
   @DomName('XMLHttpRequest.readyState')
   @DocsEditable()
-  int get readyState => _blink.BlinkXMLHttpRequest.readyState_Getter(this);
+  int get readyState => _blink.BlinkXMLHttpRequest.instance.readyState_Getter_(this);
 
   /**
    * The data received as a reponse from the request.
@@ -18449,14 +18449,14 @@
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.IE, '10')
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  Object get response => _blink.BlinkXMLHttpRequest.response_Getter(this);
+  Object get response => _blink.BlinkXMLHttpRequest.instance.response_Getter_(this);
 
   /**
    * The response in String form or empty String on failure.
    */
   @DomName('XMLHttpRequest.responseText')
   @DocsEditable()
-  String get responseText => _blink.BlinkXMLHttpRequest.responseText_Getter(this);
+  String get responseText => _blink.BlinkXMLHttpRequest.instance.responseText_Getter_(this);
 
   /**
    * [String] telling the server the desired response format.
@@ -18470,7 +18470,7 @@
    */
   @DomName('XMLHttpRequest.responseType')
   @DocsEditable()
-  String get responseType => _blink.BlinkXMLHttpRequest.responseType_Getter(this);
+  String get responseType => _blink.BlinkXMLHttpRequest.instance.responseType_Getter_(this);
 
   /**
    * [String] telling the server the desired response format.
@@ -18484,12 +18484,12 @@
    */
   @DomName('XMLHttpRequest.responseType')
   @DocsEditable()
-  void set responseType(String value) => _blink.BlinkXMLHttpRequest.responseType_Setter(this, value);
+  void set responseType(String value) => _blink.BlinkXMLHttpRequest.instance.responseType_Setter_(this, value);
 
   @DomName('XMLHttpRequest.responseURL')
   @DocsEditable()
   @Experimental() // untriaged
-  String get responseUrl => _blink.BlinkXMLHttpRequest.responseURL_Getter(this);
+  String get responseUrl => _blink.BlinkXMLHttpRequest.instance.responseURL_Getter_(this);
 
   /**
    * The request response, or null on failure.
@@ -18500,7 +18500,7 @@
    */
   @DomName('XMLHttpRequest.responseXML')
   @DocsEditable()
-  Document get responseXml => _blink.BlinkXMLHttpRequest.responseXML_Getter(this);
+  Document get responseXml => _blink.BlinkXMLHttpRequest.instance.responseXML_Getter_(this);
 
   /**
    * The http result code from the request (200, 404, etc).
@@ -18508,7 +18508,7 @@
    */
   @DomName('XMLHttpRequest.status')
   @DocsEditable()
-  int get status => _blink.BlinkXMLHttpRequest.status_Getter(this);
+  int get status => _blink.BlinkXMLHttpRequest.instance.status_Getter_(this);
 
   /**
    * The request response string (such as \"200 OK\").
@@ -18516,7 +18516,7 @@
    */
   @DomName('XMLHttpRequest.statusText')
   @DocsEditable()
-  String get statusText => _blink.BlinkXMLHttpRequest.statusText_Getter(this);
+  String get statusText => _blink.BlinkXMLHttpRequest.instance.statusText_Getter_(this);
 
   /**
    * Length of time before a request is automatically terminated.
@@ -18537,7 +18537,7 @@
   @DomName('XMLHttpRequest.timeout')
   @DocsEditable()
   @Experimental() // untriaged
-  int get timeout => _blink.BlinkXMLHttpRequest.timeout_Getter(this);
+  int get timeout => _blink.BlinkXMLHttpRequest.instance.timeout_Getter_(this);
 
   /**
    * Length of time before a request is automatically terminated.
@@ -18558,7 +18558,7 @@
   @DomName('XMLHttpRequest.timeout')
   @DocsEditable()
   @Experimental() // untriaged
-  void set timeout(int value) => _blink.BlinkXMLHttpRequest.timeout_Setter(this, value);
+  void set timeout(int value) => _blink.BlinkXMLHttpRequest.instance.timeout_Setter_(this, value);
 
   /**
    * [EventTarget] that can hold listeners to track the progress of the request.
@@ -18567,7 +18567,7 @@
   @DomName('XMLHttpRequest.upload')
   @DocsEditable()
   @Unstable()
-  HttpRequestUpload get upload => _blink.BlinkXMLHttpRequest.upload_Getter(this);
+  HttpRequestUpload get upload => _blink.BlinkXMLHttpRequest.instance.upload_Getter_(this);
 
   /**
    * True if cross-site requests should use credentials such as cookies
@@ -18577,7 +18577,7 @@
    */
   @DomName('XMLHttpRequest.withCredentials')
   @DocsEditable()
-  bool get withCredentials => _blink.BlinkXMLHttpRequest.withCredentials_Getter(this);
+  bool get withCredentials => _blink.BlinkXMLHttpRequest.instance.withCredentials_Getter_(this);
 
   /**
    * True if cross-site requests should use credentials such as cookies
@@ -18587,7 +18587,7 @@
    */
   @DomName('XMLHttpRequest.withCredentials')
   @DocsEditable()
-  void set withCredentials(bool value) => _blink.BlinkXMLHttpRequest.withCredentials_Setter(this, value);
+  void set withCredentials(bool value) => _blink.BlinkXMLHttpRequest.instance.withCredentials_Setter_(this, value);
 
   /**
    * Stop the current request.
@@ -18598,7 +18598,7 @@
    */
   @DomName('XMLHttpRequest.abort')
   @DocsEditable()
-  void abort() => _blink.BlinkXMLHttpRequest.abort_Callback(this);
+  void abort() => _blink.BlinkXMLHttpRequest.instance.abort_Callback_0_(this);
 
   /**
    * Retrieve all the response headers from a request.
@@ -18613,7 +18613,7 @@
   @DomName('XMLHttpRequest.getAllResponseHeaders')
   @DocsEditable()
   @Unstable()
-  String getAllResponseHeaders() => _blink.BlinkXMLHttpRequest.getAllResponseHeaders_Callback(this);
+  String getAllResponseHeaders() => _blink.BlinkXMLHttpRequest.instance.getAllResponseHeaders_Callback_0_(this);
 
   /**
    * Return the response header named `header`, or null if not found.
@@ -18624,7 +18624,7 @@
   @DomName('XMLHttpRequest.getResponseHeader')
   @DocsEditable()
   @Unstable()
-  String getResponseHeader(String header) => _blink.BlinkXMLHttpRequest.getResponseHeader_Callback_1(this, header);
+  String getResponseHeader(String header) => _blink.BlinkXMLHttpRequest.instance.getResponseHeader_Callback_1_(this, header);
 
   /**
    * Specify the desired `url`, and `method` to use in making the request.
@@ -18643,7 +18643,7 @@
    */
   @DomName('XMLHttpRequest.open')
   @DocsEditable()
-  void open(String method, String url, {bool async, String user, String password}) => _blink.BlinkXMLHttpRequest.open_Callback_5(this, method, url, async, user, password);
+  void open(String method, String url, {bool async, String user, String password}) => _blink.BlinkXMLHttpRequest.instance.open_Callback_5_(this, method, url, async, user, password);
 
   /**
    * Specify a particular MIME type (such as `text/xml`) desired for the
@@ -18657,7 +18657,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  void overrideMimeType(String override) => _blink.BlinkXMLHttpRequest.overrideMimeType_Callback_1(this, override);
+  void overrideMimeType(String override) => _blink.BlinkXMLHttpRequest.instance.overrideMimeType_Callback_1_(this, override);
 
   /**
    * Send the request with any given `data`.
@@ -18675,7 +18675,7 @@
    */
   @DomName('XMLHttpRequest.send')
   @DocsEditable()
-  void send([data]) => _blink.BlinkXMLHttpRequest.send_Callback_1(this, data);
+  void send([data]) => _blink.BlinkXMLHttpRequest.instance.send_Callback_1_(this, data);
 
   /**
    * Sets the value of an HTTP requst header.
@@ -18697,7 +18697,7 @@
    */
   @DomName('XMLHttpRequest.setRequestHeader')
   @DocsEditable()
-  void setRequestHeader(String header, String value) => _blink.BlinkXMLHttpRequest.setRequestHeader_Callback_2(this, header, value);
+  void setRequestHeader(String header, String value) => _blink.BlinkXMLHttpRequest.instance.setRequestHeader_Callback_2_(this, header, value);
 
   /// Stream of `readystatechange` events handled by this [HttpRequest].
 /**
@@ -18893,74 +18893,74 @@
   @DomName('HTMLIFrameElement.allowFullscreen')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get allowFullscreen => _blink.BlinkHTMLIFrameElement.allowFullscreen_Getter(this);
+  bool get allowFullscreen => _blink.BlinkHTMLIFrameElement.instance.allowFullscreen_Getter_(this);
 
   @DomName('HTMLIFrameElement.allowFullscreen')
   @DocsEditable()
   @Experimental() // untriaged
-  void set allowFullscreen(bool value) => _blink.BlinkHTMLIFrameElement.allowFullscreen_Setter(this, value);
+  void set allowFullscreen(bool value) => _blink.BlinkHTMLIFrameElement.instance.allowFullscreen_Setter_(this, value);
 
   @DomName('HTMLIFrameElement.contentWindow')
   @DocsEditable()
-  WindowBase get contentWindow => _blink.BlinkHTMLIFrameElement.contentWindow_Getter(this);
+  WindowBase get contentWindow => _blink.BlinkHTMLIFrameElement.instance.contentWindow_Getter_(this);
 
   @DomName('HTMLIFrameElement.height')
   @DocsEditable()
-  String get height => _blink.BlinkHTMLIFrameElement.height_Getter(this);
+  String get height => _blink.BlinkHTMLIFrameElement.instance.height_Getter_(this);
 
   @DomName('HTMLIFrameElement.height')
   @DocsEditable()
-  void set height(String value) => _blink.BlinkHTMLIFrameElement.height_Setter(this, value);
+  void set height(String value) => _blink.BlinkHTMLIFrameElement.instance.height_Setter_(this, value);
 
   @DomName('HTMLIFrameElement.integrity')
   @DocsEditable()
   @Experimental() // untriaged
-  String get integrity => _blink.BlinkHTMLIFrameElement.integrity_Getter(this);
+  String get integrity => _blink.BlinkHTMLIFrameElement.instance.integrity_Getter_(this);
 
   @DomName('HTMLIFrameElement.integrity')
   @DocsEditable()
   @Experimental() // untriaged
-  void set integrity(String value) => _blink.BlinkHTMLIFrameElement.integrity_Setter(this, value);
+  void set integrity(String value) => _blink.BlinkHTMLIFrameElement.instance.integrity_Setter_(this, value);
 
   @DomName('HTMLIFrameElement.name')
   @DocsEditable()
-  String get name => _blink.BlinkHTMLIFrameElement.name_Getter(this);
+  String get name => _blink.BlinkHTMLIFrameElement.instance.name_Getter_(this);
 
   @DomName('HTMLIFrameElement.name')
   @DocsEditable()
-  void set name(String value) => _blink.BlinkHTMLIFrameElement.name_Setter(this, value);
+  void set name(String value) => _blink.BlinkHTMLIFrameElement.instance.name_Setter_(this, value);
 
   @DomName('HTMLIFrameElement.sandbox')
   @DocsEditable()
-  String get sandbox => _blink.BlinkHTMLIFrameElement.sandbox_Getter(this);
+  String get sandbox => _blink.BlinkHTMLIFrameElement.instance.sandbox_Getter_(this);
 
   @DomName('HTMLIFrameElement.sandbox')
   @DocsEditable()
-  void set sandbox(String value) => _blink.BlinkHTMLIFrameElement.sandbox_Setter(this, value);
+  void set sandbox(String value) => _blink.BlinkHTMLIFrameElement.instance.sandbox_Setter_(this, value);
 
   @DomName('HTMLIFrameElement.src')
   @DocsEditable()
-  String get src => _blink.BlinkHTMLIFrameElement.src_Getter(this);
+  String get src => _blink.BlinkHTMLIFrameElement.instance.src_Getter_(this);
 
   @DomName('HTMLIFrameElement.src')
   @DocsEditable()
-  void set src(String value) => _blink.BlinkHTMLIFrameElement.src_Setter(this, value);
+  void set src(String value) => _blink.BlinkHTMLIFrameElement.instance.src_Setter_(this, value);
 
   @DomName('HTMLIFrameElement.srcdoc')
   @DocsEditable()
-  String get srcdoc => _blink.BlinkHTMLIFrameElement.srcdoc_Getter(this);
+  String get srcdoc => _blink.BlinkHTMLIFrameElement.instance.srcdoc_Getter_(this);
 
   @DomName('HTMLIFrameElement.srcdoc')
   @DocsEditable()
-  void set srcdoc(String value) => _blink.BlinkHTMLIFrameElement.srcdoc_Setter(this, value);
+  void set srcdoc(String value) => _blink.BlinkHTMLIFrameElement.instance.srcdoc_Setter_(this, value);
 
   @DomName('HTMLIFrameElement.width')
   @DocsEditable()
-  String get width => _blink.BlinkHTMLIFrameElement.width_Getter(this);
+  String get width => _blink.BlinkHTMLIFrameElement.instance.width_Getter_(this);
 
   @DomName('HTMLIFrameElement.width')
   @DocsEditable()
-  void set width(String value) => _blink.BlinkHTMLIFrameElement.width_Setter(this, value);
+  void set width(String value) => _blink.BlinkHTMLIFrameElement.instance.width_Setter_(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -18980,12 +18980,12 @@
   @DomName('ImageBitmap.height')
   @DocsEditable()
   @Experimental() // untriaged
-  int get height => _blink.BlinkImageBitmap.height_Getter(this);
+  int get height => _blink.BlinkImageBitmap.instance.height_Getter_(this);
 
   @DomName('ImageBitmap.width')
   @DocsEditable()
   @Experimental() // untriaged
-  int get width => _blink.BlinkImageBitmap.width_Getter(this);
+  int get width => _blink.BlinkImageBitmap.instance.width_Getter_(this);
 
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -19010,25 +19010,25 @@
   @DocsEditable()
   factory ImageData(data_OR_width, int height_OR_width, [int height]) {
     if ((height_OR_width is int || height_OR_width == null) && (data_OR_width is int || data_OR_width == null) && height == null) {
-      return _blink.BlinkImageData.constructorCallback_2(data_OR_width, height_OR_width);
+      return _blink.BlinkImageData.instance.constructorCallback_2_(data_OR_width, height_OR_width);
     }
     if ((height is int || height == null) && (height_OR_width is int || height_OR_width == null) && (data_OR_width is Uint8ClampedList || data_OR_width == null)) {
-      return _blink.BlinkImageData.constructorCallback_3(data_OR_width, height_OR_width, height);
+      return _blink.BlinkImageData.instance.constructorCallback_3_(data_OR_width, height_OR_width, height);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
   @DomName('ImageData.data')
   @DocsEditable()
-  Uint8ClampedList get _data => _blink.BlinkImageData.data_Getter(this);
+  Uint8ClampedList get _data => _blink.BlinkImageData.instance.data_Getter_(this);
 
   @DomName('ImageData.height')
   @DocsEditable()
-  int get height => _blink.BlinkImageData.height_Getter(this);
+  int get height => _blink.BlinkImageData.instance.height_Getter_(this);
 
   @DomName('ImageData.width')
   @DocsEditable()
-  int get width => _blink.BlinkImageData.width_Getter(this);
+  int get width => _blink.BlinkImageData.instance.width_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19059,106 +19059,106 @@
 
   @DomName('HTMLImageElement.alt')
   @DocsEditable()
-  String get alt => _blink.BlinkHTMLImageElement.alt_Getter(this);
+  String get alt => _blink.BlinkHTMLImageElement.instance.alt_Getter_(this);
 
   @DomName('HTMLImageElement.alt')
   @DocsEditable()
-  void set alt(String value) => _blink.BlinkHTMLImageElement.alt_Setter(this, value);
+  void set alt(String value) => _blink.BlinkHTMLImageElement.instance.alt_Setter_(this, value);
 
   @DomName('HTMLImageElement.complete')
   @DocsEditable()
-  bool get complete => _blink.BlinkHTMLImageElement.complete_Getter(this);
+  bool get complete => _blink.BlinkHTMLImageElement.instance.complete_Getter_(this);
 
   @DomName('HTMLImageElement.crossOrigin')
   @DocsEditable()
-  String get crossOrigin => _blink.BlinkHTMLImageElement.crossOrigin_Getter(this);
+  String get crossOrigin => _blink.BlinkHTMLImageElement.instance.crossOrigin_Getter_(this);
 
   @DomName('HTMLImageElement.crossOrigin')
   @DocsEditable()
-  void set crossOrigin(String value) => _blink.BlinkHTMLImageElement.crossOrigin_Setter(this, value);
+  void set crossOrigin(String value) => _blink.BlinkHTMLImageElement.instance.crossOrigin_Setter_(this, value);
 
   @DomName('HTMLImageElement.currentSrc')
   @DocsEditable()
   @Experimental() // untriaged
-  String get currentSrc => _blink.BlinkHTMLImageElement.currentSrc_Getter(this);
+  String get currentSrc => _blink.BlinkHTMLImageElement.instance.currentSrc_Getter_(this);
 
   @DomName('HTMLImageElement.height')
   @DocsEditable()
-  int get height => _blink.BlinkHTMLImageElement.height_Getter(this);
+  int get height => _blink.BlinkHTMLImageElement.instance.height_Getter_(this);
 
   @DomName('HTMLImageElement.height')
   @DocsEditable()
-  void set height(int value) => _blink.BlinkHTMLImageElement.height_Setter(this, value);
+  void set height(int value) => _blink.BlinkHTMLImageElement.instance.height_Setter_(this, value);
 
   @DomName('HTMLImageElement.integrity')
   @DocsEditable()
   @Experimental() // untriaged
-  String get integrity => _blink.BlinkHTMLImageElement.integrity_Getter(this);
+  String get integrity => _blink.BlinkHTMLImageElement.instance.integrity_Getter_(this);
 
   @DomName('HTMLImageElement.integrity')
   @DocsEditable()
   @Experimental() // untriaged
-  void set integrity(String value) => _blink.BlinkHTMLImageElement.integrity_Setter(this, value);
+  void set integrity(String value) => _blink.BlinkHTMLImageElement.instance.integrity_Setter_(this, value);
 
   @DomName('HTMLImageElement.isMap')
   @DocsEditable()
-  bool get isMap => _blink.BlinkHTMLImageElement.isMap_Getter(this);
+  bool get isMap => _blink.BlinkHTMLImageElement.instance.isMap_Getter_(this);
 
   @DomName('HTMLImageElement.isMap')
   @DocsEditable()
-  void set isMap(bool value) => _blink.BlinkHTMLImageElement.isMap_Setter(this, value);
+  void set isMap(bool value) => _blink.BlinkHTMLImageElement.instance.isMap_Setter_(this, value);
 
   @DomName('HTMLImageElement.naturalHeight')
   @DocsEditable()
-  int get naturalHeight => _blink.BlinkHTMLImageElement.naturalHeight_Getter(this);
+  int get naturalHeight => _blink.BlinkHTMLImageElement.instance.naturalHeight_Getter_(this);
 
   @DomName('HTMLImageElement.naturalWidth')
   @DocsEditable()
-  int get naturalWidth => _blink.BlinkHTMLImageElement.naturalWidth_Getter(this);
+  int get naturalWidth => _blink.BlinkHTMLImageElement.instance.naturalWidth_Getter_(this);
 
   @DomName('HTMLImageElement.sizes')
   @DocsEditable()
   @Experimental() // untriaged
-  String get sizes => _blink.BlinkHTMLImageElement.sizes_Getter(this);
+  String get sizes => _blink.BlinkHTMLImageElement.instance.sizes_Getter_(this);
 
   @DomName('HTMLImageElement.sizes')
   @DocsEditable()
   @Experimental() // untriaged
-  void set sizes(String value) => _blink.BlinkHTMLImageElement.sizes_Setter(this, value);
+  void set sizes(String value) => _blink.BlinkHTMLImageElement.instance.sizes_Setter_(this, value);
 
   @DomName('HTMLImageElement.src')
   @DocsEditable()
-  String get src => _blink.BlinkHTMLImageElement.src_Getter(this);
+  String get src => _blink.BlinkHTMLImageElement.instance.src_Getter_(this);
 
   @DomName('HTMLImageElement.src')
   @DocsEditable()
-  void set src(String value) => _blink.BlinkHTMLImageElement.src_Setter(this, value);
+  void set src(String value) => _blink.BlinkHTMLImageElement.instance.src_Setter_(this, value);
 
   @DomName('HTMLImageElement.srcset')
   @DocsEditable()
   @Experimental() // untriaged
-  String get srcset => _blink.BlinkHTMLImageElement.srcset_Getter(this);
+  String get srcset => _blink.BlinkHTMLImageElement.instance.srcset_Getter_(this);
 
   @DomName('HTMLImageElement.srcset')
   @DocsEditable()
   @Experimental() // untriaged
-  void set srcset(String value) => _blink.BlinkHTMLImageElement.srcset_Setter(this, value);
+  void set srcset(String value) => _blink.BlinkHTMLImageElement.instance.srcset_Setter_(this, value);
 
   @DomName('HTMLImageElement.useMap')
   @DocsEditable()
-  String get useMap => _blink.BlinkHTMLImageElement.useMap_Getter(this);
+  String get useMap => _blink.BlinkHTMLImageElement.instance.useMap_Getter_(this);
 
   @DomName('HTMLImageElement.useMap')
   @DocsEditable()
-  void set useMap(String value) => _blink.BlinkHTMLImageElement.useMap_Setter(this, value);
+  void set useMap(String value) => _blink.BlinkHTMLImageElement.instance.useMap_Setter_(this, value);
 
   @DomName('HTMLImageElement.width')
   @DocsEditable()
-  int get width => _blink.BlinkHTMLImageElement.width_Getter(this);
+  int get width => _blink.BlinkHTMLImageElement.instance.width_Getter_(this);
 
   @DomName('HTMLImageElement.width')
   @DocsEditable()
-  void set width(int value) => _blink.BlinkHTMLImageElement.width_Setter(this, value);
+  void set width(int value) => _blink.BlinkHTMLImageElement.instance.width_Setter_(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19178,7 +19178,7 @@
   @DomName('InjectedScriptHost.inspect')
   @DocsEditable()
   @Experimental() // untriaged
-  void inspect(Object objectId, Object hints) => _blink.BlinkInjectedScriptHost.inspect_Callback_2(this, objectId, hints);
+  void inspect(Object objectId, Object hints) => _blink.BlinkInjectedScriptHost.instance.inspect_Callback_2_(this, objectId, hints);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19232,343 +19232,343 @@
 
   @DomName('HTMLInputElement.accept')
   @DocsEditable()
-  String get accept => _blink.BlinkHTMLInputElement.accept_Getter(this);
+  String get accept => _blink.BlinkHTMLInputElement.instance.accept_Getter_(this);
 
   @DomName('HTMLInputElement.accept')
   @DocsEditable()
-  void set accept(String value) => _blink.BlinkHTMLInputElement.accept_Setter(this, value);
+  void set accept(String value) => _blink.BlinkHTMLInputElement.instance.accept_Setter_(this, value);
 
   @DomName('HTMLInputElement.alt')
   @DocsEditable()
-  String get alt => _blink.BlinkHTMLInputElement.alt_Getter(this);
+  String get alt => _blink.BlinkHTMLInputElement.instance.alt_Getter_(this);
 
   @DomName('HTMLInputElement.alt')
   @DocsEditable()
-  void set alt(String value) => _blink.BlinkHTMLInputElement.alt_Setter(this, value);
+  void set alt(String value) => _blink.BlinkHTMLInputElement.instance.alt_Setter_(this, value);
 
   @DomName('HTMLInputElement.autocomplete')
   @DocsEditable()
-  String get autocomplete => _blink.BlinkHTMLInputElement.autocomplete_Getter(this);
+  String get autocomplete => _blink.BlinkHTMLInputElement.instance.autocomplete_Getter_(this);
 
   @DomName('HTMLInputElement.autocomplete')
   @DocsEditable()
-  void set autocomplete(String value) => _blink.BlinkHTMLInputElement.autocomplete_Setter(this, value);
+  void set autocomplete(String value) => _blink.BlinkHTMLInputElement.instance.autocomplete_Setter_(this, value);
 
   @DomName('HTMLInputElement.autofocus')
   @DocsEditable()
-  bool get autofocus => _blink.BlinkHTMLInputElement.autofocus_Getter(this);
+  bool get autofocus => _blink.BlinkHTMLInputElement.instance.autofocus_Getter_(this);
 
   @DomName('HTMLInputElement.autofocus')
   @DocsEditable()
-  void set autofocus(bool value) => _blink.BlinkHTMLInputElement.autofocus_Setter(this, value);
+  void set autofocus(bool value) => _blink.BlinkHTMLInputElement.instance.autofocus_Setter_(this, value);
 
   @DomName('HTMLInputElement.capture')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get capture => _blink.BlinkHTMLInputElement.capture_Getter(this);
+  bool get capture => _blink.BlinkHTMLInputElement.instance.capture_Getter_(this);
 
   @DomName('HTMLInputElement.capture')
   @DocsEditable()
   @Experimental() // untriaged
-  void set capture(bool value) => _blink.BlinkHTMLInputElement.capture_Setter(this, value);
+  void set capture(bool value) => _blink.BlinkHTMLInputElement.instance.capture_Setter_(this, value);
 
   @DomName('HTMLInputElement.checked')
   @DocsEditable()
-  bool get checked => _blink.BlinkHTMLInputElement.checked_Getter(this);
+  bool get checked => _blink.BlinkHTMLInputElement.instance.checked_Getter_(this);
 
   @DomName('HTMLInputElement.checked')
   @DocsEditable()
-  void set checked(bool value) => _blink.BlinkHTMLInputElement.checked_Setter(this, value);
+  void set checked(bool value) => _blink.BlinkHTMLInputElement.instance.checked_Setter_(this, value);
 
   @DomName('HTMLInputElement.defaultChecked')
   @DocsEditable()
-  bool get defaultChecked => _blink.BlinkHTMLInputElement.defaultChecked_Getter(this);
+  bool get defaultChecked => _blink.BlinkHTMLInputElement.instance.defaultChecked_Getter_(this);
 
   @DomName('HTMLInputElement.defaultChecked')
   @DocsEditable()
-  void set defaultChecked(bool value) => _blink.BlinkHTMLInputElement.defaultChecked_Setter(this, value);
+  void set defaultChecked(bool value) => _blink.BlinkHTMLInputElement.instance.defaultChecked_Setter_(this, value);
 
   @DomName('HTMLInputElement.defaultValue')
   @DocsEditable()
-  String get defaultValue => _blink.BlinkHTMLInputElement.defaultValue_Getter(this);
+  String get defaultValue => _blink.BlinkHTMLInputElement.instance.defaultValue_Getter_(this);
 
   @DomName('HTMLInputElement.defaultValue')
   @DocsEditable()
-  void set defaultValue(String value) => _blink.BlinkHTMLInputElement.defaultValue_Setter(this, value);
+  void set defaultValue(String value) => _blink.BlinkHTMLInputElement.instance.defaultValue_Setter_(this, value);
 
   @DomName('HTMLInputElement.dirName')
   @DocsEditable()
-  String get dirName => _blink.BlinkHTMLInputElement.dirName_Getter(this);
+  String get dirName => _blink.BlinkHTMLInputElement.instance.dirName_Getter_(this);
 
   @DomName('HTMLInputElement.dirName')
   @DocsEditable()
-  void set dirName(String value) => _blink.BlinkHTMLInputElement.dirName_Setter(this, value);
+  void set dirName(String value) => _blink.BlinkHTMLInputElement.instance.dirName_Setter_(this, value);
 
   @DomName('HTMLInputElement.disabled')
   @DocsEditable()
-  bool get disabled => _blink.BlinkHTMLInputElement.disabled_Getter(this);
+  bool get disabled => _blink.BlinkHTMLInputElement.instance.disabled_Getter_(this);
 
   @DomName('HTMLInputElement.disabled')
   @DocsEditable()
-  void set disabled(bool value) => _blink.BlinkHTMLInputElement.disabled_Setter(this, value);
+  void set disabled(bool value) => _blink.BlinkHTMLInputElement.instance.disabled_Setter_(this, value);
 
   @DomName('HTMLInputElement.files')
   @DocsEditable()
-  List<File> get files => _blink.BlinkHTMLInputElement.files_Getter(this);
+  List<File> get files => _blink.BlinkHTMLInputElement.instance.files_Getter_(this);
 
   @DomName('HTMLInputElement.files')
   @DocsEditable()
-  void set files(List<File> value) => _blink.BlinkHTMLInputElement.files_Setter(this, value);
+  void set files(List<File> value) => _blink.BlinkHTMLInputElement.instance.files_Setter_(this, value);
 
   @DomName('HTMLInputElement.form')
   @DocsEditable()
-  FormElement get form => _blink.BlinkHTMLInputElement.form_Getter(this);
+  FormElement get form => _blink.BlinkHTMLInputElement.instance.form_Getter_(this);
 
   @DomName('HTMLInputElement.formAction')
   @DocsEditable()
-  String get formAction => _blink.BlinkHTMLInputElement.formAction_Getter(this);
+  String get formAction => _blink.BlinkHTMLInputElement.instance.formAction_Getter_(this);
 
   @DomName('HTMLInputElement.formAction')
   @DocsEditable()
-  void set formAction(String value) => _blink.BlinkHTMLInputElement.formAction_Setter(this, value);
+  void set formAction(String value) => _blink.BlinkHTMLInputElement.instance.formAction_Setter_(this, value);
 
   @DomName('HTMLInputElement.formEnctype')
   @DocsEditable()
-  String get formEnctype => _blink.BlinkHTMLInputElement.formEnctype_Getter(this);
+  String get formEnctype => _blink.BlinkHTMLInputElement.instance.formEnctype_Getter_(this);
 
   @DomName('HTMLInputElement.formEnctype')
   @DocsEditable()
-  void set formEnctype(String value) => _blink.BlinkHTMLInputElement.formEnctype_Setter(this, value);
+  void set formEnctype(String value) => _blink.BlinkHTMLInputElement.instance.formEnctype_Setter_(this, value);
 
   @DomName('HTMLInputElement.formMethod')
   @DocsEditable()
-  String get formMethod => _blink.BlinkHTMLInputElement.formMethod_Getter(this);
+  String get formMethod => _blink.BlinkHTMLInputElement.instance.formMethod_Getter_(this);
 
   @DomName('HTMLInputElement.formMethod')
   @DocsEditable()
-  void set formMethod(String value) => _blink.BlinkHTMLInputElement.formMethod_Setter(this, value);
+  void set formMethod(String value) => _blink.BlinkHTMLInputElement.instance.formMethod_Setter_(this, value);
 
   @DomName('HTMLInputElement.formNoValidate')
   @DocsEditable()
-  bool get formNoValidate => _blink.BlinkHTMLInputElement.formNoValidate_Getter(this);
+  bool get formNoValidate => _blink.BlinkHTMLInputElement.instance.formNoValidate_Getter_(this);
 
   @DomName('HTMLInputElement.formNoValidate')
   @DocsEditable()
-  void set formNoValidate(bool value) => _blink.BlinkHTMLInputElement.formNoValidate_Setter(this, value);
+  void set formNoValidate(bool value) => _blink.BlinkHTMLInputElement.instance.formNoValidate_Setter_(this, value);
 
   @DomName('HTMLInputElement.formTarget')
   @DocsEditable()
-  String get formTarget => _blink.BlinkHTMLInputElement.formTarget_Getter(this);
+  String get formTarget => _blink.BlinkHTMLInputElement.instance.formTarget_Getter_(this);
 
   @DomName('HTMLInputElement.formTarget')
   @DocsEditable()
-  void set formTarget(String value) => _blink.BlinkHTMLInputElement.formTarget_Setter(this, value);
+  void set formTarget(String value) => _blink.BlinkHTMLInputElement.instance.formTarget_Setter_(this, value);
 
   @DomName('HTMLInputElement.height')
   @DocsEditable()
-  int get height => _blink.BlinkHTMLInputElement.height_Getter(this);
+  int get height => _blink.BlinkHTMLInputElement.instance.height_Getter_(this);
 
   @DomName('HTMLInputElement.height')
   @DocsEditable()
-  void set height(int value) => _blink.BlinkHTMLInputElement.height_Setter(this, value);
+  void set height(int value) => _blink.BlinkHTMLInputElement.instance.height_Setter_(this, value);
 
   @DomName('HTMLInputElement.incremental')
   @DocsEditable()
   // http://www.w3.org/TR/html-markup/input.search.html
   @Experimental()
-  bool get incremental => _blink.BlinkHTMLInputElement.incremental_Getter(this);
+  bool get incremental => _blink.BlinkHTMLInputElement.instance.incremental_Getter_(this);
 
   @DomName('HTMLInputElement.incremental')
   @DocsEditable()
   // http://www.w3.org/TR/html-markup/input.search.html
   @Experimental()
-  void set incremental(bool value) => _blink.BlinkHTMLInputElement.incremental_Setter(this, value);
+  void set incremental(bool value) => _blink.BlinkHTMLInputElement.instance.incremental_Setter_(this, value);
 
   @DomName('HTMLInputElement.indeterminate')
   @DocsEditable()
-  bool get indeterminate => _blink.BlinkHTMLInputElement.indeterminate_Getter(this);
+  bool get indeterminate => _blink.BlinkHTMLInputElement.instance.indeterminate_Getter_(this);
 
   @DomName('HTMLInputElement.indeterminate')
   @DocsEditable()
-  void set indeterminate(bool value) => _blink.BlinkHTMLInputElement.indeterminate_Setter(this, value);
+  void set indeterminate(bool value) => _blink.BlinkHTMLInputElement.instance.indeterminate_Setter_(this, value);
 
   @DomName('HTMLInputElement.inputMode')
   @DocsEditable()
   @Experimental() // untriaged
-  String get inputMode => _blink.BlinkHTMLInputElement.inputMode_Getter(this);
+  String get inputMode => _blink.BlinkHTMLInputElement.instance.inputMode_Getter_(this);
 
   @DomName('HTMLInputElement.inputMode')
   @DocsEditable()
   @Experimental() // untriaged
-  void set inputMode(String value) => _blink.BlinkHTMLInputElement.inputMode_Setter(this, value);
+  void set inputMode(String value) => _blink.BlinkHTMLInputElement.instance.inputMode_Setter_(this, value);
 
   @DomName('HTMLInputElement.labels')
   @DocsEditable()
-  List<Node> get labels => _blink.BlinkHTMLInputElement.labels_Getter(this);
+  List<Node> get labels => _blink.BlinkHTMLInputElement.instance.labels_Getter_(this);
 
   @DomName('HTMLInputElement.list')
   @DocsEditable()
-  HtmlElement get list => _blink.BlinkHTMLInputElement.list_Getter(this);
+  HtmlElement get list => _blink.BlinkHTMLInputElement.instance.list_Getter_(this);
 
   @DomName('HTMLInputElement.max')
   @DocsEditable()
-  String get max => _blink.BlinkHTMLInputElement.max_Getter(this);
+  String get max => _blink.BlinkHTMLInputElement.instance.max_Getter_(this);
 
   @DomName('HTMLInputElement.max')
   @DocsEditable()
-  void set max(String value) => _blink.BlinkHTMLInputElement.max_Setter(this, value);
+  void set max(String value) => _blink.BlinkHTMLInputElement.instance.max_Setter_(this, value);
 
   @DomName('HTMLInputElement.maxLength')
   @DocsEditable()
-  int get maxLength => _blink.BlinkHTMLInputElement.maxLength_Getter(this);
+  int get maxLength => _blink.BlinkHTMLInputElement.instance.maxLength_Getter_(this);
 
   @DomName('HTMLInputElement.maxLength')
   @DocsEditable()
-  void set maxLength(int value) => _blink.BlinkHTMLInputElement.maxLength_Setter(this, value);
+  void set maxLength(int value) => _blink.BlinkHTMLInputElement.instance.maxLength_Setter_(this, value);
 
   @DomName('HTMLInputElement.min')
   @DocsEditable()
-  String get min => _blink.BlinkHTMLInputElement.min_Getter(this);
+  String get min => _blink.BlinkHTMLInputElement.instance.min_Getter_(this);
 
   @DomName('HTMLInputElement.min')
   @DocsEditable()
-  void set min(String value) => _blink.BlinkHTMLInputElement.min_Setter(this, value);
+  void set min(String value) => _blink.BlinkHTMLInputElement.instance.min_Setter_(this, value);
 
   @DomName('HTMLInputElement.multiple')
   @DocsEditable()
-  bool get multiple => _blink.BlinkHTMLInputElement.multiple_Getter(this);
+  bool get multiple => _blink.BlinkHTMLInputElement.instance.multiple_Getter_(this);
 
   @DomName('HTMLInputElement.multiple')
   @DocsEditable()
-  void set multiple(bool value) => _blink.BlinkHTMLInputElement.multiple_Setter(this, value);
+  void set multiple(bool value) => _blink.BlinkHTMLInputElement.instance.multiple_Setter_(this, value);
 
   @DomName('HTMLInputElement.name')
   @DocsEditable()
-  String get name => _blink.BlinkHTMLInputElement.name_Getter(this);
+  String get name => _blink.BlinkHTMLInputElement.instance.name_Getter_(this);
 
   @DomName('HTMLInputElement.name')
   @DocsEditable()
-  void set name(String value) => _blink.BlinkHTMLInputElement.name_Setter(this, value);
+  void set name(String value) => _blink.BlinkHTMLInputElement.instance.name_Setter_(this, value);
 
   @DomName('HTMLInputElement.pattern')
   @DocsEditable()
-  String get pattern => _blink.BlinkHTMLInputElement.pattern_Getter(this);
+  String get pattern => _blink.BlinkHTMLInputElement.instance.pattern_Getter_(this);
 
   @DomName('HTMLInputElement.pattern')
   @DocsEditable()
-  void set pattern(String value) => _blink.BlinkHTMLInputElement.pattern_Setter(this, value);
+  void set pattern(String value) => _blink.BlinkHTMLInputElement.instance.pattern_Setter_(this, value);
 
   @DomName('HTMLInputElement.placeholder')
   @DocsEditable()
-  String get placeholder => _blink.BlinkHTMLInputElement.placeholder_Getter(this);
+  String get placeholder => _blink.BlinkHTMLInputElement.instance.placeholder_Getter_(this);
 
   @DomName('HTMLInputElement.placeholder')
   @DocsEditable()
-  void set placeholder(String value) => _blink.BlinkHTMLInputElement.placeholder_Setter(this, value);
+  void set placeholder(String value) => _blink.BlinkHTMLInputElement.instance.placeholder_Setter_(this, value);
 
   @DomName('HTMLInputElement.readOnly')
   @DocsEditable()
-  bool get readOnly => _blink.BlinkHTMLInputElement.readOnly_Getter(this);
+  bool get readOnly => _blink.BlinkHTMLInputElement.instance.readOnly_Getter_(this);
 
   @DomName('HTMLInputElement.readOnly')
   @DocsEditable()
-  void set readOnly(bool value) => _blink.BlinkHTMLInputElement.readOnly_Setter(this, value);
+  void set readOnly(bool value) => _blink.BlinkHTMLInputElement.instance.readOnly_Setter_(this, value);
 
   @DomName('HTMLInputElement.required')
   @DocsEditable()
-  bool get required => _blink.BlinkHTMLInputElement.required_Getter(this);
+  bool get required => _blink.BlinkHTMLInputElement.instance.required_Getter_(this);
 
   @DomName('HTMLInputElement.required')
   @DocsEditable()
-  void set required(bool value) => _blink.BlinkHTMLInputElement.required_Setter(this, value);
+  void set required(bool value) => _blink.BlinkHTMLInputElement.instance.required_Setter_(this, value);
 
   @DomName('HTMLInputElement.selectionDirection')
   @DocsEditable()
-  String get selectionDirection => _blink.BlinkHTMLInputElement.selectionDirection_Getter(this);
+  String get selectionDirection => _blink.BlinkHTMLInputElement.instance.selectionDirection_Getter_(this);
 
   @DomName('HTMLInputElement.selectionDirection')
   @DocsEditable()
-  void set selectionDirection(String value) => _blink.BlinkHTMLInputElement.selectionDirection_Setter(this, value);
+  void set selectionDirection(String value) => _blink.BlinkHTMLInputElement.instance.selectionDirection_Setter_(this, value);
 
   @DomName('HTMLInputElement.selectionEnd')
   @DocsEditable()
-  int get selectionEnd => _blink.BlinkHTMLInputElement.selectionEnd_Getter(this);
+  int get selectionEnd => _blink.BlinkHTMLInputElement.instance.selectionEnd_Getter_(this);
 
   @DomName('HTMLInputElement.selectionEnd')
   @DocsEditable()
-  void set selectionEnd(int value) => _blink.BlinkHTMLInputElement.selectionEnd_Setter(this, value);
+  void set selectionEnd(int value) => _blink.BlinkHTMLInputElement.instance.selectionEnd_Setter_(this, value);
 
   @DomName('HTMLInputElement.selectionStart')
   @DocsEditable()
-  int get selectionStart => _blink.BlinkHTMLInputElement.selectionStart_Getter(this);
+  int get selectionStart => _blink.BlinkHTMLInputElement.instance.selectionStart_Getter_(this);
 
   @DomName('HTMLInputElement.selectionStart')
   @DocsEditable()
-  void set selectionStart(int value) => _blink.BlinkHTMLInputElement.selectionStart_Setter(this, value);
+  void set selectionStart(int value) => _blink.BlinkHTMLInputElement.instance.selectionStart_Setter_(this, value);
 
   @DomName('HTMLInputElement.size')
   @DocsEditable()
-  int get size => _blink.BlinkHTMLInputElement.size_Getter(this);
+  int get size => _blink.BlinkHTMLInputElement.instance.size_Getter_(this);
 
   @DomName('HTMLInputElement.size')
   @DocsEditable()
-  void set size(int value) => _blink.BlinkHTMLInputElement.size_Setter(this, value);
+  void set size(int value) => _blink.BlinkHTMLInputElement.instance.size_Setter_(this, value);
 
   @DomName('HTMLInputElement.src')
   @DocsEditable()
-  String get src => _blink.BlinkHTMLInputElement.src_Getter(this);
+  String get src => _blink.BlinkHTMLInputElement.instance.src_Getter_(this);
 
   @DomName('HTMLInputElement.src')
   @DocsEditable()
-  void set src(String value) => _blink.BlinkHTMLInputElement.src_Setter(this, value);
+  void set src(String value) => _blink.BlinkHTMLInputElement.instance.src_Setter_(this, value);
 
   @DomName('HTMLInputElement.step')
   @DocsEditable()
-  String get step => _blink.BlinkHTMLInputElement.step_Getter(this);
+  String get step => _blink.BlinkHTMLInputElement.instance.step_Getter_(this);
 
   @DomName('HTMLInputElement.step')
   @DocsEditable()
-  void set step(String value) => _blink.BlinkHTMLInputElement.step_Setter(this, value);
+  void set step(String value) => _blink.BlinkHTMLInputElement.instance.step_Setter_(this, value);
 
   @DomName('HTMLInputElement.type')
   @DocsEditable()
-  String get type => _blink.BlinkHTMLInputElement.type_Getter(this);
+  String get type => _blink.BlinkHTMLInputElement.instance.type_Getter_(this);
 
   @DomName('HTMLInputElement.type')
   @DocsEditable()
-  void set type(String value) => _blink.BlinkHTMLInputElement.type_Setter(this, value);
+  void set type(String value) => _blink.BlinkHTMLInputElement.instance.type_Setter_(this, value);
 
   @DomName('HTMLInputElement.validationMessage')
   @DocsEditable()
-  String get validationMessage => _blink.BlinkHTMLInputElement.validationMessage_Getter(this);
+  String get validationMessage => _blink.BlinkHTMLInputElement.instance.validationMessage_Getter_(this);
 
   @DomName('HTMLInputElement.validity')
   @DocsEditable()
-  ValidityState get validity => _blink.BlinkHTMLInputElement.validity_Getter(this);
+  ValidityState get validity => _blink.BlinkHTMLInputElement.instance.validity_Getter_(this);
 
   @DomName('HTMLInputElement.value')
   @DocsEditable()
-  String get value => _blink.BlinkHTMLInputElement.value_Getter(this);
+  String get value => _blink.BlinkHTMLInputElement.instance.value_Getter_(this);
 
   @DomName('HTMLInputElement.value')
   @DocsEditable()
-  void set value(String value) => _blink.BlinkHTMLInputElement.value_Setter(this, value);
+  void set value(String value) => _blink.BlinkHTMLInputElement.instance.value_Setter_(this, value);
 
   @DomName('HTMLInputElement.valueAsDate')
   @DocsEditable()
-  DateTime get valueAsDate => _blink.BlinkHTMLInputElement.valueAsDate_Getter(this);
+  DateTime get valueAsDate => _blink.BlinkHTMLInputElement.instance.valueAsDate_Getter_(this);
 
   @DomName('HTMLInputElement.valueAsDate')
   @DocsEditable()
-  void set valueAsDate(DateTime value) => _blink.BlinkHTMLInputElement.valueAsDate_Setter(this, value);
+  void set valueAsDate(DateTime value) => _blink.BlinkHTMLInputElement.instance.valueAsDate_Setter_(this, value);
 
   @DomName('HTMLInputElement.valueAsNumber')
   @DocsEditable()
-  num get valueAsNumber => _blink.BlinkHTMLInputElement.valueAsNumber_Getter(this);
+  num get valueAsNumber => _blink.BlinkHTMLInputElement.instance.valueAsNumber_Getter_(this);
 
   @DomName('HTMLInputElement.valueAsNumber')
   @DocsEditable()
-  void set valueAsNumber(num value) => _blink.BlinkHTMLInputElement.valueAsNumber_Setter(this, value);
+  void set valueAsNumber(num value) => _blink.BlinkHTMLInputElement.instance.valueAsNumber_Setter_(this, value);
 
   @DomName('HTMLInputElement.webkitEntries')
   @DocsEditable()
@@ -19576,7 +19576,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/states-of-the-type-attribute.html#concept-input-type-file-selected
-  List<Entry> get entries => _blink.BlinkHTMLInputElement.webkitEntries_Getter(this);
+  List<Entry> get entries => _blink.BlinkHTMLInputElement.instance.webkitEntries_Getter_(this);
 
   @DomName('HTMLInputElement.webkitdirectory')
   @DocsEditable()
@@ -19584,7 +19584,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://plus.sandbox.google.com/+AddyOsmani/posts/Dk5UhZ6zfF3
-  bool get directory => _blink.BlinkHTMLInputElement.webkitdirectory_Getter(this);
+  bool get directory => _blink.BlinkHTMLInputElement.instance.webkitdirectory_Getter_(this);
 
   @DomName('HTMLInputElement.webkitdirectory')
   @DocsEditable()
@@ -19592,39 +19592,39 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://plus.sandbox.google.com/+AddyOsmani/posts/Dk5UhZ6zfF3
-  void set directory(bool value) => _blink.BlinkHTMLInputElement.webkitdirectory_Setter(this, value);
+  void set directory(bool value) => _blink.BlinkHTMLInputElement.instance.webkitdirectory_Setter_(this, value);
 
   @DomName('HTMLInputElement.width')
   @DocsEditable()
-  int get width => _blink.BlinkHTMLInputElement.width_Getter(this);
+  int get width => _blink.BlinkHTMLInputElement.instance.width_Getter_(this);
 
   @DomName('HTMLInputElement.width')
   @DocsEditable()
-  void set width(int value) => _blink.BlinkHTMLInputElement.width_Setter(this, value);
+  void set width(int value) => _blink.BlinkHTMLInputElement.instance.width_Setter_(this, value);
 
   @DomName('HTMLInputElement.willValidate')
   @DocsEditable()
-  bool get willValidate => _blink.BlinkHTMLInputElement.willValidate_Getter(this);
+  bool get willValidate => _blink.BlinkHTMLInputElement.instance.willValidate_Getter_(this);
 
   @DomName('HTMLInputElement.checkValidity')
   @DocsEditable()
-  bool checkValidity() => _blink.BlinkHTMLInputElement.checkValidity_Callback(this);
+  bool checkValidity() => _blink.BlinkHTMLInputElement.instance.checkValidity_Callback_0_(this);
 
   @DomName('HTMLInputElement.select')
   @DocsEditable()
-  void select() => _blink.BlinkHTMLInputElement.select_Callback(this);
+  void select() => _blink.BlinkHTMLInputElement.instance.select_Callback_0_(this);
 
   @DomName('HTMLInputElement.setCustomValidity')
   @DocsEditable()
-  void setCustomValidity(String error) => _blink.BlinkHTMLInputElement.setCustomValidity_Callback_1(this, error);
+  void setCustomValidity(String error) => _blink.BlinkHTMLInputElement.instance.setCustomValidity_Callback_1_(this, error);
 
   void setRangeText(String replacement, {int start, int end, String selectionMode}) {
     if ((replacement is String || replacement == null) && start == null && end == null && selectionMode == null) {
-      _blink.BlinkHTMLInputElement.setRangeText_Callback_1(this, replacement);
+      _blink.BlinkHTMLInputElement.instance.setRangeText_Callback_1_(this, replacement);
       return;
     }
     if ((selectionMode is String || selectionMode == null) && (end is int || end == null) && (start is int || start == null) && (replacement is String || replacement == null)) {
-      _blink.BlinkHTMLInputElement.setRangeText_Callback_4(this, replacement, start, end, selectionMode);
+      _blink.BlinkHTMLInputElement.instance.setRangeText_Callback_4_(this, replacement, start, end, selectionMode);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -19632,28 +19632,28 @@
 
   void setSelectionRange(int start, int end, [String direction]) {
     if (direction != null) {
-      _blink.BlinkHTMLInputElement.setSelectionRange_Callback_3(this, start, end, direction);
+      _blink.BlinkHTMLInputElement.instance.setSelectionRange_Callback_3_(this, start, end, direction);
       return;
     }
-    _blink.BlinkHTMLInputElement.setSelectionRange_Callback_2(this, start, end);
+    _blink.BlinkHTMLInputElement.instance.setSelectionRange_Callback_2_(this, start, end);
     return;
   }
 
   void stepDown([int n]) {
     if (n != null) {
-      _blink.BlinkHTMLInputElement.stepDown_Callback_1(this, n);
+      _blink.BlinkHTMLInputElement.instance.stepDown_Callback_1_(this, n);
       return;
     }
-    _blink.BlinkHTMLInputElement.stepDown_Callback(this);
+    _blink.BlinkHTMLInputElement.instance.stepDown_Callback_0_(this);
     return;
   }
 
   void stepUp([int n]) {
     if (n != null) {
-      _blink.BlinkHTMLInputElement.stepUp_Callback_1(this, n);
+      _blink.BlinkHTMLInputElement.instance.stepUp_Callback_1_(this, n);
       return;
     }
-    _blink.BlinkHTMLInputElement.stepUp_Callback(this);
+    _blink.BlinkHTMLInputElement.instance.stepUp_Callback_0_(this);
     return;
   }
 
@@ -20231,25 +20231,25 @@
   @DomName('InputMethodContext.compositionEndOffset')
   @DocsEditable()
   @Experimental() // untriaged
-  int get compositionEndOffset => _blink.BlinkInputMethodContext.compositionEndOffset_Getter(this);
+  int get compositionEndOffset => _blink.BlinkInputMethodContext.instance.compositionEndOffset_Getter_(this);
 
   @DomName('InputMethodContext.compositionStartOffset')
   @DocsEditable()
   @Experimental() // untriaged
-  int get compositionStartOffset => _blink.BlinkInputMethodContext.compositionStartOffset_Getter(this);
+  int get compositionStartOffset => _blink.BlinkInputMethodContext.instance.compositionStartOffset_Getter_(this);
 
   @DomName('InputMethodContext.locale')
   @DocsEditable()
-  String get locale => _blink.BlinkInputMethodContext.locale_Getter(this);
+  String get locale => _blink.BlinkInputMethodContext.instance.locale_Getter_(this);
 
   @DomName('InputMethodContext.target')
   @DocsEditable()
   @Experimental() // untriaged
-  HtmlElement get target => _blink.BlinkInputMethodContext.target_Getter(this);
+  HtmlElement get target => _blink.BlinkInputMethodContext.instance.target_Getter_(this);
 
   @DomName('InputMethodContext.confirmComposition')
   @DocsEditable()
-  void confirmComposition() => _blink.BlinkInputMethodContext.confirmComposition_Callback(this);
+  void confirmComposition() => _blink.BlinkInputMethodContext.instance.confirmComposition_Callback_0_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20269,12 +20269,12 @@
   @DomName('InstallEvent.reloadAll')
   @DocsEditable()
   @Experimental() // untriaged
-  Future reloadAll() => _blink.BlinkInstallEvent.reloadAll_Callback(this);
+  Future reloadAll() => _blink.BlinkInstallEvent.instance.reloadAll_Callback_0_(this);
 
   @DomName('InstallEvent.replace')
   @DocsEditable()
   @Experimental() // untriaged
-  void replace() => _blink.BlinkInstallEvent.replace_Callback(this);
+  void replace() => _blink.BlinkInstallEvent.instance.replace_Callback_0_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20294,7 +20294,7 @@
   @DomName('InstallPhaseEvent.waitUntil')
   @DocsEditable()
   @Experimental() // untriaged
-  void waitUntil(Object value) => _blink.BlinkInstallPhaseEvent.waitUntil_Callback_1(this, value);
+  void waitUntil(Object value) => _blink.BlinkInstallPhaseEvent.instance.waitUntil_Callback_1_(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20348,48 +20348,48 @@
 
   @DomName('KeyboardEvent.altKey')
   @DocsEditable()
-  bool get altKey => _blink.BlinkKeyboardEvent.altKey_Getter(this);
+  bool get altKey => _blink.BlinkKeyboardEvent.instance.altKey_Getter_(this);
 
   @DomName('KeyboardEvent.ctrlKey')
   @DocsEditable()
-  bool get ctrlKey => _blink.BlinkKeyboardEvent.ctrlKey_Getter(this);
+  bool get ctrlKey => _blink.BlinkKeyboardEvent.instance.ctrlKey_Getter_(this);
 
   @DomName('KeyboardEvent.keyIdentifier')
   @DocsEditable()
   @Experimental() // nonstandard
-  String get _keyIdentifier => _blink.BlinkKeyboardEvent.keyIdentifier_Getter(this);
+  String get _keyIdentifier => _blink.BlinkKeyboardEvent.instance.keyIdentifier_Getter_(this);
 
   @DomName('KeyboardEvent.keyLocation')
   @DocsEditable()
   @Experimental() // nonstandard
-  int get keyLocation => _blink.BlinkKeyboardEvent.keyLocation_Getter(this);
+  int get keyLocation => _blink.BlinkKeyboardEvent.instance.keyLocation_Getter_(this);
 
   @DomName('KeyboardEvent.location')
   @DocsEditable()
   @Experimental() // untriaged
-  int get location => _blink.BlinkKeyboardEvent.location_Getter(this);
+  int get location => _blink.BlinkKeyboardEvent.instance.location_Getter_(this);
 
   @DomName('KeyboardEvent.metaKey')
   @DocsEditable()
-  bool get metaKey => _blink.BlinkKeyboardEvent.metaKey_Getter(this);
+  bool get metaKey => _blink.BlinkKeyboardEvent.instance.metaKey_Getter_(this);
 
   @DomName('KeyboardEvent.repeat')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get repeat => _blink.BlinkKeyboardEvent.repeat_Getter(this);
+  bool get repeat => _blink.BlinkKeyboardEvent.instance.repeat_Getter_(this);
 
   @DomName('KeyboardEvent.shiftKey')
   @DocsEditable()
-  bool get shiftKey => _blink.BlinkKeyboardEvent.shiftKey_Getter(this);
+  bool get shiftKey => _blink.BlinkKeyboardEvent.instance.shiftKey_Getter_(this);
 
   @DomName('KeyboardEvent.getModifierState')
   @DocsEditable()
   @Experimental() // untriaged
-  bool getModifierState(String keyArgument) => _blink.BlinkKeyboardEvent.getModifierState_Callback_1(this, keyArgument);
+  bool getModifierState(String keyArgument) => _blink.BlinkKeyboardEvent.instance.getModifierState_Callback_1_(this, keyArgument);
 
   @DomName('KeyboardEvent.initKeyboardEvent')
   @DocsEditable()
-  void _initKeyboardEvent(String type, bool canBubble, bool cancelable, Window view, String keyIdentifier, int location, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey) => _blink.BlinkKeyboardEvent.initKeyboardEvent_Callback_10(this, type, canBubble, cancelable, view, keyIdentifier, location, ctrlKey, altKey, shiftKey, metaKey);
+  void _initKeyboardEvent(String type, bool canBubble, bool cancelable, Window view, String keyIdentifier, int location, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey) => _blink.BlinkKeyboardEvent.instance.initKeyboardEvent_Callback_10_(this, type, canBubble, cancelable, view, keyIdentifier, location, ctrlKey, altKey, shiftKey, metaKey);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20424,76 +20424,76 @@
 
   @DomName('HTMLKeygenElement.autofocus')
   @DocsEditable()
-  bool get autofocus => _blink.BlinkHTMLKeygenElement.autofocus_Getter(this);
+  bool get autofocus => _blink.BlinkHTMLKeygenElement.instance.autofocus_Getter_(this);
 
   @DomName('HTMLKeygenElement.autofocus')
   @DocsEditable()
-  void set autofocus(bool value) => _blink.BlinkHTMLKeygenElement.autofocus_Setter(this, value);
+  void set autofocus(bool value) => _blink.BlinkHTMLKeygenElement.instance.autofocus_Setter_(this, value);
 
   @DomName('HTMLKeygenElement.challenge')
   @DocsEditable()
-  String get challenge => _blink.BlinkHTMLKeygenElement.challenge_Getter(this);
+  String get challenge => _blink.BlinkHTMLKeygenElement.instance.challenge_Getter_(this);
 
   @DomName('HTMLKeygenElement.challenge')
   @DocsEditable()
-  void set challenge(String value) => _blink.BlinkHTMLKeygenElement.challenge_Setter(this, value);
+  void set challenge(String value) => _blink.BlinkHTMLKeygenElement.instance.challenge_Setter_(this, value);
 
   @DomName('HTMLKeygenElement.disabled')
   @DocsEditable()
-  bool get disabled => _blink.BlinkHTMLKeygenElement.disabled_Getter(this);
+  bool get disabled => _blink.BlinkHTMLKeygenElement.instance.disabled_Getter_(this);
 
   @DomName('HTMLKeygenElement.disabled')
   @DocsEditable()
-  void set disabled(bool value) => _blink.BlinkHTMLKeygenElement.disabled_Setter(this, value);
+  void set disabled(bool value) => _blink.BlinkHTMLKeygenElement.instance.disabled_Setter_(this, value);
 
   @DomName('HTMLKeygenElement.form')
   @DocsEditable()
-  FormElement get form => _blink.BlinkHTMLKeygenElement.form_Getter(this);
+  FormElement get form => _blink.BlinkHTMLKeygenElement.instance.form_Getter_(this);
 
   @DomName('HTMLKeygenElement.keytype')
   @DocsEditable()
-  String get keytype => _blink.BlinkHTMLKeygenElement.keytype_Getter(this);
+  String get keytype => _blink.BlinkHTMLKeygenElement.instance.keytype_Getter_(this);
 
   @DomName('HTMLKeygenElement.keytype')
   @DocsEditable()
-  void set keytype(String value) => _blink.BlinkHTMLKeygenElement.keytype_Setter(this, value);
+  void set keytype(String value) => _blink.BlinkHTMLKeygenElement.instance.keytype_Setter_(this, value);
 
   @DomName('HTMLKeygenElement.labels')
   @DocsEditable()
   @Unstable()
-  List<Node> get labels => _blink.BlinkHTMLKeygenElement.labels_Getter(this);
+  List<Node> get labels => _blink.BlinkHTMLKeygenElement.instance.labels_Getter_(this);
 
   @DomName('HTMLKeygenElement.name')
   @DocsEditable()
-  String get name => _blink.BlinkHTMLKeygenElement.name_Getter(this);
+  String get name => _blink.BlinkHTMLKeygenElement.instance.name_Getter_(this);
 
   @DomName('HTMLKeygenElement.name')
   @DocsEditable()
-  void set name(String value) => _blink.BlinkHTMLKeygenElement.name_Setter(this, value);
+  void set name(String value) => _blink.BlinkHTMLKeygenElement.instance.name_Setter_(this, value);
 
   @DomName('HTMLKeygenElement.type')
   @DocsEditable()
-  String get type => _blink.BlinkHTMLKeygenElement.type_Getter(this);
+  String get type => _blink.BlinkHTMLKeygenElement.instance.type_Getter_(this);
 
   @DomName('HTMLKeygenElement.validationMessage')
   @DocsEditable()
-  String get validationMessage => _blink.BlinkHTMLKeygenElement.validationMessage_Getter(this);
+  String get validationMessage => _blink.BlinkHTMLKeygenElement.instance.validationMessage_Getter_(this);
 
   @DomName('HTMLKeygenElement.validity')
   @DocsEditable()
-  ValidityState get validity => _blink.BlinkHTMLKeygenElement.validity_Getter(this);
+  ValidityState get validity => _blink.BlinkHTMLKeygenElement.instance.validity_Getter_(this);
 
   @DomName('HTMLKeygenElement.willValidate')
   @DocsEditable()
-  bool get willValidate => _blink.BlinkHTMLKeygenElement.willValidate_Getter(this);
+  bool get willValidate => _blink.BlinkHTMLKeygenElement.instance.willValidate_Getter_(this);
 
   @DomName('HTMLKeygenElement.checkValidity')
   @DocsEditable()
-  bool checkValidity() => _blink.BlinkHTMLKeygenElement.checkValidity_Callback(this);
+  bool checkValidity() => _blink.BlinkHTMLKeygenElement.instance.checkValidity_Callback_0_(this);
 
   @DomName('HTMLKeygenElement.setCustomValidity')
   @DocsEditable()
-  void setCustomValidity(String error) => _blink.BlinkHTMLKeygenElement.setCustomValidity_Callback_1(this, error);
+  void setCustomValidity(String error) => _blink.BlinkHTMLKeygenElement.instance.setCustomValidity_Callback_1_(this, error);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20521,11 +20521,11 @@
 
   @DomName('HTMLLIElement.value')
   @DocsEditable()
-  int get value => _blink.BlinkHTMLLIElement.value_Getter(this);
+  int get value => _blink.BlinkHTMLLIElement.instance.value_Getter_(this);
 
   @DomName('HTMLLIElement.value')
   @DocsEditable()
-  void set value(int value) => _blink.BlinkHTMLLIElement.value_Setter(this, value);
+  void set value(int value) => _blink.BlinkHTMLLIElement.instance.value_Setter_(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20553,19 +20553,19 @@
 
   @DomName('HTMLLabelElement.control')
   @DocsEditable()
-  HtmlElement get control => _blink.BlinkHTMLLabelElement.control_Getter(this);
+  HtmlElement get control => _blink.BlinkHTMLLabelElement.instance.control_Getter_(this);
 
   @DomName('HTMLLabelElement.form')
   @DocsEditable()
-  FormElement get form => _blink.BlinkHTMLLabelElement.form_Getter(this);
+  FormElement get form => _blink.BlinkHTMLLabelElement.instance.form_Getter_(this);
 
   @DomName('HTMLLabelElement.htmlFor')
   @DocsEditable()
-  String get htmlFor => _blink.BlinkHTMLLabelElement.htmlFor_Getter(this);
+  String get htmlFor => _blink.BlinkHTMLLabelElement.instance.htmlFor_Getter_(this);
 
   @DomName('HTMLLabelElement.htmlFor')
   @DocsEditable()
-  void set htmlFor(String value) => _blink.BlinkHTMLLabelElement.htmlFor_Setter(this, value);
+  void set htmlFor(String value) => _blink.BlinkHTMLLabelElement.instance.htmlFor_Setter_(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20593,7 +20593,7 @@
 
   @DomName('HTMLLegendElement.form')
   @DocsEditable()
-  FormElement get form => _blink.BlinkHTMLLegendElement.form_Getter(this);
+  FormElement get form => _blink.BlinkHTMLLegendElement.instance.form_Getter_(this);
 
 }
 // Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
@@ -20620,84 +20620,84 @@
   @DomName('HTMLLinkElement.crossOrigin')
   @DocsEditable()
   @Experimental() // untriaged
-  String get crossOrigin => _blink.BlinkHTMLLinkElement.crossOrigin_Getter(this);
+  String get crossOrigin => _blink.BlinkHTMLLinkElement.instance.crossOrigin_Getter_(this);
 
   @DomName('HTMLLinkElement.crossOrigin')
   @DocsEditable()
   @Experimental() // untriaged
-  void set crossOrigin(String value) => _blink.BlinkHTMLLinkElement.crossOrigin_Setter(this, value);
+  void set crossOrigin(String value) => _blink.BlinkHTMLLinkElement.instance.crossOrigin_Setter_(this, value);
 
   @DomName('HTMLLinkElement.disabled')
   @DocsEditable()
-  bool get disabled => _blink.BlinkHTMLLinkElement.disabled_Getter(this);
+  bool get disabled => _blink.BlinkHTMLLinkElement.instance.disabled_Getter_(this);
 
   @DomName('HTMLLinkElement.disabled')
   @DocsEditable()
-  void set disabled(bool value) => _blink.BlinkHTMLLinkElement.disabled_Setter(this, value);
+  void set disabled(bool value) => _blink.BlinkHTMLLinkElement.instance.disabled_Setter_(this, value);
 
   @DomName('HTMLLinkElement.href')
   @DocsEditable()
-  String get href => _blink.BlinkHTMLLinkElement.href_Getter(this);
+  String get href => _blink.BlinkHTMLLinkElement.instance.href_Getter_(this);
 
   @DomName('HTMLLinkElement.href')
   @DocsEditable()
-  void set href(String value) => _blink.BlinkHTMLLinkElement.href_Setter(this, value);
+  void set href(String value) => _blink.BlinkHTMLLinkElement.instance.href_Setter_(this, value);
 
   @DomName('HTMLLinkElement.hreflang')
   @DocsEditable()
-  String get hreflang => _blink.BlinkHTMLLinkElement.hreflang_Getter(this);
+  String get hreflang => _blink.BlinkHTMLLinkElement.instance.hreflang_Getter_(this);
 
   @DomName('HTMLLinkElement.hreflang')
   @DocsEditable()
-  void set hreflang(String value) => _blink.BlinkHTMLLinkElement.hreflang_Setter(this, value);
+  void set hreflang(String value) => _blink.BlinkHTMLLinkElement.instance.hreflang_Setter_(this, value);
 
   @DomName('HTMLLinkElement.import')
   @DocsEditable()
   // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/imports/index.html#interface-import
   @Experimental()
-  Document get import => _blink.BlinkHTMLLinkElement.import_Getter(this);
+  Document get import => _blink.BlinkHTMLLinkElement.instance.import_Getter_(this);
 
   @DomName('HTMLLinkElement.integrity')
   @DocsEditable()
   @Experimental() // untriaged
-  String get integrity => _blink.BlinkHTMLLinkElement.integrity_Getter(this);
+  String get integrity => _blink.BlinkHTMLLinkElement.instance.integrity_Getter_(this);
 
   @DomName('HTMLLinkElement.integrity')
   @DocsEditable()
   @Experimental() // untriaged
-  void set integrity(String value) => _blink.BlinkHTMLLinkElement.integrity_Setter(this, value);
+  void set integrity(String value) => _blink.BlinkHTMLLinkElement.instance.integrity_Setter_(this, value);
 
   @DomName('HTMLLinkElement.media')
   @DocsEditable()
-  String get media => _blink.BlinkHTMLLinkElement.media_Getter(this);
+  String get media => _blink.BlinkHTMLLinkElement.instance.media_Getter_(this);
 
   @DomName('HTMLLinkElement.media')
   @DocsEditable()
-  void set media(String value) => _blink.BlinkHTMLLinkElement.media_Setter(this, value);
+  void set media(String value) => _blink.BlinkHTMLLinkElement.instance.media_Setter_(this, value);
 
   @DomName('HTMLLinkElement.rel')
   @DocsEditable()
-  String get rel => _blink.BlinkHTMLLinkElement.rel_Getter(this);
+  String get rel => _blink.BlinkHTMLLinkElement.instance.rel_Getter_(this);
 
   @DomName('HTMLLinkElement.rel')
   @DocsEditable()
-  void set rel(String value) => _blink.BlinkHTMLLinkElement.rel_Setter(this, value);
+  void set rel(String value) => _blink.BlinkHTMLLinkElement.instance.rel_Setter_(this, value);
 
   @DomName('HTMLLinkElement.sheet')
   @DocsEditable()
-  StyleSheet get sheet => _blink.BlinkHTMLLinkElement.sheet_Getter(this);
+  StyleSheet get sheet => _blink.BlinkHTMLLinkElement.instance.sheet_Getter_(this);
 
   @DomName('HTMLLinkElement.sizes')
   @DocsEditable()
-  DomSettableTokenList get sizes => _blink.BlinkHTMLLinkElement.sizes_Getter(this);
+  DomSettableTokenList get sizes => _blink.BlinkHTMLLinkElement.instance.sizes_Getter_(this);
 
   @DomName('HTMLLinkElement.type')
   @DocsEditable()
-  String get type => _blink.BlinkHTMLLinkElement.type_Getter(this);
+  String get type => _blink.BlinkHTMLLinkElement.instance.type_Getter_(this);
 
   @DomName('HTMLLinkElement.type')
   @DocsEditable()
-  void set type(String value) => _blink.BlinkHTMLLinkElement.type_Setter(this, value);
+  void set type(String value) => _blink.BlinkHTMLLinkElement.instance.type_Setter_(this, value);
 
 
     /// Checks if HTML imports are supported on the current platform.
@@ -20722,13 +20722,13 @@
   @DomName('LocalCredential.LocalCredential')
   @DocsEditable()
   factory LocalCredential(String id, String name, String avatarURL, String password) {
-    return _blink.BlinkLocalCredential.constructorCallback_4(id, name, avatarURL, password);
+    return _blink.BlinkLocalCredential.instance.constructorCallback_4_(id, name, avatarURL, password);
   }
 
   @DomName('LocalCredential.password')
   @DocsEditable()
   @Experimental() // untriaged
-  String get password => _blink.BlinkLocalCredential.password_Getter(this);
+  String get password => _blink.BlinkLocalCredential.instance.password_Getter_(this);
 
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -20745,93 +20745,93 @@
   @DomName('Location.ancestorOrigins')
   @DocsEditable()
   @Experimental() // nonstandard
-  List<String> get ancestorOrigins => _blink.BlinkLocation.ancestorOrigins_Getter(this);
+  List<String> get ancestorOrigins => _blink.BlinkLocation.instance.ancestorOrigins_Getter_(this);
 
   @DomName('Location.hash')
   @DocsEditable()
-  String get hash => _blink.BlinkLocation.hash_Getter(this);
+  String get hash => _blink.BlinkLocation.instance.hash_Getter_(this);
 
   @DomName('Location.hash')
   @DocsEditable()
-  void set hash(String value) => _blink.BlinkLocation.hash_Setter(this, value);
+  void set hash(String value) => _blink.BlinkLocation.instance.hash_Setter_(this, value);
 
   @DomName('Location.host')
   @DocsEditable()
-  String get host => _blink.BlinkLocation.host_Getter(this);
+  String get host => _blink.BlinkLocation.instance.host_Getter_(this);
 
   @DomName('Location.host')
   @DocsEditable()
-  void set host(String value) => _blink.BlinkLocation.host_Setter(this, value);
+  void set host(String value) => _blink.BlinkLocation.instance.host_Setter_(this, value);
 
   @DomName('Location.hostname')
   @DocsEditable()
-  String get hostname => _blink.BlinkLocation.hostname_Getter(this);
+  String get hostname => _blink.BlinkLocation.instance.hostname_Getter_(this);
 
   @DomName('Location.hostname')
   @DocsEditable()
-  void set hostname(String value) => _blink.BlinkLocation.hostname_Setter(this, value);
+  void set hostname(String value) => _blink.BlinkLocation.instance.hostname_Setter_(this, value);
 
   @DomName('Location.href')
   @DocsEditable()
-  String get href => _blink.BlinkLocation.href_Getter(this);
+  String get href => _blink.BlinkLocation.instance.href_Getter_(this);
 
   @DomName('Location.href')
   @DocsEditable()
-  void set href(String value) => _blink.BlinkLocation.href_Setter(this, value);
+  void set href(String value) => _blink.BlinkLocation.instance.href_Setter_(this, value);
 
   @DomName('Location.origin')
   @DocsEditable()
   // http://url.spec.whatwg.org/#urlutils Webkit Only
   @Experimental() // non-standard
-  String get origin => _blink.BlinkLocation.origin_Getter(this);
+  String get origin => _blink.BlinkLocation.instance.origin_Getter_(this);
 
   @DomName('Location.pathname')
   @DocsEditable()
-  String get pathname => _blink.BlinkLocation.pathname_Getter(this);
+  String get pathname => _blink.BlinkLocation.instance.pathname_Getter_(this);
 
   @DomName('Location.pathname')
   @DocsEditable()
-  void set pathname(String value) => _blink.BlinkLocation.pathname_Setter(this, value);
+  void set pathname(String value) => _blink.BlinkLocation.instance.pathname_Setter_(this, value);
 
   @DomName('Location.port')
   @DocsEditable()
-  String get port => _blink.BlinkLocation.port_Getter(this);
+  String get port => _blink.BlinkLocation.instance.port_Getter_(this);
 
   @DomName('Location.port')
   @DocsEditable()
-  void set port(String value) => _blink.BlinkLocation.port_Setter(this, value);
+  void set port(String value) => _blink.BlinkLocation.instance.port_Setter_(this, value);
 
   @DomName('Location.protocol')
   @DocsEditable()
-  String get protocol => _blink.BlinkLocation.protocol_Getter(this);
+  String get protocol => _blink.BlinkLocation.instance.protocol_Getter_(this);
 
   @DomName('Location.protocol')
   @DocsEditable()
-  void set protocol(String value) => _blink.BlinkLocation.protocol_Setter(this, value);
+  void set protocol(String value) => _blink.BlinkLocation.instance.protocol_Setter_(this, value);
 
   @DomName('Location.search')
   @DocsEditable()
-  String get search => _blink.BlinkLocation.search_Getter(this);
+  String get search => _blink.BlinkLocation.instance.search_Getter_(this);
 
   @DomName('Location.search')
   @DocsEditable()
-  void set search(String value) => _blink.BlinkLocation.search_Setter(this, value);
+  void set search(String value) => _blink.BlinkLocation.instance.search_Setter_(this, value);
 
   @DomName('Location.assign')
   @DocsEditable()
-  void assign([String url]) => _blink.BlinkLocation.assign_Callback_1(this, url);
+  void assign([String url]) => _blink.BlinkLocation.instance.assign_Callback_1_(this, url);
 
   @DomName('Location.reload')
   @DocsEditable()
-  void reload() => _blink.BlinkLocation.reload_Callback(this);
+  void reload() => _blink.BlinkLocation.instance.reload_Callback_0_(this);
 
   @DomName('Location.replace')
   @DocsEditable()
-  void replace(String url) => _blink.BlinkLocation.replace_Callback_1(this, url);
+  void replace(String url) => _blink.BlinkLocation.instance.replace_Callback_1_(this, url);
 
   @DomName('Location.toString')
   @DocsEditable()
-  String toString() => _blink.BlinkLocation.toString_Callback(this);
+  String toString() => _blink.BlinkLocation.instance.toString_Callback_0_(this);
 
 
 }
@@ -20881,15 +20881,15 @@
 
   @DomName('HTMLMapElement.areas')
   @DocsEditable()
-  List<Node> get areas => _blink.BlinkHTMLMapElement.areas_Getter(this);
+  List<Node> get areas => _blink.BlinkHTMLMapElement.instance.areas_Getter_(this);
 
   @DomName('HTMLMapElement.name')
   @DocsEditable()
-  String get name => _blink.BlinkHTMLMapElement.name_Getter(this);
+  String get name => _blink.BlinkHTMLMapElement.instance.name_Getter_(this);
 
   @DomName('HTMLMapElement.name')
   @DocsEditable()
-  void set name(String value) => _blink.BlinkHTMLMapElement.name_Setter(this, value);
+  void set name(String value) => _blink.BlinkHTMLMapElement.instance.name_Setter_(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20910,84 +20910,84 @@
   @DomName('MediaController.MediaController')
   @DocsEditable()
   factory MediaController() {
-    return _blink.BlinkMediaController.constructorCallback();
+    return _blink.BlinkMediaController.instance.constructorCallback_0_();
   }
 
   @DomName('MediaController.buffered')
   @DocsEditable()
-  TimeRanges get buffered => _blink.BlinkMediaController.buffered_Getter(this);
+  TimeRanges get buffered => _blink.BlinkMediaController.instance.buffered_Getter_(this);
 
   @DomName('MediaController.currentTime')
   @DocsEditable()
-  num get currentTime => _blink.BlinkMediaController.currentTime_Getter(this);
+  num get currentTime => _blink.BlinkMediaController.instance.currentTime_Getter_(this);
 
   @DomName('MediaController.currentTime')
   @DocsEditable()
-  void set currentTime(num value) => _blink.BlinkMediaController.currentTime_Setter(this, value);
+  void set currentTime(num value) => _blink.BlinkMediaController.instance.currentTime_Setter_(this, value);
 
   @DomName('MediaController.defaultPlaybackRate')
   @DocsEditable()
-  num get defaultPlaybackRate => _blink.BlinkMediaController.defaultPlaybackRate_Getter(this);
+  num get defaultPlaybackRate => _blink.BlinkMediaController.instance.defaultPlaybackRate_Getter_(this);
 
   @DomName('MediaController.defaultPlaybackRate')
   @DocsEditable()
-  void set defaultPlaybackRate(num value) => _blink.BlinkMediaController.defaultPlaybackRate_Setter(this, value);
+  void set defaultPlaybackRate(num value) => _blink.BlinkMediaController.instance.defaultPlaybackRate_Setter_(this, value);
 
   @DomName('MediaController.duration')
   @DocsEditable()
-  double get duration => _blink.BlinkMediaController.duration_Getter(this);
+  double get duration => _blink.BlinkMediaController.instance.duration_Getter_(this);
 
   @DomName('MediaController.muted')
   @DocsEditable()
-  bool get muted => _blink.BlinkMediaController.muted_Getter(this);
+  bool get muted => _blink.BlinkMediaController.instance.muted_Getter_(this);
 
   @DomName('MediaController.muted')
   @DocsEditable()
-  void set muted(bool value) => _blink.BlinkMediaController.muted_Setter(this, value);
+  void set muted(bool value) => _blink.BlinkMediaController.instance.muted_Setter_(this, value);
 
   @DomName('MediaController.paused')
   @DocsEditable()
-  bool get paused => _blink.BlinkMediaController.paused_Getter(this);
+  bool get paused => _blink.BlinkMediaController.instance.paused_Getter_(this);
 
   @DomName('MediaController.playbackRate')
   @DocsEditable()
-  num get playbackRate => _blink.BlinkMediaController.playbackRate_Getter(this);
+  num get playbackRate => _blink.BlinkMediaController.instance.playbackRate_Getter_(this);
 
   @DomName('MediaController.playbackRate')
   @DocsEditable()
-  void set playbackRate(num value) => _blink.BlinkMediaController.playbackRate_Setter(this, value);
+  void set playbackRate(num value) => _blink.BlinkMediaController.instance.playbackRate_Setter_(this, value);
 
   @DomName('MediaController.playbackState')
   @DocsEditable()
-  String get playbackState => _blink.BlinkMediaController.playbackState_Getter(this);
+  String get playbackState => _blink.BlinkMediaController.instance.playbackState_Getter_(this);
 
   @DomName('MediaController.played')
   @DocsEditable()
-  TimeRanges get played => _blink.BlinkMediaController.played_Getter(this);
+  TimeRanges get played => _blink.BlinkMediaController.instance.played_Getter_(this);
 
   @DomName('MediaController.seekable')
   @DocsEditable()
-  TimeRanges get seekable => _blink.BlinkMediaController.seekable_Getter(this);
+  TimeRanges get seekable => _blink.BlinkMediaController.instance.seekable_Getter_(this);
 
   @DomName('MediaController.volume')
   @DocsEditable()
-  num get volume => _blink.BlinkMediaController.volume_Getter(this);
+  num get volume => _blink.BlinkMediaController.instance.volume_Getter_(this);
 
   @DomName('MediaController.volume')
   @DocsEditable()
-  void set volume(num value) => _blink.BlinkMediaController.volume_Setter(this, value);
+  void set volume(num value) => _blink.BlinkMediaController.instance.volume_Setter_(this, value);
 
   @DomName('MediaController.pause')
   @DocsEditable()
-  void pause() => _blink.BlinkMediaController.pause_Callback(this);
+  void pause() => _blink.BlinkMediaController.instance.pause_Callback_0_(this);
 
   @DomName('MediaController.play')
   @DocsEditable()
-  void play() => _blink.BlinkMediaController.play_Callback(this);
+  void play() => _blink.BlinkMediaController.instance.play_Callback_0_(this);
 
   @DomName('MediaController.unpause')
   @DocsEditable()
-  void unpause() => _blink.BlinkMediaController.unpause_Callback(this);
+  void unpause() => _blink.BlinkMediaController.instance.unpause_Callback_0_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -21007,22 +21007,22 @@
   @DomName('MediaDeviceInfo.deviceId')
   @DocsEditable()
   @Experimental() // untriaged
-  String get deviceId => _blink.BlinkMediaDeviceInfo.deviceId_Getter(this);
+  String get deviceId => _blink.BlinkMediaDeviceInfo.instance.deviceId_Getter_(this);
 
   @DomName('MediaDeviceInfo.groupId')
   @DocsEditable()
   @Experimental() // untriaged
-  String get groupId => _blink.BlinkMediaDeviceInfo.groupId_Getter(this);
+  String get groupId => _blink.BlinkMediaDeviceInfo.instance.groupId_Getter_(this);
 
   @DomName('MediaDeviceInfo.kind')
   @DocsEditable()
   @Experimental() // untriaged
-  String get kind => _blink.BlinkMediaDeviceInfo.kind_Getter(this);
+  String get kind => _blink.BlinkMediaDeviceInfo.instance.kind_Getter_(this);
 
   @DomName('MediaDeviceInfo.label')
   @DocsEditable()
   @Experimental() // untriaged
-  String get label => _blink.BlinkMediaDeviceInfo.label_Getter(this);
+  String get label => _blink.BlinkMediaDeviceInfo.instance.label_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -21150,192 +21150,192 @@
   @DomName('HTMLMediaElement.audioTracks')
   @DocsEditable()
   @Experimental() // untriaged
-  AudioTrackList get audioTracks => _blink.BlinkHTMLMediaElement.audioTracks_Getter(this);
+  AudioTrackList get audioTracks => _blink.BlinkHTMLMediaElement.instance.audioTracks_Getter_(this);
 
   @DomName('HTMLMediaElement.autoplay')
   @DocsEditable()
-  bool get autoplay => _blink.BlinkHTMLMediaElement.autoplay_Getter(this);
+  bool get autoplay => _blink.BlinkHTMLMediaElement.instance.autoplay_Getter_(this);
 
   @DomName('HTMLMediaElement.autoplay')
   @DocsEditable()
-  void set autoplay(bool value) => _blink.BlinkHTMLMediaElement.autoplay_Setter(this, value);
+  void set autoplay(bool value) => _blink.BlinkHTMLMediaElement.instance.autoplay_Setter_(this, value);
 
   @DomName('HTMLMediaElement.buffered')
   @DocsEditable()
-  TimeRanges get buffered => _blink.BlinkHTMLMediaElement.buffered_Getter(this);
+  TimeRanges get buffered => _blink.BlinkHTMLMediaElement.instance.buffered_Getter_(this);
 
   @DomName('HTMLMediaElement.controller')
   @DocsEditable()
-  MediaController get controller => _blink.BlinkHTMLMediaElement.controller_Getter(this);
+  MediaController get controller => _blink.BlinkHTMLMediaElement.instance.controller_Getter_(this);
 
   @DomName('HTMLMediaElement.controller')
   @DocsEditable()
-  void set controller(MediaController value) => _blink.BlinkHTMLMediaElement.controller_Setter(this, value);
+  void set controller(MediaController value) => _blink.BlinkHTMLMediaElement.instance.controller_Setter_(this, value);
 
   @DomName('HTMLMediaElement.controls')
   @DocsEditable()
-  bool get controls => _blink.BlinkHTMLMediaElement.controls_Getter(this);
+  bool get controls => _blink.BlinkHTMLMediaElement.instance.controls_Getter_(this);
 
   @DomName('HTMLMediaElement.controls')
   @DocsEditable()
-  void set controls(bool value) => _blink.BlinkHTMLMediaElement.controls_Setter(this, value);
+  void set controls(bool value) => _blink.BlinkHTMLMediaElement.instance.controls_Setter_(this, value);
 
   @DomName('HTMLMediaElement.crossOrigin')
   @DocsEditable()
   @Experimental() // untriaged
-  String get crossOrigin => _blink.BlinkHTMLMediaElement.crossOrigin_Getter(this);
+  String get crossOrigin => _blink.BlinkHTMLMediaElement.instance.crossOrigin_Getter_(this);
 
   @DomName('HTMLMediaElement.crossOrigin')
   @DocsEditable()
   @Experimental() // untriaged
-  void set crossOrigin(String value) => _blink.BlinkHTMLMediaElement.crossOrigin_Setter(this, value);
+  void set crossOrigin(String value) => _blink.BlinkHTMLMediaElement.instance.crossOrigin_Setter_(this, value);
 
   @DomName('HTMLMediaElement.currentSrc')
   @DocsEditable()
-  String get currentSrc => _blink.BlinkHTMLMediaElement.currentSrc_Getter(this);
+  String get currentSrc => _blink.BlinkHTMLMediaElement.instance.currentSrc_Getter_(this);
 
   @DomName('HTMLMediaElement.currentTime')
   @DocsEditable()
-  num get currentTime => _blink.BlinkHTMLMediaElement.currentTime_Getter(this);
+  num get currentTime => _blink.BlinkHTMLMediaElement.instance.currentTime_Getter_(this);
 
   @DomName('HTMLMediaElement.currentTime')
   @DocsEditable()
-  void set currentTime(num value) => _blink.BlinkHTMLMediaElement.currentTime_Setter(this, value);
+  void set currentTime(num value) => _blink.BlinkHTMLMediaElement.instance.currentTime_Setter_(this, value);
 
   @DomName('HTMLMediaElement.defaultMuted')
   @DocsEditable()
-  bool get defaultMuted => _blink.BlinkHTMLMediaElement.defaultMuted_Getter(this);
+  bool get defaultMuted => _blink.BlinkHTMLMediaElement.instance.defaultMuted_Getter_(this);
 
   @DomName('HTMLMediaElement.defaultMuted')
   @DocsEditable()
-  void set defaultMuted(bool value) => _blink.BlinkHTMLMediaElement.defaultMuted_Setter(this, value);
+  void set defaultMuted(bool value) => _blink.BlinkHTMLMediaElement.instance.defaultMuted_Setter_(this, value);
 
   @DomName('HTMLMediaElement.defaultPlaybackRate')
   @DocsEditable()
-  num get defaultPlaybackRate => _blink.BlinkHTMLMediaElement.defaultPlaybackRate_Getter(this);
+  num get defaultPlaybackRate => _blink.BlinkHTMLMediaElement.instance.defaultPlaybackRate_Getter_(this);
 
   @DomName('HTMLMediaElement.defaultPlaybackRate')
   @DocsEditable()
-  void set defaultPlaybackRate(num value) => _blink.BlinkHTMLMediaElement.defaultPlaybackRate_Setter(this, value);
+  void set defaultPlaybackRate(num value) => _blink.BlinkHTMLMediaElement.instance.defaultPlaybackRate_Setter_(this, value);
 
   @DomName('HTMLMediaElement.duration')
   @DocsEditable()
-  double get duration => _blink.BlinkHTMLMediaElement.duration_Getter(this);
+  double get duration => _blink.BlinkHTMLMediaElement.instance.duration_Getter_(this);
 
   @DomName('HTMLMediaElement.ended')
   @DocsEditable()
-  bool get ended => _blink.BlinkHTMLMediaElement.ended_Getter(this);
+  bool get ended => _blink.BlinkHTMLMediaElement.instance.ended_Getter_(this);
 
   @DomName('HTMLMediaElement.error')
   @DocsEditable()
-  MediaError get error => _blink.BlinkHTMLMediaElement.error_Getter(this);
+  MediaError get error => _blink.BlinkHTMLMediaElement.instance.error_Getter_(this);
 
   @DomName('HTMLMediaElement.integrity')
   @DocsEditable()
   @Experimental() // untriaged
-  String get integrity => _blink.BlinkHTMLMediaElement.integrity_Getter(this);
+  String get integrity => _blink.BlinkHTMLMediaElement.instance.integrity_Getter_(this);
 
   @DomName('HTMLMediaElement.integrity')
   @DocsEditable()
   @Experimental() // untriaged
-  void set integrity(String value) => _blink.BlinkHTMLMediaElement.integrity_Setter(this, value);
+  void set integrity(String value) => _blink.BlinkHTMLMediaElement.instance.integrity_Setter_(this, value);
 
   @DomName('HTMLMediaElement.loop')
   @DocsEditable()
-  bool get loop => _blink.BlinkHTMLMediaElement.loop_Getter(this);
+  bool get loop => _blink.BlinkHTMLMediaElement.instance.loop_Getter_(this);
 
   @DomName('HTMLMediaElement.loop')
   @DocsEditable()
-  void set loop(bool value) => _blink.BlinkHTMLMediaElement.loop_Setter(this, value);
+  void set loop(bool value) => _blink.BlinkHTMLMediaElement.instance.loop_Setter_(this, value);
 
   @DomName('HTMLMediaElement.mediaGroup')
   @DocsEditable()
-  String get mediaGroup => _blink.BlinkHTMLMediaElement.mediaGroup_Getter(this);
+  String get mediaGroup => _blink.BlinkHTMLMediaElement.instance.mediaGroup_Getter_(this);
 
   @DomName('HTMLMediaElement.mediaGroup')
   @DocsEditable()
-  void set mediaGroup(String value) => _blink.BlinkHTMLMediaElement.mediaGroup_Setter(this, value);
+  void set mediaGroup(String value) => _blink.BlinkHTMLMediaElement.instance.mediaGroup_Setter_(this, value);
 
   @DomName('HTMLMediaElement.mediaKeys')
   @DocsEditable()
   // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html
   @Experimental()
-  MediaKeys get mediaKeys => _blink.BlinkHTMLMediaElement.mediaKeys_Getter(this);
+  MediaKeys get mediaKeys => _blink.BlinkHTMLMediaElement.instance.mediaKeys_Getter_(this);
 
   @DomName('HTMLMediaElement.muted')
   @DocsEditable()
-  bool get muted => _blink.BlinkHTMLMediaElement.muted_Getter(this);
+  bool get muted => _blink.BlinkHTMLMediaElement.instance.muted_Getter_(this);
 
   @DomName('HTMLMediaElement.muted')
   @DocsEditable()
-  void set muted(bool value) => _blink.BlinkHTMLMediaElement.muted_Setter(this, value);
+  void set muted(bool value) => _blink.BlinkHTMLMediaElement.instance.muted_Setter_(this, value);
 
   @DomName('HTMLMediaElement.networkState')
   @DocsEditable()
-  int get networkState => _blink.BlinkHTMLMediaElement.networkState_Getter(this);
+  int get networkState => _blink.BlinkHTMLMediaElement.instance.networkState_Getter_(this);
 
   @DomName('HTMLMediaElement.paused')
   @DocsEditable()
-  bool get paused => _blink.BlinkHTMLMediaElement.paused_Getter(this);
+  bool get paused => _blink.BlinkHTMLMediaElement.instance.paused_Getter_(this);
 
   @DomName('HTMLMediaElement.playbackRate')
   @DocsEditable()
-  num get playbackRate => _blink.BlinkHTMLMediaElement.playbackRate_Getter(this);
+  num get playbackRate => _blink.BlinkHTMLMediaElement.instance.playbackRate_Getter_(this);
 
   @DomName('HTMLMediaElement.playbackRate')
   @DocsEditable()
-  void set playbackRate(num value) => _blink.BlinkHTMLMediaElement.playbackRate_Setter(this, value);
+  void set playbackRate(num value) => _blink.BlinkHTMLMediaElement.instance.playbackRate_Setter_(this, value);
 
   @DomName('HTMLMediaElement.played')
   @DocsEditable()
-  TimeRanges get played => _blink.BlinkHTMLMediaElement.played_Getter(this);
+  TimeRanges get played => _blink.BlinkHTMLMediaElement.instance.played_Getter_(this);
 
   @DomName('HTMLMediaElement.preload')
   @DocsEditable()
-  String get preload => _blink.BlinkHTMLMediaElement.preload_Getter(this);
+  String get preload => _blink.BlinkHTMLMediaElement.instance.preload_Getter_(this);
 
   @DomName('HTMLMediaElement.preload')
   @DocsEditable()
-  void set preload(String value) => _blink.BlinkHTMLMediaElement.preload_Setter(this, value);
+  void set preload(String value) => _blink.BlinkHTMLMediaElement.instance.preload_Setter_(this, value);
 
   @DomName('HTMLMediaElement.readyState')
   @DocsEditable()
-  int get readyState => _blink.BlinkHTMLMediaElement.readyState_Getter(this);
+  int get readyState => _blink.BlinkHTMLMediaElement.instance.readyState_Getter_(this);
 
   @DomName('HTMLMediaElement.seekable')
   @DocsEditable()
-  TimeRanges get seekable => _blink.BlinkHTMLMediaElement.seekable_Getter(this);
+  TimeRanges get seekable => _blink.BlinkHTMLMediaElement.instance.seekable_Getter_(this);
 
   @DomName('HTMLMediaElement.seeking')
   @DocsEditable()
-  bool get seeking => _blink.BlinkHTMLMediaElement.seeking_Getter(this);
+  bool get seeking => _blink.BlinkHTMLMediaElement.instance.seeking_Getter_(this);
 
   @DomName('HTMLMediaElement.src')
   @DocsEditable()
-  String get src => _blink.BlinkHTMLMediaElement.src_Getter(this);
+  String get src => _blink.BlinkHTMLMediaElement.instance.src_Getter_(this);
 
   @DomName('HTMLMediaElement.src')
   @DocsEditable()
-  void set src(String value) => _blink.BlinkHTMLMediaElement.src_Setter(this, value);
+  void set src(String value) => _blink.BlinkHTMLMediaElement.instance.src_Setter_(this, value);
 
   @DomName('HTMLMediaElement.textTracks')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#dom-media-texttracks
   @Experimental()
-  TextTrackList get textTracks => _blink.BlinkHTMLMediaElement.textTracks_Getter(this);
+  TextTrackList get textTracks => _blink.BlinkHTMLMediaElement.instance.textTracks_Getter_(this);
 
   @DomName('HTMLMediaElement.videoTracks')
   @DocsEditable()
   @Experimental() // untriaged
-  VideoTrackList get videoTracks => _blink.BlinkHTMLMediaElement.videoTracks_Getter(this);
+  VideoTrackList get videoTracks => _blink.BlinkHTMLMediaElement.instance.videoTracks_Getter_(this);
 
   @DomName('HTMLMediaElement.volume')
   @DocsEditable()
-  num get volume => _blink.BlinkHTMLMediaElement.volume_Getter(this);
+  num get volume => _blink.BlinkHTMLMediaElement.instance.volume_Getter_(this);
 
   @DomName('HTMLMediaElement.volume')
   @DocsEditable()
-  void set volume(num value) => _blink.BlinkHTMLMediaElement.volume_Setter(this, value);
+  void set volume(num value) => _blink.BlinkHTMLMediaElement.instance.volume_Setter_(this, value);
 
   @DomName('HTMLMediaElement.webkitAudioDecodedByteCount')
   @DocsEditable()
@@ -21343,7 +21343,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   @Experimental() // nonstandard
-  int get audioDecodedByteCount => _blink.BlinkHTMLMediaElement.webkitAudioDecodedByteCount_Getter(this);
+  int get audioDecodedByteCount => _blink.BlinkHTMLMediaElement.instance.webkitAudioDecodedByteCount_Getter_(this);
 
   @DomName('HTMLMediaElement.webkitVideoDecodedByteCount')
   @DocsEditable()
@@ -21351,48 +21351,48 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   @Experimental() // nonstandard
-  int get videoDecodedByteCount => _blink.BlinkHTMLMediaElement.webkitVideoDecodedByteCount_Getter(this);
+  int get videoDecodedByteCount => _blink.BlinkHTMLMediaElement.instance.webkitVideoDecodedByteCount_Getter_(this);
 
   TextTrack addTextTrack(String kind, [String label, String language]) {
     if (language != null) {
-      return _blink.BlinkHTMLMediaElement.addTextTrack_Callback_3(this, kind, label, language);
+      return _blink.BlinkHTMLMediaElement.instance.addTextTrack_Callback_3_(this, kind, label, language);
     }
     if (label != null) {
-      return _blink.BlinkHTMLMediaElement.addTextTrack_Callback_2(this, kind, label);
+      return _blink.BlinkHTMLMediaElement.instance.addTextTrack_Callback_2_(this, kind, label);
     }
-    return _blink.BlinkHTMLMediaElement.addTextTrack_Callback_1(this, kind);
+    return _blink.BlinkHTMLMediaElement.instance.addTextTrack_Callback_1_(this, kind);
   }
 
   String canPlayType(String type, [String keySystem]) {
     if (keySystem != null) {
-      return _blink.BlinkHTMLMediaElement.canPlayType_Callback_2(this, type, keySystem);
+      return _blink.BlinkHTMLMediaElement.instance.canPlayType_Callback_2_(this, type, keySystem);
     }
-    return _blink.BlinkHTMLMediaElement.canPlayType_Callback_1(this, type);
+    return _blink.BlinkHTMLMediaElement.instance.canPlayType_Callback_1_(this, type);
   }
 
   @DomName('HTMLMediaElement.load')
   @DocsEditable()
-  void load() => _blink.BlinkHTMLMediaElement.load_Callback(this);
+  void load() => _blink.BlinkHTMLMediaElement.instance.load_Callback_0_(this);
 
   @DomName('HTMLMediaElement.pause')
   @DocsEditable()
-  void pause() => _blink.BlinkHTMLMediaElement.pause_Callback(this);
+  void pause() => _blink.BlinkHTMLMediaElement.instance.pause_Callback_0_(this);
 
   @DomName('HTMLMediaElement.play')
   @DocsEditable()
-  void play() => _blink.BlinkHTMLMediaElement.play_Callback(this);
+  void play() => _blink.BlinkHTMLMediaElement.instance.play_Callback_0_(this);
 
   @DomName('HTMLMediaElement.setMediaKeys')
   @DocsEditable()
   @Experimental() // untriaged
-  void setMediaKeys(MediaKeys mediaKeys) => _blink.BlinkHTMLMediaElement.setMediaKeys_Callback_1(this, mediaKeys);
+  void setMediaKeys(MediaKeys mediaKeys) => _blink.BlinkHTMLMediaElement.instance.setMediaKeys_Callback_1_(this, mediaKeys);
 
   void addKey(String keySystem, Uint8List key, [Uint8List initData, String sessionId]) {
     if (initData != null) {
-      _blink.BlinkHTMLMediaElement.webkitAddKey_Callback_4(this, keySystem, key, initData, sessionId);
+      _blink.BlinkHTMLMediaElement.instance.webkitAddKey_Callback_4_(this, keySystem, key, initData, sessionId);
       return;
     }
-    _blink.BlinkHTMLMediaElement.webkitAddKey_Callback_2(this, keySystem, key);
+    _blink.BlinkHTMLMediaElement.instance.webkitAddKey_Callback_2_(this, keySystem, key);
     return;
   }
 
@@ -21402,14 +21402,14 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#extensions
-  void cancelKeyRequest(String keySystem, String sessionId) => _blink.BlinkHTMLMediaElement.webkitCancelKeyRequest_Callback_2(this, keySystem, sessionId);
+  void cancelKeyRequest(String keySystem, String sessionId) => _blink.BlinkHTMLMediaElement.instance.webkitCancelKeyRequest_Callback_2_(this, keySystem, sessionId);
 
   void generateKeyRequest(String keySystem, [Uint8List initData]) {
     if (initData != null) {
-      _blink.BlinkHTMLMediaElement.webkitGenerateKeyRequest_Callback_2(this, keySystem, initData);
+      _blink.BlinkHTMLMediaElement.instance.webkitGenerateKeyRequest_Callback_2_(this, keySystem, initData);
       return;
     }
-    _blink.BlinkHTMLMediaElement.webkitGenerateKeyRequest_Callback_1(this, keySystem);
+    _blink.BlinkHTMLMediaElement.instance.webkitGenerateKeyRequest_Callback_1_(this, keySystem);
     return;
   }
 
@@ -21480,7 +21480,7 @@
 
   @DomName('MediaError.code')
   @DocsEditable()
-  int get code => _blink.BlinkMediaError.code_Getter(this);
+  int get code => _blink.BlinkMediaError.instance.code_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -21524,12 +21524,12 @@
 
   @DomName('MediaKeyError.code')
   @DocsEditable()
-  int get code => _blink.BlinkMediaKeyError.code_Getter(this);
+  int get code => _blink.BlinkMediaKeyError.instance.code_Getter_(this);
 
   @DomName('MediaKeyError.systemCode')
   @DocsEditable()
   @Experimental() // non-standard
-  int get systemCode => _blink.BlinkMediaKeyError.systemCode_Getter(this);
+  int get systemCode => _blink.BlinkMediaKeyError.instance.systemCode_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -21549,31 +21549,31 @@
 
   @DomName('MediaKeyEvent.defaultURL')
   @DocsEditable()
-  String get defaultUrl => _blink.BlinkMediaKeyEvent.defaultURL_Getter(this);
+  String get defaultUrl => _blink.BlinkMediaKeyEvent.instance.defaultURL_Getter_(this);
 
   @DomName('MediaKeyEvent.errorCode')
   @DocsEditable()
-  MediaKeyError get errorCode => _blink.BlinkMediaKeyEvent.errorCode_Getter(this);
+  MediaKeyError get errorCode => _blink.BlinkMediaKeyEvent.instance.errorCode_Getter_(this);
 
   @DomName('MediaKeyEvent.initData')
   @DocsEditable()
-  Uint8List get initData => _blink.BlinkMediaKeyEvent.initData_Getter(this);
+  Uint8List get initData => _blink.BlinkMediaKeyEvent.instance.initData_Getter_(this);
 
   @DomName('MediaKeyEvent.keySystem')
   @DocsEditable()
-  String get keySystem => _blink.BlinkMediaKeyEvent.keySystem_Getter(this);
+  String get keySystem => _blink.BlinkMediaKeyEvent.instance.keySystem_Getter_(this);
 
   @DomName('MediaKeyEvent.message')
   @DocsEditable()
-  Uint8List get message => _blink.BlinkMediaKeyEvent.message_Getter(this);
+  Uint8List get message => _blink.BlinkMediaKeyEvent.instance.message_Getter_(this);
 
   @DomName('MediaKeyEvent.sessionId')
   @DocsEditable()
-  String get sessionId => _blink.BlinkMediaKeyEvent.sessionId_Getter(this);
+  String get sessionId => _blink.BlinkMediaKeyEvent.instance.sessionId_Getter_(this);
 
   @DomName('MediaKeyEvent.systemCode')
   @DocsEditable()
-  int get systemCode => _blink.BlinkMediaKeyEvent.systemCode_Getter(this);
+  int get systemCode => _blink.BlinkMediaKeyEvent.instance.systemCode_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -21593,11 +21593,11 @@
 
   @DomName('MediaKeyMessageEvent.destinationURL')
   @DocsEditable()
-  String get destinationUrl => _blink.BlinkMediaKeyMessageEvent.destinationURL_Getter(this);
+  String get destinationUrl => _blink.BlinkMediaKeyMessageEvent.instance.destinationURL_Getter_(this);
 
   @DomName('MediaKeyMessageEvent.message')
   @DocsEditable()
-  ByteBuffer get message => _blink.BlinkMediaKeyMessageEvent.message_Getter(this);
+  ByteBuffer get message => _blink.BlinkMediaKeyMessageEvent.instance.message_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -21618,11 +21618,11 @@
   @DomName('MediaKeyNeededEvent.contentType')
   @DocsEditable()
   @Experimental() // untriaged
-  String get contentType => _blink.BlinkMediaKeyNeededEvent.contentType_Getter(this);
+  String get contentType => _blink.BlinkMediaKeyNeededEvent.instance.contentType_Getter_(this);
 
   @DomName('MediaKeyNeededEvent.initData')
   @DocsEditable()
-  Uint8List get initData => _blink.BlinkMediaKeyNeededEvent.initData_Getter(this);
+  Uint8List get initData => _blink.BlinkMediaKeyNeededEvent.instance.initData_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -21643,31 +21643,31 @@
   @DomName('MediaKeySession.closed')
   @DocsEditable()
   @Experimental() // untriaged
-  Future get closed => _blink.BlinkMediaKeySession.closed_Getter(this);
+  Future get closed => _blink.BlinkMediaKeySession.instance.closed_Getter_(this);
 
   @DomName('MediaKeySession.error')
   @DocsEditable()
-  MediaKeyError get error => _blink.BlinkMediaKeySession.error_Getter(this);
+  MediaKeyError get error => _blink.BlinkMediaKeySession.instance.error_Getter_(this);
 
   @DomName('MediaKeySession.keySystem')
   @DocsEditable()
-  String get keySystem => _blink.BlinkMediaKeySession.keySystem_Getter(this);
+  String get keySystem => _blink.BlinkMediaKeySession.instance.keySystem_Getter_(this);
 
   @DomName('MediaKeySession.sessionId')
   @DocsEditable()
-  String get sessionId => _blink.BlinkMediaKeySession.sessionId_Getter(this);
+  String get sessionId => _blink.BlinkMediaKeySession.instance.sessionId_Getter_(this);
 
   @DomName('MediaKeySession.release')
   @DocsEditable()
   @Experimental() // untriaged
-  Future release() => _blink.BlinkMediaKeySession.release_Callback(this);
+  Future release() => _blink.BlinkMediaKeySession.instance.release_Callback_0_(this);
 
   Future _update(response) {
     if ((response is TypedData)) {
-      return _blink.BlinkMediaKeySession.update_Callback_1(this, response);
+      return _blink.BlinkMediaKeySession.instance.update_Callback_1_(this, response);
     }
     if ((response is ByteBuffer)) {
-      return _blink.BlinkMediaKeySession.update_Callback_1(this, response);
+      return _blink.BlinkMediaKeySession.instance.update_Callback_1_(this, response);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
@@ -21690,25 +21690,25 @@
 
   @DomName('MediaKeys.keySystem')
   @DocsEditable()
-  String get keySystem => _blink.BlinkMediaKeys.keySystem_Getter(this);
+  String get keySystem => _blink.BlinkMediaKeys.instance.keySystem_Getter_(this);
 
   @DomName('MediaKeys.create')
   @DocsEditable()
   @Experimental() // untriaged
-  static Future create(String keySystem) => _blink.BlinkMediaKeys.create_Callback_1(keySystem);
+  static Future create(String keySystem) => _blink.BlinkMediaKeys.instance.create_Callback_1_(keySystem);
 
   Future _createSession(String initDataType, initData, [String sessionType]) {
     if ((initData is TypedData) && (initDataType is String) && sessionType == null) {
-      return _blink.BlinkMediaKeys.createSession_Callback_2(this, initDataType, initData);
+      return _blink.BlinkMediaKeys.instance.createSession_Callback_2_(this, initDataType, initData);
     }
     if ((sessionType is String || sessionType == null) && (initData is TypedData) && (initDataType is String)) {
-      return _blink.BlinkMediaKeys.createSession_Callback_3(this, initDataType, initData, sessionType);
+      return _blink.BlinkMediaKeys.instance.createSession_Callback_3_(this, initDataType, initData, sessionType);
     }
     if ((initData is ByteBuffer) && (initDataType is String) && sessionType == null) {
-      return _blink.BlinkMediaKeys.createSession_Callback_2(this, initDataType, initData);
+      return _blink.BlinkMediaKeys.instance.createSession_Callback_2_(this, initDataType, initData);
     }
     if ((sessionType is String || sessionType == null) && (initData is ByteBuffer) && (initDataType is String)) {
-      return _blink.BlinkMediaKeys.createSession_Callback_3(this, initDataType, initData, sessionType);
+      return _blink.BlinkMediaKeys.instance.createSession_Callback_3_(this, initDataType, initData, sessionType);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
@@ -21716,7 +21716,7 @@
   @DomName('MediaKeys.isTypeSupported')
   @DocsEditable()
   @Experimental() // untriaged
-  static bool isTypeSupported(String keySystem, String contentType) => _blink.BlinkMediaKeys.isTypeSupported_Callback_2(keySystem, contentType);
+  static bool isTypeSupported(String keySystem, String contentType) => _blink.BlinkMediaKeys.instance.isTypeSupported_Callback_2_(keySystem, contentType);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -21735,27 +21735,27 @@
 
   @DomName('MediaList.length')
   @DocsEditable()
-  int get length => _blink.BlinkMediaList.length_Getter(this);
+  int get length => _blink.BlinkMediaList.instance.length_Getter_(this);
 
   @DomName('MediaList.mediaText')
   @DocsEditable()
-  String get mediaText => _blink.BlinkMediaList.mediaText_Getter(this);
+  String get mediaText => _blink.BlinkMediaList.instance.mediaText_Getter_(this);
 
   @DomName('MediaList.mediaText')
   @DocsEditable()
-  void set mediaText(String value) => _blink.BlinkMediaList.mediaText_Setter(this, value);
+  void set mediaText(String value) => _blink.BlinkMediaList.instance.mediaText_Setter_(this, value);
 
   @DomName('MediaList.appendMedium')
   @DocsEditable()
-  void appendMedium(String newMedium) => _blink.BlinkMediaList.appendMedium_Callback_1(this, newMedium);
+  void appendMedium(String newMedium) => _blink.BlinkMediaList.instance.appendMedium_Callback_1_(this, newMedium);
 
   @DomName('MediaList.deleteMedium')
   @DocsEditable()
-  void deleteMedium(String oldMedium) => _blink.BlinkMediaList.deleteMedium_Callback_1(this, oldMedium);
+  void deleteMedium(String oldMedium) => _blink.BlinkMediaList.instance.deleteMedium_Callback_1_(this, oldMedium);
 
   @DomName('MediaList.item')
   @DocsEditable()
-  String item(int index) => _blink.BlinkMediaList.item_Callback_1(this, index);
+  String item(int index) => _blink.BlinkMediaList.instance.item_Callback_1_(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -21774,11 +21774,11 @@
 
   @DomName('MediaQueryList.matches')
   @DocsEditable()
-  bool get matches => _blink.BlinkMediaQueryList.matches_Getter(this);
+  bool get matches => _blink.BlinkMediaQueryList.instance.matches_Getter_(this);
 
   @DomName('MediaQueryList.media')
   @DocsEditable()
-  String get media => _blink.BlinkMediaQueryList.media_Getter(this);
+  String get media => _blink.BlinkMediaQueryList.instance.media_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -21799,49 +21799,49 @@
   @DomName('MediaSource.MediaSource')
   @DocsEditable()
   factory MediaSource() {
-    return _blink.BlinkMediaSource.constructorCallback();
+    return _blink.BlinkMediaSource.instance.constructorCallback_0_();
   }
 
   @DomName('MediaSource.activeSourceBuffers')
   @DocsEditable()
-  SourceBufferList get activeSourceBuffers => _blink.BlinkMediaSource.activeSourceBuffers_Getter(this);
+  SourceBufferList get activeSourceBuffers => _blink.BlinkMediaSource.instance.activeSourceBuffers_Getter_(this);
 
   @DomName('MediaSource.duration')
   @DocsEditable()
-  num get duration => _blink.BlinkMediaSource.duration_Getter(this);
+  num get duration => _blink.BlinkMediaSource.instance.duration_Getter_(this);
 
   @DomName('MediaSource.duration')
   @DocsEditable()
-  void set duration(num value) => _blink.BlinkMediaSource.duration_Setter(this, value);
+  void set duration(num value) => _blink.BlinkMediaSource.instance.duration_Setter_(this, value);
 
   @DomName('MediaSource.readyState')
   @DocsEditable()
-  String get readyState => _blink.BlinkMediaSource.readyState_Getter(this);
+  String get readyState => _blink.BlinkMediaSource.instance.readyState_Getter_(this);
 
   @DomName('MediaSource.sourceBuffers')
   @DocsEditable()
-  SourceBufferList get sourceBuffers => _blink.BlinkMediaSource.sourceBuffers_Getter(this);
+  SourceBufferList get sourceBuffers => _blink.BlinkMediaSource.instance.sourceBuffers_Getter_(this);
 
   @DomName('MediaSource.addSourceBuffer')
   @DocsEditable()
-  SourceBuffer addSourceBuffer(String type) => _blink.BlinkMediaSource.addSourceBuffer_Callback_1(this, type);
+  SourceBuffer addSourceBuffer(String type) => _blink.BlinkMediaSource.instance.addSourceBuffer_Callback_1_(this, type);
 
   void endOfStream([String error]) {
     if (error != null) {
-      _blink.BlinkMediaSource.endOfStream_Callback_1(this, error);
+      _blink.BlinkMediaSource.instance.endOfStream_Callback_1_(this, error);
       return;
     }
-    _blink.BlinkMediaSource.endOfStream_Callback(this);
+    _blink.BlinkMediaSource.instance.endOfStream_Callback_0_(this);
     return;
   }
 
   @DomName('MediaSource.isTypeSupported')
   @DocsEditable()
-  static bool isTypeSupported(String type) => _blink.BlinkMediaSource.isTypeSupported_Callback_1(type);
+  static bool isTypeSupported(String type) => _blink.BlinkMediaSource.instance.isTypeSupported_Callback_1_(type);
 
   @DomName('MediaSource.removeSourceBuffer')
   @DocsEditable()
-  void removeSourceBuffer(SourceBuffer buffer) => _blink.BlinkMediaSource.removeSourceBuffer_Callback_1(this, buffer);
+  void removeSourceBuffer(SourceBuffer buffer) => _blink.BlinkMediaSource.instance.removeSourceBuffer_Callback_1_(this, buffer);
 
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -21891,63 +21891,63 @@
   @DocsEditable()
   factory MediaStream([stream_OR_tracks]) {
     if (stream_OR_tracks == null) {
-      return _blink.BlinkMediaStream.constructorCallback();
+      return _blink.BlinkMediaStream.instance.constructorCallback_0_();
     }
     if ((stream_OR_tracks is MediaStream || stream_OR_tracks == null)) {
-      return _blink.BlinkMediaStream.constructorCallback_1(stream_OR_tracks);
+      return _blink.BlinkMediaStream.instance.constructorCallback_1_(stream_OR_tracks);
     }
     if ((stream_OR_tracks is List<MediaStreamTrack> || stream_OR_tracks == null)) {
-      return _blink.BlinkMediaStream.constructorCallback_1(stream_OR_tracks);
+      return _blink.BlinkMediaStream.instance.constructorCallback_1_(stream_OR_tracks);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
   @DomName('MediaStream.ended')
   @DocsEditable()
-  bool get ended => _blink.BlinkMediaStream.ended_Getter(this);
+  bool get ended => _blink.BlinkMediaStream.instance.ended_Getter_(this);
 
   @DomName('MediaStream.id')
   @DocsEditable()
-  String get id => _blink.BlinkMediaStream.id_Getter(this);
+  String get id => _blink.BlinkMediaStream.instance.id_Getter_(this);
 
   @DomName('MediaStream.label')
   @DocsEditable()
   @Experimental() // non-standard
-  String get label => _blink.BlinkMediaStream.label_Getter(this);
+  String get label => _blink.BlinkMediaStream.instance.label_Getter_(this);
 
   @DomName('MediaStream.addTrack')
   @DocsEditable()
-  void addTrack(MediaStreamTrack track) => _blink.BlinkMediaStream.addTrack_Callback_1(this, track);
+  void addTrack(MediaStreamTrack track) => _blink.BlinkMediaStream.instance.addTrack_Callback_1_(this, track);
 
   @DomName('MediaStream.clone')
   @DocsEditable()
   @Experimental() // untriaged
-  MediaStream clone() => _blink.BlinkMediaStream.clone_Callback(this);
+  MediaStream clone() => _blink.BlinkMediaStream.instance.clone_Callback_0_(this);
 
   @DomName('MediaStream.getAudioTracks')
   @DocsEditable()
-  List<MediaStreamTrack> getAudioTracks() => _blink.BlinkMediaStream.getAudioTracks_Callback(this);
+  List<MediaStreamTrack> getAudioTracks() => _blink.BlinkMediaStream.instance.getAudioTracks_Callback_0_(this);
 
   @DomName('MediaStream.getTrackById')
   @DocsEditable()
-  MediaStreamTrack getTrackById(String trackId) => _blink.BlinkMediaStream.getTrackById_Callback_1(this, trackId);
+  MediaStreamTrack getTrackById(String trackId) => _blink.BlinkMediaStream.instance.getTrackById_Callback_1_(this, trackId);
 
   @DomName('MediaStream.getTracks')
   @DocsEditable()
   @Experimental() // untriaged
-  List<MediaStreamTrack> getTracks() => _blink.BlinkMediaStream.getTracks_Callback(this);
+  List<MediaStreamTrack> getTracks() => _blink.BlinkMediaStream.instance.getTracks_Callback_0_(this);
 
   @DomName('MediaStream.getVideoTracks')
   @DocsEditable()
-  List<MediaStreamTrack> getVideoTracks() => _blink.BlinkMediaStream.getVideoTracks_Callback(this);
+  List<MediaStreamTrack> getVideoTracks() => _blink.BlinkMediaStream.instance.getVideoTracks_Callback_0_(this);
 
   @DomName('MediaStream.removeTrack')
   @DocsEditable()
-  void removeTrack(MediaStreamTrack track) => _blink.BlinkMediaStream.removeTrack_Callback_1(this, track);
+  void removeTrack(MediaStreamTrack track) => _blink.BlinkMediaStream.instance.removeTrack_Callback_1_(this, track);
 
   @DomName('MediaStream.stop')
   @DocsEditable()
-  void stop() => _blink.BlinkMediaStream.stop_Callback(this);
+  void stop() => _blink.BlinkMediaStream.instance.stop_Callback_0_(this);
 
   /// Stream of `addtrack` events handled by this [MediaStream].
   @DomName('MediaStream.onaddtrack')
@@ -21995,7 +21995,7 @@
 
   @DomName('MediaStreamEvent.stream')
   @DocsEditable()
-  MediaStream get stream => _blink.BlinkMediaStreamEvent.stream_Getter(this);
+  MediaStream get stream => _blink.BlinkMediaStreamEvent.instance.stream_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -22046,42 +22046,42 @@
 
   @DomName('MediaStreamTrack.enabled')
   @DocsEditable()
-  bool get enabled => _blink.BlinkMediaStreamTrack.enabled_Getter(this);
+  bool get enabled => _blink.BlinkMediaStreamTrack.instance.enabled_Getter_(this);
 
   @DomName('MediaStreamTrack.enabled')
   @DocsEditable()
-  void set enabled(bool value) => _blink.BlinkMediaStreamTrack.enabled_Setter(this, value);
+  void set enabled(bool value) => _blink.BlinkMediaStreamTrack.instance.enabled_Setter_(this, value);
 
   @DomName('MediaStreamTrack.id')
   @DocsEditable()
-  String get id => _blink.BlinkMediaStreamTrack.id_Getter(this);
+  String get id => _blink.BlinkMediaStreamTrack.instance.id_Getter_(this);
 
   @DomName('MediaStreamTrack.kind')
   @DocsEditable()
-  String get kind => _blink.BlinkMediaStreamTrack.kind_Getter(this);
+  String get kind => _blink.BlinkMediaStreamTrack.instance.kind_Getter_(this);
 
   @DomName('MediaStreamTrack.label')
   @DocsEditable()
-  String get label => _blink.BlinkMediaStreamTrack.label_Getter(this);
+  String get label => _blink.BlinkMediaStreamTrack.instance.label_Getter_(this);
 
   @DomName('MediaStreamTrack.muted')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get muted => _blink.BlinkMediaStreamTrack.muted_Getter(this);
+  bool get muted => _blink.BlinkMediaStreamTrack.instance.muted_Getter_(this);
 
   @DomName('MediaStreamTrack.readyState')
   @DocsEditable()
-  String get readyState => _blink.BlinkMediaStreamTrack.readyState_Getter(this);
+  String get readyState => _blink.BlinkMediaStreamTrack.instance.readyState_Getter_(this);
 
   @DomName('MediaStreamTrack.clone')
   @DocsEditable()
   @Experimental() // untriaged
-  MediaStreamTrack clone() => _blink.BlinkMediaStreamTrack.clone_Callback(this);
+  MediaStreamTrack clone() => _blink.BlinkMediaStreamTrack.instance.clone_Callback_0_(this);
 
   @DomName('MediaStreamTrack.getSources')
   @DocsEditable()
   @Experimental() // untriaged
-  static void _getSources(MediaStreamTrackSourcesCallback callback) => _blink.BlinkMediaStreamTrack.getSources_Callback_1(callback);
+  static void _getSources(MediaStreamTrackSourcesCallback callback) => _blink.BlinkMediaStreamTrack.instance.getSources_Callback_1_(callback);
 
   static Future<List<SourceInfo>> getSources() {
     var completer = new Completer<List<SourceInfo>>();
@@ -22093,7 +22093,7 @@
   @DomName('MediaStreamTrack.stop')
   @DocsEditable()
   @Experimental() // untriaged
-  void stop() => _blink.BlinkMediaStreamTrack.stop_Callback(this);
+  void stop() => _blink.BlinkMediaStreamTrack.instance.stop_Callback_0_(this);
 
   /// Stream of `ended` events handled by this [MediaStreamTrack].
   @DomName('MediaStreamTrack.onended')
@@ -22132,7 +22132,7 @@
 
   @DomName('MediaStreamTrackEvent.track')
   @DocsEditable()
-  MediaStreamTrack get track => _blink.BlinkMediaStreamTrackEvent.track_Getter(this);
+  MediaStreamTrack get track => _blink.BlinkMediaStreamTrackEvent.instance.track_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -22161,15 +22161,15 @@
 
   @DomName('MemoryInfo.jsHeapSizeLimit')
   @DocsEditable()
-  int get jsHeapSizeLimit => _blink.BlinkMemoryInfo.jsHeapSizeLimit_Getter(this);
+  int get jsHeapSizeLimit => _blink.BlinkMemoryInfo.instance.jsHeapSizeLimit_Getter_(this);
 
   @DomName('MemoryInfo.totalJSHeapSize')
   @DocsEditable()
-  int get totalJSHeapSize => _blink.BlinkMemoryInfo.totalJSHeapSize_Getter(this);
+  int get totalJSHeapSize => _blink.BlinkMemoryInfo.instance.totalJSHeapSize_Getter_(this);
 
   @DomName('MemoryInfo.usedJSHeapSize')
   @DocsEditable()
-  int get usedJSHeapSize => _blink.BlinkMemoryInfo.usedJSHeapSize_Getter(this);
+  int get usedJSHeapSize => _blink.BlinkMemoryInfo.instance.usedJSHeapSize_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -22208,22 +22208,22 @@
   @DomName('HTMLMenuElement.label')
   @DocsEditable()
   @Experimental() // untriaged
-  String get label => _blink.BlinkHTMLMenuElement.label_Getter(this);
+  String get label => _blink.BlinkHTMLMenuElement.instance.label_Getter_(this);
 
   @DomName('HTMLMenuElement.label')
   @DocsEditable()
   @Experimental() // untriaged
-  void set label(String value) => _blink.BlinkHTMLMenuElement.label_Setter(this, value);
+  void set label(String value) => _blink.BlinkHTMLMenuElement.instance.label_Setter_(this, value);
 
   @DomName('HTMLMenuElement.type')
   @DocsEditable()
   @Experimental() // untriaged
-  String get type => _blink.BlinkHTMLMenuElement.type_Getter(this);
+  String get type => _blink.BlinkHTMLMenuElement.instance.type_Getter_(this);
 
   @DomName('HTMLMenuElement.type')
   @DocsEditable()
   @Experimental() // untriaged
-  void set type(String value) => _blink.BlinkHTMLMenuElement.type_Setter(this, value);
+  void set type(String value) => _blink.BlinkHTMLMenuElement.instance.type_Setter_(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -22249,52 +22249,52 @@
   @DomName('HTMLMenuItemElement.checked')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get checked => _blink.BlinkHTMLMenuItemElement.checked_Getter(this);
+  bool get checked => _blink.BlinkHTMLMenuItemElement.instance.checked_Getter_(this);
 
   @DomName('HTMLMenuItemElement.checked')
   @DocsEditable()
   @Experimental() // untriaged
-  void set checked(bool value) => _blink.BlinkHTMLMenuItemElement.checked_Setter(this, value);
+  void set checked(bool value) => _blink.BlinkHTMLMenuItemElement.instance.checked_Setter_(this, value);
 
   @DomName('HTMLMenuItemElement.default')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get defaultValue => _blink.BlinkHTMLMenuItemElement.default_Getter(this);
+  bool get defaultValue => _blink.BlinkHTMLMenuItemElement.instance.default_Getter_(this);
 
   @DomName('HTMLMenuItemElement.default')
   @DocsEditable()
   @Experimental() // untriaged
-  void set defaultValue(bool value) => _blink.BlinkHTMLMenuItemElement.default_Setter(this, value);
+  void set defaultValue(bool value) => _blink.BlinkHTMLMenuItemElement.instance.default_Setter_(this, value);
 
   @DomName('HTMLMenuItemElement.disabled')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get disabled => _blink.BlinkHTMLMenuItemElement.disabled_Getter(this);
+  bool get disabled => _blink.BlinkHTMLMenuItemElement.instance.disabled_Getter_(this);
 
   @DomName('HTMLMenuItemElement.disabled')
   @DocsEditable()
   @Experimental() // untriaged
-  void set disabled(bool value) => _blink.BlinkHTMLMenuItemElement.disabled_Setter(this, value);
+  void set disabled(bool value) => _blink.BlinkHTMLMenuItemElement.instance.disabled_Setter_(this, value);
 
   @DomName('HTMLMenuItemElement.label')
   @DocsEditable()
   @Experimental() // untriaged
-  String get label => _blink.BlinkHTMLMenuItemElement.label_Getter(this);
+  String get label => _blink.BlinkHTMLMenuItemElement.instance.label_Getter_(this);
 
   @DomName('HTMLMenuItemElement.label')
   @DocsEditable()
   @Experimental() // untriaged
-  void set label(String value) => _blink.BlinkHTMLMenuItemElement.label_Setter(this, value);
+  void set label(String value) => _blink.BlinkHTMLMenuItemElement.instance.label_Setter_(this, value);
 
   @DomName('HTMLMenuItemElement.type')
   @DocsEditable()
   @Experimental() // untriaged
-  String get type => _blink.BlinkHTMLMenuItemElement.type_Getter(this);
+  String get type => _blink.BlinkHTMLMenuItemElement.instance.type_Getter_(this);
 
   @DomName('HTMLMenuItemElement.type')
   @DocsEditable()
   @Experimental() // untriaged
-  void set type(String value) => _blink.BlinkHTMLMenuItemElement.type_Setter(this, value);
+  void set type(String value) => _blink.BlinkHTMLMenuItemElement.instance.type_Setter_(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -22313,11 +22313,11 @@
 
   @DomName('MessageChannel.port1')
   @DocsEditable()
-  MessagePort get port1 => _blink.BlinkMessageChannel.port1_Getter(this);
+  MessagePort get port1 => _blink.BlinkMessageChannel.instance.port1_Getter_(this);
 
   @DomName('MessageChannel.port2')
   @DocsEditable()
-  MessagePort get port2 => _blink.BlinkMessageChannel.port2_Getter(this);
+  MessagePort get port2 => _blink.BlinkMessageChannel.instance.port2_Getter_(this);
 
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -22346,24 +22346,24 @@
 
   @DomName('MessageEvent.data')
   @DocsEditable()
-  Object get data => _blink.BlinkMessageEvent.data_Getter(this);
+  Object get data => _blink.BlinkMessageEvent.instance.data_Getter_(this);
 
   @DomName('MessageEvent.lastEventId')
   @DocsEditable()
   @Unstable()
-  String get lastEventId => _blink.BlinkMessageEvent.lastEventId_Getter(this);
+  String get lastEventId => _blink.BlinkMessageEvent.instance.lastEventId_Getter_(this);
 
   @DomName('MessageEvent.origin')
   @DocsEditable()
-  String get origin => _blink.BlinkMessageEvent.origin_Getter(this);
+  String get origin => _blink.BlinkMessageEvent.instance.origin_Getter_(this);
 
   @DomName('MessageEvent.source')
   @DocsEditable()
-  EventTarget get source => _blink.BlinkMessageEvent.source_Getter(this);
+  EventTarget get source => _blink.BlinkMessageEvent.instance.source_Getter_(this);
 
   @DomName('MessageEvent.initMessageEvent')
   @DocsEditable()
-  void _initMessageEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Object dataArg, String originArg, String lastEventIdArg, Window sourceArg, List<MessagePort> messagePorts) => _blink.BlinkMessageEvent.initMessageEvent_Callback_8(this, typeArg, canBubbleArg, cancelableArg, dataArg, originArg, lastEventIdArg, sourceArg, messagePorts);
+  void _initMessageEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Object dataArg, String originArg, String lastEventIdArg, Window sourceArg, List<MessagePort> messagePorts) => _blink.BlinkMessageEvent.instance.initMessageEvent_Callback_8_(this, typeArg, canBubbleArg, cancelableArg, dataArg, originArg, lastEventIdArg, sourceArg, messagePorts);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -22392,15 +22392,15 @@
 
   @DomName('MessagePort.close')
   @DocsEditable()
-  void close() => _blink.BlinkMessagePort.close_Callback(this);
+  void close() => _blink.BlinkMessagePort.instance.close_Callback_0_(this);
 
   @DomName('MessagePort.postMessage')
   @DocsEditable()
-  void postMessage(Object message, [List<MessagePort> transfer]) => _blink.BlinkMessagePort.postMessage_Callback_2(this, message, transfer);
+  void postMessage(Object message, [List<MessagePort> transfer]) => _blink.BlinkMessagePort.instance.postMessage_Callback_2_(this, message, transfer);
 
   @DomName('MessagePort.start')
   @DocsEditable()
-  void start() => _blink.BlinkMessagePort.start_Callback(this);
+  void start() => _blink.BlinkMessagePort.instance.start_Callback_0_(this);
 
   /// Stream of `message` events handled by this [MessagePort].
   @DomName('MessagePort.onmessage')
@@ -22433,27 +22433,27 @@
 
   @DomName('HTMLMetaElement.content')
   @DocsEditable()
-  String get content => _blink.BlinkHTMLMetaElement.content_Getter(this);
+  String get content => _blink.BlinkHTMLMetaElement.instance.content_Getter_(this);
 
   @DomName('HTMLMetaElement.content')
   @DocsEditable()
-  void set content(String value) => _blink.BlinkHTMLMetaElement.content_Setter(this, value);
+  void set content(String value) => _blink.BlinkHTMLMetaElement.instance.content_Setter_(this, value);
 
   @DomName('HTMLMetaElement.httpEquiv')
   @DocsEditable()
-  String get httpEquiv => _blink.BlinkHTMLMetaElement.httpEquiv_Getter(this);
+  String get httpEquiv => _blink.BlinkHTMLMetaElement.instance.httpEquiv_Getter_(this);
 
   @DomName('HTMLMetaElement.httpEquiv')
   @DocsEditable()
-  void set httpEquiv(String value) => _blink.BlinkHTMLMetaElement.httpEquiv_Setter(this, value);
+  void set httpEquiv(String value) => _blink.BlinkHTMLMetaElement.instance.httpEquiv_Setter_(this, value);
 
   @DomName('HTMLMetaElement.name')
   @DocsEditable()
-  String get name => _blink.BlinkHTMLMetaElement.name_Getter(this);
+  String get name => _blink.BlinkHTMLMetaElement.instance.name_Getter_(this);
 
   @DomName('HTMLMetaElement.name')
   @DocsEditable()
-  void set name(String value) => _blink.BlinkHTMLMetaElement.name_Setter(this, value);
+  void set name(String value) => _blink.BlinkHTMLMetaElement.instance.name_Setter_(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -22473,11 +22473,11 @@
 
   @DomName('Metadata.modificationTime')
   @DocsEditable()
-  DateTime get modificationTime => _blink.BlinkMetadata.modificationTime_Getter(this);
+  DateTime get modificationTime => _blink.BlinkMetadata.instance.modificationTime_Getter_(this);
 
   @DomName('Metadata.size')
   @DocsEditable()
-  int get size => _blink.BlinkMetadata.size_Getter(this);
+  int get size => _blink.BlinkMetadata.instance.size_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -22523,56 +22523,56 @@
 
   @DomName('HTMLMeterElement.high')
   @DocsEditable()
-  num get high => _blink.BlinkHTMLMeterElement.high_Getter(this);
+  num get high => _blink.BlinkHTMLMeterElement.instance.high_Getter_(this);
 
   @DomName('HTMLMeterElement.high')
   @DocsEditable()
-  void set high(num value) => _blink.BlinkHTMLMeterElement.high_Setter(this, value);
+  void set high(num value) => _blink.BlinkHTMLMeterElement.instance.high_Setter_(this, value);
 
   @DomName('HTMLMeterElement.labels')
   @DocsEditable()
   @Unstable()
-  List<Node> get labels => _blink.BlinkHTMLMeterElement.labels_Getter(this);
+  List<Node> get labels => _blink.BlinkHTMLMeterElement.instance.labels_Getter_(this);
 
   @DomName('HTMLMeterElement.low')
   @DocsEditable()
-  num get low => _blink.BlinkHTMLMeterElement.low_Getter(this);
+  num get low => _blink.BlinkHTMLMeterElement.instance.low_Getter_(this);
 
   @DomName('HTMLMeterElement.low')
   @DocsEditable()
-  void set low(num value) => _blink.BlinkHTMLMeterElement.low_Setter(this, value);
+  void set low(num value) => _blink.BlinkHTMLMeterElement.instance.low_Setter_(this, value);
 
   @DomName('HTMLMeterElement.max')
   @DocsEditable()
-  num get max => _blink.BlinkHTMLMeterElement.max_Getter(this);
+  num get max => _blink.BlinkHTMLMeterElement.instance.max_Getter_(this);
 
   @DomName('HTMLMeterElement.max')
   @DocsEditable()
-  void set max(num value) => _blink.BlinkHTMLMeterElement.max_Setter(this, value);
+  void set max(num value) => _blink.BlinkHTMLMeterElement.instance.max_Setter_(this, value);
 
   @DomName('HTMLMeterElement.min')
   @DocsEditable()
-  num get min => _blink.BlinkHTMLMeterElement.min_Getter(this);
+  num get min => _blink.BlinkHTMLMeterElement.instance.min_Getter_(this);
 
   @DomName('HTMLMeterElement.min')
   @DocsEditable()
-  void set min(num value) => _blink.BlinkHTMLMeterElement.min_Setter(this, value);
+  void set min(num value) => _blink.BlinkHTMLMeterElement.instance.min_Setter_(this, value);
 
   @DomName('HTMLMeterElement.optimum')
   @DocsEditable()
-  num get optimum => _blink.BlinkHTMLMeterElement.optimum_Getter(this);
+  num get optimum => _blink.BlinkHTMLMeterElement.instance.optimum_Getter_(this);
 
   @DomName('HTMLMeterElement.optimum')
   @DocsEditable()
-  void set optimum(num value) => _blink.BlinkHTMLMeterElement.optimum_Setter(this, value);
+  void set optimum(num value) => _blink.BlinkHTMLMeterElement.instance.optimum_Setter_(this, value);
 
   @DomName('HTMLMeterElement.value')
   @DocsEditable()
-  num get value => _blink.BlinkHTMLMeterElement.value_Getter(this);
+  num get value => _blink.BlinkHTMLMeterElement.instance.value_Getter_(this);
 
   @DomName('HTMLMeterElement.value')
   @DocsEditable()
-  void set value(num value) => _blink.BlinkHTMLMeterElement.value_Setter(this, value);
+  void set value(num value) => _blink.BlinkHTMLMeterElement.instance.value_Setter_(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -22613,15 +22613,15 @@
   @DomName('MIDIAccess.sysexEnabled')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get sysexEnabled => _blink.BlinkMIDIAccess.sysexEnabled_Getter(this);
+  bool get sysexEnabled => _blink.BlinkMIDIAccess.instance.sysexEnabled_Getter_(this);
 
   @DomName('MIDIAccess.inputs')
   @DocsEditable()
-  List<MidiInput> inputs() => _blink.BlinkMIDIAccess.inputs_Callback(this);
+  List<MidiInput> inputs() => _blink.BlinkMIDIAccess.instance.inputs_Callback_0_(this);
 
   @DomName('MIDIAccess.outputs')
   @DocsEditable()
-  List<MidiOutput> outputs() => _blink.BlinkMIDIAccess.outputs_Callback(this);
+  List<MidiOutput> outputs() => _blink.BlinkMIDIAccess.instance.outputs_Callback_0_(this);
 
   /// Stream of `connect` events handled by this [MidiAccess].
   @DomName('MIDIAccess.onconnect')
@@ -22651,7 +22651,7 @@
 
   @DomName('MIDIConnectionEvent.port')
   @DocsEditable()
-  MidiPort get port => _blink.BlinkMIDIConnectionEvent.port_Getter(this);
+  MidiPort get port => _blink.BlinkMIDIConnectionEvent.instance.port_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -22702,11 +22702,11 @@
 
   @DomName('MIDIMessageEvent.data')
   @DocsEditable()
-  Uint8List get data => _blink.BlinkMIDIMessageEvent.data_Getter(this);
+  Uint8List get data => _blink.BlinkMIDIMessageEvent.instance.data_Getter_(this);
 
   @DomName('MIDIMessageEvent.receivedTime')
   @DocsEditable()
-  double get receivedTime => _blink.BlinkMIDIMessageEvent.receivedTime_Getter(this);
+  double get receivedTime => _blink.BlinkMIDIMessageEvent.instance.receivedTime_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -22726,10 +22726,10 @@
 
   void send(Uint8List data, [num timestamp]) {
     if (timestamp != null) {
-      _blink.BlinkMIDIOutput.send_Callback_2(this, data, timestamp);
+      _blink.BlinkMIDIOutput.instance.send_Callback_2_(this, data, timestamp);
       return;
     }
-    _blink.BlinkMIDIOutput.send_Callback_1(this, data);
+    _blink.BlinkMIDIOutput.instance.send_Callback_1_(this, data);
     return;
   }
 
@@ -22761,23 +22761,23 @@
 
   @DomName('MIDIPort.id')
   @DocsEditable()
-  String get id => _blink.BlinkMIDIPort.id_Getter(this);
+  String get id => _blink.BlinkMIDIPort.instance.id_Getter_(this);
 
   @DomName('MIDIPort.manufacturer')
   @DocsEditable()
-  String get manufacturer => _blink.BlinkMIDIPort.manufacturer_Getter(this);
+  String get manufacturer => _blink.BlinkMIDIPort.instance.manufacturer_Getter_(this);
 
   @DomName('MIDIPort.name')
   @DocsEditable()
-  String get name => _blink.BlinkMIDIPort.name_Getter(this);
+  String get name => _blink.BlinkMIDIPort.instance.name_Getter_(this);
 
   @DomName('MIDIPort.type')
   @DocsEditable()
-  String get type => _blink.BlinkMIDIPort.type_Getter(this);
+  String get type => _blink.BlinkMIDIPort.instance.type_Getter_(this);
 
   @DomName('MIDIPort.version')
   @DocsEditable()
-  String get version => _blink.BlinkMIDIPort.version_Getter(this);
+  String get version => _blink.BlinkMIDIPort.instance.version_Getter_(this);
 
   /// Stream of `disconnect` events handled by this [MidiPort].
   @DomName('MIDIPort.ondisconnect')
@@ -22801,19 +22801,19 @@
 
   @DomName('MimeType.description')
   @DocsEditable()
-  String get description => _blink.BlinkMimeType.description_Getter(this);
+  String get description => _blink.BlinkMimeType.instance.description_Getter_(this);
 
   @DomName('MimeType.enabledPlugin')
   @DocsEditable()
-  Plugin get enabledPlugin => _blink.BlinkMimeType.enabledPlugin_Getter(this);
+  Plugin get enabledPlugin => _blink.BlinkMimeType.instance.enabledPlugin_Getter_(this);
 
   @DomName('MimeType.suffixes')
   @DocsEditable()
-  String get suffixes => _blink.BlinkMimeType.suffixes_Getter(this);
+  String get suffixes => _blink.BlinkMimeType.instance.suffixes_Getter_(this);
 
   @DomName('MimeType.type')
   @DocsEditable()
-  String get type => _blink.BlinkMimeType.type_Getter(this);
+  String get type => _blink.BlinkMimeType.instance.type_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -22832,15 +22832,15 @@
 
   @DomName('MimeTypeArray.length')
   @DocsEditable()
-  int get length => _blink.BlinkMimeTypeArray.length_Getter(this);
+  int get length => _blink.BlinkMimeTypeArray.instance.length_Getter_(this);
 
   MimeType operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _blink.BlinkMimeTypeArray.item_Callback_1(this, index);
+    return _blink.BlinkMimeTypeArray.instance.item_Callback_1_(this, index);
   }
 
-  MimeType _nativeIndexedGetter(int index) => _blink.BlinkMimeTypeArray.item_Callback_1(this, index);
+  MimeType _nativeIndexedGetter(int index) => _blink.BlinkMimeTypeArray.instance.item_Callback_1_(this, index);
 
   void operator[]=(int index, MimeType value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -22882,15 +22882,15 @@
 
   @DomName('MimeTypeArray.__getter__')
   @DocsEditable()
-  MimeType __getter__(String name) => _blink.BlinkMimeTypeArray.$__getter___Callback_1(this, name);
+  MimeType __getter__(String name) => _blink.BlinkMimeTypeArray.instance.$__getter___Callback_1_(this, name);
 
   @DomName('MimeTypeArray.item')
   @DocsEditable()
-  MimeType item(int index) => _blink.BlinkMimeTypeArray.item_Callback_1(this, index);
+  MimeType item(int index) => _blink.BlinkMimeTypeArray.instance.item_Callback_1_(this, index);
 
   @DomName('MimeTypeArray.namedItem')
   @DocsEditable()
-  MimeType namedItem(String name) => _blink.BlinkMimeTypeArray.namedItem_Callback_1(this, name);
+  MimeType namedItem(String name) => _blink.BlinkMimeTypeArray.instance.namedItem_Callback_1_(this, name);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -22915,19 +22915,19 @@
 
   @DomName('HTMLModElement.cite')
   @DocsEditable()
-  String get cite => _blink.BlinkHTMLModElement.cite_Getter(this);
+  String get cite => _blink.BlinkHTMLModElement.instance.cite_Getter_(this);
 
   @DomName('HTMLModElement.cite')
   @DocsEditable()
-  void set cite(String value) => _blink.BlinkHTMLModElement.cite_Setter(this, value);
+  void set cite(String value) => _blink.BlinkHTMLModElement.instance.cite_Setter_(this, value);
 
   @DomName('HTMLModElement.dateTime')
   @DocsEditable()
-  String get dateTime => _blink.BlinkHTMLModElement.dateTime_Getter(this);
+  String get dateTime => _blink.BlinkHTMLModElement.instance.dateTime_Getter_(this);
 
   @DomName('HTMLModElement.dateTime')
   @DocsEditable()
-  void set dateTime(String value) => _blink.BlinkHTMLModElement.dateTime_Setter(this, value);
+  void set dateTime(String value) => _blink.BlinkHTMLModElement.instance.dateTime_Setter_(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -22959,28 +22959,28 @@
 
   @DomName('MouseEvent.altKey')
   @DocsEditable()
-  bool get altKey => _blink.BlinkMouseEvent.altKey_Getter(this);
+  bool get altKey => _blink.BlinkMouseEvent.instance.altKey_Getter_(this);
 
   @DomName('MouseEvent.button')
   @DocsEditable()
-  int get button => _blink.BlinkMouseEvent.button_Getter(this);
+  int get button => _blink.BlinkMouseEvent.instance.button_Getter_(this);
 
   @DomName('MouseEvent.clientX')
   @DocsEditable()
-  int get _clientX => _blink.BlinkMouseEvent.clientX_Getter(this);
+  int get _clientX => _blink.BlinkMouseEvent.instance.clientX_Getter_(this);
 
   @DomName('MouseEvent.clientY')
   @DocsEditable()
-  int get _clientY => _blink.BlinkMouseEvent.clientY_Getter(this);
+  int get _clientY => _blink.BlinkMouseEvent.instance.clientY_Getter_(this);
 
   @DomName('MouseEvent.ctrlKey')
   @DocsEditable()
-  bool get ctrlKey => _blink.BlinkMouseEvent.ctrlKey_Getter(this);
+  bool get ctrlKey => _blink.BlinkMouseEvent.instance.ctrlKey_Getter_(this);
 
   @DomName('MouseEvent.dataTransfer')
   @DocsEditable()
   @Unstable()
-  DataTransfer get dataTransfer => _blink.BlinkMouseEvent.dataTransfer_Getter(this);
+  DataTransfer get dataTransfer => _blink.BlinkMouseEvent.instance.dataTransfer_Getter_(this);
 
   /**
    * The nonstandard way to access the element that the mouse comes
@@ -22992,52 +22992,52 @@
   @DomName('MouseEvent.fromElement')
   @DocsEditable()
   @deprecated
-  Node get fromElement => _blink.BlinkMouseEvent.fromElement_Getter(this);
+  Node get fromElement => _blink.BlinkMouseEvent.instance.fromElement_Getter_(this);
 
   @DomName('MouseEvent.metaKey')
   @DocsEditable()
-  bool get metaKey => _blink.BlinkMouseEvent.metaKey_Getter(this);
+  bool get metaKey => _blink.BlinkMouseEvent.instance.metaKey_Getter_(this);
 
   @DomName('MouseEvent.movementX')
   @DocsEditable()
   @Experimental() // untriaged
-  int get _movementX => _blink.BlinkMouseEvent.movementX_Getter(this);
+  int get _movementX => _blink.BlinkMouseEvent.instance.movementX_Getter_(this);
 
   @DomName('MouseEvent.movementY')
   @DocsEditable()
   @Experimental() // untriaged
-  int get _movementY => _blink.BlinkMouseEvent.movementY_Getter(this);
+  int get _movementY => _blink.BlinkMouseEvent.instance.movementY_Getter_(this);
 
   @DomName('MouseEvent.offsetX')
   @DocsEditable()
   @Unstable()
-  int get _offsetX => _blink.BlinkMouseEvent.offsetX_Getter(this);
+  int get _offsetX => _blink.BlinkMouseEvent.instance.offsetX_Getter_(this);
 
   @DomName('MouseEvent.offsetY')
   @DocsEditable()
   @Unstable()
-  int get _offsetY => _blink.BlinkMouseEvent.offsetY_Getter(this);
+  int get _offsetY => _blink.BlinkMouseEvent.instance.offsetY_Getter_(this);
 
   @DomName('MouseEvent.region')
   @DocsEditable()
   @Experimental() // untriaged
-  String get region => _blink.BlinkMouseEvent.region_Getter(this);
+  String get region => _blink.BlinkMouseEvent.instance.region_Getter_(this);
 
   @DomName('MouseEvent.relatedTarget')
   @DocsEditable()
-  EventTarget get relatedTarget => _blink.BlinkMouseEvent.relatedTarget_Getter(this);
+  EventTarget get relatedTarget => _blink.BlinkMouseEvent.instance.relatedTarget_Getter_(this);
 
   @DomName('MouseEvent.screenX')
   @DocsEditable()
-  int get _screenX => _blink.BlinkMouseEvent.screenX_Getter(this);
+  int get _screenX => _blink.BlinkMouseEvent.instance.screenX_Getter_(this);
 
   @DomName('MouseEvent.screenY')
   @DocsEditable()
-  int get _screenY => _blink.BlinkMouseEvent.screenY_Getter(this);
+  int get _screenY => _blink.BlinkMouseEvent.instance.screenY_Getter_(this);
 
   @DomName('MouseEvent.shiftKey')
   @DocsEditable()
-  bool get shiftKey => _blink.BlinkMouseEvent.shiftKey_Getter(this);
+  bool get shiftKey => _blink.BlinkMouseEvent.instance.shiftKey_Getter_(this);
 
   /**
    * The nonstandard way to access the element that the mouse goes
@@ -23049,25 +23049,25 @@
   @DomName('MouseEvent.toElement')
   @DocsEditable()
   @deprecated
-  Node get toElement => _blink.BlinkMouseEvent.toElement_Getter(this);
+  Node get toElement => _blink.BlinkMouseEvent.instance.toElement_Getter_(this);
 
   @DomName('MouseEvent.webkitMovementX')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
-  int get _webkitMovementX => _blink.BlinkMouseEvent.webkitMovementX_Getter(this);
+  int get _webkitMovementX => _blink.BlinkMouseEvent.instance.webkitMovementX_Getter_(this);
 
   @DomName('MouseEvent.webkitMovementY')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
-  int get _webkitMovementY => _blink.BlinkMouseEvent.webkitMovementY_Getter(this);
+  int get _webkitMovementY => _blink.BlinkMouseEvent.instance.webkitMovementY_Getter_(this);
 
   @DomName('MouseEvent.initMouseEvent')
   @DocsEditable()
-  void _initMouseEvent(String type, bool canBubble, bool cancelable, Window view, int detail, int screenX, int screenY, int clientX, int clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, int button, EventTarget relatedTarget) => _blink.BlinkMouseEvent.initMouseEvent_Callback_15(this, type, canBubble, cancelable, view, detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget);
+  void _initMouseEvent(String type, bool canBubble, bool cancelable, Window view, int detail, int screenX, int screenY, int clientX, int clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, int button, EventTarget relatedTarget) => _blink.BlinkMouseEvent.instance.initMouseEvent_Callback_15_(this, type, canBubble, cancelable, view, detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget);
 
 
   @deprecated
@@ -23137,19 +23137,19 @@
   factory MutationObserver._(MutationCallback callback) => _create(callback);
 
   @DocsEditable()
-  static MutationObserver _create(callback) => _blink.BlinkMutationObserver.constructorCallback_1(callback);
+  static MutationObserver _create(callback) => _blink.BlinkMutationObserver.instance.constructorCallback_1_(callback);
 
   @DomName('MutationObserver.disconnect')
   @DocsEditable()
-  void disconnect() => _blink.BlinkMutationObserver.disconnect_Callback(this);
+  void disconnect() => _blink.BlinkMutationObserver.instance.disconnect_Callback_0_(this);
 
   @DomName('MutationObserver.observe')
   @DocsEditable()
-  void _observe(Node target, Map options) => _blink.BlinkMutationObserver.observe_Callback_2(this, target, options);
+  void _observe(Node target, Map options) => _blink.BlinkMutationObserver.instance.observe_Callback_2_(this, target, options);
 
   @DomName('MutationObserver.takeRecords')
   @DocsEditable()
-  List<MutationRecord> takeRecords() => _blink.BlinkMutationObserver.takeRecords_Callback(this);
+  List<MutationRecord> takeRecords() => _blink.BlinkMutationObserver.instance.takeRecords_Callback_0_(this);
 
   /**
    * Checks to see if the mutation observer API is supported on the current
@@ -23234,39 +23234,39 @@
 
   @DomName('MutationRecord.addedNodes')
   @DocsEditable()
-  List<Node> get addedNodes => _blink.BlinkMutationRecord.addedNodes_Getter(this);
+  List<Node> get addedNodes => _blink.BlinkMutationRecord.instance.addedNodes_Getter_(this);
 
   @DomName('MutationRecord.attributeName')
   @DocsEditable()
-  String get attributeName => _blink.BlinkMutationRecord.attributeName_Getter(this);
+  String get attributeName => _blink.BlinkMutationRecord.instance.attributeName_Getter_(this);
 
   @DomName('MutationRecord.attributeNamespace')
   @DocsEditable()
-  String get attributeNamespace => _blink.BlinkMutationRecord.attributeNamespace_Getter(this);
+  String get attributeNamespace => _blink.BlinkMutationRecord.instance.attributeNamespace_Getter_(this);
 
   @DomName('MutationRecord.nextSibling')
   @DocsEditable()
-  Node get nextSibling => _blink.BlinkMutationRecord.nextSibling_Getter(this);
+  Node get nextSibling => _blink.BlinkMutationRecord.instance.nextSibling_Getter_(this);
 
   @DomName('MutationRecord.oldValue')
   @DocsEditable()
-  String get oldValue => _blink.BlinkMutationRecord.oldValue_Getter(this);
+  String get oldValue => _blink.BlinkMutationRecord.instance.oldValue_Getter_(this);
 
   @DomName('MutationRecord.previousSibling')
   @DocsEditable()
-  Node get previousSibling => _blink.BlinkMutationRecord.previousSibling_Getter(this);
+  Node get previousSibling => _blink.BlinkMutationRecord.instance.previousSibling_Getter_(this);
 
   @DomName('MutationRecord.removedNodes')
   @DocsEditable()
-  List<Node> get removedNodes => _blink.BlinkMutationRecord.removedNodes_Getter(this);
+  List<Node> get removedNodes => _blink.BlinkMutationRecord.instance.removedNodes_Getter_(this);
 
   @DomName('MutationRecord.target')
   @DocsEditable()
-  Node get target => _blink.BlinkMutationRecord.target_Getter(this);
+  Node get target => _blink.BlinkMutationRecord.instance.target_Getter_(this);
 
   @DomName('MutationRecord.type')
   @DocsEditable()
-  String get type => _blink.BlinkMutationRecord.type_Getter(this);
+  String get type => _blink.BlinkMutationRecord.instance.type_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23275,7 +23275,7 @@
 
 
 @DomName('Navigator')
-class Navigator extends NavigatorCpu implements NavigatorLanguage, NavigatorOnLine, NavigatorID {
+class Navigator extends NativeFieldWrapperClass2 implements NavigatorCpu, NavigatorLanguage, NavigatorOnLine, NavigatorID {
 
 
   /**
@@ -23339,73 +23339,73 @@
   @DomName('Navigator.connection')
   @DocsEditable()
   @Experimental() // untriaged
-  NetworkInformation get connection => _blink.BlinkNavigator.connection_Getter(this);
+  NetworkInformation get connection => _blink.BlinkNavigator.instance.connection_Getter_(this);
 
   @DomName('Navigator.cookieEnabled')
   @DocsEditable()
   @Unstable()
-  bool get cookieEnabled => _blink.BlinkNavigator.cookieEnabled_Getter(this);
+  bool get cookieEnabled => _blink.BlinkNavigator.instance.cookieEnabled_Getter_(this);
 
   @DomName('Navigator.credentials')
   @DocsEditable()
   @Experimental() // untriaged
-  CredentialsContainer get credentials => _blink.BlinkNavigator.credentials_Getter(this);
+  CredentialsContainer get credentials => _blink.BlinkNavigator.instance.credentials_Getter_(this);
 
   @DomName('Navigator.doNotTrack')
   @DocsEditable()
   // http://www.w3.org/2011/tracking-protection/drafts/tracking-dnt.html#js-dom
   @Experimental() // experimental
-  String get doNotTrack => _blink.BlinkNavigator.doNotTrack_Getter(this);
+  String get doNotTrack => _blink.BlinkNavigator.instance.doNotTrack_Getter_(this);
 
   @DomName('Navigator.geofencing')
   @DocsEditable()
   @Experimental() // untriaged
-  Geofencing get geofencing => _blink.BlinkNavigator.geofencing_Getter(this);
+  Geofencing get geofencing => _blink.BlinkNavigator.instance.geofencing_Getter_(this);
 
   @DomName('Navigator.geolocation')
   @DocsEditable()
   @Unstable()
-  Geolocation get geolocation => _blink.BlinkNavigator.geolocation_Getter(this);
+  Geolocation get geolocation => _blink.BlinkNavigator.instance.geolocation_Getter_(this);
 
   @DomName('Navigator.maxTouchPoints')
   @DocsEditable()
   @Experimental() // untriaged
-  int get maxTouchPoints => _blink.BlinkNavigator.maxTouchPoints_Getter(this);
+  int get maxTouchPoints => _blink.BlinkNavigator.instance.maxTouchPoints_Getter_(this);
 
   @DomName('Navigator.mimeTypes')
   @DocsEditable()
   @Experimental() // nonstandard
-  MimeTypeArray get mimeTypes => _blink.BlinkNavigator.mimeTypes_Getter(this);
+  MimeTypeArray get mimeTypes => _blink.BlinkNavigator.instance.mimeTypes_Getter_(this);
 
   @DomName('Navigator.productSub')
   @DocsEditable()
   @Unstable()
-  String get productSub => _blink.BlinkNavigator.productSub_Getter(this);
+  String get productSub => _blink.BlinkNavigator.instance.productSub_Getter_(this);
 
   @DomName('Navigator.push')
   @DocsEditable()
   @Experimental() // untriaged
-  PushManager get push => _blink.BlinkNavigator.push_Getter(this);
+  PushManager get push => _blink.BlinkNavigator.instance.push_Getter_(this);
 
   @DomName('Navigator.serviceWorker')
   @DocsEditable()
   @Experimental() // untriaged
-  ServiceWorkerContainer get serviceWorker => _blink.BlinkNavigator.serviceWorker_Getter(this);
+  ServiceWorkerContainer get serviceWorker => _blink.BlinkNavigator.instance.serviceWorker_Getter_(this);
 
   @DomName('Navigator.storageQuota')
   @DocsEditable()
   @Experimental() // untriaged
-  StorageQuota get storageQuota => _blink.BlinkNavigator.storageQuota_Getter(this);
+  StorageQuota get storageQuota => _blink.BlinkNavigator.instance.storageQuota_Getter_(this);
 
   @DomName('Navigator.vendor')
   @DocsEditable()
   @Unstable()
-  String get vendor => _blink.BlinkNavigator.vendor_Getter(this);
+  String get vendor => _blink.BlinkNavigator.instance.vendor_Getter_(this);
 
   @DomName('Navigator.vendorSub')
   @DocsEditable()
   @Unstable()
-  String get vendorSub => _blink.BlinkNavigator.vendorSub_Getter(this);
+  String get vendorSub => _blink.BlinkNavigator.instance.vendorSub_Getter_(this);
 
   @DomName('Navigator.webkitPersistentStorage')
   @DocsEditable()
@@ -23413,7 +23413,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // http://www.w3.org/TR/quota-api/#accessing-storagequota
-  DeprecatedStorageQuota get persistentStorage => _blink.BlinkNavigator.webkitPersistentStorage_Getter(this);
+  DeprecatedStorageQuota get persistentStorage => _blink.BlinkNavigator.instance.webkitPersistentStorage_Getter_(this);
 
   @DomName('Navigator.webkitTemporaryStorage')
   @DocsEditable()
@@ -23421,46 +23421,46 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // http://www.w3.org/TR/quota-api/#accessing-storagequota
-  DeprecatedStorageQuota get temporaryStorage => _blink.BlinkNavigator.webkitTemporaryStorage_Getter(this);
+  DeprecatedStorageQuota get temporaryStorage => _blink.BlinkNavigator.instance.webkitTemporaryStorage_Getter_(this);
 
   @DomName('Navigator.getBattery')
   @DocsEditable()
   @Experimental() // untriaged
-  Future getBattery() => _blink.BlinkNavigator.getBattery_Callback(this);
+  Future getBattery() => _blink.BlinkNavigator.instance.getBattery_Callback_0_(this);
 
   @DomName('Navigator.getGamepads')
   @DocsEditable()
   @Experimental() // untriaged
-  List<Gamepad> getGamepads() => _blink.BlinkNavigator.getGamepads_Callback(this);
+  List<Gamepad> getGamepads() => _blink.BlinkNavigator.instance.getGamepads_Callback_0_(this);
 
   @DomName('Navigator.getStorageUpdates')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#navigatorstorageutils
   @Experimental()
-  void getStorageUpdates() => _blink.BlinkNavigator.getStorageUpdates_Callback(this);
+  void getStorageUpdates() => _blink.BlinkNavigator.instance.getStorageUpdates_Callback_0_(this);
 
   @DomName('Navigator.isProtocolHandlerRegistered')
   @DocsEditable()
   @Experimental() // untriaged
-  String isProtocolHandlerRegistered(String scheme, String url) => _blink.BlinkNavigator.isProtocolHandlerRegistered_Callback_2(this, scheme, url);
+  String isProtocolHandlerRegistered(String scheme, String url) => _blink.BlinkNavigator.instance.isProtocolHandlerRegistered_Callback_2_(this, scheme, url);
 
   @DomName('Navigator.registerProtocolHandler')
   @DocsEditable()
   @Unstable()
-  void registerProtocolHandler(String scheme, String url, String title) => _blink.BlinkNavigator.registerProtocolHandler_Callback_3(this, scheme, url, title);
+  void registerProtocolHandler(String scheme, String url, String title) => _blink.BlinkNavigator.instance.registerProtocolHandler_Callback_3_(this, scheme, url, title);
 
   bool sendBeacon(String url, data) {
     if ((data is String || data == null) && (url is String || url == null)) {
-      return _blink.BlinkNavigator.sendBeacon_Callback_2(this, url, data);
+      return _blink.BlinkNavigator.instance.sendBeacon_Callback_2_(this, url, data);
     }
     if ((data is TypedData || data == null) && (url is String || url == null)) {
-      return _blink.BlinkNavigator.sendBeacon_Callback_2(this, url, data);
+      return _blink.BlinkNavigator.instance.sendBeacon_Callback_2_(this, url, data);
     }
     if ((data is FormData || data == null) && (url is String || url == null)) {
-      return _blink.BlinkNavigator.sendBeacon_Callback_2(this, url, data);
+      return _blink.BlinkNavigator.instance.sendBeacon_Callback_2_(this, url, data);
     }
     if ((data is Blob || data == null) && (url is String || url == null)) {
-      return _blink.BlinkNavigator.sendBeacon_Callback_2(this, url, data);
+      return _blink.BlinkNavigator.instance.sendBeacon_Callback_2_(this, url, data);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
@@ -23468,58 +23468,63 @@
   @DomName('Navigator.unregisterProtocolHandler')
   @DocsEditable()
   @Experimental() // untriaged
-  void unregisterProtocolHandler(String scheme, String url) => _blink.BlinkNavigator.unregisterProtocolHandler_Callback_2(this, scheme, url);
+  void unregisterProtocolHandler(String scheme, String url) => _blink.BlinkNavigator.instance.unregisterProtocolHandler_Callback_2_(this, scheme, url);
 
   @DomName('Navigator.webkitGetUserMedia')
   @DocsEditable()
   // http://dev.w3.org/2011/webrtc/editor/getusermedia.html#navigatorusermedia
   @Experimental()
-  void _getUserMedia(Map options, _NavigatorUserMediaSuccessCallback successCallback, _NavigatorUserMediaErrorCallback errorCallback) => _blink.BlinkNavigator.webkitGetUserMedia_Callback_3(this, options, successCallback, errorCallback);
+  void _getUserMedia(Map options, _NavigatorUserMediaSuccessCallback successCallback, _NavigatorUserMediaErrorCallback errorCallback) => _blink.BlinkNavigator.instance.webkitGetUserMedia_Callback_3_(this, options, successCallback, errorCallback);
+
+  @DomName('Navigator.hardwareConcurrency')
+  @DocsEditable()
+  @Experimental() // untriaged
+  int get hardwareConcurrency => _blink.BlinkNavigator.instance.hardwareConcurrency_Getter_(this);
 
   @DomName('Navigator.appCodeName')
   @DocsEditable()
   @Experimental() // non-standard
-  String get appCodeName => _blink.BlinkNavigator.appCodeName_Getter(this);
+  String get appCodeName => _blink.BlinkNavigator.instance.appCodeName_Getter_(this);
 
   @DomName('Navigator.appName')
   @DocsEditable()
-  String get appName => _blink.BlinkNavigator.appName_Getter(this);
+  String get appName => _blink.BlinkNavigator.instance.appName_Getter_(this);
 
   @DomName('Navigator.appVersion')
   @DocsEditable()
-  String get appVersion => _blink.BlinkNavigator.appVersion_Getter(this);
+  String get appVersion => _blink.BlinkNavigator.instance.appVersion_Getter_(this);
 
   @DomName('Navigator.dartEnabled')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get dartEnabled => _blink.BlinkNavigator.dartEnabled_Getter(this);
+  bool get dartEnabled => _blink.BlinkNavigator.instance.dartEnabled_Getter_(this);
 
   @DomName('Navigator.platform')
   @DocsEditable()
-  String get platform => _blink.BlinkNavigator.platform_Getter(this);
+  String get platform => _blink.BlinkNavigator.instance.platform_Getter_(this);
 
   @DomName('Navigator.product')
   @DocsEditable()
   @Unstable()
-  String get product => _blink.BlinkNavigator.product_Getter(this);
+  String get product => _blink.BlinkNavigator.instance.product_Getter_(this);
 
   @DomName('Navigator.userAgent')
   @DocsEditable()
-  String get userAgent => _blink.BlinkNavigator.userAgent_Getter(this);
+  String get userAgent => _blink.BlinkNavigator.instance.userAgent_Getter_(this);
 
   @DomName('Navigator.language')
   @DocsEditable()
-  String get language => _blink.BlinkNavigator.language_Getter(this);
+  String get language => _blink.BlinkNavigator.instance.language_Getter_(this);
 
   @DomName('Navigator.languages')
   @DocsEditable()
   @Experimental() // untriaged
-  List<String> get languages => _blink.BlinkNavigator.languages_Getter(this);
+  List<String> get languages => _blink.BlinkNavigator.instance.languages_Getter_(this);
 
   @DomName('Navigator.onLine')
   @DocsEditable()
   @Unstable()
-  bool get onLine => _blink.BlinkNavigator.onLine_Getter(this);
+  bool get onLine => _blink.BlinkNavigator.instance.onLine_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23532,14 +23537,14 @@
 @DocsEditable()
 @DomName('NavigatorCPU')
 @Experimental() // untriaged
-class NavigatorCpu extends NativeFieldWrapperClass2 {
+abstract class NavigatorCpu extends NativeFieldWrapperClass2 {
   // To suppress missing implicit constructor warnings.
   factory NavigatorCpu._() { throw new UnsupportedError("Not supported"); }
 
   @DomName('NavigatorCPU.hardwareConcurrency')
   @DocsEditable()
   @Experimental() // untriaged
-  int get hardwareConcurrency => _blink.BlinkNavigatorCPU.hardwareConcurrency_Getter(this);
+  int get hardwareConcurrency;
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23559,37 +23564,37 @@
   @DomName('NavigatorID.appCodeName')
   @DocsEditable()
   @Experimental() // untriaged
-  String get appCodeName => _blink.BlinkNavigatorID.appCodeName_Getter(this);
+  String get appCodeName;
 
   @DomName('NavigatorID.appName')
   @DocsEditable()
   @Experimental() // untriaged
-  String get appName => _blink.BlinkNavigatorID.appName_Getter(this);
+  String get appName;
 
   @DomName('NavigatorID.appVersion')
   @DocsEditable()
   @Experimental() // untriaged
-  String get appVersion => _blink.BlinkNavigatorID.appVersion_Getter(this);
+  String get appVersion;
 
   @DomName('NavigatorID.dartEnabled')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get dartEnabled => _blink.BlinkNavigatorID.dartEnabled_Getter(this);
+  bool get dartEnabled;
 
   @DomName('NavigatorID.platform')
   @DocsEditable()
   @Experimental() // untriaged
-  String get platform => _blink.BlinkNavigatorID.platform_Getter(this);
+  String get platform;
 
   @DomName('NavigatorID.product')
   @DocsEditable()
   @Experimental() // untriaged
-  String get product => _blink.BlinkNavigatorID.product_Getter(this);
+  String get product;
 
   @DomName('NavigatorID.userAgent')
   @DocsEditable()
   @Experimental() // untriaged
-  String get userAgent => _blink.BlinkNavigatorID.userAgent_Getter(this);
+  String get userAgent;
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23602,19 +23607,19 @@
 @DocsEditable()
 @DomName('NavigatorLanguage')
 @Experimental() // untriaged
-class NavigatorLanguage extends NativeFieldWrapperClass2 {
+abstract class NavigatorLanguage extends NativeFieldWrapperClass2 {
   // To suppress missing implicit constructor warnings.
   factory NavigatorLanguage._() { throw new UnsupportedError("Not supported"); }
 
   @DomName('NavigatorLanguage.language')
   @DocsEditable()
   @Experimental() // untriaged
-  String get language => _blink.BlinkNavigatorLanguage.language_Getter(this);
+  String get language;
 
   @DomName('NavigatorLanguage.languages')
   @DocsEditable()
   @Experimental() // untriaged
-  List<String> get languages => _blink.BlinkNavigatorLanguage.languages_Getter(this);
+  List<String> get languages;
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23634,7 +23639,7 @@
   @DomName('NavigatorOnLine.onLine')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get onLine => _blink.BlinkNavigatorOnLine.onLine_Getter(this);
+  bool get onLine;
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23654,15 +23659,15 @@
 
   @DomName('NavigatorUserMediaError.constraintName')
   @DocsEditable()
-  String get constraintName => _blink.BlinkNavigatorUserMediaError.constraintName_Getter(this);
+  String get constraintName => _blink.BlinkNavigatorUserMediaError.instance.constraintName_Getter_(this);
 
   @DomName('NavigatorUserMediaError.message')
   @DocsEditable()
-  String get message => _blink.BlinkNavigatorUserMediaError.message_Getter(this);
+  String get message => _blink.BlinkNavigatorUserMediaError.instance.message_Getter_(this);
 
   @DomName('NavigatorUserMediaError.name')
   @DocsEditable()
-  String get name => _blink.BlinkNavigatorUserMediaError.name_Getter(this);
+  String get name => _blink.BlinkNavigatorUserMediaError.instance.name_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23704,7 +23709,7 @@
   @DomName('NetworkInformation.type')
   @DocsEditable()
   @Experimental() // untriaged
-  String get type => _blink.BlinkNetworkInformation.type_Getter(this);
+  String get type => _blink.BlinkNetworkInformation.instance.type_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -24016,7 +24021,7 @@
 
   @DomName('Node.baseURI')
   @DocsEditable()
-  String get baseUri => _blink.BlinkNode.baseURI_Getter(this);
+  String get baseUri => _blink.BlinkNode.instance.baseURI_Getter_(this);
 
   /**
    * A list of this node's children.
@@ -24029,7 +24034,7 @@
    */
   @DomName('Node.childNodes')
   @DocsEditable()
-  List<Node> get childNodes => _blink.BlinkNode.childNodes_Getter(this);
+  List<Node> get childNodes => _blink.BlinkNode.instance.childNodes_Getter_(this);
 
   /**
    * The first child of this node.
@@ -24042,7 +24047,7 @@
    */
   @DomName('Node.firstChild')
   @DocsEditable()
-  Node get firstChild => _blink.BlinkNode.firstChild_Getter(this);
+  Node get firstChild => _blink.BlinkNode.instance.firstChild_Getter_(this);
 
   /**
    * The last child of this node.
@@ -24055,15 +24060,15 @@
    */
   @DomName('Node.lastChild')
   @DocsEditable()
-  Node get lastChild => _blink.BlinkNode.lastChild_Getter(this);
+  Node get lastChild => _blink.BlinkNode.instance.lastChild_Getter_(this);
 
   @DomName('Node.localName')
   @DocsEditable()
-  String get _localName => _blink.BlinkNode.localName_Getter(this);
+  String get _localName => _blink.BlinkNode.instance.localName_Getter_(this);
 
   @DomName('Node.namespaceURI')
   @DocsEditable()
-  String get _namespaceUri => _blink.BlinkNode.namespaceURI_Getter(this);
+  String get _namespaceUri => _blink.BlinkNode.instance.namespaceURI_Getter_(this);
 
   /**
    * The next sibling node.
@@ -24076,7 +24081,7 @@
    */
   @DomName('Node.nextSibling')
   @DocsEditable()
-  Node get nextNode => _blink.BlinkNode.nextSibling_Getter(this);
+  Node get nextNode => _blink.BlinkNode.instance.nextSibling_Getter_(this);
 
   /**
    * The name of this node.
@@ -24092,7 +24097,7 @@
    */
   @DomName('Node.nodeName')
   @DocsEditable()
-  String get nodeName => _blink.BlinkNode.nodeName_Getter(this);
+  String get nodeName => _blink.BlinkNode.instance.nodeName_Getter_(this);
 
   /**
    * The type of node.
@@ -24119,7 +24124,7 @@
    */
   @DomName('Node.nodeType')
   @DocsEditable()
-  int get nodeType => _blink.BlinkNode.nodeType_Getter(this);
+  int get nodeType => _blink.BlinkNode.instance.nodeType_Getter_(this);
 
   /**
    * The value of this node.
@@ -24135,7 +24140,7 @@
    */
   @DomName('Node.nodeValue')
   @DocsEditable()
-  String get nodeValue => _blink.BlinkNode.nodeValue_Getter(this);
+  String get nodeValue => _blink.BlinkNode.instance.nodeValue_Getter_(this);
 
   /**
    * The document this node belongs to.
@@ -24150,7 +24155,7 @@
    */
   @DomName('Node.ownerDocument')
   @DocsEditable()
-  Document get ownerDocument => _blink.BlinkNode.ownerDocument_Getter(this);
+  Document get ownerDocument => _blink.BlinkNode.instance.ownerDocument_Getter_(this);
 
   /**
    * The parent element of this node.
@@ -24166,7 +24171,7 @@
    */
   @DomName('Node.parentElement')
   @DocsEditable()
-  Element get parent => _blink.BlinkNode.parentElement_Getter(this);
+  Element get parent => _blink.BlinkNode.instance.parentElement_Getter_(this);
 
   /**
    * The parent node of this node.
@@ -24179,7 +24184,7 @@
    */
   @DomName('Node.parentNode')
   @DocsEditable()
-  Node get parentNode => _blink.BlinkNode.parentNode_Getter(this);
+  Node get parentNode => _blink.BlinkNode.instance.parentNode_Getter_(this);
 
   /**
    * The previous sibling node.
@@ -24192,7 +24197,7 @@
    */
   @DomName('Node.previousSibling')
   @DocsEditable()
-  Node get previousNode => _blink.BlinkNode.previousSibling_Getter(this);
+  Node get previousNode => _blink.BlinkNode.instance.previousSibling_Getter_(this);
 
   /**
    * All text within this node and its decendents.
@@ -24205,7 +24210,7 @@
    */
   @DomName('Node.textContent')
   @DocsEditable()
-  String get text => _blink.BlinkNode.textContent_Getter(this);
+  String get text => _blink.BlinkNode.instance.textContent_Getter_(this);
 
   /**
    * All text within this node and its decendents.
@@ -24218,7 +24223,7 @@
    */
   @DomName('Node.textContent')
   @DocsEditable()
-  void set text(String value) => _blink.BlinkNode.textContent_Setter(this, value);
+  void set text(String value) => _blink.BlinkNode.instance.textContent_Setter_(this, value);
 
   /**
    * Adds a node to the end of the child [nodes] list of this node.
@@ -24231,7 +24236,7 @@
    */
   @DomName('Node.appendChild')
   @DocsEditable()
-  Node append(Node newChild) => _blink.BlinkNode.appendChild_Callback_1(this, newChild);
+  Node append(Node newChild) => _blink.BlinkNode.instance.appendChild_Callback_1_(this, newChild);
 
   /**
    * Returns a copy of this node.
@@ -24247,7 +24252,7 @@
    */
   @DomName('Node.cloneNode')
   @DocsEditable()
-  Node clone(bool deep) => _blink.BlinkNode.cloneNode_Callback_1(this, deep);
+  Node clone(bool deep) => _blink.BlinkNode.instance.cloneNode_Callback_1_(this, deep);
 
   /**
    * Returns true if this node contains the specified node.
@@ -24259,7 +24264,7 @@
    */
   @DomName('Node.contains')
   @DocsEditable()
-  bool contains(Node other) => _blink.BlinkNode.contains_Callback_1(this, other);
+  bool contains(Node other) => _blink.BlinkNode.instance.contains_Callback_1_(this, other);
 
   /**
    * Returns true if this node has any children.
@@ -24272,7 +24277,7 @@
    */
   @DomName('Node.hasChildNodes')
   @DocsEditable()
-  bool hasChildNodes() => _blink.BlinkNode.hasChildNodes_Callback(this);
+  bool hasChildNodes() => _blink.BlinkNode.instance.hasChildNodes_Callback_0_(this);
 
   /**
    * Inserts all of the nodes into this node directly before refChild.
@@ -24285,15 +24290,15 @@
    */
   @DomName('Node.insertBefore')
   @DocsEditable()
-  Node insertBefore(Node newChild, Node refChild) => _blink.BlinkNode.insertBefore_Callback_2(this, newChild, refChild);
+  Node insertBefore(Node newChild, Node refChild) => _blink.BlinkNode.instance.insertBefore_Callback_2_(this, newChild, refChild);
 
   @DomName('Node.removeChild')
   @DocsEditable()
-  Node _removeChild(Node oldChild) => _blink.BlinkNode.removeChild_Callback_1(this, oldChild);
+  Node _removeChild(Node oldChild) => _blink.BlinkNode.instance.removeChild_Callback_1_(this, oldChild);
 
   @DomName('Node.replaceChild')
   @DocsEditable()
-  Node _replaceChild(Node newChild, Node oldChild) => _blink.BlinkNode.replaceChild_Callback_2(this, newChild, oldChild);
+  Node _replaceChild(Node newChild, Node oldChild) => _blink.BlinkNode.instance.replaceChild_Callback_2_(this, newChild, oldChild);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -24371,31 +24376,31 @@
 
   @DomName('NodeIterator.pointerBeforeReferenceNode')
   @DocsEditable()
-  bool get pointerBeforeReferenceNode => _blink.BlinkNodeIterator.pointerBeforeReferenceNode_Getter(this);
+  bool get pointerBeforeReferenceNode => _blink.BlinkNodeIterator.instance.pointerBeforeReferenceNode_Getter_(this);
 
   @DomName('NodeIterator.referenceNode')
   @DocsEditable()
-  Node get referenceNode => _blink.BlinkNodeIterator.referenceNode_Getter(this);
+  Node get referenceNode => _blink.BlinkNodeIterator.instance.referenceNode_Getter_(this);
 
   @DomName('NodeIterator.root')
   @DocsEditable()
-  Node get root => _blink.BlinkNodeIterator.root_Getter(this);
+  Node get root => _blink.BlinkNodeIterator.instance.root_Getter_(this);
 
   @DomName('NodeIterator.whatToShow')
   @DocsEditable()
-  int get whatToShow => _blink.BlinkNodeIterator.whatToShow_Getter(this);
+  int get whatToShow => _blink.BlinkNodeIterator.instance.whatToShow_Getter_(this);
 
   @DomName('NodeIterator.detach')
   @DocsEditable()
-  void detach() => _blink.BlinkNodeIterator.detach_Callback(this);
+  void detach() => _blink.BlinkNodeIterator.instance.detach_Callback_0_(this);
 
   @DomName('NodeIterator.nextNode')
   @DocsEditable()
-  Node nextNode() => _blink.BlinkNodeIterator.nextNode_Callback(this);
+  Node nextNode() => _blink.BlinkNodeIterator.instance.nextNode_Callback_0_(this);
 
   @DomName('NodeIterator.previousNode')
   @DocsEditable()
-  Node previousNode() => _blink.BlinkNodeIterator.previousNode_Callback(this);
+  Node previousNode() => _blink.BlinkNodeIterator.instance.previousNode_Callback_0_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -24413,15 +24418,15 @@
 
   @DomName('NodeList.length')
   @DocsEditable()
-  int get length => _blink.BlinkNodeList.length_Getter(this);
+  int get length => _blink.BlinkNodeList.instance.length_Getter_(this);
 
   Node operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _blink.BlinkNodeList.item_Callback_1(this, index);
+    return _blink.BlinkNodeList.instance.item_Callback_1_(this, index);
   }
 
-  Node _nativeIndexedGetter(int index) => _blink.BlinkNodeList.item_Callback_1(this, index);
+  Node _nativeIndexedGetter(int index) => _blink.BlinkNodeList.instance.item_Callback_1_(this, index);
 
   void operator[]=(int index, Node value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -24463,7 +24468,7 @@
 
   @DomName('NodeList.item')
   @DocsEditable()
-  Node _item(int index) => _blink.BlinkNodeList.item_Callback_1(this, index);
+  Node _item(int index) => _blink.BlinkNodeList.instance.item_Callback_1_(this, index);
 
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -24534,53 +24539,53 @@
   @DomName('Notification.Notification')
   @DocsEditable()
   static Notification _factoryNotification(String title, [Map options]) {
-    return _blink.BlinkNotification.constructorCallback_2(title, options);
+    return _blink.BlinkNotification.instance.constructorCallback_2_(title, options);
   }
 
   @DomName('Notification.body')
   @DocsEditable()
   @Experimental() // untriaged
-  String get body => _blink.BlinkNotification.body_Getter(this);
+  String get body => _blink.BlinkNotification.instance.body_Getter_(this);
 
   @DomName('Notification.dir')
   @DocsEditable()
   @Experimental() // nonstandard
-  String get dir => _blink.BlinkNotification.dir_Getter(this);
+  String get dir => _blink.BlinkNotification.instance.dir_Getter_(this);
 
   @DomName('Notification.icon')
   @DocsEditable()
   @Experimental() // untriaged
-  String get icon => _blink.BlinkNotification.icon_Getter(this);
+  String get icon => _blink.BlinkNotification.instance.icon_Getter_(this);
 
   @DomName('Notification.lang')
   @DocsEditable()
   @Experimental() // untriaged
-  String get lang => _blink.BlinkNotification.lang_Getter(this);
+  String get lang => _blink.BlinkNotification.instance.lang_Getter_(this);
 
   @DomName('Notification.permission')
   @DocsEditable()
-  String get permission => _blink.BlinkNotification.permission_Getter(this);
+  String get permission => _blink.BlinkNotification.instance.permission_Getter_();
 
   @DomName('Notification.tag')
   @DocsEditable()
   @Experimental() // nonstandard
-  String get tag => _blink.BlinkNotification.tag_Getter(this);
+  String get tag => _blink.BlinkNotification.instance.tag_Getter_(this);
 
   @DomName('Notification.title')
   @DocsEditable()
   @Experimental() // untriaged
-  String get title => _blink.BlinkNotification.title_Getter(this);
+  String get title => _blink.BlinkNotification.instance.title_Getter_(this);
 
   @DomName('Notification.close')
   @DocsEditable()
-  void close() => _blink.BlinkNotification.close_Callback(this);
+  void close() => _blink.BlinkNotification.instance.close_Callback_0_(this);
 
   static void _requestPermission([_NotificationPermissionCallback callback]) {
     if (callback != null) {
-      _blink.BlinkNotification.requestPermission_Callback_1(callback);
+      _blink.BlinkNotification.instance.requestPermission_Callback_1_(callback);
       return;
     }
-    _blink.BlinkNotification.requestPermission_Callback();
+    _blink.BlinkNotification.instance.requestPermission_Callback_0_();
     return;
   }
 
@@ -24648,27 +24653,27 @@
 
   @DomName('HTMLOListElement.reversed')
   @DocsEditable()
-  bool get reversed => _blink.BlinkHTMLOListElement.reversed_Getter(this);
+  bool get reversed => _blink.BlinkHTMLOListElement.instance.reversed_Getter_(this);
 
   @DomName('HTMLOListElement.reversed')
   @DocsEditable()
-  void set reversed(bool value) => _blink.BlinkHTMLOListElement.reversed_Setter(this, value);
+  void set reversed(bool value) => _blink.BlinkHTMLOListElement.instance.reversed_Setter_(this, value);
 
   @DomName('HTMLOListElement.start')
   @DocsEditable()
-  int get start => _blink.BlinkHTMLOListElement.start_Getter(this);
+  int get start => _blink.BlinkHTMLOListElement.instance.start_Getter_(this);
 
   @DomName('HTMLOListElement.start')
   @DocsEditable()
-  void set start(int value) => _blink.BlinkHTMLOListElement.start_Setter(this, value);
+  void set start(int value) => _blink.BlinkHTMLOListElement.instance.start_Setter_(this, value);
 
   @DomName('HTMLOListElement.type')
   @DocsEditable()
-  String get type => _blink.BlinkHTMLOListElement.type_Getter(this);
+  String get type => _blink.BlinkHTMLOListElement.instance.type_Getter_(this);
 
   @DomName('HTMLOListElement.type')
   @DocsEditable()
-  void set type(String value) => _blink.BlinkHTMLOListElement.type_Setter(this, value);
+  void set type(String value) => _blink.BlinkHTMLOListElement.instance.type_Setter_(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -24703,93 +24708,93 @@
 
   @DomName('HTMLObjectElement.data')
   @DocsEditable()
-  String get data => _blink.BlinkHTMLObjectElement.data_Getter(this);
+  String get data => _blink.BlinkHTMLObjectElement.instance.data_Getter_(this);
 
   @DomName('HTMLObjectElement.data')
   @DocsEditable()
-  void set data(String value) => _blink.BlinkHTMLObjectElement.data_Setter(this, value);
+  void set data(String value) => _blink.BlinkHTMLObjectElement.instance.data_Setter_(this, value);
 
   @DomName('HTMLObjectElement.form')
   @DocsEditable()
-  FormElement get form => _blink.BlinkHTMLObjectElement.form_Getter(this);
+  FormElement get form => _blink.BlinkHTMLObjectElement.instance.form_Getter_(this);
 
   @DomName('HTMLObjectElement.height')
   @DocsEditable()
-  String get height => _blink.BlinkHTMLObjectElement.height_Getter(this);
+  String get height => _blink.BlinkHTMLObjectElement.instance.height_Getter_(this);
 
   @DomName('HTMLObjectElement.height')
   @DocsEditable()
-  void set height(String value) => _blink.BlinkHTMLObjectElement.height_Setter(this, value);
+  void set height(String value) => _blink.BlinkHTMLObjectElement.instance.height_Setter_(this, value);
 
   @DomName('HTMLObjectElement.integrity')
   @DocsEditable()
   @Experimental() // untriaged
-  String get integrity => _blink.BlinkHTMLObjectElement.integrity_Getter(this);
+  String get integrity => _blink.BlinkHTMLObjectElement.instance.integrity_Getter_(this);
 
   @DomName('HTMLObjectElement.integrity')
   @DocsEditable()
   @Experimental() // untriaged
-  void set integrity(String value) => _blink.BlinkHTMLObjectElement.integrity_Setter(this, value);
+  void set integrity(String value) => _blink.BlinkHTMLObjectElement.instance.integrity_Setter_(this, value);
 
   @DomName('HTMLObjectElement.name')
   @DocsEditable()
-  String get name => _blink.BlinkHTMLObjectElement.name_Getter(this);
+  String get name => _blink.BlinkHTMLObjectElement.instance.name_Getter_(this);
 
   @DomName('HTMLObjectElement.name')
   @DocsEditable()
-  void set name(String value) => _blink.BlinkHTMLObjectElement.name_Setter(this, value);
+  void set name(String value) => _blink.BlinkHTMLObjectElement.instance.name_Setter_(this, value);
 
   @DomName('HTMLObjectElement.type')
   @DocsEditable()
-  String get type => _blink.BlinkHTMLObjectElement.type_Getter(this);
+  String get type => _blink.BlinkHTMLObjectElement.instance.type_Getter_(this);
 
   @DomName('HTMLObjectElement.type')
   @DocsEditable()
-  void set type(String value) => _blink.BlinkHTMLObjectElement.type_Setter(this, value);
+  void set type(String value) => _blink.BlinkHTMLObjectElement.instance.type_Setter_(this, value);
 
   @DomName('HTMLObjectElement.useMap')
   @DocsEditable()
-  String get useMap => _blink.BlinkHTMLObjectElement.useMap_Getter(this);
+  String get useMap => _blink.BlinkHTMLObjectElement.instance.useMap_Getter_(this);
 
   @DomName('HTMLObjectElement.useMap')
   @DocsEditable()
-  void set useMap(String value) => _blink.BlinkHTMLObjectElement.useMap_Setter(this, value);
+  void set useMap(String value) => _blink.BlinkHTMLObjectElement.instance.useMap_Setter_(this, value);
 
   @DomName('HTMLObjectElement.validationMessage')
   @DocsEditable()
-  String get validationMessage => _blink.BlinkHTMLObjectElement.validationMessage_Getter(this);
+  String get validationMessage => _blink.BlinkHTMLObjectElement.instance.validationMessage_Getter_(this);
 
   @DomName('HTMLObjectElement.validity')
   @DocsEditable()
-  ValidityState get validity => _blink.BlinkHTMLObjectElement.validity_Getter(this);
+  ValidityState get validity => _blink.BlinkHTMLObjectElement.instance.validity_Getter_(this);
 
   @DomName('HTMLObjectElement.width')
   @DocsEditable()
-  String get width => _blink.BlinkHTMLObjectElement.width_Getter(this);
+  String get width => _blink.BlinkHTMLObjectElement.instance.width_Getter_(this);
 
   @DomName('HTMLObjectElement.width')
   @DocsEditable()
-  void set width(String value) => _blink.BlinkHTMLObjectElement.width_Setter(this, value);
+  void set width(String value) => _blink.BlinkHTMLObjectElement.instance.width_Setter_(this, value);
 
   @DomName('HTMLObjectElement.willValidate')
   @DocsEditable()
-  bool get willValidate => _blink.BlinkHTMLObjectElement.willValidate_Getter(this);
+  bool get willValidate => _blink.BlinkHTMLObjectElement.instance.willValidate_Getter_(this);
 
   @DomName('HTMLObjectElement.__getter__')
   @DocsEditable()
-  bool __getter__(index_OR_name) => _blink.BlinkHTMLObjectElement.$__getter___Callback_1(this, index_OR_name);
+  bool __getter__(index_OR_name) => _blink.BlinkHTMLObjectElement.instance.$__getter___Callback_1_(this, index_OR_name);
 
   @DomName('HTMLObjectElement.__setter__')
   @DocsEditable()
-  void __setter__(index_OR_name, Node value) => _blink.BlinkHTMLObjectElement.$__setter___Callback_2(this, index_OR_name, value);
+  void __setter__(index_OR_name, Node value) => _blink.BlinkHTMLObjectElement.instance.$__setter___Callback_2_(this, index_OR_name, value);
 
   @DomName('HTMLObjectElement.checkValidity')
   @DocsEditable()
-  bool checkValidity() => _blink.BlinkHTMLObjectElement.checkValidity_Callback(this);
+  bool checkValidity() => _blink.BlinkHTMLObjectElement.instance.checkValidity_Callback_0_(this);
 
   @DomName('HTMLObjectElement.setCustomValidity')
   @DocsEditable()
-  void setCustomValidity(String error) => _blink.BlinkHTMLObjectElement.setCustomValidity_Callback_1(this, error);
+  void setCustomValidity(String error) => _blink.BlinkHTMLObjectElement.instance.setCustomValidity_Callback_1_(this, error);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -24817,19 +24822,19 @@
 
   @DomName('HTMLOptGroupElement.disabled')
   @DocsEditable()
-  bool get disabled => _blink.BlinkHTMLOptGroupElement.disabled_Getter(this);
+  bool get disabled => _blink.BlinkHTMLOptGroupElement.instance.disabled_Getter_(this);
 
   @DomName('HTMLOptGroupElement.disabled')
   @DocsEditable()
-  void set disabled(bool value) => _blink.BlinkHTMLOptGroupElement.disabled_Setter(this, value);
+  void set disabled(bool value) => _blink.BlinkHTMLOptGroupElement.instance.disabled_Setter_(this, value);
 
   @DomName('HTMLOptGroupElement.label')
   @DocsEditable()
-  String get label => _blink.BlinkHTMLOptGroupElement.label_Getter(this);
+  String get label => _blink.BlinkHTMLOptGroupElement.instance.label_Getter_(this);
 
   @DomName('HTMLOptGroupElement.label')
   @DocsEditable()
-  void set label(String value) => _blink.BlinkHTMLOptGroupElement.label_Setter(this, value);
+  void set label(String value) => _blink.BlinkHTMLOptGroupElement.instance.label_Setter_(this, value);
 
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -24846,7 +24851,7 @@
   @DomName('HTMLOptionElement.HTMLOptionElement')
   @DocsEditable()
   factory OptionElement._([String data, String value, bool defaultSelected, bool selected]) {
-    return _blink.BlinkHTMLOptionElement.constructorCallback_4(data, value, defaultSelected, selected);
+    return _blink.BlinkHTMLOptionElement.instance.constructorCallback_4_(data, value, defaultSelected, selected);
   }
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
@@ -24857,51 +24862,51 @@
 
   @DomName('HTMLOptionElement.defaultSelected')
   @DocsEditable()
-  bool get defaultSelected => _blink.BlinkHTMLOptionElement.defaultSelected_Getter(this);
+  bool get defaultSelected => _blink.BlinkHTMLOptionElement.instance.defaultSelected_Getter_(this);
 
   @DomName('HTMLOptionElement.defaultSelected')
   @DocsEditable()
-  void set defaultSelected(bool value) => _blink.BlinkHTMLOptionElement.defaultSelected_Setter(this, value);
+  void set defaultSelected(bool value) => _blink.BlinkHTMLOptionElement.instance.defaultSelected_Setter_(this, value);
 
   @DomName('HTMLOptionElement.disabled')
   @DocsEditable()
-  bool get disabled => _blink.BlinkHTMLOptionElement.disabled_Getter(this);
+  bool get disabled => _blink.BlinkHTMLOptionElement.instance.disabled_Getter_(this);
 
   @DomName('HTMLOptionElement.disabled')
   @DocsEditable()
-  void set disabled(bool value) => _blink.BlinkHTMLOptionElement.disabled_Setter(this, value);
+  void set disabled(bool value) => _blink.BlinkHTMLOptionElement.instance.disabled_Setter_(this, value);
 
   @DomName('HTMLOptionElement.form')
   @DocsEditable()
-  FormElement get form => _blink.BlinkHTMLOptionElement.form_Getter(this);
+  FormElement get form => _blink.BlinkHTMLOptionElement.instance.form_Getter_(this);
 
   @DomName('HTMLOptionElement.index')
   @DocsEditable()
-  int get index => _blink.BlinkHTMLOptionElement.index_Getter(this);
+  int get index => _blink.BlinkHTMLOptionElement.instance.index_Getter_(this);
 
   @DomName('HTMLOptionElement.label')
   @DocsEditable()
-  String get label => _blink.BlinkHTMLOptionElement.label_Getter(this);
+  String get label => _blink.BlinkHTMLOptionElement.instance.label_Getter_(this);
 
   @DomName('HTMLOptionElement.label')
   @DocsEditable()
-  void set label(String value) => _blink.BlinkHTMLOptionElement.label_Setter(this, value);
+  void set label(String value) => _blink.BlinkHTMLOptionElement.instance.label_Setter_(this, value);
 
   @DomName('HTMLOptionElement.selected')
   @DocsEditable()
-  bool get selected => _blink.BlinkHTMLOptionElement.selected_Getter(this);
+  bool get selected => _blink.BlinkHTMLOptionElement.instance.selected_Getter_(this);
 
   @DomName('HTMLOptionElement.selected')
   @DocsEditable()
-  void set selected(bool value) => _blink.BlinkHTMLOptionElement.selected_Setter(this, value);
+  void set selected(bool value) => _blink.BlinkHTMLOptionElement.instance.selected_Setter_(this, value);
 
   @DomName('HTMLOptionElement.value')
   @DocsEditable()
-  String get value => _blink.BlinkHTMLOptionElement.value_Getter(this);
+  String get value => _blink.BlinkHTMLOptionElement.instance.value_Getter_(this);
 
   @DomName('HTMLOptionElement.value')
   @DocsEditable()
-  void set value(String value) => _blink.BlinkHTMLOptionElement.value_Setter(this, value);
+  void set value(String value) => _blink.BlinkHTMLOptionElement.instance.value_Setter_(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -24935,64 +24940,64 @@
 
   @DomName('HTMLOutputElement.defaultValue')
   @DocsEditable()
-  String get defaultValue => _blink.BlinkHTMLOutputElement.defaultValue_Getter(this);
+  String get defaultValue => _blink.BlinkHTMLOutputElement.instance.defaultValue_Getter_(this);
 
   @DomName('HTMLOutputElement.defaultValue')
   @DocsEditable()
-  void set defaultValue(String value) => _blink.BlinkHTMLOutputElement.defaultValue_Setter(this, value);
+  void set defaultValue(String value) => _blink.BlinkHTMLOutputElement.instance.defaultValue_Setter_(this, value);
 
   @DomName('HTMLOutputElement.form')
   @DocsEditable()
-  FormElement get form => _blink.BlinkHTMLOutputElement.form_Getter(this);
+  FormElement get form => _blink.BlinkHTMLOutputElement.instance.form_Getter_(this);
 
   @DomName('HTMLOutputElement.htmlFor')
   @DocsEditable()
-  DomSettableTokenList get htmlFor => _blink.BlinkHTMLOutputElement.htmlFor_Getter(this);
+  DomSettableTokenList get htmlFor => _blink.BlinkHTMLOutputElement.instance.htmlFor_Getter_(this);
 
   @DomName('HTMLOutputElement.labels')
   @DocsEditable()
   @Unstable()
-  List<Node> get labels => _blink.BlinkHTMLOutputElement.labels_Getter(this);
+  List<Node> get labels => _blink.BlinkHTMLOutputElement.instance.labels_Getter_(this);
 
   @DomName('HTMLOutputElement.name')
   @DocsEditable()
-  String get name => _blink.BlinkHTMLOutputElement.name_Getter(this);
+  String get name => _blink.BlinkHTMLOutputElement.instance.name_Getter_(this);
 
   @DomName('HTMLOutputElement.name')
   @DocsEditable()
-  void set name(String value) => _blink.BlinkHTMLOutputElement.name_Setter(this, value);
+  void set name(String value) => _blink.BlinkHTMLOutputElement.instance.name_Setter_(this, value);
 
   @DomName('HTMLOutputElement.type')
   @DocsEditable()
-  String get type => _blink.BlinkHTMLOutputElement.type_Getter(this);
+  String get type => _blink.BlinkHTMLOutputElement.instance.type_Getter_(this);
 
   @DomName('HTMLOutputElement.validationMessage')
   @DocsEditable()
-  String get validationMessage => _blink.BlinkHTMLOutputElement.validationMessage_Getter(this);
+  String get validationMessage => _blink.BlinkHTMLOutputElement.instance.validationMessage_Getter_(this);
 
   @DomName('HTMLOutputElement.validity')
   @DocsEditable()
-  ValidityState get validity => _blink.BlinkHTMLOutputElement.validity_Getter(this);
+  ValidityState get validity => _blink.BlinkHTMLOutputElement.instance.validity_Getter_(this);
 
   @DomName('HTMLOutputElement.value')
   @DocsEditable()
-  String get value => _blink.BlinkHTMLOutputElement.value_Getter(this);
+  String get value => _blink.BlinkHTMLOutputElement.instance.value_Getter_(this);
 
   @DomName('HTMLOutputElement.value')
   @DocsEditable()
-  void set value(String value) => _blink.BlinkHTMLOutputElement.value_Setter(this, value);
+  void set value(String value) => _blink.BlinkHTMLOutputElement.instance.value_Setter_(this, value);
 
   @DomName('HTMLOutputElement.willValidate')
   @DocsEditable()
-  bool get willValidate => _blink.BlinkHTMLOutputElement.willValidate_Getter(this);
+  bool get willValidate => _blink.BlinkHTMLOutputElement.instance.willValidate_Getter_(this);
 
   @DomName('HTMLOutputElement.checkValidity')
   @DocsEditable()
-  bool checkValidity() => _blink.BlinkHTMLOutputElement.checkValidity_Callback(this);
+  bool checkValidity() => _blink.BlinkHTMLOutputElement.instance.checkValidity_Callback_0_(this);
 
   @DomName('HTMLOutputElement.setCustomValidity')
   @DocsEditable()
-  void setCustomValidity(String error) => _blink.BlinkHTMLOutputElement.setCustomValidity_Callback_1(this, error);
+  void setCustomValidity(String error) => _blink.BlinkHTMLOutputElement.instance.setCustomValidity_Callback_1_(this, error);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -25023,15 +25028,15 @@
 
   @DomName('OverflowEvent.horizontalOverflow')
   @DocsEditable()
-  bool get horizontalOverflow => _blink.BlinkOverflowEvent.horizontalOverflow_Getter(this);
+  bool get horizontalOverflow => _blink.BlinkOverflowEvent.instance.horizontalOverflow_Getter_(this);
 
   @DomName('OverflowEvent.orient')
   @DocsEditable()
-  int get orient => _blink.BlinkOverflowEvent.orient_Getter(this);
+  int get orient => _blink.BlinkOverflowEvent.instance.orient_Getter_(this);
 
   @DomName('OverflowEvent.verticalOverflow')
   @DocsEditable()
-  bool get verticalOverflow => _blink.BlinkOverflowEvent.verticalOverflow_Getter(this);
+  bool get verticalOverflow => _blink.BlinkOverflowEvent.instance.verticalOverflow_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -25051,7 +25056,7 @@
 
   @DomName('PageTransitionEvent.persisted')
   @DocsEditable()
-  bool get persisted => _blink.BlinkPageTransitionEvent.persisted_Getter(this);
+  bool get persisted => _blink.BlinkPageTransitionEvent.instance.persisted_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -25104,19 +25109,19 @@
 
   @DomName('HTMLParamElement.name')
   @DocsEditable()
-  String get name => _blink.BlinkHTMLParamElement.name_Getter(this);
+  String get name => _blink.BlinkHTMLParamElement.instance.name_Getter_(this);
 
   @DomName('HTMLParamElement.name')
   @DocsEditable()
-  void set name(String value) => _blink.BlinkHTMLParamElement.name_Setter(this, value);
+  void set name(String value) => _blink.BlinkHTMLParamElement.instance.name_Setter_(this, value);
 
   @DomName('HTMLParamElement.value')
   @DocsEditable()
-  String get value => _blink.BlinkHTMLParamElement.value_Getter(this);
+  String get value => _blink.BlinkHTMLParamElement.instance.value_Getter_(this);
 
   @DomName('HTMLParamElement.value')
   @DocsEditable()
-  void set value(String value) => _blink.BlinkHTMLParamElement.value_Setter(this, value);
+  void set value(String value) => _blink.BlinkHTMLParamElement.instance.value_Setter_(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -25136,32 +25141,32 @@
   @DomName('ParentNode.childElementCount')
   @DocsEditable()
   @Experimental() // untriaged
-  int get _childElementCount => _blink.BlinkParentNode.childElementCount_Getter(this);
+  int get _childElementCount;
 
   @DomName('ParentNode.children')
   @DocsEditable()
   @Experimental() // untriaged
-  List<Node> get _children => _blink.BlinkParentNode.children_Getter(this);
+  List<Node> get _children;
 
   @DomName('ParentNode.firstElementChild')
   @DocsEditable()
   @Experimental() // untriaged
-  Element get _firstElementChild => _blink.BlinkParentNode.firstElementChild_Getter(this);
+  Element get _firstElementChild;
 
   @DomName('ParentNode.lastElementChild')
   @DocsEditable()
   @Experimental() // untriaged
-  Element get _lastElementChild => _blink.BlinkParentNode.lastElementChild_Getter(this);
+  Element get _lastElementChild;
 
   @DomName('ParentNode.querySelector')
   @DocsEditable()
   @Experimental() // untriaged
-  Element querySelector(String selectors) => _blink.BlinkParentNode.querySelector_Callback_1(this, selectors);
+  Element querySelector(String selectors);
 
   @DomName('ParentNode.querySelectorAll')
   @DocsEditable()
   @Experimental() // untriaged
-  List<Node> querySelectorAll(String selectors) => _blink.BlinkParentNode.querySelectorAll_Callback_1(this, selectors);
+  List<Node> querySelectorAll(String selectors);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -25182,70 +25187,70 @@
   @DocsEditable()
   factory Path2D([path_OR_text]) {
     if (path_OR_text == null) {
-      return _blink.BlinkPath2D.constructorCallback();
+      return _blink.BlinkPath2D.instance.constructorCallback_0_();
     }
     if ((path_OR_text is Path2D || path_OR_text == null)) {
-      return _blink.BlinkPath2D.constructorCallback_1(path_OR_text);
+      return _blink.BlinkPath2D.instance.constructorCallback_1_(path_OR_text);
     }
     if ((path_OR_text is String || path_OR_text == null)) {
-      return _blink.BlinkPath2D.constructorCallback_1(path_OR_text);
+      return _blink.BlinkPath2D.instance.constructorCallback_1_(path_OR_text);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
   void addPath(Path2D path, [Matrix transform]) {
     if (transform != null) {
-      _blink.BlinkPath2D.addPath_Callback_2(this, path, transform);
+      _blink.BlinkPath2D.instance.addPath_Callback_2_(this, path, transform);
       return;
     }
-    _blink.BlinkPath2D.addPath_Callback_1(this, path);
+    _blink.BlinkPath2D.instance.addPath_Callback_1_(this, path);
     return;
   }
 
   @DomName('Path2D.arc')
   @DocsEditable()
   @Experimental() // untriaged
-  void arc(num x, num y, num radius, num startAngle, num endAngle, bool anticlockwise) => _blink.BlinkPath2D.arc_Callback_6(this, x, y, radius, startAngle, endAngle, anticlockwise);
+  void arc(num x, num y, num radius, num startAngle, num endAngle, bool anticlockwise) => _blink.BlinkPath2D.instance.arc_Callback_6_(this, x, y, radius, startAngle, endAngle, anticlockwise);
 
   @DomName('Path2D.arcTo')
   @DocsEditable()
   @Experimental() // untriaged
-  void arcTo(num x1, num y1, num x2, num y2, num radius) => _blink.BlinkPath2D.arcTo_Callback_5(this, x1, y1, x2, y2, radius);
+  void arcTo(num x1, num y1, num x2, num y2, num radius) => _blink.BlinkPath2D.instance.arcTo_Callback_5_(this, x1, y1, x2, y2, radius);
 
   @DomName('Path2D.bezierCurveTo')
   @DocsEditable()
   @Experimental() // untriaged
-  void bezierCurveTo(num cp1x, num cp1y, num cp2x, num cp2y, num x, num y) => _blink.BlinkPath2D.bezierCurveTo_Callback_6(this, cp1x, cp1y, cp2x, cp2y, x, y);
+  void bezierCurveTo(num cp1x, num cp1y, num cp2x, num cp2y, num x, num y) => _blink.BlinkPath2D.instance.bezierCurveTo_Callback_6_(this, cp1x, cp1y, cp2x, cp2y, x, y);
 
   @DomName('Path2D.closePath')
   @DocsEditable()
   @Experimental() // untriaged
-  void closePath() => _blink.BlinkPath2D.closePath_Callback(this);
+  void closePath() => _blink.BlinkPath2D.instance.closePath_Callback_0_(this);
 
   @DomName('Path2D.ellipse')
   @DocsEditable()
   @Experimental() // untriaged
-  void ellipse(num x, num y, num radiusX, num radiusY, num rotation, num startAngle, num endAngle, bool anticlockwise) => _blink.BlinkPath2D.ellipse_Callback_8(this, x, y, radiusX, radiusY, rotation, startAngle, endAngle, anticlockwise);
+  void ellipse(num x, num y, num radiusX, num radiusY, num rotation, num startAngle, num endAngle, bool anticlockwise) => _blink.BlinkPath2D.instance.ellipse_Callback_8_(this, x, y, radiusX, radiusY, rotation, startAngle, endAngle, anticlockwise);
 
   @DomName('Path2D.lineTo')
   @DocsEditable()
   @Experimental() // untriaged
-  void lineTo(num x, num y) => _blink.BlinkPath2D.lineTo_Callback_2(this, x, y);
+  void lineTo(num x, num y) => _blink.BlinkPath2D.instance.lineTo_Callback_2_(this, x, y);
 
   @DomName('Path2D.moveTo')
   @DocsEditable()
   @Experimental() // untriaged
-  void moveTo(num x, num y) => _blink.BlinkPath2D.moveTo_Callback_2(this, x, y);
+  void moveTo(num x, num y) => _blink.BlinkPath2D.instance.moveTo_Callback_2_(this, x, y);
 
   @DomName('Path2D.quadraticCurveTo')
   @DocsEditable()
   @Experimental() // untriaged
-  void quadraticCurveTo(num cpx, num cpy, num x, num y) => _blink.BlinkPath2D.quadraticCurveTo_Callback_4(this, cpx, cpy, x, y);
+  void quadraticCurveTo(num cpx, num cpy, num x, num y) => _blink.BlinkPath2D.instance.quadraticCurveTo_Callback_4_(this, cpx, cpy, x, y);
 
   @DomName('Path2D.rect')
   @DocsEditable()
   @Experimental() // untriaged
-  void rect(num x, num y, num width, num height) => _blink.BlinkPath2D.rect_Callback_4(this, x, y, width, height);
+  void rect(num x, num y, num width, num height) => _blink.BlinkPath2D.instance.rect_Callback_4_(this, x, y, width, height);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -25284,61 +25289,61 @@
   @DomName('Performance.memory')
   @DocsEditable()
   @Experimental() // nonstandard
-  MemoryInfo get memory => _blink.BlinkPerformance.memory_Getter(this);
+  MemoryInfo get memory => _blink.BlinkPerformance.instance.memory_Getter_(this);
 
   @DomName('Performance.navigation')
   @DocsEditable()
-  PerformanceNavigation get navigation => _blink.BlinkPerformance.navigation_Getter(this);
+  PerformanceNavigation get navigation => _blink.BlinkPerformance.instance.navigation_Getter_(this);
 
   @DomName('Performance.timing')
   @DocsEditable()
-  PerformanceTiming get timing => _blink.BlinkPerformance.timing_Getter(this);
+  PerformanceTiming get timing => _blink.BlinkPerformance.instance.timing_Getter_(this);
 
   @DomName('Performance.clearMarks')
   @DocsEditable()
   // https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/UserTiming/Overview.html#extensions-performance-interface
   @Experimental()
-  void clearMarks(String markName) => _blink.BlinkPerformance.clearMarks_Callback_1(this, markName);
+  void clearMarks(String markName) => _blink.BlinkPerformance.instance.clearMarks_Callback_1_(this, markName);
 
   @DomName('Performance.clearMeasures')
   @DocsEditable()
   // https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/UserTiming/Overview.html#extensions-performance-interface
   @Experimental()
-  void clearMeasures(String measureName) => _blink.BlinkPerformance.clearMeasures_Callback_1(this, measureName);
+  void clearMeasures(String measureName) => _blink.BlinkPerformance.instance.clearMeasures_Callback_1_(this, measureName);
 
   @DomName('Performance.getEntries')
   @DocsEditable()
   // http://www.w3.org/TR/performance-timeline/#sec-window.performance-attribute
   @Experimental()
-  List<PerformanceEntry> getEntries() => _blink.BlinkPerformance.getEntries_Callback(this);
+  List<PerformanceEntry> getEntries() => _blink.BlinkPerformance.instance.getEntries_Callback_0_(this);
 
   @DomName('Performance.getEntriesByName')
   @DocsEditable()
   // http://www.w3.org/TR/performance-timeline/#sec-window.performance-attribute
   @Experimental()
-  List<PerformanceEntry> getEntriesByName(String name, String entryType) => _blink.BlinkPerformance.getEntriesByName_Callback_2(this, name, entryType);
+  List<PerformanceEntry> getEntriesByName(String name, String entryType) => _blink.BlinkPerformance.instance.getEntriesByName_Callback_2_(this, name, entryType);
 
   @DomName('Performance.getEntriesByType')
   @DocsEditable()
   // http://www.w3.org/TR/performance-timeline/#sec-window.performance-attribute
   @Experimental()
-  List<PerformanceEntry> getEntriesByType(String entryType) => _blink.BlinkPerformance.getEntriesByType_Callback_1(this, entryType);
+  List<PerformanceEntry> getEntriesByType(String entryType) => _blink.BlinkPerformance.instance.getEntriesByType_Callback_1_(this, entryType);
 
   @DomName('Performance.mark')
   @DocsEditable()
   // https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/UserTiming/Overview.html#extensions-performance-interface
   @Experimental()
-  void mark(String markName) => _blink.BlinkPerformance.mark_Callback_1(this, markName);
+  void mark(String markName) => _blink.BlinkPerformance.instance.mark_Callback_1_(this, markName);
 
   @DomName('Performance.measure')
   @DocsEditable()
   // https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/UserTiming/Overview.html#extensions-performance-interface
   @Experimental()
-  void measure(String measureName, String startMark, String endMark) => _blink.BlinkPerformance.measure_Callback_3(this, measureName, startMark, endMark);
+  void measure(String measureName, String startMark, String endMark) => _blink.BlinkPerformance.instance.measure_Callback_3_(this, measureName, startMark, endMark);
 
   @DomName('Performance.now')
   @DocsEditable()
-  double now() => _blink.BlinkPerformance.now_Callback(this);
+  double now() => _blink.BlinkPerformance.instance.now_Callback_0_(this);
 
   @DomName('Performance.webkitClearResourceTimings')
   @DocsEditable()
@@ -25346,7 +25351,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // http://www.w3c-test.org/webperf/specs/ResourceTiming/#extensions-performance-interface
-  void clearResourceTimings() => _blink.BlinkPerformance.webkitClearResourceTimings_Callback(this);
+  void clearResourceTimings() => _blink.BlinkPerformance.instance.webkitClearResourceTimings_Callback_0_(this);
 
   @DomName('Performance.webkitSetResourceTimingBufferSize')
   @DocsEditable()
@@ -25354,7 +25359,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // http://www.w3c-test.org/webperf/specs/ResourceTiming/#performanceresourcetiming-methods
-  void setResourceTimingBufferSize(int maxSize) => _blink.BlinkPerformance.webkitSetResourceTimingBufferSize_Callback_1(this, maxSize);
+  void setResourceTimingBufferSize(int maxSize) => _blink.BlinkPerformance.instance.webkitSetResourceTimingBufferSize_Callback_1_(this, maxSize);
 
   /// Stream of `resourcetimingbufferfull` events handled by this [Performance].
   @DomName('Performance.onwebkitresourcetimingbufferfull')
@@ -25381,19 +25386,19 @@
 
   @DomName('PerformanceEntry.duration')
   @DocsEditable()
-  double get duration => _blink.BlinkPerformanceEntry.duration_Getter(this);
+  double get duration => _blink.BlinkPerformanceEntry.instance.duration_Getter_(this);
 
   @DomName('PerformanceEntry.entryType')
   @DocsEditable()
-  String get entryType => _blink.BlinkPerformanceEntry.entryType_Getter(this);
+  String get entryType => _blink.BlinkPerformanceEntry.instance.entryType_Getter_(this);
 
   @DomName('PerformanceEntry.name')
   @DocsEditable()
-  String get name => _blink.BlinkPerformanceEntry.name_Getter(this);
+  String get name => _blink.BlinkPerformanceEntry.instance.name_Getter_(this);
 
   @DomName('PerformanceEntry.startTime')
   @DocsEditable()
-  double get startTime => _blink.BlinkPerformanceEntry.startTime_Getter(this);
+  double get startTime => _blink.BlinkPerformanceEntry.instance.startTime_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -25460,11 +25465,11 @@
 
   @DomName('PerformanceNavigation.redirectCount')
   @DocsEditable()
-  int get redirectCount => _blink.BlinkPerformanceNavigation.redirectCount_Getter(this);
+  int get redirectCount => _blink.BlinkPerformanceNavigation.instance.redirectCount_Getter_(this);
 
   @DomName('PerformanceNavigation.type')
   @DocsEditable()
-  int get type => _blink.BlinkPerformanceNavigation.type_Getter(this);
+  int get type => _blink.BlinkPerformanceNavigation.instance.type_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -25484,54 +25489,54 @@
 
   @DomName('PerformanceResourceTiming.connectEnd')
   @DocsEditable()
-  double get connectEnd => _blink.BlinkPerformanceResourceTiming.connectEnd_Getter(this);
+  double get connectEnd => _blink.BlinkPerformanceResourceTiming.instance.connectEnd_Getter_(this);
 
   @DomName('PerformanceResourceTiming.connectStart')
   @DocsEditable()
-  double get connectStart => _blink.BlinkPerformanceResourceTiming.connectStart_Getter(this);
+  double get connectStart => _blink.BlinkPerformanceResourceTiming.instance.connectStart_Getter_(this);
 
   @DomName('PerformanceResourceTiming.domainLookupEnd')
   @DocsEditable()
-  double get domainLookupEnd => _blink.BlinkPerformanceResourceTiming.domainLookupEnd_Getter(this);
+  double get domainLookupEnd => _blink.BlinkPerformanceResourceTiming.instance.domainLookupEnd_Getter_(this);
 
   @DomName('PerformanceResourceTiming.domainLookupStart')
   @DocsEditable()
-  double get domainLookupStart => _blink.BlinkPerformanceResourceTiming.domainLookupStart_Getter(this);
+  double get domainLookupStart => _blink.BlinkPerformanceResourceTiming.instance.domainLookupStart_Getter_(this);
 
   @DomName('PerformanceResourceTiming.fetchStart')
   @DocsEditable()
-  double get fetchStart => _blink.BlinkPerformanceResourceTiming.fetchStart_Getter(this);
+  double get fetchStart => _blink.BlinkPerformanceResourceTiming.instance.fetchStart_Getter_(this);
 
   @DomName('PerformanceResourceTiming.initiatorType')
   @DocsEditable()
-  String get initiatorType => _blink.BlinkPerformanceResourceTiming.initiatorType_Getter(this);
+  String get initiatorType => _blink.BlinkPerformanceResourceTiming.instance.initiatorType_Getter_(this);
 
   @DomName('PerformanceResourceTiming.redirectEnd')
   @DocsEditable()
-  double get redirectEnd => _blink.BlinkPerformanceResourceTiming.redirectEnd_Getter(this);
+  double get redirectEnd => _blink.BlinkPerformanceResourceTiming.instance.redirectEnd_Getter_(this);
 
   @DomName('PerformanceResourceTiming.redirectStart')
   @DocsEditable()
-  double get redirectStart => _blink.BlinkPerformanceResourceTiming.redirectStart_Getter(this);
+  double get redirectStart => _blink.BlinkPerformanceResourceTiming.instance.redirectStart_Getter_(this);
 
   @DomName('PerformanceResourceTiming.requestStart')
   @DocsEditable()
   @Experimental() // nonstandard
-  double get requestStart => _blink.BlinkPerformanceResourceTiming.requestStart_Getter(this);
+  double get requestStart => _blink.BlinkPerformanceResourceTiming.instance.requestStart_Getter_(this);
 
   @DomName('PerformanceResourceTiming.responseEnd')
   @DocsEditable()
   @Experimental() // nonstandard
-  double get responseEnd => _blink.BlinkPerformanceResourceTiming.responseEnd_Getter(this);
+  double get responseEnd => _blink.BlinkPerformanceResourceTiming.instance.responseEnd_Getter_(this);
 
   @DomName('PerformanceResourceTiming.responseStart')
   @DocsEditable()
   @Experimental() // nonstandard
-  double get responseStart => _blink.BlinkPerformanceResourceTiming.responseStart_Getter(this);
+  double get responseStart => _blink.BlinkPerformanceResourceTiming.instance.responseStart_Getter_(this);
 
   @DomName('PerformanceResourceTiming.secureConnectionStart')
   @DocsEditable()
-  double get secureConnectionStart => _blink.BlinkPerformanceResourceTiming.secureConnectionStart_Getter(this);
+  double get secureConnectionStart => _blink.BlinkPerformanceResourceTiming.instance.secureConnectionStart_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -25550,87 +25555,87 @@
 
   @DomName('PerformanceTiming.connectEnd')
   @DocsEditable()
-  int get connectEnd => _blink.BlinkPerformanceTiming.connectEnd_Getter(this);
+  int get connectEnd => _blink.BlinkPerformanceTiming.instance.connectEnd_Getter_(this);
 
   @DomName('PerformanceTiming.connectStart')
   @DocsEditable()
-  int get connectStart => _blink.BlinkPerformanceTiming.connectStart_Getter(this);
+  int get connectStart => _blink.BlinkPerformanceTiming.instance.connectStart_Getter_(this);
 
   @DomName('PerformanceTiming.domComplete')
   @DocsEditable()
-  int get domComplete => _blink.BlinkPerformanceTiming.domComplete_Getter(this);
+  int get domComplete => _blink.BlinkPerformanceTiming.instance.domComplete_Getter_(this);
 
   @DomName('PerformanceTiming.domContentLoadedEventEnd')
   @DocsEditable()
-  int get domContentLoadedEventEnd => _blink.BlinkPerformanceTiming.domContentLoadedEventEnd_Getter(this);
+  int get domContentLoadedEventEnd => _blink.BlinkPerformanceTiming.instance.domContentLoadedEventEnd_Getter_(this);
 
   @DomName('PerformanceTiming.domContentLoadedEventStart')
   @DocsEditable()
-  int get domContentLoadedEventStart => _blink.BlinkPerformanceTiming.domContentLoadedEventStart_Getter(this);
+  int get domContentLoadedEventStart => _blink.BlinkPerformanceTiming.instance.domContentLoadedEventStart_Getter_(this);
 
   @DomName('PerformanceTiming.domInteractive')
   @DocsEditable()
-  int get domInteractive => _blink.BlinkPerformanceTiming.domInteractive_Getter(this);
+  int get domInteractive => _blink.BlinkPerformanceTiming.instance.domInteractive_Getter_(this);
 
   @DomName('PerformanceTiming.domLoading')
   @DocsEditable()
-  int get domLoading => _blink.BlinkPerformanceTiming.domLoading_Getter(this);
+  int get domLoading => _blink.BlinkPerformanceTiming.instance.domLoading_Getter_(this);
 
   @DomName('PerformanceTiming.domainLookupEnd')
   @DocsEditable()
-  int get domainLookupEnd => _blink.BlinkPerformanceTiming.domainLookupEnd_Getter(this);
+  int get domainLookupEnd => _blink.BlinkPerformanceTiming.instance.domainLookupEnd_Getter_(this);
 
   @DomName('PerformanceTiming.domainLookupStart')
   @DocsEditable()
-  int get domainLookupStart => _blink.BlinkPerformanceTiming.domainLookupStart_Getter(this);
+  int get domainLookupStart => _blink.BlinkPerformanceTiming.instance.domainLookupStart_Getter_(this);
 
   @DomName('PerformanceTiming.fetchStart')
   @DocsEditable()
-  int get fetchStart => _blink.BlinkPerformanceTiming.fetchStart_Getter(this);
+  int get fetchStart => _blink.BlinkPerformanceTiming.instance.fetchStart_Getter_(this);
 
   @DomName('PerformanceTiming.loadEventEnd')
   @DocsEditable()
-  int get loadEventEnd => _blink.BlinkPerformanceTiming.loadEventEnd_Getter(this);
+  int get loadEventEnd => _blink.BlinkPerformanceTiming.instance.loadEventEnd_Getter_(this);
 
   @DomName('PerformanceTiming.loadEventStart')
   @DocsEditable()
-  int get loadEventStart => _blink.BlinkPerformanceTiming.loadEventStart_Getter(this);
+  int get loadEventStart => _blink.BlinkPerformanceTiming.instance.loadEventStart_Getter_(this);
 
   @DomName('PerformanceTiming.navigationStart')
   @DocsEditable()
-  int get navigationStart => _blink.BlinkPerformanceTiming.navigationStart_Getter(this);
+  int get navigationStart => _blink.BlinkPerformanceTiming.instance.navigationStart_Getter_(this);
 
   @DomName('PerformanceTiming.redirectEnd')
   @DocsEditable()
-  int get redirectEnd => _blink.BlinkPerformanceTiming.redirectEnd_Getter(this);
+  int get redirectEnd => _blink.BlinkPerformanceTiming.instance.redirectEnd_Getter_(this);
 
   @DomName('PerformanceTiming.redirectStart')
   @DocsEditable()
-  int get redirectStart => _blink.BlinkPerformanceTiming.redirectStart_Getter(this);
+  int get redirectStart => _blink.BlinkPerformanceTiming.instance.redirectStart_Getter_(this);
 
   @DomName('PerformanceTiming.requestStart')
   @DocsEditable()
-  int get requestStart => _blink.BlinkPerformanceTiming.requestStart_Getter(this);
+  int get requestStart => _blink.BlinkPerformanceTiming.instance.requestStart_Getter_(this);
 
   @DomName('PerformanceTiming.responseEnd')
   @DocsEditable()
-  int get responseEnd => _blink.BlinkPerformanceTiming.responseEnd_Getter(this);
+  int get responseEnd => _blink.BlinkPerformanceTiming.instance.responseEnd_Getter_(this);
 
   @DomName('PerformanceTiming.responseStart')
   @DocsEditable()
-  int get responseStart => _blink.BlinkPerformanceTiming.responseStart_Getter(this);
+  int get responseStart => _blink.BlinkPerformanceTiming.instance.responseStart_Getter_(this);
 
   @DomName('PerformanceTiming.secureConnectionStart')
   @DocsEditable()
-  int get secureConnectionStart => _blink.BlinkPerformanceTiming.secureConnectionStart_Getter(this);
+  int get secureConnectionStart => _blink.BlinkPerformanceTiming.instance.secureConnectionStart_Getter_(this);
 
   @DomName('PerformanceTiming.unloadEventEnd')
   @DocsEditable()
-  int get unloadEventEnd => _blink.BlinkPerformanceTiming.unloadEventEnd_Getter(this);
+  int get unloadEventEnd => _blink.BlinkPerformanceTiming.instance.unloadEventEnd_Getter_(this);
 
   @DomName('PerformanceTiming.unloadEventStart')
   @DocsEditable()
-  int get unloadEventStart => _blink.BlinkPerformanceTiming.unloadEventStart_Getter(this);
+  int get unloadEventStart => _blink.BlinkPerformanceTiming.instance.unloadEventStart_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -25670,31 +25675,31 @@
 
   @DomName('Plugin.description')
   @DocsEditable()
-  String get description => _blink.BlinkPlugin.description_Getter(this);
+  String get description => _blink.BlinkPlugin.instance.description_Getter_(this);
 
   @DomName('Plugin.filename')
   @DocsEditable()
-  String get filename => _blink.BlinkPlugin.filename_Getter(this);
+  String get filename => _blink.BlinkPlugin.instance.filename_Getter_(this);
 
   @DomName('Plugin.length')
   @DocsEditable()
-  int get length => _blink.BlinkPlugin.length_Getter(this);
+  int get length => _blink.BlinkPlugin.instance.length_Getter_(this);
 
   @DomName('Plugin.name')
   @DocsEditable()
-  String get name => _blink.BlinkPlugin.name_Getter(this);
+  String get name => _blink.BlinkPlugin.instance.name_Getter_(this);
 
   @DomName('Plugin.__getter__')
   @DocsEditable()
-  MimeType __getter__(String name) => _blink.BlinkPlugin.$__getter___Callback_1(this, name);
+  MimeType __getter__(String name) => _blink.BlinkPlugin.instance.$__getter___Callback_1_(this, name);
 
   @DomName('Plugin.item')
   @DocsEditable()
-  MimeType item(int index) => _blink.BlinkPlugin.item_Callback_1(this, index);
+  MimeType item(int index) => _blink.BlinkPlugin.instance.item_Callback_1_(this, index);
 
   @DomName('Plugin.namedItem')
   @DocsEditable()
-  MimeType namedItem(String name) => _blink.BlinkPlugin.namedItem_Callback_1(this, name);
+  MimeType namedItem(String name) => _blink.BlinkPlugin.instance.namedItem_Callback_1_(this, name);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -25713,15 +25718,15 @@
 
   @DomName('PluginArray.length')
   @DocsEditable()
-  int get length => _blink.BlinkPluginArray.length_Getter(this);
+  int get length => _blink.BlinkPluginArray.instance.length_Getter_(this);
 
   Plugin operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _blink.BlinkPluginArray.item_Callback_1(this, index);
+    return _blink.BlinkPluginArray.instance.item_Callback_1_(this, index);
   }
 
-  Plugin _nativeIndexedGetter(int index) => _blink.BlinkPluginArray.item_Callback_1(this, index);
+  Plugin _nativeIndexedGetter(int index) => _blink.BlinkPluginArray.instance.item_Callback_1_(this, index);
 
   void operator[]=(int index, Plugin value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -25763,19 +25768,19 @@
 
   @DomName('PluginArray.__getter__')
   @DocsEditable()
-  Plugin __getter__(String name) => _blink.BlinkPluginArray.$__getter___Callback_1(this, name);
+  Plugin __getter__(String name) => _blink.BlinkPluginArray.instance.$__getter___Callback_1_(this, name);
 
   @DomName('PluginArray.item')
   @DocsEditable()
-  Plugin item(int index) => _blink.BlinkPluginArray.item_Callback_1(this, index);
+  Plugin item(int index) => _blink.BlinkPluginArray.instance.item_Callback_1_(this, index);
 
   @DomName('PluginArray.namedItem')
   @DocsEditable()
-  Plugin namedItem(String name) => _blink.BlinkPluginArray.namedItem_Callback_1(this, name);
+  Plugin namedItem(String name) => _blink.BlinkPluginArray.instance.namedItem_Callback_1_(this, name);
 
   @DomName('PluginArray.refresh')
   @DocsEditable()
-  void refresh(bool reload) => _blink.BlinkPluginArray.refresh_Callback_1(this, reload);
+  void refresh(bool reload) => _blink.BlinkPluginArray.instance.refresh_Callback_1_(this, reload);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -25797,7 +25802,7 @@
 
   @DomName('PopStateEvent.state')
   @DocsEditable()
-  Object get state => _blink.BlinkPopStateEvent.state_Getter(this);
+  Object get state => _blink.BlinkPopStateEvent.instance.state_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -25838,11 +25843,11 @@
 
   @DomName('PositionError.code')
   @DocsEditable()
-  int get code => _blink.BlinkPositionError.code_Getter(this);
+  int get code => _blink.BlinkPositionError.instance.code_Getter_(this);
 
   @DomName('PositionError.message')
   @DocsEditable()
-  String get message => _blink.BlinkPositionError.message_Getter(this);
+  String get message => _blink.BlinkPositionError.instance.message_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -25896,11 +25901,11 @@
   @DomName('ProcessingInstruction.sheet')
   @DocsEditable()
   @Experimental() // non-standard
-  StyleSheet get sheet => _blink.BlinkProcessingInstruction.sheet_Getter(this);
+  StyleSheet get sheet => _blink.BlinkProcessingInstruction.instance.sheet_Getter_(this);
 
   @DomName('ProcessingInstruction.target')
   @DocsEditable()
-  String get target => _blink.BlinkProcessingInstruction.target_Getter(this);
+  String get target => _blink.BlinkProcessingInstruction.instance.target_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -25936,27 +25941,27 @@
   @DomName('HTMLProgressElement.labels')
   @DocsEditable()
   @Unstable()
-  List<Node> get labels => _blink.BlinkHTMLProgressElement.labels_Getter(this);
+  List<Node> get labels => _blink.BlinkHTMLProgressElement.instance.labels_Getter_(this);
 
   @DomName('HTMLProgressElement.max')
   @DocsEditable()
-  num get max => _blink.BlinkHTMLProgressElement.max_Getter(this);
+  num get max => _blink.BlinkHTMLProgressElement.instance.max_Getter_(this);
 
   @DomName('HTMLProgressElement.max')
   @DocsEditable()
-  void set max(num value) => _blink.BlinkHTMLProgressElement.max_Setter(this, value);
+  void set max(num value) => _blink.BlinkHTMLProgressElement.instance.max_Setter_(this, value);
 
   @DomName('HTMLProgressElement.position')
   @DocsEditable()
-  double get position => _blink.BlinkHTMLProgressElement.position_Getter(this);
+  double get position => _blink.BlinkHTMLProgressElement.instance.position_Getter_(this);
 
   @DomName('HTMLProgressElement.value')
   @DocsEditable()
-  num get value => _blink.BlinkHTMLProgressElement.value_Getter(this);
+  num get value => _blink.BlinkHTMLProgressElement.instance.value_Getter_(this);
 
   @DomName('HTMLProgressElement.value')
   @DocsEditable()
-  void set value(num value) => _blink.BlinkHTMLProgressElement.value_Setter(this, value);
+  void set value(num value) => _blink.BlinkHTMLProgressElement.instance.value_Setter_(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -25974,15 +25979,15 @@
 
   @DomName('ProgressEvent.lengthComputable')
   @DocsEditable()
-  bool get lengthComputable => _blink.BlinkProgressEvent.lengthComputable_Getter(this);
+  bool get lengthComputable => _blink.BlinkProgressEvent.instance.lengthComputable_Getter_(this);
 
   @DomName('ProgressEvent.loaded')
   @DocsEditable()
-  int get loaded => _blink.BlinkProgressEvent.loaded_Getter(this);
+  int get loaded => _blink.BlinkProgressEvent.instance.loaded_Getter_(this);
 
   @DomName('ProgressEvent.total')
   @DocsEditable()
-  int get total => _blink.BlinkProgressEvent.total_Getter(this);
+  int get total => _blink.BlinkProgressEvent.instance.total_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -26002,7 +26007,7 @@
   @DomName('PushEvent.data')
   @DocsEditable()
   @Experimental() // untriaged
-  String get data => _blink.BlinkPushEvent.data_Getter(this);
+  String get data => _blink.BlinkPushEvent.instance.data_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -26022,7 +26027,7 @@
   @DomName('PushManager.register')
   @DocsEditable()
   @Experimental() // untriaged
-  Future register(String senderId) => _blink.BlinkPushManager.register_Callback_1(this, senderId);
+  Future register(String senderId) => _blink.BlinkPushManager.instance.register_Callback_1_(this, senderId);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -26042,12 +26047,12 @@
   @DomName('PushRegistration.pushEndpoint')
   @DocsEditable()
   @Experimental() // untriaged
-  String get pushEndpoint => _blink.BlinkPushRegistration.pushEndpoint_Getter(this);
+  String get pushEndpoint => _blink.BlinkPushRegistration.instance.pushEndpoint_Getter_(this);
 
   @DomName('PushRegistration.pushRegistrationId')
   @DocsEditable()
   @Experimental() // untriaged
-  String get pushRegistrationId => _blink.BlinkPushRegistration.pushRegistrationId_Getter(this);
+  String get pushRegistrationId => _blink.BlinkPushRegistration.instance.pushRegistrationId_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -26075,11 +26080,11 @@
 
   @DomName('HTMLQuoteElement.cite')
   @DocsEditable()
-  String get cite => _blink.BlinkHTMLQuoteElement.cite_Getter(this);
+  String get cite => _blink.BlinkHTMLQuoteElement.instance.cite_Getter_(this);
 
   @DomName('HTMLQuoteElement.cite')
   @DocsEditable()
-  void set cite(String value) => _blink.BlinkHTMLQuoteElement.cite_Setter(this, value);
+  void set cite(String value) => _blink.BlinkHTMLQuoteElement.instance.cite_Setter_(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -26170,121 +26175,121 @@
 
   @DomName('Range.collapsed')
   @DocsEditable()
-  bool get collapsed => _blink.BlinkRange.collapsed_Getter(this);
+  bool get collapsed => _blink.BlinkRange.instance.collapsed_Getter_(this);
 
   @DomName('Range.commonAncestorContainer')
   @DocsEditable()
-  Node get commonAncestorContainer => _blink.BlinkRange.commonAncestorContainer_Getter(this);
+  Node get commonAncestorContainer => _blink.BlinkRange.instance.commonAncestorContainer_Getter_(this);
 
   @DomName('Range.endContainer')
   @DocsEditable()
-  Node get endContainer => _blink.BlinkRange.endContainer_Getter(this);
+  Node get endContainer => _blink.BlinkRange.instance.endContainer_Getter_(this);
 
   @DomName('Range.endOffset')
   @DocsEditable()
-  int get endOffset => _blink.BlinkRange.endOffset_Getter(this);
+  int get endOffset => _blink.BlinkRange.instance.endOffset_Getter_(this);
 
   @DomName('Range.startContainer')
   @DocsEditable()
-  Node get startContainer => _blink.BlinkRange.startContainer_Getter(this);
+  Node get startContainer => _blink.BlinkRange.instance.startContainer_Getter_(this);
 
   @DomName('Range.startOffset')
   @DocsEditable()
-  int get startOffset => _blink.BlinkRange.startOffset_Getter(this);
+  int get startOffset => _blink.BlinkRange.instance.startOffset_Getter_(this);
 
   @DomName('Range.cloneContents')
   @DocsEditable()
-  DocumentFragment cloneContents() => _blink.BlinkRange.cloneContents_Callback(this);
+  DocumentFragment cloneContents() => _blink.BlinkRange.instance.cloneContents_Callback_0_(this);
 
   @DomName('Range.cloneRange')
   @DocsEditable()
-  Range cloneRange() => _blink.BlinkRange.cloneRange_Callback(this);
+  Range cloneRange() => _blink.BlinkRange.instance.cloneRange_Callback_0_(this);
 
   void collapse([bool toStart]) {
     if (toStart != null) {
-      _blink.BlinkRange.collapse_Callback_1(this, toStart);
+      _blink.BlinkRange.instance.collapse_Callback_1_(this, toStart);
       return;
     }
-    _blink.BlinkRange.collapse_Callback(this);
+    _blink.BlinkRange.instance.collapse_Callback_0_(this);
     return;
   }
 
   @DomName('Range.comparePoint')
   @DocsEditable()
-  int comparePoint(Node refNode, int offset) => _blink.BlinkRange.comparePoint_Callback_2(this, refNode, offset);
+  int comparePoint(Node refNode, int offset) => _blink.BlinkRange.instance.comparePoint_Callback_2_(this, refNode, offset);
 
   @DomName('Range.createContextualFragment')
   @DocsEditable()
-  DocumentFragment createContextualFragment(String html) => _blink.BlinkRange.createContextualFragment_Callback_1(this, html);
+  DocumentFragment createContextualFragment(String html) => _blink.BlinkRange.instance.createContextualFragment_Callback_1_(this, html);
 
   @DomName('Range.deleteContents')
   @DocsEditable()
-  void deleteContents() => _blink.BlinkRange.deleteContents_Callback(this);
+  void deleteContents() => _blink.BlinkRange.instance.deleteContents_Callback_0_(this);
 
   @DomName('Range.detach')
   @DocsEditable()
-  void detach() => _blink.BlinkRange.detach_Callback(this);
+  void detach() => _blink.BlinkRange.instance.detach_Callback_0_(this);
 
   @DomName('Range.expand')
   @DocsEditable()
   @Experimental() // non-standard
-  void expand(String unit) => _blink.BlinkRange.expand_Callback_1(this, unit);
+  void expand(String unit) => _blink.BlinkRange.instance.expand_Callback_1_(this, unit);
 
   @DomName('Range.extractContents')
   @DocsEditable()
-  DocumentFragment extractContents() => _blink.BlinkRange.extractContents_Callback(this);
+  DocumentFragment extractContents() => _blink.BlinkRange.instance.extractContents_Callback_0_(this);
 
   @DomName('Range.getBoundingClientRect')
   @DocsEditable()
-  Rectangle getBoundingClientRect() => _blink.BlinkRange.getBoundingClientRect_Callback(this);
+  Rectangle getBoundingClientRect() => _blink.BlinkRange.instance.getBoundingClientRect_Callback_0_(this);
 
   @DomName('Range.getClientRects')
   @DocsEditable()
-  List<Rectangle> getClientRects() => _blink.BlinkRange.getClientRects_Callback(this);
+  List<Rectangle> getClientRects() => _blink.BlinkRange.instance.getClientRects_Callback_0_(this);
 
   @DomName('Range.insertNode')
   @DocsEditable()
-  void insertNode(Node newNode) => _blink.BlinkRange.insertNode_Callback_1(this, newNode);
+  void insertNode(Node newNode) => _blink.BlinkRange.instance.insertNode_Callback_1_(this, newNode);
 
   @DomName('Range.isPointInRange')
   @DocsEditable()
-  bool isPointInRange(Node refNode, int offset) => _blink.BlinkRange.isPointInRange_Callback_2(this, refNode, offset);
+  bool isPointInRange(Node refNode, int offset) => _blink.BlinkRange.instance.isPointInRange_Callback_2_(this, refNode, offset);
 
   @DomName('Range.selectNode')
   @DocsEditable()
-  void selectNode(Node refNode) => _blink.BlinkRange.selectNode_Callback_1(this, refNode);
+  void selectNode(Node refNode) => _blink.BlinkRange.instance.selectNode_Callback_1_(this, refNode);
 
   @DomName('Range.selectNodeContents')
   @DocsEditable()
-  void selectNodeContents(Node refNode) => _blink.BlinkRange.selectNodeContents_Callback_1(this, refNode);
+  void selectNodeContents(Node refNode) => _blink.BlinkRange.instance.selectNodeContents_Callback_1_(this, refNode);
 
   @DomName('Range.setEnd')
   @DocsEditable()
-  void setEnd(Node refNode, int offset) => _blink.BlinkRange.setEnd_Callback_2(this, refNode, offset);
+  void setEnd(Node refNode, int offset) => _blink.BlinkRange.instance.setEnd_Callback_2_(this, refNode, offset);
 
   @DomName('Range.setEndAfter')
   @DocsEditable()
-  void setEndAfter(Node refNode) => _blink.BlinkRange.setEndAfter_Callback_1(this, refNode);
+  void setEndAfter(Node refNode) => _blink.BlinkRange.instance.setEndAfter_Callback_1_(this, refNode);
 
   @DomName('Range.setEndBefore')
   @DocsEditable()
-  void setEndBefore(Node refNode) => _blink.BlinkRange.setEndBefore_Callback_1(this, refNode);
+  void setEndBefore(Node refNode) => _blink.BlinkRange.instance.setEndBefore_Callback_1_(this, refNode);
 
   @DomName('Range.setStart')
   @DocsEditable()
-  void setStart(Node refNode, int offset) => _blink.BlinkRange.setStart_Callback_2(this, refNode, offset);
+  void setStart(Node refNode, int offset) => _blink.BlinkRange.instance.setStart_Callback_2_(this, refNode, offset);
 
   @DomName('Range.setStartAfter')
   @DocsEditable()
-  void setStartAfter(Node refNode) => _blink.BlinkRange.setStartAfter_Callback_1(this, refNode);
+  void setStartAfter(Node refNode) => _blink.BlinkRange.instance.setStartAfter_Callback_1_(this, refNode);
 
   @DomName('Range.setStartBefore')
   @DocsEditable()
-  void setStartBefore(Node refNode) => _blink.BlinkRange.setStartBefore_Callback_1(this, refNode);
+  void setStartBefore(Node refNode) => _blink.BlinkRange.instance.setStartBefore_Callback_1_(this, refNode);
 
   @DomName('Range.surroundContents')
   @DocsEditable()
-  void surroundContents(Node newParent) => _blink.BlinkRange.surroundContents_Callback_1(this, newParent);
+  void surroundContents(Node newParent) => _blink.BlinkRange.instance.surroundContents_Callback_1_(this, newParent);
 
 
   /**
@@ -26328,7 +26333,7 @@
   @DomName('RelatedEvent.relatedTarget')
   @DocsEditable()
   @Experimental() // untriaged
-  EventTarget get relatedTarget => _blink.BlinkRelatedEvent.relatedTarget_Getter(this);
+  EventTarget get relatedTarget => _blink.BlinkRelatedEvent.instance.relatedTarget_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -26357,7 +26362,7 @@
 
   @DomName('ResourceProgressEvent.url')
   @DocsEditable()
-  String get url => _blink.BlinkResourceProgressEvent.url_Getter(this);
+  String get url => _blink.BlinkResourceProgressEvent.instance.url_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -26417,77 +26422,77 @@
 
   @DomName('RTCDataChannel.binaryType')
   @DocsEditable()
-  String get binaryType => _blink.BlinkRTCDataChannel.binaryType_Getter(this);
+  String get binaryType => _blink.BlinkRTCDataChannel.instance.binaryType_Getter_(this);
 
   @DomName('RTCDataChannel.binaryType')
   @DocsEditable()
-  void set binaryType(String value) => _blink.BlinkRTCDataChannel.binaryType_Setter(this, value);
+  void set binaryType(String value) => _blink.BlinkRTCDataChannel.instance.binaryType_Setter_(this, value);
 
   @DomName('RTCDataChannel.bufferedAmount')
   @DocsEditable()
-  int get bufferedAmount => _blink.BlinkRTCDataChannel.bufferedAmount_Getter(this);
+  int get bufferedAmount => _blink.BlinkRTCDataChannel.instance.bufferedAmount_Getter_(this);
 
   @DomName('RTCDataChannel.id')
   @DocsEditable()
   @Experimental() // untriaged
-  int get id => _blink.BlinkRTCDataChannel.id_Getter(this);
+  int get id => _blink.BlinkRTCDataChannel.instance.id_Getter_(this);
 
   @DomName('RTCDataChannel.label')
   @DocsEditable()
-  String get label => _blink.BlinkRTCDataChannel.label_Getter(this);
+  String get label => _blink.BlinkRTCDataChannel.instance.label_Getter_(this);
 
   @DomName('RTCDataChannel.maxRetransmitTime')
   @DocsEditable()
   @Experimental() // untriaged
-  int get maxRetransmitTime => _blink.BlinkRTCDataChannel.maxRetransmitTime_Getter(this);
+  int get maxRetransmitTime => _blink.BlinkRTCDataChannel.instance.maxRetransmitTime_Getter_(this);
 
   @DomName('RTCDataChannel.maxRetransmits')
   @DocsEditable()
   @Experimental() // untriaged
-  int get maxRetransmits => _blink.BlinkRTCDataChannel.maxRetransmits_Getter(this);
+  int get maxRetransmits => _blink.BlinkRTCDataChannel.instance.maxRetransmits_Getter_(this);
 
   @DomName('RTCDataChannel.negotiated')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get negotiated => _blink.BlinkRTCDataChannel.negotiated_Getter(this);
+  bool get negotiated => _blink.BlinkRTCDataChannel.instance.negotiated_Getter_(this);
 
   @DomName('RTCDataChannel.ordered')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get ordered => _blink.BlinkRTCDataChannel.ordered_Getter(this);
+  bool get ordered => _blink.BlinkRTCDataChannel.instance.ordered_Getter_(this);
 
   @DomName('RTCDataChannel.protocol')
   @DocsEditable()
   @Experimental() // untriaged
-  String get protocol => _blink.BlinkRTCDataChannel.protocol_Getter(this);
+  String get protocol => _blink.BlinkRTCDataChannel.instance.protocol_Getter_(this);
 
   @DomName('RTCDataChannel.readyState')
   @DocsEditable()
-  String get readyState => _blink.BlinkRTCDataChannel.readyState_Getter(this);
+  String get readyState => _blink.BlinkRTCDataChannel.instance.readyState_Getter_(this);
 
   @DomName('RTCDataChannel.reliable')
   @DocsEditable()
-  bool get reliable => _blink.BlinkRTCDataChannel.reliable_Getter(this);
+  bool get reliable => _blink.BlinkRTCDataChannel.instance.reliable_Getter_(this);
 
   @DomName('RTCDataChannel.close')
   @DocsEditable()
-  void close() => _blink.BlinkRTCDataChannel.close_Callback(this);
+  void close() => _blink.BlinkRTCDataChannel.instance.close_Callback_0_(this);
 
   void send(data) {
     if ((data is String || data == null)) {
-      _blink.BlinkRTCDataChannel.send_Callback_1(this, data);
+      _blink.BlinkRTCDataChannel.instance.send_Callback_1_(this, data);
       return;
     }
     if ((data is Blob || data == null)) {
-      _blink.BlinkRTCDataChannel.send_Callback_1(this, data);
+      _blink.BlinkRTCDataChannel.instance.send_Callback_1_(this, data);
       return;
     }
     if ((data is TypedData || data == null)) {
-      _blink.BlinkRTCDataChannel.send_Callback_1(this, data);
+      _blink.BlinkRTCDataChannel.instance.send_Callback_1_(this, data);
       return;
     }
     if ((data is ByteBuffer || data == null)) {
-      _blink.BlinkRTCDataChannel.send_Callback_1(this, data);
+      _blink.BlinkRTCDataChannel.instance.send_Callback_1_(this, data);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -26495,19 +26500,19 @@
 
   @DomName('RTCDataChannel.sendBlob')
   @DocsEditable()
-  void sendBlob(Blob data) => _blink.BlinkRTCDataChannel.send_Callback_1(this, data);
+  void sendBlob(Blob data) => _blink.BlinkRTCDataChannel.instance.send_Callback_1_(this, data);
 
   @DomName('RTCDataChannel.sendByteBuffer')
   @DocsEditable()
-  void sendByteBuffer(ByteBuffer data) => _blink.BlinkRTCDataChannel.send_Callback_1(this, data);
+  void sendByteBuffer(ByteBuffer data) => _blink.BlinkRTCDataChannel.instance.send_Callback_1_(this, data);
 
   @DomName('RTCDataChannel.sendString')
   @DocsEditable()
-  void sendString(String data) => _blink.BlinkRTCDataChannel.send_Callback_1(this, data);
+  void sendString(String data) => _blink.BlinkRTCDataChannel.instance.send_Callback_1_(this, data);
 
   @DomName('RTCDataChannel.sendTypedData')
   @DocsEditable()
-  void sendTypedData(TypedData data) => _blink.BlinkRTCDataChannel.send_Callback_1(this, data);
+  void sendTypedData(TypedData data) => _blink.BlinkRTCDataChannel.instance.send_Callback_1_(this, data);
 
   /// Stream of `close` events handled by this [RtcDataChannel].
   @DomName('RTCDataChannel.onclose')
@@ -26547,7 +26552,7 @@
 
   @DomName('RTCDataChannelEvent.channel')
   @DocsEditable()
-  RtcDataChannel get channel => _blink.BlinkRTCDataChannelEvent.channel_Getter(this);
+  RtcDataChannel get channel => _blink.BlinkRTCDataChannelEvent.instance.channel_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -26577,34 +26582,34 @@
 
   @DomName('RTCDTMFSender.canInsertDTMF')
   @DocsEditable()
-  bool get canInsertDtmf => _blink.BlinkRTCDTMFSender.canInsertDTMF_Getter(this);
+  bool get canInsertDtmf => _blink.BlinkRTCDTMFSender.instance.canInsertDTMF_Getter_(this);
 
   @DomName('RTCDTMFSender.duration')
   @DocsEditable()
-  int get duration => _blink.BlinkRTCDTMFSender.duration_Getter(this);
+  int get duration => _blink.BlinkRTCDTMFSender.instance.duration_Getter_(this);
 
   @DomName('RTCDTMFSender.interToneGap')
   @DocsEditable()
-  int get interToneGap => _blink.BlinkRTCDTMFSender.interToneGap_Getter(this);
+  int get interToneGap => _blink.BlinkRTCDTMFSender.instance.interToneGap_Getter_(this);
 
   @DomName('RTCDTMFSender.toneBuffer')
   @DocsEditable()
-  String get toneBuffer => _blink.BlinkRTCDTMFSender.toneBuffer_Getter(this);
+  String get toneBuffer => _blink.BlinkRTCDTMFSender.instance.toneBuffer_Getter_(this);
 
   @DomName('RTCDTMFSender.track')
   @DocsEditable()
-  MediaStreamTrack get track => _blink.BlinkRTCDTMFSender.track_Getter(this);
+  MediaStreamTrack get track => _blink.BlinkRTCDTMFSender.instance.track_Getter_(this);
 
   void insertDtmf(String tones, [int duration, int interToneGap]) {
     if (interToneGap != null) {
-      _blink.BlinkRTCDTMFSender.insertDTMF_Callback_3(this, tones, duration, interToneGap);
+      _blink.BlinkRTCDTMFSender.instance.insertDTMF_Callback_3_(this, tones, duration, interToneGap);
       return;
     }
     if (duration != null) {
-      _blink.BlinkRTCDTMFSender.insertDTMF_Callback_2(this, tones, duration);
+      _blink.BlinkRTCDTMFSender.instance.insertDTMF_Callback_2_(this, tones, duration);
       return;
     }
-    _blink.BlinkRTCDTMFSender.insertDTMF_Callback_1(this, tones);
+    _blink.BlinkRTCDTMFSender.instance.insertDTMF_Callback_1_(this, tones);
     return;
   }
 
@@ -26631,7 +26636,7 @@
 
   @DomName('RTCDTMFToneChangeEvent.tone')
   @DocsEditable()
-  String get tone => _blink.BlinkRTCDTMFToneChangeEvent.tone_Getter(this);
+  String get tone => _blink.BlinkRTCDTMFToneChangeEvent.instance.tone_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -26653,32 +26658,32 @@
   @DomName('RTCIceCandidate.RTCIceCandidate')
   @DocsEditable()
   factory RtcIceCandidate(Map dictionary) {
-    return _blink.BlinkRTCIceCandidate.constructorCallback_1(dictionary);
+    return _blink.BlinkRTCIceCandidate.instance.constructorCallback_1_(dictionary);
   }
 
   @DomName('RTCIceCandidate.candidate')
   @DocsEditable()
-  String get candidate => _blink.BlinkRTCIceCandidate.candidate_Getter(this);
+  String get candidate => _blink.BlinkRTCIceCandidate.instance.candidate_Getter_(this);
 
   @DomName('RTCIceCandidate.candidate')
   @DocsEditable()
-  void set candidate(String value) => _blink.BlinkRTCIceCandidate.candidate_Setter(this, value);
+  void set candidate(String value) => _blink.BlinkRTCIceCandidate.instance.candidate_Setter_(this, value);
 
   @DomName('RTCIceCandidate.sdpMLineIndex')
   @DocsEditable()
-  int get sdpMLineIndex => _blink.BlinkRTCIceCandidate.sdpMLineIndex_Getter(this);
+  int get sdpMLineIndex => _blink.BlinkRTCIceCandidate.instance.sdpMLineIndex_Getter_(this);
 
   @DomName('RTCIceCandidate.sdpMLineIndex')
   @DocsEditable()
-  void set sdpMLineIndex(int value) => _blink.BlinkRTCIceCandidate.sdpMLineIndex_Setter(this, value);
+  void set sdpMLineIndex(int value) => _blink.BlinkRTCIceCandidate.instance.sdpMLineIndex_Setter_(this, value);
 
   @DomName('RTCIceCandidate.sdpMid')
   @DocsEditable()
-  String get sdpMid => _blink.BlinkRTCIceCandidate.sdpMid_Getter(this);
+  String get sdpMid => _blink.BlinkRTCIceCandidate.instance.sdpMid_Getter_(this);
 
   @DomName('RTCIceCandidate.sdpMid')
   @DocsEditable()
-  void set sdpMid(String value) => _blink.BlinkRTCIceCandidate.sdpMid_Setter(this, value);
+  void set sdpMid(String value) => _blink.BlinkRTCIceCandidate.instance.sdpMid_Setter_(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -26698,7 +26703,7 @@
 
   @DomName('RTCIceCandidateEvent.candidate')
   @DocsEditable()
-  RtcIceCandidate get candidate => _blink.BlinkRTCIceCandidateEvent.candidate_Getter(this);
+  RtcIceCandidate get candidate => _blink.BlinkRTCIceCandidateEvent.instance.candidate_Getter_(this);
 
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -26816,100 +26821,100 @@
   @DocsEditable()
   factory RtcPeerConnection(Map rtcConfiguration, [Map mediaConstraints]) {
     if (mediaConstraints != null) {
-      return _blink.BlinkRTCPeerConnection.constructorCallback_2(rtcConfiguration, mediaConstraints);
+      return _blink.BlinkRTCPeerConnection.instance.constructorCallback_2_(rtcConfiguration, mediaConstraints);
     }
-    return _blink.BlinkRTCPeerConnection.constructorCallback_1(rtcConfiguration);
+    return _blink.BlinkRTCPeerConnection.instance.constructorCallback_1_(rtcConfiguration);
   }
 
   @DomName('RTCPeerConnection.iceConnectionState')
   @DocsEditable()
-  String get iceConnectionState => _blink.BlinkRTCPeerConnection.iceConnectionState_Getter(this);
+  String get iceConnectionState => _blink.BlinkRTCPeerConnection.instance.iceConnectionState_Getter_(this);
 
   @DomName('RTCPeerConnection.iceGatheringState')
   @DocsEditable()
-  String get iceGatheringState => _blink.BlinkRTCPeerConnection.iceGatheringState_Getter(this);
+  String get iceGatheringState => _blink.BlinkRTCPeerConnection.instance.iceGatheringState_Getter_(this);
 
   @DomName('RTCPeerConnection.localDescription')
   @DocsEditable()
-  RtcSessionDescription get localDescription => _blink.BlinkRTCPeerConnection.localDescription_Getter(this);
+  RtcSessionDescription get localDescription => _blink.BlinkRTCPeerConnection.instance.localDescription_Getter_(this);
 
   @DomName('RTCPeerConnection.remoteDescription')
   @DocsEditable()
-  RtcSessionDescription get remoteDescription => _blink.BlinkRTCPeerConnection.remoteDescription_Getter(this);
+  RtcSessionDescription get remoteDescription => _blink.BlinkRTCPeerConnection.instance.remoteDescription_Getter_(this);
 
   @DomName('RTCPeerConnection.signalingState')
   @DocsEditable()
-  String get signalingState => _blink.BlinkRTCPeerConnection.signalingState_Getter(this);
+  String get signalingState => _blink.BlinkRTCPeerConnection.instance.signalingState_Getter_(this);
 
   @DomName('RTCPeerConnection.addIceCandidate')
   @DocsEditable()
-  void addIceCandidate(RtcIceCandidate candidate, VoidCallback successCallback, _RtcErrorCallback failureCallback) => _blink.BlinkRTCPeerConnection.addIceCandidate_Callback_3(this, candidate, successCallback, failureCallback);
+  void addIceCandidate(RtcIceCandidate candidate, VoidCallback successCallback, _RtcErrorCallback failureCallback) => _blink.BlinkRTCPeerConnection.instance.addIceCandidate_Callback_3_(this, candidate, successCallback, failureCallback);
 
   void addStream(MediaStream stream, [Map mediaConstraints]) {
     if (mediaConstraints != null) {
-      _blink.BlinkRTCPeerConnection.addStream_Callback_2(this, stream, mediaConstraints);
+      _blink.BlinkRTCPeerConnection.instance.addStream_Callback_2_(this, stream, mediaConstraints);
       return;
     }
-    _blink.BlinkRTCPeerConnection.addStream_Callback_1(this, stream);
+    _blink.BlinkRTCPeerConnection.instance.addStream_Callback_1_(this, stream);
     return;
   }
 
   @DomName('RTCPeerConnection.close')
   @DocsEditable()
-  void close() => _blink.BlinkRTCPeerConnection.close_Callback(this);
+  void close() => _blink.BlinkRTCPeerConnection.instance.close_Callback_0_(this);
 
   void _createAnswer(_RtcSessionDescriptionCallback successCallback, [_RtcErrorCallback failureCallback, Map mediaConstraints]) {
     if (mediaConstraints != null) {
-      _blink.BlinkRTCPeerConnection.createAnswer_Callback_3(this, successCallback, failureCallback, mediaConstraints);
+      _blink.BlinkRTCPeerConnection.instance.createAnswer_Callback_3_(this, successCallback, failureCallback, mediaConstraints);
       return;
     }
-    _blink.BlinkRTCPeerConnection.createAnswer_Callback_2(this, successCallback, failureCallback);
+    _blink.BlinkRTCPeerConnection.instance.createAnswer_Callback_2_(this, successCallback, failureCallback);
     return;
   }
 
   @DomName('RTCPeerConnection.createDTMFSender')
   @DocsEditable()
-  RtcDtmfSender createDtmfSender(MediaStreamTrack track) => _blink.BlinkRTCPeerConnection.createDTMFSender_Callback_1(this, track);
+  RtcDtmfSender createDtmfSender(MediaStreamTrack track) => _blink.BlinkRTCPeerConnection.instance.createDTMFSender_Callback_1_(this, track);
 
   RtcDataChannel createDataChannel(String label, [Map options]) {
     if (options != null) {
-      return _blink.BlinkRTCPeerConnection.createDataChannel_Callback_2(this, label, options);
+      return _blink.BlinkRTCPeerConnection.instance.createDataChannel_Callback_2_(this, label, options);
     }
-    return _blink.BlinkRTCPeerConnection.createDataChannel_Callback_1(this, label);
+    return _blink.BlinkRTCPeerConnection.instance.createDataChannel_Callback_1_(this, label);
   }
 
   void _createOffer(_RtcSessionDescriptionCallback successCallback, [_RtcErrorCallback failureCallback, Map rtcOfferOptions]) {
     if (rtcOfferOptions != null) {
-      _blink.BlinkRTCPeerConnection.createOffer_Callback_3(this, successCallback, failureCallback, rtcOfferOptions);
+      _blink.BlinkRTCPeerConnection.instance.createOffer_Callback_3_(this, successCallback, failureCallback, rtcOfferOptions);
       return;
     }
-    _blink.BlinkRTCPeerConnection.createOffer_Callback_2(this, successCallback, failureCallback);
+    _blink.BlinkRTCPeerConnection.instance.createOffer_Callback_2_(this, successCallback, failureCallback);
     return;
   }
 
   @DomName('RTCPeerConnection.getLocalStreams')
   @DocsEditable()
-  List<MediaStream> getLocalStreams() => _blink.BlinkRTCPeerConnection.getLocalStreams_Callback(this);
+  List<MediaStream> getLocalStreams() => _blink.BlinkRTCPeerConnection.instance.getLocalStreams_Callback_0_(this);
 
   @DomName('RTCPeerConnection.getRemoteStreams')
   @DocsEditable()
-  List<MediaStream> getRemoteStreams() => _blink.BlinkRTCPeerConnection.getRemoteStreams_Callback(this);
+  List<MediaStream> getRemoteStreams() => _blink.BlinkRTCPeerConnection.instance.getRemoteStreams_Callback_0_(this);
 
   @DomName('RTCPeerConnection.getStats')
   @DocsEditable()
-  void _getStats(RtcStatsCallback successCallback, MediaStreamTrack selector) => _blink.BlinkRTCPeerConnection.getStats_Callback_2(this, successCallback, selector);
+  void _getStats(RtcStatsCallback successCallback, MediaStreamTrack selector) => _blink.BlinkRTCPeerConnection.instance.getStats_Callback_2_(this, successCallback, selector);
 
   @DomName('RTCPeerConnection.getStreamById')
   @DocsEditable()
-  MediaStream getStreamById(String streamId) => _blink.BlinkRTCPeerConnection.getStreamById_Callback_1(this, streamId);
+  MediaStream getStreamById(String streamId) => _blink.BlinkRTCPeerConnection.instance.getStreamById_Callback_1_(this, streamId);
 
   @DomName('RTCPeerConnection.removeStream')
   @DocsEditable()
-  void removeStream(MediaStream stream) => _blink.BlinkRTCPeerConnection.removeStream_Callback_1(this, stream);
+  void removeStream(MediaStream stream) => _blink.BlinkRTCPeerConnection.instance.removeStream_Callback_1_(this, stream);
 
   @DomName('RTCPeerConnection.setLocalDescription')
   @DocsEditable()
-  void _setLocalDescription(RtcSessionDescription description, [VoidCallback successCallback, _RtcErrorCallback failureCallback]) => _blink.BlinkRTCPeerConnection.setLocalDescription_Callback_3(this, description, successCallback, failureCallback);
+  void _setLocalDescription(RtcSessionDescription description, [VoidCallback successCallback, _RtcErrorCallback failureCallback]) => _blink.BlinkRTCPeerConnection.instance.setLocalDescription_Callback_3_(this, description, successCallback, failureCallback);
 
   Future setLocalDescription(RtcSessionDescription description) {
     var completer = new Completer();
@@ -26921,7 +26926,7 @@
 
   @DomName('RTCPeerConnection.setRemoteDescription')
   @DocsEditable()
-  void _setRemoteDescription(RtcSessionDescription description, [VoidCallback successCallback, _RtcErrorCallback failureCallback]) => _blink.BlinkRTCPeerConnection.setRemoteDescription_Callback_3(this, description, successCallback, failureCallback);
+  void _setRemoteDescription(RtcSessionDescription description, [VoidCallback successCallback, _RtcErrorCallback failureCallback]) => _blink.BlinkRTCPeerConnection.instance.setRemoteDescription_Callback_3_(this, description, successCallback, failureCallback);
 
   Future setRemoteDescription(RtcSessionDescription description) {
     var completer = new Completer();
@@ -26933,14 +26938,14 @@
 
   void updateIce([Map configuration, Map mediaConstraints]) {
     if (mediaConstraints != null) {
-      _blink.BlinkRTCPeerConnection.updateIce_Callback_2(this, configuration, mediaConstraints);
+      _blink.BlinkRTCPeerConnection.instance.updateIce_Callback_2_(this, configuration, mediaConstraints);
       return;
     }
     if (configuration != null) {
-      _blink.BlinkRTCPeerConnection.updateIce_Callback_1(this, configuration);
+      _blink.BlinkRTCPeerConnection.instance.updateIce_Callback_1_(this, configuration);
       return;
     }
-    _blink.BlinkRTCPeerConnection.updateIce_Callback(this);
+    _blink.BlinkRTCPeerConnection.instance.updateIce_Callback_0_(this);
     return;
   }
 
@@ -27000,26 +27005,26 @@
   @DocsEditable()
   factory RtcSessionDescription([Map descriptionInitDict]) {
     if (descriptionInitDict != null) {
-      return _blink.BlinkRTCSessionDescription.constructorCallback_1(descriptionInitDict);
+      return _blink.BlinkRTCSessionDescription.instance.constructorCallback_1_(descriptionInitDict);
     }
-    return _blink.BlinkRTCSessionDescription.constructorCallback();
+    return _blink.BlinkRTCSessionDescription.instance.constructorCallback_0_();
   }
 
   @DomName('RTCSessionDescription.sdp')
   @DocsEditable()
-  String get sdp => _blink.BlinkRTCSessionDescription.sdp_Getter(this);
+  String get sdp => _blink.BlinkRTCSessionDescription.instance.sdp_Getter_(this);
 
   @DomName('RTCSessionDescription.sdp')
   @DocsEditable()
-  void set sdp(String value) => _blink.BlinkRTCSessionDescription.sdp_Setter(this, value);
+  void set sdp(String value) => _blink.BlinkRTCSessionDescription.instance.sdp_Setter_(this, value);
 
   @DomName('RTCSessionDescription.type')
   @DocsEditable()
-  String get type => _blink.BlinkRTCSessionDescription.type_Getter(this);
+  String get type => _blink.BlinkRTCSessionDescription.instance.type_Getter_(this);
 
   @DomName('RTCSessionDescription.type')
   @DocsEditable()
-  void set type(String value) => _blink.BlinkRTCSessionDescription.type_Setter(this, value);
+  void set type(String value) => _blink.BlinkRTCSessionDescription.instance.type_Setter_(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -27039,31 +27044,31 @@
 
   @DomName('RTCStatsReport.id')
   @DocsEditable()
-  String get id => _blink.BlinkRTCStatsReport.id_Getter(this);
+  String get id => _blink.BlinkRTCStatsReport.instance.id_Getter_(this);
 
   @DomName('RTCStatsReport.local')
   @DocsEditable()
-  RtcStatsReport get local => _blink.BlinkRTCStatsReport.local_Getter(this);
+  RtcStatsReport get local => _blink.BlinkRTCStatsReport.instance.local_Getter_(this);
 
   @DomName('RTCStatsReport.remote')
   @DocsEditable()
-  RtcStatsReport get remote => _blink.BlinkRTCStatsReport.remote_Getter(this);
+  RtcStatsReport get remote => _blink.BlinkRTCStatsReport.instance.remote_Getter_(this);
 
   @DomName('RTCStatsReport.timestamp')
   @DocsEditable()
-  DateTime get timestamp => _blink.BlinkRTCStatsReport.timestamp_Getter(this);
+  DateTime get timestamp => _blink.BlinkRTCStatsReport.instance.timestamp_Getter_(this);
 
   @DomName('RTCStatsReport.type')
   @DocsEditable()
-  String get type => _blink.BlinkRTCStatsReport.type_Getter(this);
+  String get type => _blink.BlinkRTCStatsReport.instance.type_Getter_(this);
 
   @DomName('RTCStatsReport.names')
   @DocsEditable()
-  List<String> names() => _blink.BlinkRTCStatsReport.names_Callback(this);
+  List<String> names() => _blink.BlinkRTCStatsReport.instance.names_Callback_0_(this);
 
   @DomName('RTCStatsReport.stat')
   @DocsEditable()
-  String stat(String name) => _blink.BlinkRTCStatsReport.stat_Callback_1(this, name);
+  String stat(String name) => _blink.BlinkRTCStatsReport.instance.stat_Callback_1_(this, name);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -27083,15 +27088,15 @@
 
   @DomName('RTCStatsResponse.__getter__')
   @DocsEditable()
-  RtcStatsReport __getter__(String name) => _blink.BlinkRTCStatsResponse.$__getter___Callback_1(this, name);
+  RtcStatsReport __getter__(String name) => _blink.BlinkRTCStatsResponse.instance.$__getter___Callback_1_(this, name);
 
   @DomName('RTCStatsResponse.namedItem')
   @DocsEditable()
-  RtcStatsReport namedItem(String name) => _blink.BlinkRTCStatsResponse.namedItem_Callback_1(this, name);
+  RtcStatsReport namedItem(String name) => _blink.BlinkRTCStatsResponse.instance.namedItem_Callback_1_(this, name);
 
   @DomName('RTCStatsResponse.result')
   @DocsEditable()
-  List<RtcStatsReport> result() => _blink.BlinkRTCStatsResponse.result_Callback(this);
+  List<RtcStatsReport> result() => _blink.BlinkRTCStatsResponse.instance.result_Callback_0_(this);
 
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -27114,42 +27119,42 @@
 
   @DomName('Screen.availHeight')
   @DocsEditable()
-  int get _availHeight => _blink.BlinkScreen.availHeight_Getter(this);
+  int get _availHeight => _blink.BlinkScreen.instance.availHeight_Getter_(this);
 
   @DomName('Screen.availLeft')
   @DocsEditable()
   @Experimental() // nonstandard
-  int get _availLeft => _blink.BlinkScreen.availLeft_Getter(this);
+  int get _availLeft => _blink.BlinkScreen.instance.availLeft_Getter_(this);
 
   @DomName('Screen.availTop')
   @DocsEditable()
   @Experimental() // nonstandard
-  int get _availTop => _blink.BlinkScreen.availTop_Getter(this);
+  int get _availTop => _blink.BlinkScreen.instance.availTop_Getter_(this);
 
   @DomName('Screen.availWidth')
   @DocsEditable()
-  int get _availWidth => _blink.BlinkScreen.availWidth_Getter(this);
+  int get _availWidth => _blink.BlinkScreen.instance.availWidth_Getter_(this);
 
   @DomName('Screen.colorDepth')
   @DocsEditable()
-  int get colorDepth => _blink.BlinkScreen.colorDepth_Getter(this);
+  int get colorDepth => _blink.BlinkScreen.instance.colorDepth_Getter_(this);
 
   @DomName('Screen.height')
   @DocsEditable()
-  int get height => _blink.BlinkScreen.height_Getter(this);
+  int get height => _blink.BlinkScreen.instance.height_Getter_(this);
 
   @DomName('Screen.orientation')
   @DocsEditable()
   @Experimental() // untriaged
-  ScreenOrientation get orientation => _blink.BlinkScreen.orientation_Getter(this);
+  ScreenOrientation get orientation => _blink.BlinkScreen.instance.orientation_Getter_(this);
 
   @DomName('Screen.pixelDepth')
   @DocsEditable()
-  int get pixelDepth => _blink.BlinkScreen.pixelDepth_Getter(this);
+  int get pixelDepth => _blink.BlinkScreen.instance.pixelDepth_Getter_(this);
 
   @DomName('Screen.width')
   @DocsEditable()
-  int get width => _blink.BlinkScreen.width_Getter(this);
+  int get width => _blink.BlinkScreen.instance.width_Getter_(this);
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -27173,22 +27178,22 @@
   @DomName('ScreenOrientation.angle')
   @DocsEditable()
   @Experimental() // untriaged
-  int get angle => _blink.BlinkScreenOrientation.angle_Getter(this);
+  int get angle => _blink.BlinkScreenOrientation.instance.angle_Getter_(this);
 
   @DomName('ScreenOrientation.type')
   @DocsEditable()
   @Experimental() // untriaged
-  String get type => _blink.BlinkScreenOrientation.type_Getter(this);
+  String get type => _blink.BlinkScreenOrientation.instance.type_Getter_(this);
 
   @DomName('ScreenOrientation.lock')
   @DocsEditable()
   @Experimental() // untriaged
-  Future lock(String orientation) => _blink.BlinkScreenOrientation.lock_Callback_1(this, orientation);
+  Future lock(String orientation) => _blink.BlinkScreenOrientation.instance.lock_Callback_1_(this, orientation);
 
   @DomName('ScreenOrientation.unlock')
   @DocsEditable()
   @Experimental() // untriaged
-  void unlock() => _blink.BlinkScreenOrientation.unlock_Callback(this);
+  void unlock() => _blink.BlinkScreenOrientation.instance.unlock_Callback_0_(this);
 
   @DomName('ScreenOrientation.onchange')
   @DocsEditable()
@@ -27221,77 +27226,77 @@
 
   @DomName('HTMLScriptElement.async')
   @DocsEditable()
-  bool get async => _blink.BlinkHTMLScriptElement.async_Getter(this);
+  bool get async => _blink.BlinkHTMLScriptElement.instance.async_Getter_(this);
 
   @DomName('HTMLScriptElement.async')
   @DocsEditable()
-  void set async(bool value) => _blink.BlinkHTMLScriptElement.async_Setter(this, value);
+  void set async(bool value) => _blink.BlinkHTMLScriptElement.instance.async_Setter_(this, value);
 
   @DomName('HTMLScriptElement.charset')
   @DocsEditable()
-  String get charset => _blink.BlinkHTMLScriptElement.charset_Getter(this);
+  String get charset => _blink.BlinkHTMLScriptElement.instance.charset_Getter_(this);
 
   @DomName('HTMLScriptElement.charset')
   @DocsEditable()
-  void set charset(String value) => _blink.BlinkHTMLScriptElement.charset_Setter(this, value);
+  void set charset(String value) => _blink.BlinkHTMLScriptElement.instance.charset_Setter_(this, value);
 
   @DomName('HTMLScriptElement.crossOrigin')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/scripting-1.html#attr-script-crossorigin
   @Experimental()
-  String get crossOrigin => _blink.BlinkHTMLScriptElement.crossOrigin_Getter(this);
+  String get crossOrigin => _blink.BlinkHTMLScriptElement.instance.crossOrigin_Getter_(this);
 
   @DomName('HTMLScriptElement.crossOrigin')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/scripting-1.html#attr-script-crossorigin
   @Experimental()
-  void set crossOrigin(String value) => _blink.BlinkHTMLScriptElement.crossOrigin_Setter(this, value);
+  void set crossOrigin(String value) => _blink.BlinkHTMLScriptElement.instance.crossOrigin_Setter_(this, value);
 
   @DomName('HTMLScriptElement.defer')
   @DocsEditable()
-  bool get defer => _blink.BlinkHTMLScriptElement.defer_Getter(this);
+  bool get defer => _blink.BlinkHTMLScriptElement.instance.defer_Getter_(this);
 
   @DomName('HTMLScriptElement.defer')
   @DocsEditable()
-  void set defer(bool value) => _blink.BlinkHTMLScriptElement.defer_Setter(this, value);
+  void set defer(bool value) => _blink.BlinkHTMLScriptElement.instance.defer_Setter_(this, value);
 
   @DomName('HTMLScriptElement.integrity')
   @DocsEditable()
   @Experimental() // untriaged
-  String get integrity => _blink.BlinkHTMLScriptElement.integrity_Getter(this);
+  String get integrity => _blink.BlinkHTMLScriptElement.instance.integrity_Getter_(this);
 
   @DomName('HTMLScriptElement.integrity')
   @DocsEditable()
   @Experimental() // untriaged
-  void set integrity(String value) => _blink.BlinkHTMLScriptElement.integrity_Setter(this, value);
+  void set integrity(String value) => _blink.BlinkHTMLScriptElement.instance.integrity_Setter_(this, value);
 
   @DomName('HTMLScriptElement.nonce')
   @DocsEditable()
   // https://dvcs.w3.org/hg/content-security-policy/raw-file/tip/csp-specification.dev.html#interaction-with-the-script-src-directive
   @Experimental()
-  String get nonce => _blink.BlinkHTMLScriptElement.nonce_Getter(this);
+  String get nonce => _blink.BlinkHTMLScriptElement.instance.nonce_Getter_(this);
 
   @DomName('HTMLScriptElement.nonce')
   @DocsEditable()
   // https://dvcs.w3.org/hg/content-security-policy/raw-file/tip/csp-specification.dev.html#interaction-with-the-script-src-directive
   @Experimental()
-  void set nonce(String value) => _blink.BlinkHTMLScriptElement.nonce_Setter(this, value);
+  void set nonce(String value) => _blink.BlinkHTMLScriptElement.instance.nonce_Setter_(this, value);
 
   @DomName('HTMLScriptElement.src')
   @DocsEditable()
-  String get src => _blink.BlinkHTMLScriptElement.src_Getter(this);
+  String get src => _blink.BlinkHTMLScriptElement.instance.src_Getter_(this);
 
   @DomName('HTMLScriptElement.src')
   @DocsEditable()
-  void set src(String value) => _blink.BlinkHTMLScriptElement.src_Setter(this, value);
+  void set src(String value) => _blink.BlinkHTMLScriptElement.instance.src_Setter_(this, value);
 
   @DomName('HTMLScriptElement.type')
   @DocsEditable()
-  String get type => _blink.BlinkHTMLScriptElement.type_Getter(this);
+  String get type => _blink.BlinkHTMLScriptElement.instance.type_Getter_(this);
 
   @DomName('HTMLScriptElement.type')
   @DocsEditable()
-  void set type(String value) => _blink.BlinkHTMLScriptElement.type_Setter(this, value);
+  void set type(String value) => _blink.BlinkHTMLScriptElement.instance.type_Setter_(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -27311,44 +27316,44 @@
 
   @DomName('SecurityPolicyViolationEvent.blockedURI')
   @DocsEditable()
-  String get blockedUri => _blink.BlinkSecurityPolicyViolationEvent.blockedURI_Getter(this);
+  String get blockedUri => _blink.BlinkSecurityPolicyViolationEvent.instance.blockedURI_Getter_(this);
 
   @DomName('SecurityPolicyViolationEvent.columnNumber')
   @DocsEditable()
-  int get columnNumber => _blink.BlinkSecurityPolicyViolationEvent.columnNumber_Getter(this);
+  int get columnNumber => _blink.BlinkSecurityPolicyViolationEvent.instance.columnNumber_Getter_(this);
 
   @DomName('SecurityPolicyViolationEvent.documentURI')
   @DocsEditable()
-  String get documentUri => _blink.BlinkSecurityPolicyViolationEvent.documentURI_Getter(this);
+  String get documentUri => _blink.BlinkSecurityPolicyViolationEvent.instance.documentURI_Getter_(this);
 
   @DomName('SecurityPolicyViolationEvent.effectiveDirective')
   @DocsEditable()
-  String get effectiveDirective => _blink.BlinkSecurityPolicyViolationEvent.effectiveDirective_Getter(this);
+  String get effectiveDirective => _blink.BlinkSecurityPolicyViolationEvent.instance.effectiveDirective_Getter_(this);
 
   @DomName('SecurityPolicyViolationEvent.lineNumber')
   @DocsEditable()
-  int get lineNumber => _blink.BlinkSecurityPolicyViolationEvent.lineNumber_Getter(this);
+  int get lineNumber => _blink.BlinkSecurityPolicyViolationEvent.instance.lineNumber_Getter_(this);
 
   @DomName('SecurityPolicyViolationEvent.originalPolicy')
   @DocsEditable()
-  String get originalPolicy => _blink.BlinkSecurityPolicyViolationEvent.originalPolicy_Getter(this);
+  String get originalPolicy => _blink.BlinkSecurityPolicyViolationEvent.instance.originalPolicy_Getter_(this);
 
   @DomName('SecurityPolicyViolationEvent.referrer')
   @DocsEditable()
-  String get referrer => _blink.BlinkSecurityPolicyViolationEvent.referrer_Getter(this);
+  String get referrer => _blink.BlinkSecurityPolicyViolationEvent.instance.referrer_Getter_(this);
 
   @DomName('SecurityPolicyViolationEvent.sourceFile')
   @DocsEditable()
-  String get sourceFile => _blink.BlinkSecurityPolicyViolationEvent.sourceFile_Getter(this);
+  String get sourceFile => _blink.BlinkSecurityPolicyViolationEvent.instance.sourceFile_Getter_(this);
 
   @DomName('SecurityPolicyViolationEvent.statusCode')
   @DocsEditable()
   @Experimental() // untriaged
-  int get statusCode => _blink.BlinkSecurityPolicyViolationEvent.statusCode_Getter(this);
+  int get statusCode => _blink.BlinkSecurityPolicyViolationEvent.instance.statusCode_Getter_(this);
 
   @DomName('SecurityPolicyViolationEvent.violatedDirective')
   @DocsEditable()
-  String get violatedDirective => _blink.BlinkSecurityPolicyViolationEvent.violatedDirective_Getter(this);
+  String get violatedDirective => _blink.BlinkSecurityPolicyViolationEvent.instance.violatedDirective_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -27373,125 +27378,125 @@
 
   @DomName('HTMLSelectElement.autofocus')
   @DocsEditable()
-  bool get autofocus => _blink.BlinkHTMLSelectElement.autofocus_Getter(this);
+  bool get autofocus => _blink.BlinkHTMLSelectElement.instance.autofocus_Getter_(this);
 
   @DomName('HTMLSelectElement.autofocus')
   @DocsEditable()
-  void set autofocus(bool value) => _blink.BlinkHTMLSelectElement.autofocus_Setter(this, value);
+  void set autofocus(bool value) => _blink.BlinkHTMLSelectElement.instance.autofocus_Setter_(this, value);
 
   @DomName('HTMLSelectElement.disabled')
   @DocsEditable()
-  bool get disabled => _blink.BlinkHTMLSelectElement.disabled_Getter(this);
+  bool get disabled => _blink.BlinkHTMLSelectElement.instance.disabled_Getter_(this);
 
   @DomName('HTMLSelectElement.disabled')
   @DocsEditable()
-  void set disabled(bool value) => _blink.BlinkHTMLSelectElement.disabled_Setter(this, value);
+  void set disabled(bool value) => _blink.BlinkHTMLSelectElement.instance.disabled_Setter_(this, value);
 
   @DomName('HTMLSelectElement.form')
   @DocsEditable()
-  FormElement get form => _blink.BlinkHTMLSelectElement.form_Getter(this);
+  FormElement get form => _blink.BlinkHTMLSelectElement.instance.form_Getter_(this);
 
   @DomName('HTMLSelectElement.labels')
   @DocsEditable()
   @Unstable()
-  List<Node> get labels => _blink.BlinkHTMLSelectElement.labels_Getter(this);
+  List<Node> get labels => _blink.BlinkHTMLSelectElement.instance.labels_Getter_(this);
 
   @DomName('HTMLSelectElement.length')
   @DocsEditable()
-  int get length => _blink.BlinkHTMLSelectElement.length_Getter(this);
+  int get length => _blink.BlinkHTMLSelectElement.instance.length_Getter_(this);
 
   @DomName('HTMLSelectElement.length')
   @DocsEditable()
-  void set length(int value) => _blink.BlinkHTMLSelectElement.length_Setter(this, value);
+  void set length(int value) => _blink.BlinkHTMLSelectElement.instance.length_Setter_(this, value);
 
   @DomName('HTMLSelectElement.multiple')
   @DocsEditable()
-  bool get multiple => _blink.BlinkHTMLSelectElement.multiple_Getter(this);
+  bool get multiple => _blink.BlinkHTMLSelectElement.instance.multiple_Getter_(this);
 
   @DomName('HTMLSelectElement.multiple')
   @DocsEditable()
-  void set multiple(bool value) => _blink.BlinkHTMLSelectElement.multiple_Setter(this, value);
+  void set multiple(bool value) => _blink.BlinkHTMLSelectElement.instance.multiple_Setter_(this, value);
 
   @DomName('HTMLSelectElement.name')
   @DocsEditable()
-  String get name => _blink.BlinkHTMLSelectElement.name_Getter(this);
+  String get name => _blink.BlinkHTMLSelectElement.instance.name_Getter_(this);
 
   @DomName('HTMLSelectElement.name')
   @DocsEditable()
-  void set name(String value) => _blink.BlinkHTMLSelectElement.name_Setter(this, value);
+  void set name(String value) => _blink.BlinkHTMLSelectElement.instance.name_Setter_(this, value);
 
   @DomName('HTMLSelectElement.required')
   @DocsEditable()
-  bool get required => _blink.BlinkHTMLSelectElement.required_Getter(this);
+  bool get required => _blink.BlinkHTMLSelectElement.instance.required_Getter_(this);
 
   @DomName('HTMLSelectElement.required')
   @DocsEditable()
-  void set required(bool value) => _blink.BlinkHTMLSelectElement.required_Setter(this, value);
+  void set required(bool value) => _blink.BlinkHTMLSelectElement.instance.required_Setter_(this, value);
 
   @DomName('HTMLSelectElement.selectedIndex')
   @DocsEditable()
-  int get selectedIndex => _blink.BlinkHTMLSelectElement.selectedIndex_Getter(this);
+  int get selectedIndex => _blink.BlinkHTMLSelectElement.instance.selectedIndex_Getter_(this);
 
   @DomName('HTMLSelectElement.selectedIndex')
   @DocsEditable()
-  void set selectedIndex(int value) => _blink.BlinkHTMLSelectElement.selectedIndex_Setter(this, value);
+  void set selectedIndex(int value) => _blink.BlinkHTMLSelectElement.instance.selectedIndex_Setter_(this, value);
 
   @DomName('HTMLSelectElement.size')
   @DocsEditable()
-  int get size => _blink.BlinkHTMLSelectElement.size_Getter(this);
+  int get size => _blink.BlinkHTMLSelectElement.instance.size_Getter_(this);
 
   @DomName('HTMLSelectElement.size')
   @DocsEditable()
-  void set size(int value) => _blink.BlinkHTMLSelectElement.size_Setter(this, value);
+  void set size(int value) => _blink.BlinkHTMLSelectElement.instance.size_Setter_(this, value);
 
   @DomName('HTMLSelectElement.type')
   @DocsEditable()
-  String get type => _blink.BlinkHTMLSelectElement.type_Getter(this);
+  String get type => _blink.BlinkHTMLSelectElement.instance.type_Getter_(this);
 
   @DomName('HTMLSelectElement.validationMessage')
   @DocsEditable()
-  String get validationMessage => _blink.BlinkHTMLSelectElement.validationMessage_Getter(this);
+  String get validationMessage => _blink.BlinkHTMLSelectElement.instance.validationMessage_Getter_(this);
 
   @DomName('HTMLSelectElement.validity')
   @DocsEditable()
-  ValidityState get validity => _blink.BlinkHTMLSelectElement.validity_Getter(this);
+  ValidityState get validity => _blink.BlinkHTMLSelectElement.instance.validity_Getter_(this);
 
   @DomName('HTMLSelectElement.value')
   @DocsEditable()
-  String get value => _blink.BlinkHTMLSelectElement.value_Getter(this);
+  String get value => _blink.BlinkHTMLSelectElement.instance.value_Getter_(this);
 
   @DomName('HTMLSelectElement.value')
   @DocsEditable()
-  void set value(String value) => _blink.BlinkHTMLSelectElement.value_Setter(this, value);
+  void set value(String value) => _blink.BlinkHTMLSelectElement.instance.value_Setter_(this, value);
 
   @DomName('HTMLSelectElement.willValidate')
   @DocsEditable()
-  bool get willValidate => _blink.BlinkHTMLSelectElement.willValidate_Getter(this);
+  bool get willValidate => _blink.BlinkHTMLSelectElement.instance.willValidate_Getter_(this);
 
   @DomName('HTMLSelectElement.__setter__')
   @DocsEditable()
-  void __setter__(int index, OptionElement value) => _blink.BlinkHTMLSelectElement.$__setter___Callback_2(this, index, value);
+  void __setter__(int index, OptionElement value) => _blink.BlinkHTMLSelectElement.instance.$__setter___Callback_2_(this, index, value);
 
   @DomName('HTMLSelectElement.add')
   @DocsEditable()
   @Experimental() // untriaged
-  void add(HtmlElement element, int before) => _blink.BlinkHTMLSelectElement.add_Callback_2(this, element, before);
+  void add(HtmlElement element, int before) => _blink.BlinkHTMLSelectElement.instance.add_Callback_2_(this, element, before);
 
   @DomName('HTMLSelectElement.checkValidity')
   @DocsEditable()
-  bool checkValidity() => _blink.BlinkHTMLSelectElement.checkValidity_Callback(this);
+  bool checkValidity() => _blink.BlinkHTMLSelectElement.instance.checkValidity_Callback_0_(this);
 
   @DomName('HTMLSelectElement.item')
   @DocsEditable()
-  Element item(int index) => _blink.BlinkHTMLSelectElement.item_Callback_1(this, index);
+  Element item(int index) => _blink.BlinkHTMLSelectElement.instance.item_Callback_1_(this, index);
 
   @DomName('HTMLSelectElement.namedItem')
   @DocsEditable()
-  Element namedItem(String name) => _blink.BlinkHTMLSelectElement.namedItem_Callback_1(this, name);
+  Element namedItem(String name) => _blink.BlinkHTMLSelectElement.instance.namedItem_Callback_1_(this, name);
 
   @DomName('HTMLSelectElement.setCustomValidity')
   @DocsEditable()
-  void setCustomValidity(String error) => _blink.BlinkHTMLSelectElement.setCustomValidity_Callback_1(this, error);
+  void setCustomValidity(String error) => _blink.BlinkHTMLSelectElement.instance.setCustomValidity_Callback_1_(this, error);
 
 
   // Override default options, since IE returns SelectElement itself and it
@@ -27527,125 +27532,125 @@
 
   @DomName('Selection.anchorNode')
   @DocsEditable()
-  Node get anchorNode => _blink.BlinkSelection.anchorNode_Getter(this);
+  Node get anchorNode => _blink.BlinkSelection.instance.anchorNode_Getter_(this);
 
   @DomName('Selection.anchorOffset')
   @DocsEditable()
-  int get anchorOffset => _blink.BlinkSelection.anchorOffset_Getter(this);
+  int get anchorOffset => _blink.BlinkSelection.instance.anchorOffset_Getter_(this);
 
   @DomName('Selection.baseNode')
   @DocsEditable()
   @Experimental() // non-standard
-  Node get baseNode => _blink.BlinkSelection.baseNode_Getter(this);
+  Node get baseNode => _blink.BlinkSelection.instance.baseNode_Getter_(this);
 
   @DomName('Selection.baseOffset')
   @DocsEditable()
   @Experimental() // non-standard
-  int get baseOffset => _blink.BlinkSelection.baseOffset_Getter(this);
+  int get baseOffset => _blink.BlinkSelection.instance.baseOffset_Getter_(this);
 
   @DomName('Selection.extentNode')
   @DocsEditable()
   @Experimental() // non-standard
-  Node get extentNode => _blink.BlinkSelection.extentNode_Getter(this);
+  Node get extentNode => _blink.BlinkSelection.instance.extentNode_Getter_(this);
 
   @DomName('Selection.extentOffset')
   @DocsEditable()
   @Experimental() // non-standard
-  int get extentOffset => _blink.BlinkSelection.extentOffset_Getter(this);
+  int get extentOffset => _blink.BlinkSelection.instance.extentOffset_Getter_(this);
 
   @DomName('Selection.focusNode')
   @DocsEditable()
-  Node get focusNode => _blink.BlinkSelection.focusNode_Getter(this);
+  Node get focusNode => _blink.BlinkSelection.instance.focusNode_Getter_(this);
 
   @DomName('Selection.focusOffset')
   @DocsEditable()
-  int get focusOffset => _blink.BlinkSelection.focusOffset_Getter(this);
+  int get focusOffset => _blink.BlinkSelection.instance.focusOffset_Getter_(this);
 
   @DomName('Selection.isCollapsed')
   @DocsEditable()
-  bool get isCollapsed => _blink.BlinkSelection.isCollapsed_Getter(this);
+  bool get isCollapsed => _blink.BlinkSelection.instance.isCollapsed_Getter_(this);
 
   @DomName('Selection.rangeCount')
   @DocsEditable()
-  int get rangeCount => _blink.BlinkSelection.rangeCount_Getter(this);
+  int get rangeCount => _blink.BlinkSelection.instance.rangeCount_Getter_(this);
 
   @DomName('Selection.type')
   @DocsEditable()
   @Experimental() // non-standard
-  String get type => _blink.BlinkSelection.type_Getter(this);
+  String get type => _blink.BlinkSelection.instance.type_Getter_(this);
 
   @DomName('Selection.addRange')
   @DocsEditable()
-  void addRange(Range range) => _blink.BlinkSelection.addRange_Callback_1(this, range);
+  void addRange(Range range) => _blink.BlinkSelection.instance.addRange_Callback_1_(this, range);
 
   void collapse(Node node, [int offset]) {
     if (offset != null) {
-      _blink.BlinkSelection.collapse_Callback_2(this, node, offset);
+      _blink.BlinkSelection.instance.collapse_Callback_2_(this, node, offset);
       return;
     }
-    _blink.BlinkSelection.collapse_Callback_1(this, node);
+    _blink.BlinkSelection.instance.collapse_Callback_1_(this, node);
     return;
   }
 
   @DomName('Selection.collapseToEnd')
   @DocsEditable()
-  void collapseToEnd() => _blink.BlinkSelection.collapseToEnd_Callback(this);
+  void collapseToEnd() => _blink.BlinkSelection.instance.collapseToEnd_Callback_0_(this);
 
   @DomName('Selection.collapseToStart')
   @DocsEditable()
-  void collapseToStart() => _blink.BlinkSelection.collapseToStart_Callback(this);
+  void collapseToStart() => _blink.BlinkSelection.instance.collapseToStart_Callback_0_(this);
 
   @DomName('Selection.containsNode')
   @DocsEditable()
   @Experimental() // non-standard
-  bool containsNode(Node node, bool allowPartial) => _blink.BlinkSelection.containsNode_Callback_2(this, node, allowPartial);
+  bool containsNode(Node node, bool allowPartial) => _blink.BlinkSelection.instance.containsNode_Callback_2_(this, node, allowPartial);
 
   @DomName('Selection.deleteFromDocument')
   @DocsEditable()
-  void deleteFromDocument() => _blink.BlinkSelection.deleteFromDocument_Callback(this);
+  void deleteFromDocument() => _blink.BlinkSelection.instance.deleteFromDocument_Callback_0_(this);
 
   @DomName('Selection.empty')
   @DocsEditable()
   @Experimental() // non-standard
-  void empty() => _blink.BlinkSelection.empty_Callback(this);
+  void empty() => _blink.BlinkSelection.instance.empty_Callback_0_(this);
 
   void extend(Node node, [int offset]) {
     if (offset != null) {
-      _blink.BlinkSelection.extend_Callback_2(this, node, offset);
+      _blink.BlinkSelection.instance.extend_Callback_2_(this, node, offset);
       return;
     }
-    _blink.BlinkSelection.extend_Callback_1(this, node);
+    _blink.BlinkSelection.instance.extend_Callback_1_(this, node);
     return;
   }
 
   @DomName('Selection.getRangeAt')
   @DocsEditable()
-  Range getRangeAt(int index) => _blink.BlinkSelection.getRangeAt_Callback_1(this, index);
+  Range getRangeAt(int index) => _blink.BlinkSelection.instance.getRangeAt_Callback_1_(this, index);
 
   @DomName('Selection.modify')
   @DocsEditable()
   @Experimental() // non-standard
-  void modify(String alter, String direction, String granularity) => _blink.BlinkSelection.modify_Callback_3(this, alter, direction, granularity);
+  void modify(String alter, String direction, String granularity) => _blink.BlinkSelection.instance.modify_Callback_3_(this, alter, direction, granularity);
 
   @DomName('Selection.removeAllRanges')
   @DocsEditable()
-  void removeAllRanges() => _blink.BlinkSelection.removeAllRanges_Callback(this);
+  void removeAllRanges() => _blink.BlinkSelection.instance.removeAllRanges_Callback_0_(this);
 
   @DomName('Selection.selectAllChildren')
   @DocsEditable()
-  void selectAllChildren(Node node) => _blink.BlinkSelection.selectAllChildren_Callback_1(this, node);
+  void selectAllChildren(Node node) => _blink.BlinkSelection.instance.selectAllChildren_Callback_1_(this, node);
 
   @DomName('Selection.setBaseAndExtent')
   @DocsEditable()
   @Experimental() // non-standard
-  void setBaseAndExtent(Node baseNode, int baseOffset, Node extentNode, int extentOffset) => _blink.BlinkSelection.setBaseAndExtent_Callback_4(this, baseNode, baseOffset, extentNode, extentOffset);
+  void setBaseAndExtent(Node baseNode, int baseOffset, Node extentNode, int extentOffset) => _blink.BlinkSelection.instance.setBaseAndExtent_Callback_4_(this, baseNode, baseOffset, extentNode, extentOffset);
 
   void setPosition(Node node, [int offset]) {
     if (offset != null) {
-      _blink.BlinkSelection.setPosition_Callback_2(this, node, offset);
+      _blink.BlinkSelection.instance.setPosition_Callback_2_(this, node, offset);
       return;
     }
-    _blink.BlinkSelection.setPosition_Callback_1(this, node);
+    _blink.BlinkSelection.instance.setPosition_Callback_1_(this, node);
     return;
   }
 
@@ -27667,12 +27672,12 @@
   @DomName('ServiceWorkerClient.id')
   @DocsEditable()
   @Experimental() // untriaged
-  int get id => _blink.BlinkServiceWorkerClient.id_Getter(this);
+  int get id => _blink.BlinkServiceWorkerClient.instance.id_Getter_(this);
 
   @DomName('ServiceWorkerClient.postMessage')
   @DocsEditable()
   @Experimental() // untriaged
-  void postMessage(/*SerializedScriptValue*/ message, [List<MessagePort> transfer]) => _blink.BlinkServiceWorkerClient.postMessage_Callback_2(this, message, transfer);
+  void postMessage(/*SerializedScriptValue*/ message, [List<MessagePort> transfer]) => _blink.BlinkServiceWorkerClient.instance.postMessage_Callback_2_(this, message, transfer);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -27692,7 +27697,7 @@
   @DomName('ServiceWorkerClients.getServiced')
   @DocsEditable()
   @Experimental() // untriaged
-  Future getServiced() => _blink.BlinkServiceWorkerClients.getServiced_Callback(this);
+  Future getServiced() => _blink.BlinkServiceWorkerClients.instance.getServiced_Callback_0_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -27712,40 +27717,40 @@
   @DomName('ServiceWorkerContainer.active')
   @DocsEditable()
   @Experimental() // untriaged
-  _ServiceWorker get active => _blink.BlinkServiceWorkerContainer.active_Getter(this);
+  _ServiceWorker get active => _blink.BlinkServiceWorkerContainer.instance.active_Getter_(this);
 
   @DomName('ServiceWorkerContainer.controller')
   @DocsEditable()
   @Experimental() // untriaged
-  _ServiceWorker get controller => _blink.BlinkServiceWorkerContainer.controller_Getter(this);
+  _ServiceWorker get controller => _blink.BlinkServiceWorkerContainer.instance.controller_Getter_(this);
 
   @DomName('ServiceWorkerContainer.installing')
   @DocsEditable()
   @Experimental() // untriaged
-  _ServiceWorker get installing => _blink.BlinkServiceWorkerContainer.installing_Getter(this);
+  _ServiceWorker get installing => _blink.BlinkServiceWorkerContainer.instance.installing_Getter_(this);
 
   @DomName('ServiceWorkerContainer.ready')
   @DocsEditable()
   @Experimental() // untriaged
-  Future get ready => _blink.BlinkServiceWorkerContainer.ready_Getter(this);
+  Future get ready => _blink.BlinkServiceWorkerContainer.instance.ready_Getter_(this);
 
   @DomName('ServiceWorkerContainer.waiting')
   @DocsEditable()
   @Experimental() // untriaged
-  _ServiceWorker get waiting => _blink.BlinkServiceWorkerContainer.waiting_Getter(this);
+  _ServiceWorker get waiting => _blink.BlinkServiceWorkerContainer.instance.waiting_Getter_(this);
 
   Future register(String url, [Map options]) {
     if (options != null) {
-      return _blink.BlinkServiceWorkerContainer.register_Callback_2(this, url, options);
+      return _blink.BlinkServiceWorkerContainer.instance.register_Callback_2_(this, url, options);
     }
-    return _blink.BlinkServiceWorkerContainer.register_Callback_1(this, url);
+    return _blink.BlinkServiceWorkerContainer.instance.register_Callback_1_(this, url);
   }
 
   Future unregister([String scope]) {
     if (scope != null) {
-      return _blink.BlinkServiceWorkerContainer.unregister_Callback_1(this, scope);
+      return _blink.BlinkServiceWorkerContainer.instance.unregister_Callback_1_(this, scope);
     }
-    return _blink.BlinkServiceWorkerContainer.unregister_Callback(this);
+    return _blink.BlinkServiceWorkerContainer.instance.unregister_Callback_0_(this);
   }
 
 }
@@ -27771,30 +27776,30 @@
   @DomName('ServiceWorkerGlobalScope.clients')
   @DocsEditable()
   @Experimental() // untriaged
-  ServiceWorkerClients get clients => _blink.BlinkServiceWorkerGlobalScope.clients_Getter(this);
+  ServiceWorkerClients get clients => _blink.BlinkServiceWorkerGlobalScope.instance.clients_Getter_(this);
 
   @DomName('ServiceWorkerGlobalScope.nativeCaches')
   @DocsEditable()
   @Experimental() // untriaged
-  CacheStorage get nativeCaches => _blink.BlinkServiceWorkerGlobalScope.nativeCaches_Getter(this);
+  CacheStorage get nativeCaches => _blink.BlinkServiceWorkerGlobalScope.instance.nativeCaches_Getter_(this);
 
   @DomName('ServiceWorkerGlobalScope.scope')
   @DocsEditable()
   @Experimental() // untriaged
-  String get scope => _blink.BlinkServiceWorkerGlobalScope.scope_Getter(this);
+  String get scope => _blink.BlinkServiceWorkerGlobalScope.instance.scope_Getter_(this);
 
   Future _fetch(request, [Map requestInitDict]) {
     if ((request is String || request == null) && requestInitDict == null) {
-      return _blink.BlinkServiceWorkerGlobalScope.fetch_Callback_1(this, request);
+      return _blink.BlinkServiceWorkerGlobalScope.instance.fetch_Callback_1_(this, request);
     }
     if ((requestInitDict is Map || requestInitDict == null) && (request is String || request == null)) {
-      return _blink.BlinkServiceWorkerGlobalScope.fetch_Callback_2(this, request, requestInitDict);
+      return _blink.BlinkServiceWorkerGlobalScope.instance.fetch_Callback_2_(this, request, requestInitDict);
     }
     if ((request is _Request || request == null) && requestInitDict == null) {
-      return _blink.BlinkServiceWorkerGlobalScope.fetch_Callback_1(this, request);
+      return _blink.BlinkServiceWorkerGlobalScope.instance.fetch_Callback_1_(this, request);
     }
     if ((requestInitDict is Map || requestInitDict == null) && (request is _Request || request == null)) {
-      return _blink.BlinkServiceWorkerGlobalScope.fetch_Callback_2(this, request, requestInitDict);
+      return _blink.BlinkServiceWorkerGlobalScope.instance.fetch_Callback_2_(this, request, requestInitDict);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
@@ -27822,27 +27827,27 @@
   @DomName('ServiceWorkerRegistration.active')
   @DocsEditable()
   @Experimental() // untriaged
-  _ServiceWorker get active => _blink.BlinkServiceWorkerRegistration.active_Getter(this);
+  _ServiceWorker get active => _blink.BlinkServiceWorkerRegistration.instance.active_Getter_(this);
 
   @DomName('ServiceWorkerRegistration.installing')
   @DocsEditable()
   @Experimental() // untriaged
-  _ServiceWorker get installing => _blink.BlinkServiceWorkerRegistration.installing_Getter(this);
+  _ServiceWorker get installing => _blink.BlinkServiceWorkerRegistration.instance.installing_Getter_(this);
 
   @DomName('ServiceWorkerRegistration.scope')
   @DocsEditable()
   @Experimental() // untriaged
-  String get scope => _blink.BlinkServiceWorkerRegistration.scope_Getter(this);
+  String get scope => _blink.BlinkServiceWorkerRegistration.instance.scope_Getter_(this);
 
   @DomName('ServiceWorkerRegistration.waiting')
   @DocsEditable()
   @Experimental() // untriaged
-  _ServiceWorker get waiting => _blink.BlinkServiceWorkerRegistration.waiting_Getter(this);
+  _ServiceWorker get waiting => _blink.BlinkServiceWorkerRegistration.instance.waiting_Getter_(this);
 
   @DomName('ServiceWorkerRegistration.unregister')
   @DocsEditable()
   @Experimental() // untriaged
-  Future unregister() => _blink.BlinkServiceWorkerRegistration.unregister_Callback(this);
+  Future unregister() => _blink.BlinkServiceWorkerRegistration.instance.unregister_Callback_0_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -27877,7 +27882,7 @@
   @DomName('HTMLShadowElement.getDistributedNodes')
   @DocsEditable()
   @Experimental() // untriaged
-  List<Node> getDistributedNodes() => _blink.BlinkHTMLShadowElement.getDistributedNodes_Callback(this);
+  List<Node> getDistributedNodes() => _blink.BlinkHTMLShadowElement.instance.getDistributedNodes_Callback_0_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -27897,54 +27902,54 @@
 
   @DomName('ShadowRoot.activeElement')
   @DocsEditable()
-  Element get activeElement => _blink.BlinkShadowRoot.activeElement_Getter(this);
+  Element get activeElement => _blink.BlinkShadowRoot.instance.activeElement_Getter_(this);
 
   @DomName('ShadowRoot.host')
   @DocsEditable()
   @Experimental() // untriaged
-  Element get host => _blink.BlinkShadowRoot.host_Getter(this);
+  Element get host => _blink.BlinkShadowRoot.instance.host_Getter_(this);
 
   @DomName('ShadowRoot.innerHTML')
   @DocsEditable()
-  String get innerHtml => _blink.BlinkShadowRoot.innerHTML_Getter(this);
+  String get innerHtml => _blink.BlinkShadowRoot.instance.innerHTML_Getter_(this);
 
   @DomName('ShadowRoot.innerHTML')
   @DocsEditable()
-  void set innerHtml(String value) => _blink.BlinkShadowRoot.innerHTML_Setter(this, value);
+  void set innerHtml(String value) => _blink.BlinkShadowRoot.instance.innerHTML_Setter_(this, value);
 
   @DomName('ShadowRoot.olderShadowRoot')
   @DocsEditable()
   @Experimental() // untriaged
-  ShadowRoot get olderShadowRoot => _blink.BlinkShadowRoot.olderShadowRoot_Getter(this);
+  ShadowRoot get olderShadowRoot => _blink.BlinkShadowRoot.instance.olderShadowRoot_Getter_(this);
 
   @DomName('ShadowRoot.styleSheets')
   @DocsEditable()
   @Experimental() // untriaged
-  List<StyleSheet> get styleSheets => _blink.BlinkShadowRoot.styleSheets_Getter(this);
+  List<StyleSheet> get styleSheets => _blink.BlinkShadowRoot.instance.styleSheets_Getter_(this);
 
   @DomName('ShadowRoot.cloneNode')
   @DocsEditable()
-  Node clone(bool deep) => _blink.BlinkShadowRoot.cloneNode_Callback_1(this, deep);
+  Node clone(bool deep) => _blink.BlinkShadowRoot.instance.cloneNode_Callback_1_(this, deep);
 
   @DomName('ShadowRoot.elementFromPoint')
   @DocsEditable()
-  Element elementFromPoint(int x, int y) => _blink.BlinkShadowRoot.elementFromPoint_Callback_2(this, x, y);
+  Element elementFromPoint(int x, int y) => _blink.BlinkShadowRoot.instance.elementFromPoint_Callback_2_(this, x, y);
 
   @DomName('ShadowRoot.getElementById')
   @DocsEditable()
-  Element getElementById(String elementId) => _blink.BlinkShadowRoot.getElementById_Callback_1(this, elementId);
+  Element getElementById(String elementId) => _blink.BlinkShadowRoot.instance.getElementById_Callback_1_(this, elementId);
 
   @DomName('ShadowRoot.getElementsByClassName')
   @DocsEditable()
-  List<Node> getElementsByClassName(String className) => _blink.BlinkShadowRoot.getElementsByClassName_Callback_1(this, className);
+  List<Node> getElementsByClassName(String className) => _blink.BlinkShadowRoot.instance.getElementsByClassName_Callback_1_(this, className);
 
   @DomName('ShadowRoot.getElementsByTagName')
   @DocsEditable()
-  List<Node> getElementsByTagName(String tagName) => _blink.BlinkShadowRoot.getElementsByTagName_Callback_1(this, tagName);
+  List<Node> getElementsByTagName(String tagName) => _blink.BlinkShadowRoot.instance.getElementsByTagName_Callback_1_(this, tagName);
 
   @DomName('ShadowRoot.getSelection')
   @DocsEditable()
-  Selection getSelection() => _blink.BlinkShadowRoot.getSelection_Callback(this);
+  Selection getSelection() => _blink.BlinkShadowRoot.instance.getSelection_Callback_0_(this);
 
   static final bool supported = true;
 
@@ -28006,17 +28011,17 @@
   @DomName('SharedWorker.SharedWorker')
   @DocsEditable()
   factory SharedWorker(String scriptURL, [String name]) {
-    return _blink.BlinkSharedWorker.constructorCallback_2(scriptURL, name);
+    return _blink.BlinkSharedWorker.instance.constructorCallback_2_(scriptURL, name);
   }
 
   @DomName('SharedWorker.port')
   @DocsEditable()
-  MessagePort get port => _blink.BlinkSharedWorker.port_Getter(this);
+  MessagePort get port => _blink.BlinkSharedWorker.instance.port_Getter_(this);
 
   @DomName('SharedWorker.workerStart')
   @DocsEditable()
   @Experimental() // untriaged
-  double get workerStart => _blink.BlinkSharedWorker.workerStart_Getter(this);
+  double get workerStart => _blink.BlinkSharedWorker.instance.workerStart_Getter_(this);
 
   @DomName('SharedWorker.onerror')
   @DocsEditable()
@@ -28052,7 +28057,7 @@
   @DomName('SharedWorkerGlobalScope.name')
   @DocsEditable()
   @Experimental() // untriaged
-  String get name => _blink.BlinkSharedWorkerGlobalScope.name_Getter(this);
+  String get name => _blink.BlinkSharedWorkerGlobalScope.instance.name_Getter_(this);
 
   /// Stream of `connect` events handled by this [SharedWorkerGlobalScope].
   @DomName('SharedWorkerGlobalScope.onconnect')
@@ -28079,77 +28084,77 @@
   @DomName('SourceBuffer.appendWindowEnd')
   @DocsEditable()
   @Experimental() // untriaged
-  num get appendWindowEnd => _blink.BlinkSourceBuffer.appendWindowEnd_Getter(this);
+  num get appendWindowEnd => _blink.BlinkSourceBuffer.instance.appendWindowEnd_Getter_(this);
 
   @DomName('SourceBuffer.appendWindowEnd')
   @DocsEditable()
   @Experimental() // untriaged
-  void set appendWindowEnd(num value) => _blink.BlinkSourceBuffer.appendWindowEnd_Setter(this, value);
+  void set appendWindowEnd(num value) => _blink.BlinkSourceBuffer.instance.appendWindowEnd_Setter_(this, value);
 
   @DomName('SourceBuffer.appendWindowStart')
   @DocsEditable()
   @Experimental() // untriaged
-  num get appendWindowStart => _blink.BlinkSourceBuffer.appendWindowStart_Getter(this);
+  num get appendWindowStart => _blink.BlinkSourceBuffer.instance.appendWindowStart_Getter_(this);
 
   @DomName('SourceBuffer.appendWindowStart')
   @DocsEditable()
   @Experimental() // untriaged
-  void set appendWindowStart(num value) => _blink.BlinkSourceBuffer.appendWindowStart_Setter(this, value);
+  void set appendWindowStart(num value) => _blink.BlinkSourceBuffer.instance.appendWindowStart_Setter_(this, value);
 
   @DomName('SourceBuffer.buffered')
   @DocsEditable()
-  TimeRanges get buffered => _blink.BlinkSourceBuffer.buffered_Getter(this);
+  TimeRanges get buffered => _blink.BlinkSourceBuffer.instance.buffered_Getter_(this);
 
   @DomName('SourceBuffer.mode')
   @DocsEditable()
   @Experimental() // untriaged
-  String get mode => _blink.BlinkSourceBuffer.mode_Getter(this);
+  String get mode => _blink.BlinkSourceBuffer.instance.mode_Getter_(this);
 
   @DomName('SourceBuffer.mode')
   @DocsEditable()
   @Experimental() // untriaged
-  void set mode(String value) => _blink.BlinkSourceBuffer.mode_Setter(this, value);
+  void set mode(String value) => _blink.BlinkSourceBuffer.instance.mode_Setter_(this, value);
 
   @DomName('SourceBuffer.timestampOffset')
   @DocsEditable()
-  num get timestampOffset => _blink.BlinkSourceBuffer.timestampOffset_Getter(this);
+  num get timestampOffset => _blink.BlinkSourceBuffer.instance.timestampOffset_Getter_(this);
 
   @DomName('SourceBuffer.timestampOffset')
   @DocsEditable()
-  void set timestampOffset(num value) => _blink.BlinkSourceBuffer.timestampOffset_Setter(this, value);
+  void set timestampOffset(num value) => _blink.BlinkSourceBuffer.instance.timestampOffset_Setter_(this, value);
 
   @DomName('SourceBuffer.updating')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get updating => _blink.BlinkSourceBuffer.updating_Getter(this);
+  bool get updating => _blink.BlinkSourceBuffer.instance.updating_Getter_(this);
 
   @DomName('SourceBuffer.abort')
   @DocsEditable()
-  void abort() => _blink.BlinkSourceBuffer.abort_Callback(this);
+  void abort() => _blink.BlinkSourceBuffer.instance.abort_Callback_0_(this);
 
   @DomName('SourceBuffer.appendBuffer')
   @DocsEditable()
   @Experimental() // untriaged
-  void appendBuffer(ByteBuffer data) => _blink.BlinkSourceBuffer.appendBuffer_Callback_1(this, data);
+  void appendBuffer(ByteBuffer data) => _blink.BlinkSourceBuffer.instance.appendBuffer_Callback_1_(this, data);
 
   void appendStream(FileStream stream, [int maxSize]) {
     if (maxSize != null) {
-      _blink.BlinkSourceBuffer.appendStream_Callback_2(this, stream, maxSize);
+      _blink.BlinkSourceBuffer.instance.appendStream_Callback_2_(this, stream, maxSize);
       return;
     }
-    _blink.BlinkSourceBuffer.appendStream_Callback_1(this, stream);
+    _blink.BlinkSourceBuffer.instance.appendStream_Callback_1_(this, stream);
     return;
   }
 
   @DomName('SourceBuffer.appendTypedData')
   @DocsEditable()
   @Experimental() // untriaged
-  void appendTypedData(TypedData data) => _blink.BlinkSourceBuffer.appendBuffer_Callback_1(this, data);
+  void appendTypedData(TypedData data) => _blink.BlinkSourceBuffer.instance.appendBuffer_Callback_1_(this, data);
 
   @DomName('SourceBuffer.remove')
   @DocsEditable()
   @Experimental() // untriaged
-  void remove(num start, num end) => _blink.BlinkSourceBuffer.remove_Callback_2(this, start, end);
+  void remove(num start, num end) => _blink.BlinkSourceBuffer.instance.remove_Callback_2_(this, start, end);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -28169,15 +28174,15 @@
 
   @DomName('SourceBufferList.length')
   @DocsEditable()
-  int get length => _blink.BlinkSourceBufferList.length_Getter(this);
+  int get length => _blink.BlinkSourceBufferList.instance.length_Getter_(this);
 
   SourceBuffer operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _blink.BlinkSourceBufferList.item_Callback_1(this, index);
+    return _blink.BlinkSourceBufferList.instance.item_Callback_1_(this, index);
   }
 
-  SourceBuffer _nativeIndexedGetter(int index) => _blink.BlinkSourceBufferList.item_Callback_1(this, index);
+  SourceBuffer _nativeIndexedGetter(int index) => _blink.BlinkSourceBufferList.instance.item_Callback_1_(this, index);
 
   void operator[]=(int index, SourceBuffer value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -28219,7 +28224,7 @@
 
   @DomName('SourceBufferList.item')
   @DocsEditable()
-  SourceBuffer item(int index) => _blink.BlinkSourceBufferList.item_Callback_1(this, index);
+  SourceBuffer item(int index) => _blink.BlinkSourceBufferList.instance.item_Callback_1_(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -28248,56 +28253,56 @@
   @DomName('HTMLSourceElement.integrity')
   @DocsEditable()
   @Experimental() // untriaged
-  String get integrity => _blink.BlinkHTMLSourceElement.integrity_Getter(this);
+  String get integrity => _blink.BlinkHTMLSourceElement.instance.integrity_Getter_(this);
 
   @DomName('HTMLSourceElement.integrity')
   @DocsEditable()
   @Experimental() // untriaged
-  void set integrity(String value) => _blink.BlinkHTMLSourceElement.integrity_Setter(this, value);
+  void set integrity(String value) => _blink.BlinkHTMLSourceElement.instance.integrity_Setter_(this, value);
 
   @DomName('HTMLSourceElement.media')
   @DocsEditable()
-  String get media => _blink.BlinkHTMLSourceElement.media_Getter(this);
+  String get media => _blink.BlinkHTMLSourceElement.instance.media_Getter_(this);
 
   @DomName('HTMLSourceElement.media')
   @DocsEditable()
-  void set media(String value) => _blink.BlinkHTMLSourceElement.media_Setter(this, value);
+  void set media(String value) => _blink.BlinkHTMLSourceElement.instance.media_Setter_(this, value);
 
   @DomName('HTMLSourceElement.sizes')
   @DocsEditable()
   @Experimental() // untriaged
-  String get sizes => _blink.BlinkHTMLSourceElement.sizes_Getter(this);
+  String get sizes => _blink.BlinkHTMLSourceElement.instance.sizes_Getter_(this);
 
   @DomName('HTMLSourceElement.sizes')
   @DocsEditable()
   @Experimental() // untriaged
-  void set sizes(String value) => _blink.BlinkHTMLSourceElement.sizes_Setter(this, value);
+  void set sizes(String value) => _blink.BlinkHTMLSourceElement.instance.sizes_Setter_(this, value);
 
   @DomName('HTMLSourceElement.src')
   @DocsEditable()
-  String get src => _blink.BlinkHTMLSourceElement.src_Getter(this);
+  String get src => _blink.BlinkHTMLSourceElement.instance.src_Getter_(this);
 
   @DomName('HTMLSourceElement.src')
   @DocsEditable()
-  void set src(String value) => _blink.BlinkHTMLSourceElement.src_Setter(this, value);
+  void set src(String value) => _blink.BlinkHTMLSourceElement.instance.src_Setter_(this, value);
 
   @DomName('HTMLSourceElement.srcset')
   @DocsEditable()
   @Experimental() // untriaged
-  String get srcset => _blink.BlinkHTMLSourceElement.srcset_Getter(this);
+  String get srcset => _blink.BlinkHTMLSourceElement.instance.srcset_Getter_(this);
 
   @DomName('HTMLSourceElement.srcset')
   @DocsEditable()
   @Experimental() // untriaged
-  void set srcset(String value) => _blink.BlinkHTMLSourceElement.srcset_Setter(this, value);
+  void set srcset(String value) => _blink.BlinkHTMLSourceElement.instance.srcset_Setter_(this, value);
 
   @DomName('HTMLSourceElement.type')
   @DocsEditable()
-  String get type => _blink.BlinkHTMLSourceElement.type_Getter(this);
+  String get type => _blink.BlinkHTMLSourceElement.instance.type_Getter_(this);
 
   @DomName('HTMLSourceElement.type')
   @DocsEditable()
-  void set type(String value) => _blink.BlinkHTMLSourceElement.type_Setter(this, value);
+  void set type(String value) => _blink.BlinkHTMLSourceElement.instance.type_Setter_(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -28317,22 +28322,22 @@
   @DomName('SourceInfo.facing')
   @DocsEditable()
   @Experimental() // untriaged
-  String get facing => _blink.BlinkSourceInfo.facing_Getter(this);
+  String get facing => _blink.BlinkSourceInfo.instance.facing_Getter_(this);
 
   @DomName('SourceInfo.id')
   @DocsEditable()
   @Experimental() // untriaged
-  String get id => _blink.BlinkSourceInfo.id_Getter(this);
+  String get id => _blink.BlinkSourceInfo.instance.id_Getter_(this);
 
   @DomName('SourceInfo.kind')
   @DocsEditable()
   @Experimental() // untriaged
-  String get kind => _blink.BlinkSourceInfo.kind_Getter(this);
+  String get kind => _blink.BlinkSourceInfo.instance.kind_Getter_(this);
 
   @DomName('SourceInfo.label')
   @DocsEditable()
   @Experimental() // untriaged
-  String get label => _blink.BlinkSourceInfo.label_Getter(this);
+  String get label => _blink.BlinkSourceInfo.instance.label_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -28377,24 +28382,24 @@
   @DomName('SpeechGrammar.SpeechGrammar')
   @DocsEditable()
   factory SpeechGrammar() {
-    return _blink.BlinkSpeechGrammar.constructorCallback();
+    return _blink.BlinkSpeechGrammar.instance.constructorCallback_0_();
   }
 
   @DomName('SpeechGrammar.src')
   @DocsEditable()
-  String get src => _blink.BlinkSpeechGrammar.src_Getter(this);
+  String get src => _blink.BlinkSpeechGrammar.instance.src_Getter_(this);
 
   @DomName('SpeechGrammar.src')
   @DocsEditable()
-  void set src(String value) => _blink.BlinkSpeechGrammar.src_Setter(this, value);
+  void set src(String value) => _blink.BlinkSpeechGrammar.instance.src_Setter_(this, value);
 
   @DomName('SpeechGrammar.weight')
   @DocsEditable()
-  num get weight => _blink.BlinkSpeechGrammar.weight_Getter(this);
+  num get weight => _blink.BlinkSpeechGrammar.instance.weight_Getter_(this);
 
   @DomName('SpeechGrammar.weight')
   @DocsEditable()
-  void set weight(num value) => _blink.BlinkSpeechGrammar.weight_Setter(this, value);
+  void set weight(num value) => _blink.BlinkSpeechGrammar.instance.weight_Setter_(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -28415,20 +28420,20 @@
   @DomName('SpeechGrammarList.SpeechGrammarList')
   @DocsEditable()
   factory SpeechGrammarList() {
-    return _blink.BlinkSpeechGrammarList.constructorCallback();
+    return _blink.BlinkSpeechGrammarList.instance.constructorCallback_0_();
   }
 
   @DomName('SpeechGrammarList.length')
   @DocsEditable()
-  int get length => _blink.BlinkSpeechGrammarList.length_Getter(this);
+  int get length => _blink.BlinkSpeechGrammarList.instance.length_Getter_(this);
 
   SpeechGrammar operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _blink.BlinkSpeechGrammarList.item_Callback_1(this, index);
+    return _blink.BlinkSpeechGrammarList.instance.item_Callback_1_(this, index);
   }
 
-  SpeechGrammar _nativeIndexedGetter(int index) => _blink.BlinkSpeechGrammarList.item_Callback_1(this, index);
+  SpeechGrammar _nativeIndexedGetter(int index) => _blink.BlinkSpeechGrammarList.instance.item_Callback_1_(this, index);
 
   void operator[]=(int index, SpeechGrammar value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -28470,25 +28475,25 @@
 
   void addFromString(String string, [num weight]) {
     if (weight != null) {
-      _blink.BlinkSpeechGrammarList.addFromString_Callback_2(this, string, weight);
+      _blink.BlinkSpeechGrammarList.instance.addFromString_Callback_2_(this, string, weight);
       return;
     }
-    _blink.BlinkSpeechGrammarList.addFromString_Callback_1(this, string);
+    _blink.BlinkSpeechGrammarList.instance.addFromString_Callback_1_(this, string);
     return;
   }
 
   void addFromUri(String src, [num weight]) {
     if (weight != null) {
-      _blink.BlinkSpeechGrammarList.addFromUri_Callback_2(this, src, weight);
+      _blink.BlinkSpeechGrammarList.instance.addFromUri_Callback_2_(this, src, weight);
       return;
     }
-    _blink.BlinkSpeechGrammarList.addFromUri_Callback_1(this, src);
+    _blink.BlinkSpeechGrammarList.instance.addFromUri_Callback_1_(this, src);
     return;
   }
 
   @DomName('SpeechGrammarList.item')
   @DocsEditable()
-  SpeechGrammar item(int index) => _blink.BlinkSpeechGrammarList.item_Callback_1(this, index);
+  SpeechGrammar item(int index) => _blink.BlinkSpeechGrammarList.instance.item_Callback_1_(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -28620,7 +28625,7 @@
   @DomName('SpeechRecognition.SpeechRecognition')
   @DocsEditable()
   factory SpeechRecognition() {
-    return _blink.BlinkSpeechRecognition.constructorCallback();
+    return _blink.BlinkSpeechRecognition.instance.constructorCallback_0_();
   }
 
   /// Checks if this type is supported on the current platform.
@@ -28628,55 +28633,55 @@
 
   @DomName('SpeechRecognition.continuous')
   @DocsEditable()
-  bool get continuous => _blink.BlinkSpeechRecognition.continuous_Getter(this);
+  bool get continuous => _blink.BlinkSpeechRecognition.instance.continuous_Getter_(this);
 
   @DomName('SpeechRecognition.continuous')
   @DocsEditable()
-  void set continuous(bool value) => _blink.BlinkSpeechRecognition.continuous_Setter(this, value);
+  void set continuous(bool value) => _blink.BlinkSpeechRecognition.instance.continuous_Setter_(this, value);
 
   @DomName('SpeechRecognition.grammars')
   @DocsEditable()
-  SpeechGrammarList get grammars => _blink.BlinkSpeechRecognition.grammars_Getter(this);
+  SpeechGrammarList get grammars => _blink.BlinkSpeechRecognition.instance.grammars_Getter_(this);
 
   @DomName('SpeechRecognition.grammars')
   @DocsEditable()
-  void set grammars(SpeechGrammarList value) => _blink.BlinkSpeechRecognition.grammars_Setter(this, value);
+  void set grammars(SpeechGrammarList value) => _blink.BlinkSpeechRecognition.instance.grammars_Setter_(this, value);
 
   @DomName('SpeechRecognition.interimResults')
   @DocsEditable()
-  bool get interimResults => _blink.BlinkSpeechRecognition.interimResults_Getter(this);
+  bool get interimResults => _blink.BlinkSpeechRecognition.instance.interimResults_Getter_(this);
 
   @DomName('SpeechRecognition.interimResults')
   @DocsEditable()
-  void set interimResults(bool value) => _blink.BlinkSpeechRecognition.interimResults_Setter(this, value);
+  void set interimResults(bool value) => _blink.BlinkSpeechRecognition.instance.interimResults_Setter_(this, value);
 
   @DomName('SpeechRecognition.lang')
   @DocsEditable()
-  String get lang => _blink.BlinkSpeechRecognition.lang_Getter(this);
+  String get lang => _blink.BlinkSpeechRecognition.instance.lang_Getter_(this);
 
   @DomName('SpeechRecognition.lang')
   @DocsEditable()
-  void set lang(String value) => _blink.BlinkSpeechRecognition.lang_Setter(this, value);
+  void set lang(String value) => _blink.BlinkSpeechRecognition.instance.lang_Setter_(this, value);
 
   @DomName('SpeechRecognition.maxAlternatives')
   @DocsEditable()
-  int get maxAlternatives => _blink.BlinkSpeechRecognition.maxAlternatives_Getter(this);
+  int get maxAlternatives => _blink.BlinkSpeechRecognition.instance.maxAlternatives_Getter_(this);
 
   @DomName('SpeechRecognition.maxAlternatives')
   @DocsEditable()
-  void set maxAlternatives(int value) => _blink.BlinkSpeechRecognition.maxAlternatives_Setter(this, value);
+  void set maxAlternatives(int value) => _blink.BlinkSpeechRecognition.instance.maxAlternatives_Setter_(this, value);
 
   @DomName('SpeechRecognition.abort')
   @DocsEditable()
-  void abort() => _blink.BlinkSpeechRecognition.abort_Callback(this);
+  void abort() => _blink.BlinkSpeechRecognition.instance.abort_Callback_0_(this);
 
   @DomName('SpeechRecognition.start')
   @DocsEditable()
-  void start() => _blink.BlinkSpeechRecognition.start_Callback(this);
+  void start() => _blink.BlinkSpeechRecognition.instance.start_Callback_0_(this);
 
   @DomName('SpeechRecognition.stop')
   @DocsEditable()
-  void stop() => _blink.BlinkSpeechRecognition.stop_Callback(this);
+  void stop() => _blink.BlinkSpeechRecognition.instance.stop_Callback_0_(this);
 
   /// Stream of `audioend` events handled by this [SpeechRecognition].
   @DomName('SpeechRecognition.onaudioend')
@@ -28752,11 +28757,11 @@
 
   @DomName('SpeechRecognitionAlternative.confidence')
   @DocsEditable()
-  double get confidence => _blink.BlinkSpeechRecognitionAlternative.confidence_Getter(this);
+  double get confidence => _blink.BlinkSpeechRecognitionAlternative.instance.confidence_Getter_(this);
 
   @DomName('SpeechRecognitionAlternative.transcript')
   @DocsEditable()
-  String get transcript => _blink.BlinkSpeechRecognitionAlternative.transcript_Getter(this);
+  String get transcript => _blink.BlinkSpeechRecognitionAlternative.instance.transcript_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -28777,11 +28782,11 @@
 
   @DomName('SpeechRecognitionError.error')
   @DocsEditable()
-  String get error => _blink.BlinkSpeechRecognitionError.error_Getter(this);
+  String get error => _blink.BlinkSpeechRecognitionError.instance.error_Getter_(this);
 
   @DomName('SpeechRecognitionError.message')
   @DocsEditable()
-  String get message => _blink.BlinkSpeechRecognitionError.message_Getter(this);
+  String get message => _blink.BlinkSpeechRecognitionError.instance.message_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -28802,19 +28807,19 @@
 
   @DomName('SpeechRecognitionEvent.emma')
   @DocsEditable()
-  Document get emma => _blink.BlinkSpeechRecognitionEvent.emma_Getter(this);
+  Document get emma => _blink.BlinkSpeechRecognitionEvent.instance.emma_Getter_(this);
 
   @DomName('SpeechRecognitionEvent.interpretation')
   @DocsEditable()
-  Document get interpretation => _blink.BlinkSpeechRecognitionEvent.interpretation_Getter(this);
+  Document get interpretation => _blink.BlinkSpeechRecognitionEvent.instance.interpretation_Getter_(this);
 
   @DomName('SpeechRecognitionEvent.resultIndex')
   @DocsEditable()
-  int get resultIndex => _blink.BlinkSpeechRecognitionEvent.resultIndex_Getter(this);
+  int get resultIndex => _blink.BlinkSpeechRecognitionEvent.instance.resultIndex_Getter_(this);
 
   @DomName('SpeechRecognitionEvent.results')
   @DocsEditable()
-  List<SpeechRecognitionResult> get results => _blink.BlinkSpeechRecognitionEvent.results_Getter(this);
+  List<SpeechRecognitionResult> get results => _blink.BlinkSpeechRecognitionEvent.instance.results_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -28835,15 +28840,15 @@
 
   @DomName('SpeechRecognitionResult.isFinal')
   @DocsEditable()
-  bool get isFinal => _blink.BlinkSpeechRecognitionResult.isFinal_Getter(this);
+  bool get isFinal => _blink.BlinkSpeechRecognitionResult.instance.isFinal_Getter_(this);
 
   @DomName('SpeechRecognitionResult.length')
   @DocsEditable()
-  int get length => _blink.BlinkSpeechRecognitionResult.length_Getter(this);
+  int get length => _blink.BlinkSpeechRecognitionResult.instance.length_Getter_(this);
 
   @DomName('SpeechRecognitionResult.item')
   @DocsEditable()
-  SpeechRecognitionAlternative item(int index) => _blink.BlinkSpeechRecognitionResult.item_Callback_1(this, index);
+  SpeechRecognitionAlternative item(int index) => _blink.BlinkSpeechRecognitionResult.instance.item_Callback_1_(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -28863,35 +28868,35 @@
 
   @DomName('SpeechSynthesis.paused')
   @DocsEditable()
-  bool get paused => _blink.BlinkSpeechSynthesis.paused_Getter(this);
+  bool get paused => _blink.BlinkSpeechSynthesis.instance.paused_Getter_(this);
 
   @DomName('SpeechSynthesis.pending')
   @DocsEditable()
-  bool get pending => _blink.BlinkSpeechSynthesis.pending_Getter(this);
+  bool get pending => _blink.BlinkSpeechSynthesis.instance.pending_Getter_(this);
 
   @DomName('SpeechSynthesis.speaking')
   @DocsEditable()
-  bool get speaking => _blink.BlinkSpeechSynthesis.speaking_Getter(this);
+  bool get speaking => _blink.BlinkSpeechSynthesis.instance.speaking_Getter_(this);
 
   @DomName('SpeechSynthesis.cancel')
   @DocsEditable()
-  void cancel() => _blink.BlinkSpeechSynthesis.cancel_Callback(this);
+  void cancel() => _blink.BlinkSpeechSynthesis.instance.cancel_Callback_0_(this);
 
   @DomName('SpeechSynthesis.getVoices')
   @DocsEditable()
-  List<SpeechSynthesisVoice> getVoices() => _blink.BlinkSpeechSynthesis.getVoices_Callback(this);
+  List<SpeechSynthesisVoice> getVoices() => _blink.BlinkSpeechSynthesis.instance.getVoices_Callback_0_(this);
 
   @DomName('SpeechSynthesis.pause')
   @DocsEditable()
-  void pause() => _blink.BlinkSpeechSynthesis.pause_Callback(this);
+  void pause() => _blink.BlinkSpeechSynthesis.instance.pause_Callback_0_(this);
 
   @DomName('SpeechSynthesis.resume')
   @DocsEditable()
-  void resume() => _blink.BlinkSpeechSynthesis.resume_Callback(this);
+  void resume() => _blink.BlinkSpeechSynthesis.instance.resume_Callback_0_(this);
 
   @DomName('SpeechSynthesis.speak')
   @DocsEditable()
-  void speak(SpeechSynthesisUtterance utterance) => _blink.BlinkSpeechSynthesis.speak_Callback_1(this, utterance);
+  void speak(SpeechSynthesisUtterance utterance) => _blink.BlinkSpeechSynthesis.instance.speak_Callback_1_(this, utterance);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -28911,15 +28916,15 @@
 
   @DomName('SpeechSynthesisEvent.charIndex')
   @DocsEditable()
-  int get charIndex => _blink.BlinkSpeechSynthesisEvent.charIndex_Getter(this);
+  int get charIndex => _blink.BlinkSpeechSynthesisEvent.instance.charIndex_Getter_(this);
 
   @DomName('SpeechSynthesisEvent.elapsedTime')
   @DocsEditable()
-  double get elapsedTime => _blink.BlinkSpeechSynthesisEvent.elapsedTime_Getter(this);
+  double get elapsedTime => _blink.BlinkSpeechSynthesisEvent.instance.elapsedTime_Getter_(this);
 
   @DomName('SpeechSynthesisEvent.name')
   @DocsEditable()
-  String get name => _blink.BlinkSpeechSynthesisEvent.name_Getter(this);
+  String get name => _blink.BlinkSpeechSynthesisEvent.instance.name_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -29010,56 +29015,56 @@
   @DomName('SpeechSynthesisUtterance.SpeechSynthesisUtterance')
   @DocsEditable()
   factory SpeechSynthesisUtterance([String text]) {
-    return _blink.BlinkSpeechSynthesisUtterance.constructorCallback_1(text);
+    return _blink.BlinkSpeechSynthesisUtterance.instance.constructorCallback_1_(text);
   }
 
   @DomName('SpeechSynthesisUtterance.lang')
   @DocsEditable()
-  String get lang => _blink.BlinkSpeechSynthesisUtterance.lang_Getter(this);
+  String get lang => _blink.BlinkSpeechSynthesisUtterance.instance.lang_Getter_(this);
 
   @DomName('SpeechSynthesisUtterance.lang')
   @DocsEditable()
-  void set lang(String value) => _blink.BlinkSpeechSynthesisUtterance.lang_Setter(this, value);
+  void set lang(String value) => _blink.BlinkSpeechSynthesisUtterance.instance.lang_Setter_(this, value);
 
   @DomName('SpeechSynthesisUtterance.pitch')
   @DocsEditable()
-  num get pitch => _blink.BlinkSpeechSynthesisUtterance.pitch_Getter(this);
+  num get pitch => _blink.BlinkSpeechSynthesisUtterance.instance.pitch_Getter_(this);
 
   @DomName('SpeechSynthesisUtterance.pitch')
   @DocsEditable()
-  void set pitch(num value) => _blink.BlinkSpeechSynthesisUtterance.pitch_Setter(this, value);
+  void set pitch(num value) => _blink.BlinkSpeechSynthesisUtterance.instance.pitch_Setter_(this, value);
 
   @DomName('SpeechSynthesisUtterance.rate')
   @DocsEditable()
-  num get rate => _blink.BlinkSpeechSynthesisUtterance.rate_Getter(this);
+  num get rate => _blink.BlinkSpeechSynthesisUtterance.instance.rate_Getter_(this);
 
   @DomName('SpeechSynthesisUtterance.rate')
   @DocsEditable()
-  void set rate(num value) => _blink.BlinkSpeechSynthesisUtterance.rate_Setter(this, value);
+  void set rate(num value) => _blink.BlinkSpeechSynthesisUtterance.instance.rate_Setter_(this, value);
 
   @DomName('SpeechSynthesisUtterance.text')
   @DocsEditable()
-  String get text => _blink.BlinkSpeechSynthesisUtterance.text_Getter(this);
+  String get text => _blink.BlinkSpeechSynthesisUtterance.instance.text_Getter_(this);
 
   @DomName('SpeechSynthesisUtterance.text')
   @DocsEditable()
-  void set text(String value) => _blink.BlinkSpeechSynthesisUtterance.text_Setter(this, value);
+  void set text(String value) => _blink.BlinkSpeechSynthesisUtterance.instance.text_Setter_(this, value);
 
   @DomName('SpeechSynthesisUtterance.voice')
   @DocsEditable()
-  SpeechSynthesisVoice get voice => _blink.BlinkSpeechSynthesisUtterance.voice_Getter(this);
+  SpeechSynthesisVoice get voice => _blink.BlinkSpeechSynthesisUtterance.instance.voice_Getter_(this);
 
   @DomName('SpeechSynthesisUtterance.voice')
   @DocsEditable()
-  void set voice(SpeechSynthesisVoice value) => _blink.BlinkSpeechSynthesisUtterance.voice_Setter(this, value);
+  void set voice(SpeechSynthesisVoice value) => _blink.BlinkSpeechSynthesisUtterance.instance.voice_Setter_(this, value);
 
   @DomName('SpeechSynthesisUtterance.volume')
   @DocsEditable()
-  num get volume => _blink.BlinkSpeechSynthesisUtterance.volume_Getter(this);
+  num get volume => _blink.BlinkSpeechSynthesisUtterance.instance.volume_Getter_(this);
 
   @DomName('SpeechSynthesisUtterance.volume')
   @DocsEditable()
-  void set volume(num value) => _blink.BlinkSpeechSynthesisUtterance.volume_Setter(this, value);
+  void set volume(num value) => _blink.BlinkSpeechSynthesisUtterance.instance.volume_Setter_(this, value);
 
   /// Stream of `boundary` events handled by this [SpeechSynthesisUtterance].
   @DomName('SpeechSynthesisUtterance.onboundary')
@@ -29114,23 +29119,23 @@
 
   @DomName('SpeechSynthesisVoice.default')
   @DocsEditable()
-  bool get defaultValue => _blink.BlinkSpeechSynthesisVoice.default_Getter(this);
+  bool get defaultValue => _blink.BlinkSpeechSynthesisVoice.instance.default_Getter_(this);
 
   @DomName('SpeechSynthesisVoice.lang')
   @DocsEditable()
-  String get lang => _blink.BlinkSpeechSynthesisVoice.lang_Getter(this);
+  String get lang => _blink.BlinkSpeechSynthesisVoice.instance.lang_Getter_(this);
 
   @DomName('SpeechSynthesisVoice.localService')
   @DocsEditable()
-  bool get localService => _blink.BlinkSpeechSynthesisVoice.localService_Getter(this);
+  bool get localService => _blink.BlinkSpeechSynthesisVoice.instance.localService_Getter_(this);
 
   @DomName('SpeechSynthesisVoice.name')
   @DocsEditable()
-  String get name => _blink.BlinkSpeechSynthesisVoice.name_Getter(this);
+  String get name => _blink.BlinkSpeechSynthesisVoice.instance.name_Getter_(this);
 
   @DomName('SpeechSynthesisVoice.voiceURI')
   @DocsEditable()
-  String get voiceUri => _blink.BlinkSpeechSynthesisVoice.voiceURI_Getter(this);
+  String get voiceUri => _blink.BlinkSpeechSynthesisVoice.instance.voiceURI_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -29225,35 +29230,35 @@
 
   @DomName('Storage.length')
   @DocsEditable()
-  int get _length => _blink.BlinkStorage.length_Getter(this);
+  int get _length => _blink.BlinkStorage.instance.length_Getter_(this);
 
   bool __delete__(index_OR_name) {
     if ((index_OR_name is int || index_OR_name == null)) {
-      return _blink.BlinkStorage.$__delete___Callback_1(this, index_OR_name);
+      return _blink.BlinkStorage.instance.$__delete___Callback_1_(this, index_OR_name);
     }
     if ((index_OR_name is String || index_OR_name == null)) {
-      return _blink.BlinkStorage.$__delete___Callback_1(this, index_OR_name);
+      return _blink.BlinkStorage.instance.$__delete___Callback_1_(this, index_OR_name);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
   String __getter__(index_OR_name) {
     if ((index_OR_name is int || index_OR_name == null)) {
-      return _blink.BlinkStorage.$__getter___Callback_1(this, index_OR_name);
+      return _blink.BlinkStorage.instance.$__getter___Callback_1_(this, index_OR_name);
     }
     if ((index_OR_name is String || index_OR_name == null)) {
-      return _blink.BlinkStorage.$__getter___Callback_1(this, index_OR_name);
+      return _blink.BlinkStorage.instance.$__getter___Callback_1_(this, index_OR_name);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
   void __setter__(index_OR_name, String value) {
     if ((value is String || value == null) && (index_OR_name is int || index_OR_name == null)) {
-      _blink.BlinkStorage.$__setter___Callback_2(this, index_OR_name, value);
+      _blink.BlinkStorage.instance.$__setter___Callback_2_(this, index_OR_name, value);
       return;
     }
     if ((value is String || value == null) && (index_OR_name is String || index_OR_name == null)) {
-      _blink.BlinkStorage.$__setter___Callback_2(this, index_OR_name, value);
+      _blink.BlinkStorage.instance.$__setter___Callback_2_(this, index_OR_name, value);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -29261,23 +29266,23 @@
 
   @DomName('Storage.clear')
   @DocsEditable()
-  void _clear() => _blink.BlinkStorage.clear_Callback(this);
+  void _clear() => _blink.BlinkStorage.instance.clear_Callback_0_(this);
 
   @DomName('Storage.getItem')
   @DocsEditable()
-  String _getItem(String key) => _blink.BlinkStorage.getItem_Callback_1(this, key);
+  String _getItem(String key) => _blink.BlinkStorage.instance.getItem_Callback_1_(this, key);
 
   @DomName('Storage.key')
   @DocsEditable()
-  String _key(int index) => _blink.BlinkStorage.key_Callback_1(this, index);
+  String _key(int index) => _blink.BlinkStorage.instance.key_Callback_1_(this, index);
 
   @DomName('Storage.removeItem')
   @DocsEditable()
-  void _removeItem(String key) => _blink.BlinkStorage.removeItem_Callback_1(this, key);
+  void _removeItem(String key) => _blink.BlinkStorage.instance.removeItem_Callback_1_(this, key);
 
   @DomName('Storage.setItem')
   @DocsEditable()
-  void _setItem(String key, String data) => _blink.BlinkStorage.setItem_Callback_2(this, key, data);
+  void _setItem(String key, String data) => _blink.BlinkStorage.instance.setItem_Callback_2_(this, key, data);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -29315,27 +29320,27 @@
 
   @DomName('StorageEvent.key')
   @DocsEditable()
-  String get key => _blink.BlinkStorageEvent.key_Getter(this);
+  String get key => _blink.BlinkStorageEvent.instance.key_Getter_(this);
 
   @DomName('StorageEvent.newValue')
   @DocsEditable()
-  String get newValue => _blink.BlinkStorageEvent.newValue_Getter(this);
+  String get newValue => _blink.BlinkStorageEvent.instance.newValue_Getter_(this);
 
   @DomName('StorageEvent.oldValue')
   @DocsEditable()
-  String get oldValue => _blink.BlinkStorageEvent.oldValue_Getter(this);
+  String get oldValue => _blink.BlinkStorageEvent.instance.oldValue_Getter_(this);
 
   @DomName('StorageEvent.storageArea')
   @DocsEditable()
-  Storage get storageArea => _blink.BlinkStorageEvent.storageArea_Getter(this);
+  Storage get storageArea => _blink.BlinkStorageEvent.instance.storageArea_Getter_(this);
 
   @DomName('StorageEvent.url')
   @DocsEditable()
-  String get url => _blink.BlinkStorageEvent.url_Getter(this);
+  String get url => _blink.BlinkStorageEvent.instance.url_Getter_(this);
 
   @DomName('StorageEvent.initStorageEvent')
   @DocsEditable()
-  void _initStorageEvent(String typeArg, bool canBubbleArg, bool cancelableArg, String keyArg, String oldValueArg, String newValueArg, String urlArg, Storage storageAreaArg) => _blink.BlinkStorageEvent.initStorageEvent_Callback_8(this, typeArg, canBubbleArg, cancelableArg, keyArg, oldValueArg, newValueArg, urlArg, storageAreaArg);
+  void _initStorageEvent(String typeArg, bool canBubbleArg, bool cancelableArg, String keyArg, String oldValueArg, String newValueArg, String urlArg, Storage storageAreaArg) => _blink.BlinkStorageEvent.instance.initStorageEvent_Callback_8_(this, typeArg, canBubbleArg, cancelableArg, keyArg, oldValueArg, newValueArg, urlArg, storageAreaArg);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -29356,12 +29361,12 @@
   @DomName('StorageInfo.quota')
   @DocsEditable()
   @Experimental() // untriaged
-  int get quota => _blink.BlinkStorageInfo.quota_Getter(this);
+  int get quota => _blink.BlinkStorageInfo.instance.quota_Getter_(this);
 
   @DomName('StorageInfo.usage')
   @DocsEditable()
   @Experimental() // untriaged
-  int get usage => _blink.BlinkStorageInfo.usage_Getter(this);
+  int get usage => _blink.BlinkStorageInfo.instance.usage_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -29382,17 +29387,17 @@
   @DomName('StorageQuota.supportedTypes')
   @DocsEditable()
   @Experimental() // untriaged
-  List<String> get supportedTypes => _blink.BlinkStorageQuota.supportedTypes_Getter(this);
+  List<String> get supportedTypes => _blink.BlinkStorageQuota.instance.supportedTypes_Getter_(this);
 
   @DomName('StorageQuota.queryInfo')
   @DocsEditable()
   @Experimental() // untriaged
-  Future queryInfo(String type) => _blink.BlinkStorageQuota.queryInfo_Callback_1(this, type);
+  Future queryInfo(String type) => _blink.BlinkStorageQuota.instance.queryInfo_Callback_1_(this, type);
 
   @DomName('StorageQuota.requestPersistentQuota')
   @DocsEditable()
   @Experimental() // untriaged
-  Future requestPersistentQuota(int newQuota) => _blink.BlinkStorageQuota.requestPersistentQuota_Callback_1(this, newQuota);
+  Future requestPersistentQuota(int newQuota) => _blink.BlinkStorageQuota.instance.requestPersistentQuota_Callback_1_(this, newQuota);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -29453,31 +29458,31 @@
 
   @DomName('HTMLStyleElement.disabled')
   @DocsEditable()
-  bool get disabled => _blink.BlinkHTMLStyleElement.disabled_Getter(this);
+  bool get disabled => _blink.BlinkHTMLStyleElement.instance.disabled_Getter_(this);
 
   @DomName('HTMLStyleElement.disabled')
   @DocsEditable()
-  void set disabled(bool value) => _blink.BlinkHTMLStyleElement.disabled_Setter(this, value);
+  void set disabled(bool value) => _blink.BlinkHTMLStyleElement.instance.disabled_Setter_(this, value);
 
   @DomName('HTMLStyleElement.media')
   @DocsEditable()
-  String get media => _blink.BlinkHTMLStyleElement.media_Getter(this);
+  String get media => _blink.BlinkHTMLStyleElement.instance.media_Getter_(this);
 
   @DomName('HTMLStyleElement.media')
   @DocsEditable()
-  void set media(String value) => _blink.BlinkHTMLStyleElement.media_Setter(this, value);
+  void set media(String value) => _blink.BlinkHTMLStyleElement.instance.media_Setter_(this, value);
 
   @DomName('HTMLStyleElement.sheet')
   @DocsEditable()
-  StyleSheet get sheet => _blink.BlinkHTMLStyleElement.sheet_Getter(this);
+  StyleSheet get sheet => _blink.BlinkHTMLStyleElement.instance.sheet_Getter_(this);
 
   @DomName('HTMLStyleElement.type')
   @DocsEditable()
-  String get type => _blink.BlinkHTMLStyleElement.type_Getter(this);
+  String get type => _blink.BlinkHTMLStyleElement.instance.type_Getter_(this);
 
   @DomName('HTMLStyleElement.type')
   @DocsEditable()
-  void set type(String value) => _blink.BlinkHTMLStyleElement.type_Setter(this, value);
+  void set type(String value) => _blink.BlinkHTMLStyleElement.instance.type_Setter_(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -29497,11 +29502,11 @@
 
   @DomName('StyleMedia.type')
   @DocsEditable()
-  String get type => _blink.BlinkStyleMedia.type_Getter(this);
+  String get type => _blink.BlinkStyleMedia.instance.type_Getter_(this);
 
   @DomName('StyleMedia.matchMedium')
   @DocsEditable()
-  bool matchMedium(String mediaquery) => _blink.BlinkStyleMedia.matchMedium_Callback_1(this, mediaquery);
+  bool matchMedium(String mediaquery) => _blink.BlinkStyleMedia.instance.matchMedium_Callback_1_(this, mediaquery);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -29519,35 +29524,35 @@
 
   @DomName('StyleSheet.disabled')
   @DocsEditable()
-  bool get disabled => _blink.BlinkStyleSheet.disabled_Getter(this);
+  bool get disabled => _blink.BlinkStyleSheet.instance.disabled_Getter_(this);
 
   @DomName('StyleSheet.disabled')
   @DocsEditable()
-  void set disabled(bool value) => _blink.BlinkStyleSheet.disabled_Setter(this, value);
+  void set disabled(bool value) => _blink.BlinkStyleSheet.instance.disabled_Setter_(this, value);
 
   @DomName('StyleSheet.href')
   @DocsEditable()
-  String get href => _blink.BlinkStyleSheet.href_Getter(this);
+  String get href => _blink.BlinkStyleSheet.instance.href_Getter_(this);
 
   @DomName('StyleSheet.media')
   @DocsEditable()
-  MediaList get media => _blink.BlinkStyleSheet.media_Getter(this);
+  MediaList get media => _blink.BlinkStyleSheet.instance.media_Getter_(this);
 
   @DomName('StyleSheet.ownerNode')
   @DocsEditable()
-  Node get ownerNode => _blink.BlinkStyleSheet.ownerNode_Getter(this);
+  Node get ownerNode => _blink.BlinkStyleSheet.instance.ownerNode_Getter_(this);
 
   @DomName('StyleSheet.parentStyleSheet')
   @DocsEditable()
-  StyleSheet get parentStyleSheet => _blink.BlinkStyleSheet.parentStyleSheet_Getter(this);
+  StyleSheet get parentStyleSheet => _blink.BlinkStyleSheet.instance.parentStyleSheet_Getter_(this);
 
   @DomName('StyleSheet.title')
   @DocsEditable()
-  String get title => _blink.BlinkStyleSheet.title_Getter(this);
+  String get title => _blink.BlinkStyleSheet.instance.title_Getter_(this);
 
   @DomName('StyleSheet.type')
   @DocsEditable()
-  String get type => _blink.BlinkStyleSheet.type_Getter(this);
+  String get type => _blink.BlinkStyleSheet.instance.type_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -29599,31 +29604,31 @@
 
   @DomName('HTMLTableCellElement.cellIndex')
   @DocsEditable()
-  int get cellIndex => _blink.BlinkHTMLTableCellElement.cellIndex_Getter(this);
+  int get cellIndex => _blink.BlinkHTMLTableCellElement.instance.cellIndex_Getter_(this);
 
   @DomName('HTMLTableCellElement.colSpan')
   @DocsEditable()
-  int get colSpan => _blink.BlinkHTMLTableCellElement.colSpan_Getter(this);
+  int get colSpan => _blink.BlinkHTMLTableCellElement.instance.colSpan_Getter_(this);
 
   @DomName('HTMLTableCellElement.colSpan')
   @DocsEditable()
-  void set colSpan(int value) => _blink.BlinkHTMLTableCellElement.colSpan_Setter(this, value);
+  void set colSpan(int value) => _blink.BlinkHTMLTableCellElement.instance.colSpan_Setter_(this, value);
 
   @DomName('HTMLTableCellElement.headers')
   @DocsEditable()
-  String get headers => _blink.BlinkHTMLTableCellElement.headers_Getter(this);
+  String get headers => _blink.BlinkHTMLTableCellElement.instance.headers_Getter_(this);
 
   @DomName('HTMLTableCellElement.headers')
   @DocsEditable()
-  void set headers(String value) => _blink.BlinkHTMLTableCellElement.headers_Setter(this, value);
+  void set headers(String value) => _blink.BlinkHTMLTableCellElement.instance.headers_Setter_(this, value);
 
   @DomName('HTMLTableCellElement.rowSpan')
   @DocsEditable()
-  int get rowSpan => _blink.BlinkHTMLTableCellElement.rowSpan_Getter(this);
+  int get rowSpan => _blink.BlinkHTMLTableCellElement.instance.rowSpan_Getter_(this);
 
   @DomName('HTMLTableCellElement.rowSpan')
   @DocsEditable()
-  void set rowSpan(int value) => _blink.BlinkHTMLTableCellElement.rowSpan_Setter(this, value);
+  void set rowSpan(int value) => _blink.BlinkHTMLTableCellElement.instance.rowSpan_Setter_(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -29651,11 +29656,11 @@
 
   @DomName('HTMLTableColElement.span')
   @DocsEditable()
-  int get span => _blink.BlinkHTMLTableColElement.span_Getter(this);
+  int get span => _blink.BlinkHTMLTableColElement.instance.span_Getter_(this);
 
   @DomName('HTMLTableColElement.span')
   @DocsEditable()
-  void set span(int value) => _blink.BlinkHTMLTableColElement.span_Setter(this, value);
+  void set span(int value) => _blink.BlinkHTMLTableColElement.instance.span_Setter_(this, value);
 
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -29701,73 +29706,73 @@
 
   @DomName('HTMLTableElement.caption')
   @DocsEditable()
-  TableCaptionElement get caption => _blink.BlinkHTMLTableElement.caption_Getter(this);
+  TableCaptionElement get caption => _blink.BlinkHTMLTableElement.instance.caption_Getter_(this);
 
   @DomName('HTMLTableElement.caption')
   @DocsEditable()
-  void set caption(TableCaptionElement value) => _blink.BlinkHTMLTableElement.caption_Setter(this, value);
+  void set caption(TableCaptionElement value) => _blink.BlinkHTMLTableElement.instance.caption_Setter_(this, value);
 
   @DomName('HTMLTableElement.rows')
   @DocsEditable()
-  List<Node> get _rows => _blink.BlinkHTMLTableElement.rows_Getter(this);
+  List<Node> get _rows => _blink.BlinkHTMLTableElement.instance.rows_Getter_(this);
 
   @DomName('HTMLTableElement.tBodies')
   @DocsEditable()
-  List<Node> get _tBodies => _blink.BlinkHTMLTableElement.tBodies_Getter(this);
+  List<Node> get _tBodies => _blink.BlinkHTMLTableElement.instance.tBodies_Getter_(this);
 
   @DomName('HTMLTableElement.tFoot')
   @DocsEditable()
-  TableSectionElement get tFoot => _blink.BlinkHTMLTableElement.tFoot_Getter(this);
+  TableSectionElement get tFoot => _blink.BlinkHTMLTableElement.instance.tFoot_Getter_(this);
 
   @DomName('HTMLTableElement.tFoot')
   @DocsEditable()
-  void set tFoot(TableSectionElement value) => _blink.BlinkHTMLTableElement.tFoot_Setter(this, value);
+  void set tFoot(TableSectionElement value) => _blink.BlinkHTMLTableElement.instance.tFoot_Setter_(this, value);
 
   @DomName('HTMLTableElement.tHead')
   @DocsEditable()
-  TableSectionElement get tHead => _blink.BlinkHTMLTableElement.tHead_Getter(this);
+  TableSectionElement get tHead => _blink.BlinkHTMLTableElement.instance.tHead_Getter_(this);
 
   @DomName('HTMLTableElement.tHead')
   @DocsEditable()
-  void set tHead(TableSectionElement value) => _blink.BlinkHTMLTableElement.tHead_Setter(this, value);
+  void set tHead(TableSectionElement value) => _blink.BlinkHTMLTableElement.instance.tHead_Setter_(this, value);
 
   @DomName('HTMLTableElement.createCaption')
   @DocsEditable()
-  HtmlElement _createCaption() => _blink.BlinkHTMLTableElement.createCaption_Callback(this);
+  HtmlElement _createCaption() => _blink.BlinkHTMLTableElement.instance.createCaption_Callback_0_(this);
 
   @DomName('HTMLTableElement.createTBody')
   @DocsEditable()
-  HtmlElement _createTBody() => _blink.BlinkHTMLTableElement.createTBody_Callback(this);
+  HtmlElement _createTBody() => _blink.BlinkHTMLTableElement.instance.createTBody_Callback_0_(this);
 
   @DomName('HTMLTableElement.createTFoot')
   @DocsEditable()
-  HtmlElement _createTFoot() => _blink.BlinkHTMLTableElement.createTFoot_Callback(this);
+  HtmlElement _createTFoot() => _blink.BlinkHTMLTableElement.instance.createTFoot_Callback_0_(this);
 
   @DomName('HTMLTableElement.createTHead')
   @DocsEditable()
-  HtmlElement _createTHead() => _blink.BlinkHTMLTableElement.createTHead_Callback(this);
+  HtmlElement _createTHead() => _blink.BlinkHTMLTableElement.instance.createTHead_Callback_0_(this);
 
   @DomName('HTMLTableElement.deleteCaption')
   @DocsEditable()
-  void deleteCaption() => _blink.BlinkHTMLTableElement.deleteCaption_Callback(this);
+  void deleteCaption() => _blink.BlinkHTMLTableElement.instance.deleteCaption_Callback_0_(this);
 
   @DomName('HTMLTableElement.deleteRow')
   @DocsEditable()
-  void deleteRow(int index) => _blink.BlinkHTMLTableElement.deleteRow_Callback_1(this, index);
+  void deleteRow(int index) => _blink.BlinkHTMLTableElement.instance.deleteRow_Callback_1_(this, index);
 
   @DomName('HTMLTableElement.deleteTFoot')
   @DocsEditable()
-  void deleteTFoot() => _blink.BlinkHTMLTableElement.deleteTFoot_Callback(this);
+  void deleteTFoot() => _blink.BlinkHTMLTableElement.instance.deleteTFoot_Callback_0_(this);
 
   @DomName('HTMLTableElement.deleteTHead')
   @DocsEditable()
-  void deleteTHead() => _blink.BlinkHTMLTableElement.deleteTHead_Callback(this);
+  void deleteTHead() => _blink.BlinkHTMLTableElement.instance.deleteTHead_Callback_0_(this);
 
   HtmlElement _insertRow([int index]) {
     if (index != null) {
-      return _blink.BlinkHTMLTableElement.insertRow_Callback_1(this, index);
+      return _blink.BlinkHTMLTableElement.instance.insertRow_Callback_1_(this, index);
     }
-    return _blink.BlinkHTMLTableElement.insertRow_Callback(this);
+    return _blink.BlinkHTMLTableElement.instance.insertRow_Callback_0_(this);
   }
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -29805,25 +29810,25 @@
 
   @DomName('HTMLTableRowElement.cells')
   @DocsEditable()
-  List<Node> get _cells => _blink.BlinkHTMLTableRowElement.cells_Getter(this);
+  List<Node> get _cells => _blink.BlinkHTMLTableRowElement.instance.cells_Getter_(this);
 
   @DomName('HTMLTableRowElement.rowIndex')
   @DocsEditable()
-  int get rowIndex => _blink.BlinkHTMLTableRowElement.rowIndex_Getter(this);
+  int get rowIndex => _blink.BlinkHTMLTableRowElement.instance.rowIndex_Getter_(this);
 
   @DomName('HTMLTableRowElement.sectionRowIndex')
   @DocsEditable()
-  int get sectionRowIndex => _blink.BlinkHTMLTableRowElement.sectionRowIndex_Getter(this);
+  int get sectionRowIndex => _blink.BlinkHTMLTableRowElement.instance.sectionRowIndex_Getter_(this);
 
   @DomName('HTMLTableRowElement.deleteCell')
   @DocsEditable()
-  void deleteCell(int index) => _blink.BlinkHTMLTableRowElement.deleteCell_Callback_1(this, index);
+  void deleteCell(int index) => _blink.BlinkHTMLTableRowElement.instance.deleteCell_Callback_1_(this, index);
 
   HtmlElement _insertCell([int index]) {
     if (index != null) {
-      return _blink.BlinkHTMLTableRowElement.insertCell_Callback_1(this, index);
+      return _blink.BlinkHTMLTableRowElement.instance.insertCell_Callback_1_(this, index);
     }
-    return _blink.BlinkHTMLTableRowElement.insertCell_Callback(this);
+    return _blink.BlinkHTMLTableRowElement.instance.insertCell_Callback_0_(this);
   }
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -29857,17 +29862,17 @@
 
   @DomName('HTMLTableSectionElement.rows')
   @DocsEditable()
-  List<Node> get _rows => _blink.BlinkHTMLTableSectionElement.rows_Getter(this);
+  List<Node> get _rows => _blink.BlinkHTMLTableSectionElement.instance.rows_Getter_(this);
 
   @DomName('HTMLTableSectionElement.deleteRow')
   @DocsEditable()
-  void deleteRow(int index) => _blink.BlinkHTMLTableSectionElement.deleteRow_Callback_1(this, index);
+  void deleteRow(int index) => _blink.BlinkHTMLTableSectionElement.instance.deleteRow_Callback_1_(this, index);
 
   HtmlElement _insertRow([int index]) {
     if (index != null) {
-      return _blink.BlinkHTMLTableSectionElement.insertRow_Callback_1(this, index);
+      return _blink.BlinkHTMLTableSectionElement.instance.insertRow_Callback_1_(this, index);
     }
-    return _blink.BlinkHTMLTableSectionElement.insertRow_Callback(this);
+    return _blink.BlinkHTMLTableSectionElement.instance.insertRow_Callback_0_(this);
   }
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -29901,7 +29906,7 @@
 
   @DomName('HTMLTemplateElement.content')
   @DocsEditable()
-  DocumentFragment get content => _blink.BlinkHTMLTemplateElement.content_Getter(this);
+  DocumentFragment get content => _blink.BlinkHTMLTemplateElement.instance.content_Getter_(this);
 
 
   /**
@@ -29935,16 +29940,16 @@
 
   @DomName('Text.wholeText')
   @DocsEditable()
-  String get wholeText => _blink.BlinkText.wholeText_Getter(this);
+  String get wholeText => _blink.BlinkText.instance.wholeText_Getter_(this);
 
   @DomName('Text.getDestinationInsertionPoints')
   @DocsEditable()
   @Experimental() // untriaged
-  List<Node> getDestinationInsertionPoints() => _blink.BlinkText.getDestinationInsertionPoints_Callback(this);
+  List<Node> getDestinationInsertionPoints() => _blink.BlinkText.instance.getDestinationInsertionPoints_Callback_0_(this);
 
   @DomName('Text.splitText')
   @DocsEditable()
-  Text splitText(int offset) => _blink.BlinkText.splitText_Callback_1(this, offset);
+  Text splitText(int offset) => _blink.BlinkText.instance.splitText_Callback_1_(this, offset);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -29972,194 +29977,194 @@
 
   @DomName('HTMLTextAreaElement.autofocus')
   @DocsEditable()
-  bool get autofocus => _blink.BlinkHTMLTextAreaElement.autofocus_Getter(this);
+  bool get autofocus => _blink.BlinkHTMLTextAreaElement.instance.autofocus_Getter_(this);
 
   @DomName('HTMLTextAreaElement.autofocus')
   @DocsEditable()
-  void set autofocus(bool value) => _blink.BlinkHTMLTextAreaElement.autofocus_Setter(this, value);
+  void set autofocus(bool value) => _blink.BlinkHTMLTextAreaElement.instance.autofocus_Setter_(this, value);
 
   @DomName('HTMLTextAreaElement.cols')
   @DocsEditable()
-  int get cols => _blink.BlinkHTMLTextAreaElement.cols_Getter(this);
+  int get cols => _blink.BlinkHTMLTextAreaElement.instance.cols_Getter_(this);
 
   @DomName('HTMLTextAreaElement.cols')
   @DocsEditable()
-  void set cols(int value) => _blink.BlinkHTMLTextAreaElement.cols_Setter(this, value);
+  void set cols(int value) => _blink.BlinkHTMLTextAreaElement.instance.cols_Setter_(this, value);
 
   @DomName('HTMLTextAreaElement.defaultValue')
   @DocsEditable()
-  String get defaultValue => _blink.BlinkHTMLTextAreaElement.defaultValue_Getter(this);
+  String get defaultValue => _blink.BlinkHTMLTextAreaElement.instance.defaultValue_Getter_(this);
 
   @DomName('HTMLTextAreaElement.defaultValue')
   @DocsEditable()
-  void set defaultValue(String value) => _blink.BlinkHTMLTextAreaElement.defaultValue_Setter(this, value);
+  void set defaultValue(String value) => _blink.BlinkHTMLTextAreaElement.instance.defaultValue_Setter_(this, value);
 
   @DomName('HTMLTextAreaElement.dirName')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-button-element.html#dom-textarea-dirname
   @Experimental()
-  String get dirName => _blink.BlinkHTMLTextAreaElement.dirName_Getter(this);
+  String get dirName => _blink.BlinkHTMLTextAreaElement.instance.dirName_Getter_(this);
 
   @DomName('HTMLTextAreaElement.dirName')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-button-element.html#dom-textarea-dirname
   @Experimental()
-  void set dirName(String value) => _blink.BlinkHTMLTextAreaElement.dirName_Setter(this, value);
+  void set dirName(String value) => _blink.BlinkHTMLTextAreaElement.instance.dirName_Setter_(this, value);
 
   @DomName('HTMLTextAreaElement.disabled')
   @DocsEditable()
-  bool get disabled => _blink.BlinkHTMLTextAreaElement.disabled_Getter(this);
+  bool get disabled => _blink.BlinkHTMLTextAreaElement.instance.disabled_Getter_(this);
 
   @DomName('HTMLTextAreaElement.disabled')
   @DocsEditable()
-  void set disabled(bool value) => _blink.BlinkHTMLTextAreaElement.disabled_Setter(this, value);
+  void set disabled(bool value) => _blink.BlinkHTMLTextAreaElement.instance.disabled_Setter_(this, value);
 
   @DomName('HTMLTextAreaElement.form')
   @DocsEditable()
-  FormElement get form => _blink.BlinkHTMLTextAreaElement.form_Getter(this);
+  FormElement get form => _blink.BlinkHTMLTextAreaElement.instance.form_Getter_(this);
 
   @DomName('HTMLTextAreaElement.inputMode')
   @DocsEditable()
   @Experimental() // untriaged
-  String get inputMode => _blink.BlinkHTMLTextAreaElement.inputMode_Getter(this);
+  String get inputMode => _blink.BlinkHTMLTextAreaElement.instance.inputMode_Getter_(this);
 
   @DomName('HTMLTextAreaElement.inputMode')
   @DocsEditable()
   @Experimental() // untriaged
-  void set inputMode(String value) => _blink.BlinkHTMLTextAreaElement.inputMode_Setter(this, value);
+  void set inputMode(String value) => _blink.BlinkHTMLTextAreaElement.instance.inputMode_Setter_(this, value);
 
   @DomName('HTMLTextAreaElement.labels')
   @DocsEditable()
   @Unstable()
-  List<Node> get labels => _blink.BlinkHTMLTextAreaElement.labels_Getter(this);
+  List<Node> get labels => _blink.BlinkHTMLTextAreaElement.instance.labels_Getter_(this);
 
   @DomName('HTMLTextAreaElement.maxLength')
   @DocsEditable()
-  int get maxLength => _blink.BlinkHTMLTextAreaElement.maxLength_Getter(this);
+  int get maxLength => _blink.BlinkHTMLTextAreaElement.instance.maxLength_Getter_(this);
 
   @DomName('HTMLTextAreaElement.maxLength')
   @DocsEditable()
-  void set maxLength(int value) => _blink.BlinkHTMLTextAreaElement.maxLength_Setter(this, value);
+  void set maxLength(int value) => _blink.BlinkHTMLTextAreaElement.instance.maxLength_Setter_(this, value);
 
   @DomName('HTMLTextAreaElement.name')
   @DocsEditable()
-  String get name => _blink.BlinkHTMLTextAreaElement.name_Getter(this);
+  String get name => _blink.BlinkHTMLTextAreaElement.instance.name_Getter_(this);
 
   @DomName('HTMLTextAreaElement.name')
   @DocsEditable()
-  void set name(String value) => _blink.BlinkHTMLTextAreaElement.name_Setter(this, value);
+  void set name(String value) => _blink.BlinkHTMLTextAreaElement.instance.name_Setter_(this, value);
 
   @DomName('HTMLTextAreaElement.placeholder')
   @DocsEditable()
-  String get placeholder => _blink.BlinkHTMLTextAreaElement.placeholder_Getter(this);
+  String get placeholder => _blink.BlinkHTMLTextAreaElement.instance.placeholder_Getter_(this);
 
   @DomName('HTMLTextAreaElement.placeholder')
   @DocsEditable()
-  void set placeholder(String value) => _blink.BlinkHTMLTextAreaElement.placeholder_Setter(this, value);
+  void set placeholder(String value) => _blink.BlinkHTMLTextAreaElement.instance.placeholder_Setter_(this, value);
 
   @DomName('HTMLTextAreaElement.readOnly')
   @DocsEditable()
-  bool get readOnly => _blink.BlinkHTMLTextAreaElement.readOnly_Getter(this);
+  bool get readOnly => _blink.BlinkHTMLTextAreaElement.instance.readOnly_Getter_(this);
 
   @DomName('HTMLTextAreaElement.readOnly')
   @DocsEditable()
-  void set readOnly(bool value) => _blink.BlinkHTMLTextAreaElement.readOnly_Setter(this, value);
+  void set readOnly(bool value) => _blink.BlinkHTMLTextAreaElement.instance.readOnly_Setter_(this, value);
 
   @DomName('HTMLTextAreaElement.required')
   @DocsEditable()
-  bool get required => _blink.BlinkHTMLTextAreaElement.required_Getter(this);
+  bool get required => _blink.BlinkHTMLTextAreaElement.instance.required_Getter_(this);
 
   @DomName('HTMLTextAreaElement.required')
   @DocsEditable()
-  void set required(bool value) => _blink.BlinkHTMLTextAreaElement.required_Setter(this, value);
+  void set required(bool value) => _blink.BlinkHTMLTextAreaElement.instance.required_Setter_(this, value);
 
   @DomName('HTMLTextAreaElement.rows')
   @DocsEditable()
-  int get rows => _blink.BlinkHTMLTextAreaElement.rows_Getter(this);
+  int get rows => _blink.BlinkHTMLTextAreaElement.instance.rows_Getter_(this);
 
   @DomName('HTMLTextAreaElement.rows')
   @DocsEditable()
-  void set rows(int value) => _blink.BlinkHTMLTextAreaElement.rows_Setter(this, value);
+  void set rows(int value) => _blink.BlinkHTMLTextAreaElement.instance.rows_Setter_(this, value);
 
   @DomName('HTMLTextAreaElement.selectionDirection')
   @DocsEditable()
-  String get selectionDirection => _blink.BlinkHTMLTextAreaElement.selectionDirection_Getter(this);
+  String get selectionDirection => _blink.BlinkHTMLTextAreaElement.instance.selectionDirection_Getter_(this);
 
   @DomName('HTMLTextAreaElement.selectionDirection')
   @DocsEditable()
-  void set selectionDirection(String value) => _blink.BlinkHTMLTextAreaElement.selectionDirection_Setter(this, value);
+  void set selectionDirection(String value) => _blink.BlinkHTMLTextAreaElement.instance.selectionDirection_Setter_(this, value);
 
   @DomName('HTMLTextAreaElement.selectionEnd')
   @DocsEditable()
-  int get selectionEnd => _blink.BlinkHTMLTextAreaElement.selectionEnd_Getter(this);
+  int get selectionEnd => _blink.BlinkHTMLTextAreaElement.instance.selectionEnd_Getter_(this);
 
   @DomName('HTMLTextAreaElement.selectionEnd')
   @DocsEditable()
-  void set selectionEnd(int value) => _blink.BlinkHTMLTextAreaElement.selectionEnd_Setter(this, value);
+  void set selectionEnd(int value) => _blink.BlinkHTMLTextAreaElement.instance.selectionEnd_Setter_(this, value);
 
   @DomName('HTMLTextAreaElement.selectionStart')
   @DocsEditable()
-  int get selectionStart => _blink.BlinkHTMLTextAreaElement.selectionStart_Getter(this);
+  int get selectionStart => _blink.BlinkHTMLTextAreaElement.instance.selectionStart_Getter_(this);
 
   @DomName('HTMLTextAreaElement.selectionStart')
   @DocsEditable()
-  void set selectionStart(int value) => _blink.BlinkHTMLTextAreaElement.selectionStart_Setter(this, value);
+  void set selectionStart(int value) => _blink.BlinkHTMLTextAreaElement.instance.selectionStart_Setter_(this, value);
 
   @DomName('HTMLTextAreaElement.textLength')
   @DocsEditable()
-  int get textLength => _blink.BlinkHTMLTextAreaElement.textLength_Getter(this);
+  int get textLength => _blink.BlinkHTMLTextAreaElement.instance.textLength_Getter_(this);
 
   @DomName('HTMLTextAreaElement.type')
   @DocsEditable()
-  String get type => _blink.BlinkHTMLTextAreaElement.type_Getter(this);
+  String get type => _blink.BlinkHTMLTextAreaElement.instance.type_Getter_(this);
 
   @DomName('HTMLTextAreaElement.validationMessage')
   @DocsEditable()
-  String get validationMessage => _blink.BlinkHTMLTextAreaElement.validationMessage_Getter(this);
+  String get validationMessage => _blink.BlinkHTMLTextAreaElement.instance.validationMessage_Getter_(this);
 
   @DomName('HTMLTextAreaElement.validity')
   @DocsEditable()
-  ValidityState get validity => _blink.BlinkHTMLTextAreaElement.validity_Getter(this);
+  ValidityState get validity => _blink.BlinkHTMLTextAreaElement.instance.validity_Getter_(this);
 
   @DomName('HTMLTextAreaElement.value')
   @DocsEditable()
-  String get value => _blink.BlinkHTMLTextAreaElement.value_Getter(this);
+  String get value => _blink.BlinkHTMLTextAreaElement.instance.value_Getter_(this);
 
   @DomName('HTMLTextAreaElement.value')
   @DocsEditable()
-  void set value(String value) => _blink.BlinkHTMLTextAreaElement.value_Setter(this, value);
+  void set value(String value) => _blink.BlinkHTMLTextAreaElement.instance.value_Setter_(this, value);
 
   @DomName('HTMLTextAreaElement.willValidate')
   @DocsEditable()
-  bool get willValidate => _blink.BlinkHTMLTextAreaElement.willValidate_Getter(this);
+  bool get willValidate => _blink.BlinkHTMLTextAreaElement.instance.willValidate_Getter_(this);
 
   @DomName('HTMLTextAreaElement.wrap')
   @DocsEditable()
-  String get wrap => _blink.BlinkHTMLTextAreaElement.wrap_Getter(this);
+  String get wrap => _blink.BlinkHTMLTextAreaElement.instance.wrap_Getter_(this);
 
   @DomName('HTMLTextAreaElement.wrap')
   @DocsEditable()
-  void set wrap(String value) => _blink.BlinkHTMLTextAreaElement.wrap_Setter(this, value);
+  void set wrap(String value) => _blink.BlinkHTMLTextAreaElement.instance.wrap_Setter_(this, value);
 
   @DomName('HTMLTextAreaElement.checkValidity')
   @DocsEditable()
-  bool checkValidity() => _blink.BlinkHTMLTextAreaElement.checkValidity_Callback(this);
+  bool checkValidity() => _blink.BlinkHTMLTextAreaElement.instance.checkValidity_Callback_0_(this);
 
   @DomName('HTMLTextAreaElement.select')
   @DocsEditable()
-  void select() => _blink.BlinkHTMLTextAreaElement.select_Callback(this);
+  void select() => _blink.BlinkHTMLTextAreaElement.instance.select_Callback_0_(this);
 
   @DomName('HTMLTextAreaElement.setCustomValidity')
   @DocsEditable()
-  void setCustomValidity(String error) => _blink.BlinkHTMLTextAreaElement.setCustomValidity_Callback_1(this, error);
+  void setCustomValidity(String error) => _blink.BlinkHTMLTextAreaElement.instance.setCustomValidity_Callback_1_(this, error);
 
   void setRangeText(String replacement, {int start, int end, String selectionMode}) {
     if ((replacement is String || replacement == null) && start == null && end == null && selectionMode == null) {
-      _blink.BlinkHTMLTextAreaElement.setRangeText_Callback_1(this, replacement);
+      _blink.BlinkHTMLTextAreaElement.instance.setRangeText_Callback_1_(this, replacement);
       return;
     }
     if ((selectionMode is String || selectionMode == null) && (end is int || end == null) && (start is int || start == null) && (replacement is String || replacement == null)) {
-      _blink.BlinkHTMLTextAreaElement.setRangeText_Callback_4(this, replacement, start, end, selectionMode);
+      _blink.BlinkHTMLTextAreaElement.instance.setRangeText_Callback_4_(this, replacement, start, end, selectionMode);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -30167,10 +30172,10 @@
 
   void setSelectionRange(int start, int end, [String direction]) {
     if (direction != null) {
-      _blink.BlinkHTMLTextAreaElement.setSelectionRange_Callback_3(this, start, end, direction);
+      _blink.BlinkHTMLTextAreaElement.instance.setSelectionRange_Callback_3_(this, start, end, direction);
       return;
     }
-    _blink.BlinkHTMLTextAreaElement.setSelectionRange_Callback_2(this, start, end);
+    _blink.BlinkHTMLTextAreaElement.instance.setSelectionRange_Callback_2_(this, start, end);
     return;
   }
 
@@ -30199,11 +30204,11 @@
 
   @DomName('TextEvent.data')
   @DocsEditable()
-  String get data => _blink.BlinkTextEvent.data_Getter(this);
+  String get data => _blink.BlinkTextEvent.instance.data_Getter_(this);
 
   @DomName('TextEvent.initTextEvent')
   @DocsEditable()
-  void _initTextEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Window viewArg, String dataArg) => _blink.BlinkTextEvent.initTextEvent_Callback_5(this, typeArg, canBubbleArg, cancelableArg, viewArg, dataArg);
+  void _initTextEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Window viewArg, String dataArg) => _blink.BlinkTextEvent.instance.initTextEvent_Callback_5_(this, typeArg, canBubbleArg, cancelableArg, viewArg, dataArg);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -30222,61 +30227,61 @@
   @DomName('TextMetrics.actualBoundingBoxAscent')
   @DocsEditable()
   @Experimental() // untriaged
-  double get actualBoundingBoxAscent => _blink.BlinkTextMetrics.actualBoundingBoxAscent_Getter(this);
+  double get actualBoundingBoxAscent => _blink.BlinkTextMetrics.instance.actualBoundingBoxAscent_Getter_(this);
 
   @DomName('TextMetrics.actualBoundingBoxDescent')
   @DocsEditable()
   @Experimental() // untriaged
-  double get actualBoundingBoxDescent => _blink.BlinkTextMetrics.actualBoundingBoxDescent_Getter(this);
+  double get actualBoundingBoxDescent => _blink.BlinkTextMetrics.instance.actualBoundingBoxDescent_Getter_(this);
 
   @DomName('TextMetrics.actualBoundingBoxLeft')
   @DocsEditable()
   @Experimental() // untriaged
-  double get actualBoundingBoxLeft => _blink.BlinkTextMetrics.actualBoundingBoxLeft_Getter(this);
+  double get actualBoundingBoxLeft => _blink.BlinkTextMetrics.instance.actualBoundingBoxLeft_Getter_(this);
 
   @DomName('TextMetrics.actualBoundingBoxRight')
   @DocsEditable()
   @Experimental() // untriaged
-  double get actualBoundingBoxRight => _blink.BlinkTextMetrics.actualBoundingBoxRight_Getter(this);
+  double get actualBoundingBoxRight => _blink.BlinkTextMetrics.instance.actualBoundingBoxRight_Getter_(this);
 
   @DomName('TextMetrics.alphabeticBaseline')
   @DocsEditable()
   @Experimental() // untriaged
-  double get alphabeticBaseline => _blink.BlinkTextMetrics.alphabeticBaseline_Getter(this);
+  double get alphabeticBaseline => _blink.BlinkTextMetrics.instance.alphabeticBaseline_Getter_(this);
 
   @DomName('TextMetrics.emHeightAscent')
   @DocsEditable()
   @Experimental() // untriaged
-  double get emHeightAscent => _blink.BlinkTextMetrics.emHeightAscent_Getter(this);
+  double get emHeightAscent => _blink.BlinkTextMetrics.instance.emHeightAscent_Getter_(this);
 
   @DomName('TextMetrics.emHeightDescent')
   @DocsEditable()
   @Experimental() // untriaged
-  double get emHeightDescent => _blink.BlinkTextMetrics.emHeightDescent_Getter(this);
+  double get emHeightDescent => _blink.BlinkTextMetrics.instance.emHeightDescent_Getter_(this);
 
   @DomName('TextMetrics.fontBoundingBoxAscent')
   @DocsEditable()
   @Experimental() // untriaged
-  double get fontBoundingBoxAscent => _blink.BlinkTextMetrics.fontBoundingBoxAscent_Getter(this);
+  double get fontBoundingBoxAscent => _blink.BlinkTextMetrics.instance.fontBoundingBoxAscent_Getter_(this);
 
   @DomName('TextMetrics.fontBoundingBoxDescent')
   @DocsEditable()
   @Experimental() // untriaged
-  double get fontBoundingBoxDescent => _blink.BlinkTextMetrics.fontBoundingBoxDescent_Getter(this);
+  double get fontBoundingBoxDescent => _blink.BlinkTextMetrics.instance.fontBoundingBoxDescent_Getter_(this);
 
   @DomName('TextMetrics.hangingBaseline')
   @DocsEditable()
   @Experimental() // untriaged
-  double get hangingBaseline => _blink.BlinkTextMetrics.hangingBaseline_Getter(this);
+  double get hangingBaseline => _blink.BlinkTextMetrics.instance.hangingBaseline_Getter_(this);
 
   @DomName('TextMetrics.ideographicBaseline')
   @DocsEditable()
   @Experimental() // untriaged
-  double get ideographicBaseline => _blink.BlinkTextMetrics.ideographicBaseline_Getter(this);
+  double get ideographicBaseline => _blink.BlinkTextMetrics.instance.ideographicBaseline_Getter_(this);
 
   @DomName('TextMetrics.width')
   @DocsEditable()
-  double get width => _blink.BlinkTextMetrics.width_Getter(this);
+  double get width => _blink.BlinkTextMetrics.instance.width_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -30306,59 +30311,59 @@
 
   @DomName('TextTrack.activeCues')
   @DocsEditable()
-  TextTrackCueList get activeCues => _blink.BlinkTextTrack.activeCues_Getter(this);
+  TextTrackCueList get activeCues => _blink.BlinkTextTrack.instance.activeCues_Getter_(this);
 
   @DomName('TextTrack.cues')
   @DocsEditable()
-  TextTrackCueList get cues => _blink.BlinkTextTrack.cues_Getter(this);
+  TextTrackCueList get cues => _blink.BlinkTextTrack.instance.cues_Getter_(this);
 
   @DomName('TextTrack.id')
   @DocsEditable()
   @Experimental() // untriaged
-  String get id => _blink.BlinkTextTrack.id_Getter(this);
+  String get id => _blink.BlinkTextTrack.instance.id_Getter_(this);
 
   @DomName('TextTrack.kind')
   @DocsEditable()
-  String get kind => _blink.BlinkTextTrack.kind_Getter(this);
+  String get kind => _blink.BlinkTextTrack.instance.kind_Getter_(this);
 
   @DomName('TextTrack.label')
   @DocsEditable()
-  String get label => _blink.BlinkTextTrack.label_Getter(this);
+  String get label => _blink.BlinkTextTrack.instance.label_Getter_(this);
 
   @DomName('TextTrack.language')
   @DocsEditable()
-  String get language => _blink.BlinkTextTrack.language_Getter(this);
+  String get language => _blink.BlinkTextTrack.instance.language_Getter_(this);
 
   @DomName('TextTrack.mode')
   @DocsEditable()
-  String get mode => _blink.BlinkTextTrack.mode_Getter(this);
+  String get mode => _blink.BlinkTextTrack.instance.mode_Getter_(this);
 
   @DomName('TextTrack.mode')
   @DocsEditable()
-  void set mode(String value) => _blink.BlinkTextTrack.mode_Setter(this, value);
+  void set mode(String value) => _blink.BlinkTextTrack.instance.mode_Setter_(this, value);
 
   @DomName('TextTrack.regions')
   @DocsEditable()
   @Experimental() // untriaged
-  VttRegionList get regions => _blink.BlinkTextTrack.regions_Getter(this);
+  VttRegionList get regions => _blink.BlinkTextTrack.instance.regions_Getter_(this);
 
   @DomName('TextTrack.addCue')
   @DocsEditable()
-  void addCue(TextTrackCue cue) => _blink.BlinkTextTrack.addCue_Callback_1(this, cue);
+  void addCue(TextTrackCue cue) => _blink.BlinkTextTrack.instance.addCue_Callback_1_(this, cue);
 
   @DomName('TextTrack.addRegion')
   @DocsEditable()
   @Experimental() // untriaged
-  void addRegion(VttRegion region) => _blink.BlinkTextTrack.addRegion_Callback_1(this, region);
+  void addRegion(VttRegion region) => _blink.BlinkTextTrack.instance.addRegion_Callback_1_(this, region);
 
   @DomName('TextTrack.removeCue')
   @DocsEditable()
-  void removeCue(TextTrackCue cue) => _blink.BlinkTextTrack.removeCue_Callback_1(this, cue);
+  void removeCue(TextTrackCue cue) => _blink.BlinkTextTrack.instance.removeCue_Callback_1_(this, cue);
 
   @DomName('TextTrack.removeRegion')
   @DocsEditable()
   @Experimental() // untriaged
-  void removeRegion(VttRegion region) => _blink.BlinkTextTrack.removeRegion_Callback_1(this, region);
+  void removeRegion(VttRegion region) => _blink.BlinkTextTrack.instance.removeRegion_Callback_1_(this, region);
 
   /// Stream of `cuechange` events handled by this [TextTrack].
   @DomName('TextTrack.oncuechange')
@@ -30403,39 +30408,39 @@
 
   @DomName('TextTrackCue.endTime')
   @DocsEditable()
-  num get endTime => _blink.BlinkTextTrackCue.endTime_Getter(this);
+  num get endTime => _blink.BlinkTextTrackCue.instance.endTime_Getter_(this);
 
   @DomName('TextTrackCue.endTime')
   @DocsEditable()
-  void set endTime(num value) => _blink.BlinkTextTrackCue.endTime_Setter(this, value);
+  void set endTime(num value) => _blink.BlinkTextTrackCue.instance.endTime_Setter_(this, value);
 
   @DomName('TextTrackCue.id')
   @DocsEditable()
-  String get id => _blink.BlinkTextTrackCue.id_Getter(this);
+  String get id => _blink.BlinkTextTrackCue.instance.id_Getter_(this);
 
   @DomName('TextTrackCue.id')
   @DocsEditable()
-  void set id(String value) => _blink.BlinkTextTrackCue.id_Setter(this, value);
+  void set id(String value) => _blink.BlinkTextTrackCue.instance.id_Setter_(this, value);
 
   @DomName('TextTrackCue.pauseOnExit')
   @DocsEditable()
-  bool get pauseOnExit => _blink.BlinkTextTrackCue.pauseOnExit_Getter(this);
+  bool get pauseOnExit => _blink.BlinkTextTrackCue.instance.pauseOnExit_Getter_(this);
 
   @DomName('TextTrackCue.pauseOnExit')
   @DocsEditable()
-  void set pauseOnExit(bool value) => _blink.BlinkTextTrackCue.pauseOnExit_Setter(this, value);
+  void set pauseOnExit(bool value) => _blink.BlinkTextTrackCue.instance.pauseOnExit_Setter_(this, value);
 
   @DomName('TextTrackCue.startTime')
   @DocsEditable()
-  num get startTime => _blink.BlinkTextTrackCue.startTime_Getter(this);
+  num get startTime => _blink.BlinkTextTrackCue.instance.startTime_Getter_(this);
 
   @DomName('TextTrackCue.startTime')
   @DocsEditable()
-  void set startTime(num value) => _blink.BlinkTextTrackCue.startTime_Setter(this, value);
+  void set startTime(num value) => _blink.BlinkTextTrackCue.instance.startTime_Setter_(this, value);
 
   @DomName('TextTrackCue.track')
   @DocsEditable()
-  TextTrack get track => _blink.BlinkTextTrackCue.track_Getter(this);
+  TextTrack get track => _blink.BlinkTextTrackCue.instance.track_Getter_(this);
 
   /// Stream of `enter` events handled by this [TextTrackCue].
   @DomName('TextTrackCue.onenter')
@@ -30465,15 +30470,15 @@
 
   @DomName('TextTrackCueList.length')
   @DocsEditable()
-  int get length => _blink.BlinkTextTrackCueList.length_Getter(this);
+  int get length => _blink.BlinkTextTrackCueList.instance.length_Getter_(this);
 
   TextTrackCue operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _blink.BlinkTextTrackCueList.item_Callback_1(this, index);
+    return _blink.BlinkTextTrackCueList.instance.item_Callback_1_(this, index);
   }
 
-  TextTrackCue _nativeIndexedGetter(int index) => _blink.BlinkTextTrackCueList.item_Callback_1(this, index);
+  TextTrackCue _nativeIndexedGetter(int index) => _blink.BlinkTextTrackCueList.instance.item_Callback_1_(this, index);
 
   void operator[]=(int index, TextTrackCue value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -30515,11 +30520,11 @@
 
   @DomName('TextTrackCueList.getCueById')
   @DocsEditable()
-  TextTrackCue getCueById(String id) => _blink.BlinkTextTrackCueList.getCueById_Callback_1(this, id);
+  TextTrackCue getCueById(String id) => _blink.BlinkTextTrackCueList.instance.getCueById_Callback_1_(this, id);
 
   @DomName('TextTrackCueList.item')
   @DocsEditable()
-  TextTrackCue item(int index) => _blink.BlinkTextTrackCueList.item_Callback_1(this, index);
+  TextTrackCue item(int index) => _blink.BlinkTextTrackCueList.instance.item_Callback_1_(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -30554,15 +30559,15 @@
 
   @DomName('TextTrackList.length')
   @DocsEditable()
-  int get length => _blink.BlinkTextTrackList.length_Getter(this);
+  int get length => _blink.BlinkTextTrackList.instance.length_Getter_(this);
 
   TextTrack operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _blink.BlinkTextTrackList.item_Callback_1(this, index);
+    return _blink.BlinkTextTrackList.instance.item_Callback_1_(this, index);
   }
 
-  TextTrack _nativeIndexedGetter(int index) => _blink.BlinkTextTrackList.item_Callback_1(this, index);
+  TextTrack _nativeIndexedGetter(int index) => _blink.BlinkTextTrackList.instance.item_Callback_1_(this, index);
 
   void operator[]=(int index, TextTrack value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -30605,11 +30610,11 @@
   @DomName('TextTrackList.getTrackById')
   @DocsEditable()
   @Experimental() // untriaged
-  TextTrack getTrackById(String id) => _blink.BlinkTextTrackList.getTrackById_Callback_1(this, id);
+  TextTrack getTrackById(String id) => _blink.BlinkTextTrackList.instance.getTrackById_Callback_1_(this, id);
 
   @DomName('TextTrackList.item')
   @DocsEditable()
-  TextTrack item(int index) => _blink.BlinkTextTrackList.item_Callback_1(this, index);
+  TextTrack item(int index) => _blink.BlinkTextTrackList.instance.item_Callback_1_(this, index);
 
   /// Stream of `addtrack` events handled by this [TextTrackList].
   @DomName('TextTrackList.onaddtrack')
@@ -30638,15 +30643,15 @@
 
   @DomName('TimeRanges.length')
   @DocsEditable()
-  int get length => _blink.BlinkTimeRanges.length_Getter(this);
+  int get length => _blink.BlinkTimeRanges.instance.length_Getter_(this);
 
   @DomName('TimeRanges.end')
   @DocsEditable()
-  double end(int index) => _blink.BlinkTimeRanges.end_Callback_1(this, index);
+  double end(int index) => _blink.BlinkTimeRanges.instance.end_Callback_1_(this, index);
 
   @DomName('TimeRanges.start')
   @DocsEditable()
-  double start(int index) => _blink.BlinkTimeRanges.start_Callback_1(this, index);
+  double start(int index) => _blink.BlinkTimeRanges.instance.start_Callback_1_(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -30675,92 +30680,92 @@
   @DomName('Timing.delay')
   @DocsEditable()
   @Experimental() // untriaged
-  num get delay => _blink.BlinkTiming.delay_Getter(this);
+  num get delay => _blink.BlinkTiming.instance.delay_Getter_(this);
 
   @DomName('Timing.delay')
   @DocsEditable()
   @Experimental() // untriaged
-  void set delay(num value) => _blink.BlinkTiming.delay_Setter(this, value);
+  void set delay(num value) => _blink.BlinkTiming.instance.delay_Setter_(this, value);
 
   @DomName('Timing.direction')
   @DocsEditable()
   @Experimental() // untriaged
-  String get direction => _blink.BlinkTiming.direction_Getter(this);
+  String get direction => _blink.BlinkTiming.instance.direction_Getter_(this);
 
   @DomName('Timing.direction')
   @DocsEditable()
   @Experimental() // untriaged
-  void set direction(String value) => _blink.BlinkTiming.direction_Setter(this, value);
+  void set direction(String value) => _blink.BlinkTiming.instance.direction_Setter_(this, value);
 
   @DomName('Timing.easing')
   @DocsEditable()
   @Experimental() // untriaged
-  String get easing => _blink.BlinkTiming.easing_Getter(this);
+  String get easing => _blink.BlinkTiming.instance.easing_Getter_(this);
 
   @DomName('Timing.easing')
   @DocsEditable()
   @Experimental() // untriaged
-  void set easing(String value) => _blink.BlinkTiming.easing_Setter(this, value);
+  void set easing(String value) => _blink.BlinkTiming.instance.easing_Setter_(this, value);
 
   @DomName('Timing.endDelay')
   @DocsEditable()
   @Experimental() // untriaged
-  num get endDelay => _blink.BlinkTiming.endDelay_Getter(this);
+  num get endDelay => _blink.BlinkTiming.instance.endDelay_Getter_(this);
 
   @DomName('Timing.endDelay')
   @DocsEditable()
   @Experimental() // untriaged
-  void set endDelay(num value) => _blink.BlinkTiming.endDelay_Setter(this, value);
+  void set endDelay(num value) => _blink.BlinkTiming.instance.endDelay_Setter_(this, value);
 
   @DomName('Timing.fill')
   @DocsEditable()
   @Experimental() // untriaged
-  String get fill => _blink.BlinkTiming.fill_Getter(this);
+  String get fill => _blink.BlinkTiming.instance.fill_Getter_(this);
 
   @DomName('Timing.fill')
   @DocsEditable()
   @Experimental() // untriaged
-  void set fill(String value) => _blink.BlinkTiming.fill_Setter(this, value);
+  void set fill(String value) => _blink.BlinkTiming.instance.fill_Setter_(this, value);
 
   @DomName('Timing.iterationStart')
   @DocsEditable()
   @Experimental() // untriaged
-  num get iterationStart => _blink.BlinkTiming.iterationStart_Getter(this);
+  num get iterationStart => _blink.BlinkTiming.instance.iterationStart_Getter_(this);
 
   @DomName('Timing.iterationStart')
   @DocsEditable()
   @Experimental() // untriaged
-  void set iterationStart(num value) => _blink.BlinkTiming.iterationStart_Setter(this, value);
+  void set iterationStart(num value) => _blink.BlinkTiming.instance.iterationStart_Setter_(this, value);
 
   @DomName('Timing.iterations')
   @DocsEditable()
   @Experimental() // untriaged
-  num get iterations => _blink.BlinkTiming.iterations_Getter(this);
+  num get iterations => _blink.BlinkTiming.instance.iterations_Getter_(this);
 
   @DomName('Timing.iterations')
   @DocsEditable()
   @Experimental() // untriaged
-  void set iterations(num value) => _blink.BlinkTiming.iterations_Setter(this, value);
+  void set iterations(num value) => _blink.BlinkTiming.instance.iterations_Setter_(this, value);
 
   @DomName('Timing.playbackRate')
   @DocsEditable()
   @Experimental() // untriaged
-  num get playbackRate => _blink.BlinkTiming.playbackRate_Getter(this);
+  num get playbackRate => _blink.BlinkTiming.instance.playbackRate_Getter_(this);
 
   @DomName('Timing.playbackRate')
   @DocsEditable()
   @Experimental() // untriaged
-  void set playbackRate(num value) => _blink.BlinkTiming.playbackRate_Setter(this, value);
+  void set playbackRate(num value) => _blink.BlinkTiming.instance.playbackRate_Setter_(this, value);
 
   @DomName('Timing.__getter__')
   @DocsEditable()
   @Experimental() // untriaged
-  Object __getter__(String name) => _blink.BlinkTiming.$__getter___Callback_1(this, name);
+  Object __getter__(String name) => _blink.BlinkTiming.instance.$__getter___Callback_1_(this, name);
 
   @DomName('Timing.__setter__')
   @DocsEditable()
   @Experimental() // untriaged
-  void __setter__(String name, num duration) => _blink.BlinkTiming.$__setter___Callback_2(this, name, duration);
+  void __setter__(String name, num duration) => _blink.BlinkTiming.instance.$__setter___Callback_2_(this, name, duration);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -30802,57 +30807,57 @@
 
   @DomName('Touch.clientX')
   @DocsEditable()
-  double get _clientX => _blink.BlinkTouch.clientX_Getter(this);
+  double get _clientX => _blink.BlinkTouch.instance.clientX_Getter_(this);
 
   @DomName('Touch.clientY')
   @DocsEditable()
-  double get _clientY => _blink.BlinkTouch.clientY_Getter(this);
+  double get _clientY => _blink.BlinkTouch.instance.clientY_Getter_(this);
 
   @DomName('Touch.force')
   @DocsEditable()
   @Experimental() // untriaged
-  double get force => _blink.BlinkTouch.force_Getter(this);
+  double get force => _blink.BlinkTouch.instance.force_Getter_(this);
 
   @DomName('Touch.identifier')
   @DocsEditable()
-  int get identifier => _blink.BlinkTouch.identifier_Getter(this);
+  int get identifier => _blink.BlinkTouch.instance.identifier_Getter_(this);
 
   @DomName('Touch.pageX')
   @DocsEditable()
-  double get _pageX => _blink.BlinkTouch.pageX_Getter(this);
+  double get _pageX => _blink.BlinkTouch.instance.pageX_Getter_(this);
 
   @DomName('Touch.pageY')
   @DocsEditable()
-  double get _pageY => _blink.BlinkTouch.pageY_Getter(this);
+  double get _pageY => _blink.BlinkTouch.instance.pageY_Getter_(this);
 
   @DomName('Touch.radiusX')
   @DocsEditable()
   @Experimental() // untriaged
-  double get _radiusX => _blink.BlinkTouch.radiusX_Getter(this);
+  double get _radiusX => _blink.BlinkTouch.instance.radiusX_Getter_(this);
 
   @DomName('Touch.radiusY')
   @DocsEditable()
   @Experimental() // untriaged
-  double get _radiusY => _blink.BlinkTouch.radiusY_Getter(this);
+  double get _radiusY => _blink.BlinkTouch.instance.radiusY_Getter_(this);
 
   @DomName('Touch.screenX')
   @DocsEditable()
-  double get _screenX => _blink.BlinkTouch.screenX_Getter(this);
+  double get _screenX => _blink.BlinkTouch.instance.screenX_Getter_(this);
 
   @DomName('Touch.screenY')
   @DocsEditable()
-  double get _screenY => _blink.BlinkTouch.screenY_Getter(this);
+  double get _screenY => _blink.BlinkTouch.instance.screenY_Getter_(this);
 
   @DomName('Touch.target')
   @DocsEditable()
-  EventTarget get target => _blink.BlinkTouch.target_Getter(this);
+  EventTarget get target => _blink.BlinkTouch.instance.target_Getter_(this);
 
   @DomName('Touch.webkitRotationAngle')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
-  double get rotationAngle => _blink.BlinkTouch.webkitRotationAngle_Getter(this);
+  double get rotationAngle => _blink.BlinkTouch.instance.webkitRotationAngle_Getter_(this);
 
 
 // As of Chrome 37, these all changed from long to double.  This code
@@ -30922,35 +30927,35 @@
 
   @DomName('TouchEvent.altKey')
   @DocsEditable()
-  bool get altKey => _blink.BlinkTouchEvent.altKey_Getter(this);
+  bool get altKey => _blink.BlinkTouchEvent.instance.altKey_Getter_(this);
 
   @DomName('TouchEvent.changedTouches')
   @DocsEditable()
-  TouchList get changedTouches => _blink.BlinkTouchEvent.changedTouches_Getter(this);
+  TouchList get changedTouches => _blink.BlinkTouchEvent.instance.changedTouches_Getter_(this);
 
   @DomName('TouchEvent.ctrlKey')
   @DocsEditable()
-  bool get ctrlKey => _blink.BlinkTouchEvent.ctrlKey_Getter(this);
+  bool get ctrlKey => _blink.BlinkTouchEvent.instance.ctrlKey_Getter_(this);
 
   @DomName('TouchEvent.metaKey')
   @DocsEditable()
-  bool get metaKey => _blink.BlinkTouchEvent.metaKey_Getter(this);
+  bool get metaKey => _blink.BlinkTouchEvent.instance.metaKey_Getter_(this);
 
   @DomName('TouchEvent.shiftKey')
   @DocsEditable()
-  bool get shiftKey => _blink.BlinkTouchEvent.shiftKey_Getter(this);
+  bool get shiftKey => _blink.BlinkTouchEvent.instance.shiftKey_Getter_(this);
 
   @DomName('TouchEvent.targetTouches')
   @DocsEditable()
-  TouchList get targetTouches => _blink.BlinkTouchEvent.targetTouches_Getter(this);
+  TouchList get targetTouches => _blink.BlinkTouchEvent.instance.targetTouches_Getter_(this);
 
   @DomName('TouchEvent.touches')
   @DocsEditable()
-  TouchList get touches => _blink.BlinkTouchEvent.touches_Getter(this);
+  TouchList get touches => _blink.BlinkTouchEvent.instance.touches_Getter_(this);
 
   @DomName('TouchEvent.initTouchEvent')
   @DocsEditable()
-  void _initTouchEvent(TouchList touches, TouchList targetTouches, TouchList changedTouches, String type, Window view, int unused1, int unused2, int unused3, int unused4, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey) => _blink.BlinkTouchEvent.initTouchEvent_Callback_13(this, touches, targetTouches, changedTouches, type, view, unused1, unused2, unused3, unused4, ctrlKey, altKey, shiftKey, metaKey);
+  void _initTouchEvent(TouchList touches, TouchList targetTouches, TouchList changedTouches, String type, Window view, int unused1, int unused2, int unused3, int unused4, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey) => _blink.BlinkTouchEvent.instance.initTouchEvent_Callback_13_(this, touches, targetTouches, changedTouches, type, view, unused1, unused2, unused3, unused4, ctrlKey, altKey, shiftKey, metaKey);
 
 
   /**
@@ -30985,15 +30990,15 @@
 
   @DomName('TouchList.length')
   @DocsEditable()
-  int get length => _blink.BlinkTouchList.length_Getter(this);
+  int get length => _blink.BlinkTouchList.instance.length_Getter_(this);
 
   Touch operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _blink.BlinkTouchList.item_Callback_1(this, index);
+    return _blink.BlinkTouchList.instance.item_Callback_1_(this, index);
   }
 
-  Touch _nativeIndexedGetter(int index) => _blink.BlinkTouchList.item_Callback_1(this, index);
+  Touch _nativeIndexedGetter(int index) => _blink.BlinkTouchList.instance.item_Callback_1_(this, index);
 
   void operator[]=(int index, Touch value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -31035,7 +31040,7 @@
 
   @DomName('TouchList.item')
   @DocsEditable()
-  Touch item(int index) => _blink.BlinkTouchList.item_Callback_1(this, index);
+  Touch item(int index) => _blink.BlinkTouchList.instance.item_Callback_1_(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -31087,61 +31092,61 @@
 
   @DomName('HTMLTrackElement.default')
   @DocsEditable()
-  bool get defaultValue => _blink.BlinkHTMLTrackElement.default_Getter(this);
+  bool get defaultValue => _blink.BlinkHTMLTrackElement.instance.default_Getter_(this);
 
   @DomName('HTMLTrackElement.default')
   @DocsEditable()
-  void set defaultValue(bool value) => _blink.BlinkHTMLTrackElement.default_Setter(this, value);
+  void set defaultValue(bool value) => _blink.BlinkHTMLTrackElement.instance.default_Setter_(this, value);
 
   @DomName('HTMLTrackElement.integrity')
   @DocsEditable()
   @Experimental() // untriaged
-  String get integrity => _blink.BlinkHTMLTrackElement.integrity_Getter(this);
+  String get integrity => _blink.BlinkHTMLTrackElement.instance.integrity_Getter_(this);
 
   @DomName('HTMLTrackElement.integrity')
   @DocsEditable()
   @Experimental() // untriaged
-  void set integrity(String value) => _blink.BlinkHTMLTrackElement.integrity_Setter(this, value);
+  void set integrity(String value) => _blink.BlinkHTMLTrackElement.instance.integrity_Setter_(this, value);
 
   @DomName('HTMLTrackElement.kind')
   @DocsEditable()
-  String get kind => _blink.BlinkHTMLTrackElement.kind_Getter(this);
+  String get kind => _blink.BlinkHTMLTrackElement.instance.kind_Getter_(this);
 
   @DomName('HTMLTrackElement.kind')
   @DocsEditable()
-  void set kind(String value) => _blink.BlinkHTMLTrackElement.kind_Setter(this, value);
+  void set kind(String value) => _blink.BlinkHTMLTrackElement.instance.kind_Setter_(this, value);
 
   @DomName('HTMLTrackElement.label')
   @DocsEditable()
-  String get label => _blink.BlinkHTMLTrackElement.label_Getter(this);
+  String get label => _blink.BlinkHTMLTrackElement.instance.label_Getter_(this);
 
   @DomName('HTMLTrackElement.label')
   @DocsEditable()
-  void set label(String value) => _blink.BlinkHTMLTrackElement.label_Setter(this, value);
+  void set label(String value) => _blink.BlinkHTMLTrackElement.instance.label_Setter_(this, value);
 
   @DomName('HTMLTrackElement.readyState')
   @DocsEditable()
-  int get readyState => _blink.BlinkHTMLTrackElement.readyState_Getter(this);
+  int get readyState => _blink.BlinkHTMLTrackElement.instance.readyState_Getter_(this);
 
   @DomName('HTMLTrackElement.src')
   @DocsEditable()
-  String get src => _blink.BlinkHTMLTrackElement.src_Getter(this);
+  String get src => _blink.BlinkHTMLTrackElement.instance.src_Getter_(this);
 
   @DomName('HTMLTrackElement.src')
   @DocsEditable()
-  void set src(String value) => _blink.BlinkHTMLTrackElement.src_Setter(this, value);
+  void set src(String value) => _blink.BlinkHTMLTrackElement.instance.src_Setter_(this, value);
 
   @DomName('HTMLTrackElement.srclang')
   @DocsEditable()
-  String get srclang => _blink.BlinkHTMLTrackElement.srclang_Getter(this);
+  String get srclang => _blink.BlinkHTMLTrackElement.instance.srclang_Getter_(this);
 
   @DomName('HTMLTrackElement.srclang')
   @DocsEditable()
-  void set srclang(String value) => _blink.BlinkHTMLTrackElement.srclang_Setter(this, value);
+  void set srclang(String value) => _blink.BlinkHTMLTrackElement.instance.srclang_Setter_(this, value);
 
   @DomName('HTMLTrackElement.track')
   @DocsEditable()
-  TextTrack get track => _blink.BlinkHTMLTrackElement.track_Getter(this);
+  TextTrack get track => _blink.BlinkHTMLTrackElement.instance.track_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -31160,7 +31165,7 @@
 
   @DomName('TrackEvent.track')
   @DocsEditable()
-  Object get track => _blink.BlinkTrackEvent.track_Getter(this);
+  Object get track => _blink.BlinkTrackEvent.instance.track_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -31178,15 +31183,15 @@
 
   @DomName('TransitionEvent.elapsedTime')
   @DocsEditable()
-  double get elapsedTime => _blink.BlinkTransitionEvent.elapsedTime_Getter(this);
+  double get elapsedTime => _blink.BlinkTransitionEvent.instance.elapsedTime_Getter_(this);
 
   @DomName('TransitionEvent.propertyName')
   @DocsEditable()
-  String get propertyName => _blink.BlinkTransitionEvent.propertyName_Getter(this);
+  String get propertyName => _blink.BlinkTransitionEvent.instance.propertyName_Getter_(this);
 
   @DomName('TransitionEvent.pseudoElement')
   @DocsEditable()
-  String get pseudoElement => _blink.BlinkTransitionEvent.pseudoElement_Getter(this);
+  String get pseudoElement => _blink.BlinkTransitionEvent.instance.pseudoElement_Getter_(this);
 
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -31205,51 +31210,51 @@
 
   @DomName('TreeWalker.currentNode')
   @DocsEditable()
-  Node get currentNode => _blink.BlinkTreeWalker.currentNode_Getter(this);
+  Node get currentNode => _blink.BlinkTreeWalker.instance.currentNode_Getter_(this);
 
   @DomName('TreeWalker.currentNode')
   @DocsEditable()
-  void set currentNode(Node value) => _blink.BlinkTreeWalker.currentNode_Setter(this, value);
+  void set currentNode(Node value) => _blink.BlinkTreeWalker.instance.currentNode_Setter_(this, value);
 
   @DomName('TreeWalker.filter')
   @DocsEditable()
-  NodeFilter get filter => _blink.BlinkTreeWalker.filter_Getter(this);
+  NodeFilter get filter => _blink.BlinkTreeWalker.instance.filter_Getter_(this);
 
   @DomName('TreeWalker.root')
   @DocsEditable()
-  Node get root => _blink.BlinkTreeWalker.root_Getter(this);
+  Node get root => _blink.BlinkTreeWalker.instance.root_Getter_(this);
 
   @DomName('TreeWalker.whatToShow')
   @DocsEditable()
-  int get whatToShow => _blink.BlinkTreeWalker.whatToShow_Getter(this);
+  int get whatToShow => _blink.BlinkTreeWalker.instance.whatToShow_Getter_(this);
 
   @DomName('TreeWalker.firstChild')
   @DocsEditable()
-  Node firstChild() => _blink.BlinkTreeWalker.firstChild_Callback(this);
+  Node firstChild() => _blink.BlinkTreeWalker.instance.firstChild_Callback_0_(this);
 
   @DomName('TreeWalker.lastChild')
   @DocsEditable()
-  Node lastChild() => _blink.BlinkTreeWalker.lastChild_Callback(this);
+  Node lastChild() => _blink.BlinkTreeWalker.instance.lastChild_Callback_0_(this);
 
   @DomName('TreeWalker.nextNode')
   @DocsEditable()
-  Node nextNode() => _blink.BlinkTreeWalker.nextNode_Callback(this);
+  Node nextNode() => _blink.BlinkTreeWalker.instance.nextNode_Callback_0_(this);
 
   @DomName('TreeWalker.nextSibling')
   @DocsEditable()
-  Node nextSibling() => _blink.BlinkTreeWalker.nextSibling_Callback(this);
+  Node nextSibling() => _blink.BlinkTreeWalker.instance.nextSibling_Callback_0_(this);
 
   @DomName('TreeWalker.parentNode')
   @DocsEditable()
-  Node parentNode() => _blink.BlinkTreeWalker.parentNode_Callback(this);
+  Node parentNode() => _blink.BlinkTreeWalker.instance.parentNode_Callback_0_(this);
 
   @DomName('TreeWalker.previousNode')
   @DocsEditable()
-  Node previousNode() => _blink.BlinkTreeWalker.previousNode_Callback(this);
+  Node previousNode() => _blink.BlinkTreeWalker.instance.previousNode_Callback_0_(this);
 
   @DomName('TreeWalker.previousSibling')
   @DocsEditable()
-  Node previousSibling() => _blink.BlinkTreeWalker.previousSibling_Callback(this);
+  Node previousSibling() => _blink.BlinkTreeWalker.instance.previousSibling_Callback_0_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -31283,53 +31288,53 @@
   @DomName('UIEvent.charCode')
   @DocsEditable()
   @Unstable()
-  int get _charCode => _blink.BlinkUIEvent.charCode_Getter(this);
+  int get _charCode => _blink.BlinkUIEvent.instance.charCode_Getter_(this);
 
   @DomName('UIEvent.detail')
   @DocsEditable()
-  int get detail => _blink.BlinkUIEvent.detail_Getter(this);
+  int get detail => _blink.BlinkUIEvent.instance.detail_Getter_(this);
 
   @DomName('UIEvent.keyCode')
   @DocsEditable()
   @Unstable()
-  int get _keyCode => _blink.BlinkUIEvent.keyCode_Getter(this);
+  int get _keyCode => _blink.BlinkUIEvent.instance.keyCode_Getter_(this);
 
   @DomName('UIEvent.layerX')
   @DocsEditable()
   // http://dev.w3.org/2006/webapi/DOM-Level-3-Events/html/DOM3-Events.html#events-mouseevents
   @Experimental() // nonstandard
-  int get _layerX => _blink.BlinkUIEvent.layerX_Getter(this);
+  int get _layerX => _blink.BlinkUIEvent.instance.layerX_Getter_(this);
 
   @DomName('UIEvent.layerY')
   @DocsEditable()
   // http://dev.w3.org/2006/webapi/DOM-Level-3-Events/html/DOM3-Events.html#events-mouseevents
   @Experimental() // nonstandard
-  int get _layerY => _blink.BlinkUIEvent.layerY_Getter(this);
+  int get _layerY => _blink.BlinkUIEvent.instance.layerY_Getter_(this);
 
   @DomName('UIEvent.pageX')
   @DocsEditable()
   // http://dev.w3.org/2006/webapi/DOM-Level-3-Events/html/DOM3-Events.html#events-mouseevents
   @Experimental() // nonstandard
-  int get _pageX => _blink.BlinkUIEvent.pageX_Getter(this);
+  int get _pageX => _blink.BlinkUIEvent.instance.pageX_Getter_(this);
 
   @DomName('UIEvent.pageY')
   @DocsEditable()
   // http://dev.w3.org/2006/webapi/DOM-Level-3-Events/html/DOM3-Events.html#events-mouseevents
   @Experimental() // nonstandard
-  int get _pageY => _blink.BlinkUIEvent.pageY_Getter(this);
+  int get _pageY => _blink.BlinkUIEvent.instance.pageY_Getter_(this);
 
   @DomName('UIEvent.view')
   @DocsEditable()
-  WindowBase get view => _blink.BlinkUIEvent.view_Getter(this);
+  WindowBase get view => _blink.BlinkUIEvent.instance.view_Getter_(this);
 
   @DomName('UIEvent.which')
   @DocsEditable()
   @Unstable()
-  int get which => _blink.BlinkUIEvent.which_Getter(this);
+  int get which => _blink.BlinkUIEvent.instance.which_Getter_(this);
 
   @DomName('UIEvent.initUIEvent')
   @DocsEditable()
-  void _initUIEvent(String type, bool canBubble, bool cancelable, Window view, int detail) => _blink.BlinkUIEvent.initUIEvent_Callback_5(this, type, canBubble, cancelable, view, detail);
+  void _initUIEvent(String type, bool canBubble, bool cancelable, Window view, int detail) => _blink.BlinkUIEvent.instance.initUIEvent_Callback_5_(this, type, canBubble, cancelable, view, detail);
 
 
   @DomName('UIEvent.layerX')
@@ -31399,142 +31404,142 @@
 
   static String createObjectUrl(blob_OR_source_OR_stream) {
     if ((blob_OR_source_OR_stream is Blob || blob_OR_source_OR_stream == null)) {
-      return _blink.BlinkURL.createObjectURL_Callback_1(blob_OR_source_OR_stream);
+      return _blink.BlinkURL.instance.createObjectURL_Callback_1_(blob_OR_source_OR_stream);
     }
     if ((blob_OR_source_OR_stream is MediaSource)) {
-      return _blink.BlinkURL.createObjectURL_Callback_1(blob_OR_source_OR_stream);
+      return _blink.BlinkURL.instance.createObjectURL_Callback_1_(blob_OR_source_OR_stream);
     }
     if ((blob_OR_source_OR_stream is MediaStream)) {
-      return _blink.BlinkURL.createObjectURL_Callback_1(blob_OR_source_OR_stream);
+      return _blink.BlinkURL.instance.createObjectURL_Callback_1_(blob_OR_source_OR_stream);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
   @DomName('URL.createObjectUrlFromBlob')
   @DocsEditable()
-  static String createObjectUrlFromBlob(Blob blob) => _blink.BlinkURL.createObjectURL_Callback_1(blob);
+  static String createObjectUrlFromBlob(Blob blob) => _blink.BlinkURL.instance.createObjectURL_Callback_1_(blob);
 
   @DomName('URL.createObjectUrlFromSource')
   @DocsEditable()
-  static String createObjectUrlFromSource(MediaSource source) => _blink.BlinkURL.createObjectURL_Callback_1(source);
+  static String createObjectUrlFromSource(MediaSource source) => _blink.BlinkURL.instance.createObjectURL_Callback_1_(source);
 
   @DomName('URL.createObjectUrlFromStream')
   @DocsEditable()
-  static String createObjectUrlFromStream(MediaStream stream) => _blink.BlinkURL.createObjectURL_Callback_1(stream);
+  static String createObjectUrlFromStream(MediaStream stream) => _blink.BlinkURL.instance.createObjectURL_Callback_1_(stream);
 
   @DomName('URL.revokeObjectURL')
   @DocsEditable()
-  static void revokeObjectUrl(String url) => _blink.BlinkURL.revokeObjectURL_Callback_1(url);
+  static void revokeObjectUrl(String url) => _blink.BlinkURL.instance.revokeObjectURL_Callback_1_(url);
 
   @DomName('URL.hash')
   @DocsEditable()
   @Experimental() // untriaged
-  String get hash => _blink.BlinkURL.hash_Getter(this);
+  String get hash => _blink.BlinkURL.instance.hash_Getter_(this);
 
   @DomName('URL.hash')
   @DocsEditable()
   @Experimental() // untriaged
-  void set hash(String value) => _blink.BlinkURL.hash_Setter(this, value);
+  void set hash(String value) => _blink.BlinkURL.instance.hash_Setter_(this, value);
 
   @DomName('URL.host')
   @DocsEditable()
   @Experimental() // untriaged
-  String get host => _blink.BlinkURL.host_Getter(this);
+  String get host => _blink.BlinkURL.instance.host_Getter_(this);
 
   @DomName('URL.host')
   @DocsEditable()
   @Experimental() // untriaged
-  void set host(String value) => _blink.BlinkURL.host_Setter(this, value);
+  void set host(String value) => _blink.BlinkURL.instance.host_Setter_(this, value);
 
   @DomName('URL.hostname')
   @DocsEditable()
   @Experimental() // untriaged
-  String get hostname => _blink.BlinkURL.hostname_Getter(this);
+  String get hostname => _blink.BlinkURL.instance.hostname_Getter_(this);
 
   @DomName('URL.hostname')
   @DocsEditable()
   @Experimental() // untriaged
-  void set hostname(String value) => _blink.BlinkURL.hostname_Setter(this, value);
+  void set hostname(String value) => _blink.BlinkURL.instance.hostname_Setter_(this, value);
 
   @DomName('URL.href')
   @DocsEditable()
   @Experimental() // untriaged
-  String get href => _blink.BlinkURL.href_Getter(this);
+  String get href => _blink.BlinkURL.instance.href_Getter_(this);
 
   @DomName('URL.href')
   @DocsEditable()
   @Experimental() // untriaged
-  void set href(String value) => _blink.BlinkURL.href_Setter(this, value);
+  void set href(String value) => _blink.BlinkURL.instance.href_Setter_(this, value);
 
   @DomName('URL.origin')
   @DocsEditable()
   @Experimental() // untriaged
-  String get origin => _blink.BlinkURL.origin_Getter(this);
+  String get origin => _blink.BlinkURL.instance.origin_Getter_(this);
 
   @DomName('URL.password')
   @DocsEditable()
   @Experimental() // untriaged
-  String get password => _blink.BlinkURL.password_Getter(this);
+  String get password => _blink.BlinkURL.instance.password_Getter_(this);
 
   @DomName('URL.password')
   @DocsEditable()
   @Experimental() // untriaged
-  void set password(String value) => _blink.BlinkURL.password_Setter(this, value);
+  void set password(String value) => _blink.BlinkURL.instance.password_Setter_(this, value);
 
   @DomName('URL.pathname')
   @DocsEditable()
   @Experimental() // untriaged
-  String get pathname => _blink.BlinkURL.pathname_Getter(this);
+  String get pathname => _blink.BlinkURL.instance.pathname_Getter_(this);
 
   @DomName('URL.pathname')
   @DocsEditable()
   @Experimental() // untriaged
-  void set pathname(String value) => _blink.BlinkURL.pathname_Setter(this, value);
+  void set pathname(String value) => _blink.BlinkURL.instance.pathname_Setter_(this, value);
 
   @DomName('URL.port')
   @DocsEditable()
   @Experimental() // untriaged
-  String get port => _blink.BlinkURL.port_Getter(this);
+  String get port => _blink.BlinkURL.instance.port_Getter_(this);
 
   @DomName('URL.port')
   @DocsEditable()
   @Experimental() // untriaged
-  void set port(String value) => _blink.BlinkURL.port_Setter(this, value);
+  void set port(String value) => _blink.BlinkURL.instance.port_Setter_(this, value);
 
   @DomName('URL.protocol')
   @DocsEditable()
   @Experimental() // untriaged
-  String get protocol => _blink.BlinkURL.protocol_Getter(this);
+  String get protocol => _blink.BlinkURL.instance.protocol_Getter_(this);
 
   @DomName('URL.protocol')
   @DocsEditable()
   @Experimental() // untriaged
-  void set protocol(String value) => _blink.BlinkURL.protocol_Setter(this, value);
+  void set protocol(String value) => _blink.BlinkURL.instance.protocol_Setter_(this, value);
 
   @DomName('URL.search')
   @DocsEditable()
   @Experimental() // untriaged
-  String get search => _blink.BlinkURL.search_Getter(this);
+  String get search => _blink.BlinkURL.instance.search_Getter_(this);
 
   @DomName('URL.search')
   @DocsEditable()
   @Experimental() // untriaged
-  void set search(String value) => _blink.BlinkURL.search_Setter(this, value);
+  void set search(String value) => _blink.BlinkURL.instance.search_Setter_(this, value);
 
   @DomName('URL.username')
   @DocsEditable()
   @Experimental() // untriaged
-  String get username => _blink.BlinkURL.username_Getter(this);
+  String get username => _blink.BlinkURL.instance.username_Getter_(this);
 
   @DomName('URL.username')
   @DocsEditable()
   @Experimental() // untriaged
-  void set username(String value) => _blink.BlinkURL.username_Setter(this, value);
+  void set username(String value) => _blink.BlinkURL.instance.username_Setter_(this, value);
 
   @DomName('URL.toString')
   @DocsEditable()
   @Experimental() // untriaged
-  String toString() => _blink.BlinkURL.toString_Callback(this);
+  String toString() => _blink.BlinkURL.instance.toString_Callback_0_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -31554,112 +31559,112 @@
   @DomName('URLUtils.hash')
   @DocsEditable()
   @Experimental() // untriaged
-  String get hash => _blink.BlinkURLUtils.hash_Getter(this);
+  String get hash;
 
   @DomName('URLUtils.hash')
   @DocsEditable()
   @Experimental() // untriaged
-  void set hash(String value) => _blink.BlinkURLUtils.hash_Setter(this, value);
+  void set hash(String value);
 
   @DomName('URLUtils.host')
   @DocsEditable()
   @Experimental() // untriaged
-  String get host => _blink.BlinkURLUtils.host_Getter(this);
+  String get host;
 
   @DomName('URLUtils.host')
   @DocsEditable()
   @Experimental() // untriaged
-  void set host(String value) => _blink.BlinkURLUtils.host_Setter(this, value);
+  void set host(String value);
 
   @DomName('URLUtils.hostname')
   @DocsEditable()
   @Experimental() // untriaged
-  String get hostname => _blink.BlinkURLUtils.hostname_Getter(this);
+  String get hostname;
 
   @DomName('URLUtils.hostname')
   @DocsEditable()
   @Experimental() // untriaged
-  void set hostname(String value) => _blink.BlinkURLUtils.hostname_Setter(this, value);
+  void set hostname(String value);
 
   @DomName('URLUtils.href')
   @DocsEditable()
   @Experimental() // untriaged
-  String get href => _blink.BlinkURLUtils.href_Getter(this);
+  String get href;
 
   @DomName('URLUtils.href')
   @DocsEditable()
   @Experimental() // untriaged
-  void set href(String value) => _blink.BlinkURLUtils.href_Setter(this, value);
+  void set href(String value);
 
   @DomName('URLUtils.origin')
   @DocsEditable()
   @Experimental() // untriaged
-  String get origin => _blink.BlinkURLUtils.origin_Getter(this);
+  String get origin;
 
   @DomName('URLUtils.password')
   @DocsEditable()
   @Experimental() // untriaged
-  String get password => _blink.BlinkURLUtils.password_Getter(this);
+  String get password;
 
   @DomName('URLUtils.password')
   @DocsEditable()
   @Experimental() // untriaged
-  void set password(String value) => _blink.BlinkURLUtils.password_Setter(this, value);
+  void set password(String value);
 
   @DomName('URLUtils.pathname')
   @DocsEditable()
   @Experimental() // untriaged
-  String get pathname => _blink.BlinkURLUtils.pathname_Getter(this);
+  String get pathname;
 
   @DomName('URLUtils.pathname')
   @DocsEditable()
   @Experimental() // untriaged
-  void set pathname(String value) => _blink.BlinkURLUtils.pathname_Setter(this, value);
+  void set pathname(String value);
 
   @DomName('URLUtils.port')
   @DocsEditable()
   @Experimental() // untriaged
-  String get port => _blink.BlinkURLUtils.port_Getter(this);
+  String get port;
 
   @DomName('URLUtils.port')
   @DocsEditable()
   @Experimental() // untriaged
-  void set port(String value) => _blink.BlinkURLUtils.port_Setter(this, value);
+  void set port(String value);
 
   @DomName('URLUtils.protocol')
   @DocsEditable()
   @Experimental() // untriaged
-  String get protocol => _blink.BlinkURLUtils.protocol_Getter(this);
+  String get protocol;
 
   @DomName('URLUtils.protocol')
   @DocsEditable()
   @Experimental() // untriaged
-  void set protocol(String value) => _blink.BlinkURLUtils.protocol_Setter(this, value);
+  void set protocol(String value);
 
   @DomName('URLUtils.search')
   @DocsEditable()
   @Experimental() // untriaged
-  String get search => _blink.BlinkURLUtils.search_Getter(this);
+  String get search;
 
   @DomName('URLUtils.search')
   @DocsEditable()
   @Experimental() // untriaged
-  void set search(String value) => _blink.BlinkURLUtils.search_Setter(this, value);
+  void set search(String value);
 
   @DomName('URLUtils.username')
   @DocsEditable()
   @Experimental() // untriaged
-  String get username => _blink.BlinkURLUtils.username_Getter(this);
+  String get username;
 
   @DomName('URLUtils.username')
   @DocsEditable()
   @Experimental() // untriaged
-  void set username(String value) => _blink.BlinkURLUtils.username_Setter(this, value);
+  void set username(String value);
 
   @DomName('URLUtils.toString')
   @DocsEditable()
   @Experimental() // untriaged
-  String toString() => _blink.BlinkURLUtils.toString_Callback(this);
+  String toString();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -31679,52 +31684,52 @@
   @DomName('URLUtilsReadOnly.hash')
   @DocsEditable()
   @Experimental() // untriaged
-  String get hash => _blink.BlinkURLUtilsReadOnly.hash_Getter(this);
+  String get hash;
 
   @DomName('URLUtilsReadOnly.host')
   @DocsEditable()
   @Experimental() // untriaged
-  String get host => _blink.BlinkURLUtilsReadOnly.host_Getter(this);
+  String get host;
 
   @DomName('URLUtilsReadOnly.hostname')
   @DocsEditable()
   @Experimental() // untriaged
-  String get hostname => _blink.BlinkURLUtilsReadOnly.hostname_Getter(this);
+  String get hostname;
 
   @DomName('URLUtilsReadOnly.href')
   @DocsEditable()
   @Experimental() // untriaged
-  String get href => _blink.BlinkURLUtilsReadOnly.href_Getter(this);
+  String get href;
 
   @DomName('URLUtilsReadOnly.origin')
   @DocsEditable()
   @Experimental() // untriaged
-  String get origin => _blink.BlinkURLUtilsReadOnly.origin_Getter(this);
+  String get origin;
 
   @DomName('URLUtilsReadOnly.pathname')
   @DocsEditable()
   @Experimental() // untriaged
-  String get pathname => _blink.BlinkURLUtilsReadOnly.pathname_Getter(this);
+  String get pathname;
 
   @DomName('URLUtilsReadOnly.port')
   @DocsEditable()
   @Experimental() // untriaged
-  String get port => _blink.BlinkURLUtilsReadOnly.port_Getter(this);
+  String get port;
 
   @DomName('URLUtilsReadOnly.protocol')
   @DocsEditable()
   @Experimental() // untriaged
-  String get protocol => _blink.BlinkURLUtilsReadOnly.protocol_Getter(this);
+  String get protocol;
 
   @DomName('URLUtilsReadOnly.search')
   @DocsEditable()
   @Experimental() // untriaged
-  String get search => _blink.BlinkURLUtilsReadOnly.search_Getter(this);
+  String get search;
 
   @DomName('URLUtilsReadOnly.toString')
   @DocsEditable()
   @Experimental() // untriaged
-  String toString() => _blink.BlinkURLUtilsReadOnly.toString_Callback(this);
+  String toString();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -31742,43 +31747,43 @@
 
   @DomName('ValidityState.badInput')
   @DocsEditable()
-  bool get badInput => _blink.BlinkValidityState.badInput_Getter(this);
+  bool get badInput => _blink.BlinkValidityState.instance.badInput_Getter_(this);
 
   @DomName('ValidityState.customError')
   @DocsEditable()
-  bool get customError => _blink.BlinkValidityState.customError_Getter(this);
+  bool get customError => _blink.BlinkValidityState.instance.customError_Getter_(this);
 
   @DomName('ValidityState.patternMismatch')
   @DocsEditable()
-  bool get patternMismatch => _blink.BlinkValidityState.patternMismatch_Getter(this);
+  bool get patternMismatch => _blink.BlinkValidityState.instance.patternMismatch_Getter_(this);
 
   @DomName('ValidityState.rangeOverflow')
   @DocsEditable()
-  bool get rangeOverflow => _blink.BlinkValidityState.rangeOverflow_Getter(this);
+  bool get rangeOverflow => _blink.BlinkValidityState.instance.rangeOverflow_Getter_(this);
 
   @DomName('ValidityState.rangeUnderflow')
   @DocsEditable()
-  bool get rangeUnderflow => _blink.BlinkValidityState.rangeUnderflow_Getter(this);
+  bool get rangeUnderflow => _blink.BlinkValidityState.instance.rangeUnderflow_Getter_(this);
 
   @DomName('ValidityState.stepMismatch')
   @DocsEditable()
-  bool get stepMismatch => _blink.BlinkValidityState.stepMismatch_Getter(this);
+  bool get stepMismatch => _blink.BlinkValidityState.instance.stepMismatch_Getter_(this);
 
   @DomName('ValidityState.tooLong')
   @DocsEditable()
-  bool get tooLong => _blink.BlinkValidityState.tooLong_Getter(this);
+  bool get tooLong => _blink.BlinkValidityState.instance.tooLong_Getter_(this);
 
   @DomName('ValidityState.typeMismatch')
   @DocsEditable()
-  bool get typeMismatch => _blink.BlinkValidityState.typeMismatch_Getter(this);
+  bool get typeMismatch => _blink.BlinkValidityState.instance.typeMismatch_Getter_(this);
 
   @DomName('ValidityState.valid')
   @DocsEditable()
-  bool get valid => _blink.BlinkValidityState.valid_Getter(this);
+  bool get valid => _blink.BlinkValidityState.instance.valid_Getter_(this);
 
   @DomName('ValidityState.valueMissing')
   @DocsEditable()
-  bool get valueMissing => _blink.BlinkValidityState.valueMissing_Getter(this);
+  bool get valueMissing => _blink.BlinkValidityState.instance.valueMissing_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -31803,54 +31808,54 @@
 
   @DomName('HTMLVideoElement.height')
   @DocsEditable()
-  int get height => _blink.BlinkHTMLVideoElement.height_Getter(this);
+  int get height => _blink.BlinkHTMLVideoElement.instance.height_Getter_(this);
 
   @DomName('HTMLVideoElement.height')
   @DocsEditable()
-  void set height(int value) => _blink.BlinkHTMLVideoElement.height_Setter(this, value);
+  void set height(int value) => _blink.BlinkHTMLVideoElement.instance.height_Setter_(this, value);
 
   @DomName('HTMLVideoElement.poster')
   @DocsEditable()
-  String get poster => _blink.BlinkHTMLVideoElement.poster_Getter(this);
+  String get poster => _blink.BlinkHTMLVideoElement.instance.poster_Getter_(this);
 
   @DomName('HTMLVideoElement.poster')
   @DocsEditable()
-  void set poster(String value) => _blink.BlinkHTMLVideoElement.poster_Setter(this, value);
+  void set poster(String value) => _blink.BlinkHTMLVideoElement.instance.poster_Setter_(this, value);
 
   @DomName('HTMLVideoElement.videoHeight')
   @DocsEditable()
-  int get videoHeight => _blink.BlinkHTMLVideoElement.videoHeight_Getter(this);
+  int get videoHeight => _blink.BlinkHTMLVideoElement.instance.videoHeight_Getter_(this);
 
   @DomName('HTMLVideoElement.videoWidth')
   @DocsEditable()
-  int get videoWidth => _blink.BlinkHTMLVideoElement.videoWidth_Getter(this);
+  int get videoWidth => _blink.BlinkHTMLVideoElement.instance.videoWidth_Getter_(this);
 
   @DomName('HTMLVideoElement.webkitDecodedFrameCount')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
-  int get decodedFrameCount => _blink.BlinkHTMLVideoElement.webkitDecodedFrameCount_Getter(this);
+  int get decodedFrameCount => _blink.BlinkHTMLVideoElement.instance.webkitDecodedFrameCount_Getter_(this);
 
   @DomName('HTMLVideoElement.webkitDroppedFrameCount')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
-  int get droppedFrameCount => _blink.BlinkHTMLVideoElement.webkitDroppedFrameCount_Getter(this);
+  int get droppedFrameCount => _blink.BlinkHTMLVideoElement.instance.webkitDroppedFrameCount_Getter_(this);
 
   @DomName('HTMLVideoElement.width')
   @DocsEditable()
-  int get width => _blink.BlinkHTMLVideoElement.width_Getter(this);
+  int get width => _blink.BlinkHTMLVideoElement.instance.width_Getter_(this);
 
   @DomName('HTMLVideoElement.width')
   @DocsEditable()
-  void set width(int value) => _blink.BlinkHTMLVideoElement.width_Setter(this, value);
+  void set width(int value) => _blink.BlinkHTMLVideoElement.instance.width_Setter_(this, value);
 
   @DomName('HTMLVideoElement.getVideoPlaybackQuality')
   @DocsEditable()
   @Experimental() // untriaged
-  VideoPlaybackQuality getVideoPlaybackQuality() => _blink.BlinkHTMLVideoElement.getVideoPlaybackQuality_Callback(this);
+  VideoPlaybackQuality getVideoPlaybackQuality() => _blink.BlinkHTMLVideoElement.instance.getVideoPlaybackQuality_Callback_0_(this);
 
   @DomName('HTMLVideoElement.webkitEnterFullscreen')
   @DocsEditable()
@@ -31858,7 +31863,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
-  void enterFullscreen() => _blink.BlinkHTMLVideoElement.webkitEnterFullscreen_Callback(this);
+  void enterFullscreen() => _blink.BlinkHTMLVideoElement.instance.webkitEnterFullscreen_Callback_0_(this);
 
   @DomName('HTMLVideoElement.webkitExitFullscreen')
   @DocsEditable()
@@ -31866,7 +31871,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html#dom-document-exitfullscreen
-  void exitFullscreen() => _blink.BlinkHTMLVideoElement.webkitExitFullscreen_Callback(this);
+  void exitFullscreen() => _blink.BlinkHTMLVideoElement.instance.webkitExitFullscreen_Callback_0_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -31886,22 +31891,22 @@
   @DomName('VideoPlaybackQuality.corruptedVideoFrames')
   @DocsEditable()
   @Experimental() // untriaged
-  int get corruptedVideoFrames => _blink.BlinkVideoPlaybackQuality.corruptedVideoFrames_Getter(this);
+  int get corruptedVideoFrames => _blink.BlinkVideoPlaybackQuality.instance.corruptedVideoFrames_Getter_(this);
 
   @DomName('VideoPlaybackQuality.creationTime')
   @DocsEditable()
   @Experimental() // untriaged
-  double get creationTime => _blink.BlinkVideoPlaybackQuality.creationTime_Getter(this);
+  double get creationTime => _blink.BlinkVideoPlaybackQuality.instance.creationTime_Getter_(this);
 
   @DomName('VideoPlaybackQuality.droppedVideoFrames')
   @DocsEditable()
   @Experimental() // untriaged
-  int get droppedVideoFrames => _blink.BlinkVideoPlaybackQuality.droppedVideoFrames_Getter(this);
+  int get droppedVideoFrames => _blink.BlinkVideoPlaybackQuality.instance.droppedVideoFrames_Getter_(this);
 
   @DomName('VideoPlaybackQuality.totalVideoFrames')
   @DocsEditable()
   @Experimental() // untriaged
-  int get totalVideoFrames => _blink.BlinkVideoPlaybackQuality.totalVideoFrames_Getter(this);
+  int get totalVideoFrames => _blink.BlinkVideoPlaybackQuality.instance.totalVideoFrames_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -31921,32 +31926,32 @@
   @DomName('VideoTrack.id')
   @DocsEditable()
   @Experimental() // untriaged
-  String get id => _blink.BlinkVideoTrack.id_Getter(this);
+  String get id => _blink.BlinkVideoTrack.instance.id_Getter_(this);
 
   @DomName('VideoTrack.kind')
   @DocsEditable()
   @Experimental() // untriaged
-  String get kind => _blink.BlinkVideoTrack.kind_Getter(this);
+  String get kind => _blink.BlinkVideoTrack.instance.kind_Getter_(this);
 
   @DomName('VideoTrack.label')
   @DocsEditable()
   @Experimental() // untriaged
-  String get label => _blink.BlinkVideoTrack.label_Getter(this);
+  String get label => _blink.BlinkVideoTrack.instance.label_Getter_(this);
 
   @DomName('VideoTrack.language')
   @DocsEditable()
   @Experimental() // untriaged
-  String get language => _blink.BlinkVideoTrack.language_Getter(this);
+  String get language => _blink.BlinkVideoTrack.instance.language_Getter_(this);
 
   @DomName('VideoTrack.selected')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get selected => _blink.BlinkVideoTrack.selected_Getter(this);
+  bool get selected => _blink.BlinkVideoTrack.instance.selected_Getter_(this);
 
   @DomName('VideoTrack.selected')
   @DocsEditable()
   @Experimental() // untriaged
-  void set selected(bool value) => _blink.BlinkVideoTrack.selected_Setter(this, value);
+  void set selected(bool value) => _blink.BlinkVideoTrack.instance.selected_Setter_(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -31971,22 +31976,22 @@
   @DomName('VideoTrackList.length')
   @DocsEditable()
   @Experimental() // untriaged
-  int get length => _blink.BlinkVideoTrackList.length_Getter(this);
+  int get length => _blink.BlinkVideoTrackList.instance.length_Getter_(this);
 
   @DomName('VideoTrackList.selectedIndex')
   @DocsEditable()
   @Experimental() // untriaged
-  int get selectedIndex => _blink.BlinkVideoTrackList.selectedIndex_Getter(this);
+  int get selectedIndex => _blink.BlinkVideoTrackList.instance.selectedIndex_Getter_(this);
 
   @DomName('VideoTrackList.__getter__')
   @DocsEditable()
   @Experimental() // untriaged
-  VideoTrack __getter__(int index) => _blink.BlinkVideoTrackList.$__getter___Callback_1(this, index);
+  VideoTrack __getter__(int index) => _blink.BlinkVideoTrackList.instance.$__getter___Callback_1_(this, index);
 
   @DomName('VideoTrackList.getTrackById')
   @DocsEditable()
   @Experimental() // untriaged
-  VideoTrack getTrackById(String id) => _blink.BlinkVideoTrackList.getTrackById_Callback_1(this, id);
+  VideoTrack getTrackById(String id) => _blink.BlinkVideoTrackList.instance.getTrackById_Callback_1_(this, id);
 
   @DomName('VideoTrackList.onchange')
   @DocsEditable()
@@ -32022,93 +32027,93 @@
   @DomName('VTTCue.VTTCue')
   @DocsEditable()
   factory VttCue(num startTime, num endTime, String text) {
-    return _blink.BlinkVTTCue.constructorCallback_3(startTime, endTime, text);
+    return _blink.BlinkVTTCue.instance.constructorCallback_3_(startTime, endTime, text);
   }
 
   @DomName('VTTCue.align')
   @DocsEditable()
   @Experimental() // untriaged
-  String get align => _blink.BlinkVTTCue.align_Getter(this);
+  String get align => _blink.BlinkVTTCue.instance.align_Getter_(this);
 
   @DomName('VTTCue.align')
   @DocsEditable()
   @Experimental() // untriaged
-  void set align(String value) => _blink.BlinkVTTCue.align_Setter(this, value);
+  void set align(String value) => _blink.BlinkVTTCue.instance.align_Setter_(this, value);
 
   @DomName('VTTCue.line')
   @DocsEditable()
   @Experimental() // untriaged
-  int get line => _blink.BlinkVTTCue.line_Getter(this);
+  int get line => _blink.BlinkVTTCue.instance.line_Getter_(this);
 
   @DomName('VTTCue.line')
   @DocsEditable()
   @Experimental() // untriaged
-  void set line(int value) => _blink.BlinkVTTCue.line_Setter(this, value);
+  void set line(int value) => _blink.BlinkVTTCue.instance.line_Setter_(this, value);
 
   @DomName('VTTCue.position')
   @DocsEditable()
   @Experimental() // untriaged
-  int get position => _blink.BlinkVTTCue.position_Getter(this);
+  int get position => _blink.BlinkVTTCue.instance.position_Getter_(this);
 
   @DomName('VTTCue.position')
   @DocsEditable()
   @Experimental() // untriaged
-  void set position(int value) => _blink.BlinkVTTCue.position_Setter(this, value);
+  void set position(int value) => _blink.BlinkVTTCue.instance.position_Setter_(this, value);
 
   @DomName('VTTCue.regionId')
   @DocsEditable()
   @Experimental() // untriaged
-  String get regionId => _blink.BlinkVTTCue.regionId_Getter(this);
+  String get regionId => _blink.BlinkVTTCue.instance.regionId_Getter_(this);
 
   @DomName('VTTCue.regionId')
   @DocsEditable()
   @Experimental() // untriaged
-  void set regionId(String value) => _blink.BlinkVTTCue.regionId_Setter(this, value);
+  void set regionId(String value) => _blink.BlinkVTTCue.instance.regionId_Setter_(this, value);
 
   @DomName('VTTCue.size')
   @DocsEditable()
   @Experimental() // untriaged
-  int get size => _blink.BlinkVTTCue.size_Getter(this);
+  int get size => _blink.BlinkVTTCue.instance.size_Getter_(this);
 
   @DomName('VTTCue.size')
   @DocsEditable()
   @Experimental() // untriaged
-  void set size(int value) => _blink.BlinkVTTCue.size_Setter(this, value);
+  void set size(int value) => _blink.BlinkVTTCue.instance.size_Setter_(this, value);
 
   @DomName('VTTCue.snapToLines')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get snapToLines => _blink.BlinkVTTCue.snapToLines_Getter(this);
+  bool get snapToLines => _blink.BlinkVTTCue.instance.snapToLines_Getter_(this);
 
   @DomName('VTTCue.snapToLines')
   @DocsEditable()
   @Experimental() // untriaged
-  void set snapToLines(bool value) => _blink.BlinkVTTCue.snapToLines_Setter(this, value);
+  void set snapToLines(bool value) => _blink.BlinkVTTCue.instance.snapToLines_Setter_(this, value);
 
   @DomName('VTTCue.text')
   @DocsEditable()
   @Experimental() // untriaged
-  String get text => _blink.BlinkVTTCue.text_Getter(this);
+  String get text => _blink.BlinkVTTCue.instance.text_Getter_(this);
 
   @DomName('VTTCue.text')
   @DocsEditable()
   @Experimental() // untriaged
-  void set text(String value) => _blink.BlinkVTTCue.text_Setter(this, value);
+  void set text(String value) => _blink.BlinkVTTCue.instance.text_Setter_(this, value);
 
   @DomName('VTTCue.vertical')
   @DocsEditable()
   @Experimental() // untriaged
-  String get vertical => _blink.BlinkVTTCue.vertical_Getter(this);
+  String get vertical => _blink.BlinkVTTCue.instance.vertical_Getter_(this);
 
   @DomName('VTTCue.vertical')
   @DocsEditable()
   @Experimental() // untriaged
-  void set vertical(String value) => _blink.BlinkVTTCue.vertical_Setter(this, value);
+  void set vertical(String value) => _blink.BlinkVTTCue.instance.vertical_Setter_(this, value);
 
   @DomName('VTTCue.getCueAsHTML')
   @DocsEditable()
   @Experimental() // untriaged
-  DocumentFragment getCueAsHtml() => _blink.BlinkVTTCue.getCueAsHTML_Callback(this);
+  DocumentFragment getCueAsHtml() => _blink.BlinkVTTCue.instance.getCueAsHTML_Callback_0_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -32128,93 +32133,93 @@
   @DomName('VTTRegion.VTTRegion')
   @DocsEditable()
   factory VttRegion() {
-    return _blink.BlinkVTTRegion.constructorCallback();
+    return _blink.BlinkVTTRegion.instance.constructorCallback_0_();
   }
 
   @DomName('VTTRegion.height')
   @DocsEditable()
   @Experimental() // untriaged
-  int get height => _blink.BlinkVTTRegion.height_Getter(this);
+  int get height => _blink.BlinkVTTRegion.instance.height_Getter_(this);
 
   @DomName('VTTRegion.height')
   @DocsEditable()
   @Experimental() // untriaged
-  void set height(int value) => _blink.BlinkVTTRegion.height_Setter(this, value);
+  void set height(int value) => _blink.BlinkVTTRegion.instance.height_Setter_(this, value);
 
   @DomName('VTTRegion.id')
   @DocsEditable()
   @Experimental() // untriaged
-  String get id => _blink.BlinkVTTRegion.id_Getter(this);
+  String get id => _blink.BlinkVTTRegion.instance.id_Getter_(this);
 
   @DomName('VTTRegion.id')
   @DocsEditable()
   @Experimental() // untriaged
-  void set id(String value) => _blink.BlinkVTTRegion.id_Setter(this, value);
+  void set id(String value) => _blink.BlinkVTTRegion.instance.id_Setter_(this, value);
 
   @DomName('VTTRegion.regionAnchorX')
   @DocsEditable()
   @Experimental() // untriaged
-  num get regionAnchorX => _blink.BlinkVTTRegion.regionAnchorX_Getter(this);
+  num get regionAnchorX => _blink.BlinkVTTRegion.instance.regionAnchorX_Getter_(this);
 
   @DomName('VTTRegion.regionAnchorX')
   @DocsEditable()
   @Experimental() // untriaged
-  void set regionAnchorX(num value) => _blink.BlinkVTTRegion.regionAnchorX_Setter(this, value);
+  void set regionAnchorX(num value) => _blink.BlinkVTTRegion.instance.regionAnchorX_Setter_(this, value);
 
   @DomName('VTTRegion.regionAnchorY')
   @DocsEditable()
   @Experimental() // untriaged
-  num get regionAnchorY => _blink.BlinkVTTRegion.regionAnchorY_Getter(this);
+  num get regionAnchorY => _blink.BlinkVTTRegion.instance.regionAnchorY_Getter_(this);
 
   @DomName('VTTRegion.regionAnchorY')
   @DocsEditable()
   @Experimental() // untriaged
-  void set regionAnchorY(num value) => _blink.BlinkVTTRegion.regionAnchorY_Setter(this, value);
+  void set regionAnchorY(num value) => _blink.BlinkVTTRegion.instance.regionAnchorY_Setter_(this, value);
 
   @DomName('VTTRegion.scroll')
   @DocsEditable()
   @Experimental() // untriaged
-  String get scroll => _blink.BlinkVTTRegion.scroll_Getter(this);
+  String get scroll => _blink.BlinkVTTRegion.instance.scroll_Getter_(this);
 
   @DomName('VTTRegion.scroll')
   @DocsEditable()
   @Experimental() // untriaged
-  void set scroll(String value) => _blink.BlinkVTTRegion.scroll_Setter(this, value);
+  void set scroll(String value) => _blink.BlinkVTTRegion.instance.scroll_Setter_(this, value);
 
   @DomName('VTTRegion.track')
   @DocsEditable()
   @Experimental() // untriaged
-  TextTrack get track => _blink.BlinkVTTRegion.track_Getter(this);
+  TextTrack get track => _blink.BlinkVTTRegion.instance.track_Getter_(this);
 
   @DomName('VTTRegion.viewportAnchorX')
   @DocsEditable()
   @Experimental() // untriaged
-  num get viewportAnchorX => _blink.BlinkVTTRegion.viewportAnchorX_Getter(this);
+  num get viewportAnchorX => _blink.BlinkVTTRegion.instance.viewportAnchorX_Getter_(this);
 
   @DomName('VTTRegion.viewportAnchorX')
   @DocsEditable()
   @Experimental() // untriaged
-  void set viewportAnchorX(num value) => _blink.BlinkVTTRegion.viewportAnchorX_Setter(this, value);
+  void set viewportAnchorX(num value) => _blink.BlinkVTTRegion.instance.viewportAnchorX_Setter_(this, value);
 
   @DomName('VTTRegion.viewportAnchorY')
   @DocsEditable()
   @Experimental() // untriaged
-  num get viewportAnchorY => _blink.BlinkVTTRegion.viewportAnchorY_Getter(this);
+  num get viewportAnchorY => _blink.BlinkVTTRegion.instance.viewportAnchorY_Getter_(this);
 
   @DomName('VTTRegion.viewportAnchorY')
   @DocsEditable()
   @Experimental() // untriaged
-  void set viewportAnchorY(num value) => _blink.BlinkVTTRegion.viewportAnchorY_Setter(this, value);
+  void set viewportAnchorY(num value) => _blink.BlinkVTTRegion.instance.viewportAnchorY_Setter_(this, value);
 
   @DomName('VTTRegion.width')
   @DocsEditable()
   @Experimental() // untriaged
-  num get width => _blink.BlinkVTTRegion.width_Getter(this);
+  num get width => _blink.BlinkVTTRegion.instance.width_Getter_(this);
 
   @DomName('VTTRegion.width')
   @DocsEditable()
   @Experimental() // untriaged
-  void set width(num value) => _blink.BlinkVTTRegion.width_Setter(this, value);
+  void set width(num value) => _blink.BlinkVTTRegion.instance.width_Setter_(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -32234,17 +32239,17 @@
   @DomName('VTTRegionList.length')
   @DocsEditable()
   @Experimental() // untriaged
-  int get length => _blink.BlinkVTTRegionList.length_Getter(this);
+  int get length => _blink.BlinkVTTRegionList.instance.length_Getter_(this);
 
   @DomName('VTTRegionList.getRegionById')
   @DocsEditable()
   @Experimental() // untriaged
-  VttRegion getRegionById(String id) => _blink.BlinkVTTRegionList.getRegionById_Callback_1(this, id);
+  VttRegion getRegionById(String id) => _blink.BlinkVTTRegionList.instance.getRegionById_Callback_1_(this, id);
 
   @DomName('VTTRegionList.item')
   @DocsEditable()
   @Experimental() // untriaged
-  VttRegion item(int index) => _blink.BlinkVTTRegionList.item_Callback_1(this, index);
+  VttRegion item(int index) => _blink.BlinkVTTRegionList.instance.item_Callback_1_(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -32343,13 +32348,13 @@
   @DocsEditable()
   factory WebSocket(String url, [protocol_OR_protocols]) {
     if ((url is String || url == null) && protocol_OR_protocols == null) {
-      return _blink.BlinkWebSocket.constructorCallback_1(url);
+      return _blink.BlinkWebSocket.instance.constructorCallback_1_(url);
     }
     if ((protocol_OR_protocols is String || protocol_OR_protocols == null) && (url is String || url == null)) {
-      return _blink.BlinkWebSocket.constructorCallback_2(url, protocol_OR_protocols);
+      return _blink.BlinkWebSocket.instance.constructorCallback_2_(url, protocol_OR_protocols);
     }
     if ((protocol_OR_protocols is List<String> || protocol_OR_protocols == null) && (url is String || url == null)) {
-      return _blink.BlinkWebSocket.constructorCallback_2(url, protocol_OR_protocols);
+      return _blink.BlinkWebSocket.instance.constructorCallback_2_(url, protocol_OR_protocols);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
@@ -32375,60 +32380,60 @@
 
   @DomName('WebSocket.binaryType')
   @DocsEditable()
-  String get binaryType => _blink.BlinkWebSocket.binaryType_Getter(this);
+  String get binaryType => _blink.BlinkWebSocket.instance.binaryType_Getter_(this);
 
   @DomName('WebSocket.binaryType')
   @DocsEditable()
-  void set binaryType(String value) => _blink.BlinkWebSocket.binaryType_Setter(this, value);
+  void set binaryType(String value) => _blink.BlinkWebSocket.instance.binaryType_Setter_(this, value);
 
   @DomName('WebSocket.bufferedAmount')
   @DocsEditable()
-  int get bufferedAmount => _blink.BlinkWebSocket.bufferedAmount_Getter(this);
+  int get bufferedAmount => _blink.BlinkWebSocket.instance.bufferedAmount_Getter_(this);
 
   @DomName('WebSocket.extensions')
   @DocsEditable()
-  String get extensions => _blink.BlinkWebSocket.extensions_Getter(this);
+  String get extensions => _blink.BlinkWebSocket.instance.extensions_Getter_(this);
 
   @DomName('WebSocket.protocol')
   @DocsEditable()
-  String get protocol => _blink.BlinkWebSocket.protocol_Getter(this);
+  String get protocol => _blink.BlinkWebSocket.instance.protocol_Getter_(this);
 
   @DomName('WebSocket.readyState')
   @DocsEditable()
-  int get readyState => _blink.BlinkWebSocket.readyState_Getter(this);
+  int get readyState => _blink.BlinkWebSocket.instance.readyState_Getter_(this);
 
   @DomName('WebSocket.url')
   @DocsEditable()
-  String get url => _blink.BlinkWebSocket.url_Getter(this);
+  String get url => _blink.BlinkWebSocket.instance.url_Getter_(this);
 
   void close([int code, String reason]) {
     if (reason != null) {
-      _blink.BlinkWebSocket.close_Callback_2(this, code, reason);
+      _blink.BlinkWebSocket.instance.close_Callback_2_(this, code, reason);
       return;
     }
     if (code != null) {
-      _blink.BlinkWebSocket.close_Callback_1(this, code);
+      _blink.BlinkWebSocket.instance.close_Callback_1_(this, code);
       return;
     }
-    _blink.BlinkWebSocket.close_Callback(this);
+    _blink.BlinkWebSocket.instance.close_Callback_0_(this);
     return;
   }
 
   void send(data) {
     if ((data is String || data == null)) {
-      _blink.BlinkWebSocket.send_Callback_1(this, data);
+      _blink.BlinkWebSocket.instance.send_Callback_1_(this, data);
       return;
     }
     if ((data is Blob || data == null)) {
-      _blink.BlinkWebSocket.send_Callback_1(this, data);
+      _blink.BlinkWebSocket.instance.send_Callback_1_(this, data);
       return;
     }
     if ((data is TypedData || data == null)) {
-      _blink.BlinkWebSocket.send_Callback_1(this, data);
+      _blink.BlinkWebSocket.instance.send_Callback_1_(this, data);
       return;
     }
     if ((data is ByteBuffer || data == null)) {
-      _blink.BlinkWebSocket.send_Callback_1(this, data);
+      _blink.BlinkWebSocket.instance.send_Callback_1_(this, data);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -32436,19 +32441,19 @@
 
   @DomName('WebSocket.sendBlob')
   @DocsEditable()
-  void sendBlob(Blob data) => _blink.BlinkWebSocket.send_Callback_1(this, data);
+  void sendBlob(Blob data) => _blink.BlinkWebSocket.instance.send_Callback_1_(this, data);
 
   @DomName('WebSocket.sendByteBuffer')
   @DocsEditable()
-  void sendByteBuffer(ByteBuffer data) => _blink.BlinkWebSocket.send_Callback_1(this, data);
+  void sendByteBuffer(ByteBuffer data) => _blink.BlinkWebSocket.instance.send_Callback_1_(this, data);
 
   @DomName('WebSocket.sendString')
   @DocsEditable()
-  void sendString(String data) => _blink.BlinkWebSocket.send_Callback_1(this, data);
+  void sendString(String data) => _blink.BlinkWebSocket.instance.send_Callback_1_(this, data);
 
   @DomName('WebSocket.sendTypedData')
   @DocsEditable()
-  void sendTypedData(TypedData data) => _blink.BlinkWebSocket.send_Callback_1(this, data);
+  void sendTypedData(TypedData data) => _blink.BlinkWebSocket.instance.send_Callback_1_(this, data);
 
   /// Stream of `close` events handled by this [WebSocket].
   @DomName('WebSocket.onclose')
@@ -32503,7 +32508,7 @@
       'metaKey': metaKey,
       'relatedTarget': relatedTarget,
     };
-    return _blink.BlinkWheelEvent.constructorCallback(type, options);
+    return _blink.BlinkWheelEvent.constructorCallback_2(type, options);
   }
 
   // To suppress missing implicit constructor warnings.
@@ -32523,32 +32528,32 @@
 
   @DomName('WheelEvent.deltaMode')
   @DocsEditable()
-  int get deltaMode => _blink.BlinkWheelEvent.deltaMode_Getter(this);
+  int get deltaMode => _blink.BlinkWheelEvent.instance.deltaMode_Getter_(this);
 
   @DomName('WheelEvent.deltaX')
   @DocsEditable()
   @Experimental() // untriaged
-  double get _deltaX => _blink.BlinkWheelEvent.deltaX_Getter(this);
+  double get _deltaX => _blink.BlinkWheelEvent.instance.deltaX_Getter_(this);
 
   @DomName('WheelEvent.deltaY')
   @DocsEditable()
   @Experimental() // untriaged
-  double get _deltaY => _blink.BlinkWheelEvent.deltaY_Getter(this);
+  double get _deltaY => _blink.BlinkWheelEvent.instance.deltaY_Getter_(this);
 
   @DomName('WheelEvent.deltaZ')
   @DocsEditable()
   @Experimental() // untriaged
-  double get deltaZ => _blink.BlinkWheelEvent.deltaZ_Getter(this);
+  double get deltaZ => _blink.BlinkWheelEvent.instance.deltaZ_Getter_(this);
 
   @DomName('WheelEvent.wheelDeltaX')
   @DocsEditable()
   @Experimental() // non-standard
-  int get wheelDeltaX => _blink.BlinkWheelEvent.wheelDeltaX_Getter(this);
+  int get wheelDeltaX => _blink.BlinkWheelEvent.instance.wheelDeltaX_Getter_(this);
 
   @DomName('WheelEvent.wheelDeltaY')
   @DocsEditable()
   @Experimental() // non-standard
-  int get wheelDeltaY => _blink.BlinkWheelEvent.wheelDeltaY_Getter(this);
+  int get wheelDeltaY => _blink.BlinkWheelEvent.instance.wheelDeltaY_Getter_(this);
 
 
   /**
@@ -32892,7 +32897,7 @@
    */
   @DomName('Window.CSS')
   @DocsEditable()
-  Css get css => _blink.BlinkWindow.CSS_Getter(this);
+  Css get css => _blink.BlinkWindow.instance.CSS_Getter_(this);
 
   /**
    * The application cache for this window.
@@ -32907,15 +32912,15 @@
    */
   @DomName('Window.applicationCache')
   @DocsEditable()
-  ApplicationCache get applicationCache => _blink.BlinkWindow.applicationCache_Getter(this);
+  ApplicationCache get applicationCache => _blink.BlinkWindow.instance.applicationCache_Getter_(this);
 
   @DomName('Window.closed')
   @DocsEditable()
-  bool get closed => _blink.BlinkWindow.closed_Getter(this);
+  bool get closed => _blink.BlinkWindow.instance.closed_Getter_(this);
 
   @DomName('Window.console')
   @DocsEditable()
-  Console get console => _blink.BlinkWindow.console_Getter(this);
+  Console get console => _blink.BlinkWindow.instance.console_Getter_(this);
 
   /**
    * Entrypoint for the browser's cryptographic functions.
@@ -32928,31 +32933,31 @@
   @DocsEditable()
   // http://www.w3.org/TR/WebCryptoAPI/
   @Experimental()
-  Crypto get crypto => _blink.BlinkWindow.crypto_Getter(this);
+  Crypto get crypto => _blink.BlinkWindow.instance.crypto_Getter_(this);
 
   /// *Deprecated*.
   @DomName('Window.defaultStatus')
   @DocsEditable()
   @Experimental() // non-standard
-  String get defaultStatus => _blink.BlinkWindow.defaultStatus_Getter(this);
+  String get defaultStatus => _blink.BlinkWindow.instance.defaultStatus_Getter_(this);
 
   /// *Deprecated*.
   @DomName('Window.defaultStatus')
   @DocsEditable()
   @Experimental() // non-standard
-  void set defaultStatus(String value) => _blink.BlinkWindow.defaultStatus_Setter(this, value);
+  void set defaultStatus(String value) => _blink.BlinkWindow.instance.defaultStatus_Setter_(this, value);
 
   /// *Deprecated*.
   @DomName('Window.defaultstatus')
   @DocsEditable()
   @Experimental() // non-standard
-  String get defaultstatus => _blink.BlinkWindow.defaultstatus_Getter(this);
+  String get defaultstatus => _blink.BlinkWindow.instance.defaultstatus_Getter_(this);
 
   /// *Deprecated*.
   @DomName('Window.defaultstatus')
   @DocsEditable()
   @Experimental() // non-standard
-  void set defaultstatus(String value) => _blink.BlinkWindow.defaultstatus_Setter(this, value);
+  void set defaultstatus(String value) => _blink.BlinkWindow.instance.defaultstatus_Setter_(this, value);
 
   /**
    * The ratio between physical pixels and logical CSS pixels.
@@ -32970,11 +32975,11 @@
   @DocsEditable()
   // http://www.quirksmode.org/blog/archives/2012/06/devicepixelrati.html
   @Experimental() // non-standard
-  double get devicePixelRatio => _blink.BlinkWindow.devicePixelRatio_Getter(this);
+  double get devicePixelRatio => _blink.BlinkWindow.instance.devicePixelRatio_Getter_(this);
 
   @DomName('Window.document')
   @DocsEditable()
-  Document get document => _blink.BlinkWindow.document_Getter(this);
+  Document get document => _blink.BlinkWindow.instance.document_Getter_(this);
 
   /**
    * The current session history for this window's newest document.
@@ -32987,7 +32992,7 @@
    */
   @DomName('Window.history')
   @DocsEditable()
-  History get history => _blink.BlinkWindow.history_Getter(this);
+  History get history => _blink.BlinkWindow.instance.history_Getter_(this);
 
   @DomName('Window.indexedDB')
   @DocsEditable()
@@ -32995,7 +33000,7 @@
   @SupportedBrowser(SupportedBrowser.FIREFOX, '15')
   @SupportedBrowser(SupportedBrowser.IE, '10')
   @Experimental()
-  IdbFactory get indexedDB => _blink.BlinkWindow.indexedDB_Getter(this);
+  IdbFactory get indexedDB => _blink.BlinkWindow.instance.indexedDB_Getter_(this);
 
   /**
    * The height of the viewport including scrollbars.
@@ -33008,7 +33013,7 @@
    */
   @DomName('Window.innerHeight')
   @DocsEditable()
-  int get innerHeight => _blink.BlinkWindow.innerHeight_Getter(this);
+  int get innerHeight => _blink.BlinkWindow.instance.innerHeight_Getter_(this);
 
   /**
    * The width of the viewport including scrollbars.
@@ -33021,7 +33026,7 @@
    */
   @DomName('Window.innerWidth')
   @DocsEditable()
-  int get innerWidth => _blink.BlinkWindow.innerWidth_Getter(this);
+  int get innerWidth => _blink.BlinkWindow.instance.innerWidth_Getter_(this);
 
   /**
    * Storage for this window that persists across sessions.
@@ -33038,11 +33043,11 @@
    */
   @DomName('Window.localStorage')
   @DocsEditable()
-  Storage get localStorage => _blink.BlinkWindow.localStorage_Getter(this);
+  Storage get localStorage => _blink.BlinkWindow.instance.localStorage_Getter_(this);
 
   @DomName('Window.location')
   @DocsEditable()
-  Location get location => _blink.BlinkWindow.location_Getter(this);
+  Location get location => _blink.BlinkWindow.instance.location_Getter_(this);
 
   /**
    * This window's location bar, which displays the URL.
@@ -33055,7 +33060,7 @@
    */
   @DomName('Window.locationbar')
   @DocsEditable()
-  BarProp get locationbar => _blink.BlinkWindow.locationbar_Getter(this);
+  BarProp get locationbar => _blink.BlinkWindow.instance.locationbar_Getter_(this);
 
   /**
    * This window's menu bar, which displays menu commands.
@@ -33068,7 +33073,7 @@
    */
   @DomName('Window.menubar')
   @DocsEditable()
-  BarProp get menubar => _blink.BlinkWindow.menubar_Getter(this);
+  BarProp get menubar => _blink.BlinkWindow.instance.menubar_Getter_(this);
 
   /**
    * The name of this window.
@@ -33081,7 +33086,7 @@
    */
   @DomName('Window.name')
   @DocsEditable()
-  String get name => _blink.BlinkWindow.name_Getter(this);
+  String get name => _blink.BlinkWindow.instance.name_Getter_(this);
 
   /**
    * The name of this window.
@@ -33094,7 +33099,7 @@
    */
   @DomName('Window.name')
   @DocsEditable()
-  void set name(String value) => _blink.BlinkWindow.name_Setter(this, value);
+  void set name(String value) => _blink.BlinkWindow.instance.name_Setter_(this, value);
 
   /**
    * The user agent accessing this window.
@@ -33107,7 +33112,7 @@
    */
   @DomName('Window.navigator')
   @DocsEditable()
-  Navigator get navigator => _blink.BlinkWindow.navigator_Getter(this);
+  Navigator get navigator => _blink.BlinkWindow.instance.navigator_Getter_(this);
 
   /**
    * Whether objects are drawn offscreen before being displayed.
@@ -33121,20 +33126,20 @@
   @DomName('Window.offscreenBuffering')
   @DocsEditable()
   @Experimental() // non-standard
-  bool get offscreenBuffering => _blink.BlinkWindow.offscreenBuffering_Getter(this);
+  bool get offscreenBuffering => _blink.BlinkWindow.instance.offscreenBuffering_Getter_(this);
 
   @DomName('Window.opener')
   @DocsEditable()
-  WindowBase get opener => _blink.BlinkWindow.opener_Getter(this);
+  WindowBase get opener => _blink.BlinkWindow.instance.opener_Getter_(this);
 
   @DomName('Window.opener')
   @DocsEditable()
-  void set opener(Window value) => _blink.BlinkWindow.opener_Setter(this, value);
+  void set opener(Window value) => _blink.BlinkWindow.instance.opener_Setter_(this, value);
 
   @DomName('Window.orientation')
   @DocsEditable()
   @Experimental() // untriaged
-  int get orientation => _blink.BlinkWindow.orientation_Getter(this);
+  int get orientation => _blink.BlinkWindow.instance.orientation_Getter_(this);
 
   /**
    * The height of this window including all user interface elements.
@@ -33147,7 +33152,7 @@
    */
   @DomName('Window.outerHeight')
   @DocsEditable()
-  int get outerHeight => _blink.BlinkWindow.outerHeight_Getter(this);
+  int get outerHeight => _blink.BlinkWindow.instance.outerHeight_Getter_(this);
 
   /**
    * The width of the window including all user interface elements.
@@ -33160,7 +33165,7 @@
    */
   @DomName('Window.outerWidth')
   @DocsEditable()
-  int get outerWidth => _blink.BlinkWindow.outerWidth_Getter(this);
+  int get outerWidth => _blink.BlinkWindow.instance.outerWidth_Getter_(this);
 
   /**
    * The distance this window has been scrolled horizontally.
@@ -33176,7 +33181,7 @@
    */
   @DomName('Window.pageXOffset')
   @DocsEditable()
-  int get pageXOffset => _blink.BlinkWindow.pageXOffset_Getter(this);
+  int get pageXOffset => _blink.BlinkWindow.instance.pageXOffset_Getter_(this);
 
   /**
    * The distance this window has been scrolled vertically.
@@ -33192,11 +33197,11 @@
    */
   @DomName('Window.pageYOffset')
   @DocsEditable()
-  int get pageYOffset => _blink.BlinkWindow.pageYOffset_Getter(this);
+  int get pageYOffset => _blink.BlinkWindow.instance.pageYOffset_Getter_(this);
 
   @DomName('Window.parent')
   @DocsEditable()
-  WindowBase get parent => _blink.BlinkWindow.parent_Getter(this);
+  WindowBase get parent => _blink.BlinkWindow.instance.parent_Getter_(this);
 
   /**
    * Timing and navigation data for this window.
@@ -33214,7 +33219,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.IE)
-  Performance get performance => _blink.BlinkWindow.performance_Getter(this);
+  Performance get performance => _blink.BlinkWindow.instance.performance_Getter_(this);
 
   /**
    * Information about the screen displaying this window.
@@ -33226,7 +33231,7 @@
    */
   @DomName('Window.screen')
   @DocsEditable()
-  Screen get screen => _blink.BlinkWindow.screen_Getter(this);
+  Screen get screen => _blink.BlinkWindow.instance.screen_Getter_(this);
 
   /**
    * The distance from the left side of the screen to the left side of this
@@ -33239,7 +33244,7 @@
    */
   @DomName('Window.screenLeft')
   @DocsEditable()
-  int get screenLeft => _blink.BlinkWindow.screenLeft_Getter(this);
+  int get screenLeft => _blink.BlinkWindow.instance.screenLeft_Getter_(this);
 
   /**
    * The distance from the top of the screen to the top of this window.
@@ -33251,7 +33256,7 @@
    */
   @DomName('Window.screenTop')
   @DocsEditable()
-  int get screenTop => _blink.BlinkWindow.screenTop_Getter(this);
+  int get screenTop => _blink.BlinkWindow.instance.screenTop_Getter_(this);
 
   /**
    * The distance from the left side of the screen to the mouse pointer.
@@ -33263,7 +33268,7 @@
    */
   @DomName('Window.screenX')
   @DocsEditable()
-  int get screenX => _blink.BlinkWindow.screenX_Getter(this);
+  int get screenX => _blink.BlinkWindow.instance.screenX_Getter_(this);
 
   /**
    * The distance from the top of the screen to the mouse pointer.
@@ -33275,15 +33280,15 @@
    */
   @DomName('Window.screenY')
   @DocsEditable()
-  int get screenY => _blink.BlinkWindow.screenY_Getter(this);
+  int get screenY => _blink.BlinkWindow.instance.screenY_Getter_(this);
 
   @DomName('Window.scrollX')
   @DocsEditable()
-  int get scrollX => _blink.BlinkWindow.scrollX_Getter(this);
+  int get scrollX => _blink.BlinkWindow.instance.scrollX_Getter_(this);
 
   @DomName('Window.scrollY')
   @DocsEditable()
-  int get scrollY => _blink.BlinkWindow.scrollY_Getter(this);
+  int get scrollY => _blink.BlinkWindow.instance.scrollY_Getter_(this);
 
   /**
    * This window's scroll bars.
@@ -33296,7 +33301,7 @@
    */
   @DomName('Window.scrollbars')
   @DocsEditable()
-  BarProp get scrollbars => _blink.BlinkWindow.scrollbars_Getter(this);
+  BarProp get scrollbars => _blink.BlinkWindow.instance.scrollbars_Getter_(this);
 
   /**
    * The current window.
@@ -33308,7 +33313,7 @@
    */
   @DomName('Window.self')
   @DocsEditable()
-  WindowBase get self => _blink.BlinkWindow.self_Getter(this);
+  WindowBase get self => _blink.BlinkWindow.instance.self_Getter_(this);
 
   /**
    * Storage for this window that is cleared when this session ends.
@@ -33325,7 +33330,7 @@
    */
   @DomName('Window.sessionStorage')
   @DocsEditable()
-  Storage get sessionStorage => _blink.BlinkWindow.sessionStorage_Getter(this);
+  Storage get sessionStorage => _blink.BlinkWindow.instance.sessionStorage_Getter_(this);
 
   /**
    * Access to speech synthesis in the browser.
@@ -33340,17 +33345,17 @@
   @DocsEditable()
   // https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#tts-section
   @Experimental()
-  SpeechSynthesis get speechSynthesis => _blink.BlinkWindow.speechSynthesis_Getter(this);
+  SpeechSynthesis get speechSynthesis => _blink.BlinkWindow.instance.speechSynthesis_Getter_(this);
 
   /// *Deprecated*.
   @DomName('Window.status')
   @DocsEditable()
-  String get status => _blink.BlinkWindow.status_Getter(this);
+  String get status => _blink.BlinkWindow.instance.status_Getter_(this);
 
   /// *Deprecated*.
   @DomName('Window.status')
   @DocsEditable()
-  void set status(String value) => _blink.BlinkWindow.status_Setter(this, value);
+  void set status(String value) => _blink.BlinkWindow.instance.status_Setter_(this, value);
 
   /**
    * This window's status bar.
@@ -33363,7 +33368,7 @@
    */
   @DomName('Window.statusbar')
   @DocsEditable()
-  BarProp get statusbar => _blink.BlinkWindow.statusbar_Getter(this);
+  BarProp get statusbar => _blink.BlinkWindow.instance.statusbar_Getter_(this);
 
   /**
    * Access to CSS media queries.
@@ -33378,7 +33383,7 @@
   @DocsEditable()
   // http://developer.apple.com/library/safari/#documentation/SafariDOMAdditions/Reference/StyleMedia/StyleMedia/StyleMedia.html
   @Experimental() // nonstandard
-  StyleMedia get styleMedia => _blink.BlinkWindow.styleMedia_Getter(this);
+  StyleMedia get styleMedia => _blink.BlinkWindow.instance.styleMedia_Getter_(this);
 
   /**
    * This window's tool bar.
@@ -33391,11 +33396,11 @@
    */
   @DomName('Window.toolbar')
   @DocsEditable()
-  BarProp get toolbar => _blink.BlinkWindow.toolbar_Getter(this);
+  BarProp get toolbar => _blink.BlinkWindow.instance.toolbar_Getter_(this);
 
   @DomName('Window.top')
   @DocsEditable()
-  WindowBase get top => _blink.BlinkWindow.top_Getter(this);
+  WindowBase get top => _blink.BlinkWindow.instance.top_Getter_(this);
 
   /**
    * The current window.
@@ -33407,40 +33412,40 @@
    */
   @DomName('Window.window')
   @DocsEditable()
-  WindowBase get window => _blink.BlinkWindow.window_Getter(this);
+  WindowBase get window => _blink.BlinkWindow.instance.window_Getter_(this);
 
   WindowBase __getter__(index_OR_name) {
     if ((index_OR_name is int)) {
-      return _blink.BlinkWindow.$__getter___Callback_1(this, index_OR_name);
+      return _blink.BlinkWindow.instance.$__getter___Callback_1_(this, index_OR_name);
     }
     if ((index_OR_name is String)) {
-      return _blink.BlinkWindow.$__getter___Callback_1(this, index_OR_name);
+      return _blink.BlinkWindow.instance.$__getter___Callback_1_(this, index_OR_name);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
   void alert([String message]) {
     if (message != null) {
-      _blink.BlinkWindow.alert_Callback_1(this, message);
+      _blink.BlinkWindow.instance.alert_Callback_1_(this, message);
       return;
     }
-    _blink.BlinkWindow.alert_Callback(this);
+    _blink.BlinkWindow.instance.alert_Callback_0_(this);
     return;
   }
 
   @DomName('Window.cancelAnimationFrame')
   @DocsEditable()
-  void cancelAnimationFrame(int id) => _blink.BlinkWindow.cancelAnimationFrame_Callback_1(this, id);
+  void cancelAnimationFrame(int id) => _blink.BlinkWindow.instance.cancelAnimationFrame_Callback_1_(this, id);
 
   @DomName('Window.close')
   @DocsEditable()
-  void close() => _blink.BlinkWindow.close_Callback(this);
+  void close() => _blink.BlinkWindow.instance.close_Callback_0_(this);
 
   bool confirm([String message]) {
     if (message != null) {
-      return _blink.BlinkWindow.confirm_Callback_1(this, message);
+      return _blink.BlinkWindow.instance.confirm_Callback_1_(this, message);
     }
-    return _blink.BlinkWindow.confirm_Callback(this);
+    return _blink.BlinkWindow.instance.confirm_Callback_0_(this);
   }
 
   /**
@@ -33454,11 +33459,11 @@
   @DomName('Window.find')
   @DocsEditable()
   @Experimental() // non-standard
-  bool find(String string, bool caseSensitive, bool backwards, bool wrap, bool wholeWord, bool searchInFrames, bool showDialog) => _blink.BlinkWindow.find_Callback_7(this, string, caseSensitive, backwards, wrap, wholeWord, searchInFrames, showDialog);
+  bool find(String string, bool caseSensitive, bool backwards, bool wrap, bool wholeWord, bool searchInFrames, bool showDialog) => _blink.BlinkWindow.instance.find_Callback_7_(this, string, caseSensitive, backwards, wrap, wholeWord, searchInFrames, showDialog);
 
   @DomName('Window.getComputedStyle')
   @DocsEditable()
-  CssStyleDeclaration _getComputedStyle(Element element, String pseudoElement) => _blink.BlinkWindow.getComputedStyle_Callback_2(this, element, pseudoElement);
+  CssStyleDeclaration _getComputedStyle(Element element, String pseudoElement) => _blink.BlinkWindow.instance.getComputedStyle_Callback_2_(this, element, pseudoElement);
 
   /**
    * Returns all CSS rules that apply to the element's pseudo-element.
@@ -33466,7 +33471,7 @@
   @DomName('Window.getMatchedCSSRules')
   @DocsEditable()
   @Experimental() // non-standard
-  List<CssRule> getMatchedCssRules(Element element, String pseudoElement) => _blink.BlinkWindow.getMatchedCSSRules_Callback_2(this, element, pseudoElement);
+  List<CssRule> getMatchedCssRules(Element element, String pseudoElement) => _blink.BlinkWindow.instance.getMatchedCSSRules_Callback_2_(this, element, pseudoElement);
 
   /**
    * Returns the currently selected text.
@@ -33479,7 +33484,7 @@
    */
   @DomName('Window.getSelection')
   @DocsEditable()
-  Selection getSelection() => _blink.BlinkWindow.getSelection_Callback(this);
+  Selection getSelection() => _blink.BlinkWindow.instance.getSelection_Callback_0_(this);
 
   /**
    * Returns a list of media queries for the given query string.
@@ -33494,7 +33499,7 @@
    */
   @DomName('Window.matchMedia')
   @DocsEditable()
-  MediaQueryList matchMedia(String query) => _blink.BlinkWindow.matchMedia_Callback_1(this, query);
+  MediaQueryList matchMedia(String query) => _blink.BlinkWindow.instance.matchMedia_Callback_1_(this, query);
 
   /**
    * Moves this window.
@@ -33510,26 +33515,26 @@
    */
   @DomName('Window.moveBy')
   @DocsEditable()
-  void moveBy(num x, num y) => _blink.BlinkWindow.moveBy_Callback_2(this, x, y);
+  void moveBy(num x, num y) => _blink.BlinkWindow.instance.moveBy_Callback_2_(this, x, y);
 
   @DomName('Window.moveTo')
   @DocsEditable()
-  void _moveTo(num x, num y) => _blink.BlinkWindow.moveTo_Callback_2(this, x, y);
+  void _moveTo(num x, num y) => _blink.BlinkWindow.instance.moveTo_Callback_2_(this, x, y);
 
   @DomName('Window.open')
   @DocsEditable()
-  WindowBase open(String url, String name, [String options]) => _blink.BlinkWindow.open_Callback_3(this, url, name, options);
+  WindowBase open(String url, String name, [String options]) => _blink.BlinkWindow.instance.open_Callback_3_(this, url, name, options);
 
   SqlDatabase openDatabase(String name, String version, String displayName, int estimatedSize, [DatabaseCallback creationCallback]) {
     if (creationCallback != null) {
-      return _blink.BlinkWindow.openDatabase_Callback_5(this, name, version, displayName, estimatedSize, creationCallback);
+      return _blink.BlinkWindow.instance.openDatabase_Callback_5_(this, name, version, displayName, estimatedSize, creationCallback);
     }
-    return _blink.BlinkWindow.openDatabase_Callback_4(this, name, version, displayName, estimatedSize);
+    return _blink.BlinkWindow.instance.openDatabase_Callback_4_(this, name, version, displayName, estimatedSize);
   }
 
   @DomName('Window.postMessage')
   @DocsEditable()
-  void postMessage(/*SerializedScriptValue*/ message, String targetOrigin, [List<MessagePort> transfer]) => _blink.BlinkWindow.postMessage_Callback_3(this, message, targetOrigin, transfer);
+  void postMessage(/*SerializedScriptValue*/ message, String targetOrigin, [List<MessagePort> transfer]) => _blink.BlinkWindow.instance.postMessage_Callback_3_(this, message, targetOrigin, transfer);
 
   /**
    * Opens the print dialog for this window.
@@ -33541,11 +33546,11 @@
    */
   @DomName('Window.print')
   @DocsEditable()
-  void print() => _blink.BlinkWindow.print_Callback(this);
+  void print() => _blink.BlinkWindow.instance.print_Callback_0_(this);
 
   @DomName('Window.requestAnimationFrame')
   @DocsEditable()
-  int _requestAnimationFrame(RequestAnimationFrameCallback callback) => _blink.BlinkWindow.requestAnimationFrame_Callback_1(this, callback);
+  int _requestAnimationFrame(RequestAnimationFrameCallback callback) => _blink.BlinkWindow.instance.requestAnimationFrame_Callback_1_(this, callback);
 
   /**
    * Resizes this window by an offset.
@@ -33557,7 +33562,7 @@
    */
   @DomName('Window.resizeBy')
   @DocsEditable()
-  void resizeBy(num x, num y) => _blink.BlinkWindow.resizeBy_Callback_2(this, x, y);
+  void resizeBy(num x, num y) => _blink.BlinkWindow.instance.resizeBy_Callback_2_(this, x, y);
 
   /**
    * Resizes this window to a specific width and height.
@@ -33569,32 +33574,32 @@
    */
   @DomName('Window.resizeTo')
   @DocsEditable()
-  void resizeTo(num width, num height) => _blink.BlinkWindow.resizeTo_Callback_2(this, width, height);
+  void resizeTo(num width, num height) => _blink.BlinkWindow.instance.resizeTo_Callback_2_(this, width, height);
 
   void scroll(int x, int y, [Map scrollOptions]) {
     if (scrollOptions != null) {
-      _blink.BlinkWindow.scroll_Callback_3(this, x, y, scrollOptions);
+      _blink.BlinkWindow.instance.scroll_Callback_3_(this, x, y, scrollOptions);
       return;
     }
-    _blink.BlinkWindow.scroll_Callback_2(this, x, y);
+    _blink.BlinkWindow.instance.scroll_Callback_2_(this, x, y);
     return;
   }
 
   void scrollBy(int x, int y, [Map scrollOptions]) {
     if (scrollOptions != null) {
-      _blink.BlinkWindow.scrollBy_Callback_3(this, x, y, scrollOptions);
+      _blink.BlinkWindow.instance.scrollBy_Callback_3_(this, x, y, scrollOptions);
       return;
     }
-    _blink.BlinkWindow.scrollBy_Callback_2(this, x, y);
+    _blink.BlinkWindow.instance.scrollBy_Callback_2_(this, x, y);
     return;
   }
 
   void scrollTo(int x, int y, [Map scrollOptions]) {
     if (scrollOptions != null) {
-      _blink.BlinkWindow.scrollTo_Callback_3(this, x, y, scrollOptions);
+      _blink.BlinkWindow.instance.scrollTo_Callback_3_(this, x, y, scrollOptions);
       return;
     }
-    _blink.BlinkWindow.scrollTo_Callback_2(this, x, y);
+    _blink.BlinkWindow.instance.scrollTo_Callback_2_(this, x, y);
     return;
   }
 
@@ -33609,7 +33614,7 @@
    */
   @DomName('Window.showModalDialog')
   @DocsEditable()
-  Object showModalDialog(String url, [Object dialogArgs, String featureArgs]) => _blink.BlinkWindow.showModalDialog_Callback_3(this, url, dialogArgs, featureArgs);
+  Object showModalDialog(String url, [Object dialogArgs, String featureArgs]) => _blink.BlinkWindow.instance.showModalDialog_Callback_3_(this, url, dialogArgs, featureArgs);
 
   /**
    * Stops the window from loading.
@@ -33622,14 +33627,14 @@
    */
   @DomName('Window.stop')
   @DocsEditable()
-  void stop() => _blink.BlinkWindow.stop_Callback(this);
+  void stop() => _blink.BlinkWindow.instance.stop_Callback_0_(this);
 
   void __requestFileSystem(int type, int size, _FileSystemCallback successCallback, [_ErrorCallback errorCallback]) {
     if (errorCallback != null) {
-      _blink.BlinkWindow.webkitRequestFileSystem_Callback_4(this, type, size, successCallback, errorCallback);
+      _blink.BlinkWindow.instance.webkitRequestFileSystem_Callback_4_(this, type, size, successCallback, errorCallback);
       return;
     }
-    _blink.BlinkWindow.webkitRequestFileSystem_Callback_3(this, type, size, successCallback);
+    _blink.BlinkWindow.instance.webkitRequestFileSystem_Callback_3_(this, type, size, successCallback);
     return;
   }
 
@@ -33643,10 +33648,10 @@
 
   void _resolveLocalFileSystemUrl(String url, _EntryCallback successCallback, [_ErrorCallback errorCallback]) {
     if (errorCallback != null) {
-      _blink.BlinkWindow.webkitResolveLocalFileSystemURL_Callback_3(this, url, successCallback, errorCallback);
+      _blink.BlinkWindow.instance.webkitResolveLocalFileSystemURL_Callback_3_(this, url, successCallback, errorCallback);
       return;
     }
-    _blink.BlinkWindow.webkitResolveLocalFileSystemURL_Callback_2(this, url, successCallback);
+    _blink.BlinkWindow.instance.webkitResolveLocalFileSystemURL_Callback_2_(this, url, successCallback);
     return;
   }
 
@@ -33660,27 +33665,27 @@
 
   @DomName('Window.atob')
   @DocsEditable()
-  String atob(String string) => _blink.BlinkWindow.atob_Callback_1(this, string);
+  String atob(String string) => _blink.BlinkWindow.instance.atob_Callback_1_(this, string);
 
   @DomName('Window.btoa')
   @DocsEditable()
-  String btoa(String string) => _blink.BlinkWindow.btoa_Callback_1(this, string);
+  String btoa(String string) => _blink.BlinkWindow.instance.btoa_Callback_1_(this, string);
 
   @DomName('Window.clearInterval')
   @DocsEditable()
-  void _clearInterval(int handle) => _blink.BlinkWindow.clearInterval_Callback_1(this, handle);
+  void _clearInterval(int handle) => _blink.BlinkWindow.instance.clearInterval_Callback_1_(this, handle);
 
   @DomName('Window.clearTimeout')
   @DocsEditable()
-  void _clearTimeout(int handle) => _blink.BlinkWindow.clearTimeout_Callback_1(this, handle);
+  void _clearTimeout(int handle) => _blink.BlinkWindow.instance.clearTimeout_Callback_1_(this, handle);
 
   @DomName('Window.setInterval')
   @DocsEditable()
-  int _setInterval(Object handler, int timeout) => _blink.BlinkWindow.setInterval_Callback_2(this, handler, timeout);
+  int _setInterval(Object handler, int timeout) => _blink.BlinkWindow.instance.setInterval_Callback_2_(this, handler, timeout);
 
   @DomName('Window.setTimeout')
   @DocsEditable()
-  int _setTimeout(Object handler, int timeout) => _blink.BlinkWindow.setTimeout_Callback_2(this, handler, timeout);
+  int _setTimeout(Object handler, int timeout) => _blink.BlinkWindow.instance.setTimeout_Callback_2_(this, handler, timeout);
 
   /// Stream of `contentloaded` events handled by this [Window].
   @DomName('Window.onDOMContentLoaded')
@@ -34131,12 +34136,12 @@
   @DomName('WindowBase64.atob')
   @DocsEditable()
   @Experimental() // untriaged
-  String atob(String string) => _blink.BlinkWindowBase64.atob_Callback_1(this, string);
+  String atob(String string);
 
   @DomName('WindowBase64.btoa')
   @DocsEditable()
   @Experimental() // untriaged
-  String btoa(String string) => _blink.BlinkWindowBase64.btoa_Callback_1(this, string);
+  String btoa(String string);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -34264,7 +34269,7 @@
   @DomName('Worker.Worker')
   @DocsEditable()
   factory Worker(String scriptUrl) {
-    return _blink.BlinkWorker.constructorCallback_1(scriptUrl);
+    return _blink.BlinkWorker.instance.constructorCallback_1_(scriptUrl);
   }
 
   /// Checks if this type is supported on the current platform.
@@ -34272,11 +34277,11 @@
 
   @DomName('Worker.postMessage')
   @DocsEditable()
-  void postMessage(/*SerializedScriptValue*/ message, [List<MessagePort> transfer]) => _blink.BlinkWorker.postMessage_Callback_2(this, message, transfer);
+  void postMessage(/*SerializedScriptValue*/ message, [List<MessagePort> transfer]) => _blink.BlinkWorker.instance.postMessage_Callback_2_(this, message, transfer);
 
   @DomName('Worker.terminate')
   @DocsEditable()
-  void terminate() => _blink.BlinkWorker.terminate_Callback(this);
+  void terminate() => _blink.BlinkWorker.instance.terminate_Callback_0_(this);
 
   /// Stream of `error` events handled by this [Worker].
   @DomName('Worker.onerror')
@@ -34343,72 +34348,72 @@
   @DomName('WorkerGlobalScope.console')
   @DocsEditable()
   @Experimental() // untriaged
-  WorkerConsole get console => _blink.BlinkWorkerGlobalScope.console_Getter(this);
+  WorkerConsole get console => _blink.BlinkWorkerGlobalScope.instance.console_Getter_(this);
 
   @DomName('WorkerGlobalScope.crypto')
   @DocsEditable()
   @Experimental() // untriaged
-  Crypto get crypto => _blink.BlinkWorkerGlobalScope.crypto_Getter(this);
+  Crypto get crypto => _blink.BlinkWorkerGlobalScope.instance.crypto_Getter_(this);
 
   @DomName('WorkerGlobalScope.indexedDB')
   @DocsEditable()
   @Experimental() // untriaged
-  IdbFactory get indexedDB => _blink.BlinkWorkerGlobalScope.indexedDB_Getter(this);
+  IdbFactory get indexedDB => _blink.BlinkWorkerGlobalScope.instance.indexedDB_Getter_(this);
 
   @DomName('WorkerGlobalScope.location')
   @DocsEditable()
   @Experimental() // untriaged
-  _WorkerLocation get location => _blink.BlinkWorkerGlobalScope.location_Getter(this);
+  _WorkerLocation get location => _blink.BlinkWorkerGlobalScope.instance.location_Getter_(this);
 
   @DomName('WorkerGlobalScope.navigator')
   @DocsEditable()
   @Experimental() // untriaged
-  _WorkerNavigator get navigator => _blink.BlinkWorkerGlobalScope.navigator_Getter(this);
+  _WorkerNavigator get navigator => _blink.BlinkWorkerGlobalScope.instance.navigator_Getter_(this);
 
   @DomName('WorkerGlobalScope.performance')
   @DocsEditable()
   @Experimental() // untriaged
-  WorkerPerformance get performance => _blink.BlinkWorkerGlobalScope.performance_Getter(this);
+  WorkerPerformance get performance => _blink.BlinkWorkerGlobalScope.instance.performance_Getter_(this);
 
   @DomName('WorkerGlobalScope.self')
   @DocsEditable()
   @Experimental() // untriaged
-  WorkerGlobalScope get self => _blink.BlinkWorkerGlobalScope.self_Getter(this);
+  WorkerGlobalScope get self => _blink.BlinkWorkerGlobalScope.instance.self_Getter_(this);
 
   @DomName('WorkerGlobalScope.close')
   @DocsEditable()
   @Experimental() // untriaged
-  void close() => _blink.BlinkWorkerGlobalScope.close_Callback(this);
+  void close() => _blink.BlinkWorkerGlobalScope.instance.close_Callback_0_(this);
 
   @DomName('WorkerGlobalScope.importScripts')
   @DocsEditable()
   @Experimental() // untriaged
-  void importScripts(String urls) => _blink.BlinkWorkerGlobalScope.importScripts_Callback_1(this, urls);
+  void importScripts(String urls) => _blink.BlinkWorkerGlobalScope.instance.importScripts_Callback_1_(this, urls);
 
   SqlDatabase openDatabase(String name, String version, String displayName, int estimatedSize, [DatabaseCallback creationCallback]) {
     if (creationCallback != null) {
-      return _blink.BlinkWorkerGlobalScope.openDatabase_Callback_5(this, name, version, displayName, estimatedSize, creationCallback);
+      return _blink.BlinkWorkerGlobalScope.instance.openDatabase_Callback_5_(this, name, version, displayName, estimatedSize, creationCallback);
     }
-    return _blink.BlinkWorkerGlobalScope.openDatabase_Callback_4(this, name, version, displayName, estimatedSize);
+    return _blink.BlinkWorkerGlobalScope.instance.openDatabase_Callback_4_(this, name, version, displayName, estimatedSize);
   }
 
   _DatabaseSync openDatabaseSync(String name, String version, String displayName, int estimatedSize, [DatabaseCallback creationCallback]) {
     if (creationCallback != null) {
-      return _blink.BlinkWorkerGlobalScope.openDatabaseSync_Callback_5(this, name, version, displayName, estimatedSize, creationCallback);
+      return _blink.BlinkWorkerGlobalScope.instance.openDatabaseSync_Callback_5_(this, name, version, displayName, estimatedSize, creationCallback);
     }
-    return _blink.BlinkWorkerGlobalScope.openDatabaseSync_Callback_4(this, name, version, displayName, estimatedSize);
+    return _blink.BlinkWorkerGlobalScope.instance.openDatabaseSync_Callback_4_(this, name, version, displayName, estimatedSize);
   }
 
   void _webkitRequestFileSystem(int type, int size, [_FileSystemCallback successCallback, _ErrorCallback errorCallback]) {
     if (errorCallback != null) {
-      _blink.BlinkWorkerGlobalScope.webkitRequestFileSystem_Callback_4(this, type, size, successCallback, errorCallback);
+      _blink.BlinkWorkerGlobalScope.instance.webkitRequestFileSystem_Callback_4_(this, type, size, successCallback, errorCallback);
       return;
     }
     if (successCallback != null) {
-      _blink.BlinkWorkerGlobalScope.webkitRequestFileSystem_Callback_3(this, type, size, successCallback);
+      _blink.BlinkWorkerGlobalScope.instance.webkitRequestFileSystem_Callback_3_(this, type, size, successCallback);
       return;
     }
-    _blink.BlinkWorkerGlobalScope.webkitRequestFileSystem_Callback_2(this, type, size);
+    _blink.BlinkWorkerGlobalScope.instance.webkitRequestFileSystem_Callback_2_(this, type, size);
     return;
   }
 
@@ -34426,7 +34431,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   @Experimental() // untriaged
-  _DOMFileSystemSync requestFileSystemSync(int type, int size) => _blink.BlinkWorkerGlobalScope.webkitRequestFileSystemSync_Callback_2(this, type, size);
+  _DOMFileSystemSync requestFileSystemSync(int type, int size) => _blink.BlinkWorkerGlobalScope.instance.webkitRequestFileSystemSync_Callback_2_(this, type, size);
 
   @DomName('WorkerGlobalScope.webkitResolveLocalFileSystemSyncURL')
   @DocsEditable()
@@ -34434,14 +34439,14 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   @Experimental() // untriaged
-  _EntrySync resolveLocalFileSystemSyncUrl(String url) => _blink.BlinkWorkerGlobalScope.webkitResolveLocalFileSystemSyncURL_Callback_1(this, url);
+  _EntrySync resolveLocalFileSystemSyncUrl(String url) => _blink.BlinkWorkerGlobalScope.instance.webkitResolveLocalFileSystemSyncURL_Callback_1_(this, url);
 
   void _webkitResolveLocalFileSystemUrl(String url, _EntryCallback successCallback, [_ErrorCallback errorCallback]) {
     if (errorCallback != null) {
-      _blink.BlinkWorkerGlobalScope.webkitResolveLocalFileSystemURL_Callback_3(this, url, successCallback, errorCallback);
+      _blink.BlinkWorkerGlobalScope.instance.webkitResolveLocalFileSystemURL_Callback_3_(this, url, successCallback, errorCallback);
       return;
     }
-    _blink.BlinkWorkerGlobalScope.webkitResolveLocalFileSystemURL_Callback_2(this, url, successCallback);
+    _blink.BlinkWorkerGlobalScope.instance.webkitResolveLocalFileSystemURL_Callback_2_(this, url, successCallback);
     return;
   }
 
@@ -34456,32 +34461,32 @@
   @DomName('WorkerGlobalScope.atob')
   @DocsEditable()
   @Experimental() // untriaged
-  String atob(String string) => _blink.BlinkWorkerGlobalScope.atob_Callback_1(this, string);
+  String atob(String string) => _blink.BlinkWorkerGlobalScope.instance.atob_Callback_1_(this, string);
 
   @DomName('WorkerGlobalScope.btoa')
   @DocsEditable()
   @Experimental() // untriaged
-  String btoa(String string) => _blink.BlinkWorkerGlobalScope.btoa_Callback_1(this, string);
+  String btoa(String string) => _blink.BlinkWorkerGlobalScope.instance.btoa_Callback_1_(this, string);
 
   @DomName('WorkerGlobalScope.clearInterval')
   @DocsEditable()
   @Experimental() // untriaged
-  void _clearInterval(int handle) => _blink.BlinkWorkerGlobalScope.clearInterval_Callback_1(this, handle);
+  void _clearInterval(int handle) => _blink.BlinkWorkerGlobalScope.instance.clearInterval_Callback_1_(this, handle);
 
   @DomName('WorkerGlobalScope.clearTimeout')
   @DocsEditable()
   @Experimental() // untriaged
-  void _clearTimeout(int handle) => _blink.BlinkWorkerGlobalScope.clearTimeout_Callback_1(this, handle);
+  void _clearTimeout(int handle) => _blink.BlinkWorkerGlobalScope.instance.clearTimeout_Callback_1_(this, handle);
 
   @DomName('WorkerGlobalScope.setInterval')
   @DocsEditable()
   @Experimental() // untriaged
-  int _setInterval(Object handler, int timeout) => _blink.BlinkWorkerGlobalScope.setInterval_Callback_2(this, handler, timeout);
+  int _setInterval(Object handler, int timeout) => _blink.BlinkWorkerGlobalScope.instance.setInterval_Callback_2_(this, handler, timeout);
 
   @DomName('WorkerGlobalScope.setTimeout')
   @DocsEditable()
   @Experimental() // untriaged
-  int _setTimeout(Object handler, int timeout) => _blink.BlinkWorkerGlobalScope.setTimeout_Callback_2(this, handler, timeout);
+  int _setTimeout(Object handler, int timeout) => _blink.BlinkWorkerGlobalScope.instance.setTimeout_Callback_2_(this, handler, timeout);
 
   /// Stream of `error` events handled by this [WorkerGlobalScope].
   @DomName('WorkerGlobalScope.onerror')
@@ -34507,12 +34512,12 @@
   @DomName('WorkerPerformance.memory')
   @DocsEditable()
   @Experimental() // untriaged
-  MemoryInfo get memory => _blink.BlinkWorkerPerformance.memory_Getter(this);
+  MemoryInfo get memory => _blink.BlinkWorkerPerformance.instance.memory_Getter_(this);
 
   @DomName('WorkerPerformance.now')
   @DocsEditable()
   @Experimental() // untriaged
-  double now() => _blink.BlinkWorkerPerformance.now_Callback(this);
+  double now() => _blink.BlinkWorkerPerformance.instance.now_Callback_0_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -34533,20 +34538,20 @@
   @DomName('XPathEvaluator.XPathEvaluator')
   @DocsEditable()
   factory XPathEvaluator() {
-    return _blink.BlinkXPathEvaluator.constructorCallback();
+    return _blink.BlinkXPathEvaluator.instance.constructorCallback_0_();
   }
 
   @DomName('XPathEvaluator.createExpression')
   @DocsEditable()
-  XPathExpression createExpression(String expression, XPathNSResolver resolver) => _blink.BlinkXPathEvaluator.createExpression_Callback_2(this, expression, resolver);
+  XPathExpression createExpression(String expression, XPathNSResolver resolver) => _blink.BlinkXPathEvaluator.instance.createExpression_Callback_2_(this, expression, resolver);
 
   @DomName('XPathEvaluator.createNSResolver')
   @DocsEditable()
-  XPathNSResolver createNSResolver(Node nodeResolver) => _blink.BlinkXPathEvaluator.createNSResolver_Callback_1(this, nodeResolver);
+  XPathNSResolver createNSResolver(Node nodeResolver) => _blink.BlinkXPathEvaluator.instance.createNSResolver_Callback_1_(this, nodeResolver);
 
   @DomName('XPathEvaluator.evaluate')
   @DocsEditable()
-  XPathResult evaluate(String expression, Node contextNode, XPathNSResolver resolver, int type, XPathResult inResult) => _blink.BlinkXPathEvaluator.evaluate_Callback_5(this, expression, contextNode, resolver, type, inResult);
+  XPathResult evaluate(String expression, Node contextNode, XPathNSResolver resolver, int type, XPathResult inResult) => _blink.BlinkXPathEvaluator.instance.evaluate_Callback_5_(this, expression, contextNode, resolver, type, inResult);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -34566,7 +34571,7 @@
 
   @DomName('XPathExpression.evaluate')
   @DocsEditable()
-  XPathResult evaluate(Node contextNode, int type, XPathResult inResult) => _blink.BlinkXPathExpression.evaluate_Callback_3(this, contextNode, type, inResult);
+  XPathResult evaluate(Node contextNode, int type, XPathResult inResult) => _blink.BlinkXPathExpression.instance.evaluate_Callback_3_(this, contextNode, type, inResult);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -34586,7 +34591,7 @@
 
   @DomName('XPathNSResolver.lookupNamespaceURI')
   @DocsEditable()
-  String lookupNamespaceUri(String prefix) => _blink.BlinkXPathNSResolver.lookupNamespaceURI_Callback_1(this, prefix);
+  String lookupNamespaceUri(String prefix) => _blink.BlinkXPathNSResolver.instance.lookupNamespaceURI_Callback_1_(this, prefix);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -34646,39 +34651,39 @@
 
   @DomName('XPathResult.booleanValue')
   @DocsEditable()
-  bool get booleanValue => _blink.BlinkXPathResult.booleanValue_Getter(this);
+  bool get booleanValue => _blink.BlinkXPathResult.instance.booleanValue_Getter_(this);
 
   @DomName('XPathResult.invalidIteratorState')
   @DocsEditable()
-  bool get invalidIteratorState => _blink.BlinkXPathResult.invalidIteratorState_Getter(this);
+  bool get invalidIteratorState => _blink.BlinkXPathResult.instance.invalidIteratorState_Getter_(this);
 
   @DomName('XPathResult.numberValue')
   @DocsEditable()
-  double get numberValue => _blink.BlinkXPathResult.numberValue_Getter(this);
+  double get numberValue => _blink.BlinkXPathResult.instance.numberValue_Getter_(this);
 
   @DomName('XPathResult.resultType')
   @DocsEditable()
-  int get resultType => _blink.BlinkXPathResult.resultType_Getter(this);
+  int get resultType => _blink.BlinkXPathResult.instance.resultType_Getter_(this);
 
   @DomName('XPathResult.singleNodeValue')
   @DocsEditable()
-  Node get singleNodeValue => _blink.BlinkXPathResult.singleNodeValue_Getter(this);
+  Node get singleNodeValue => _blink.BlinkXPathResult.instance.singleNodeValue_Getter_(this);
 
   @DomName('XPathResult.snapshotLength')
   @DocsEditable()
-  int get snapshotLength => _blink.BlinkXPathResult.snapshotLength_Getter(this);
+  int get snapshotLength => _blink.BlinkXPathResult.instance.snapshotLength_Getter_(this);
 
   @DomName('XPathResult.stringValue')
   @DocsEditable()
-  String get stringValue => _blink.BlinkXPathResult.stringValue_Getter(this);
+  String get stringValue => _blink.BlinkXPathResult.instance.stringValue_Getter_(this);
 
   @DomName('XPathResult.iterateNext')
   @DocsEditable()
-  Node iterateNext() => _blink.BlinkXPathResult.iterateNext_Callback(this);
+  Node iterateNext() => _blink.BlinkXPathResult.instance.iterateNext_Callback_0_(this);
 
   @DomName('XPathResult.snapshotItem')
   @DocsEditable()
-  Node snapshotItem(int index) => _blink.BlinkXPathResult.snapshotItem_Callback_1(this, index);
+  Node snapshotItem(int index) => _blink.BlinkXPathResult.instance.snapshotItem_Callback_1_(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -34714,12 +34719,12 @@
   @DomName('XMLSerializer.XMLSerializer')
   @DocsEditable()
   factory XmlSerializer() {
-    return _blink.BlinkXMLSerializer.constructorCallback();
+    return _blink.BlinkXMLSerializer.instance.constructorCallback_0_();
   }
 
   @DomName('XMLSerializer.serializeToString')
   @DocsEditable()
-  String serializeToString(Node node) => _blink.BlinkXMLSerializer.serializeToString_Callback_1(this, node);
+  String serializeToString(Node node) => _blink.BlinkXMLSerializer.instance.serializeToString_Callback_1_(this, node);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -34742,7 +34747,7 @@
   @DomName('XSLTProcessor.XSLTProcessor')
   @DocsEditable()
   factory XsltProcessor() {
-    return _blink.BlinkXSLTProcessor.constructorCallback();
+    return _blink.BlinkXSLTProcessor.instance.constructorCallback_0_();
   }
 
   /// Checks if this type is supported on the current platform.
@@ -34750,35 +34755,35 @@
 
   @DomName('XSLTProcessor.clearParameters')
   @DocsEditable()
-  void clearParameters() => _blink.BlinkXSLTProcessor.clearParameters_Callback(this);
+  void clearParameters() => _blink.BlinkXSLTProcessor.instance.clearParameters_Callback_0_(this);
 
   @DomName('XSLTProcessor.getParameter')
   @DocsEditable()
-  String getParameter(String namespaceURI, String localName) => _blink.BlinkXSLTProcessor.getParameter_Callback_2(this, namespaceURI, localName);
+  String getParameter(String namespaceURI, String localName) => _blink.BlinkXSLTProcessor.instance.getParameter_Callback_2_(this, namespaceURI, localName);
 
   @DomName('XSLTProcessor.importStylesheet')
   @DocsEditable()
-  void importStylesheet(Node stylesheet) => _blink.BlinkXSLTProcessor.importStylesheet_Callback_1(this, stylesheet);
+  void importStylesheet(Node stylesheet) => _blink.BlinkXSLTProcessor.instance.importStylesheet_Callback_1_(this, stylesheet);
 
   @DomName('XSLTProcessor.removeParameter')
   @DocsEditable()
-  void removeParameter(String namespaceURI, String localName) => _blink.BlinkXSLTProcessor.removeParameter_Callback_2(this, namespaceURI, localName);
+  void removeParameter(String namespaceURI, String localName) => _blink.BlinkXSLTProcessor.instance.removeParameter_Callback_2_(this, namespaceURI, localName);
 
   @DomName('XSLTProcessor.reset')
   @DocsEditable()
-  void reset() => _blink.BlinkXSLTProcessor.reset_Callback(this);
+  void reset() => _blink.BlinkXSLTProcessor.instance.reset_Callback_0_(this);
 
   @DomName('XSLTProcessor.setParameter')
   @DocsEditable()
-  void setParameter(String namespaceURI, String localName, String value) => _blink.BlinkXSLTProcessor.setParameter_Callback_3(this, namespaceURI, localName, value);
+  void setParameter(String namespaceURI, String localName, String value) => _blink.BlinkXSLTProcessor.instance.setParameter_Callback_3_(this, namespaceURI, localName, value);
 
   @DomName('XSLTProcessor.transformToDocument')
   @DocsEditable()
-  Document transformToDocument(Node source) => _blink.BlinkXSLTProcessor.transformToDocument_Callback_1(this, source);
+  Document transformToDocument(Node source) => _blink.BlinkXSLTProcessor.instance.transformToDocument_Callback_1_(this, source);
 
   @DomName('XSLTProcessor.transformToFragment')
   @DocsEditable()
-  DocumentFragment transformToFragment(Node source, Document docVal) => _blink.BlinkXSLTProcessor.transformToFragment_Callback_2(this, source, docVal);
+  DocumentFragment transformToFragment(Node source, Document docVal) => _blink.BlinkXSLTProcessor.instance.transformToFragment_Callback_2_(this, source, docVal);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -34797,39 +34802,39 @@
   @DomName('Attr.localName')
   @DocsEditable()
   @Experimental() // untriaged
-  String get _localName => _blink.BlinkAttr.localName_Getter(this);
+  String get _localName => _blink.BlinkAttr.instance.localName_Getter_(this);
 
   @DomName('Attr.name')
   @DocsEditable()
-  String get name => _blink.BlinkAttr.name_Getter(this);
+  String get name => _blink.BlinkAttr.instance.name_Getter_(this);
 
   @DomName('Attr.namespaceURI')
   @DocsEditable()
   @Experimental() // untriaged
-  String get _namespaceUri => _blink.BlinkAttr.namespaceURI_Getter(this);
+  String get _namespaceUri => _blink.BlinkAttr.instance.namespaceURI_Getter_(this);
 
   @DomName('Attr.nodeValue')
   @DocsEditable()
   @Experimental() // untriaged
-  String get nodeValue => _blink.BlinkAttr.nodeValue_Getter(this);
+  String get nodeValue => _blink.BlinkAttr.instance.nodeValue_Getter_(this);
 
   @DomName('Attr.textContent')
   @DocsEditable()
   @Experimental() // untriaged
-  String get text => _blink.BlinkAttr.textContent_Getter(this);
+  String get text => _blink.BlinkAttr.instance.textContent_Getter_(this);
 
   @DomName('Attr.textContent')
   @DocsEditable()
   @Experimental() // untriaged
-  void set text(String value) => _blink.BlinkAttr.textContent_Setter(this, value);
+  void set text(String value) => _blink.BlinkAttr.instance.textContent_Setter_(this, value);
 
   @DomName('Attr.value')
   @DocsEditable()
-  String get value => _blink.BlinkAttr.value_Getter(this);
+  String get value => _blink.BlinkAttr.instance.value_Getter_(this);
 
   @DomName('Attr.value')
   @DocsEditable()
-  void set value(String value) => _blink.BlinkAttr.value_Setter(this, value);
+  void set value(String value) => _blink.BlinkAttr.instance.value_Setter_(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -35013,27 +35018,27 @@
 
   @DomName('ClientRect.bottom')
   @DocsEditable()
-  double get bottom => _blink.BlinkClientRect.bottom_Getter(this);
+  double get bottom => _blink.BlinkClientRect.instance.bottom_Getter_(this);
 
   @DomName('ClientRect.height')
   @DocsEditable()
-  double get height => _blink.BlinkClientRect.height_Getter(this);
+  double get height => _blink.BlinkClientRect.instance.height_Getter_(this);
 
   @DomName('ClientRect.left')
   @DocsEditable()
-  double get left => _blink.BlinkClientRect.left_Getter(this);
+  double get left => _blink.BlinkClientRect.instance.left_Getter_(this);
 
   @DomName('ClientRect.right')
   @DocsEditable()
-  double get right => _blink.BlinkClientRect.right_Getter(this);
+  double get right => _blink.BlinkClientRect.instance.right_Getter_(this);
 
   @DomName('ClientRect.top')
   @DocsEditable()
-  double get top => _blink.BlinkClientRect.top_Getter(this);
+  double get top => _blink.BlinkClientRect.instance.top_Getter_(this);
 
   @DomName('ClientRect.width')
   @DocsEditable()
-  double get width => _blink.BlinkClientRect.width_Getter(this);
+  double get width => _blink.BlinkClientRect.instance.width_Getter_(this);
 }
 
 /**
@@ -35087,15 +35092,15 @@
 
   @DomName('ClientRectList.length')
   @DocsEditable()
-  int get length => _blink.BlinkClientRectList.length_Getter(this);
+  int get length => _blink.BlinkClientRectList.instance.length_Getter_(this);
 
   Rectangle operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _blink.BlinkClientRectList.item_Callback_1(this, index);
+    return _blink.BlinkClientRectList.instance.item_Callback_1_(this, index);
   }
 
-  Rectangle _nativeIndexedGetter(int index) => _blink.BlinkClientRectList.item_Callback_1(this, index);
+  Rectangle _nativeIndexedGetter(int index) => _blink.BlinkClientRectList.instance.item_Callback_1_(this, index);
 
   void operator[]=(int index, Rectangle value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -35137,7 +35142,7 @@
 
   @DomName('ClientRectList.item')
   @DocsEditable()
-  Rectangle item(int index) => _blink.BlinkClientRectList.item_Callback_1(this, index);
+  Rectangle item(int index) => _blink.BlinkClientRectList.instance.item_Callback_1_(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -35171,15 +35176,15 @@
 
   @DomName('CSSRuleList.length')
   @DocsEditable()
-  int get length => _blink.BlinkCSSRuleList.length_Getter(this);
+  int get length => _blink.BlinkCSSRuleList.instance.length_Getter_(this);
 
   CssRule operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _blink.BlinkCSSRuleList.item_Callback_1(this, index);
+    return _blink.BlinkCSSRuleList.instance.item_Callback_1_(this, index);
   }
 
-  CssRule _nativeIndexedGetter(int index) => _blink.BlinkCSSRuleList.item_Callback_1(this, index);
+  CssRule _nativeIndexedGetter(int index) => _blink.BlinkCSSRuleList.instance.item_Callback_1_(this, index);
 
   void operator[]=(int index, CssRule value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -35221,7 +35226,7 @@
 
   @DomName('CSSRuleList.item')
   @DocsEditable()
-  CssRule item(int index) => _blink.BlinkCSSRuleList.item_Callback_1(this, index);
+  CssRule item(int index) => _blink.BlinkCSSRuleList.instance.item_Callback_1_(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -35241,15 +35246,15 @@
 
   @DomName('CSSValueList.length')
   @DocsEditable()
-  int get length => _blink.BlinkCSSValueList.length_Getter(this);
+  int get length => _blink.BlinkCSSValueList.instance.length_Getter_(this);
 
   _CSSValue operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _blink.BlinkCSSValueList.item_Callback_1(this, index);
+    return _blink.BlinkCSSValueList.instance.item_Callback_1_(this, index);
   }
 
-  _CSSValue _nativeIndexedGetter(int index) => _blink.BlinkCSSValueList.item_Callback_1(this, index);
+  _CSSValue _nativeIndexedGetter(int index) => _blink.BlinkCSSValueList.instance.item_Callback_1_(this, index);
 
   void operator[]=(int index, _CSSValue value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -35291,7 +35296,7 @@
 
   @DomName('CSSValueList.item')
   @DocsEditable()
-  _CSSValue item(int index) => _blink.BlinkCSSValueList.item_Callback_1(this, index);
+  _CSSValue item(int index) => _blink.BlinkCSSValueList.instance.item_Callback_1_(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -35401,26 +35406,26 @@
   factory _DomPoint(num x, num y) => _create(x, y);
 
   @DocsEditable()
-  static _DomPoint _create(x, y) => _blink.BlinkWebKitPoint.constructorCallback_2(x, y);
+  static _DomPoint _create(x, y) => _blink.BlinkWebKitPoint.instance.constructorCallback_2_(x, y);
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
 
   @DomName('WebKitPoint.x')
   @DocsEditable()
-  num get x => _blink.BlinkWebKitPoint.x_Getter(this);
+  num get x => _blink.BlinkWebKitPoint.instance.x_Getter_(this);
 
   @DomName('WebKitPoint.x')
   @DocsEditable()
-  void set x(num value) => _blink.BlinkWebKitPoint.x_Setter(this, value);
+  void set x(num value) => _blink.BlinkWebKitPoint.instance.x_Setter_(this, value);
 
   @DomName('WebKitPoint.y')
   @DocsEditable()
-  num get y => _blink.BlinkWebKitPoint.y_Getter(this);
+  num get y => _blink.BlinkWebKitPoint.instance.y_Getter_(this);
 
   @DomName('WebKitPoint.y')
   @DocsEditable()
-  void set y(num value) => _blink.BlinkWebKitPoint.y_Setter(this, value);
+  void set y(num value) => _blink.BlinkWebKitPoint.instance.y_Setter_(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -35441,59 +35446,59 @@
   @DocsEditable()
   factory _DomRect([num x, num y, num width, num height]) {
     if (height != null) {
-      return _blink.BlinkDOMRect.constructorCallback_4(x, y, width, height);
+      return _blink.BlinkDOMRect.instance.constructorCallback_4_(x, y, width, height);
     }
     if (width != null) {
-      return _blink.BlinkDOMRect.constructorCallback_3(x, y, width);
+      return _blink.BlinkDOMRect.instance.constructorCallback_3_(x, y, width);
     }
     if (y != null) {
-      return _blink.BlinkDOMRect.constructorCallback_2(x, y);
+      return _blink.BlinkDOMRect.instance.constructorCallback_2_(x, y);
     }
     if (x != null) {
-      return _blink.BlinkDOMRect.constructorCallback_1(x);
+      return _blink.BlinkDOMRect.instance.constructorCallback_1_(x);
     }
-    return _blink.BlinkDOMRect.constructorCallback();
+    return _blink.BlinkDOMRect.instance.constructorCallback_0_();
   }
 
   @DomName('DOMRect.height')
   @DocsEditable()
   @Experimental() // untriaged
-  num get height => _blink.BlinkDOMRect.height_Getter(this);
+  num get height => _blink.BlinkDOMRect.instance.height_Getter_(this);
 
   @DomName('DOMRect.height')
   @DocsEditable()
   @Experimental() // untriaged
-  void set height(num value) => _blink.BlinkDOMRect.height_Setter(this, value);
+  void set height(num value) => _blink.BlinkDOMRect.instance.height_Setter_(this, value);
 
   @DomName('DOMRect.width')
   @DocsEditable()
   @Experimental() // untriaged
-  num get width => _blink.BlinkDOMRect.width_Getter(this);
+  num get width => _blink.BlinkDOMRect.instance.width_Getter_(this);
 
   @DomName('DOMRect.width')
   @DocsEditable()
   @Experimental() // untriaged
-  void set width(num value) => _blink.BlinkDOMRect.width_Setter(this, value);
+  void set width(num value) => _blink.BlinkDOMRect.instance.width_Setter_(this, value);
 
   @DomName('DOMRect.x')
   @DocsEditable()
   @Experimental() // untriaged
-  num get x => _blink.BlinkDOMRect.x_Getter(this);
+  num get x => _blink.BlinkDOMRect.instance.x_Getter_(this);
 
   @DomName('DOMRect.x')
   @DocsEditable()
   @Experimental() // untriaged
-  void set x(num value) => _blink.BlinkDOMRect.x_Setter(this, value);
+  void set x(num value) => _blink.BlinkDOMRect.instance.x_Setter_(this, value);
 
   @DomName('DOMRect.y')
   @DocsEditable()
   @Experimental() // untriaged
-  num get y => _blink.BlinkDOMRect.y_Getter(this);
+  num get y => _blink.BlinkDOMRect.instance.y_Getter_(this);
 
   @DomName('DOMRect.y')
   @DocsEditable()
   @Experimental() // untriaged
-  void set y(num value) => _blink.BlinkDOMRect.y_Setter(this, value);
+  void set y(num value) => _blink.BlinkDOMRect.instance.y_Setter_(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -35546,7 +35551,7 @@
   @DomName('FileReaderSync.FileReaderSync')
   @DocsEditable()
   factory _FileReaderSync() {
-    return _blink.BlinkFileReaderSync.constructorCallback();
+    return _blink.BlinkFileReaderSync.instance.constructorCallback_0_();
   }
 
 }
@@ -35583,15 +35588,15 @@
 
   @DomName('GamepadList.length')
   @DocsEditable()
-  int get length => _blink.BlinkGamepadList.length_Getter(this);
+  int get length => _blink.BlinkGamepadList.instance.length_Getter_(this);
 
   Gamepad operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _blink.BlinkGamepadList.item_Callback_1(this, index);
+    return _blink.BlinkGamepadList.instance.item_Callback_1_(this, index);
   }
 
-  Gamepad _nativeIndexedGetter(int index) => _blink.BlinkGamepadList.item_Callback_1(this, index);
+  Gamepad _nativeIndexedGetter(int index) => _blink.BlinkGamepadList.instance.item_Callback_1_(this, index);
 
   void operator[]=(int index, Gamepad value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -35633,7 +35638,7 @@
 
   @DomName('GamepadList.item')
   @DocsEditable()
-  Gamepad item(int index) => _blink.BlinkGamepadList.item_Callback_1(this, index);
+  Gamepad item(int index) => _blink.BlinkGamepadList.instance.item_Callback_1_(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -35653,7 +35658,7 @@
 
   @DomName('HTMLAllCollection.item')
   @DocsEditable()
-  Element _item(int index) => _blink.BlinkHTMLAllCollection.item_Callback_1(this, index);
+  Element _item(int index) => _blink.BlinkHTMLAllCollection.instance.item_Callback_1_(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -35827,15 +35832,15 @@
 
   @DomName('NamedNodeMap.length')
   @DocsEditable()
-  int get length => _blink.BlinkNamedNodeMap.length_Getter(this);
+  int get length => _blink.BlinkNamedNodeMap.instance.length_Getter_(this);
 
   Node operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _blink.BlinkNamedNodeMap.item_Callback_1(this, index);
+    return _blink.BlinkNamedNodeMap.instance.item_Callback_1_(this, index);
   }
 
-  Node _nativeIndexedGetter(int index) => _blink.BlinkNamedNodeMap.item_Callback_1(this, index);
+  Node _nativeIndexedGetter(int index) => _blink.BlinkNamedNodeMap.instance.item_Callback_1_(this, index);
 
   void operator[]=(int index, Node value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -35877,35 +35882,35 @@
 
   @DomName('NamedNodeMap.__getter__')
   @DocsEditable()
-  Node __getter__(String name) => _blink.BlinkNamedNodeMap.$__getter___Callback_1(this, name);
+  Node __getter__(String name) => _blink.BlinkNamedNodeMap.instance.$__getter___Callback_1_(this, name);
 
   @DomName('NamedNodeMap.getNamedItem')
   @DocsEditable()
-  Node getNamedItem(String name) => _blink.BlinkNamedNodeMap.getNamedItem_Callback_1(this, name);
+  Node getNamedItem(String name) => _blink.BlinkNamedNodeMap.instance.getNamedItem_Callback_1_(this, name);
 
   @DomName('NamedNodeMap.getNamedItemNS')
   @DocsEditable()
-  Node getNamedItemNS(String namespaceURI, String localName) => _blink.BlinkNamedNodeMap.getNamedItemNS_Callback_2(this, namespaceURI, localName);
+  Node getNamedItemNS(String namespaceURI, String localName) => _blink.BlinkNamedNodeMap.instance.getNamedItemNS_Callback_2_(this, namespaceURI, localName);
 
   @DomName('NamedNodeMap.item')
   @DocsEditable()
-  Node item(int index) => _blink.BlinkNamedNodeMap.item_Callback_1(this, index);
+  Node item(int index) => _blink.BlinkNamedNodeMap.instance.item_Callback_1_(this, index);
 
   @DomName('NamedNodeMap.removeNamedItem')
   @DocsEditable()
-  Node removeNamedItem(String name) => _blink.BlinkNamedNodeMap.removeNamedItem_Callback_1(this, name);
+  Node removeNamedItem(String name) => _blink.BlinkNamedNodeMap.instance.removeNamedItem_Callback_1_(this, name);
 
   @DomName('NamedNodeMap.removeNamedItemNS')
   @DocsEditable()
-  Node removeNamedItemNS(String namespaceURI, String localName) => _blink.BlinkNamedNodeMap.removeNamedItemNS_Callback_2(this, namespaceURI, localName);
+  Node removeNamedItemNS(String namespaceURI, String localName) => _blink.BlinkNamedNodeMap.instance.removeNamedItemNS_Callback_2_(this, namespaceURI, localName);
 
   @DomName('NamedNodeMap.setNamedItem')
   @DocsEditable()
-  Node setNamedItem(Node node) => _blink.BlinkNamedNodeMap.setNamedItem_Callback_1(this, node);
+  Node setNamedItem(Node node) => _blink.BlinkNamedNodeMap.instance.setNamedItem_Callback_1_(this, node);
 
   @DomName('NamedNodeMap.setNamedItemNS')
   @DocsEditable()
-  Node setNamedItemNS(Node node) => _blink.BlinkNamedNodeMap.setNamedItemNS_Callback_1(this, node);
+  Node setNamedItemNS(Node node) => _blink.BlinkNamedNodeMap.instance.setNamedItemNS_Callback_1_(this, node);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -36000,16 +36005,16 @@
   @DocsEditable()
   factory _Request(input, [Map requestInitDict]) {
     if ((input is String || input == null) && requestInitDict == null) {
-      return _blink.BlinkRequest.constructorCallback_1(input);
+      return _blink.BlinkRequest.instance.constructorCallback_1_(input);
     }
     if ((requestInitDict is Map || requestInitDict == null) && (input is String || input == null)) {
-      return _blink.BlinkRequest.constructorCallback_2(input, requestInitDict);
+      return _blink.BlinkRequest.instance.constructorCallback_2_(input, requestInitDict);
     }
     if ((input is _Request || input == null) && requestInitDict == null) {
-      return _blink.BlinkRequest.constructorCallback_1(input);
+      return _blink.BlinkRequest.instance.constructorCallback_1_(input);
     }
     if ((requestInitDict is Map || requestInitDict == null) && (input is _Request || input == null)) {
-      return _blink.BlinkRequest.constructorCallback_2(input, requestInitDict);
+      return _blink.BlinkRequest.instance.constructorCallback_2_(input, requestInitDict);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
@@ -36017,27 +36022,27 @@
   @DomName('Request.credentials')
   @DocsEditable()
   @Experimental() // untriaged
-  String get credentials => _blink.BlinkRequest.credentials_Getter(this);
+  String get credentials => _blink.BlinkRequest.instance.credentials_Getter_(this);
 
   @DomName('Request.headers')
   @DocsEditable()
   @Experimental() // untriaged
-  Headers get headers => _blink.BlinkRequest.headers_Getter(this);
+  Headers get headers => _blink.BlinkRequest.instance.headers_Getter_(this);
 
   @DomName('Request.mode')
   @DocsEditable()
   @Experimental() // untriaged
-  String get mode => _blink.BlinkRequest.mode_Getter(this);
+  String get mode => _blink.BlinkRequest.instance.mode_Getter_(this);
 
   @DomName('Request.referrer')
   @DocsEditable()
   @Experimental() // untriaged
-  String get referrer => _blink.BlinkRequest.referrer_Getter(this);
+  String get referrer => _blink.BlinkRequest.instance.referrer_Getter_(this);
 
   @DomName('Request.url')
   @DocsEditable()
   @Experimental() // untriaged
-  String get url => _blink.BlinkRequest.url_Getter(this);
+  String get url => _blink.BlinkRequest.instance.url_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -36058,16 +36063,16 @@
   @DocsEditable()
   factory _Response(body, [Map responseInitDict]) {
     if ((body is String || body == null) && responseInitDict == null) {
-      return _blink.BlinkResponse.constructorCallback_1(body);
+      return _blink.BlinkResponse.instance.constructorCallback_1_(body);
     }
     if ((responseInitDict is Map || responseInitDict == null) && (body is String || body == null)) {
-      return _blink.BlinkResponse.constructorCallback_2(body, responseInitDict);
+      return _blink.BlinkResponse.instance.constructorCallback_2_(body, responseInitDict);
     }
     if ((body is Blob || body == null) && responseInitDict == null) {
-      return _blink.BlinkResponse.constructorCallback_1(body);
+      return _blink.BlinkResponse.instance.constructorCallback_1_(body);
     }
     if ((responseInitDict is Map || responseInitDict == null) && (body is Blob || body == null)) {
-      return _blink.BlinkResponse.constructorCallback_2(body, responseInitDict);
+      return _blink.BlinkResponse.instance.constructorCallback_2_(body, responseInitDict);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
@@ -36105,15 +36110,15 @@
 
   @DomName('SpeechRecognitionResultList.length')
   @DocsEditable()
-  int get length => _blink.BlinkSpeechRecognitionResultList.length_Getter(this);
+  int get length => _blink.BlinkSpeechRecognitionResultList.instance.length_Getter_(this);
 
   SpeechRecognitionResult operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _blink.BlinkSpeechRecognitionResultList.item_Callback_1(this, index);
+    return _blink.BlinkSpeechRecognitionResultList.instance.item_Callback_1_(this, index);
   }
 
-  SpeechRecognitionResult _nativeIndexedGetter(int index) => _blink.BlinkSpeechRecognitionResultList.item_Callback_1(this, index);
+  SpeechRecognitionResult _nativeIndexedGetter(int index) => _blink.BlinkSpeechRecognitionResultList.instance.item_Callback_1_(this, index);
 
   void operator[]=(int index, SpeechRecognitionResult value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -36155,7 +36160,7 @@
 
   @DomName('SpeechRecognitionResultList.item')
   @DocsEditable()
-  SpeechRecognitionResult item(int index) => _blink.BlinkSpeechRecognitionResultList.item_Callback_1(this, index);
+  SpeechRecognitionResult item(int index) => _blink.BlinkSpeechRecognitionResultList.instance.item_Callback_1_(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -36173,15 +36178,15 @@
 
   @DomName('StyleSheetList.length')
   @DocsEditable()
-  int get length => _blink.BlinkStyleSheetList.length_Getter(this);
+  int get length => _blink.BlinkStyleSheetList.instance.length_Getter_(this);
 
   StyleSheet operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _blink.BlinkStyleSheetList.item_Callback_1(this, index);
+    return _blink.BlinkStyleSheetList.instance.item_Callback_1_(this, index);
   }
 
-  StyleSheet _nativeIndexedGetter(int index) => _blink.BlinkStyleSheetList.item_Callback_1(this, index);
+  StyleSheet _nativeIndexedGetter(int index) => _blink.BlinkStyleSheetList.instance.item_Callback_1_(this, index);
 
   void operator[]=(int index, StyleSheet value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -36223,11 +36228,11 @@
 
   @DomName('StyleSheetList.__getter__')
   @DocsEditable()
-  CssStyleSheet __getter__(String name) => _blink.BlinkStyleSheetList.$__getter___Callback_1(this, name);
+  CssStyleSheet __getter__(String name) => _blink.BlinkStyleSheetList.instance.$__getter___Callback_1_(this, name);
 
   @DomName('StyleSheetList.item')
   @DocsEditable()
-  StyleSheet item(int index) => _blink.BlinkStyleSheetList.item_Callback_1(this, index);
+  StyleSheet item(int index) => _blink.BlinkStyleSheetList.instance.item_Callback_1_(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -36282,7 +36287,7 @@
   @DomName('WebKitCSSMatrix.WebKitCSSMatrix')
   @DocsEditable()
   factory _WebKitCSSMatrix([String cssValue]) {
-    return _blink.BlinkWebKitCSSMatrix.constructorCallback_1(cssValue);
+    return _blink.BlinkWebKitCSSMatrix.instance.constructorCallback_1_(cssValue);
   }
 
 }
@@ -36319,22 +36324,22 @@
   @DomName('WindowTimers.clearInterval')
   @DocsEditable()
   @Experimental() // untriaged
-  void _clearInterval(int handle) => _blink.BlinkWindowTimers.clearInterval_Callback_1(this, handle);
+  void _clearInterval(int handle);
 
   @DomName('WindowTimers.clearTimeout')
   @DocsEditable()
   @Experimental() // untriaged
-  void _clearTimeout(int handle) => _blink.BlinkWindowTimers.clearTimeout_Callback_1(this, handle);
+  void _clearTimeout(int handle);
 
   @DomName('WindowTimers.setInterval')
   @DocsEditable()
   @Experimental() // untriaged
-  int _setInterval(Object handler, int timeout) => _blink.BlinkWindowTimers.setInterval_Callback_2(this, handler, timeout);
+  int _setInterval(Object handler, int timeout);
 
   @DomName('WindowTimers.setTimeout')
   @DocsEditable()
   @Experimental() // untriaged
-  int _setTimeout(Object handler, int timeout) => _blink.BlinkWindowTimers.setTimeout_Callback_2(this, handler, timeout);
+  int _setTimeout(Object handler, int timeout);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -36364,7 +36369,7 @@
 @DomName('WorkerNavigator')
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/workers.html#workernavigator
 @Experimental()
-abstract class _WorkerNavigator extends NavigatorCpu implements NavigatorOnLine, NavigatorID {
+abstract class _WorkerNavigator extends NativeFieldWrapperClass2 implements NavigatorCpu, NavigatorOnLine, NavigatorID {
   // To suppress missing implicit constructor warnings.
   factory _WorkerNavigator._() { throw new UnsupportedError("Not supported"); }
 
diff --git a/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart b/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart
index 2360ca5..5fe0383 100644
--- a/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart
+++ b/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart
@@ -80,45 +80,45 @@
 
   @DomName('IDBCursor.direction')
   @DocsEditable()
-  String get direction => _blink.BlinkIDBCursor.direction_Getter(this);
+  String get direction => _blink.BlinkIDBCursor.instance.direction_Getter_(this);
 
   @DomName('IDBCursor.key')
   @DocsEditable()
-  Object get key => _blink.BlinkIDBCursor.key_Getter(this);
+  Object get key => _blink.BlinkIDBCursor.instance.key_Getter_(this);
 
   @DomName('IDBCursor.primaryKey')
   @DocsEditable()
-  Object get primaryKey => _blink.BlinkIDBCursor.primaryKey_Getter(this);
+  Object get primaryKey => _blink.BlinkIDBCursor.instance.primaryKey_Getter_(this);
 
   @DomName('IDBCursor.source')
   @DocsEditable()
-  Object get source => _blink.BlinkIDBCursor.source_Getter(this);
+  Object get source => _blink.BlinkIDBCursor.instance.source_Getter_(this);
 
   @DomName('IDBCursor.advance')
   @DocsEditable()
-  void advance(int count) => _blink.BlinkIDBCursor.advance_Callback_1(this, count);
+  void advance(int count) => _blink.BlinkIDBCursor.instance.advance_Callback_1_(this, count);
 
   @DomName('IDBCursor.continuePrimaryKey')
   @DocsEditable()
   @Experimental() // untriaged
-  void continuePrimaryKey(Object key, Object primaryKey) => _blink.BlinkIDBCursor.continuePrimaryKey_Callback_2(this, key, primaryKey);
+  void continuePrimaryKey(Object key, Object primaryKey) => _blink.BlinkIDBCursor.instance.continuePrimaryKey_Callback_2_(this, key, primaryKey);
 
   @DomName('IDBCursor.delete')
   @DocsEditable()
-  Request _delete() => _blink.BlinkIDBCursor.delete_Callback(this);
+  Request _delete() => _blink.BlinkIDBCursor.instance.delete_Callback_0_(this);
 
   void next([Object key]) {
     if (key != null) {
-      _blink.BlinkIDBCursor.continue_Callback_1(this, key);
+      _blink.BlinkIDBCursor.instance.continue_Callback_1_(this, key);
       return;
     }
-    _blink.BlinkIDBCursor.continue_Callback(this);
+    _blink.BlinkIDBCursor.instance.continue_Callback_0_(this);
     return;
   }
 
   @DomName('IDBCursor.update')
   @DocsEditable()
-  Request _update(Object value) => _blink.BlinkIDBCursor.update_Callback_1(this, value);
+  Request _update(Object value) => _blink.BlinkIDBCursor.instance.update_Callback_1_(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -137,7 +137,7 @@
 
   @DomName('IDBCursorWithValue.value')
   @DocsEditable()
-  Object get value => _blink.BlinkIDBCursorWithValue.value_Getter(this);
+  Object get value => _blink.BlinkIDBCursorWithValue.instance.value_Getter_(this);
 
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -220,72 +220,72 @@
 
   @DomName('IDBDatabase.name')
   @DocsEditable()
-  String get name => _blink.BlinkIDBDatabase.name_Getter(this);
+  String get name => _blink.BlinkIDBDatabase.instance.name_Getter_(this);
 
   @DomName('IDBDatabase.objectStoreNames')
   @DocsEditable()
-  List<String> get objectStoreNames => _blink.BlinkIDBDatabase.objectStoreNames_Getter(this);
+  List<String> get objectStoreNames => _blink.BlinkIDBDatabase.instance.objectStoreNames_Getter_(this);
 
   @DomName('IDBDatabase.version')
   @DocsEditable()
-  Object get version => _blink.BlinkIDBDatabase.version_Getter(this);
+  Object get version => _blink.BlinkIDBDatabase.instance.version_Getter_(this);
 
   @DomName('IDBDatabase.close')
   @DocsEditable()
-  void close() => _blink.BlinkIDBDatabase.close_Callback(this);
+  void close() => _blink.BlinkIDBDatabase.instance.close_Callback_0_(this);
 
   ObjectStore _createObjectStore(String name, [Map options]) {
     if (options != null) {
-      return _blink.BlinkIDBDatabase.createObjectStore_Callback_2(this, name, options);
+      return _blink.BlinkIDBDatabase.instance.createObjectStore_Callback_2_(this, name, options);
     }
-    return _blink.BlinkIDBDatabase.createObjectStore_Callback_1(this, name);
+    return _blink.BlinkIDBDatabase.instance.createObjectStore_Callback_1_(this, name);
   }
 
   @DomName('IDBDatabase.deleteObjectStore')
   @DocsEditable()
-  void deleteObjectStore(String name) => _blink.BlinkIDBDatabase.deleteObjectStore_Callback_1(this, name);
+  void deleteObjectStore(String name) => _blink.BlinkIDBDatabase.instance.deleteObjectStore_Callback_1_(this, name);
 
   Transaction transaction(storeName_OR_storeNames, [String mode]) {
     if ((storeName_OR_storeNames is String || storeName_OR_storeNames == null) && mode == null) {
-      return _blink.BlinkIDBDatabase.transaction_Callback_1(this, storeName_OR_storeNames);
+      return _blink.BlinkIDBDatabase.instance.transaction_Callback_1_(this, storeName_OR_storeNames);
     }
     if ((mode is String || mode == null) && (storeName_OR_storeNames is String || storeName_OR_storeNames == null)) {
-      return _blink.BlinkIDBDatabase.transaction_Callback_2(this, storeName_OR_storeNames, mode);
+      return _blink.BlinkIDBDatabase.instance.transaction_Callback_2_(this, storeName_OR_storeNames, mode);
     }
     if ((storeName_OR_storeNames is List<String> || storeName_OR_storeNames == null) && mode == null) {
-      return _blink.BlinkIDBDatabase.transaction_Callback_1(this, storeName_OR_storeNames);
+      return _blink.BlinkIDBDatabase.instance.transaction_Callback_1_(this, storeName_OR_storeNames);
     }
     if ((mode is String || mode == null) && (storeName_OR_storeNames is List<String> || storeName_OR_storeNames == null)) {
-      return _blink.BlinkIDBDatabase.transaction_Callback_2(this, storeName_OR_storeNames, mode);
+      return _blink.BlinkIDBDatabase.instance.transaction_Callback_2_(this, storeName_OR_storeNames, mode);
     }
     if ((storeName_OR_storeNames is DomStringList || storeName_OR_storeNames == null) && mode == null) {
-      return _blink.BlinkIDBDatabase.transaction_Callback_1(this, storeName_OR_storeNames);
+      return _blink.BlinkIDBDatabase.instance.transaction_Callback_1_(this, storeName_OR_storeNames);
     }
     if ((mode is String || mode == null) && (storeName_OR_storeNames is DomStringList || storeName_OR_storeNames == null)) {
-      return _blink.BlinkIDBDatabase.transaction_Callback_2(this, storeName_OR_storeNames, mode);
+      return _blink.BlinkIDBDatabase.instance.transaction_Callback_2_(this, storeName_OR_storeNames, mode);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
   Transaction transactionList(List<String> storeNames, [String mode]) {
     if (mode != null) {
-      return _blink.BlinkIDBDatabase.transaction_Callback_2(this, storeNames, mode);
+      return _blink.BlinkIDBDatabase.instance.transaction_Callback_2_(this, storeNames, mode);
     }
-    return _blink.BlinkIDBDatabase.transaction_Callback_1(this, storeNames);
+    return _blink.BlinkIDBDatabase.instance.transaction_Callback_1_(this, storeNames);
   }
 
   Transaction transactionStore(String storeName, [String mode]) {
     if (mode != null) {
-      return _blink.BlinkIDBDatabase.transaction_Callback_2(this, storeName, mode);
+      return _blink.BlinkIDBDatabase.instance.transaction_Callback_2_(this, storeName, mode);
     }
-    return _blink.BlinkIDBDatabase.transaction_Callback_1(this, storeName);
+    return _blink.BlinkIDBDatabase.instance.transaction_Callback_1_(this, storeName);
   }
 
   Transaction transactionStores(List<String> storeNames, [String mode]) {
     if (mode != null) {
-      return _blink.BlinkIDBDatabase.transaction_Callback_2(this, storeNames, mode);
+      return _blink.BlinkIDBDatabase.instance.transaction_Callback_2_(this, storeNames, mode);
     }
-    return _blink.BlinkIDBDatabase.transaction_Callback_1(this, storeNames);
+    return _blink.BlinkIDBDatabase.instance.transaction_Callback_1_(this, storeNames);
   }
 
   /// Stream of `abort` events handled by this [Database].
@@ -402,17 +402,17 @@
 
   @DomName('IDBFactory.cmp')
   @DocsEditable()
-  int cmp(Object first, Object second) => _blink.BlinkIDBFactory.cmp_Callback_2(this, first, second);
+  int cmp(Object first, Object second) => _blink.BlinkIDBFactory.instance.cmp_Callback_2_(this, first, second);
 
   @DomName('IDBFactory.deleteDatabase')
   @DocsEditable()
-  OpenDBRequest _deleteDatabase(String name) => _blink.BlinkIDBFactory.deleteDatabase_Callback_1(this, name);
+  OpenDBRequest _deleteDatabase(String name) => _blink.BlinkIDBFactory.instance.deleteDatabase_Callback_1_(this, name);
 
   OpenDBRequest _open(String name, [int version]) {
     if (version != null) {
-      return _blink.BlinkIDBFactory.open_Callback_2(this, name, version);
+      return _blink.BlinkIDBFactory.instance.open_Callback_2_(this, name, version);
     }
-    return _blink.BlinkIDBFactory.open_Callback_1(this, name);
+    return _blink.BlinkIDBFactory.instance.open_Callback_1_(this, name);
   }
 
   @DomName('IDBFactory.webkitGetDatabaseNames')
@@ -420,7 +420,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
-  Request _webkitGetDatabaseNames() => _blink.BlinkIDBFactory.webkitGetDatabaseNames_Callback(this);
+  Request _webkitGetDatabaseNames() => _blink.BlinkIDBFactory.instance.webkitGetDatabaseNames_Callback_0_(this);
 
 }
 
@@ -540,48 +540,48 @@
 
   @DomName('IDBIndex.keyPath')
   @DocsEditable()
-  Object get keyPath => _blink.BlinkIDBIndex.keyPath_Getter(this);
+  Object get keyPath => _blink.BlinkIDBIndex.instance.keyPath_Getter_(this);
 
   @DomName('IDBIndex.multiEntry')
   @DocsEditable()
-  bool get multiEntry => _blink.BlinkIDBIndex.multiEntry_Getter(this);
+  bool get multiEntry => _blink.BlinkIDBIndex.instance.multiEntry_Getter_(this);
 
   @DomName('IDBIndex.name')
   @DocsEditable()
-  String get name => _blink.BlinkIDBIndex.name_Getter(this);
+  String get name => _blink.BlinkIDBIndex.instance.name_Getter_(this);
 
   @DomName('IDBIndex.objectStore')
   @DocsEditable()
-  ObjectStore get objectStore => _blink.BlinkIDBIndex.objectStore_Getter(this);
+  ObjectStore get objectStore => _blink.BlinkIDBIndex.instance.objectStore_Getter_(this);
 
   @DomName('IDBIndex.unique')
   @DocsEditable()
-  bool get unique => _blink.BlinkIDBIndex.unique_Getter(this);
+  bool get unique => _blink.BlinkIDBIndex.instance.unique_Getter_(this);
 
   @DomName('IDBIndex.count')
   @DocsEditable()
-  Request _count(Object key) => _blink.BlinkIDBIndex.count_Callback_1(this, key);
+  Request _count(Object key) => _blink.BlinkIDBIndex.instance.count_Callback_1_(this, key);
 
   @DomName('IDBIndex.get')
   @DocsEditable()
-  Request _get(Object key) => _blink.BlinkIDBIndex.get_Callback_1(this, key);
+  Request _get(Object key) => _blink.BlinkIDBIndex.instance.get_Callback_1_(this, key);
 
   @DomName('IDBIndex.getKey')
   @DocsEditable()
-  Request _getKey(Object key) => _blink.BlinkIDBIndex.getKey_Callback_1(this, key);
+  Request _getKey(Object key) => _blink.BlinkIDBIndex.instance.getKey_Callback_1_(this, key);
 
   Request _openCursor(Object range, [String direction]) {
     if (direction != null) {
-      return _blink.BlinkIDBIndex.openCursor_Callback_2(this, range, direction);
+      return _blink.BlinkIDBIndex.instance.openCursor_Callback_2_(this, range, direction);
     }
-    return _blink.BlinkIDBIndex.openCursor_Callback_1(this, range);
+    return _blink.BlinkIDBIndex.instance.openCursor_Callback_1_(this, range);
   }
 
   Request _openKeyCursor(Object range, [String direction]) {
     if (direction != null) {
-      return _blink.BlinkIDBIndex.openKeyCursor_Callback_2(this, range, direction);
+      return _blink.BlinkIDBIndex.instance.openKeyCursor_Callback_2_(this, range, direction);
     }
-    return _blink.BlinkIDBIndex.openKeyCursor_Callback_1(this, range);
+    return _blink.BlinkIDBIndex.instance.openKeyCursor_Callback_1_(this, range);
   }
 
 }
@@ -616,47 +616,47 @@
 
   @DomName('IDBKeyRange.lower')
   @DocsEditable()
-  Object get lower => _blink.BlinkIDBKeyRange.lower_Getter(this);
+  Object get lower => _blink.BlinkIDBKeyRange.instance.lower_Getter_(this);
 
   @DomName('IDBKeyRange.lowerOpen')
   @DocsEditable()
-  bool get lowerOpen => _blink.BlinkIDBKeyRange.lowerOpen_Getter(this);
+  bool get lowerOpen => _blink.BlinkIDBKeyRange.instance.lowerOpen_Getter_(this);
 
   @DomName('IDBKeyRange.upper')
   @DocsEditable()
-  Object get upper => _blink.BlinkIDBKeyRange.upper_Getter(this);
+  Object get upper => _blink.BlinkIDBKeyRange.instance.upper_Getter_(this);
 
   @DomName('IDBKeyRange.upperOpen')
   @DocsEditable()
-  bool get upperOpen => _blink.BlinkIDBKeyRange.upperOpen_Getter(this);
+  bool get upperOpen => _blink.BlinkIDBKeyRange.instance.upperOpen_Getter_(this);
 
   static KeyRange bound_(Object lower, Object upper, [bool lowerOpen, bool upperOpen]) {
     if (upperOpen != null) {
-      return _blink.BlinkIDBKeyRange.bound_Callback_4(lower, upper, lowerOpen, upperOpen);
+      return _blink.BlinkIDBKeyRange.instance.bound_Callback_4_(lower, upper, lowerOpen, upperOpen);
     }
     if (lowerOpen != null) {
-      return _blink.BlinkIDBKeyRange.bound_Callback_3(lower, upper, lowerOpen);
+      return _blink.BlinkIDBKeyRange.instance.bound_Callback_3_(lower, upper, lowerOpen);
     }
-    return _blink.BlinkIDBKeyRange.bound_Callback_2(lower, upper);
+    return _blink.BlinkIDBKeyRange.instance.bound_Callback_2_(lower, upper);
   }
 
   static KeyRange lowerBound_(Object bound, [bool open]) {
     if (open != null) {
-      return _blink.BlinkIDBKeyRange.lowerBound_Callback_2(bound, open);
+      return _blink.BlinkIDBKeyRange.instance.lowerBound_Callback_2_(bound, open);
     }
-    return _blink.BlinkIDBKeyRange.lowerBound_Callback_1(bound);
+    return _blink.BlinkIDBKeyRange.instance.lowerBound_Callback_1_(bound);
   }
 
   @DomName('IDBKeyRange.only_')
   @DocsEditable()
   @Experimental() // non-standard
-  static KeyRange only_(Object value) => _blink.BlinkIDBKeyRange.only_Callback_1(value);
+  static KeyRange only_(Object value) => _blink.BlinkIDBKeyRange.instance.only_Callback_1_(value);
 
   static KeyRange upperBound_(Object bound, [bool open]) {
     if (open != null) {
-      return _blink.BlinkIDBKeyRange.upperBound_Callback_2(bound, open);
+      return _blink.BlinkIDBKeyRange.instance.upperBound_Callback_2_(bound, open);
     }
-    return _blink.BlinkIDBKeyRange.upperBound_Callback_1(bound);
+    return _blink.BlinkIDBKeyRange.instance.upperBound_Callback_1_(bound);
   }
 
 }
@@ -800,90 +800,90 @@
 
   @DomName('IDBObjectStore.autoIncrement')
   @DocsEditable()
-  bool get autoIncrement => _blink.BlinkIDBObjectStore.autoIncrement_Getter(this);
+  bool get autoIncrement => _blink.BlinkIDBObjectStore.instance.autoIncrement_Getter_(this);
 
   @DomName('IDBObjectStore.indexNames')
   @DocsEditable()
-  List<String> get indexNames => _blink.BlinkIDBObjectStore.indexNames_Getter(this);
+  List<String> get indexNames => _blink.BlinkIDBObjectStore.instance.indexNames_Getter_(this);
 
   @DomName('IDBObjectStore.keyPath')
   @DocsEditable()
-  Object get keyPath => _blink.BlinkIDBObjectStore.keyPath_Getter(this);
+  Object get keyPath => _blink.BlinkIDBObjectStore.instance.keyPath_Getter_(this);
 
   @DomName('IDBObjectStore.name')
   @DocsEditable()
-  String get name => _blink.BlinkIDBObjectStore.name_Getter(this);
+  String get name => _blink.BlinkIDBObjectStore.instance.name_Getter_(this);
 
   @DomName('IDBObjectStore.transaction')
   @DocsEditable()
-  Transaction get transaction => _blink.BlinkIDBObjectStore.transaction_Getter(this);
+  Transaction get transaction => _blink.BlinkIDBObjectStore.instance.transaction_Getter_(this);
 
   Request _add(Object value, [Object key]) {
     if (key != null) {
-      return _blink.BlinkIDBObjectStore.add_Callback_2(this, value, key);
+      return _blink.BlinkIDBObjectStore.instance.add_Callback_2_(this, value, key);
     }
-    return _blink.BlinkIDBObjectStore.add_Callback_1(this, value);
+    return _blink.BlinkIDBObjectStore.instance.add_Callback_1_(this, value);
   }
 
   @DomName('IDBObjectStore.clear')
   @DocsEditable()
-  Request _clear() => _blink.BlinkIDBObjectStore.clear_Callback(this);
+  Request _clear() => _blink.BlinkIDBObjectStore.instance.clear_Callback_0_(this);
 
   @DomName('IDBObjectStore.count')
   @DocsEditable()
-  Request _count(Object key) => _blink.BlinkIDBObjectStore.count_Callback_1(this, key);
+  Request _count(Object key) => _blink.BlinkIDBObjectStore.instance.count_Callback_1_(this, key);
 
   Index _createIndex(String name, keyPath, [Map options]) {
     if ((keyPath is String || keyPath == null) && (name is String || name == null) && options == null) {
-      return _blink.BlinkIDBObjectStore.createIndex_Callback_2(this, name, keyPath);
+      return _blink.BlinkIDBObjectStore.instance.createIndex_Callback_2_(this, name, keyPath);
     }
     if ((options is Map || options == null) && (keyPath is String || keyPath == null) && (name is String || name == null)) {
-      return _blink.BlinkIDBObjectStore.createIndex_Callback_3(this, name, keyPath, options);
+      return _blink.BlinkIDBObjectStore.instance.createIndex_Callback_3_(this, name, keyPath, options);
     }
     if ((keyPath is List<String> || keyPath == null) && (name is String || name == null) && options == null) {
-      return _blink.BlinkIDBObjectStore.createIndex_Callback_2(this, name, keyPath);
+      return _blink.BlinkIDBObjectStore.instance.createIndex_Callback_2_(this, name, keyPath);
     }
     if ((options is Map || options == null) && (keyPath is List<String> || keyPath == null) && (name is String || name == null)) {
-      return _blink.BlinkIDBObjectStore.createIndex_Callback_3(this, name, keyPath, options);
+      return _blink.BlinkIDBObjectStore.instance.createIndex_Callback_3_(this, name, keyPath, options);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
   @DomName('IDBObjectStore.delete')
   @DocsEditable()
-  Request _delete(Object key) => _blink.BlinkIDBObjectStore.delete_Callback_1(this, key);
+  Request _delete(Object key) => _blink.BlinkIDBObjectStore.instance.delete_Callback_1_(this, key);
 
   @DomName('IDBObjectStore.deleteIndex')
   @DocsEditable()
-  void deleteIndex(String name) => _blink.BlinkIDBObjectStore.deleteIndex_Callback_1(this, name);
+  void deleteIndex(String name) => _blink.BlinkIDBObjectStore.instance.deleteIndex_Callback_1_(this, name);
 
   @DomName('IDBObjectStore.get')
   @DocsEditable()
-  Request _get(Object key) => _blink.BlinkIDBObjectStore.get_Callback_1(this, key);
+  Request _get(Object key) => _blink.BlinkIDBObjectStore.instance.get_Callback_1_(this, key);
 
   @DomName('IDBObjectStore.index')
   @DocsEditable()
-  Index index(String name) => _blink.BlinkIDBObjectStore.index_Callback_1(this, name);
+  Index index(String name) => _blink.BlinkIDBObjectStore.instance.index_Callback_1_(this, name);
 
   Request _openCursor(Object range, [String direction]) {
     if (direction != null) {
-      return _blink.BlinkIDBObjectStore.openCursor_Callback_2(this, range, direction);
+      return _blink.BlinkIDBObjectStore.instance.openCursor_Callback_2_(this, range, direction);
     }
-    return _blink.BlinkIDBObjectStore.openCursor_Callback_1(this, range);
+    return _blink.BlinkIDBObjectStore.instance.openCursor_Callback_1_(this, range);
   }
 
   Request openKeyCursor(Object range, [String direction]) {
     if (direction != null) {
-      return _blink.BlinkIDBObjectStore.openKeyCursor_Callback_2(this, range, direction);
+      return _blink.BlinkIDBObjectStore.instance.openKeyCursor_Callback_2_(this, range, direction);
     }
-    return _blink.BlinkIDBObjectStore.openKeyCursor_Callback_1(this, range);
+    return _blink.BlinkIDBObjectStore.instance.openKeyCursor_Callback_1_(this, range);
   }
 
   Request _put(Object value, [Object key]) {
     if (key != null) {
-      return _blink.BlinkIDBObjectStore.put_Callback_2(this, value, key);
+      return _blink.BlinkIDBObjectStore.instance.put_Callback_2_(this, value, key);
     }
-    return _blink.BlinkIDBObjectStore.put_Callback_1(this, value);
+    return _blink.BlinkIDBObjectStore.instance.put_Callback_1_(this, value);
   }
 
 
@@ -995,23 +995,23 @@
 
   @DomName('IDBRequest.error')
   @DocsEditable()
-  DomError get error => _blink.BlinkIDBRequest.error_Getter(this);
+  DomError get error => _blink.BlinkIDBRequest.instance.error_Getter_(this);
 
   @DomName('IDBRequest.readyState')
   @DocsEditable()
-  String get readyState => _blink.BlinkIDBRequest.readyState_Getter(this);
+  String get readyState => _blink.BlinkIDBRequest.instance.readyState_Getter_(this);
 
   @DomName('IDBRequest.result')
   @DocsEditable()
-  Object get result => _blink.BlinkIDBRequest.result_Getter(this);
+  Object get result => _blink.BlinkIDBRequest.instance.result_Getter_(this);
 
   @DomName('IDBRequest.source')
   @DocsEditable()
-  Object get source => _blink.BlinkIDBRequest.source_Getter(this);
+  Object get source => _blink.BlinkIDBRequest.instance.source_Getter_(this);
 
   @DomName('IDBRequest.transaction')
   @DocsEditable()
-  Transaction get transaction => _blink.BlinkIDBRequest.transaction_Getter(this);
+  Transaction get transaction => _blink.BlinkIDBRequest.instance.transaction_Getter_(this);
 
   /// Stream of `error` events handled by this [Request].
   @DomName('IDBRequest.onerror')
@@ -1096,23 +1096,23 @@
 
   @DomName('IDBTransaction.db')
   @DocsEditable()
-  Database get db => _blink.BlinkIDBTransaction.db_Getter(this);
+  Database get db => _blink.BlinkIDBTransaction.instance.db_Getter_(this);
 
   @DomName('IDBTransaction.error')
   @DocsEditable()
-  DomError get error => _blink.BlinkIDBTransaction.error_Getter(this);
+  DomError get error => _blink.BlinkIDBTransaction.instance.error_Getter_(this);
 
   @DomName('IDBTransaction.mode')
   @DocsEditable()
-  String get mode => _blink.BlinkIDBTransaction.mode_Getter(this);
+  String get mode => _blink.BlinkIDBTransaction.instance.mode_Getter_(this);
 
   @DomName('IDBTransaction.abort')
   @DocsEditable()
-  void abort() => _blink.BlinkIDBTransaction.abort_Callback(this);
+  void abort() => _blink.BlinkIDBTransaction.instance.abort_Callback_0_(this);
 
   @DomName('IDBTransaction.objectStore')
   @DocsEditable()
-  ObjectStore objectStore(String name) => _blink.BlinkIDBTransaction.objectStore_Callback_1(this, name);
+  ObjectStore objectStore(String name) => _blink.BlinkIDBTransaction.instance.objectStore_Callback_1_(this, name);
 
   /// Stream of `abort` events handled by this [Transaction].
   @DomName('IDBTransaction.onabort')
@@ -1147,19 +1147,19 @@
   @DomName('IDBVersionChangeEvent.dataLoss')
   @DocsEditable()
   @Experimental() // untriaged
-  String get dataLoss => _blink.BlinkIDBVersionChangeEvent.dataLoss_Getter(this);
+  String get dataLoss => _blink.BlinkIDBVersionChangeEvent.instance.dataLoss_Getter_(this);
 
   @DomName('IDBVersionChangeEvent.dataLossMessage')
   @DocsEditable()
   @Experimental() // untriaged
-  String get dataLossMessage => _blink.BlinkIDBVersionChangeEvent.dataLossMessage_Getter(this);
+  String get dataLossMessage => _blink.BlinkIDBVersionChangeEvent.instance.dataLossMessage_Getter_(this);
 
   @DomName('IDBVersionChangeEvent.newVersion')
   @DocsEditable()
-  int get newVersion => _blink.BlinkIDBVersionChangeEvent.newVersion_Getter(this);
+  int get newVersion => _blink.BlinkIDBVersionChangeEvent.instance.newVersion_Getter_(this);
 
   @DomName('IDBVersionChangeEvent.oldVersion')
   @DocsEditable()
-  int get oldVersion => _blink.BlinkIDBVersionChangeEvent.oldVersion_Getter(this);
+  int get oldVersion => _blink.BlinkIDBVersionChangeEvent.instance.oldVersion_Getter_(this);
 
 }
diff --git a/sdk/lib/internal/internal.dart b/sdk/lib/internal/internal.dart
index 2d41870..10b9613 100644
--- a/sdk/lib/internal/internal.dart
+++ b/sdk/lib/internal/internal.dart
@@ -16,3 +16,32 @@
 part 'print.dart';
 part 'sort.dart';
 part 'symbol.dart';
+
+// Powers of 10 up to 10^22 are representable as doubles.
+// Powers of 10 above that are only approximate due to lack of precission.
+// Used by double-parsing.
+const POWERS_OF_TEN = const [
+                        1.0,  /*  0 */
+                       10.0,
+                      100.0,
+                     1000.0,
+                    10000.0,
+                   100000.0,  /*  5 */
+                  1000000.0,
+                 10000000.0,
+                100000000.0,
+               1000000000.0,
+              10000000000.0,  /* 10 */
+             100000000000.0,
+            1000000000000.0,
+           10000000000000.0,
+          100000000000000.0,
+         1000000000000000.0,  /*  15 */
+        10000000000000000.0,
+       100000000000000000.0,
+      1000000000000000000.0,
+     10000000000000000000.0,
+    100000000000000000000.0,  /*  20 */
+   1000000000000000000000.0,
+  10000000000000000000000.0,
+];
diff --git a/sdk/lib/svg/dartium/svg_dartium.dart b/sdk/lib/svg/dartium/svg_dartium.dart
index 5cba7fb..0cd0c6a 100644
--- a/sdk/lib/svg/dartium/svg_dartium.dart
+++ b/sdk/lib/svg/dartium/svg_dartium.dart
@@ -198,11 +198,11 @@
 
   @DomName('SVGAElement.target')
   @DocsEditable()
-  AnimatedString get target => _blink.BlinkSVGAElement.target_Getter(this);
+  AnimatedString get target => _blink.BlinkSVGAElement.instance.target_Getter_(this);
 
   @DomName('SVGAElement.href')
   @DocsEditable()
-  AnimatedString get href => _blink.BlinkSVGAElement.href_Getter(this);
+  AnimatedString get href => _blink.BlinkSVGAElement.instance.href_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -237,23 +237,23 @@
 
   @DomName('SVGAltGlyphElement.format')
   @DocsEditable()
-  String get format => _blink.BlinkSVGAltGlyphElement.format_Getter(this);
+  String get format => _blink.BlinkSVGAltGlyphElement.instance.format_Getter_(this);
 
   @DomName('SVGAltGlyphElement.format')
   @DocsEditable()
-  void set format(String value) => _blink.BlinkSVGAltGlyphElement.format_Setter(this, value);
+  void set format(String value) => _blink.BlinkSVGAltGlyphElement.instance.format_Setter_(this, value);
 
   @DomName('SVGAltGlyphElement.glyphRef')
   @DocsEditable()
-  String get glyphRef => _blink.BlinkSVGAltGlyphElement.glyphRef_Getter(this);
+  String get glyphRef => _blink.BlinkSVGAltGlyphElement.instance.glyphRef_Getter_(this);
 
   @DomName('SVGAltGlyphElement.glyphRef')
   @DocsEditable()
-  void set glyphRef(String value) => _blink.BlinkSVGAltGlyphElement.glyphRef_Setter(this, value);
+  void set glyphRef(String value) => _blink.BlinkSVGAltGlyphElement.instance.glyphRef_Setter_(this, value);
 
   @DomName('SVGAltGlyphElement.href')
   @DocsEditable()
-  AnimatedString get href => _blink.BlinkSVGAltGlyphElement.href_Getter(this);
+  AnimatedString get href => _blink.BlinkSVGAltGlyphElement.instance.href_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -292,39 +292,39 @@
 
   @DomName('SVGAngle.unitType')
   @DocsEditable()
-  int get unitType => _blink.BlinkSVGAngle.unitType_Getter(this);
+  int get unitType => _blink.BlinkSVGAngle.instance.unitType_Getter_(this);
 
   @DomName('SVGAngle.value')
   @DocsEditable()
-  num get value => _blink.BlinkSVGAngle.value_Getter(this);
+  num get value => _blink.BlinkSVGAngle.instance.value_Getter_(this);
 
   @DomName('SVGAngle.value')
   @DocsEditable()
-  void set value(num value) => _blink.BlinkSVGAngle.value_Setter(this, value);
+  void set value(num value) => _blink.BlinkSVGAngle.instance.value_Setter_(this, value);
 
   @DomName('SVGAngle.valueAsString')
   @DocsEditable()
-  String get valueAsString => _blink.BlinkSVGAngle.valueAsString_Getter(this);
+  String get valueAsString => _blink.BlinkSVGAngle.instance.valueAsString_Getter_(this);
 
   @DomName('SVGAngle.valueAsString')
   @DocsEditable()
-  void set valueAsString(String value) => _blink.BlinkSVGAngle.valueAsString_Setter(this, value);
+  void set valueAsString(String value) => _blink.BlinkSVGAngle.instance.valueAsString_Setter_(this, value);
 
   @DomName('SVGAngle.valueInSpecifiedUnits')
   @DocsEditable()
-  num get valueInSpecifiedUnits => _blink.BlinkSVGAngle.valueInSpecifiedUnits_Getter(this);
+  num get valueInSpecifiedUnits => _blink.BlinkSVGAngle.instance.valueInSpecifiedUnits_Getter_(this);
 
   @DomName('SVGAngle.valueInSpecifiedUnits')
   @DocsEditable()
-  void set valueInSpecifiedUnits(num value) => _blink.BlinkSVGAngle.valueInSpecifiedUnits_Setter(this, value);
+  void set valueInSpecifiedUnits(num value) => _blink.BlinkSVGAngle.instance.valueInSpecifiedUnits_Setter_(this, value);
 
   @DomName('SVGAngle.convertToSpecifiedUnits')
   @DocsEditable()
-  void convertToSpecifiedUnits(int unitType) => _blink.BlinkSVGAngle.convertToSpecifiedUnits_Callback_1(this, unitType);
+  void convertToSpecifiedUnits(int unitType) => _blink.BlinkSVGAngle.instance.convertToSpecifiedUnits_Callback_1_(this, unitType);
 
   @DomName('SVGAngle.newValueSpecifiedUnits')
   @DocsEditable()
-  void newValueSpecifiedUnits(int unitType, num valueInSpecifiedUnits) => _blink.BlinkSVGAngle.newValueSpecifiedUnits_Callback_2(this, unitType, valueInSpecifiedUnits);
+  void newValueSpecifiedUnits(int unitType, num valueInSpecifiedUnits) => _blink.BlinkSVGAngle.instance.newValueSpecifiedUnits_Callback_2_(this, unitType, valueInSpecifiedUnits);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -436,11 +436,11 @@
 
   @DomName('SVGAnimatedAngle.animVal')
   @DocsEditable()
-  Angle get animVal => _blink.BlinkSVGAnimatedAngle.animVal_Getter(this);
+  Angle get animVal => _blink.BlinkSVGAnimatedAngle.instance.animVal_Getter_(this);
 
   @DomName('SVGAnimatedAngle.baseVal')
   @DocsEditable()
-  Angle get baseVal => _blink.BlinkSVGAnimatedAngle.baseVal_Getter(this);
+  Angle get baseVal => _blink.BlinkSVGAnimatedAngle.instance.baseVal_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -459,15 +459,15 @@
 
   @DomName('SVGAnimatedBoolean.animVal')
   @DocsEditable()
-  bool get animVal => _blink.BlinkSVGAnimatedBoolean.animVal_Getter(this);
+  bool get animVal => _blink.BlinkSVGAnimatedBoolean.instance.animVal_Getter_(this);
 
   @DomName('SVGAnimatedBoolean.baseVal')
   @DocsEditable()
-  bool get baseVal => _blink.BlinkSVGAnimatedBoolean.baseVal_Getter(this);
+  bool get baseVal => _blink.BlinkSVGAnimatedBoolean.instance.baseVal_Getter_(this);
 
   @DomName('SVGAnimatedBoolean.baseVal')
   @DocsEditable()
-  void set baseVal(bool value) => _blink.BlinkSVGAnimatedBoolean.baseVal_Setter(this, value);
+  void set baseVal(bool value) => _blink.BlinkSVGAnimatedBoolean.instance.baseVal_Setter_(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -486,15 +486,15 @@
 
   @DomName('SVGAnimatedEnumeration.animVal')
   @DocsEditable()
-  int get animVal => _blink.BlinkSVGAnimatedEnumeration.animVal_Getter(this);
+  int get animVal => _blink.BlinkSVGAnimatedEnumeration.instance.animVal_Getter_(this);
 
   @DomName('SVGAnimatedEnumeration.baseVal')
   @DocsEditable()
-  int get baseVal => _blink.BlinkSVGAnimatedEnumeration.baseVal_Getter(this);
+  int get baseVal => _blink.BlinkSVGAnimatedEnumeration.instance.baseVal_Getter_(this);
 
   @DomName('SVGAnimatedEnumeration.baseVal')
   @DocsEditable()
-  void set baseVal(int value) => _blink.BlinkSVGAnimatedEnumeration.baseVal_Setter(this, value);
+  void set baseVal(int value) => _blink.BlinkSVGAnimatedEnumeration.instance.baseVal_Setter_(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -513,15 +513,15 @@
 
   @DomName('SVGAnimatedInteger.animVal')
   @DocsEditable()
-  int get animVal => _blink.BlinkSVGAnimatedInteger.animVal_Getter(this);
+  int get animVal => _blink.BlinkSVGAnimatedInteger.instance.animVal_Getter_(this);
 
   @DomName('SVGAnimatedInteger.baseVal')
   @DocsEditable()
-  int get baseVal => _blink.BlinkSVGAnimatedInteger.baseVal_Getter(this);
+  int get baseVal => _blink.BlinkSVGAnimatedInteger.instance.baseVal_Getter_(this);
 
   @DomName('SVGAnimatedInteger.baseVal')
   @DocsEditable()
-  void set baseVal(int value) => _blink.BlinkSVGAnimatedInteger.baseVal_Setter(this, value);
+  void set baseVal(int value) => _blink.BlinkSVGAnimatedInteger.instance.baseVal_Setter_(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -540,11 +540,11 @@
 
   @DomName('SVGAnimatedLength.animVal')
   @DocsEditable()
-  Length get animVal => _blink.BlinkSVGAnimatedLength.animVal_Getter(this);
+  Length get animVal => _blink.BlinkSVGAnimatedLength.instance.animVal_Getter_(this);
 
   @DomName('SVGAnimatedLength.baseVal')
   @DocsEditable()
-  Length get baseVal => _blink.BlinkSVGAnimatedLength.baseVal_Getter(this);
+  Length get baseVal => _blink.BlinkSVGAnimatedLength.instance.baseVal_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -563,11 +563,11 @@
 
   @DomName('SVGAnimatedLengthList.animVal')
   @DocsEditable()
-  LengthList get animVal => _blink.BlinkSVGAnimatedLengthList.animVal_Getter(this);
+  LengthList get animVal => _blink.BlinkSVGAnimatedLengthList.instance.animVal_Getter_(this);
 
   @DomName('SVGAnimatedLengthList.baseVal')
   @DocsEditable()
-  LengthList get baseVal => _blink.BlinkSVGAnimatedLengthList.baseVal_Getter(this);
+  LengthList get baseVal => _blink.BlinkSVGAnimatedLengthList.instance.baseVal_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -586,15 +586,15 @@
 
   @DomName('SVGAnimatedNumber.animVal')
   @DocsEditable()
-  double get animVal => _blink.BlinkSVGAnimatedNumber.animVal_Getter(this);
+  double get animVal => _blink.BlinkSVGAnimatedNumber.instance.animVal_Getter_(this);
 
   @DomName('SVGAnimatedNumber.baseVal')
   @DocsEditable()
-  num get baseVal => _blink.BlinkSVGAnimatedNumber.baseVal_Getter(this);
+  num get baseVal => _blink.BlinkSVGAnimatedNumber.instance.baseVal_Getter_(this);
 
   @DomName('SVGAnimatedNumber.baseVal')
   @DocsEditable()
-  void set baseVal(num value) => _blink.BlinkSVGAnimatedNumber.baseVal_Setter(this, value);
+  void set baseVal(num value) => _blink.BlinkSVGAnimatedNumber.instance.baseVal_Setter_(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -613,11 +613,11 @@
 
   @DomName('SVGAnimatedNumberList.animVal')
   @DocsEditable()
-  NumberList get animVal => _blink.BlinkSVGAnimatedNumberList.animVal_Getter(this);
+  NumberList get animVal => _blink.BlinkSVGAnimatedNumberList.instance.animVal_Getter_(this);
 
   @DomName('SVGAnimatedNumberList.baseVal')
   @DocsEditable()
-  NumberList get baseVal => _blink.BlinkSVGAnimatedNumberList.baseVal_Getter(this);
+  NumberList get baseVal => _blink.BlinkSVGAnimatedNumberList.instance.baseVal_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -636,11 +636,11 @@
 
   @DomName('SVGAnimatedPreserveAspectRatio.animVal')
   @DocsEditable()
-  PreserveAspectRatio get animVal => _blink.BlinkSVGAnimatedPreserveAspectRatio.animVal_Getter(this);
+  PreserveAspectRatio get animVal => _blink.BlinkSVGAnimatedPreserveAspectRatio.instance.animVal_Getter_(this);
 
   @DomName('SVGAnimatedPreserveAspectRatio.baseVal')
   @DocsEditable()
-  PreserveAspectRatio get baseVal => _blink.BlinkSVGAnimatedPreserveAspectRatio.baseVal_Getter(this);
+  PreserveAspectRatio get baseVal => _blink.BlinkSVGAnimatedPreserveAspectRatio.instance.baseVal_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -659,11 +659,11 @@
 
   @DomName('SVGAnimatedRect.animVal')
   @DocsEditable()
-  Rect get animVal => _blink.BlinkSVGAnimatedRect.animVal_Getter(this);
+  Rect get animVal => _blink.BlinkSVGAnimatedRect.instance.animVal_Getter_(this);
 
   @DomName('SVGAnimatedRect.baseVal')
   @DocsEditable()
-  Rect get baseVal => _blink.BlinkSVGAnimatedRect.baseVal_Getter(this);
+  Rect get baseVal => _blink.BlinkSVGAnimatedRect.instance.baseVal_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -682,15 +682,15 @@
 
   @DomName('SVGAnimatedString.animVal')
   @DocsEditable()
-  String get animVal => _blink.BlinkSVGAnimatedString.animVal_Getter(this);
+  String get animVal => _blink.BlinkSVGAnimatedString.instance.animVal_Getter_(this);
 
   @DomName('SVGAnimatedString.baseVal')
   @DocsEditable()
-  String get baseVal => _blink.BlinkSVGAnimatedString.baseVal_Getter(this);
+  String get baseVal => _blink.BlinkSVGAnimatedString.instance.baseVal_Getter_(this);
 
   @DomName('SVGAnimatedString.baseVal')
   @DocsEditable()
-  void set baseVal(String value) => _blink.BlinkSVGAnimatedString.baseVal_Setter(this, value);
+  void set baseVal(String value) => _blink.BlinkSVGAnimatedString.instance.baseVal_Setter_(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -709,11 +709,11 @@
 
   @DomName('SVGAnimatedTransformList.animVal')
   @DocsEditable()
-  TransformList get animVal => _blink.BlinkSVGAnimatedTransformList.animVal_Getter(this);
+  TransformList get animVal => _blink.BlinkSVGAnimatedTransformList.instance.animVal_Getter_(this);
 
   @DomName('SVGAnimatedTransformList.baseVal')
   @DocsEditable()
-  TransformList get baseVal => _blink.BlinkSVGAnimatedTransformList.baseVal_Getter(this);
+  TransformList get baseVal => _blink.BlinkSVGAnimatedTransformList.instance.baseVal_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -742,51 +742,51 @@
 
   @DomName('SVGAnimationElement.targetElement')
   @DocsEditable()
-  SvgElement get targetElement => _blink.BlinkSVGAnimationElement.targetElement_Getter(this);
+  SvgElement get targetElement => _blink.BlinkSVGAnimationElement.instance.targetElement_Getter_(this);
 
   @DomName('SVGAnimationElement.beginElement')
   @DocsEditable()
-  void beginElement() => _blink.BlinkSVGAnimationElement.beginElement_Callback(this);
+  void beginElement() => _blink.BlinkSVGAnimationElement.instance.beginElement_Callback_0_(this);
 
   @DomName('SVGAnimationElement.beginElementAt')
   @DocsEditable()
-  void beginElementAt(num offset) => _blink.BlinkSVGAnimationElement.beginElementAt_Callback_1(this, offset);
+  void beginElementAt(num offset) => _blink.BlinkSVGAnimationElement.instance.beginElementAt_Callback_1_(this, offset);
 
   @DomName('SVGAnimationElement.endElement')
   @DocsEditable()
-  void endElement() => _blink.BlinkSVGAnimationElement.endElement_Callback(this);
+  void endElement() => _blink.BlinkSVGAnimationElement.instance.endElement_Callback_0_(this);
 
   @DomName('SVGAnimationElement.endElementAt')
   @DocsEditable()
-  void endElementAt(num offset) => _blink.BlinkSVGAnimationElement.endElementAt_Callback_1(this, offset);
+  void endElementAt(num offset) => _blink.BlinkSVGAnimationElement.instance.endElementAt_Callback_1_(this, offset);
 
   @DomName('SVGAnimationElement.getCurrentTime')
   @DocsEditable()
-  double getCurrentTime() => _blink.BlinkSVGAnimationElement.getCurrentTime_Callback(this);
+  double getCurrentTime() => _blink.BlinkSVGAnimationElement.instance.getCurrentTime_Callback_0_(this);
 
   @DomName('SVGAnimationElement.getSimpleDuration')
   @DocsEditable()
-  double getSimpleDuration() => _blink.BlinkSVGAnimationElement.getSimpleDuration_Callback(this);
+  double getSimpleDuration() => _blink.BlinkSVGAnimationElement.instance.getSimpleDuration_Callback_0_(this);
 
   @DomName('SVGAnimationElement.getStartTime')
   @DocsEditable()
-  double getStartTime() => _blink.BlinkSVGAnimationElement.getStartTime_Callback(this);
+  double getStartTime() => _blink.BlinkSVGAnimationElement.instance.getStartTime_Callback_0_(this);
 
   @DomName('SVGAnimationElement.requiredExtensions')
   @DocsEditable()
-  StringList get requiredExtensions => _blink.BlinkSVGAnimationElement.requiredExtensions_Getter(this);
+  StringList get requiredExtensions => _blink.BlinkSVGAnimationElement.instance.requiredExtensions_Getter_(this);
 
   @DomName('SVGAnimationElement.requiredFeatures')
   @DocsEditable()
-  StringList get requiredFeatures => _blink.BlinkSVGAnimationElement.requiredFeatures_Getter(this);
+  StringList get requiredFeatures => _blink.BlinkSVGAnimationElement.instance.requiredFeatures_Getter_(this);
 
   @DomName('SVGAnimationElement.systemLanguage')
   @DocsEditable()
-  StringList get systemLanguage => _blink.BlinkSVGAnimationElement.systemLanguage_Getter(this);
+  StringList get systemLanguage => _blink.BlinkSVGAnimationElement.instance.systemLanguage_Getter_(this);
 
   @DomName('SVGAnimationElement.hasExtension')
   @DocsEditable()
-  bool hasExtension(String extension) => _blink.BlinkSVGAnimationElement.hasExtension_Callback_1(this, extension);
+  bool hasExtension(String extension) => _blink.BlinkSVGAnimationElement.instance.hasExtension_Callback_1_(this, extension);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -815,15 +815,15 @@
 
   @DomName('SVGCircleElement.cx')
   @DocsEditable()
-  AnimatedLength get cx => _blink.BlinkSVGCircleElement.cx_Getter(this);
+  AnimatedLength get cx => _blink.BlinkSVGCircleElement.instance.cx_Getter_(this);
 
   @DomName('SVGCircleElement.cy')
   @DocsEditable()
-  AnimatedLength get cy => _blink.BlinkSVGCircleElement.cy_Getter(this);
+  AnimatedLength get cy => _blink.BlinkSVGCircleElement.instance.cy_Getter_(this);
 
   @DomName('SVGCircleElement.r')
   @DocsEditable()
-  AnimatedLength get r => _blink.BlinkSVGCircleElement.r_Getter(this);
+  AnimatedLength get r => _blink.BlinkSVGCircleElement.instance.r_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -852,7 +852,7 @@
 
   @DomName('SVGClipPathElement.clipPathUnits')
   @DocsEditable()
-  AnimatedEnumeration get clipPathUnits => _blink.BlinkSVGClipPathElement.clipPathUnits_Getter(this);
+  AnimatedEnumeration get clipPathUnits => _blink.BlinkSVGClipPathElement.instance.clipPathUnits_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -952,19 +952,19 @@
 
   @DomName('SVGEllipseElement.cx')
   @DocsEditable()
-  AnimatedLength get cx => _blink.BlinkSVGEllipseElement.cx_Getter(this);
+  AnimatedLength get cx => _blink.BlinkSVGEllipseElement.instance.cx_Getter_(this);
 
   @DomName('SVGEllipseElement.cy')
   @DocsEditable()
-  AnimatedLength get cy => _blink.BlinkSVGEllipseElement.cy_Getter(this);
+  AnimatedLength get cy => _blink.BlinkSVGEllipseElement.instance.cy_Getter_(this);
 
   @DomName('SVGEllipseElement.rx')
   @DocsEditable()
-  AnimatedLength get rx => _blink.BlinkSVGEllipseElement.rx_Getter(this);
+  AnimatedLength get rx => _blink.BlinkSVGEllipseElement.instance.rx_Getter_(this);
 
   @DomName('SVGEllipseElement.ry')
   @DocsEditable()
-  AnimatedLength get ry => _blink.BlinkSVGEllipseElement.ry_Getter(this);
+  AnimatedLength get ry => _blink.BlinkSVGEllipseElement.instance.ry_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1024,35 +1024,35 @@
 
   @DomName('SVGFEBlendElement.in1')
   @DocsEditable()
-  AnimatedString get in1 => _blink.BlinkSVGFEBlendElement.in1_Getter(this);
+  AnimatedString get in1 => _blink.BlinkSVGFEBlendElement.instance.in1_Getter_(this);
 
   @DomName('SVGFEBlendElement.in2')
   @DocsEditable()
-  AnimatedString get in2 => _blink.BlinkSVGFEBlendElement.in2_Getter(this);
+  AnimatedString get in2 => _blink.BlinkSVGFEBlendElement.instance.in2_Getter_(this);
 
   @DomName('SVGFEBlendElement.mode')
   @DocsEditable()
-  AnimatedEnumeration get mode => _blink.BlinkSVGFEBlendElement.mode_Getter(this);
+  AnimatedEnumeration get mode => _blink.BlinkSVGFEBlendElement.instance.mode_Getter_(this);
 
   @DomName('SVGFEBlendElement.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.BlinkSVGFEBlendElement.height_Getter(this);
+  AnimatedLength get height => _blink.BlinkSVGFEBlendElement.instance.height_Getter_(this);
 
   @DomName('SVGFEBlendElement.result')
   @DocsEditable()
-  AnimatedString get result => _blink.BlinkSVGFEBlendElement.result_Getter(this);
+  AnimatedString get result => _blink.BlinkSVGFEBlendElement.instance.result_Getter_(this);
 
   @DomName('SVGFEBlendElement.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.BlinkSVGFEBlendElement.width_Getter(this);
+  AnimatedLength get width => _blink.BlinkSVGFEBlendElement.instance.width_Getter_(this);
 
   @DomName('SVGFEBlendElement.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.BlinkSVGFEBlendElement.x_Getter(this);
+  AnimatedLength get x => _blink.BlinkSVGFEBlendElement.instance.x_Getter_(this);
 
   @DomName('SVGFEBlendElement.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.BlinkSVGFEBlendElement.y_Getter(this);
+  AnimatedLength get y => _blink.BlinkSVGFEBlendElement.instance.y_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1108,35 +1108,35 @@
 
   @DomName('SVGFEColorMatrixElement.in1')
   @DocsEditable()
-  AnimatedString get in1 => _blink.BlinkSVGFEColorMatrixElement.in1_Getter(this);
+  AnimatedString get in1 => _blink.BlinkSVGFEColorMatrixElement.instance.in1_Getter_(this);
 
   @DomName('SVGFEColorMatrixElement.type')
   @DocsEditable()
-  AnimatedEnumeration get type => _blink.BlinkSVGFEColorMatrixElement.type_Getter(this);
+  AnimatedEnumeration get type => _blink.BlinkSVGFEColorMatrixElement.instance.type_Getter_(this);
 
   @DomName('SVGFEColorMatrixElement.values')
   @DocsEditable()
-  AnimatedNumberList get values => _blink.BlinkSVGFEColorMatrixElement.values_Getter(this);
+  AnimatedNumberList get values => _blink.BlinkSVGFEColorMatrixElement.instance.values_Getter_(this);
 
   @DomName('SVGFEColorMatrixElement.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.BlinkSVGFEColorMatrixElement.height_Getter(this);
+  AnimatedLength get height => _blink.BlinkSVGFEColorMatrixElement.instance.height_Getter_(this);
 
   @DomName('SVGFEColorMatrixElement.result')
   @DocsEditable()
-  AnimatedString get result => _blink.BlinkSVGFEColorMatrixElement.result_Getter(this);
+  AnimatedString get result => _blink.BlinkSVGFEColorMatrixElement.instance.result_Getter_(this);
 
   @DomName('SVGFEColorMatrixElement.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.BlinkSVGFEColorMatrixElement.width_Getter(this);
+  AnimatedLength get width => _blink.BlinkSVGFEColorMatrixElement.instance.width_Getter_(this);
 
   @DomName('SVGFEColorMatrixElement.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.BlinkSVGFEColorMatrixElement.x_Getter(this);
+  AnimatedLength get x => _blink.BlinkSVGFEColorMatrixElement.instance.x_Getter_(this);
 
   @DomName('SVGFEColorMatrixElement.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.BlinkSVGFEColorMatrixElement.y_Getter(this);
+  AnimatedLength get y => _blink.BlinkSVGFEColorMatrixElement.instance.y_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1172,27 +1172,27 @@
 
   @DomName('SVGFEComponentTransferElement.in1')
   @DocsEditable()
-  AnimatedString get in1 => _blink.BlinkSVGFEComponentTransferElement.in1_Getter(this);
+  AnimatedString get in1 => _blink.BlinkSVGFEComponentTransferElement.instance.in1_Getter_(this);
 
   @DomName('SVGFEComponentTransferElement.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.BlinkSVGFEComponentTransferElement.height_Getter(this);
+  AnimatedLength get height => _blink.BlinkSVGFEComponentTransferElement.instance.height_Getter_(this);
 
   @DomName('SVGFEComponentTransferElement.result')
   @DocsEditable()
-  AnimatedString get result => _blink.BlinkSVGFEComponentTransferElement.result_Getter(this);
+  AnimatedString get result => _blink.BlinkSVGFEComponentTransferElement.instance.result_Getter_(this);
 
   @DomName('SVGFEComponentTransferElement.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.BlinkSVGFEComponentTransferElement.width_Getter(this);
+  AnimatedLength get width => _blink.BlinkSVGFEComponentTransferElement.instance.width_Getter_(this);
 
   @DomName('SVGFEComponentTransferElement.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.BlinkSVGFEComponentTransferElement.x_Getter(this);
+  AnimatedLength get x => _blink.BlinkSVGFEComponentTransferElement.instance.x_Getter_(this);
 
   @DomName('SVGFEComponentTransferElement.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.BlinkSVGFEComponentTransferElement.y_Getter(this);
+  AnimatedLength get y => _blink.BlinkSVGFEComponentTransferElement.instance.y_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1245,51 +1245,51 @@
 
   @DomName('SVGFECompositeElement.in1')
   @DocsEditable()
-  AnimatedString get in1 => _blink.BlinkSVGFECompositeElement.in1_Getter(this);
+  AnimatedString get in1 => _blink.BlinkSVGFECompositeElement.instance.in1_Getter_(this);
 
   @DomName('SVGFECompositeElement.in2')
   @DocsEditable()
-  AnimatedString get in2 => _blink.BlinkSVGFECompositeElement.in2_Getter(this);
+  AnimatedString get in2 => _blink.BlinkSVGFECompositeElement.instance.in2_Getter_(this);
 
   @DomName('SVGFECompositeElement.k1')
   @DocsEditable()
-  AnimatedNumber get k1 => _blink.BlinkSVGFECompositeElement.k1_Getter(this);
+  AnimatedNumber get k1 => _blink.BlinkSVGFECompositeElement.instance.k1_Getter_(this);
 
   @DomName('SVGFECompositeElement.k2')
   @DocsEditable()
-  AnimatedNumber get k2 => _blink.BlinkSVGFECompositeElement.k2_Getter(this);
+  AnimatedNumber get k2 => _blink.BlinkSVGFECompositeElement.instance.k2_Getter_(this);
 
   @DomName('SVGFECompositeElement.k3')
   @DocsEditable()
-  AnimatedNumber get k3 => _blink.BlinkSVGFECompositeElement.k3_Getter(this);
+  AnimatedNumber get k3 => _blink.BlinkSVGFECompositeElement.instance.k3_Getter_(this);
 
   @DomName('SVGFECompositeElement.k4')
   @DocsEditable()
-  AnimatedNumber get k4 => _blink.BlinkSVGFECompositeElement.k4_Getter(this);
+  AnimatedNumber get k4 => _blink.BlinkSVGFECompositeElement.instance.k4_Getter_(this);
 
   @DomName('SVGFECompositeElement.operator')
   @DocsEditable()
-  AnimatedEnumeration get operator => _blink.BlinkSVGFECompositeElement.operator_Getter(this);
+  AnimatedEnumeration get operator => _blink.BlinkSVGFECompositeElement.instance.operator_Getter_(this);
 
   @DomName('SVGFECompositeElement.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.BlinkSVGFECompositeElement.height_Getter(this);
+  AnimatedLength get height => _blink.BlinkSVGFECompositeElement.instance.height_Getter_(this);
 
   @DomName('SVGFECompositeElement.result')
   @DocsEditable()
-  AnimatedString get result => _blink.BlinkSVGFECompositeElement.result_Getter(this);
+  AnimatedString get result => _blink.BlinkSVGFECompositeElement.instance.result_Getter_(this);
 
   @DomName('SVGFECompositeElement.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.BlinkSVGFECompositeElement.width_Getter(this);
+  AnimatedLength get width => _blink.BlinkSVGFECompositeElement.instance.width_Getter_(this);
 
   @DomName('SVGFECompositeElement.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.BlinkSVGFECompositeElement.x_Getter(this);
+  AnimatedLength get x => _blink.BlinkSVGFECompositeElement.instance.x_Getter_(this);
 
   @DomName('SVGFECompositeElement.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.BlinkSVGFECompositeElement.y_Getter(this);
+  AnimatedLength get y => _blink.BlinkSVGFECompositeElement.instance.y_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1341,71 +1341,71 @@
 
   @DomName('SVGFEConvolveMatrixElement.bias')
   @DocsEditable()
-  AnimatedNumber get bias => _blink.BlinkSVGFEConvolveMatrixElement.bias_Getter(this);
+  AnimatedNumber get bias => _blink.BlinkSVGFEConvolveMatrixElement.instance.bias_Getter_(this);
 
   @DomName('SVGFEConvolveMatrixElement.divisor')
   @DocsEditable()
-  AnimatedNumber get divisor => _blink.BlinkSVGFEConvolveMatrixElement.divisor_Getter(this);
+  AnimatedNumber get divisor => _blink.BlinkSVGFEConvolveMatrixElement.instance.divisor_Getter_(this);
 
   @DomName('SVGFEConvolveMatrixElement.edgeMode')
   @DocsEditable()
-  AnimatedEnumeration get edgeMode => _blink.BlinkSVGFEConvolveMatrixElement.edgeMode_Getter(this);
+  AnimatedEnumeration get edgeMode => _blink.BlinkSVGFEConvolveMatrixElement.instance.edgeMode_Getter_(this);
 
   @DomName('SVGFEConvolveMatrixElement.in1')
   @DocsEditable()
-  AnimatedString get in1 => _blink.BlinkSVGFEConvolveMatrixElement.in1_Getter(this);
+  AnimatedString get in1 => _blink.BlinkSVGFEConvolveMatrixElement.instance.in1_Getter_(this);
 
   @DomName('SVGFEConvolveMatrixElement.kernelMatrix')
   @DocsEditable()
-  AnimatedNumberList get kernelMatrix => _blink.BlinkSVGFEConvolveMatrixElement.kernelMatrix_Getter(this);
+  AnimatedNumberList get kernelMatrix => _blink.BlinkSVGFEConvolveMatrixElement.instance.kernelMatrix_Getter_(this);
 
   @DomName('SVGFEConvolveMatrixElement.kernelUnitLengthX')
   @DocsEditable()
-  AnimatedNumber get kernelUnitLengthX => _blink.BlinkSVGFEConvolveMatrixElement.kernelUnitLengthX_Getter(this);
+  AnimatedNumber get kernelUnitLengthX => _blink.BlinkSVGFEConvolveMatrixElement.instance.kernelUnitLengthX_Getter_(this);
 
   @DomName('SVGFEConvolveMatrixElement.kernelUnitLengthY')
   @DocsEditable()
-  AnimatedNumber get kernelUnitLengthY => _blink.BlinkSVGFEConvolveMatrixElement.kernelUnitLengthY_Getter(this);
+  AnimatedNumber get kernelUnitLengthY => _blink.BlinkSVGFEConvolveMatrixElement.instance.kernelUnitLengthY_Getter_(this);
 
   @DomName('SVGFEConvolveMatrixElement.orderX')
   @DocsEditable()
-  AnimatedInteger get orderX => _blink.BlinkSVGFEConvolveMatrixElement.orderX_Getter(this);
+  AnimatedInteger get orderX => _blink.BlinkSVGFEConvolveMatrixElement.instance.orderX_Getter_(this);
 
   @DomName('SVGFEConvolveMatrixElement.orderY')
   @DocsEditable()
-  AnimatedInteger get orderY => _blink.BlinkSVGFEConvolveMatrixElement.orderY_Getter(this);
+  AnimatedInteger get orderY => _blink.BlinkSVGFEConvolveMatrixElement.instance.orderY_Getter_(this);
 
   @DomName('SVGFEConvolveMatrixElement.preserveAlpha')
   @DocsEditable()
-  AnimatedBoolean get preserveAlpha => _blink.BlinkSVGFEConvolveMatrixElement.preserveAlpha_Getter(this);
+  AnimatedBoolean get preserveAlpha => _blink.BlinkSVGFEConvolveMatrixElement.instance.preserveAlpha_Getter_(this);
 
   @DomName('SVGFEConvolveMatrixElement.targetX')
   @DocsEditable()
-  AnimatedInteger get targetX => _blink.BlinkSVGFEConvolveMatrixElement.targetX_Getter(this);
+  AnimatedInteger get targetX => _blink.BlinkSVGFEConvolveMatrixElement.instance.targetX_Getter_(this);
 
   @DomName('SVGFEConvolveMatrixElement.targetY')
   @DocsEditable()
-  AnimatedInteger get targetY => _blink.BlinkSVGFEConvolveMatrixElement.targetY_Getter(this);
+  AnimatedInteger get targetY => _blink.BlinkSVGFEConvolveMatrixElement.instance.targetY_Getter_(this);
 
   @DomName('SVGFEConvolveMatrixElement.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.BlinkSVGFEConvolveMatrixElement.height_Getter(this);
+  AnimatedLength get height => _blink.BlinkSVGFEConvolveMatrixElement.instance.height_Getter_(this);
 
   @DomName('SVGFEConvolveMatrixElement.result')
   @DocsEditable()
-  AnimatedString get result => _blink.BlinkSVGFEConvolveMatrixElement.result_Getter(this);
+  AnimatedString get result => _blink.BlinkSVGFEConvolveMatrixElement.instance.result_Getter_(this);
 
   @DomName('SVGFEConvolveMatrixElement.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.BlinkSVGFEConvolveMatrixElement.width_Getter(this);
+  AnimatedLength get width => _blink.BlinkSVGFEConvolveMatrixElement.instance.width_Getter_(this);
 
   @DomName('SVGFEConvolveMatrixElement.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.BlinkSVGFEConvolveMatrixElement.x_Getter(this);
+  AnimatedLength get x => _blink.BlinkSVGFEConvolveMatrixElement.instance.x_Getter_(this);
 
   @DomName('SVGFEConvolveMatrixElement.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.BlinkSVGFEConvolveMatrixElement.y_Getter(this);
+  AnimatedLength get y => _blink.BlinkSVGFEConvolveMatrixElement.instance.y_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1441,43 +1441,43 @@
 
   @DomName('SVGFEDiffuseLightingElement.diffuseConstant')
   @DocsEditable()
-  AnimatedNumber get diffuseConstant => _blink.BlinkSVGFEDiffuseLightingElement.diffuseConstant_Getter(this);
+  AnimatedNumber get diffuseConstant => _blink.BlinkSVGFEDiffuseLightingElement.instance.diffuseConstant_Getter_(this);
 
   @DomName('SVGFEDiffuseLightingElement.in1')
   @DocsEditable()
-  AnimatedString get in1 => _blink.BlinkSVGFEDiffuseLightingElement.in1_Getter(this);
+  AnimatedString get in1 => _blink.BlinkSVGFEDiffuseLightingElement.instance.in1_Getter_(this);
 
   @DomName('SVGFEDiffuseLightingElement.kernelUnitLengthX')
   @DocsEditable()
-  AnimatedNumber get kernelUnitLengthX => _blink.BlinkSVGFEDiffuseLightingElement.kernelUnitLengthX_Getter(this);
+  AnimatedNumber get kernelUnitLengthX => _blink.BlinkSVGFEDiffuseLightingElement.instance.kernelUnitLengthX_Getter_(this);
 
   @DomName('SVGFEDiffuseLightingElement.kernelUnitLengthY')
   @DocsEditable()
-  AnimatedNumber get kernelUnitLengthY => _blink.BlinkSVGFEDiffuseLightingElement.kernelUnitLengthY_Getter(this);
+  AnimatedNumber get kernelUnitLengthY => _blink.BlinkSVGFEDiffuseLightingElement.instance.kernelUnitLengthY_Getter_(this);
 
   @DomName('SVGFEDiffuseLightingElement.surfaceScale')
   @DocsEditable()
-  AnimatedNumber get surfaceScale => _blink.BlinkSVGFEDiffuseLightingElement.surfaceScale_Getter(this);
+  AnimatedNumber get surfaceScale => _blink.BlinkSVGFEDiffuseLightingElement.instance.surfaceScale_Getter_(this);
 
   @DomName('SVGFEDiffuseLightingElement.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.BlinkSVGFEDiffuseLightingElement.height_Getter(this);
+  AnimatedLength get height => _blink.BlinkSVGFEDiffuseLightingElement.instance.height_Getter_(this);
 
   @DomName('SVGFEDiffuseLightingElement.result')
   @DocsEditable()
-  AnimatedString get result => _blink.BlinkSVGFEDiffuseLightingElement.result_Getter(this);
+  AnimatedString get result => _blink.BlinkSVGFEDiffuseLightingElement.instance.result_Getter_(this);
 
   @DomName('SVGFEDiffuseLightingElement.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.BlinkSVGFEDiffuseLightingElement.width_Getter(this);
+  AnimatedLength get width => _blink.BlinkSVGFEDiffuseLightingElement.instance.width_Getter_(this);
 
   @DomName('SVGFEDiffuseLightingElement.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.BlinkSVGFEDiffuseLightingElement.x_Getter(this);
+  AnimatedLength get x => _blink.BlinkSVGFEDiffuseLightingElement.instance.x_Getter_(this);
 
   @DomName('SVGFEDiffuseLightingElement.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.BlinkSVGFEDiffuseLightingElement.y_Getter(this);
+  AnimatedLength get y => _blink.BlinkSVGFEDiffuseLightingElement.instance.y_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1533,43 +1533,43 @@
 
   @DomName('SVGFEDisplacementMapElement.in1')
   @DocsEditable()
-  AnimatedString get in1 => _blink.BlinkSVGFEDisplacementMapElement.in1_Getter(this);
+  AnimatedString get in1 => _blink.BlinkSVGFEDisplacementMapElement.instance.in1_Getter_(this);
 
   @DomName('SVGFEDisplacementMapElement.in2')
   @DocsEditable()
-  AnimatedString get in2 => _blink.BlinkSVGFEDisplacementMapElement.in2_Getter(this);
+  AnimatedString get in2 => _blink.BlinkSVGFEDisplacementMapElement.instance.in2_Getter_(this);
 
   @DomName('SVGFEDisplacementMapElement.scale')
   @DocsEditable()
-  AnimatedNumber get scale => _blink.BlinkSVGFEDisplacementMapElement.scale_Getter(this);
+  AnimatedNumber get scale => _blink.BlinkSVGFEDisplacementMapElement.instance.scale_Getter_(this);
 
   @DomName('SVGFEDisplacementMapElement.xChannelSelector')
   @DocsEditable()
-  AnimatedEnumeration get xChannelSelector => _blink.BlinkSVGFEDisplacementMapElement.xChannelSelector_Getter(this);
+  AnimatedEnumeration get xChannelSelector => _blink.BlinkSVGFEDisplacementMapElement.instance.xChannelSelector_Getter_(this);
 
   @DomName('SVGFEDisplacementMapElement.yChannelSelector')
   @DocsEditable()
-  AnimatedEnumeration get yChannelSelector => _blink.BlinkSVGFEDisplacementMapElement.yChannelSelector_Getter(this);
+  AnimatedEnumeration get yChannelSelector => _blink.BlinkSVGFEDisplacementMapElement.instance.yChannelSelector_Getter_(this);
 
   @DomName('SVGFEDisplacementMapElement.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.BlinkSVGFEDisplacementMapElement.height_Getter(this);
+  AnimatedLength get height => _blink.BlinkSVGFEDisplacementMapElement.instance.height_Getter_(this);
 
   @DomName('SVGFEDisplacementMapElement.result')
   @DocsEditable()
-  AnimatedString get result => _blink.BlinkSVGFEDisplacementMapElement.result_Getter(this);
+  AnimatedString get result => _blink.BlinkSVGFEDisplacementMapElement.instance.result_Getter_(this);
 
   @DomName('SVGFEDisplacementMapElement.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.BlinkSVGFEDisplacementMapElement.width_Getter(this);
+  AnimatedLength get width => _blink.BlinkSVGFEDisplacementMapElement.instance.width_Getter_(this);
 
   @DomName('SVGFEDisplacementMapElement.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.BlinkSVGFEDisplacementMapElement.x_Getter(this);
+  AnimatedLength get x => _blink.BlinkSVGFEDisplacementMapElement.instance.x_Getter_(this);
 
   @DomName('SVGFEDisplacementMapElement.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.BlinkSVGFEDisplacementMapElement.y_Getter(this);
+  AnimatedLength get y => _blink.BlinkSVGFEDisplacementMapElement.instance.y_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1605,11 +1605,11 @@
 
   @DomName('SVGFEDistantLightElement.azimuth')
   @DocsEditable()
-  AnimatedNumber get azimuth => _blink.BlinkSVGFEDistantLightElement.azimuth_Getter(this);
+  AnimatedNumber get azimuth => _blink.BlinkSVGFEDistantLightElement.instance.azimuth_Getter_(this);
 
   @DomName('SVGFEDistantLightElement.elevation')
   @DocsEditable()
-  AnimatedNumber get elevation => _blink.BlinkSVGFEDistantLightElement.elevation_Getter(this);
+  AnimatedNumber get elevation => _blink.BlinkSVGFEDistantLightElement.instance.elevation_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1645,23 +1645,23 @@
 
   @DomName('SVGFEFloodElement.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.BlinkSVGFEFloodElement.height_Getter(this);
+  AnimatedLength get height => _blink.BlinkSVGFEFloodElement.instance.height_Getter_(this);
 
   @DomName('SVGFEFloodElement.result')
   @DocsEditable()
-  AnimatedString get result => _blink.BlinkSVGFEFloodElement.result_Getter(this);
+  AnimatedString get result => _blink.BlinkSVGFEFloodElement.instance.result_Getter_(this);
 
   @DomName('SVGFEFloodElement.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.BlinkSVGFEFloodElement.width_Getter(this);
+  AnimatedLength get width => _blink.BlinkSVGFEFloodElement.instance.width_Getter_(this);
 
   @DomName('SVGFEFloodElement.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.BlinkSVGFEFloodElement.x_Getter(this);
+  AnimatedLength get x => _blink.BlinkSVGFEFloodElement.instance.x_Getter_(this);
 
   @DomName('SVGFEFloodElement.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.BlinkSVGFEFloodElement.y_Getter(this);
+  AnimatedLength get y => _blink.BlinkSVGFEFloodElement.instance.y_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1825,39 +1825,39 @@
 
   @DomName('SVGFEGaussianBlurElement.in1')
   @DocsEditable()
-  AnimatedString get in1 => _blink.BlinkSVGFEGaussianBlurElement.in1_Getter(this);
+  AnimatedString get in1 => _blink.BlinkSVGFEGaussianBlurElement.instance.in1_Getter_(this);
 
   @DomName('SVGFEGaussianBlurElement.stdDeviationX')
   @DocsEditable()
-  AnimatedNumber get stdDeviationX => _blink.BlinkSVGFEGaussianBlurElement.stdDeviationX_Getter(this);
+  AnimatedNumber get stdDeviationX => _blink.BlinkSVGFEGaussianBlurElement.instance.stdDeviationX_Getter_(this);
 
   @DomName('SVGFEGaussianBlurElement.stdDeviationY')
   @DocsEditable()
-  AnimatedNumber get stdDeviationY => _blink.BlinkSVGFEGaussianBlurElement.stdDeviationY_Getter(this);
+  AnimatedNumber get stdDeviationY => _blink.BlinkSVGFEGaussianBlurElement.instance.stdDeviationY_Getter_(this);
 
   @DomName('SVGFEGaussianBlurElement.setStdDeviation')
   @DocsEditable()
-  void setStdDeviation(num stdDeviationX, num stdDeviationY) => _blink.BlinkSVGFEGaussianBlurElement.setStdDeviation_Callback_2(this, stdDeviationX, stdDeviationY);
+  void setStdDeviation(num stdDeviationX, num stdDeviationY) => _blink.BlinkSVGFEGaussianBlurElement.instance.setStdDeviation_Callback_2_(this, stdDeviationX, stdDeviationY);
 
   @DomName('SVGFEGaussianBlurElement.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.BlinkSVGFEGaussianBlurElement.height_Getter(this);
+  AnimatedLength get height => _blink.BlinkSVGFEGaussianBlurElement.instance.height_Getter_(this);
 
   @DomName('SVGFEGaussianBlurElement.result')
   @DocsEditable()
-  AnimatedString get result => _blink.BlinkSVGFEGaussianBlurElement.result_Getter(this);
+  AnimatedString get result => _blink.BlinkSVGFEGaussianBlurElement.instance.result_Getter_(this);
 
   @DomName('SVGFEGaussianBlurElement.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.BlinkSVGFEGaussianBlurElement.width_Getter(this);
+  AnimatedLength get width => _blink.BlinkSVGFEGaussianBlurElement.instance.width_Getter_(this);
 
   @DomName('SVGFEGaussianBlurElement.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.BlinkSVGFEGaussianBlurElement.x_Getter(this);
+  AnimatedLength get x => _blink.BlinkSVGFEGaussianBlurElement.instance.x_Getter_(this);
 
   @DomName('SVGFEGaussianBlurElement.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.BlinkSVGFEGaussianBlurElement.y_Getter(this);
+  AnimatedLength get y => _blink.BlinkSVGFEGaussianBlurElement.instance.y_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1893,31 +1893,31 @@
 
   @DomName('SVGFEImageElement.preserveAspectRatio')
   @DocsEditable()
-  AnimatedPreserveAspectRatio get preserveAspectRatio => _blink.BlinkSVGFEImageElement.preserveAspectRatio_Getter(this);
+  AnimatedPreserveAspectRatio get preserveAspectRatio => _blink.BlinkSVGFEImageElement.instance.preserveAspectRatio_Getter_(this);
 
   @DomName('SVGFEImageElement.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.BlinkSVGFEImageElement.height_Getter(this);
+  AnimatedLength get height => _blink.BlinkSVGFEImageElement.instance.height_Getter_(this);
 
   @DomName('SVGFEImageElement.result')
   @DocsEditable()
-  AnimatedString get result => _blink.BlinkSVGFEImageElement.result_Getter(this);
+  AnimatedString get result => _blink.BlinkSVGFEImageElement.instance.result_Getter_(this);
 
   @DomName('SVGFEImageElement.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.BlinkSVGFEImageElement.width_Getter(this);
+  AnimatedLength get width => _blink.BlinkSVGFEImageElement.instance.width_Getter_(this);
 
   @DomName('SVGFEImageElement.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.BlinkSVGFEImageElement.x_Getter(this);
+  AnimatedLength get x => _blink.BlinkSVGFEImageElement.instance.x_Getter_(this);
 
   @DomName('SVGFEImageElement.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.BlinkSVGFEImageElement.y_Getter(this);
+  AnimatedLength get y => _blink.BlinkSVGFEImageElement.instance.y_Getter_(this);
 
   @DomName('SVGFEImageElement.href')
   @DocsEditable()
-  AnimatedString get href => _blink.BlinkSVGFEImageElement.href_Getter(this);
+  AnimatedString get href => _blink.BlinkSVGFEImageElement.instance.href_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1953,23 +1953,23 @@
 
   @DomName('SVGFEMergeElement.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.BlinkSVGFEMergeElement.height_Getter(this);
+  AnimatedLength get height => _blink.BlinkSVGFEMergeElement.instance.height_Getter_(this);
 
   @DomName('SVGFEMergeElement.result')
   @DocsEditable()
-  AnimatedString get result => _blink.BlinkSVGFEMergeElement.result_Getter(this);
+  AnimatedString get result => _blink.BlinkSVGFEMergeElement.instance.result_Getter_(this);
 
   @DomName('SVGFEMergeElement.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.BlinkSVGFEMergeElement.width_Getter(this);
+  AnimatedLength get width => _blink.BlinkSVGFEMergeElement.instance.width_Getter_(this);
 
   @DomName('SVGFEMergeElement.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.BlinkSVGFEMergeElement.x_Getter(this);
+  AnimatedLength get x => _blink.BlinkSVGFEMergeElement.instance.x_Getter_(this);
 
   @DomName('SVGFEMergeElement.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.BlinkSVGFEMergeElement.y_Getter(this);
+  AnimatedLength get y => _blink.BlinkSVGFEMergeElement.instance.y_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2005,7 +2005,7 @@
 
   @DomName('SVGFEMergeNodeElement.in1')
   @DocsEditable()
-  AnimatedString get in1 => _blink.BlinkSVGFEMergeNodeElement.in1_Getter(this);
+  AnimatedString get in1 => _blink.BlinkSVGFEMergeNodeElement.instance.in1_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2046,39 +2046,39 @@
 
   @DomName('SVGFEMorphologyElement.in1')
   @DocsEditable()
-  AnimatedString get in1 => _blink.BlinkSVGFEMorphologyElement.in1_Getter(this);
+  AnimatedString get in1 => _blink.BlinkSVGFEMorphologyElement.instance.in1_Getter_(this);
 
   @DomName('SVGFEMorphologyElement.operator')
   @DocsEditable()
-  AnimatedEnumeration get operator => _blink.BlinkSVGFEMorphologyElement.operator_Getter(this);
+  AnimatedEnumeration get operator => _blink.BlinkSVGFEMorphologyElement.instance.operator_Getter_(this);
 
   @DomName('SVGFEMorphologyElement.radiusX')
   @DocsEditable()
-  AnimatedNumber get radiusX => _blink.BlinkSVGFEMorphologyElement.radiusX_Getter(this);
+  AnimatedNumber get radiusX => _blink.BlinkSVGFEMorphologyElement.instance.radiusX_Getter_(this);
 
   @DomName('SVGFEMorphologyElement.radiusY')
   @DocsEditable()
-  AnimatedNumber get radiusY => _blink.BlinkSVGFEMorphologyElement.radiusY_Getter(this);
+  AnimatedNumber get radiusY => _blink.BlinkSVGFEMorphologyElement.instance.radiusY_Getter_(this);
 
   @DomName('SVGFEMorphologyElement.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.BlinkSVGFEMorphologyElement.height_Getter(this);
+  AnimatedLength get height => _blink.BlinkSVGFEMorphologyElement.instance.height_Getter_(this);
 
   @DomName('SVGFEMorphologyElement.result')
   @DocsEditable()
-  AnimatedString get result => _blink.BlinkSVGFEMorphologyElement.result_Getter(this);
+  AnimatedString get result => _blink.BlinkSVGFEMorphologyElement.instance.result_Getter_(this);
 
   @DomName('SVGFEMorphologyElement.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.BlinkSVGFEMorphologyElement.width_Getter(this);
+  AnimatedLength get width => _blink.BlinkSVGFEMorphologyElement.instance.width_Getter_(this);
 
   @DomName('SVGFEMorphologyElement.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.BlinkSVGFEMorphologyElement.x_Getter(this);
+  AnimatedLength get x => _blink.BlinkSVGFEMorphologyElement.instance.x_Getter_(this);
 
   @DomName('SVGFEMorphologyElement.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.BlinkSVGFEMorphologyElement.y_Getter(this);
+  AnimatedLength get y => _blink.BlinkSVGFEMorphologyElement.instance.y_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2114,35 +2114,35 @@
 
   @DomName('SVGFEOffsetElement.dx')
   @DocsEditable()
-  AnimatedNumber get dx => _blink.BlinkSVGFEOffsetElement.dx_Getter(this);
+  AnimatedNumber get dx => _blink.BlinkSVGFEOffsetElement.instance.dx_Getter_(this);
 
   @DomName('SVGFEOffsetElement.dy')
   @DocsEditable()
-  AnimatedNumber get dy => _blink.BlinkSVGFEOffsetElement.dy_Getter(this);
+  AnimatedNumber get dy => _blink.BlinkSVGFEOffsetElement.instance.dy_Getter_(this);
 
   @DomName('SVGFEOffsetElement.in1')
   @DocsEditable()
-  AnimatedString get in1 => _blink.BlinkSVGFEOffsetElement.in1_Getter(this);
+  AnimatedString get in1 => _blink.BlinkSVGFEOffsetElement.instance.in1_Getter_(this);
 
   @DomName('SVGFEOffsetElement.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.BlinkSVGFEOffsetElement.height_Getter(this);
+  AnimatedLength get height => _blink.BlinkSVGFEOffsetElement.instance.height_Getter_(this);
 
   @DomName('SVGFEOffsetElement.result')
   @DocsEditable()
-  AnimatedString get result => _blink.BlinkSVGFEOffsetElement.result_Getter(this);
+  AnimatedString get result => _blink.BlinkSVGFEOffsetElement.instance.result_Getter_(this);
 
   @DomName('SVGFEOffsetElement.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.BlinkSVGFEOffsetElement.width_Getter(this);
+  AnimatedLength get width => _blink.BlinkSVGFEOffsetElement.instance.width_Getter_(this);
 
   @DomName('SVGFEOffsetElement.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.BlinkSVGFEOffsetElement.x_Getter(this);
+  AnimatedLength get x => _blink.BlinkSVGFEOffsetElement.instance.x_Getter_(this);
 
   @DomName('SVGFEOffsetElement.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.BlinkSVGFEOffsetElement.y_Getter(this);
+  AnimatedLength get y => _blink.BlinkSVGFEOffsetElement.instance.y_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2178,15 +2178,15 @@
 
   @DomName('SVGFEPointLightElement.x')
   @DocsEditable()
-  AnimatedNumber get x => _blink.BlinkSVGFEPointLightElement.x_Getter(this);
+  AnimatedNumber get x => _blink.BlinkSVGFEPointLightElement.instance.x_Getter_(this);
 
   @DomName('SVGFEPointLightElement.y')
   @DocsEditable()
-  AnimatedNumber get y => _blink.BlinkSVGFEPointLightElement.y_Getter(this);
+  AnimatedNumber get y => _blink.BlinkSVGFEPointLightElement.instance.y_Getter_(this);
 
   @DomName('SVGFEPointLightElement.z')
   @DocsEditable()
-  AnimatedNumber get z => _blink.BlinkSVGFEPointLightElement.z_Getter(this);
+  AnimatedNumber get z => _blink.BlinkSVGFEPointLightElement.instance.z_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2222,39 +2222,39 @@
 
   @DomName('SVGFESpecularLightingElement.in1')
   @DocsEditable()
-  AnimatedString get in1 => _blink.BlinkSVGFESpecularLightingElement.in1_Getter(this);
+  AnimatedString get in1 => _blink.BlinkSVGFESpecularLightingElement.instance.in1_Getter_(this);
 
   @DomName('SVGFESpecularLightingElement.specularConstant')
   @DocsEditable()
-  AnimatedNumber get specularConstant => _blink.BlinkSVGFESpecularLightingElement.specularConstant_Getter(this);
+  AnimatedNumber get specularConstant => _blink.BlinkSVGFESpecularLightingElement.instance.specularConstant_Getter_(this);
 
   @DomName('SVGFESpecularLightingElement.specularExponent')
   @DocsEditable()
-  AnimatedNumber get specularExponent => _blink.BlinkSVGFESpecularLightingElement.specularExponent_Getter(this);
+  AnimatedNumber get specularExponent => _blink.BlinkSVGFESpecularLightingElement.instance.specularExponent_Getter_(this);
 
   @DomName('SVGFESpecularLightingElement.surfaceScale')
   @DocsEditable()
-  AnimatedNumber get surfaceScale => _blink.BlinkSVGFESpecularLightingElement.surfaceScale_Getter(this);
+  AnimatedNumber get surfaceScale => _blink.BlinkSVGFESpecularLightingElement.instance.surfaceScale_Getter_(this);
 
   @DomName('SVGFESpecularLightingElement.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.BlinkSVGFESpecularLightingElement.height_Getter(this);
+  AnimatedLength get height => _blink.BlinkSVGFESpecularLightingElement.instance.height_Getter_(this);
 
   @DomName('SVGFESpecularLightingElement.result')
   @DocsEditable()
-  AnimatedString get result => _blink.BlinkSVGFESpecularLightingElement.result_Getter(this);
+  AnimatedString get result => _blink.BlinkSVGFESpecularLightingElement.instance.result_Getter_(this);
 
   @DomName('SVGFESpecularLightingElement.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.BlinkSVGFESpecularLightingElement.width_Getter(this);
+  AnimatedLength get width => _blink.BlinkSVGFESpecularLightingElement.instance.width_Getter_(this);
 
   @DomName('SVGFESpecularLightingElement.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.BlinkSVGFESpecularLightingElement.x_Getter(this);
+  AnimatedLength get x => _blink.BlinkSVGFESpecularLightingElement.instance.x_Getter_(this);
 
   @DomName('SVGFESpecularLightingElement.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.BlinkSVGFESpecularLightingElement.y_Getter(this);
+  AnimatedLength get y => _blink.BlinkSVGFESpecularLightingElement.instance.y_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2290,35 +2290,35 @@
 
   @DomName('SVGFESpotLightElement.limitingConeAngle')
   @DocsEditable()
-  AnimatedNumber get limitingConeAngle => _blink.BlinkSVGFESpotLightElement.limitingConeAngle_Getter(this);
+  AnimatedNumber get limitingConeAngle => _blink.BlinkSVGFESpotLightElement.instance.limitingConeAngle_Getter_(this);
 
   @DomName('SVGFESpotLightElement.pointsAtX')
   @DocsEditable()
-  AnimatedNumber get pointsAtX => _blink.BlinkSVGFESpotLightElement.pointsAtX_Getter(this);
+  AnimatedNumber get pointsAtX => _blink.BlinkSVGFESpotLightElement.instance.pointsAtX_Getter_(this);
 
   @DomName('SVGFESpotLightElement.pointsAtY')
   @DocsEditable()
-  AnimatedNumber get pointsAtY => _blink.BlinkSVGFESpotLightElement.pointsAtY_Getter(this);
+  AnimatedNumber get pointsAtY => _blink.BlinkSVGFESpotLightElement.instance.pointsAtY_Getter_(this);
 
   @DomName('SVGFESpotLightElement.pointsAtZ')
   @DocsEditable()
-  AnimatedNumber get pointsAtZ => _blink.BlinkSVGFESpotLightElement.pointsAtZ_Getter(this);
+  AnimatedNumber get pointsAtZ => _blink.BlinkSVGFESpotLightElement.instance.pointsAtZ_Getter_(this);
 
   @DomName('SVGFESpotLightElement.specularExponent')
   @DocsEditable()
-  AnimatedNumber get specularExponent => _blink.BlinkSVGFESpotLightElement.specularExponent_Getter(this);
+  AnimatedNumber get specularExponent => _blink.BlinkSVGFESpotLightElement.instance.specularExponent_Getter_(this);
 
   @DomName('SVGFESpotLightElement.x')
   @DocsEditable()
-  AnimatedNumber get x => _blink.BlinkSVGFESpotLightElement.x_Getter(this);
+  AnimatedNumber get x => _blink.BlinkSVGFESpotLightElement.instance.x_Getter_(this);
 
   @DomName('SVGFESpotLightElement.y')
   @DocsEditable()
-  AnimatedNumber get y => _blink.BlinkSVGFESpotLightElement.y_Getter(this);
+  AnimatedNumber get y => _blink.BlinkSVGFESpotLightElement.instance.y_Getter_(this);
 
   @DomName('SVGFESpotLightElement.z')
   @DocsEditable()
-  AnimatedNumber get z => _blink.BlinkSVGFESpotLightElement.z_Getter(this);
+  AnimatedNumber get z => _blink.BlinkSVGFESpotLightElement.instance.z_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2354,27 +2354,27 @@
 
   @DomName('SVGFETileElement.in1')
   @DocsEditable()
-  AnimatedString get in1 => _blink.BlinkSVGFETileElement.in1_Getter(this);
+  AnimatedString get in1 => _blink.BlinkSVGFETileElement.instance.in1_Getter_(this);
 
   @DomName('SVGFETileElement.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.BlinkSVGFETileElement.height_Getter(this);
+  AnimatedLength get height => _blink.BlinkSVGFETileElement.instance.height_Getter_(this);
 
   @DomName('SVGFETileElement.result')
   @DocsEditable()
-  AnimatedString get result => _blink.BlinkSVGFETileElement.result_Getter(this);
+  AnimatedString get result => _blink.BlinkSVGFETileElement.instance.result_Getter_(this);
 
   @DomName('SVGFETileElement.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.BlinkSVGFETileElement.width_Getter(this);
+  AnimatedLength get width => _blink.BlinkSVGFETileElement.instance.width_Getter_(this);
 
   @DomName('SVGFETileElement.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.BlinkSVGFETileElement.x_Getter(this);
+  AnimatedLength get x => _blink.BlinkSVGFETileElement.instance.x_Getter_(this);
 
   @DomName('SVGFETileElement.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.BlinkSVGFETileElement.y_Getter(this);
+  AnimatedLength get y => _blink.BlinkSVGFETileElement.instance.y_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2434,47 +2434,47 @@
 
   @DomName('SVGFETurbulenceElement.baseFrequencyX')
   @DocsEditable()
-  AnimatedNumber get baseFrequencyX => _blink.BlinkSVGFETurbulenceElement.baseFrequencyX_Getter(this);
+  AnimatedNumber get baseFrequencyX => _blink.BlinkSVGFETurbulenceElement.instance.baseFrequencyX_Getter_(this);
 
   @DomName('SVGFETurbulenceElement.baseFrequencyY')
   @DocsEditable()
-  AnimatedNumber get baseFrequencyY => _blink.BlinkSVGFETurbulenceElement.baseFrequencyY_Getter(this);
+  AnimatedNumber get baseFrequencyY => _blink.BlinkSVGFETurbulenceElement.instance.baseFrequencyY_Getter_(this);
 
   @DomName('SVGFETurbulenceElement.numOctaves')
   @DocsEditable()
-  AnimatedInteger get numOctaves => _blink.BlinkSVGFETurbulenceElement.numOctaves_Getter(this);
+  AnimatedInteger get numOctaves => _blink.BlinkSVGFETurbulenceElement.instance.numOctaves_Getter_(this);
 
   @DomName('SVGFETurbulenceElement.seed')
   @DocsEditable()
-  AnimatedNumber get seed => _blink.BlinkSVGFETurbulenceElement.seed_Getter(this);
+  AnimatedNumber get seed => _blink.BlinkSVGFETurbulenceElement.instance.seed_Getter_(this);
 
   @DomName('SVGFETurbulenceElement.stitchTiles')
   @DocsEditable()
-  AnimatedEnumeration get stitchTiles => _blink.BlinkSVGFETurbulenceElement.stitchTiles_Getter(this);
+  AnimatedEnumeration get stitchTiles => _blink.BlinkSVGFETurbulenceElement.instance.stitchTiles_Getter_(this);
 
   @DomName('SVGFETurbulenceElement.type')
   @DocsEditable()
-  AnimatedEnumeration get type => _blink.BlinkSVGFETurbulenceElement.type_Getter(this);
+  AnimatedEnumeration get type => _blink.BlinkSVGFETurbulenceElement.instance.type_Getter_(this);
 
   @DomName('SVGFETurbulenceElement.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.BlinkSVGFETurbulenceElement.height_Getter(this);
+  AnimatedLength get height => _blink.BlinkSVGFETurbulenceElement.instance.height_Getter_(this);
 
   @DomName('SVGFETurbulenceElement.result')
   @DocsEditable()
-  AnimatedString get result => _blink.BlinkSVGFETurbulenceElement.result_Getter(this);
+  AnimatedString get result => _blink.BlinkSVGFETurbulenceElement.instance.result_Getter_(this);
 
   @DomName('SVGFETurbulenceElement.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.BlinkSVGFETurbulenceElement.width_Getter(this);
+  AnimatedLength get width => _blink.BlinkSVGFETurbulenceElement.instance.width_Getter_(this);
 
   @DomName('SVGFETurbulenceElement.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.BlinkSVGFETurbulenceElement.x_Getter(this);
+  AnimatedLength get x => _blink.BlinkSVGFETurbulenceElement.instance.x_Getter_(this);
 
   @DomName('SVGFETurbulenceElement.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.BlinkSVGFETurbulenceElement.y_Getter(this);
+  AnimatedLength get y => _blink.BlinkSVGFETurbulenceElement.instance.y_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2510,43 +2510,43 @@
 
   @DomName('SVGFilterElement.filterResX')
   @DocsEditable()
-  AnimatedInteger get filterResX => _blink.BlinkSVGFilterElement.filterResX_Getter(this);
+  AnimatedInteger get filterResX => _blink.BlinkSVGFilterElement.instance.filterResX_Getter_(this);
 
   @DomName('SVGFilterElement.filterResY')
   @DocsEditable()
-  AnimatedInteger get filterResY => _blink.BlinkSVGFilterElement.filterResY_Getter(this);
+  AnimatedInteger get filterResY => _blink.BlinkSVGFilterElement.instance.filterResY_Getter_(this);
 
   @DomName('SVGFilterElement.filterUnits')
   @DocsEditable()
-  AnimatedEnumeration get filterUnits => _blink.BlinkSVGFilterElement.filterUnits_Getter(this);
+  AnimatedEnumeration get filterUnits => _blink.BlinkSVGFilterElement.instance.filterUnits_Getter_(this);
 
   @DomName('SVGFilterElement.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.BlinkSVGFilterElement.height_Getter(this);
+  AnimatedLength get height => _blink.BlinkSVGFilterElement.instance.height_Getter_(this);
 
   @DomName('SVGFilterElement.primitiveUnits')
   @DocsEditable()
-  AnimatedEnumeration get primitiveUnits => _blink.BlinkSVGFilterElement.primitiveUnits_Getter(this);
+  AnimatedEnumeration get primitiveUnits => _blink.BlinkSVGFilterElement.instance.primitiveUnits_Getter_(this);
 
   @DomName('SVGFilterElement.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.BlinkSVGFilterElement.width_Getter(this);
+  AnimatedLength get width => _blink.BlinkSVGFilterElement.instance.width_Getter_(this);
 
   @DomName('SVGFilterElement.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.BlinkSVGFilterElement.x_Getter(this);
+  AnimatedLength get x => _blink.BlinkSVGFilterElement.instance.x_Getter_(this);
 
   @DomName('SVGFilterElement.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.BlinkSVGFilterElement.y_Getter(this);
+  AnimatedLength get y => _blink.BlinkSVGFilterElement.instance.y_Getter_(this);
 
   @DomName('SVGFilterElement.setFilterRes')
   @DocsEditable()
-  void setFilterRes(int filterResX, int filterResY) => _blink.BlinkSVGFilterElement.setFilterRes_Callback_2(this, filterResX, filterResY);
+  void setFilterRes(int filterResX, int filterResY) => _blink.BlinkSVGFilterElement.instance.setFilterRes_Callback_2_(this, filterResX, filterResY);
 
   @DomName('SVGFilterElement.href')
   @DocsEditable()
-  AnimatedString get href => _blink.BlinkSVGFilterElement.href_Getter(this);
+  AnimatedString get href => _blink.BlinkSVGFilterElement.instance.href_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2565,23 +2565,23 @@
 
   @DomName('SVGFilterPrimitiveStandardAttributes.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.BlinkSVGFilterPrimitiveStandardAttributes.height_Getter(this);
+  AnimatedLength get height;
 
   @DomName('SVGFilterPrimitiveStandardAttributes.result')
   @DocsEditable()
-  AnimatedString get result => _blink.BlinkSVGFilterPrimitiveStandardAttributes.result_Getter(this);
+  AnimatedString get result;
 
   @DomName('SVGFilterPrimitiveStandardAttributes.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.BlinkSVGFilterPrimitiveStandardAttributes.width_Getter(this);
+  AnimatedLength get width;
 
   @DomName('SVGFilterPrimitiveStandardAttributes.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.BlinkSVGFilterPrimitiveStandardAttributes.x_Getter(this);
+  AnimatedLength get x;
 
   @DomName('SVGFilterPrimitiveStandardAttributes.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.BlinkSVGFilterPrimitiveStandardAttributes.y_Getter(this);
+  AnimatedLength get y;
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2600,11 +2600,11 @@
 
   @DomName('SVGFitToViewBox.preserveAspectRatio')
   @DocsEditable()
-  AnimatedPreserveAspectRatio get preserveAspectRatio => _blink.BlinkSVGFitToViewBox.preserveAspectRatio_Getter(this);
+  AnimatedPreserveAspectRatio get preserveAspectRatio;
 
   @DomName('SVGFitToViewBox.viewBox')
   @DocsEditable()
-  AnimatedRect get viewBox => _blink.BlinkSVGFitToViewBox.viewBox_Getter(this);
+  AnimatedRect get viewBox;
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2639,19 +2639,19 @@
 
   @DomName('SVGForeignObjectElement.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.BlinkSVGForeignObjectElement.height_Getter(this);
+  AnimatedLength get height => _blink.BlinkSVGForeignObjectElement.instance.height_Getter_(this);
 
   @DomName('SVGForeignObjectElement.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.BlinkSVGForeignObjectElement.width_Getter(this);
+  AnimatedLength get width => _blink.BlinkSVGForeignObjectElement.instance.width_Getter_(this);
 
   @DomName('SVGForeignObjectElement.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.BlinkSVGForeignObjectElement.x_Getter(this);
+  AnimatedLength get x => _blink.BlinkSVGForeignObjectElement.instance.x_Getter_(this);
 
   @DomName('SVGForeignObjectElement.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.BlinkSVGForeignObjectElement.y_Getter(this);
+  AnimatedLength get y => _blink.BlinkSVGForeignObjectElement.instance.y_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2702,12 +2702,12 @@
   @DomName('SVGGeometryElement.isPointInFill')
   @DocsEditable()
   @Experimental() // untriaged
-  bool isPointInFill(Point point) => _blink.BlinkSVGGeometryElement.isPointInFill_Callback_1(this, point);
+  bool isPointInFill(Point point) => _blink.BlinkSVGGeometryElement.instance.isPointInFill_Callback_1_(this, point);
 
   @DomName('SVGGeometryElement.isPointInStroke')
   @DocsEditable()
   @Experimental() // untriaged
-  bool isPointInStroke(Point point) => _blink.BlinkSVGGeometryElement.isPointInStroke_Callback_1(this, point);
+  bool isPointInStroke(Point point) => _blink.BlinkSVGGeometryElement.instance.isPointInStroke_Callback_1_(this, point);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2733,57 +2733,57 @@
   @DomName('SVGGraphicsElement.farthestViewportElement')
   @DocsEditable()
   @Experimental() // untriaged
-  SvgElement get farthestViewportElement => _blink.BlinkSVGGraphicsElement.farthestViewportElement_Getter(this);
+  SvgElement get farthestViewportElement => _blink.BlinkSVGGraphicsElement.instance.farthestViewportElement_Getter_(this);
 
   @DomName('SVGGraphicsElement.nearestViewportElement')
   @DocsEditable()
   @Experimental() // untriaged
-  SvgElement get nearestViewportElement => _blink.BlinkSVGGraphicsElement.nearestViewportElement_Getter(this);
+  SvgElement get nearestViewportElement => _blink.BlinkSVGGraphicsElement.instance.nearestViewportElement_Getter_(this);
 
   @DomName('SVGGraphicsElement.transform')
   @DocsEditable()
   @Experimental() // untriaged
-  AnimatedTransformList get transform => _blink.BlinkSVGGraphicsElement.transform_Getter(this);
+  AnimatedTransformList get transform => _blink.BlinkSVGGraphicsElement.instance.transform_Getter_(this);
 
   @DomName('SVGGraphicsElement.getBBox')
   @DocsEditable()
   @Experimental() // untriaged
-  Rect getBBox() => _blink.BlinkSVGGraphicsElement.getBBox_Callback(this);
+  Rect getBBox() => _blink.BlinkSVGGraphicsElement.instance.getBBox_Callback_0_(this);
 
   @DomName('SVGGraphicsElement.getCTM')
   @DocsEditable()
   @Experimental() // untriaged
-  Matrix getCtm() => _blink.BlinkSVGGraphicsElement.getCTM_Callback(this);
+  Matrix getCtm() => _blink.BlinkSVGGraphicsElement.instance.getCTM_Callback_0_(this);
 
   @DomName('SVGGraphicsElement.getScreenCTM')
   @DocsEditable()
   @Experimental() // untriaged
-  Matrix getScreenCtm() => _blink.BlinkSVGGraphicsElement.getScreenCTM_Callback(this);
+  Matrix getScreenCtm() => _blink.BlinkSVGGraphicsElement.instance.getScreenCTM_Callback_0_(this);
 
   @DomName('SVGGraphicsElement.getTransformToElement')
   @DocsEditable()
   @Experimental() // untriaged
-  Matrix getTransformToElement(SvgElement element) => _blink.BlinkSVGGraphicsElement.getTransformToElement_Callback_1(this, element);
+  Matrix getTransformToElement(SvgElement element) => _blink.BlinkSVGGraphicsElement.instance.getTransformToElement_Callback_1_(this, element);
 
   @DomName('SVGGraphicsElement.requiredExtensions')
   @DocsEditable()
   @Experimental() // untriaged
-  StringList get requiredExtensions => _blink.BlinkSVGGraphicsElement.requiredExtensions_Getter(this);
+  StringList get requiredExtensions => _blink.BlinkSVGGraphicsElement.instance.requiredExtensions_Getter_(this);
 
   @DomName('SVGGraphicsElement.requiredFeatures')
   @DocsEditable()
   @Experimental() // untriaged
-  StringList get requiredFeatures => _blink.BlinkSVGGraphicsElement.requiredFeatures_Getter(this);
+  StringList get requiredFeatures => _blink.BlinkSVGGraphicsElement.instance.requiredFeatures_Getter_(this);
 
   @DomName('SVGGraphicsElement.systemLanguage')
   @DocsEditable()
   @Experimental() // untriaged
-  StringList get systemLanguage => _blink.BlinkSVGGraphicsElement.systemLanguage_Getter(this);
+  StringList get systemLanguage => _blink.BlinkSVGGraphicsElement.instance.systemLanguage_Getter_(this);
 
   @DomName('SVGGraphicsElement.hasExtension')
   @DocsEditable()
   @Experimental() // untriaged
-  bool hasExtension(String extension) => _blink.BlinkSVGGraphicsElement.hasExtension_Callback_1(this, extension);
+  bool hasExtension(String extension) => _blink.BlinkSVGGraphicsElement.instance.hasExtension_Callback_1_(this, extension);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2812,27 +2812,27 @@
 
   @DomName('SVGImageElement.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.BlinkSVGImageElement.height_Getter(this);
+  AnimatedLength get height => _blink.BlinkSVGImageElement.instance.height_Getter_(this);
 
   @DomName('SVGImageElement.preserveAspectRatio')
   @DocsEditable()
-  AnimatedPreserveAspectRatio get preserveAspectRatio => _blink.BlinkSVGImageElement.preserveAspectRatio_Getter(this);
+  AnimatedPreserveAspectRatio get preserveAspectRatio => _blink.BlinkSVGImageElement.instance.preserveAspectRatio_Getter_(this);
 
   @DomName('SVGImageElement.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.BlinkSVGImageElement.width_Getter(this);
+  AnimatedLength get width => _blink.BlinkSVGImageElement.instance.width_Getter_(this);
 
   @DomName('SVGImageElement.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.BlinkSVGImageElement.x_Getter(this);
+  AnimatedLength get x => _blink.BlinkSVGImageElement.instance.x_Getter_(this);
 
   @DomName('SVGImageElement.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.BlinkSVGImageElement.y_Getter(this);
+  AnimatedLength get y => _blink.BlinkSVGImageElement.instance.y_Getter_(this);
 
   @DomName('SVGImageElement.href')
   @DocsEditable()
-  AnimatedString get href => _blink.BlinkSVGImageElement.href_Getter(this);
+  AnimatedString get href => _blink.BlinkSVGImageElement.instance.href_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2895,39 +2895,39 @@
 
   @DomName('SVGLength.unitType')
   @DocsEditable()
-  int get unitType => _blink.BlinkSVGLength.unitType_Getter(this);
+  int get unitType => _blink.BlinkSVGLength.instance.unitType_Getter_(this);
 
   @DomName('SVGLength.value')
   @DocsEditable()
-  num get value => _blink.BlinkSVGLength.value_Getter(this);
+  num get value => _blink.BlinkSVGLength.instance.value_Getter_(this);
 
   @DomName('SVGLength.value')
   @DocsEditable()
-  void set value(num value) => _blink.BlinkSVGLength.value_Setter(this, value);
+  void set value(num value) => _blink.BlinkSVGLength.instance.value_Setter_(this, value);
 
   @DomName('SVGLength.valueAsString')
   @DocsEditable()
-  String get valueAsString => _blink.BlinkSVGLength.valueAsString_Getter(this);
+  String get valueAsString => _blink.BlinkSVGLength.instance.valueAsString_Getter_(this);
 
   @DomName('SVGLength.valueAsString')
   @DocsEditable()
-  void set valueAsString(String value) => _blink.BlinkSVGLength.valueAsString_Setter(this, value);
+  void set valueAsString(String value) => _blink.BlinkSVGLength.instance.valueAsString_Setter_(this, value);
 
   @DomName('SVGLength.valueInSpecifiedUnits')
   @DocsEditable()
-  num get valueInSpecifiedUnits => _blink.BlinkSVGLength.valueInSpecifiedUnits_Getter(this);
+  num get valueInSpecifiedUnits => _blink.BlinkSVGLength.instance.valueInSpecifiedUnits_Getter_(this);
 
   @DomName('SVGLength.valueInSpecifiedUnits')
   @DocsEditable()
-  void set valueInSpecifiedUnits(num value) => _blink.BlinkSVGLength.valueInSpecifiedUnits_Setter(this, value);
+  void set valueInSpecifiedUnits(num value) => _blink.BlinkSVGLength.instance.valueInSpecifiedUnits_Setter_(this, value);
 
   @DomName('SVGLength.convertToSpecifiedUnits')
   @DocsEditable()
-  void convertToSpecifiedUnits(int unitType) => _blink.BlinkSVGLength.convertToSpecifiedUnits_Callback_1(this, unitType);
+  void convertToSpecifiedUnits(int unitType) => _blink.BlinkSVGLength.instance.convertToSpecifiedUnits_Callback_1_(this, unitType);
 
   @DomName('SVGLength.newValueSpecifiedUnits')
   @DocsEditable()
-  void newValueSpecifiedUnits(int unitType, num valueInSpecifiedUnits) => _blink.BlinkSVGLength.newValueSpecifiedUnits_Callback_2(this, unitType, valueInSpecifiedUnits);
+  void newValueSpecifiedUnits(int unitType, num valueInSpecifiedUnits) => _blink.BlinkSVGLength.instance.newValueSpecifiedUnits_Callback_2_(this, unitType, valueInSpecifiedUnits);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2947,11 +2947,11 @@
   @DomName('SVGLengthList.length')
   @DocsEditable()
   @Experimental() // untriaged
-  int get length => _blink.BlinkSVGLengthList.length_Getter(this);
+  int get length => _blink.BlinkSVGLengthList.instance.length_Getter_(this);
 
   @DomName('SVGLengthList.numberOfItems')
   @DocsEditable()
-  int get numberOfItems => _blink.BlinkSVGLengthList.numberOfItems_Getter(this);
+  int get numberOfItems => _blink.BlinkSVGLengthList.instance.numberOfItems_Getter_(this);
 
   Length operator[](int index) {
     if (index < 0 || index >= length)
@@ -3000,35 +3000,35 @@
   @DomName('SVGLengthList.__setter__')
   @DocsEditable()
   @Experimental() // untriaged
-  void __setter__(int index, Length value) => _blink.BlinkSVGLengthList.$__setter___Callback_2(this, index, value);
+  void __setter__(int index, Length value) => _blink.BlinkSVGLengthList.instance.$__setter___Callback_2_(this, index, value);
 
   @DomName('SVGLengthList.appendItem')
   @DocsEditable()
-  Length appendItem(Length item) => _blink.BlinkSVGLengthList.appendItem_Callback_1(this, item);
+  Length appendItem(Length item) => _blink.BlinkSVGLengthList.instance.appendItem_Callback_1_(this, item);
 
   @DomName('SVGLengthList.clear')
   @DocsEditable()
-  void clear() => _blink.BlinkSVGLengthList.clear_Callback(this);
+  void clear() => _blink.BlinkSVGLengthList.instance.clear_Callback_0_(this);
 
   @DomName('SVGLengthList.getItem')
   @DocsEditable()
-  Length getItem(int index) => _blink.BlinkSVGLengthList.getItem_Callback_1(this, index);
+  Length getItem(int index) => _blink.BlinkSVGLengthList.instance.getItem_Callback_1_(this, index);
 
   @DomName('SVGLengthList.initialize')
   @DocsEditable()
-  Length initialize(Length item) => _blink.BlinkSVGLengthList.initialize_Callback_1(this, item);
+  Length initialize(Length item) => _blink.BlinkSVGLengthList.instance.initialize_Callback_1_(this, item);
 
   @DomName('SVGLengthList.insertItemBefore')
   @DocsEditable()
-  Length insertItemBefore(Length item, int index) => _blink.BlinkSVGLengthList.insertItemBefore_Callback_2(this, item, index);
+  Length insertItemBefore(Length item, int index) => _blink.BlinkSVGLengthList.instance.insertItemBefore_Callback_2_(this, item, index);
 
   @DomName('SVGLengthList.removeItem')
   @DocsEditable()
-  Length removeItem(int index) => _blink.BlinkSVGLengthList.removeItem_Callback_1(this, index);
+  Length removeItem(int index) => _blink.BlinkSVGLengthList.instance.removeItem_Callback_1_(this, index);
 
   @DomName('SVGLengthList.replaceItem')
   @DocsEditable()
-  Length replaceItem(Length item, int index) => _blink.BlinkSVGLengthList.replaceItem_Callback_2(this, item, index);
+  Length replaceItem(Length item, int index) => _blink.BlinkSVGLengthList.instance.replaceItem_Callback_2_(this, item, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3057,19 +3057,19 @@
 
   @DomName('SVGLineElement.x1')
   @DocsEditable()
-  AnimatedLength get x1 => _blink.BlinkSVGLineElement.x1_Getter(this);
+  AnimatedLength get x1 => _blink.BlinkSVGLineElement.instance.x1_Getter_(this);
 
   @DomName('SVGLineElement.x2')
   @DocsEditable()
-  AnimatedLength get x2 => _blink.BlinkSVGLineElement.x2_Getter(this);
+  AnimatedLength get x2 => _blink.BlinkSVGLineElement.instance.x2_Getter_(this);
 
   @DomName('SVGLineElement.y1')
   @DocsEditable()
-  AnimatedLength get y1 => _blink.BlinkSVGLineElement.y1_Getter(this);
+  AnimatedLength get y1 => _blink.BlinkSVGLineElement.instance.y1_Getter_(this);
 
   @DomName('SVGLineElement.y2')
   @DocsEditable()
-  AnimatedLength get y2 => _blink.BlinkSVGLineElement.y2_Getter(this);
+  AnimatedLength get y2 => _blink.BlinkSVGLineElement.instance.y2_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3098,19 +3098,19 @@
 
   @DomName('SVGLinearGradientElement.x1')
   @DocsEditable()
-  AnimatedLength get x1 => _blink.BlinkSVGLinearGradientElement.x1_Getter(this);
+  AnimatedLength get x1 => _blink.BlinkSVGLinearGradientElement.instance.x1_Getter_(this);
 
   @DomName('SVGLinearGradientElement.x2')
   @DocsEditable()
-  AnimatedLength get x2 => _blink.BlinkSVGLinearGradientElement.x2_Getter(this);
+  AnimatedLength get x2 => _blink.BlinkSVGLinearGradientElement.instance.x2_Getter_(this);
 
   @DomName('SVGLinearGradientElement.y1')
   @DocsEditable()
-  AnimatedLength get y1 => _blink.BlinkSVGLinearGradientElement.y1_Getter(this);
+  AnimatedLength get y1 => _blink.BlinkSVGLinearGradientElement.instance.y1_Getter_(this);
 
   @DomName('SVGLinearGradientElement.y2')
   @DocsEditable()
-  AnimatedLength get y2 => _blink.BlinkSVGLinearGradientElement.y2_Getter(this);
+  AnimatedLength get y2 => _blink.BlinkSVGLinearGradientElement.instance.y2_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3163,47 +3163,47 @@
 
   @DomName('SVGMarkerElement.markerHeight')
   @DocsEditable()
-  AnimatedLength get markerHeight => _blink.BlinkSVGMarkerElement.markerHeight_Getter(this);
+  AnimatedLength get markerHeight => _blink.BlinkSVGMarkerElement.instance.markerHeight_Getter_(this);
 
   @DomName('SVGMarkerElement.markerUnits')
   @DocsEditable()
-  AnimatedEnumeration get markerUnits => _blink.BlinkSVGMarkerElement.markerUnits_Getter(this);
+  AnimatedEnumeration get markerUnits => _blink.BlinkSVGMarkerElement.instance.markerUnits_Getter_(this);
 
   @DomName('SVGMarkerElement.markerWidth')
   @DocsEditable()
-  AnimatedLength get markerWidth => _blink.BlinkSVGMarkerElement.markerWidth_Getter(this);
+  AnimatedLength get markerWidth => _blink.BlinkSVGMarkerElement.instance.markerWidth_Getter_(this);
 
   @DomName('SVGMarkerElement.orientAngle')
   @DocsEditable()
-  AnimatedAngle get orientAngle => _blink.BlinkSVGMarkerElement.orientAngle_Getter(this);
+  AnimatedAngle get orientAngle => _blink.BlinkSVGMarkerElement.instance.orientAngle_Getter_(this);
 
   @DomName('SVGMarkerElement.orientType')
   @DocsEditable()
-  AnimatedEnumeration get orientType => _blink.BlinkSVGMarkerElement.orientType_Getter(this);
+  AnimatedEnumeration get orientType => _blink.BlinkSVGMarkerElement.instance.orientType_Getter_(this);
 
   @DomName('SVGMarkerElement.refX')
   @DocsEditable()
-  AnimatedLength get refX => _blink.BlinkSVGMarkerElement.refX_Getter(this);
+  AnimatedLength get refX => _blink.BlinkSVGMarkerElement.instance.refX_Getter_(this);
 
   @DomName('SVGMarkerElement.refY')
   @DocsEditable()
-  AnimatedLength get refY => _blink.BlinkSVGMarkerElement.refY_Getter(this);
+  AnimatedLength get refY => _blink.BlinkSVGMarkerElement.instance.refY_Getter_(this);
 
   @DomName('SVGMarkerElement.setOrientToAngle')
   @DocsEditable()
-  void setOrientToAngle(Angle angle) => _blink.BlinkSVGMarkerElement.setOrientToAngle_Callback_1(this, angle);
+  void setOrientToAngle(Angle angle) => _blink.BlinkSVGMarkerElement.instance.setOrientToAngle_Callback_1_(this, angle);
 
   @DomName('SVGMarkerElement.setOrientToAuto')
   @DocsEditable()
-  void setOrientToAuto() => _blink.BlinkSVGMarkerElement.setOrientToAuto_Callback(this);
+  void setOrientToAuto() => _blink.BlinkSVGMarkerElement.instance.setOrientToAuto_Callback_0_(this);
 
   @DomName('SVGMarkerElement.preserveAspectRatio')
   @DocsEditable()
-  AnimatedPreserveAspectRatio get preserveAspectRatio => _blink.BlinkSVGMarkerElement.preserveAspectRatio_Getter(this);
+  AnimatedPreserveAspectRatio get preserveAspectRatio => _blink.BlinkSVGMarkerElement.instance.preserveAspectRatio_Getter_(this);
 
   @DomName('SVGMarkerElement.viewBox')
   @DocsEditable()
-  AnimatedRect get viewBox => _blink.BlinkSVGMarkerElement.viewBox_Getter(this);
+  AnimatedRect get viewBox => _blink.BlinkSVGMarkerElement.instance.viewBox_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3232,43 +3232,43 @@
 
   @DomName('SVGMaskElement.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.BlinkSVGMaskElement.height_Getter(this);
+  AnimatedLength get height => _blink.BlinkSVGMaskElement.instance.height_Getter_(this);
 
   @DomName('SVGMaskElement.maskContentUnits')
   @DocsEditable()
-  AnimatedEnumeration get maskContentUnits => _blink.BlinkSVGMaskElement.maskContentUnits_Getter(this);
+  AnimatedEnumeration get maskContentUnits => _blink.BlinkSVGMaskElement.instance.maskContentUnits_Getter_(this);
 
   @DomName('SVGMaskElement.maskUnits')
   @DocsEditable()
-  AnimatedEnumeration get maskUnits => _blink.BlinkSVGMaskElement.maskUnits_Getter(this);
+  AnimatedEnumeration get maskUnits => _blink.BlinkSVGMaskElement.instance.maskUnits_Getter_(this);
 
   @DomName('SVGMaskElement.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.BlinkSVGMaskElement.width_Getter(this);
+  AnimatedLength get width => _blink.BlinkSVGMaskElement.instance.width_Getter_(this);
 
   @DomName('SVGMaskElement.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.BlinkSVGMaskElement.x_Getter(this);
+  AnimatedLength get x => _blink.BlinkSVGMaskElement.instance.x_Getter_(this);
 
   @DomName('SVGMaskElement.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.BlinkSVGMaskElement.y_Getter(this);
+  AnimatedLength get y => _blink.BlinkSVGMaskElement.instance.y_Getter_(this);
 
   @DomName('SVGMaskElement.requiredExtensions')
   @DocsEditable()
-  StringList get requiredExtensions => _blink.BlinkSVGMaskElement.requiredExtensions_Getter(this);
+  StringList get requiredExtensions => _blink.BlinkSVGMaskElement.instance.requiredExtensions_Getter_(this);
 
   @DomName('SVGMaskElement.requiredFeatures')
   @DocsEditable()
-  StringList get requiredFeatures => _blink.BlinkSVGMaskElement.requiredFeatures_Getter(this);
+  StringList get requiredFeatures => _blink.BlinkSVGMaskElement.instance.requiredFeatures_Getter_(this);
 
   @DomName('SVGMaskElement.systemLanguage')
   @DocsEditable()
-  StringList get systemLanguage => _blink.BlinkSVGMaskElement.systemLanguage_Getter(this);
+  StringList get systemLanguage => _blink.BlinkSVGMaskElement.instance.systemLanguage_Getter_(this);
 
   @DomName('SVGMaskElement.hasExtension')
   @DocsEditable()
-  bool hasExtension(String extension) => _blink.BlinkSVGMaskElement.hasExtension_Callback_1(this, extension);
+  bool hasExtension(String extension) => _blink.BlinkSVGMaskElement.instance.hasExtension_Callback_1_(this, extension);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3287,95 +3287,95 @@
 
   @DomName('SVGMatrix.a')
   @DocsEditable()
-  num get a => _blink.BlinkSVGMatrix.a_Getter(this);
+  num get a => _blink.BlinkSVGMatrix.instance.a_Getter_(this);
 
   @DomName('SVGMatrix.a')
   @DocsEditable()
-  void set a(num value) => _blink.BlinkSVGMatrix.a_Setter(this, value);
+  void set a(num value) => _blink.BlinkSVGMatrix.instance.a_Setter_(this, value);
 
   @DomName('SVGMatrix.b')
   @DocsEditable()
-  num get b => _blink.BlinkSVGMatrix.b_Getter(this);
+  num get b => _blink.BlinkSVGMatrix.instance.b_Getter_(this);
 
   @DomName('SVGMatrix.b')
   @DocsEditable()
-  void set b(num value) => _blink.BlinkSVGMatrix.b_Setter(this, value);
+  void set b(num value) => _blink.BlinkSVGMatrix.instance.b_Setter_(this, value);
 
   @DomName('SVGMatrix.c')
   @DocsEditable()
-  num get c => _blink.BlinkSVGMatrix.c_Getter(this);
+  num get c => _blink.BlinkSVGMatrix.instance.c_Getter_(this);
 
   @DomName('SVGMatrix.c')
   @DocsEditable()
-  void set c(num value) => _blink.BlinkSVGMatrix.c_Setter(this, value);
+  void set c(num value) => _blink.BlinkSVGMatrix.instance.c_Setter_(this, value);
 
   @DomName('SVGMatrix.d')
   @DocsEditable()
-  num get d => _blink.BlinkSVGMatrix.d_Getter(this);
+  num get d => _blink.BlinkSVGMatrix.instance.d_Getter_(this);
 
   @DomName('SVGMatrix.d')
   @DocsEditable()
-  void set d(num value) => _blink.BlinkSVGMatrix.d_Setter(this, value);
+  void set d(num value) => _blink.BlinkSVGMatrix.instance.d_Setter_(this, value);
 
   @DomName('SVGMatrix.e')
   @DocsEditable()
-  num get e => _blink.BlinkSVGMatrix.e_Getter(this);
+  num get e => _blink.BlinkSVGMatrix.instance.e_Getter_(this);
 
   @DomName('SVGMatrix.e')
   @DocsEditable()
-  void set e(num value) => _blink.BlinkSVGMatrix.e_Setter(this, value);
+  void set e(num value) => _blink.BlinkSVGMatrix.instance.e_Setter_(this, value);
 
   @DomName('SVGMatrix.f')
   @DocsEditable()
-  num get f => _blink.BlinkSVGMatrix.f_Getter(this);
+  num get f => _blink.BlinkSVGMatrix.instance.f_Getter_(this);
 
   @DomName('SVGMatrix.f')
   @DocsEditable()
-  void set f(num value) => _blink.BlinkSVGMatrix.f_Setter(this, value);
+  void set f(num value) => _blink.BlinkSVGMatrix.instance.f_Setter_(this, value);
 
   @DomName('SVGMatrix.flipX')
   @DocsEditable()
-  Matrix flipX() => _blink.BlinkSVGMatrix.flipX_Callback(this);
+  Matrix flipX() => _blink.BlinkSVGMatrix.instance.flipX_Callback_0_(this);
 
   @DomName('SVGMatrix.flipY')
   @DocsEditable()
-  Matrix flipY() => _blink.BlinkSVGMatrix.flipY_Callback(this);
+  Matrix flipY() => _blink.BlinkSVGMatrix.instance.flipY_Callback_0_(this);
 
   @DomName('SVGMatrix.inverse')
   @DocsEditable()
-  Matrix inverse() => _blink.BlinkSVGMatrix.inverse_Callback(this);
+  Matrix inverse() => _blink.BlinkSVGMatrix.instance.inverse_Callback_0_(this);
 
   @DomName('SVGMatrix.multiply')
   @DocsEditable()
-  Matrix multiply(Matrix secondMatrix) => _blink.BlinkSVGMatrix.multiply_Callback_1(this, secondMatrix);
+  Matrix multiply(Matrix secondMatrix) => _blink.BlinkSVGMatrix.instance.multiply_Callback_1_(this, secondMatrix);
 
   @DomName('SVGMatrix.rotate')
   @DocsEditable()
-  Matrix rotate(num angle) => _blink.BlinkSVGMatrix.rotate_Callback_1(this, angle);
+  Matrix rotate(num angle) => _blink.BlinkSVGMatrix.instance.rotate_Callback_1_(this, angle);
 
   @DomName('SVGMatrix.rotateFromVector')
   @DocsEditable()
-  Matrix rotateFromVector(num x, num y) => _blink.BlinkSVGMatrix.rotateFromVector_Callback_2(this, x, y);
+  Matrix rotateFromVector(num x, num y) => _blink.BlinkSVGMatrix.instance.rotateFromVector_Callback_2_(this, x, y);
 
   @DomName('SVGMatrix.scale')
   @DocsEditable()
-  Matrix scale(num scaleFactor) => _blink.BlinkSVGMatrix.scale_Callback_1(this, scaleFactor);
+  Matrix scale(num scaleFactor) => _blink.BlinkSVGMatrix.instance.scale_Callback_1_(this, scaleFactor);
 
   @DomName('SVGMatrix.scaleNonUniform')
   @DocsEditable()
-  Matrix scaleNonUniform(num scaleFactorX, num scaleFactorY) => _blink.BlinkSVGMatrix.scaleNonUniform_Callback_2(this, scaleFactorX, scaleFactorY);
+  Matrix scaleNonUniform(num scaleFactorX, num scaleFactorY) => _blink.BlinkSVGMatrix.instance.scaleNonUniform_Callback_2_(this, scaleFactorX, scaleFactorY);
 
   @DomName('SVGMatrix.skewX')
   @DocsEditable()
-  Matrix skewX(num angle) => _blink.BlinkSVGMatrix.skewX_Callback_1(this, angle);
+  Matrix skewX(num angle) => _blink.BlinkSVGMatrix.instance.skewX_Callback_1_(this, angle);
 
   @DomName('SVGMatrix.skewY')
   @DocsEditable()
-  Matrix skewY(num angle) => _blink.BlinkSVGMatrix.skewY_Callback_1(this, angle);
+  Matrix skewY(num angle) => _blink.BlinkSVGMatrix.instance.skewY_Callback_1_(this, angle);
 
   @DomName('SVGMatrix.translate')
   @DocsEditable()
-  Matrix translate(num x, num y) => _blink.BlinkSVGMatrix.translate_Callback_2(this, x, y);
+  Matrix translate(num x, num y) => _blink.BlinkSVGMatrix.instance.translate_Callback_2_(this, x, y);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3415,11 +3415,11 @@
 
   @DomName('SVGNumber.value')
   @DocsEditable()
-  num get value => _blink.BlinkSVGNumber.value_Getter(this);
+  num get value => _blink.BlinkSVGNumber.instance.value_Getter_(this);
 
   @DomName('SVGNumber.value')
   @DocsEditable()
-  void set value(num value) => _blink.BlinkSVGNumber.value_Setter(this, value);
+  void set value(num value) => _blink.BlinkSVGNumber.instance.value_Setter_(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3439,11 +3439,11 @@
   @DomName('SVGNumberList.length')
   @DocsEditable()
   @Experimental() // untriaged
-  int get length => _blink.BlinkSVGNumberList.length_Getter(this);
+  int get length => _blink.BlinkSVGNumberList.instance.length_Getter_(this);
 
   @DomName('SVGNumberList.numberOfItems')
   @DocsEditable()
-  int get numberOfItems => _blink.BlinkSVGNumberList.numberOfItems_Getter(this);
+  int get numberOfItems => _blink.BlinkSVGNumberList.instance.numberOfItems_Getter_(this);
 
   Number operator[](int index) {
     if (index < 0 || index >= length)
@@ -3492,35 +3492,35 @@
   @DomName('SVGNumberList.__setter__')
   @DocsEditable()
   @Experimental() // untriaged
-  void __setter__(int index, Number value) => _blink.BlinkSVGNumberList.$__setter___Callback_2(this, index, value);
+  void __setter__(int index, Number value) => _blink.BlinkSVGNumberList.instance.$__setter___Callback_2_(this, index, value);
 
   @DomName('SVGNumberList.appendItem')
   @DocsEditable()
-  Number appendItem(Number item) => _blink.BlinkSVGNumberList.appendItem_Callback_1(this, item);
+  Number appendItem(Number item) => _blink.BlinkSVGNumberList.instance.appendItem_Callback_1_(this, item);
 
   @DomName('SVGNumberList.clear')
   @DocsEditable()
-  void clear() => _blink.BlinkSVGNumberList.clear_Callback(this);
+  void clear() => _blink.BlinkSVGNumberList.instance.clear_Callback_0_(this);
 
   @DomName('SVGNumberList.getItem')
   @DocsEditable()
-  Number getItem(int index) => _blink.BlinkSVGNumberList.getItem_Callback_1(this, index);
+  Number getItem(int index) => _blink.BlinkSVGNumberList.instance.getItem_Callback_1_(this, index);
 
   @DomName('SVGNumberList.initialize')
   @DocsEditable()
-  Number initialize(Number item) => _blink.BlinkSVGNumberList.initialize_Callback_1(this, item);
+  Number initialize(Number item) => _blink.BlinkSVGNumberList.instance.initialize_Callback_1_(this, item);
 
   @DomName('SVGNumberList.insertItemBefore')
   @DocsEditable()
-  Number insertItemBefore(Number item, int index) => _blink.BlinkSVGNumberList.insertItemBefore_Callback_2(this, item, index);
+  Number insertItemBefore(Number item, int index) => _blink.BlinkSVGNumberList.instance.insertItemBefore_Callback_2_(this, item, index);
 
   @DomName('SVGNumberList.removeItem')
   @DocsEditable()
-  Number removeItem(int index) => _blink.BlinkSVGNumberList.removeItem_Callback_1(this, index);
+  Number removeItem(int index) => _blink.BlinkSVGNumberList.instance.removeItem_Callback_1_(this, index);
 
   @DomName('SVGNumberList.replaceItem')
   @DocsEditable()
-  Number replaceItem(Number item, int index) => _blink.BlinkSVGNumberList.replaceItem_Callback_2(this, item, index);
+  Number replaceItem(Number item, int index) => _blink.BlinkSVGNumberList.instance.replaceItem_Callback_2_(this, item, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3549,111 +3549,111 @@
 
   @DomName('SVGPathElement.animatedNormalizedPathSegList')
   @DocsEditable()
-  PathSegList get animatedNormalizedPathSegList => _blink.BlinkSVGPathElement.animatedNormalizedPathSegList_Getter(this);
+  PathSegList get animatedNormalizedPathSegList => _blink.BlinkSVGPathElement.instance.animatedNormalizedPathSegList_Getter_(this);
 
   @DomName('SVGPathElement.animatedPathSegList')
   @DocsEditable()
-  PathSegList get animatedPathSegList => _blink.BlinkSVGPathElement.animatedPathSegList_Getter(this);
+  PathSegList get animatedPathSegList => _blink.BlinkSVGPathElement.instance.animatedPathSegList_Getter_(this);
 
   @DomName('SVGPathElement.normalizedPathSegList')
   @DocsEditable()
-  PathSegList get normalizedPathSegList => _blink.BlinkSVGPathElement.normalizedPathSegList_Getter(this);
+  PathSegList get normalizedPathSegList => _blink.BlinkSVGPathElement.instance.normalizedPathSegList_Getter_(this);
 
   @DomName('SVGPathElement.pathLength')
   @DocsEditable()
-  AnimatedNumber get pathLength => _blink.BlinkSVGPathElement.pathLength_Getter(this);
+  AnimatedNumber get pathLength => _blink.BlinkSVGPathElement.instance.pathLength_Getter_(this);
 
   @DomName('SVGPathElement.pathSegList')
   @DocsEditable()
-  PathSegList get pathSegList => _blink.BlinkSVGPathElement.pathSegList_Getter(this);
+  PathSegList get pathSegList => _blink.BlinkSVGPathElement.instance.pathSegList_Getter_(this);
 
   @DomName('SVGPathElement.createSVGPathSegArcAbs')
   @DocsEditable()
-  PathSegArcAbs createSvgPathSegArcAbs(num x, num y, num r1, num r2, num angle, bool largeArcFlag, bool sweepFlag) => _blink.BlinkSVGPathElement.createSVGPathSegArcAbs_Callback_7(this, x, y, r1, r2, angle, largeArcFlag, sweepFlag);
+  PathSegArcAbs createSvgPathSegArcAbs(num x, num y, num r1, num r2, num angle, bool largeArcFlag, bool sweepFlag) => _blink.BlinkSVGPathElement.instance.createSVGPathSegArcAbs_Callback_7_(this, x, y, r1, r2, angle, largeArcFlag, sweepFlag);
 
   @DomName('SVGPathElement.createSVGPathSegArcRel')
   @DocsEditable()
-  PathSegArcRel createSvgPathSegArcRel(num x, num y, num r1, num r2, num angle, bool largeArcFlag, bool sweepFlag) => _blink.BlinkSVGPathElement.createSVGPathSegArcRel_Callback_7(this, x, y, r1, r2, angle, largeArcFlag, sweepFlag);
+  PathSegArcRel createSvgPathSegArcRel(num x, num y, num r1, num r2, num angle, bool largeArcFlag, bool sweepFlag) => _blink.BlinkSVGPathElement.instance.createSVGPathSegArcRel_Callback_7_(this, x, y, r1, r2, angle, largeArcFlag, sweepFlag);
 
   @DomName('SVGPathElement.createSVGPathSegClosePath')
   @DocsEditable()
-  PathSegClosePath createSvgPathSegClosePath() => _blink.BlinkSVGPathElement.createSVGPathSegClosePath_Callback(this);
+  PathSegClosePath createSvgPathSegClosePath() => _blink.BlinkSVGPathElement.instance.createSVGPathSegClosePath_Callback_0_(this);
 
   @DomName('SVGPathElement.createSVGPathSegCurvetoCubicAbs')
   @DocsEditable()
-  PathSegCurvetoCubicAbs createSvgPathSegCurvetoCubicAbs(num x, num y, num x1, num y1, num x2, num y2) => _blink.BlinkSVGPathElement.createSVGPathSegCurvetoCubicAbs_Callback_6(this, x, y, x1, y1, x2, y2);
+  PathSegCurvetoCubicAbs createSvgPathSegCurvetoCubicAbs(num x, num y, num x1, num y1, num x2, num y2) => _blink.BlinkSVGPathElement.instance.createSVGPathSegCurvetoCubicAbs_Callback_6_(this, x, y, x1, y1, x2, y2);
 
   @DomName('SVGPathElement.createSVGPathSegCurvetoCubicRel')
   @DocsEditable()
-  PathSegCurvetoCubicRel createSvgPathSegCurvetoCubicRel(num x, num y, num x1, num y1, num x2, num y2) => _blink.BlinkSVGPathElement.createSVGPathSegCurvetoCubicRel_Callback_6(this, x, y, x1, y1, x2, y2);
+  PathSegCurvetoCubicRel createSvgPathSegCurvetoCubicRel(num x, num y, num x1, num y1, num x2, num y2) => _blink.BlinkSVGPathElement.instance.createSVGPathSegCurvetoCubicRel_Callback_6_(this, x, y, x1, y1, x2, y2);
 
   @DomName('SVGPathElement.createSVGPathSegCurvetoCubicSmoothAbs')
   @DocsEditable()
-  PathSegCurvetoCubicSmoothAbs createSvgPathSegCurvetoCubicSmoothAbs(num x, num y, num x2, num y2) => _blink.BlinkSVGPathElement.createSVGPathSegCurvetoCubicSmoothAbs_Callback_4(this, x, y, x2, y2);
+  PathSegCurvetoCubicSmoothAbs createSvgPathSegCurvetoCubicSmoothAbs(num x, num y, num x2, num y2) => _blink.BlinkSVGPathElement.instance.createSVGPathSegCurvetoCubicSmoothAbs_Callback_4_(this, x, y, x2, y2);
 
   @DomName('SVGPathElement.createSVGPathSegCurvetoCubicSmoothRel')
   @DocsEditable()
-  PathSegCurvetoCubicSmoothRel createSvgPathSegCurvetoCubicSmoothRel(num x, num y, num x2, num y2) => _blink.BlinkSVGPathElement.createSVGPathSegCurvetoCubicSmoothRel_Callback_4(this, x, y, x2, y2);
+  PathSegCurvetoCubicSmoothRel createSvgPathSegCurvetoCubicSmoothRel(num x, num y, num x2, num y2) => _blink.BlinkSVGPathElement.instance.createSVGPathSegCurvetoCubicSmoothRel_Callback_4_(this, x, y, x2, y2);
 
   @DomName('SVGPathElement.createSVGPathSegCurvetoQuadraticAbs')
   @DocsEditable()
-  PathSegCurvetoQuadraticAbs createSvgPathSegCurvetoQuadraticAbs(num x, num y, num x1, num y1) => _blink.BlinkSVGPathElement.createSVGPathSegCurvetoQuadraticAbs_Callback_4(this, x, y, x1, y1);
+  PathSegCurvetoQuadraticAbs createSvgPathSegCurvetoQuadraticAbs(num x, num y, num x1, num y1) => _blink.BlinkSVGPathElement.instance.createSVGPathSegCurvetoQuadraticAbs_Callback_4_(this, x, y, x1, y1);
 
   @DomName('SVGPathElement.createSVGPathSegCurvetoQuadraticRel')
   @DocsEditable()
-  PathSegCurvetoQuadraticRel createSvgPathSegCurvetoQuadraticRel(num x, num y, num x1, num y1) => _blink.BlinkSVGPathElement.createSVGPathSegCurvetoQuadraticRel_Callback_4(this, x, y, x1, y1);
+  PathSegCurvetoQuadraticRel createSvgPathSegCurvetoQuadraticRel(num x, num y, num x1, num y1) => _blink.BlinkSVGPathElement.instance.createSVGPathSegCurvetoQuadraticRel_Callback_4_(this, x, y, x1, y1);
 
   @DomName('SVGPathElement.createSVGPathSegCurvetoQuadraticSmoothAbs')
   @DocsEditable()
-  PathSegCurvetoQuadraticSmoothAbs createSvgPathSegCurvetoQuadraticSmoothAbs(num x, num y) => _blink.BlinkSVGPathElement.createSVGPathSegCurvetoQuadraticSmoothAbs_Callback_2(this, x, y);
+  PathSegCurvetoQuadraticSmoothAbs createSvgPathSegCurvetoQuadraticSmoothAbs(num x, num y) => _blink.BlinkSVGPathElement.instance.createSVGPathSegCurvetoQuadraticSmoothAbs_Callback_2_(this, x, y);
 
   @DomName('SVGPathElement.createSVGPathSegCurvetoQuadraticSmoothRel')
   @DocsEditable()
-  PathSegCurvetoQuadraticSmoothRel createSvgPathSegCurvetoQuadraticSmoothRel(num x, num y) => _blink.BlinkSVGPathElement.createSVGPathSegCurvetoQuadraticSmoothRel_Callback_2(this, x, y);
+  PathSegCurvetoQuadraticSmoothRel createSvgPathSegCurvetoQuadraticSmoothRel(num x, num y) => _blink.BlinkSVGPathElement.instance.createSVGPathSegCurvetoQuadraticSmoothRel_Callback_2_(this, x, y);
 
   @DomName('SVGPathElement.createSVGPathSegLinetoAbs')
   @DocsEditable()
-  PathSegLinetoAbs createSvgPathSegLinetoAbs(num x, num y) => _blink.BlinkSVGPathElement.createSVGPathSegLinetoAbs_Callback_2(this, x, y);
+  PathSegLinetoAbs createSvgPathSegLinetoAbs(num x, num y) => _blink.BlinkSVGPathElement.instance.createSVGPathSegLinetoAbs_Callback_2_(this, x, y);
 
   @DomName('SVGPathElement.createSVGPathSegLinetoHorizontalAbs')
   @DocsEditable()
-  PathSegLinetoHorizontalAbs createSvgPathSegLinetoHorizontalAbs(num x) => _blink.BlinkSVGPathElement.createSVGPathSegLinetoHorizontalAbs_Callback_1(this, x);
+  PathSegLinetoHorizontalAbs createSvgPathSegLinetoHorizontalAbs(num x) => _blink.BlinkSVGPathElement.instance.createSVGPathSegLinetoHorizontalAbs_Callback_1_(this, x);
 
   @DomName('SVGPathElement.createSVGPathSegLinetoHorizontalRel')
   @DocsEditable()
-  PathSegLinetoHorizontalRel createSvgPathSegLinetoHorizontalRel(num x) => _blink.BlinkSVGPathElement.createSVGPathSegLinetoHorizontalRel_Callback_1(this, x);
+  PathSegLinetoHorizontalRel createSvgPathSegLinetoHorizontalRel(num x) => _blink.BlinkSVGPathElement.instance.createSVGPathSegLinetoHorizontalRel_Callback_1_(this, x);
 
   @DomName('SVGPathElement.createSVGPathSegLinetoRel')
   @DocsEditable()
-  PathSegLinetoRel createSvgPathSegLinetoRel(num x, num y) => _blink.BlinkSVGPathElement.createSVGPathSegLinetoRel_Callback_2(this, x, y);
+  PathSegLinetoRel createSvgPathSegLinetoRel(num x, num y) => _blink.BlinkSVGPathElement.instance.createSVGPathSegLinetoRel_Callback_2_(this, x, y);
 
   @DomName('SVGPathElement.createSVGPathSegLinetoVerticalAbs')
   @DocsEditable()
-  PathSegLinetoVerticalAbs createSvgPathSegLinetoVerticalAbs(num y) => _blink.BlinkSVGPathElement.createSVGPathSegLinetoVerticalAbs_Callback_1(this, y);
+  PathSegLinetoVerticalAbs createSvgPathSegLinetoVerticalAbs(num y) => _blink.BlinkSVGPathElement.instance.createSVGPathSegLinetoVerticalAbs_Callback_1_(this, y);
 
   @DomName('SVGPathElement.createSVGPathSegLinetoVerticalRel')
   @DocsEditable()
-  PathSegLinetoVerticalRel createSvgPathSegLinetoVerticalRel(num y) => _blink.BlinkSVGPathElement.createSVGPathSegLinetoVerticalRel_Callback_1(this, y);
+  PathSegLinetoVerticalRel createSvgPathSegLinetoVerticalRel(num y) => _blink.BlinkSVGPathElement.instance.createSVGPathSegLinetoVerticalRel_Callback_1_(this, y);
 
   @DomName('SVGPathElement.createSVGPathSegMovetoAbs')
   @DocsEditable()
-  PathSegMovetoAbs createSvgPathSegMovetoAbs(num x, num y) => _blink.BlinkSVGPathElement.createSVGPathSegMovetoAbs_Callback_2(this, x, y);
+  PathSegMovetoAbs createSvgPathSegMovetoAbs(num x, num y) => _blink.BlinkSVGPathElement.instance.createSVGPathSegMovetoAbs_Callback_2_(this, x, y);
 
   @DomName('SVGPathElement.createSVGPathSegMovetoRel')
   @DocsEditable()
-  PathSegMovetoRel createSvgPathSegMovetoRel(num x, num y) => _blink.BlinkSVGPathElement.createSVGPathSegMovetoRel_Callback_2(this, x, y);
+  PathSegMovetoRel createSvgPathSegMovetoRel(num x, num y) => _blink.BlinkSVGPathElement.instance.createSVGPathSegMovetoRel_Callback_2_(this, x, y);
 
   @DomName('SVGPathElement.getPathSegAtLength')
   @DocsEditable()
-  int getPathSegAtLength(num distance) => _blink.BlinkSVGPathElement.getPathSegAtLength_Callback_1(this, distance);
+  int getPathSegAtLength(num distance) => _blink.BlinkSVGPathElement.instance.getPathSegAtLength_Callback_1_(this, distance);
 
   @DomName('SVGPathElement.getPointAtLength')
   @DocsEditable()
-  Point getPointAtLength(num distance) => _blink.BlinkSVGPathElement.getPointAtLength_Callback_1(this, distance);
+  Point getPointAtLength(num distance) => _blink.BlinkSVGPathElement.instance.getPointAtLength_Callback_1_(this, distance);
 
   @DomName('SVGPathElement.getTotalLength')
   @DocsEditable()
-  double getTotalLength() => _blink.BlinkSVGPathElement.getTotalLength_Callback(this);
+  double getTotalLength() => _blink.BlinkSVGPathElement.instance.getTotalLength_Callback_0_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3752,11 +3752,11 @@
 
   @DomName('SVGPathSeg.pathSegType')
   @DocsEditable()
-  int get pathSegType => _blink.BlinkSVGPathSeg.pathSegType_Getter(this);
+  int get pathSegType => _blink.BlinkSVGPathSeg.instance.pathSegType_Getter_(this);
 
   @DomName('SVGPathSeg.pathSegTypeAsLetter')
   @DocsEditable()
-  String get pathSegTypeAsLetter => _blink.BlinkSVGPathSeg.pathSegTypeAsLetter_Getter(this);
+  String get pathSegTypeAsLetter => _blink.BlinkSVGPathSeg.instance.pathSegTypeAsLetter_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3775,59 +3775,59 @@
 
   @DomName('SVGPathSegArcAbs.angle')
   @DocsEditable()
-  num get angle => _blink.BlinkSVGPathSegArcAbs.angle_Getter(this);
+  num get angle => _blink.BlinkSVGPathSegArcAbs.instance.angle_Getter_(this);
 
   @DomName('SVGPathSegArcAbs.angle')
   @DocsEditable()
-  void set angle(num value) => _blink.BlinkSVGPathSegArcAbs.angle_Setter(this, value);
+  void set angle(num value) => _blink.BlinkSVGPathSegArcAbs.instance.angle_Setter_(this, value);
 
   @DomName('SVGPathSegArcAbs.largeArcFlag')
   @DocsEditable()
-  bool get largeArcFlag => _blink.BlinkSVGPathSegArcAbs.largeArcFlag_Getter(this);
+  bool get largeArcFlag => _blink.BlinkSVGPathSegArcAbs.instance.largeArcFlag_Getter_(this);
 
   @DomName('SVGPathSegArcAbs.largeArcFlag')
   @DocsEditable()
-  void set largeArcFlag(bool value) => _blink.BlinkSVGPathSegArcAbs.largeArcFlag_Setter(this, value);
+  void set largeArcFlag(bool value) => _blink.BlinkSVGPathSegArcAbs.instance.largeArcFlag_Setter_(this, value);
 
   @DomName('SVGPathSegArcAbs.r1')
   @DocsEditable()
-  num get r1 => _blink.BlinkSVGPathSegArcAbs.r1_Getter(this);
+  num get r1 => _blink.BlinkSVGPathSegArcAbs.instance.r1_Getter_(this);
 
   @DomName('SVGPathSegArcAbs.r1')
   @DocsEditable()
-  void set r1(num value) => _blink.BlinkSVGPathSegArcAbs.r1_Setter(this, value);
+  void set r1(num value) => _blink.BlinkSVGPathSegArcAbs.instance.r1_Setter_(this, value);
 
   @DomName('SVGPathSegArcAbs.r2')
   @DocsEditable()
-  num get r2 => _blink.BlinkSVGPathSegArcAbs.r2_Getter(this);
+  num get r2 => _blink.BlinkSVGPathSegArcAbs.instance.r2_Getter_(this);
 
   @DomName('SVGPathSegArcAbs.r2')
   @DocsEditable()
-  void set r2(num value) => _blink.BlinkSVGPathSegArcAbs.r2_Setter(this, value);
+  void set r2(num value) => _blink.BlinkSVGPathSegArcAbs.instance.r2_Setter_(this, value);
 
   @DomName('SVGPathSegArcAbs.sweepFlag')
   @DocsEditable()
-  bool get sweepFlag => _blink.BlinkSVGPathSegArcAbs.sweepFlag_Getter(this);
+  bool get sweepFlag => _blink.BlinkSVGPathSegArcAbs.instance.sweepFlag_Getter_(this);
 
   @DomName('SVGPathSegArcAbs.sweepFlag')
   @DocsEditable()
-  void set sweepFlag(bool value) => _blink.BlinkSVGPathSegArcAbs.sweepFlag_Setter(this, value);
+  void set sweepFlag(bool value) => _blink.BlinkSVGPathSegArcAbs.instance.sweepFlag_Setter_(this, value);
 
   @DomName('SVGPathSegArcAbs.x')
   @DocsEditable()
-  num get x => _blink.BlinkSVGPathSegArcAbs.x_Getter(this);
+  num get x => _blink.BlinkSVGPathSegArcAbs.instance.x_Getter_(this);
 
   @DomName('SVGPathSegArcAbs.x')
   @DocsEditable()
-  void set x(num value) => _blink.BlinkSVGPathSegArcAbs.x_Setter(this, value);
+  void set x(num value) => _blink.BlinkSVGPathSegArcAbs.instance.x_Setter_(this, value);
 
   @DomName('SVGPathSegArcAbs.y')
   @DocsEditable()
-  num get y => _blink.BlinkSVGPathSegArcAbs.y_Getter(this);
+  num get y => _blink.BlinkSVGPathSegArcAbs.instance.y_Getter_(this);
 
   @DomName('SVGPathSegArcAbs.y')
   @DocsEditable()
-  void set y(num value) => _blink.BlinkSVGPathSegArcAbs.y_Setter(this, value);
+  void set y(num value) => _blink.BlinkSVGPathSegArcAbs.instance.y_Setter_(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3846,59 +3846,59 @@
 
   @DomName('SVGPathSegArcRel.angle')
   @DocsEditable()
-  num get angle => _blink.BlinkSVGPathSegArcRel.angle_Getter(this);
+  num get angle => _blink.BlinkSVGPathSegArcRel.instance.angle_Getter_(this);
 
   @DomName('SVGPathSegArcRel.angle')
   @DocsEditable()
-  void set angle(num value) => _blink.BlinkSVGPathSegArcRel.angle_Setter(this, value);
+  void set angle(num value) => _blink.BlinkSVGPathSegArcRel.instance.angle_Setter_(this, value);
 
   @DomName('SVGPathSegArcRel.largeArcFlag')
   @DocsEditable()
-  bool get largeArcFlag => _blink.BlinkSVGPathSegArcRel.largeArcFlag_Getter(this);
+  bool get largeArcFlag => _blink.BlinkSVGPathSegArcRel.instance.largeArcFlag_Getter_(this);
 
   @DomName('SVGPathSegArcRel.largeArcFlag')
   @DocsEditable()
-  void set largeArcFlag(bool value) => _blink.BlinkSVGPathSegArcRel.largeArcFlag_Setter(this, value);
+  void set largeArcFlag(bool value) => _blink.BlinkSVGPathSegArcRel.instance.largeArcFlag_Setter_(this, value);
 
   @DomName('SVGPathSegArcRel.r1')
   @DocsEditable()
-  num get r1 => _blink.BlinkSVGPathSegArcRel.r1_Getter(this);
+  num get r1 => _blink.BlinkSVGPathSegArcRel.instance.r1_Getter_(this);
 
   @DomName('SVGPathSegArcRel.r1')
   @DocsEditable()
-  void set r1(num value) => _blink.BlinkSVGPathSegArcRel.r1_Setter(this, value);
+  void set r1(num value) => _blink.BlinkSVGPathSegArcRel.instance.r1_Setter_(this, value);
 
   @DomName('SVGPathSegArcRel.r2')
   @DocsEditable()
-  num get r2 => _blink.BlinkSVGPathSegArcRel.r2_Getter(this);
+  num get r2 => _blink.BlinkSVGPathSegArcRel.instance.r2_Getter_(this);
 
   @DomName('SVGPathSegArcRel.r2')
   @DocsEditable()
-  void set r2(num value) => _blink.BlinkSVGPathSegArcRel.r2_Setter(this, value);
+  void set r2(num value) => _blink.BlinkSVGPathSegArcRel.instance.r2_Setter_(this, value);
 
   @DomName('SVGPathSegArcRel.sweepFlag')
   @DocsEditable()
-  bool get sweepFlag => _blink.BlinkSVGPathSegArcRel.sweepFlag_Getter(this);
+  bool get sweepFlag => _blink.BlinkSVGPathSegArcRel.instance.sweepFlag_Getter_(this);
 
   @DomName('SVGPathSegArcRel.sweepFlag')
   @DocsEditable()
-  void set sweepFlag(bool value) => _blink.BlinkSVGPathSegArcRel.sweepFlag_Setter(this, value);
+  void set sweepFlag(bool value) => _blink.BlinkSVGPathSegArcRel.instance.sweepFlag_Setter_(this, value);
 
   @DomName('SVGPathSegArcRel.x')
   @DocsEditable()
-  num get x => _blink.BlinkSVGPathSegArcRel.x_Getter(this);
+  num get x => _blink.BlinkSVGPathSegArcRel.instance.x_Getter_(this);
 
   @DomName('SVGPathSegArcRel.x')
   @DocsEditable()
-  void set x(num value) => _blink.BlinkSVGPathSegArcRel.x_Setter(this, value);
+  void set x(num value) => _blink.BlinkSVGPathSegArcRel.instance.x_Setter_(this, value);
 
   @DomName('SVGPathSegArcRel.y')
   @DocsEditable()
-  num get y => _blink.BlinkSVGPathSegArcRel.y_Getter(this);
+  num get y => _blink.BlinkSVGPathSegArcRel.instance.y_Getter_(this);
 
   @DomName('SVGPathSegArcRel.y')
   @DocsEditable()
-  void set y(num value) => _blink.BlinkSVGPathSegArcRel.y_Setter(this, value);
+  void set y(num value) => _blink.BlinkSVGPathSegArcRel.instance.y_Setter_(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3932,51 +3932,51 @@
 
   @DomName('SVGPathSegCurvetoCubicAbs.x')
   @DocsEditable()
-  num get x => _blink.BlinkSVGPathSegCurvetoCubicAbs.x_Getter(this);
+  num get x => _blink.BlinkSVGPathSegCurvetoCubicAbs.instance.x_Getter_(this);
 
   @DomName('SVGPathSegCurvetoCubicAbs.x')
   @DocsEditable()
-  void set x(num value) => _blink.BlinkSVGPathSegCurvetoCubicAbs.x_Setter(this, value);
+  void set x(num value) => _blink.BlinkSVGPathSegCurvetoCubicAbs.instance.x_Setter_(this, value);
 
   @DomName('SVGPathSegCurvetoCubicAbs.x1')
   @DocsEditable()
-  num get x1 => _blink.BlinkSVGPathSegCurvetoCubicAbs.x1_Getter(this);
+  num get x1 => _blink.BlinkSVGPathSegCurvetoCubicAbs.instance.x1_Getter_(this);
 
   @DomName('SVGPathSegCurvetoCubicAbs.x1')
   @DocsEditable()
-  void set x1(num value) => _blink.BlinkSVGPathSegCurvetoCubicAbs.x1_Setter(this, value);
+  void set x1(num value) => _blink.BlinkSVGPathSegCurvetoCubicAbs.instance.x1_Setter_(this, value);
 
   @DomName('SVGPathSegCurvetoCubicAbs.x2')
   @DocsEditable()
-  num get x2 => _blink.BlinkSVGPathSegCurvetoCubicAbs.x2_Getter(this);
+  num get x2 => _blink.BlinkSVGPathSegCurvetoCubicAbs.instance.x2_Getter_(this);
 
   @DomName('SVGPathSegCurvetoCubicAbs.x2')
   @DocsEditable()
-  void set x2(num value) => _blink.BlinkSVGPathSegCurvetoCubicAbs.x2_Setter(this, value);
+  void set x2(num value) => _blink.BlinkSVGPathSegCurvetoCubicAbs.instance.x2_Setter_(this, value);
 
   @DomName('SVGPathSegCurvetoCubicAbs.y')
   @DocsEditable()
-  num get y => _blink.BlinkSVGPathSegCurvetoCubicAbs.y_Getter(this);
+  num get y => _blink.BlinkSVGPathSegCurvetoCubicAbs.instance.y_Getter_(this);
 
   @DomName('SVGPathSegCurvetoCubicAbs.y')
   @DocsEditable()
-  void set y(num value) => _blink.BlinkSVGPathSegCurvetoCubicAbs.y_Setter(this, value);
+  void set y(num value) => _blink.BlinkSVGPathSegCurvetoCubicAbs.instance.y_Setter_(this, value);
 
   @DomName('SVGPathSegCurvetoCubicAbs.y1')
   @DocsEditable()
-  num get y1 => _blink.BlinkSVGPathSegCurvetoCubicAbs.y1_Getter(this);
+  num get y1 => _blink.BlinkSVGPathSegCurvetoCubicAbs.instance.y1_Getter_(this);
 
   @DomName('SVGPathSegCurvetoCubicAbs.y1')
   @DocsEditable()
-  void set y1(num value) => _blink.BlinkSVGPathSegCurvetoCubicAbs.y1_Setter(this, value);
+  void set y1(num value) => _blink.BlinkSVGPathSegCurvetoCubicAbs.instance.y1_Setter_(this, value);
 
   @DomName('SVGPathSegCurvetoCubicAbs.y2')
   @DocsEditable()
-  num get y2 => _blink.BlinkSVGPathSegCurvetoCubicAbs.y2_Getter(this);
+  num get y2 => _blink.BlinkSVGPathSegCurvetoCubicAbs.instance.y2_Getter_(this);
 
   @DomName('SVGPathSegCurvetoCubicAbs.y2')
   @DocsEditable()
-  void set y2(num value) => _blink.BlinkSVGPathSegCurvetoCubicAbs.y2_Setter(this, value);
+  void set y2(num value) => _blink.BlinkSVGPathSegCurvetoCubicAbs.instance.y2_Setter_(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3995,51 +3995,51 @@
 
   @DomName('SVGPathSegCurvetoCubicRel.x')
   @DocsEditable()
-  num get x => _blink.BlinkSVGPathSegCurvetoCubicRel.x_Getter(this);
+  num get x => _blink.BlinkSVGPathSegCurvetoCubicRel.instance.x_Getter_(this);
 
   @DomName('SVGPathSegCurvetoCubicRel.x')
   @DocsEditable()
-  void set x(num value) => _blink.BlinkSVGPathSegCurvetoCubicRel.x_Setter(this, value);
+  void set x(num value) => _blink.BlinkSVGPathSegCurvetoCubicRel.instance.x_Setter_(this, value);
 
   @DomName('SVGPathSegCurvetoCubicRel.x1')
   @DocsEditable()
-  num get x1 => _blink.BlinkSVGPathSegCurvetoCubicRel.x1_Getter(this);
+  num get x1 => _blink.BlinkSVGPathSegCurvetoCubicRel.instance.x1_Getter_(this);
 
   @DomName('SVGPathSegCurvetoCubicRel.x1')
   @DocsEditable()
-  void set x1(num value) => _blink.BlinkSVGPathSegCurvetoCubicRel.x1_Setter(this, value);
+  void set x1(num value) => _blink.BlinkSVGPathSegCurvetoCubicRel.instance.x1_Setter_(this, value);
 
   @DomName('SVGPathSegCurvetoCubicRel.x2')
   @DocsEditable()
-  num get x2 => _blink.BlinkSVGPathSegCurvetoCubicRel.x2_Getter(this);
+  num get x2 => _blink.BlinkSVGPathSegCurvetoCubicRel.instance.x2_Getter_(this);
 
   @DomName('SVGPathSegCurvetoCubicRel.x2')
   @DocsEditable()
-  void set x2(num value) => _blink.BlinkSVGPathSegCurvetoCubicRel.x2_Setter(this, value);
+  void set x2(num value) => _blink.BlinkSVGPathSegCurvetoCubicRel.instance.x2_Setter_(this, value);
 
   @DomName('SVGPathSegCurvetoCubicRel.y')
   @DocsEditable()
-  num get y => _blink.BlinkSVGPathSegCurvetoCubicRel.y_Getter(this);
+  num get y => _blink.BlinkSVGPathSegCurvetoCubicRel.instance.y_Getter_(this);
 
   @DomName('SVGPathSegCurvetoCubicRel.y')
   @DocsEditable()
-  void set y(num value) => _blink.BlinkSVGPathSegCurvetoCubicRel.y_Setter(this, value);
+  void set y(num value) => _blink.BlinkSVGPathSegCurvetoCubicRel.instance.y_Setter_(this, value);
 
   @DomName('SVGPathSegCurvetoCubicRel.y1')
   @DocsEditable()
-  num get y1 => _blink.BlinkSVGPathSegCurvetoCubicRel.y1_Getter(this);
+  num get y1 => _blink.BlinkSVGPathSegCurvetoCubicRel.instance.y1_Getter_(this);
 
   @DomName('SVGPathSegCurvetoCubicRel.y1')
   @DocsEditable()
-  void set y1(num value) => _blink.BlinkSVGPathSegCurvetoCubicRel.y1_Setter(this, value);
+  void set y1(num value) => _blink.BlinkSVGPathSegCurvetoCubicRel.instance.y1_Setter_(this, value);
 
   @DomName('SVGPathSegCurvetoCubicRel.y2')
   @DocsEditable()
-  num get y2 => _blink.BlinkSVGPathSegCurvetoCubicRel.y2_Getter(this);
+  num get y2 => _blink.BlinkSVGPathSegCurvetoCubicRel.instance.y2_Getter_(this);
 
   @DomName('SVGPathSegCurvetoCubicRel.y2')
   @DocsEditable()
-  void set y2(num value) => _blink.BlinkSVGPathSegCurvetoCubicRel.y2_Setter(this, value);
+  void set y2(num value) => _blink.BlinkSVGPathSegCurvetoCubicRel.instance.y2_Setter_(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4058,35 +4058,35 @@
 
   @DomName('SVGPathSegCurvetoCubicSmoothAbs.x')
   @DocsEditable()
-  num get x => _blink.BlinkSVGPathSegCurvetoCubicSmoothAbs.x_Getter(this);
+  num get x => _blink.BlinkSVGPathSegCurvetoCubicSmoothAbs.instance.x_Getter_(this);
 
   @DomName('SVGPathSegCurvetoCubicSmoothAbs.x')
   @DocsEditable()
-  void set x(num value) => _blink.BlinkSVGPathSegCurvetoCubicSmoothAbs.x_Setter(this, value);
+  void set x(num value) => _blink.BlinkSVGPathSegCurvetoCubicSmoothAbs.instance.x_Setter_(this, value);
 
   @DomName('SVGPathSegCurvetoCubicSmoothAbs.x2')
   @DocsEditable()
-  num get x2 => _blink.BlinkSVGPathSegCurvetoCubicSmoothAbs.x2_Getter(this);
+  num get x2 => _blink.BlinkSVGPathSegCurvetoCubicSmoothAbs.instance.x2_Getter_(this);
 
   @DomName('SVGPathSegCurvetoCubicSmoothAbs.x2')
   @DocsEditable()
-  void set x2(num value) => _blink.BlinkSVGPathSegCurvetoCubicSmoothAbs.x2_Setter(this, value);
+  void set x2(num value) => _blink.BlinkSVGPathSegCurvetoCubicSmoothAbs.instance.x2_Setter_(this, value);
 
   @DomName('SVGPathSegCurvetoCubicSmoothAbs.y')
   @DocsEditable()
-  num get y => _blink.BlinkSVGPathSegCurvetoCubicSmoothAbs.y_Getter(this);
+  num get y => _blink.BlinkSVGPathSegCurvetoCubicSmoothAbs.instance.y_Getter_(this);
 
   @DomName('SVGPathSegCurvetoCubicSmoothAbs.y')
   @DocsEditable()
-  void set y(num value) => _blink.BlinkSVGPathSegCurvetoCubicSmoothAbs.y_Setter(this, value);
+  void set y(num value) => _blink.BlinkSVGPathSegCurvetoCubicSmoothAbs.instance.y_Setter_(this, value);
 
   @DomName('SVGPathSegCurvetoCubicSmoothAbs.y2')
   @DocsEditable()
-  num get y2 => _blink.BlinkSVGPathSegCurvetoCubicSmoothAbs.y2_Getter(this);
+  num get y2 => _blink.BlinkSVGPathSegCurvetoCubicSmoothAbs.instance.y2_Getter_(this);
 
   @DomName('SVGPathSegCurvetoCubicSmoothAbs.y2')
   @DocsEditable()
-  void set y2(num value) => _blink.BlinkSVGPathSegCurvetoCubicSmoothAbs.y2_Setter(this, value);
+  void set y2(num value) => _blink.BlinkSVGPathSegCurvetoCubicSmoothAbs.instance.y2_Setter_(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4105,35 +4105,35 @@
 
   @DomName('SVGPathSegCurvetoCubicSmoothRel.x')
   @DocsEditable()
-  num get x => _blink.BlinkSVGPathSegCurvetoCubicSmoothRel.x_Getter(this);
+  num get x => _blink.BlinkSVGPathSegCurvetoCubicSmoothRel.instance.x_Getter_(this);
 
   @DomName('SVGPathSegCurvetoCubicSmoothRel.x')
   @DocsEditable()
-  void set x(num value) => _blink.BlinkSVGPathSegCurvetoCubicSmoothRel.x_Setter(this, value);
+  void set x(num value) => _blink.BlinkSVGPathSegCurvetoCubicSmoothRel.instance.x_Setter_(this, value);
 
   @DomName('SVGPathSegCurvetoCubicSmoothRel.x2')
   @DocsEditable()
-  num get x2 => _blink.BlinkSVGPathSegCurvetoCubicSmoothRel.x2_Getter(this);
+  num get x2 => _blink.BlinkSVGPathSegCurvetoCubicSmoothRel.instance.x2_Getter_(this);
 
   @DomName('SVGPathSegCurvetoCubicSmoothRel.x2')
   @DocsEditable()
-  void set x2(num value) => _blink.BlinkSVGPathSegCurvetoCubicSmoothRel.x2_Setter(this, value);
+  void set x2(num value) => _blink.BlinkSVGPathSegCurvetoCubicSmoothRel.instance.x2_Setter_(this, value);
 
   @DomName('SVGPathSegCurvetoCubicSmoothRel.y')
   @DocsEditable()
-  num get y => _blink.BlinkSVGPathSegCurvetoCubicSmoothRel.y_Getter(this);
+  num get y => _blink.BlinkSVGPathSegCurvetoCubicSmoothRel.instance.y_Getter_(this);
 
   @DomName('SVGPathSegCurvetoCubicSmoothRel.y')
   @DocsEditable()
-  void set y(num value) => _blink.BlinkSVGPathSegCurvetoCubicSmoothRel.y_Setter(this, value);
+  void set y(num value) => _blink.BlinkSVGPathSegCurvetoCubicSmoothRel.instance.y_Setter_(this, value);
 
   @DomName('SVGPathSegCurvetoCubicSmoothRel.y2')
   @DocsEditable()
-  num get y2 => _blink.BlinkSVGPathSegCurvetoCubicSmoothRel.y2_Getter(this);
+  num get y2 => _blink.BlinkSVGPathSegCurvetoCubicSmoothRel.instance.y2_Getter_(this);
 
   @DomName('SVGPathSegCurvetoCubicSmoothRel.y2')
   @DocsEditable()
-  void set y2(num value) => _blink.BlinkSVGPathSegCurvetoCubicSmoothRel.y2_Setter(this, value);
+  void set y2(num value) => _blink.BlinkSVGPathSegCurvetoCubicSmoothRel.instance.y2_Setter_(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4152,35 +4152,35 @@
 
   @DomName('SVGPathSegCurvetoQuadraticAbs.x')
   @DocsEditable()
-  num get x => _blink.BlinkSVGPathSegCurvetoQuadraticAbs.x_Getter(this);
+  num get x => _blink.BlinkSVGPathSegCurvetoQuadraticAbs.instance.x_Getter_(this);
 
   @DomName('SVGPathSegCurvetoQuadraticAbs.x')
   @DocsEditable()
-  void set x(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticAbs.x_Setter(this, value);
+  void set x(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticAbs.instance.x_Setter_(this, value);
 
   @DomName('SVGPathSegCurvetoQuadraticAbs.x1')
   @DocsEditable()
-  num get x1 => _blink.BlinkSVGPathSegCurvetoQuadraticAbs.x1_Getter(this);
+  num get x1 => _blink.BlinkSVGPathSegCurvetoQuadraticAbs.instance.x1_Getter_(this);
 
   @DomName('SVGPathSegCurvetoQuadraticAbs.x1')
   @DocsEditable()
-  void set x1(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticAbs.x1_Setter(this, value);
+  void set x1(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticAbs.instance.x1_Setter_(this, value);
 
   @DomName('SVGPathSegCurvetoQuadraticAbs.y')
   @DocsEditable()
-  num get y => _blink.BlinkSVGPathSegCurvetoQuadraticAbs.y_Getter(this);
+  num get y => _blink.BlinkSVGPathSegCurvetoQuadraticAbs.instance.y_Getter_(this);
 
   @DomName('SVGPathSegCurvetoQuadraticAbs.y')
   @DocsEditable()
-  void set y(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticAbs.y_Setter(this, value);
+  void set y(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticAbs.instance.y_Setter_(this, value);
 
   @DomName('SVGPathSegCurvetoQuadraticAbs.y1')
   @DocsEditable()
-  num get y1 => _blink.BlinkSVGPathSegCurvetoQuadraticAbs.y1_Getter(this);
+  num get y1 => _blink.BlinkSVGPathSegCurvetoQuadraticAbs.instance.y1_Getter_(this);
 
   @DomName('SVGPathSegCurvetoQuadraticAbs.y1')
   @DocsEditable()
-  void set y1(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticAbs.y1_Setter(this, value);
+  void set y1(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticAbs.instance.y1_Setter_(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4199,35 +4199,35 @@
 
   @DomName('SVGPathSegCurvetoQuadraticRel.x')
   @DocsEditable()
-  num get x => _blink.BlinkSVGPathSegCurvetoQuadraticRel.x_Getter(this);
+  num get x => _blink.BlinkSVGPathSegCurvetoQuadraticRel.instance.x_Getter_(this);
 
   @DomName('SVGPathSegCurvetoQuadraticRel.x')
   @DocsEditable()
-  void set x(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticRel.x_Setter(this, value);
+  void set x(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticRel.instance.x_Setter_(this, value);
 
   @DomName('SVGPathSegCurvetoQuadraticRel.x1')
   @DocsEditable()
-  num get x1 => _blink.BlinkSVGPathSegCurvetoQuadraticRel.x1_Getter(this);
+  num get x1 => _blink.BlinkSVGPathSegCurvetoQuadraticRel.instance.x1_Getter_(this);
 
   @DomName('SVGPathSegCurvetoQuadraticRel.x1')
   @DocsEditable()
-  void set x1(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticRel.x1_Setter(this, value);
+  void set x1(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticRel.instance.x1_Setter_(this, value);
 
   @DomName('SVGPathSegCurvetoQuadraticRel.y')
   @DocsEditable()
-  num get y => _blink.BlinkSVGPathSegCurvetoQuadraticRel.y_Getter(this);
+  num get y => _blink.BlinkSVGPathSegCurvetoQuadraticRel.instance.y_Getter_(this);
 
   @DomName('SVGPathSegCurvetoQuadraticRel.y')
   @DocsEditable()
-  void set y(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticRel.y_Setter(this, value);
+  void set y(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticRel.instance.y_Setter_(this, value);
 
   @DomName('SVGPathSegCurvetoQuadraticRel.y1')
   @DocsEditable()
-  num get y1 => _blink.BlinkSVGPathSegCurvetoQuadraticRel.y1_Getter(this);
+  num get y1 => _blink.BlinkSVGPathSegCurvetoQuadraticRel.instance.y1_Getter_(this);
 
   @DomName('SVGPathSegCurvetoQuadraticRel.y1')
   @DocsEditable()
-  void set y1(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticRel.y1_Setter(this, value);
+  void set y1(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticRel.instance.y1_Setter_(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4246,19 +4246,19 @@
 
   @DomName('SVGPathSegCurvetoQuadraticSmoothAbs.x')
   @DocsEditable()
-  num get x => _blink.BlinkSVGPathSegCurvetoQuadraticSmoothAbs.x_Getter(this);
+  num get x => _blink.BlinkSVGPathSegCurvetoQuadraticSmoothAbs.instance.x_Getter_(this);
 
   @DomName('SVGPathSegCurvetoQuadraticSmoothAbs.x')
   @DocsEditable()
-  void set x(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticSmoothAbs.x_Setter(this, value);
+  void set x(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticSmoothAbs.instance.x_Setter_(this, value);
 
   @DomName('SVGPathSegCurvetoQuadraticSmoothAbs.y')
   @DocsEditable()
-  num get y => _blink.BlinkSVGPathSegCurvetoQuadraticSmoothAbs.y_Getter(this);
+  num get y => _blink.BlinkSVGPathSegCurvetoQuadraticSmoothAbs.instance.y_Getter_(this);
 
   @DomName('SVGPathSegCurvetoQuadraticSmoothAbs.y')
   @DocsEditable()
-  void set y(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticSmoothAbs.y_Setter(this, value);
+  void set y(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticSmoothAbs.instance.y_Setter_(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4277,19 +4277,19 @@
 
   @DomName('SVGPathSegCurvetoQuadraticSmoothRel.x')
   @DocsEditable()
-  num get x => _blink.BlinkSVGPathSegCurvetoQuadraticSmoothRel.x_Getter(this);
+  num get x => _blink.BlinkSVGPathSegCurvetoQuadraticSmoothRel.instance.x_Getter_(this);
 
   @DomName('SVGPathSegCurvetoQuadraticSmoothRel.x')
   @DocsEditable()
-  void set x(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticSmoothRel.x_Setter(this, value);
+  void set x(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticSmoothRel.instance.x_Setter_(this, value);
 
   @DomName('SVGPathSegCurvetoQuadraticSmoothRel.y')
   @DocsEditable()
-  num get y => _blink.BlinkSVGPathSegCurvetoQuadraticSmoothRel.y_Getter(this);
+  num get y => _blink.BlinkSVGPathSegCurvetoQuadraticSmoothRel.instance.y_Getter_(this);
 
   @DomName('SVGPathSegCurvetoQuadraticSmoothRel.y')
   @DocsEditable()
-  void set y(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticSmoothRel.y_Setter(this, value);
+  void set y(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticSmoothRel.instance.y_Setter_(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4308,19 +4308,19 @@
 
   @DomName('SVGPathSegLinetoAbs.x')
   @DocsEditable()
-  num get x => _blink.BlinkSVGPathSegLinetoAbs.x_Getter(this);
+  num get x => _blink.BlinkSVGPathSegLinetoAbs.instance.x_Getter_(this);
 
   @DomName('SVGPathSegLinetoAbs.x')
   @DocsEditable()
-  void set x(num value) => _blink.BlinkSVGPathSegLinetoAbs.x_Setter(this, value);
+  void set x(num value) => _blink.BlinkSVGPathSegLinetoAbs.instance.x_Setter_(this, value);
 
   @DomName('SVGPathSegLinetoAbs.y')
   @DocsEditable()
-  num get y => _blink.BlinkSVGPathSegLinetoAbs.y_Getter(this);
+  num get y => _blink.BlinkSVGPathSegLinetoAbs.instance.y_Getter_(this);
 
   @DomName('SVGPathSegLinetoAbs.y')
   @DocsEditable()
-  void set y(num value) => _blink.BlinkSVGPathSegLinetoAbs.y_Setter(this, value);
+  void set y(num value) => _blink.BlinkSVGPathSegLinetoAbs.instance.y_Setter_(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4339,11 +4339,11 @@
 
   @DomName('SVGPathSegLinetoHorizontalAbs.x')
   @DocsEditable()
-  num get x => _blink.BlinkSVGPathSegLinetoHorizontalAbs.x_Getter(this);
+  num get x => _blink.BlinkSVGPathSegLinetoHorizontalAbs.instance.x_Getter_(this);
 
   @DomName('SVGPathSegLinetoHorizontalAbs.x')
   @DocsEditable()
-  void set x(num value) => _blink.BlinkSVGPathSegLinetoHorizontalAbs.x_Setter(this, value);
+  void set x(num value) => _blink.BlinkSVGPathSegLinetoHorizontalAbs.instance.x_Setter_(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4362,11 +4362,11 @@
 
   @DomName('SVGPathSegLinetoHorizontalRel.x')
   @DocsEditable()
-  num get x => _blink.BlinkSVGPathSegLinetoHorizontalRel.x_Getter(this);
+  num get x => _blink.BlinkSVGPathSegLinetoHorizontalRel.instance.x_Getter_(this);
 
   @DomName('SVGPathSegLinetoHorizontalRel.x')
   @DocsEditable()
-  void set x(num value) => _blink.BlinkSVGPathSegLinetoHorizontalRel.x_Setter(this, value);
+  void set x(num value) => _blink.BlinkSVGPathSegLinetoHorizontalRel.instance.x_Setter_(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4385,19 +4385,19 @@
 
   @DomName('SVGPathSegLinetoRel.x')
   @DocsEditable()
-  num get x => _blink.BlinkSVGPathSegLinetoRel.x_Getter(this);
+  num get x => _blink.BlinkSVGPathSegLinetoRel.instance.x_Getter_(this);
 
   @DomName('SVGPathSegLinetoRel.x')
   @DocsEditable()
-  void set x(num value) => _blink.BlinkSVGPathSegLinetoRel.x_Setter(this, value);
+  void set x(num value) => _blink.BlinkSVGPathSegLinetoRel.instance.x_Setter_(this, value);
 
   @DomName('SVGPathSegLinetoRel.y')
   @DocsEditable()
-  num get y => _blink.BlinkSVGPathSegLinetoRel.y_Getter(this);
+  num get y => _blink.BlinkSVGPathSegLinetoRel.instance.y_Getter_(this);
 
   @DomName('SVGPathSegLinetoRel.y')
   @DocsEditable()
-  void set y(num value) => _blink.BlinkSVGPathSegLinetoRel.y_Setter(this, value);
+  void set y(num value) => _blink.BlinkSVGPathSegLinetoRel.instance.y_Setter_(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4416,11 +4416,11 @@
 
   @DomName('SVGPathSegLinetoVerticalAbs.y')
   @DocsEditable()
-  num get y => _blink.BlinkSVGPathSegLinetoVerticalAbs.y_Getter(this);
+  num get y => _blink.BlinkSVGPathSegLinetoVerticalAbs.instance.y_Getter_(this);
 
   @DomName('SVGPathSegLinetoVerticalAbs.y')
   @DocsEditable()
-  void set y(num value) => _blink.BlinkSVGPathSegLinetoVerticalAbs.y_Setter(this, value);
+  void set y(num value) => _blink.BlinkSVGPathSegLinetoVerticalAbs.instance.y_Setter_(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4439,11 +4439,11 @@
 
   @DomName('SVGPathSegLinetoVerticalRel.y')
   @DocsEditable()
-  num get y => _blink.BlinkSVGPathSegLinetoVerticalRel.y_Getter(this);
+  num get y => _blink.BlinkSVGPathSegLinetoVerticalRel.instance.y_Getter_(this);
 
   @DomName('SVGPathSegLinetoVerticalRel.y')
   @DocsEditable()
-  void set y(num value) => _blink.BlinkSVGPathSegLinetoVerticalRel.y_Setter(this, value);
+  void set y(num value) => _blink.BlinkSVGPathSegLinetoVerticalRel.instance.y_Setter_(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4463,11 +4463,11 @@
   @DomName('SVGPathSegList.length')
   @DocsEditable()
   @Experimental() // untriaged
-  int get length => _blink.BlinkSVGPathSegList.length_Getter(this);
+  int get length => _blink.BlinkSVGPathSegList.instance.length_Getter_(this);
 
   @DomName('SVGPathSegList.numberOfItems')
   @DocsEditable()
-  int get numberOfItems => _blink.BlinkSVGPathSegList.numberOfItems_Getter(this);
+  int get numberOfItems => _blink.BlinkSVGPathSegList.instance.numberOfItems_Getter_(this);
 
   PathSeg operator[](int index) {
     if (index < 0 || index >= length)
@@ -4516,35 +4516,35 @@
   @DomName('SVGPathSegList.__setter__')
   @DocsEditable()
   @Experimental() // untriaged
-  void __setter__(int index, PathSeg value) => _blink.BlinkSVGPathSegList.$__setter___Callback_2(this, index, value);
+  void __setter__(int index, PathSeg value) => _blink.BlinkSVGPathSegList.instance.$__setter___Callback_2_(this, index, value);
 
   @DomName('SVGPathSegList.appendItem')
   @DocsEditable()
-  PathSeg appendItem(PathSeg newItem) => _blink.BlinkSVGPathSegList.appendItem_Callback_1(this, newItem);
+  PathSeg appendItem(PathSeg newItem) => _blink.BlinkSVGPathSegList.instance.appendItem_Callback_1_(this, newItem);
 
   @DomName('SVGPathSegList.clear')
   @DocsEditable()
-  void clear() => _blink.BlinkSVGPathSegList.clear_Callback(this);
+  void clear() => _blink.BlinkSVGPathSegList.instance.clear_Callback_0_(this);
 
   @DomName('SVGPathSegList.getItem')
   @DocsEditable()
-  PathSeg getItem(int index) => _blink.BlinkSVGPathSegList.getItem_Callback_1(this, index);
+  PathSeg getItem(int index) => _blink.BlinkSVGPathSegList.instance.getItem_Callback_1_(this, index);
 
   @DomName('SVGPathSegList.initialize')
   @DocsEditable()
-  PathSeg initialize(PathSeg newItem) => _blink.BlinkSVGPathSegList.initialize_Callback_1(this, newItem);
+  PathSeg initialize(PathSeg newItem) => _blink.BlinkSVGPathSegList.instance.initialize_Callback_1_(this, newItem);
 
   @DomName('SVGPathSegList.insertItemBefore')
   @DocsEditable()
-  PathSeg insertItemBefore(PathSeg newItem, int index) => _blink.BlinkSVGPathSegList.insertItemBefore_Callback_2(this, newItem, index);
+  PathSeg insertItemBefore(PathSeg newItem, int index) => _blink.BlinkSVGPathSegList.instance.insertItemBefore_Callback_2_(this, newItem, index);
 
   @DomName('SVGPathSegList.removeItem')
   @DocsEditable()
-  PathSeg removeItem(int index) => _blink.BlinkSVGPathSegList.removeItem_Callback_1(this, index);
+  PathSeg removeItem(int index) => _blink.BlinkSVGPathSegList.instance.removeItem_Callback_1_(this, index);
 
   @DomName('SVGPathSegList.replaceItem')
   @DocsEditable()
-  PathSeg replaceItem(PathSeg newItem, int index) => _blink.BlinkSVGPathSegList.replaceItem_Callback_2(this, newItem, index);
+  PathSeg replaceItem(PathSeg newItem, int index) => _blink.BlinkSVGPathSegList.instance.replaceItem_Callback_2_(this, newItem, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4563,19 +4563,19 @@
 
   @DomName('SVGPathSegMovetoAbs.x')
   @DocsEditable()
-  num get x => _blink.BlinkSVGPathSegMovetoAbs.x_Getter(this);
+  num get x => _blink.BlinkSVGPathSegMovetoAbs.instance.x_Getter_(this);
 
   @DomName('SVGPathSegMovetoAbs.x')
   @DocsEditable()
-  void set x(num value) => _blink.BlinkSVGPathSegMovetoAbs.x_Setter(this, value);
+  void set x(num value) => _blink.BlinkSVGPathSegMovetoAbs.instance.x_Setter_(this, value);
 
   @DomName('SVGPathSegMovetoAbs.y')
   @DocsEditable()
-  num get y => _blink.BlinkSVGPathSegMovetoAbs.y_Getter(this);
+  num get y => _blink.BlinkSVGPathSegMovetoAbs.instance.y_Getter_(this);
 
   @DomName('SVGPathSegMovetoAbs.y')
   @DocsEditable()
-  void set y(num value) => _blink.BlinkSVGPathSegMovetoAbs.y_Setter(this, value);
+  void set y(num value) => _blink.BlinkSVGPathSegMovetoAbs.instance.y_Setter_(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4594,19 +4594,19 @@
 
   @DomName('SVGPathSegMovetoRel.x')
   @DocsEditable()
-  num get x => _blink.BlinkSVGPathSegMovetoRel.x_Getter(this);
+  num get x => _blink.BlinkSVGPathSegMovetoRel.instance.x_Getter_(this);
 
   @DomName('SVGPathSegMovetoRel.x')
   @DocsEditable()
-  void set x(num value) => _blink.BlinkSVGPathSegMovetoRel.x_Setter(this, value);
+  void set x(num value) => _blink.BlinkSVGPathSegMovetoRel.instance.x_Setter_(this, value);
 
   @DomName('SVGPathSegMovetoRel.y')
   @DocsEditable()
-  num get y => _blink.BlinkSVGPathSegMovetoRel.y_Getter(this);
+  num get y => _blink.BlinkSVGPathSegMovetoRel.instance.y_Getter_(this);
 
   @DomName('SVGPathSegMovetoRel.y')
   @DocsEditable()
-  void set y(num value) => _blink.BlinkSVGPathSegMovetoRel.y_Setter(this, value);
+  void set y(num value) => _blink.BlinkSVGPathSegMovetoRel.instance.y_Setter_(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4635,59 +4635,59 @@
 
   @DomName('SVGPatternElement.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.BlinkSVGPatternElement.height_Getter(this);
+  AnimatedLength get height => _blink.BlinkSVGPatternElement.instance.height_Getter_(this);
 
   @DomName('SVGPatternElement.patternContentUnits')
   @DocsEditable()
-  AnimatedEnumeration get patternContentUnits => _blink.BlinkSVGPatternElement.patternContentUnits_Getter(this);
+  AnimatedEnumeration get patternContentUnits => _blink.BlinkSVGPatternElement.instance.patternContentUnits_Getter_(this);
 
   @DomName('SVGPatternElement.patternTransform')
   @DocsEditable()
-  AnimatedTransformList get patternTransform => _blink.BlinkSVGPatternElement.patternTransform_Getter(this);
+  AnimatedTransformList get patternTransform => _blink.BlinkSVGPatternElement.instance.patternTransform_Getter_(this);
 
   @DomName('SVGPatternElement.patternUnits')
   @DocsEditable()
-  AnimatedEnumeration get patternUnits => _blink.BlinkSVGPatternElement.patternUnits_Getter(this);
+  AnimatedEnumeration get patternUnits => _blink.BlinkSVGPatternElement.instance.patternUnits_Getter_(this);
 
   @DomName('SVGPatternElement.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.BlinkSVGPatternElement.width_Getter(this);
+  AnimatedLength get width => _blink.BlinkSVGPatternElement.instance.width_Getter_(this);
 
   @DomName('SVGPatternElement.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.BlinkSVGPatternElement.x_Getter(this);
+  AnimatedLength get x => _blink.BlinkSVGPatternElement.instance.x_Getter_(this);
 
   @DomName('SVGPatternElement.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.BlinkSVGPatternElement.y_Getter(this);
+  AnimatedLength get y => _blink.BlinkSVGPatternElement.instance.y_Getter_(this);
 
   @DomName('SVGPatternElement.preserveAspectRatio')
   @DocsEditable()
-  AnimatedPreserveAspectRatio get preserveAspectRatio => _blink.BlinkSVGPatternElement.preserveAspectRatio_Getter(this);
+  AnimatedPreserveAspectRatio get preserveAspectRatio => _blink.BlinkSVGPatternElement.instance.preserveAspectRatio_Getter_(this);
 
   @DomName('SVGPatternElement.viewBox')
   @DocsEditable()
-  AnimatedRect get viewBox => _blink.BlinkSVGPatternElement.viewBox_Getter(this);
+  AnimatedRect get viewBox => _blink.BlinkSVGPatternElement.instance.viewBox_Getter_(this);
 
   @DomName('SVGPatternElement.requiredExtensions')
   @DocsEditable()
-  StringList get requiredExtensions => _blink.BlinkSVGPatternElement.requiredExtensions_Getter(this);
+  StringList get requiredExtensions => _blink.BlinkSVGPatternElement.instance.requiredExtensions_Getter_(this);
 
   @DomName('SVGPatternElement.requiredFeatures')
   @DocsEditable()
-  StringList get requiredFeatures => _blink.BlinkSVGPatternElement.requiredFeatures_Getter(this);
+  StringList get requiredFeatures => _blink.BlinkSVGPatternElement.instance.requiredFeatures_Getter_(this);
 
   @DomName('SVGPatternElement.systemLanguage')
   @DocsEditable()
-  StringList get systemLanguage => _blink.BlinkSVGPatternElement.systemLanguage_Getter(this);
+  StringList get systemLanguage => _blink.BlinkSVGPatternElement.instance.systemLanguage_Getter_(this);
 
   @DomName('SVGPatternElement.hasExtension')
   @DocsEditable()
-  bool hasExtension(String extension) => _blink.BlinkSVGPatternElement.hasExtension_Callback_1(this, extension);
+  bool hasExtension(String extension) => _blink.BlinkSVGPatternElement.instance.hasExtension_Callback_1_(this, extension);
 
   @DomName('SVGPatternElement.href')
   @DocsEditable()
-  AnimatedString get href => _blink.BlinkSVGPatternElement.href_Getter(this);
+  AnimatedString get href => _blink.BlinkSVGPatternElement.instance.href_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4706,23 +4706,23 @@
 
   @DomName('SVGPoint.x')
   @DocsEditable()
-  num get x => _blink.BlinkSVGPoint.x_Getter(this);
+  num get x => _blink.BlinkSVGPoint.instance.x_Getter_(this);
 
   @DomName('SVGPoint.x')
   @DocsEditable()
-  void set x(num value) => _blink.BlinkSVGPoint.x_Setter(this, value);
+  void set x(num value) => _blink.BlinkSVGPoint.instance.x_Setter_(this, value);
 
   @DomName('SVGPoint.y')
   @DocsEditable()
-  num get y => _blink.BlinkSVGPoint.y_Getter(this);
+  num get y => _blink.BlinkSVGPoint.instance.y_Getter_(this);
 
   @DomName('SVGPoint.y')
   @DocsEditable()
-  void set y(num value) => _blink.BlinkSVGPoint.y_Setter(this, value);
+  void set y(num value) => _blink.BlinkSVGPoint.instance.y_Setter_(this, value);
 
   @DomName('SVGPoint.matrixTransform')
   @DocsEditable()
-  Point matrixTransform(Matrix matrix) => _blink.BlinkSVGPoint.matrixTransform_Callback_1(this, matrix);
+  Point matrixTransform(Matrix matrix) => _blink.BlinkSVGPoint.instance.matrixTransform_Callback_1_(this, matrix);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4742,44 +4742,44 @@
   @DomName('SVGPointList.length')
   @DocsEditable()
   @Experimental() // untriaged
-  int get length => _blink.BlinkSVGPointList.length_Getter(this);
+  int get length => _blink.BlinkSVGPointList.instance.length_Getter_(this);
 
   @DomName('SVGPointList.numberOfItems')
   @DocsEditable()
-  int get numberOfItems => _blink.BlinkSVGPointList.numberOfItems_Getter(this);
+  int get numberOfItems => _blink.BlinkSVGPointList.instance.numberOfItems_Getter_(this);
 
   @DomName('SVGPointList.__setter__')
   @DocsEditable()
   @Experimental() // untriaged
-  void __setter__(int index, Point value) => _blink.BlinkSVGPointList.$__setter___Callback_2(this, index, value);
+  void __setter__(int index, Point value) => _blink.BlinkSVGPointList.instance.$__setter___Callback_2_(this, index, value);
 
   @DomName('SVGPointList.appendItem')
   @DocsEditable()
-  Point appendItem(Point item) => _blink.BlinkSVGPointList.appendItem_Callback_1(this, item);
+  Point appendItem(Point item) => _blink.BlinkSVGPointList.instance.appendItem_Callback_1_(this, item);
 
   @DomName('SVGPointList.clear')
   @DocsEditable()
-  void clear() => _blink.BlinkSVGPointList.clear_Callback(this);
+  void clear() => _blink.BlinkSVGPointList.instance.clear_Callback_0_(this);
 
   @DomName('SVGPointList.getItem')
   @DocsEditable()
-  Point getItem(int index) => _blink.BlinkSVGPointList.getItem_Callback_1(this, index);
+  Point getItem(int index) => _blink.BlinkSVGPointList.instance.getItem_Callback_1_(this, index);
 
   @DomName('SVGPointList.initialize')
   @DocsEditable()
-  Point initialize(Point item) => _blink.BlinkSVGPointList.initialize_Callback_1(this, item);
+  Point initialize(Point item) => _blink.BlinkSVGPointList.instance.initialize_Callback_1_(this, item);
 
   @DomName('SVGPointList.insertItemBefore')
   @DocsEditable()
-  Point insertItemBefore(Point item, int index) => _blink.BlinkSVGPointList.insertItemBefore_Callback_2(this, item, index);
+  Point insertItemBefore(Point item, int index) => _blink.BlinkSVGPointList.instance.insertItemBefore_Callback_2_(this, item, index);
 
   @DomName('SVGPointList.removeItem')
   @DocsEditable()
-  Point removeItem(int index) => _blink.BlinkSVGPointList.removeItem_Callback_1(this, index);
+  Point removeItem(int index) => _blink.BlinkSVGPointList.instance.removeItem_Callback_1_(this, index);
 
   @DomName('SVGPointList.replaceItem')
   @DocsEditable()
-  Point replaceItem(Point item, int index) => _blink.BlinkSVGPointList.replaceItem_Callback_2(this, item, index);
+  Point replaceItem(Point item, int index) => _blink.BlinkSVGPointList.instance.replaceItem_Callback_2_(this, item, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4808,11 +4808,11 @@
 
   @DomName('SVGPolygonElement.animatedPoints')
   @DocsEditable()
-  PointList get animatedPoints => _blink.BlinkSVGPolygonElement.animatedPoints_Getter(this);
+  PointList get animatedPoints => _blink.BlinkSVGPolygonElement.instance.animatedPoints_Getter_(this);
 
   @DomName('SVGPolygonElement.points')
   @DocsEditable()
-  PointList get points => _blink.BlinkSVGPolygonElement.points_Getter(this);
+  PointList get points => _blink.BlinkSVGPolygonElement.instance.points_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4841,11 +4841,11 @@
 
   @DomName('SVGPolylineElement.animatedPoints')
   @DocsEditable()
-  PointList get animatedPoints => _blink.BlinkSVGPolylineElement.animatedPoints_Getter(this);
+  PointList get animatedPoints => _blink.BlinkSVGPolylineElement.instance.animatedPoints_Getter_(this);
 
   @DomName('SVGPolylineElement.points')
   @DocsEditable()
-  PointList get points => _blink.BlinkSVGPolylineElement.points_Getter(this);
+  PointList get points => _blink.BlinkSVGPolylineElement.instance.points_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4920,19 +4920,19 @@
 
   @DomName('SVGPreserveAspectRatio.align')
   @DocsEditable()
-  int get align => _blink.BlinkSVGPreserveAspectRatio.align_Getter(this);
+  int get align => _blink.BlinkSVGPreserveAspectRatio.instance.align_Getter_(this);
 
   @DomName('SVGPreserveAspectRatio.align')
   @DocsEditable()
-  void set align(int value) => _blink.BlinkSVGPreserveAspectRatio.align_Setter(this, value);
+  void set align(int value) => _blink.BlinkSVGPreserveAspectRatio.instance.align_Setter_(this, value);
 
   @DomName('SVGPreserveAspectRatio.meetOrSlice')
   @DocsEditable()
-  int get meetOrSlice => _blink.BlinkSVGPreserveAspectRatio.meetOrSlice_Getter(this);
+  int get meetOrSlice => _blink.BlinkSVGPreserveAspectRatio.instance.meetOrSlice_Getter_(this);
 
   @DomName('SVGPreserveAspectRatio.meetOrSlice')
   @DocsEditable()
-  void set meetOrSlice(int value) => _blink.BlinkSVGPreserveAspectRatio.meetOrSlice_Setter(this, value);
+  void set meetOrSlice(int value) => _blink.BlinkSVGPreserveAspectRatio.instance.meetOrSlice_Setter_(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4961,27 +4961,27 @@
 
   @DomName('SVGRadialGradientElement.cx')
   @DocsEditable()
-  AnimatedLength get cx => _blink.BlinkSVGRadialGradientElement.cx_Getter(this);
+  AnimatedLength get cx => _blink.BlinkSVGRadialGradientElement.instance.cx_Getter_(this);
 
   @DomName('SVGRadialGradientElement.cy')
   @DocsEditable()
-  AnimatedLength get cy => _blink.BlinkSVGRadialGradientElement.cy_Getter(this);
+  AnimatedLength get cy => _blink.BlinkSVGRadialGradientElement.instance.cy_Getter_(this);
 
   @DomName('SVGRadialGradientElement.fr')
   @DocsEditable()
-  AnimatedLength get fr => _blink.BlinkSVGRadialGradientElement.fr_Getter(this);
+  AnimatedLength get fr => _blink.BlinkSVGRadialGradientElement.instance.fr_Getter_(this);
 
   @DomName('SVGRadialGradientElement.fx')
   @DocsEditable()
-  AnimatedLength get fx => _blink.BlinkSVGRadialGradientElement.fx_Getter(this);
+  AnimatedLength get fx => _blink.BlinkSVGRadialGradientElement.instance.fx_Getter_(this);
 
   @DomName('SVGRadialGradientElement.fy')
   @DocsEditable()
-  AnimatedLength get fy => _blink.BlinkSVGRadialGradientElement.fy_Getter(this);
+  AnimatedLength get fy => _blink.BlinkSVGRadialGradientElement.instance.fy_Getter_(this);
 
   @DomName('SVGRadialGradientElement.r')
   @DocsEditable()
-  AnimatedLength get r => _blink.BlinkSVGRadialGradientElement.r_Getter(this);
+  AnimatedLength get r => _blink.BlinkSVGRadialGradientElement.instance.r_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5000,35 +5000,35 @@
 
   @DomName('SVGRect.height')
   @DocsEditable()
-  num get height => _blink.BlinkSVGRect.height_Getter(this);
+  num get height => _blink.BlinkSVGRect.instance.height_Getter_(this);
 
   @DomName('SVGRect.height')
   @DocsEditable()
-  void set height(num value) => _blink.BlinkSVGRect.height_Setter(this, value);
+  void set height(num value) => _blink.BlinkSVGRect.instance.height_Setter_(this, value);
 
   @DomName('SVGRect.width')
   @DocsEditable()
-  num get width => _blink.BlinkSVGRect.width_Getter(this);
+  num get width => _blink.BlinkSVGRect.instance.width_Getter_(this);
 
   @DomName('SVGRect.width')
   @DocsEditable()
-  void set width(num value) => _blink.BlinkSVGRect.width_Setter(this, value);
+  void set width(num value) => _blink.BlinkSVGRect.instance.width_Setter_(this, value);
 
   @DomName('SVGRect.x')
   @DocsEditable()
-  num get x => _blink.BlinkSVGRect.x_Getter(this);
+  num get x => _blink.BlinkSVGRect.instance.x_Getter_(this);
 
   @DomName('SVGRect.x')
   @DocsEditable()
-  void set x(num value) => _blink.BlinkSVGRect.x_Setter(this, value);
+  void set x(num value) => _blink.BlinkSVGRect.instance.x_Setter_(this, value);
 
   @DomName('SVGRect.y')
   @DocsEditable()
-  num get y => _blink.BlinkSVGRect.y_Getter(this);
+  num get y => _blink.BlinkSVGRect.instance.y_Getter_(this);
 
   @DomName('SVGRect.y')
   @DocsEditable()
-  void set y(num value) => _blink.BlinkSVGRect.y_Setter(this, value);
+  void set y(num value) => _blink.BlinkSVGRect.instance.y_Setter_(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5057,27 +5057,27 @@
 
   @DomName('SVGRectElement.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.BlinkSVGRectElement.height_Getter(this);
+  AnimatedLength get height => _blink.BlinkSVGRectElement.instance.height_Getter_(this);
 
   @DomName('SVGRectElement.rx')
   @DocsEditable()
-  AnimatedLength get rx => _blink.BlinkSVGRectElement.rx_Getter(this);
+  AnimatedLength get rx => _blink.BlinkSVGRectElement.instance.rx_Getter_(this);
 
   @DomName('SVGRectElement.ry')
   @DocsEditable()
-  AnimatedLength get ry => _blink.BlinkSVGRectElement.ry_Getter(this);
+  AnimatedLength get ry => _blink.BlinkSVGRectElement.instance.ry_Getter_(this);
 
   @DomName('SVGRectElement.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.BlinkSVGRectElement.width_Getter(this);
+  AnimatedLength get width => _blink.BlinkSVGRectElement.instance.width_Getter_(this);
 
   @DomName('SVGRectElement.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.BlinkSVGRectElement.x_Getter(this);
+  AnimatedLength get x => _blink.BlinkSVGRectElement.instance.x_Getter_(this);
 
   @DomName('SVGRectElement.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.BlinkSVGRectElement.y_Getter(this);
+  AnimatedLength get y => _blink.BlinkSVGRectElement.instance.y_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5145,15 +5145,15 @@
 
   @DomName('SVGScriptElement.type')
   @DocsEditable()
-  String get type => _blink.BlinkSVGScriptElement.type_Getter(this);
+  String get type => _blink.BlinkSVGScriptElement.instance.type_Getter_(this);
 
   @DomName('SVGScriptElement.type')
   @DocsEditable()
-  void set type(String value) => _blink.BlinkSVGScriptElement.type_Setter(this, value);
+  void set type(String value) => _blink.BlinkSVGScriptElement.instance.type_Setter_(this, value);
 
   @DomName('SVGScriptElement.href')
   @DocsEditable()
-  AnimatedString get href => _blink.BlinkSVGScriptElement.href_Getter(this);
+  AnimatedString get href => _blink.BlinkSVGScriptElement.instance.href_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5213,7 +5213,7 @@
 
   @DomName('SVGStopElement.offset')
   @DocsEditable()
-  AnimatedNumber get gradientOffset => _blink.BlinkSVGStopElement.offset_Getter(this);
+  AnimatedNumber get gradientOffset => _blink.BlinkSVGStopElement.instance.offset_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5233,11 +5233,11 @@
   @DomName('SVGStringList.length')
   @DocsEditable()
   @Experimental() // untriaged
-  int get length => _blink.BlinkSVGStringList.length_Getter(this);
+  int get length => _blink.BlinkSVGStringList.instance.length_Getter_(this);
 
   @DomName('SVGStringList.numberOfItems')
   @DocsEditable()
-  int get numberOfItems => _blink.BlinkSVGStringList.numberOfItems_Getter(this);
+  int get numberOfItems => _blink.BlinkSVGStringList.instance.numberOfItems_Getter_(this);
 
   String operator[](int index) {
     if (index < 0 || index >= length)
@@ -5286,35 +5286,35 @@
   @DomName('SVGStringList.__setter__')
   @DocsEditable()
   @Experimental() // untriaged
-  void __setter__(int index, String value) => _blink.BlinkSVGStringList.$__setter___Callback_2(this, index, value);
+  void __setter__(int index, String value) => _blink.BlinkSVGStringList.instance.$__setter___Callback_2_(this, index, value);
 
   @DomName('SVGStringList.appendItem')
   @DocsEditable()
-  String appendItem(String item) => _blink.BlinkSVGStringList.appendItem_Callback_1(this, item);
+  String appendItem(String item) => _blink.BlinkSVGStringList.instance.appendItem_Callback_1_(this, item);
 
   @DomName('SVGStringList.clear')
   @DocsEditable()
-  void clear() => _blink.BlinkSVGStringList.clear_Callback(this);
+  void clear() => _blink.BlinkSVGStringList.instance.clear_Callback_0_(this);
 
   @DomName('SVGStringList.getItem')
   @DocsEditable()
-  String getItem(int index) => _blink.BlinkSVGStringList.getItem_Callback_1(this, index);
+  String getItem(int index) => _blink.BlinkSVGStringList.instance.getItem_Callback_1_(this, index);
 
   @DomName('SVGStringList.initialize')
   @DocsEditable()
-  String initialize(String item) => _blink.BlinkSVGStringList.initialize_Callback_1(this, item);
+  String initialize(String item) => _blink.BlinkSVGStringList.instance.initialize_Callback_1_(this, item);
 
   @DomName('SVGStringList.insertItemBefore')
   @DocsEditable()
-  String insertItemBefore(String item, int index) => _blink.BlinkSVGStringList.insertItemBefore_Callback_2(this, item, index);
+  String insertItemBefore(String item, int index) => _blink.BlinkSVGStringList.instance.insertItemBefore_Callback_2_(this, item, index);
 
   @DomName('SVGStringList.removeItem')
   @DocsEditable()
-  String removeItem(int index) => _blink.BlinkSVGStringList.removeItem_Callback_1(this, index);
+  String removeItem(int index) => _blink.BlinkSVGStringList.instance.removeItem_Callback_1_(this, index);
 
   @DomName('SVGStringList.replaceItem')
   @DocsEditable()
-  String replaceItem(String item, int index) => _blink.BlinkSVGStringList.replaceItem_Callback_2(this, item, index);
+  String replaceItem(String item, int index) => _blink.BlinkSVGStringList.instance.replaceItem_Callback_2_(this, item, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5344,40 +5344,40 @@
 
   @DomName('SVGStyleElement.disabled')
   @DocsEditable()
-  bool get disabled => _blink.BlinkSVGStyleElement.disabled_Getter(this);
+  bool get disabled => _blink.BlinkSVGStyleElement.instance.disabled_Getter_(this);
 
   @DomName('SVGStyleElement.disabled')
   @DocsEditable()
-  void set disabled(bool value) => _blink.BlinkSVGStyleElement.disabled_Setter(this, value);
+  void set disabled(bool value) => _blink.BlinkSVGStyleElement.instance.disabled_Setter_(this, value);
 
   @DomName('SVGStyleElement.media')
   @DocsEditable()
-  String get media => _blink.BlinkSVGStyleElement.media_Getter(this);
+  String get media => _blink.BlinkSVGStyleElement.instance.media_Getter_(this);
 
   @DomName('SVGStyleElement.media')
   @DocsEditable()
-  void set media(String value) => _blink.BlinkSVGStyleElement.media_Setter(this, value);
+  void set media(String value) => _blink.BlinkSVGStyleElement.instance.media_Setter_(this, value);
 
   @DomName('SVGStyleElement.sheet')
   @DocsEditable()
   @Experimental() // untriaged
-  StyleSheet get sheet => _blink.BlinkSVGStyleElement.sheet_Getter(this);
+  StyleSheet get sheet => _blink.BlinkSVGStyleElement.instance.sheet_Getter_(this);
 
   @DomName('SVGStyleElement.title')
   @DocsEditable()
-  String get title => _blink.BlinkSVGStyleElement.title_Getter(this);
+  String get title => _blink.BlinkSVGStyleElement.instance.title_Getter_(this);
 
   @DomName('SVGStyleElement.title')
   @DocsEditable()
-  void set title(String value) => _blink.BlinkSVGStyleElement.title_Setter(this, value);
+  void set title(String value) => _blink.BlinkSVGStyleElement.instance.title_Setter_(this, value);
 
   @DomName('SVGStyleElement.type')
   @DocsEditable()
-  String get type => _blink.BlinkSVGStyleElement.type_Getter(this);
+  String get type => _blink.BlinkSVGStyleElement.instance.type_Getter_(this);
 
   @DomName('SVGStyleElement.type')
   @DocsEditable()
-  void set type(String value) => _blink.BlinkSVGStyleElement.type_Setter(this, value);
+  void set type(String value) => _blink.BlinkSVGStyleElement.instance.type_Setter_(this, value);
 
 }
 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
@@ -5803,58 +5803,58 @@
   @DomName('SVGElement.className')
   @DocsEditable()
   @Experimental() // untriaged
-  AnimatedString get _svgClassName => _blink.BlinkSVGElement.className_Getter(this);
+  AnimatedString get _svgClassName => _blink.BlinkSVGElement.instance.className_Getter_(this);
 
   @DomName('SVGElement.ownerSVGElement')
   @DocsEditable()
-  SvgSvgElement get ownerSvgElement => _blink.BlinkSVGElement.ownerSVGElement_Getter(this);
+  SvgSvgElement get ownerSvgElement => _blink.BlinkSVGElement.instance.ownerSVGElement_Getter_(this);
 
   @DomName('SVGElement.style')
   @DocsEditable()
   @Experimental() // untriaged
-  CssStyleDeclaration get style => _blink.BlinkSVGElement.style_Getter(this);
+  CssStyleDeclaration get style => _blink.BlinkSVGElement.instance.style_Getter_(this);
 
   @DomName('SVGElement.tabIndex')
   @DocsEditable()
   @Experimental() // untriaged
-  int get tabIndex => _blink.BlinkSVGElement.tabIndex_Getter(this);
+  int get tabIndex => _blink.BlinkSVGElement.instance.tabIndex_Getter_(this);
 
   @DomName('SVGElement.tabIndex')
   @DocsEditable()
   @Experimental() // untriaged
-  void set tabIndex(int value) => _blink.BlinkSVGElement.tabIndex_Setter(this, value);
+  void set tabIndex(int value) => _blink.BlinkSVGElement.instance.tabIndex_Setter_(this, value);
 
   @DomName('SVGElement.viewportElement')
   @DocsEditable()
-  SvgElement get viewportElement => _blink.BlinkSVGElement.viewportElement_Getter(this);
+  SvgElement get viewportElement => _blink.BlinkSVGElement.instance.viewportElement_Getter_(this);
 
   @DomName('SVGElement.xmlbase')
   @DocsEditable()
-  String get xmlbase => _blink.BlinkSVGElement.xmlbase_Getter(this);
+  String get xmlbase => _blink.BlinkSVGElement.instance.xmlbase_Getter_(this);
 
   @DomName('SVGElement.xmlbase')
   @DocsEditable()
-  void set xmlbase(String value) => _blink.BlinkSVGElement.xmlbase_Setter(this, value);
+  void set xmlbase(String value) => _blink.BlinkSVGElement.instance.xmlbase_Setter_(this, value);
 
   @DomName('SVGElement.xmllang')
   @DocsEditable()
   @Experimental() // untriaged
-  String get xmllang => _blink.BlinkSVGElement.xmllang_Getter(this);
+  String get xmllang => _blink.BlinkSVGElement.instance.xmllang_Getter_(this);
 
   @DomName('SVGElement.xmllang')
   @DocsEditable()
   @Experimental() // untriaged
-  void set xmllang(String value) => _blink.BlinkSVGElement.xmllang_Setter(this, value);
+  void set xmllang(String value) => _blink.BlinkSVGElement.instance.xmllang_Setter_(this, value);
 
   @DomName('SVGElement.xmlspace')
   @DocsEditable()
   @Experimental() // untriaged
-  String get xmlspace => _blink.BlinkSVGElement.xmlspace_Getter(this);
+  String get xmlspace => _blink.BlinkSVGElement.instance.xmlspace_Getter_(this);
 
   @DomName('SVGElement.xmlspace')
   @DocsEditable()
   @Experimental() // untriaged
-  void set xmlspace(String value) => _blink.BlinkSVGElement.xmlspace_Setter(this, value);
+  void set xmlspace(String value) => _blink.BlinkSVGElement.instance.xmlspace_Setter_(this, value);
 
   @DomName('SVGElement.onabort')
   @DocsEditable()
@@ -6143,167 +6143,167 @@
 
   @DomName('SVGSVGElement.currentScale')
   @DocsEditable()
-  num get currentScale => _blink.BlinkSVGSVGElement.currentScale_Getter(this);
+  num get currentScale => _blink.BlinkSVGSVGElement.instance.currentScale_Getter_(this);
 
   @DomName('SVGSVGElement.currentScale')
   @DocsEditable()
-  void set currentScale(num value) => _blink.BlinkSVGSVGElement.currentScale_Setter(this, value);
+  void set currentScale(num value) => _blink.BlinkSVGSVGElement.instance.currentScale_Setter_(this, value);
 
   @DomName('SVGSVGElement.currentTranslate')
   @DocsEditable()
-  Point get currentTranslate => _blink.BlinkSVGSVGElement.currentTranslate_Getter(this);
+  Point get currentTranslate => _blink.BlinkSVGSVGElement.instance.currentTranslate_Getter_(this);
 
   @DomName('SVGSVGElement.currentView')
   @DocsEditable()
-  ViewSpec get currentView => _blink.BlinkSVGSVGElement.currentView_Getter(this);
+  ViewSpec get currentView => _blink.BlinkSVGSVGElement.instance.currentView_Getter_(this);
 
   @DomName('SVGSVGElement.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.BlinkSVGSVGElement.height_Getter(this);
+  AnimatedLength get height => _blink.BlinkSVGSVGElement.instance.height_Getter_(this);
 
   @DomName('SVGSVGElement.pixelUnitToMillimeterX')
   @DocsEditable()
-  double get pixelUnitToMillimeterX => _blink.BlinkSVGSVGElement.pixelUnitToMillimeterX_Getter(this);
+  double get pixelUnitToMillimeterX => _blink.BlinkSVGSVGElement.instance.pixelUnitToMillimeterX_Getter_(this);
 
   @DomName('SVGSVGElement.pixelUnitToMillimeterY')
   @DocsEditable()
-  double get pixelUnitToMillimeterY => _blink.BlinkSVGSVGElement.pixelUnitToMillimeterY_Getter(this);
+  double get pixelUnitToMillimeterY => _blink.BlinkSVGSVGElement.instance.pixelUnitToMillimeterY_Getter_(this);
 
   @DomName('SVGSVGElement.screenPixelToMillimeterX')
   @DocsEditable()
-  double get screenPixelToMillimeterX => _blink.BlinkSVGSVGElement.screenPixelToMillimeterX_Getter(this);
+  double get screenPixelToMillimeterX => _blink.BlinkSVGSVGElement.instance.screenPixelToMillimeterX_Getter_(this);
 
   @DomName('SVGSVGElement.screenPixelToMillimeterY')
   @DocsEditable()
-  double get screenPixelToMillimeterY => _blink.BlinkSVGSVGElement.screenPixelToMillimeterY_Getter(this);
+  double get screenPixelToMillimeterY => _blink.BlinkSVGSVGElement.instance.screenPixelToMillimeterY_Getter_(this);
 
   @DomName('SVGSVGElement.useCurrentView')
   @DocsEditable()
-  bool get useCurrentView => _blink.BlinkSVGSVGElement.useCurrentView_Getter(this);
+  bool get useCurrentView => _blink.BlinkSVGSVGElement.instance.useCurrentView_Getter_(this);
 
   @DomName('SVGSVGElement.viewport')
   @DocsEditable()
-  Rect get viewport => _blink.BlinkSVGSVGElement.viewport_Getter(this);
+  Rect get viewport => _blink.BlinkSVGSVGElement.instance.viewport_Getter_(this);
 
   @DomName('SVGSVGElement.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.BlinkSVGSVGElement.width_Getter(this);
+  AnimatedLength get width => _blink.BlinkSVGSVGElement.instance.width_Getter_(this);
 
   @DomName('SVGSVGElement.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.BlinkSVGSVGElement.x_Getter(this);
+  AnimatedLength get x => _blink.BlinkSVGSVGElement.instance.x_Getter_(this);
 
   @DomName('SVGSVGElement.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.BlinkSVGSVGElement.y_Getter(this);
+  AnimatedLength get y => _blink.BlinkSVGSVGElement.instance.y_Getter_(this);
 
   @DomName('SVGSVGElement.animationsPaused')
   @DocsEditable()
-  bool animationsPaused() => _blink.BlinkSVGSVGElement.animationsPaused_Callback(this);
+  bool animationsPaused() => _blink.BlinkSVGSVGElement.instance.animationsPaused_Callback_0_(this);
 
   @DomName('SVGSVGElement.checkEnclosure')
   @DocsEditable()
-  bool checkEnclosure(SvgElement element, Rect rect) => _blink.BlinkSVGSVGElement.checkEnclosure_Callback_2(this, element, rect);
+  bool checkEnclosure(SvgElement element, Rect rect) => _blink.BlinkSVGSVGElement.instance.checkEnclosure_Callback_2_(this, element, rect);
 
   @DomName('SVGSVGElement.checkIntersection')
   @DocsEditable()
-  bool checkIntersection(SvgElement element, Rect rect) => _blink.BlinkSVGSVGElement.checkIntersection_Callback_2(this, element, rect);
+  bool checkIntersection(SvgElement element, Rect rect) => _blink.BlinkSVGSVGElement.instance.checkIntersection_Callback_2_(this, element, rect);
 
   @DomName('SVGSVGElement.createSVGAngle')
   @DocsEditable()
-  Angle createSvgAngle() => _blink.BlinkSVGSVGElement.createSVGAngle_Callback(this);
+  Angle createSvgAngle() => _blink.BlinkSVGSVGElement.instance.createSVGAngle_Callback_0_(this);
 
   @DomName('SVGSVGElement.createSVGLength')
   @DocsEditable()
-  Length createSvgLength() => _blink.BlinkSVGSVGElement.createSVGLength_Callback(this);
+  Length createSvgLength() => _blink.BlinkSVGSVGElement.instance.createSVGLength_Callback_0_(this);
 
   @DomName('SVGSVGElement.createSVGMatrix')
   @DocsEditable()
-  Matrix createSvgMatrix() => _blink.BlinkSVGSVGElement.createSVGMatrix_Callback(this);
+  Matrix createSvgMatrix() => _blink.BlinkSVGSVGElement.instance.createSVGMatrix_Callback_0_(this);
 
   @DomName('SVGSVGElement.createSVGNumber')
   @DocsEditable()
-  Number createSvgNumber() => _blink.BlinkSVGSVGElement.createSVGNumber_Callback(this);
+  Number createSvgNumber() => _blink.BlinkSVGSVGElement.instance.createSVGNumber_Callback_0_(this);
 
   @DomName('SVGSVGElement.createSVGPoint')
   @DocsEditable()
-  Point createSvgPoint() => _blink.BlinkSVGSVGElement.createSVGPoint_Callback(this);
+  Point createSvgPoint() => _blink.BlinkSVGSVGElement.instance.createSVGPoint_Callback_0_(this);
 
   @DomName('SVGSVGElement.createSVGRect')
   @DocsEditable()
-  Rect createSvgRect() => _blink.BlinkSVGSVGElement.createSVGRect_Callback(this);
+  Rect createSvgRect() => _blink.BlinkSVGSVGElement.instance.createSVGRect_Callback_0_(this);
 
   @DomName('SVGSVGElement.createSVGTransform')
   @DocsEditable()
-  Transform createSvgTransform() => _blink.BlinkSVGSVGElement.createSVGTransform_Callback(this);
+  Transform createSvgTransform() => _blink.BlinkSVGSVGElement.instance.createSVGTransform_Callback_0_(this);
 
   @DomName('SVGSVGElement.createSVGTransformFromMatrix')
   @DocsEditable()
-  Transform createSvgTransformFromMatrix(Matrix matrix) => _blink.BlinkSVGSVGElement.createSVGTransformFromMatrix_Callback_1(this, matrix);
+  Transform createSvgTransformFromMatrix(Matrix matrix) => _blink.BlinkSVGSVGElement.instance.createSVGTransformFromMatrix_Callback_1_(this, matrix);
 
   @DomName('SVGSVGElement.deselectAll')
   @DocsEditable()
-  void deselectAll() => _blink.BlinkSVGSVGElement.deselectAll_Callback(this);
+  void deselectAll() => _blink.BlinkSVGSVGElement.instance.deselectAll_Callback_0_(this);
 
   @DomName('SVGSVGElement.forceRedraw')
   @DocsEditable()
-  void forceRedraw() => _blink.BlinkSVGSVGElement.forceRedraw_Callback(this);
+  void forceRedraw() => _blink.BlinkSVGSVGElement.instance.forceRedraw_Callback_0_(this);
 
   @DomName('SVGSVGElement.getCurrentTime')
   @DocsEditable()
-  double getCurrentTime() => _blink.BlinkSVGSVGElement.getCurrentTime_Callback(this);
+  double getCurrentTime() => _blink.BlinkSVGSVGElement.instance.getCurrentTime_Callback_0_(this);
 
   @DomName('SVGSVGElement.getElementById')
   @DocsEditable()
-  Element getElementById(String elementId) => _blink.BlinkSVGSVGElement.getElementById_Callback_1(this, elementId);
+  Element getElementById(String elementId) => _blink.BlinkSVGSVGElement.instance.getElementById_Callback_1_(this, elementId);
 
   @DomName('SVGSVGElement.getEnclosureList')
   @DocsEditable()
-  List<Node> getEnclosureList(Rect rect, SvgElement referenceElement) => _blink.BlinkSVGSVGElement.getEnclosureList_Callback_2(this, rect, referenceElement);
+  List<Node> getEnclosureList(Rect rect, SvgElement referenceElement) => _blink.BlinkSVGSVGElement.instance.getEnclosureList_Callback_2_(this, rect, referenceElement);
 
   @DomName('SVGSVGElement.getIntersectionList')
   @DocsEditable()
-  List<Node> getIntersectionList(Rect rect, SvgElement referenceElement) => _blink.BlinkSVGSVGElement.getIntersectionList_Callback_2(this, rect, referenceElement);
+  List<Node> getIntersectionList(Rect rect, SvgElement referenceElement) => _blink.BlinkSVGSVGElement.instance.getIntersectionList_Callback_2_(this, rect, referenceElement);
 
   @DomName('SVGSVGElement.pauseAnimations')
   @DocsEditable()
-  void pauseAnimations() => _blink.BlinkSVGSVGElement.pauseAnimations_Callback(this);
+  void pauseAnimations() => _blink.BlinkSVGSVGElement.instance.pauseAnimations_Callback_0_(this);
 
   @DomName('SVGSVGElement.setCurrentTime')
   @DocsEditable()
-  void setCurrentTime(num seconds) => _blink.BlinkSVGSVGElement.setCurrentTime_Callback_1(this, seconds);
+  void setCurrentTime(num seconds) => _blink.BlinkSVGSVGElement.instance.setCurrentTime_Callback_1_(this, seconds);
 
   @DomName('SVGSVGElement.suspendRedraw')
   @DocsEditable()
-  int suspendRedraw(int maxWaitMilliseconds) => _blink.BlinkSVGSVGElement.suspendRedraw_Callback_1(this, maxWaitMilliseconds);
+  int suspendRedraw(int maxWaitMilliseconds) => _blink.BlinkSVGSVGElement.instance.suspendRedraw_Callback_1_(this, maxWaitMilliseconds);
 
   @DomName('SVGSVGElement.unpauseAnimations')
   @DocsEditable()
-  void unpauseAnimations() => _blink.BlinkSVGSVGElement.unpauseAnimations_Callback(this);
+  void unpauseAnimations() => _blink.BlinkSVGSVGElement.instance.unpauseAnimations_Callback_0_(this);
 
   @DomName('SVGSVGElement.unsuspendRedraw')
   @DocsEditable()
-  void unsuspendRedraw(int suspendHandleId) => _blink.BlinkSVGSVGElement.unsuspendRedraw_Callback_1(this, suspendHandleId);
+  void unsuspendRedraw(int suspendHandleId) => _blink.BlinkSVGSVGElement.instance.unsuspendRedraw_Callback_1_(this, suspendHandleId);
 
   @DomName('SVGSVGElement.unsuspendRedrawAll')
   @DocsEditable()
-  void unsuspendRedrawAll() => _blink.BlinkSVGSVGElement.unsuspendRedrawAll_Callback(this);
+  void unsuspendRedrawAll() => _blink.BlinkSVGSVGElement.instance.unsuspendRedrawAll_Callback_0_(this);
 
   @DomName('SVGSVGElement.preserveAspectRatio')
   @DocsEditable()
-  AnimatedPreserveAspectRatio get preserveAspectRatio => _blink.BlinkSVGSVGElement.preserveAspectRatio_Getter(this);
+  AnimatedPreserveAspectRatio get preserveAspectRatio => _blink.BlinkSVGSVGElement.instance.preserveAspectRatio_Getter_(this);
 
   @DomName('SVGSVGElement.viewBox')
   @DocsEditable()
-  AnimatedRect get viewBox => _blink.BlinkSVGSVGElement.viewBox_Getter(this);
+  AnimatedRect get viewBox => _blink.BlinkSVGSVGElement.instance.viewBox_Getter_(this);
 
   @DomName('SVGSVGElement.zoomAndPan')
   @DocsEditable()
-  int get zoomAndPan => _blink.BlinkSVGSVGElement.zoomAndPan_Getter(this);
+  int get zoomAndPan => _blink.BlinkSVGSVGElement.instance.zoomAndPan_Getter_(this);
 
   @DomName('SVGSVGElement.zoomAndPan')
   @DocsEditable()
-  void set zoomAndPan(int value) => _blink.BlinkSVGSVGElement.zoomAndPan_Setter(this, value);
+  void set zoomAndPan(int value) => _blink.BlinkSVGSVGElement.instance.zoomAndPan_Setter_(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6357,11 +6357,11 @@
 
   @DomName('SVGSymbolElement.preserveAspectRatio')
   @DocsEditable()
-  AnimatedPreserveAspectRatio get preserveAspectRatio => _blink.BlinkSVGSymbolElement.preserveAspectRatio_Getter(this);
+  AnimatedPreserveAspectRatio get preserveAspectRatio => _blink.BlinkSVGSymbolElement.instance.preserveAspectRatio_Getter_(this);
 
   @DomName('SVGSymbolElement.viewBox')
   @DocsEditable()
-  AnimatedRect get viewBox => _blink.BlinkSVGSymbolElement.viewBox_Getter(this);
+  AnimatedRect get viewBox => _blink.BlinkSVGSymbolElement.instance.viewBox_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6405,19 +6405,19 @@
 
   @DomName('SVGTests.requiredExtensions')
   @DocsEditable()
-  StringList get requiredExtensions => _blink.BlinkSVGTests.requiredExtensions_Getter(this);
+  StringList get requiredExtensions;
 
   @DomName('SVGTests.requiredFeatures')
   @DocsEditable()
-  StringList get requiredFeatures => _blink.BlinkSVGTests.requiredFeatures_Getter(this);
+  StringList get requiredFeatures;
 
   @DomName('SVGTests.systemLanguage')
   @DocsEditable()
-  StringList get systemLanguage => _blink.BlinkSVGTests.systemLanguage_Getter(this);
+  StringList get systemLanguage;
 
   @DomName('SVGTests.hasExtension')
   @DocsEditable()
-  bool hasExtension(String extension) => _blink.BlinkSVGTests.hasExtension_Callback_1(this, extension);
+  bool hasExtension(String extension);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6454,47 +6454,47 @@
 
   @DomName('SVGTextContentElement.lengthAdjust')
   @DocsEditable()
-  AnimatedEnumeration get lengthAdjust => _blink.BlinkSVGTextContentElement.lengthAdjust_Getter(this);
+  AnimatedEnumeration get lengthAdjust => _blink.BlinkSVGTextContentElement.instance.lengthAdjust_Getter_(this);
 
   @DomName('SVGTextContentElement.textLength')
   @DocsEditable()
-  AnimatedLength get textLength => _blink.BlinkSVGTextContentElement.textLength_Getter(this);
+  AnimatedLength get textLength => _blink.BlinkSVGTextContentElement.instance.textLength_Getter_(this);
 
   @DomName('SVGTextContentElement.getCharNumAtPosition')
   @DocsEditable()
-  int getCharNumAtPosition(Point point) => _blink.BlinkSVGTextContentElement.getCharNumAtPosition_Callback_1(this, point);
+  int getCharNumAtPosition(Point point) => _blink.BlinkSVGTextContentElement.instance.getCharNumAtPosition_Callback_1_(this, point);
 
   @DomName('SVGTextContentElement.getComputedTextLength')
   @DocsEditable()
-  double getComputedTextLength() => _blink.BlinkSVGTextContentElement.getComputedTextLength_Callback(this);
+  double getComputedTextLength() => _blink.BlinkSVGTextContentElement.instance.getComputedTextLength_Callback_0_(this);
 
   @DomName('SVGTextContentElement.getEndPositionOfChar')
   @DocsEditable()
-  Point getEndPositionOfChar(int offset) => _blink.BlinkSVGTextContentElement.getEndPositionOfChar_Callback_1(this, offset);
+  Point getEndPositionOfChar(int offset) => _blink.BlinkSVGTextContentElement.instance.getEndPositionOfChar_Callback_1_(this, offset);
 
   @DomName('SVGTextContentElement.getExtentOfChar')
   @DocsEditable()
-  Rect getExtentOfChar(int offset) => _blink.BlinkSVGTextContentElement.getExtentOfChar_Callback_1(this, offset);
+  Rect getExtentOfChar(int offset) => _blink.BlinkSVGTextContentElement.instance.getExtentOfChar_Callback_1_(this, offset);
 
   @DomName('SVGTextContentElement.getNumberOfChars')
   @DocsEditable()
-  int getNumberOfChars() => _blink.BlinkSVGTextContentElement.getNumberOfChars_Callback(this);
+  int getNumberOfChars() => _blink.BlinkSVGTextContentElement.instance.getNumberOfChars_Callback_0_(this);
 
   @DomName('SVGTextContentElement.getRotationOfChar')
   @DocsEditable()
-  double getRotationOfChar(int offset) => _blink.BlinkSVGTextContentElement.getRotationOfChar_Callback_1(this, offset);
+  double getRotationOfChar(int offset) => _blink.BlinkSVGTextContentElement.instance.getRotationOfChar_Callback_1_(this, offset);
 
   @DomName('SVGTextContentElement.getStartPositionOfChar')
   @DocsEditable()
-  Point getStartPositionOfChar(int offset) => _blink.BlinkSVGTextContentElement.getStartPositionOfChar_Callback_1(this, offset);
+  Point getStartPositionOfChar(int offset) => _blink.BlinkSVGTextContentElement.instance.getStartPositionOfChar_Callback_1_(this, offset);
 
   @DomName('SVGTextContentElement.getSubStringLength')
   @DocsEditable()
-  double getSubStringLength(int offset, int length) => _blink.BlinkSVGTextContentElement.getSubStringLength_Callback_2(this, offset, length);
+  double getSubStringLength(int offset, int length) => _blink.BlinkSVGTextContentElement.instance.getSubStringLength_Callback_2_(this, offset, length);
 
   @DomName('SVGTextContentElement.selectSubString')
   @DocsEditable()
-  void selectSubString(int offset, int length) => _blink.BlinkSVGTextContentElement.selectSubString_Callback_2(this, offset, length);
+  void selectSubString(int offset, int length) => _blink.BlinkSVGTextContentElement.instance.selectSubString_Callback_2_(this, offset, length);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6568,19 +6568,19 @@
 
   @DomName('SVGTextPathElement.method')
   @DocsEditable()
-  AnimatedEnumeration get method => _blink.BlinkSVGTextPathElement.method_Getter(this);
+  AnimatedEnumeration get method => _blink.BlinkSVGTextPathElement.instance.method_Getter_(this);
 
   @DomName('SVGTextPathElement.spacing')
   @DocsEditable()
-  AnimatedEnumeration get spacing => _blink.BlinkSVGTextPathElement.spacing_Getter(this);
+  AnimatedEnumeration get spacing => _blink.BlinkSVGTextPathElement.instance.spacing_Getter_(this);
 
   @DomName('SVGTextPathElement.startOffset')
   @DocsEditable()
-  AnimatedLength get startOffset => _blink.BlinkSVGTextPathElement.startOffset_Getter(this);
+  AnimatedLength get startOffset => _blink.BlinkSVGTextPathElement.instance.startOffset_Getter_(this);
 
   @DomName('SVGTextPathElement.href')
   @DocsEditable()
-  AnimatedString get href => _blink.BlinkSVGTextPathElement.href_Getter(this);
+  AnimatedString get href => _blink.BlinkSVGTextPathElement.instance.href_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6605,23 +6605,23 @@
 
   @DomName('SVGTextPositioningElement.dx')
   @DocsEditable()
-  AnimatedLengthList get dx => _blink.BlinkSVGTextPositioningElement.dx_Getter(this);
+  AnimatedLengthList get dx => _blink.BlinkSVGTextPositioningElement.instance.dx_Getter_(this);
 
   @DomName('SVGTextPositioningElement.dy')
   @DocsEditable()
-  AnimatedLengthList get dy => _blink.BlinkSVGTextPositioningElement.dy_Getter(this);
+  AnimatedLengthList get dy => _blink.BlinkSVGTextPositioningElement.instance.dy_Getter_(this);
 
   @DomName('SVGTextPositioningElement.rotate')
   @DocsEditable()
-  AnimatedNumberList get rotate => _blink.BlinkSVGTextPositioningElement.rotate_Getter(this);
+  AnimatedNumberList get rotate => _blink.BlinkSVGTextPositioningElement.instance.rotate_Getter_(this);
 
   @DomName('SVGTextPositioningElement.x')
   @DocsEditable()
-  AnimatedLengthList get x => _blink.BlinkSVGTextPositioningElement.x_Getter(this);
+  AnimatedLengthList get x => _blink.BlinkSVGTextPositioningElement.instance.x_Getter_(this);
 
   @DomName('SVGTextPositioningElement.y')
   @DocsEditable()
-  AnimatedLengthList get y => _blink.BlinkSVGTextPositioningElement.y_Getter(this);
+  AnimatedLengthList get y => _blink.BlinkSVGTextPositioningElement.instance.y_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6693,39 +6693,39 @@
 
   @DomName('SVGTransform.angle')
   @DocsEditable()
-  double get angle => _blink.BlinkSVGTransform.angle_Getter(this);
+  double get angle => _blink.BlinkSVGTransform.instance.angle_Getter_(this);
 
   @DomName('SVGTransform.matrix')
   @DocsEditable()
-  Matrix get matrix => _blink.BlinkSVGTransform.matrix_Getter(this);
+  Matrix get matrix => _blink.BlinkSVGTransform.instance.matrix_Getter_(this);
 
   @DomName('SVGTransform.type')
   @DocsEditable()
-  int get type => _blink.BlinkSVGTransform.type_Getter(this);
+  int get type => _blink.BlinkSVGTransform.instance.type_Getter_(this);
 
   @DomName('SVGTransform.setMatrix')
   @DocsEditable()
-  void setMatrix(Matrix matrix) => _blink.BlinkSVGTransform.setMatrix_Callback_1(this, matrix);
+  void setMatrix(Matrix matrix) => _blink.BlinkSVGTransform.instance.setMatrix_Callback_1_(this, matrix);
 
   @DomName('SVGTransform.setRotate')
   @DocsEditable()
-  void setRotate(num angle, num cx, num cy) => _blink.BlinkSVGTransform.setRotate_Callback_3(this, angle, cx, cy);
+  void setRotate(num angle, num cx, num cy) => _blink.BlinkSVGTransform.instance.setRotate_Callback_3_(this, angle, cx, cy);
 
   @DomName('SVGTransform.setScale')
   @DocsEditable()
-  void setScale(num sx, num sy) => _blink.BlinkSVGTransform.setScale_Callback_2(this, sx, sy);
+  void setScale(num sx, num sy) => _blink.BlinkSVGTransform.instance.setScale_Callback_2_(this, sx, sy);
 
   @DomName('SVGTransform.setSkewX')
   @DocsEditable()
-  void setSkewX(num angle) => _blink.BlinkSVGTransform.setSkewX_Callback_1(this, angle);
+  void setSkewX(num angle) => _blink.BlinkSVGTransform.instance.setSkewX_Callback_1_(this, angle);
 
   @DomName('SVGTransform.setSkewY')
   @DocsEditable()
-  void setSkewY(num angle) => _blink.BlinkSVGTransform.setSkewY_Callback_1(this, angle);
+  void setSkewY(num angle) => _blink.BlinkSVGTransform.instance.setSkewY_Callback_1_(this, angle);
 
   @DomName('SVGTransform.setTranslate')
   @DocsEditable()
-  void setTranslate(num tx, num ty) => _blink.BlinkSVGTransform.setTranslate_Callback_2(this, tx, ty);
+  void setTranslate(num tx, num ty) => _blink.BlinkSVGTransform.instance.setTranslate_Callback_2_(this, tx, ty);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6745,11 +6745,11 @@
   @DomName('SVGTransformList.length')
   @DocsEditable()
   @Experimental() // untriaged
-  int get length => _blink.BlinkSVGTransformList.length_Getter(this);
+  int get length => _blink.BlinkSVGTransformList.instance.length_Getter_(this);
 
   @DomName('SVGTransformList.numberOfItems')
   @DocsEditable()
-  int get numberOfItems => _blink.BlinkSVGTransformList.numberOfItems_Getter(this);
+  int get numberOfItems => _blink.BlinkSVGTransformList.instance.numberOfItems_Getter_(this);
 
   Transform operator[](int index) {
     if (index < 0 || index >= length)
@@ -6798,43 +6798,43 @@
   @DomName('SVGTransformList.__setter__')
   @DocsEditable()
   @Experimental() // untriaged
-  void __setter__(int index, Transform value) => _blink.BlinkSVGTransformList.$__setter___Callback_2(this, index, value);
+  void __setter__(int index, Transform value) => _blink.BlinkSVGTransformList.instance.$__setter___Callback_2_(this, index, value);
 
   @DomName('SVGTransformList.appendItem')
   @DocsEditable()
-  Transform appendItem(Transform item) => _blink.BlinkSVGTransformList.appendItem_Callback_1(this, item);
+  Transform appendItem(Transform item) => _blink.BlinkSVGTransformList.instance.appendItem_Callback_1_(this, item);
 
   @DomName('SVGTransformList.clear')
   @DocsEditable()
-  void clear() => _blink.BlinkSVGTransformList.clear_Callback(this);
+  void clear() => _blink.BlinkSVGTransformList.instance.clear_Callback_0_(this);
 
   @DomName('SVGTransformList.consolidate')
   @DocsEditable()
-  Transform consolidate() => _blink.BlinkSVGTransformList.consolidate_Callback(this);
+  Transform consolidate() => _blink.BlinkSVGTransformList.instance.consolidate_Callback_0_(this);
 
   @DomName('SVGTransformList.createSVGTransformFromMatrix')
   @DocsEditable()
-  Transform createSvgTransformFromMatrix(Matrix matrix) => _blink.BlinkSVGTransformList.createSVGTransformFromMatrix_Callback_1(this, matrix);
+  Transform createSvgTransformFromMatrix(Matrix matrix) => _blink.BlinkSVGTransformList.instance.createSVGTransformFromMatrix_Callback_1_(this, matrix);
 
   @DomName('SVGTransformList.getItem')
   @DocsEditable()
-  Transform getItem(int index) => _blink.BlinkSVGTransformList.getItem_Callback_1(this, index);
+  Transform getItem(int index) => _blink.BlinkSVGTransformList.instance.getItem_Callback_1_(this, index);
 
   @DomName('SVGTransformList.initialize')
   @DocsEditable()
-  Transform initialize(Transform item) => _blink.BlinkSVGTransformList.initialize_Callback_1(this, item);
+  Transform initialize(Transform item) => _blink.BlinkSVGTransformList.instance.initialize_Callback_1_(this, item);
 
   @DomName('SVGTransformList.insertItemBefore')
   @DocsEditable()
-  Transform insertItemBefore(Transform item, int index) => _blink.BlinkSVGTransformList.insertItemBefore_Callback_2(this, item, index);
+  Transform insertItemBefore(Transform item, int index) => _blink.BlinkSVGTransformList.instance.insertItemBefore_Callback_2_(this, item, index);
 
   @DomName('SVGTransformList.removeItem')
   @DocsEditable()
-  Transform removeItem(int index) => _blink.BlinkSVGTransformList.removeItem_Callback_1(this, index);
+  Transform removeItem(int index) => _blink.BlinkSVGTransformList.instance.removeItem_Callback_1_(this, index);
 
   @DomName('SVGTransformList.replaceItem')
   @DocsEditable()
-  Transform replaceItem(Transform item, int index) => _blink.BlinkSVGTransformList.replaceItem_Callback_2(this, item, index);
+  Transform replaceItem(Transform item, int index) => _blink.BlinkSVGTransformList.instance.replaceItem_Callback_2_(this, item, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6880,7 +6880,7 @@
 
   @DomName('SVGURIReference.href')
   @DocsEditable()
-  AnimatedString get href => _blink.BlinkSVGURIReference.href_Getter(this);
+  AnimatedString get href;
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6909,23 +6909,23 @@
 
   @DomName('SVGUseElement.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.BlinkSVGUseElement.height_Getter(this);
+  AnimatedLength get height => _blink.BlinkSVGUseElement.instance.height_Getter_(this);
 
   @DomName('SVGUseElement.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.BlinkSVGUseElement.width_Getter(this);
+  AnimatedLength get width => _blink.BlinkSVGUseElement.instance.width_Getter_(this);
 
   @DomName('SVGUseElement.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.BlinkSVGUseElement.x_Getter(this);
+  AnimatedLength get x => _blink.BlinkSVGUseElement.instance.x_Getter_(this);
 
   @DomName('SVGUseElement.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.BlinkSVGUseElement.y_Getter(this);
+  AnimatedLength get y => _blink.BlinkSVGUseElement.instance.y_Getter_(this);
 
   @DomName('SVGUseElement.href')
   @DocsEditable()
-  AnimatedString get href => _blink.BlinkSVGUseElement.href_Getter(this);
+  AnimatedString get href => _blink.BlinkSVGUseElement.instance.href_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6954,23 +6954,23 @@
 
   @DomName('SVGViewElement.viewTarget')
   @DocsEditable()
-  StringList get viewTarget => _blink.BlinkSVGViewElement.viewTarget_Getter(this);
+  StringList get viewTarget => _blink.BlinkSVGViewElement.instance.viewTarget_Getter_(this);
 
   @DomName('SVGViewElement.preserveAspectRatio')
   @DocsEditable()
-  AnimatedPreserveAspectRatio get preserveAspectRatio => _blink.BlinkSVGViewElement.preserveAspectRatio_Getter(this);
+  AnimatedPreserveAspectRatio get preserveAspectRatio => _blink.BlinkSVGViewElement.instance.preserveAspectRatio_Getter_(this);
 
   @DomName('SVGViewElement.viewBox')
   @DocsEditable()
-  AnimatedRect get viewBox => _blink.BlinkSVGViewElement.viewBox_Getter(this);
+  AnimatedRect get viewBox => _blink.BlinkSVGViewElement.instance.viewBox_Getter_(this);
 
   @DomName('SVGViewElement.zoomAndPan')
   @DocsEditable()
-  int get zoomAndPan => _blink.BlinkSVGViewElement.zoomAndPan_Getter(this);
+  int get zoomAndPan => _blink.BlinkSVGViewElement.instance.zoomAndPan_Getter_(this);
 
   @DomName('SVGViewElement.zoomAndPan')
   @DocsEditable()
-  void set zoomAndPan(int value) => _blink.BlinkSVGViewElement.zoomAndPan_Setter(this, value);
+  void set zoomAndPan(int value) => _blink.BlinkSVGViewElement.instance.zoomAndPan_Setter_(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6989,47 +6989,47 @@
 
   @DomName('SVGViewSpec.preserveAspectRatioString')
   @DocsEditable()
-  String get preserveAspectRatioString => _blink.BlinkSVGViewSpec.preserveAspectRatioString_Getter(this);
+  String get preserveAspectRatioString => _blink.BlinkSVGViewSpec.instance.preserveAspectRatioString_Getter_(this);
 
   @DomName('SVGViewSpec.transform')
   @DocsEditable()
-  TransformList get transform => _blink.BlinkSVGViewSpec.transform_Getter(this);
+  TransformList get transform => _blink.BlinkSVGViewSpec.instance.transform_Getter_(this);
 
   @DomName('SVGViewSpec.transformString')
   @DocsEditable()
-  String get transformString => _blink.BlinkSVGViewSpec.transformString_Getter(this);
+  String get transformString => _blink.BlinkSVGViewSpec.instance.transformString_Getter_(this);
 
   @DomName('SVGViewSpec.viewBoxString')
   @DocsEditable()
-  String get viewBoxString => _blink.BlinkSVGViewSpec.viewBoxString_Getter(this);
+  String get viewBoxString => _blink.BlinkSVGViewSpec.instance.viewBoxString_Getter_(this);
 
   @DomName('SVGViewSpec.viewTarget')
   @DocsEditable()
-  SvgElement get viewTarget => _blink.BlinkSVGViewSpec.viewTarget_Getter(this);
+  SvgElement get viewTarget => _blink.BlinkSVGViewSpec.instance.viewTarget_Getter_(this);
 
   @DomName('SVGViewSpec.viewTargetString')
   @DocsEditable()
-  String get viewTargetString => _blink.BlinkSVGViewSpec.viewTargetString_Getter(this);
+  String get viewTargetString => _blink.BlinkSVGViewSpec.instance.viewTargetString_Getter_(this);
 
   @DomName('SVGViewSpec.preserveAspectRatio')
   @DocsEditable()
   @Experimental() // nonstandard
-  AnimatedPreserveAspectRatio get preserveAspectRatio => _blink.BlinkSVGViewSpec.preserveAspectRatio_Getter(this);
+  AnimatedPreserveAspectRatio get preserveAspectRatio => _blink.BlinkSVGViewSpec.instance.preserveAspectRatio_Getter_(this);
 
   @DomName('SVGViewSpec.viewBox')
   @DocsEditable()
   @Experimental() // nonstandard
-  AnimatedRect get viewBox => _blink.BlinkSVGViewSpec.viewBox_Getter(this);
+  AnimatedRect get viewBox => _blink.BlinkSVGViewSpec.instance.viewBox_Getter_(this);
 
   @DomName('SVGViewSpec.zoomAndPan')
   @DocsEditable()
   @Experimental() // nonstandard
-  int get zoomAndPan => _blink.BlinkSVGViewSpec.zoomAndPan_Getter(this);
+  int get zoomAndPan => _blink.BlinkSVGViewSpec.instance.zoomAndPan_Getter_(this);
 
   @DomName('SVGViewSpec.zoomAndPan')
   @DocsEditable()
   @Experimental() // nonstandard
-  void set zoomAndPan(int value) => _blink.BlinkSVGViewSpec.zoomAndPan_Setter(this, value);
+  void set zoomAndPan(int value) => _blink.BlinkSVGViewSpec.instance.zoomAndPan_Setter_(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7060,11 +7060,11 @@
 
   @DomName('SVGZoomAndPan.zoomAndPan')
   @DocsEditable()
-  int get zoomAndPan => _blink.BlinkSVGZoomAndPan.zoomAndPan_Getter(this);
+  int get zoomAndPan;
 
   @DomName('SVGZoomAndPan.zoomAndPan')
   @DocsEditable()
-  void set zoomAndPan(int value) => _blink.BlinkSVGZoomAndPan.zoomAndPan_Setter(this, value);
+  void set zoomAndPan(int value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7083,23 +7083,23 @@
 
   @DomName('SVGZoomEvent.newScale')
   @DocsEditable()
-  double get newScale => _blink.BlinkSVGZoomEvent.newScale_Getter(this);
+  double get newScale => _blink.BlinkSVGZoomEvent.instance.newScale_Getter_(this);
 
   @DomName('SVGZoomEvent.newTranslate')
   @DocsEditable()
-  Point get newTranslate => _blink.BlinkSVGZoomEvent.newTranslate_Getter(this);
+  Point get newTranslate => _blink.BlinkSVGZoomEvent.instance.newTranslate_Getter_(this);
 
   @DomName('SVGZoomEvent.previousScale')
   @DocsEditable()
-  double get previousScale => _blink.BlinkSVGZoomEvent.previousScale_Getter(this);
+  double get previousScale => _blink.BlinkSVGZoomEvent.instance.previousScale_Getter_(this);
 
   @DomName('SVGZoomEvent.previousTranslate')
   @DocsEditable()
-  Point get previousTranslate => _blink.BlinkSVGZoomEvent.previousTranslate_Getter(this);
+  Point get previousTranslate => _blink.BlinkSVGZoomEvent.instance.previousTranslate_Getter_(this);
 
   @DomName('SVGZoomEvent.zoomRectScreen')
   @DocsEditable()
-  Rect get zoomRectScreen => _blink.BlinkSVGZoomEvent.zoomRectScreen_Getter(this);
+  Rect get zoomRectScreen => _blink.BlinkSVGZoomEvent.instance.zoomRectScreen_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7140,19 +7140,19 @@
 
   @DomName('SVGGradientElement.gradientTransform')
   @DocsEditable()
-  AnimatedTransformList get gradientTransform => _blink.BlinkSVGGradientElement.gradientTransform_Getter(this);
+  AnimatedTransformList get gradientTransform => _blink.BlinkSVGGradientElement.instance.gradientTransform_Getter_(this);
 
   @DomName('SVGGradientElement.gradientUnits')
   @DocsEditable()
-  AnimatedEnumeration get gradientUnits => _blink.BlinkSVGGradientElement.gradientUnits_Getter(this);
+  AnimatedEnumeration get gradientUnits => _blink.BlinkSVGGradientElement.instance.gradientUnits_Getter_(this);
 
   @DomName('SVGGradientElement.spreadMethod')
   @DocsEditable()
-  AnimatedEnumeration get spreadMethod => _blink.BlinkSVGGradientElement.spreadMethod_Getter(this);
+  AnimatedEnumeration get spreadMethod => _blink.BlinkSVGGradientElement.instance.spreadMethod_Getter_(this);
 
   @DomName('SVGGradientElement.href')
   @DocsEditable()
-  AnimatedString get href => _blink.BlinkSVGGradientElement.href_Getter(this);
+  AnimatedString get href => _blink.BlinkSVGGradientElement.instance.href_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
diff --git a/sdk/lib/web_audio/dartium/web_audio_dartium.dart b/sdk/lib/web_audio/dartium/web_audio_dartium.dart
index d21f80c..0178795 100644
--- a/sdk/lib/web_audio/dartium/web_audio_dartium.dart
+++ b/sdk/lib/web_audio/dartium/web_audio_dartium.dart
@@ -62,56 +62,56 @@
 
   @DomName('AnalyserNode.fftSize')
   @DocsEditable()
-  int get fftSize => _blink.BlinkAnalyserNode.fftSize_Getter(this);
+  int get fftSize => _blink.BlinkAnalyserNode.instance.fftSize_Getter_(this);
 
   @DomName('AnalyserNode.fftSize')
   @DocsEditable()
-  void set fftSize(int value) => _blink.BlinkAnalyserNode.fftSize_Setter(this, value);
+  void set fftSize(int value) => _blink.BlinkAnalyserNode.instance.fftSize_Setter_(this, value);
 
   @DomName('AnalyserNode.frequencyBinCount')
   @DocsEditable()
-  int get frequencyBinCount => _blink.BlinkAnalyserNode.frequencyBinCount_Getter(this);
+  int get frequencyBinCount => _blink.BlinkAnalyserNode.instance.frequencyBinCount_Getter_(this);
 
   @DomName('AnalyserNode.maxDecibels')
   @DocsEditable()
-  num get maxDecibels => _blink.BlinkAnalyserNode.maxDecibels_Getter(this);
+  num get maxDecibels => _blink.BlinkAnalyserNode.instance.maxDecibels_Getter_(this);
 
   @DomName('AnalyserNode.maxDecibels')
   @DocsEditable()
-  void set maxDecibels(num value) => _blink.BlinkAnalyserNode.maxDecibels_Setter(this, value);
+  void set maxDecibels(num value) => _blink.BlinkAnalyserNode.instance.maxDecibels_Setter_(this, value);
 
   @DomName('AnalyserNode.minDecibels')
   @DocsEditable()
-  num get minDecibels => _blink.BlinkAnalyserNode.minDecibels_Getter(this);
+  num get minDecibels => _blink.BlinkAnalyserNode.instance.minDecibels_Getter_(this);
 
   @DomName('AnalyserNode.minDecibels')
   @DocsEditable()
-  void set minDecibels(num value) => _blink.BlinkAnalyserNode.minDecibels_Setter(this, value);
+  void set minDecibels(num value) => _blink.BlinkAnalyserNode.instance.minDecibels_Setter_(this, value);
 
   @DomName('AnalyserNode.smoothingTimeConstant')
   @DocsEditable()
-  num get smoothingTimeConstant => _blink.BlinkAnalyserNode.smoothingTimeConstant_Getter(this);
+  num get smoothingTimeConstant => _blink.BlinkAnalyserNode.instance.smoothingTimeConstant_Getter_(this);
 
   @DomName('AnalyserNode.smoothingTimeConstant')
   @DocsEditable()
-  void set smoothingTimeConstant(num value) => _blink.BlinkAnalyserNode.smoothingTimeConstant_Setter(this, value);
+  void set smoothingTimeConstant(num value) => _blink.BlinkAnalyserNode.instance.smoothingTimeConstant_Setter_(this, value);
 
   @DomName('AnalyserNode.getByteFrequencyData')
   @DocsEditable()
-  void getByteFrequencyData(Uint8List array) => _blink.BlinkAnalyserNode.getByteFrequencyData_Callback_1(this, array);
+  void getByteFrequencyData(Uint8List array) => _blink.BlinkAnalyserNode.instance.getByteFrequencyData_Callback_1_(this, array);
 
   @DomName('AnalyserNode.getByteTimeDomainData')
   @DocsEditable()
-  void getByteTimeDomainData(Uint8List array) => _blink.BlinkAnalyserNode.getByteTimeDomainData_Callback_1(this, array);
+  void getByteTimeDomainData(Uint8List array) => _blink.BlinkAnalyserNode.instance.getByteTimeDomainData_Callback_1_(this, array);
 
   @DomName('AnalyserNode.getFloatFrequencyData')
   @DocsEditable()
-  void getFloatFrequencyData(Float32List array) => _blink.BlinkAnalyserNode.getFloatFrequencyData_Callback_1(this, array);
+  void getFloatFrequencyData(Float32List array) => _blink.BlinkAnalyserNode.instance.getFloatFrequencyData_Callback_1_(this, array);
 
   @DomName('AnalyserNode.getFloatTimeDomainData')
   @DocsEditable()
   @Experimental() // untriaged
-  void getFloatTimeDomainData(Float32List array) => _blink.BlinkAnalyserNode.getFloatTimeDomainData_Callback_1(this, array);
+  void getFloatTimeDomainData(Float32List array) => _blink.BlinkAnalyserNode.instance.getFloatTimeDomainData_Callback_1_(this, array);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -131,23 +131,23 @@
 
   @DomName('AudioBuffer.duration')
   @DocsEditable()
-  double get duration => _blink.BlinkAudioBuffer.duration_Getter(this);
+  double get duration => _blink.BlinkAudioBuffer.instance.duration_Getter_(this);
 
   @DomName('AudioBuffer.length')
   @DocsEditable()
-  int get length => _blink.BlinkAudioBuffer.length_Getter(this);
+  int get length => _blink.BlinkAudioBuffer.instance.length_Getter_(this);
 
   @DomName('AudioBuffer.numberOfChannels')
   @DocsEditable()
-  int get numberOfChannels => _blink.BlinkAudioBuffer.numberOfChannels_Getter(this);
+  int get numberOfChannels => _blink.BlinkAudioBuffer.instance.numberOfChannels_Getter_(this);
 
   @DomName('AudioBuffer.sampleRate')
   @DocsEditable()
-  double get sampleRate => _blink.BlinkAudioBuffer.sampleRate_Getter(this);
+  double get sampleRate => _blink.BlinkAudioBuffer.instance.sampleRate_Getter_(this);
 
   @DomName('AudioBuffer.getChannelData')
   @DocsEditable()
-  Float32List getChannelData(int channelIndex) => _blink.BlinkAudioBuffer.getChannelData_Callback_1(this, channelIndex);
+  Float32List getChannelData(int channelIndex) => _blink.BlinkAudioBuffer.instance.getChannelData_Callback_1_(this, channelIndex);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -191,63 +191,63 @@
 
   @DomName('AudioBufferSourceNode.buffer')
   @DocsEditable()
-  AudioBuffer get buffer => _blink.BlinkAudioBufferSourceNode.buffer_Getter(this);
+  AudioBuffer get buffer => _blink.BlinkAudioBufferSourceNode.instance.buffer_Getter_(this);
 
   @DomName('AudioBufferSourceNode.buffer')
   @DocsEditable()
-  void set buffer(AudioBuffer value) => _blink.BlinkAudioBufferSourceNode.buffer_Setter(this, value);
+  void set buffer(AudioBuffer value) => _blink.BlinkAudioBufferSourceNode.instance.buffer_Setter_(this, value);
 
   @DomName('AudioBufferSourceNode.loop')
   @DocsEditable()
-  bool get loop => _blink.BlinkAudioBufferSourceNode.loop_Getter(this);
+  bool get loop => _blink.BlinkAudioBufferSourceNode.instance.loop_Getter_(this);
 
   @DomName('AudioBufferSourceNode.loop')
   @DocsEditable()
-  void set loop(bool value) => _blink.BlinkAudioBufferSourceNode.loop_Setter(this, value);
+  void set loop(bool value) => _blink.BlinkAudioBufferSourceNode.instance.loop_Setter_(this, value);
 
   @DomName('AudioBufferSourceNode.loopEnd')
   @DocsEditable()
-  num get loopEnd => _blink.BlinkAudioBufferSourceNode.loopEnd_Getter(this);
+  num get loopEnd => _blink.BlinkAudioBufferSourceNode.instance.loopEnd_Getter_(this);
 
   @DomName('AudioBufferSourceNode.loopEnd')
   @DocsEditable()
-  void set loopEnd(num value) => _blink.BlinkAudioBufferSourceNode.loopEnd_Setter(this, value);
+  void set loopEnd(num value) => _blink.BlinkAudioBufferSourceNode.instance.loopEnd_Setter_(this, value);
 
   @DomName('AudioBufferSourceNode.loopStart')
   @DocsEditable()
-  num get loopStart => _blink.BlinkAudioBufferSourceNode.loopStart_Getter(this);
+  num get loopStart => _blink.BlinkAudioBufferSourceNode.instance.loopStart_Getter_(this);
 
   @DomName('AudioBufferSourceNode.loopStart')
   @DocsEditable()
-  void set loopStart(num value) => _blink.BlinkAudioBufferSourceNode.loopStart_Setter(this, value);
+  void set loopStart(num value) => _blink.BlinkAudioBufferSourceNode.instance.loopStart_Setter_(this, value);
 
   @DomName('AudioBufferSourceNode.playbackRate')
   @DocsEditable()
-  AudioParam get playbackRate => _blink.BlinkAudioBufferSourceNode.playbackRate_Getter(this);
+  AudioParam get playbackRate => _blink.BlinkAudioBufferSourceNode.instance.playbackRate_Getter_(this);
 
   void start([num when, num grainOffset, num grainDuration]) {
     if (grainDuration != null) {
-      _blink.BlinkAudioBufferSourceNode.start_Callback_3(this, when, grainOffset, grainDuration);
+      _blink.BlinkAudioBufferSourceNode.instance.start_Callback_3_(this, when, grainOffset, grainDuration);
       return;
     }
     if (grainOffset != null) {
-      _blink.BlinkAudioBufferSourceNode.start_Callback_2(this, when, grainOffset);
+      _blink.BlinkAudioBufferSourceNode.instance.start_Callback_2_(this, when, grainOffset);
       return;
     }
     if (when != null) {
-      _blink.BlinkAudioBufferSourceNode.start_Callback_1(this, when);
+      _blink.BlinkAudioBufferSourceNode.instance.start_Callback_1_(this, when);
       return;
     }
-    _blink.BlinkAudioBufferSourceNode.start_Callback(this);
+    _blink.BlinkAudioBufferSourceNode.instance.start_Callback_0_(this);
     return;
   }
 
   void stop([num when]) {
     if (when != null) {
-      _blink.BlinkAudioBufferSourceNode.stop_Callback_1(this, when);
+      _blink.BlinkAudioBufferSourceNode.instance.stop_Callback_1_(this, when);
       return;
     }
-    _blink.BlinkAudioBufferSourceNode.stop_Callback(this);
+    _blink.BlinkAudioBufferSourceNode.instance.stop_Callback_0_(this);
     return;
   }
 
@@ -285,7 +285,7 @@
   @DomName('AudioContext.AudioContext')
   @DocsEditable()
   factory AudioContext() {
-    return _blink.BlinkAudioContext.constructorCallback();
+    return _blink.BlinkAudioContext.instance.constructorCallback_0_();
   }
 
   /// Checks if this type is supported on the current platform.
@@ -293,118 +293,118 @@
 
   @DomName('AudioContext.currentTime')
   @DocsEditable()
-  double get currentTime => _blink.BlinkAudioContext.currentTime_Getter(this);
+  double get currentTime => _blink.BlinkAudioContext.instance.currentTime_Getter_(this);
 
   @DomName('AudioContext.destination')
   @DocsEditable()
-  AudioDestinationNode get destination => _blink.BlinkAudioContext.destination_Getter(this);
+  AudioDestinationNode get destination => _blink.BlinkAudioContext.instance.destination_Getter_(this);
 
   @DomName('AudioContext.listener')
   @DocsEditable()
-  AudioListener get listener => _blink.BlinkAudioContext.listener_Getter(this);
+  AudioListener get listener => _blink.BlinkAudioContext.instance.listener_Getter_(this);
 
   @DomName('AudioContext.sampleRate')
   @DocsEditable()
-  double get sampleRate => _blink.BlinkAudioContext.sampleRate_Getter(this);
+  double get sampleRate => _blink.BlinkAudioContext.instance.sampleRate_Getter_(this);
 
   @DomName('AudioContext.createAnalyser')
   @DocsEditable()
-  AnalyserNode createAnalyser() => _blink.BlinkAudioContext.createAnalyser_Callback(this);
+  AnalyserNode createAnalyser() => _blink.BlinkAudioContext.instance.createAnalyser_Callback_0_(this);
 
   @DomName('AudioContext.createBiquadFilter')
   @DocsEditable()
-  BiquadFilterNode createBiquadFilter() => _blink.BlinkAudioContext.createBiquadFilter_Callback(this);
+  BiquadFilterNode createBiquadFilter() => _blink.BlinkAudioContext.instance.createBiquadFilter_Callback_0_(this);
 
   @DomName('AudioContext.createBuffer')
   @DocsEditable()
-  AudioBuffer createBuffer(int numberOfChannels, int numberOfFrames, num sampleRate) => _blink.BlinkAudioContext.createBuffer_Callback_3(this, numberOfChannels, numberOfFrames, sampleRate);
+  AudioBuffer createBuffer(int numberOfChannels, int numberOfFrames, num sampleRate) => _blink.BlinkAudioContext.instance.createBuffer_Callback_3_(this, numberOfChannels, numberOfFrames, sampleRate);
 
   @DomName('AudioContext.createBufferSource')
   @DocsEditable()
-  AudioBufferSourceNode createBufferSource() => _blink.BlinkAudioContext.createBufferSource_Callback(this);
+  AudioBufferSourceNode createBufferSource() => _blink.BlinkAudioContext.instance.createBufferSource_Callback_0_(this);
 
   ChannelMergerNode createChannelMerger([int numberOfInputs]) {
     if (numberOfInputs != null) {
-      return _blink.BlinkAudioContext.createChannelMerger_Callback_1(this, numberOfInputs);
+      return _blink.BlinkAudioContext.instance.createChannelMerger_Callback_1_(this, numberOfInputs);
     }
-    return _blink.BlinkAudioContext.createChannelMerger_Callback(this);
+    return _blink.BlinkAudioContext.instance.createChannelMerger_Callback_0_(this);
   }
 
   ChannelSplitterNode createChannelSplitter([int numberOfOutputs]) {
     if (numberOfOutputs != null) {
-      return _blink.BlinkAudioContext.createChannelSplitter_Callback_1(this, numberOfOutputs);
+      return _blink.BlinkAudioContext.instance.createChannelSplitter_Callback_1_(this, numberOfOutputs);
     }
-    return _blink.BlinkAudioContext.createChannelSplitter_Callback(this);
+    return _blink.BlinkAudioContext.instance.createChannelSplitter_Callback_0_(this);
   }
 
   @DomName('AudioContext.createConvolver')
   @DocsEditable()
-  ConvolverNode createConvolver() => _blink.BlinkAudioContext.createConvolver_Callback(this);
+  ConvolverNode createConvolver() => _blink.BlinkAudioContext.instance.createConvolver_Callback_0_(this);
 
   DelayNode createDelay([num maxDelayTime]) {
     if (maxDelayTime != null) {
-      return _blink.BlinkAudioContext.createDelay_Callback_1(this, maxDelayTime);
+      return _blink.BlinkAudioContext.instance.createDelay_Callback_1_(this, maxDelayTime);
     }
-    return _blink.BlinkAudioContext.createDelay_Callback(this);
+    return _blink.BlinkAudioContext.instance.createDelay_Callback_0_(this);
   }
 
   @DomName('AudioContext.createDynamicsCompressor')
   @DocsEditable()
-  DynamicsCompressorNode createDynamicsCompressor() => _blink.BlinkAudioContext.createDynamicsCompressor_Callback(this);
+  DynamicsCompressorNode createDynamicsCompressor() => _blink.BlinkAudioContext.instance.createDynamicsCompressor_Callback_0_(this);
 
   @DomName('AudioContext.createGain')
   @DocsEditable()
-  GainNode createGain() => _blink.BlinkAudioContext.createGain_Callback(this);
+  GainNode createGain() => _blink.BlinkAudioContext.instance.createGain_Callback_0_(this);
 
   @DomName('AudioContext.createMediaElementSource')
   @DocsEditable()
-  MediaElementAudioSourceNode createMediaElementSource(MediaElement mediaElement) => _blink.BlinkAudioContext.createMediaElementSource_Callback_1(this, mediaElement);
+  MediaElementAudioSourceNode createMediaElementSource(MediaElement mediaElement) => _blink.BlinkAudioContext.instance.createMediaElementSource_Callback_1_(this, mediaElement);
 
   @DomName('AudioContext.createMediaStreamDestination')
   @DocsEditable()
-  MediaStreamAudioDestinationNode createMediaStreamDestination() => _blink.BlinkAudioContext.createMediaStreamDestination_Callback(this);
+  MediaStreamAudioDestinationNode createMediaStreamDestination() => _blink.BlinkAudioContext.instance.createMediaStreamDestination_Callback_0_(this);
 
   @DomName('AudioContext.createMediaStreamSource')
   @DocsEditable()
-  MediaStreamAudioSourceNode createMediaStreamSource(MediaStream mediaStream) => _blink.BlinkAudioContext.createMediaStreamSource_Callback_1(this, mediaStream);
+  MediaStreamAudioSourceNode createMediaStreamSource(MediaStream mediaStream) => _blink.BlinkAudioContext.instance.createMediaStreamSource_Callback_1_(this, mediaStream);
 
   @DomName('AudioContext.createOscillator')
   @DocsEditable()
-  OscillatorNode createOscillator() => _blink.BlinkAudioContext.createOscillator_Callback(this);
+  OscillatorNode createOscillator() => _blink.BlinkAudioContext.instance.createOscillator_Callback_0_(this);
 
   @DomName('AudioContext.createPanner')
   @DocsEditable()
-  PannerNode createPanner() => _blink.BlinkAudioContext.createPanner_Callback(this);
+  PannerNode createPanner() => _blink.BlinkAudioContext.instance.createPanner_Callback_0_(this);
 
   @DomName('AudioContext.createPeriodicWave')
   @DocsEditable()
   @Experimental() // untriaged
-  PeriodicWave createPeriodicWave(Float32List real, Float32List imag) => _blink.BlinkAudioContext.createPeriodicWave_Callback_2(this, real, imag);
+  PeriodicWave createPeriodicWave(Float32List real, Float32List imag) => _blink.BlinkAudioContext.instance.createPeriodicWave_Callback_2_(this, real, imag);
 
   ScriptProcessorNode createScriptProcessor([int bufferSize, int numberOfInputChannels, int numberOfOutputChannels]) {
     if (numberOfOutputChannels != null) {
-      return _blink.BlinkAudioContext.createScriptProcessor_Callback_3(this, bufferSize, numberOfInputChannels, numberOfOutputChannels);
+      return _blink.BlinkAudioContext.instance.createScriptProcessor_Callback_3_(this, bufferSize, numberOfInputChannels, numberOfOutputChannels);
     }
     if (numberOfInputChannels != null) {
-      return _blink.BlinkAudioContext.createScriptProcessor_Callback_2(this, bufferSize, numberOfInputChannels);
+      return _blink.BlinkAudioContext.instance.createScriptProcessor_Callback_2_(this, bufferSize, numberOfInputChannels);
     }
     if (bufferSize != null) {
-      return _blink.BlinkAudioContext.createScriptProcessor_Callback_1(this, bufferSize);
+      return _blink.BlinkAudioContext.instance.createScriptProcessor_Callback_1_(this, bufferSize);
     }
-    return _blink.BlinkAudioContext.createScriptProcessor_Callback(this);
+    return _blink.BlinkAudioContext.instance.createScriptProcessor_Callback_0_(this);
   }
 
   @DomName('AudioContext.createWaveShaper')
   @DocsEditable()
-  WaveShaperNode createWaveShaper() => _blink.BlinkAudioContext.createWaveShaper_Callback(this);
+  WaveShaperNode createWaveShaper() => _blink.BlinkAudioContext.instance.createWaveShaper_Callback_0_(this);
 
   @DomName('AudioContext.decodeAudioData')
   @DocsEditable()
-  void _decodeAudioData(ByteBuffer audioData, AudioBufferCallback successCallback, [AudioBufferCallback errorCallback]) => _blink.BlinkAudioContext.decodeAudioData_Callback_3(this, audioData, successCallback, errorCallback);
+  void _decodeAudioData(ByteBuffer audioData, AudioBufferCallback successCallback, [AudioBufferCallback errorCallback]) => _blink.BlinkAudioContext.instance.decodeAudioData_Callback_3_(this, audioData, successCallback, errorCallback);
 
   @DomName('AudioContext.startRendering')
   @DocsEditable()
-  void startRendering() => _blink.BlinkAudioContext.startRendering_Callback(this);
+  void startRendering() => _blink.BlinkAudioContext.instance.startRendering_Callback_0_(this);
 
   /// Stream of `complete` events handled by this [AudioContext].
   @DomName('AudioContext.oncomplete')
@@ -443,7 +443,7 @@
 
   @DomName('AudioDestinationNode.maxChannelCount')
   @DocsEditable()
-  int get maxChannelCount => _blink.BlinkAudioDestinationNode.maxChannelCount_Getter(this);
+  int get maxChannelCount => _blink.BlinkAudioDestinationNode.instance.maxChannelCount_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -463,31 +463,31 @@
 
   @DomName('AudioListener.dopplerFactor')
   @DocsEditable()
-  num get dopplerFactor => _blink.BlinkAudioListener.dopplerFactor_Getter(this);
+  num get dopplerFactor => _blink.BlinkAudioListener.instance.dopplerFactor_Getter_(this);
 
   @DomName('AudioListener.dopplerFactor')
   @DocsEditable()
-  void set dopplerFactor(num value) => _blink.BlinkAudioListener.dopplerFactor_Setter(this, value);
+  void set dopplerFactor(num value) => _blink.BlinkAudioListener.instance.dopplerFactor_Setter_(this, value);
 
   @DomName('AudioListener.speedOfSound')
   @DocsEditable()
-  num get speedOfSound => _blink.BlinkAudioListener.speedOfSound_Getter(this);
+  num get speedOfSound => _blink.BlinkAudioListener.instance.speedOfSound_Getter_(this);
 
   @DomName('AudioListener.speedOfSound')
   @DocsEditable()
-  void set speedOfSound(num value) => _blink.BlinkAudioListener.speedOfSound_Setter(this, value);
+  void set speedOfSound(num value) => _blink.BlinkAudioListener.instance.speedOfSound_Setter_(this, value);
 
   @DomName('AudioListener.setOrientation')
   @DocsEditable()
-  void setOrientation(num x, num y, num z, num xUp, num yUp, num zUp) => _blink.BlinkAudioListener.setOrientation_Callback_6(this, x, y, z, xUp, yUp, zUp);
+  void setOrientation(num x, num y, num z, num xUp, num yUp, num zUp) => _blink.BlinkAudioListener.instance.setOrientation_Callback_6_(this, x, y, z, xUp, yUp, zUp);
 
   @DomName('AudioListener.setPosition')
   @DocsEditable()
-  void setPosition(num x, num y, num z) => _blink.BlinkAudioListener.setPosition_Callback_3(this, x, y, z);
+  void setPosition(num x, num y, num z) => _blink.BlinkAudioListener.instance.setPosition_Callback_3_(this, x, y, z);
 
   @DomName('AudioListener.setVelocity')
   @DocsEditable()
-  void setVelocity(num x, num y, num z) => _blink.BlinkAudioListener.setVelocity_Callback_3(this, x, y, z);
+  void setVelocity(num x, num y, num z) => _blink.BlinkAudioListener.instance.setVelocity_Callback_3_(this, x, y, z);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -504,47 +504,47 @@
 
   @DomName('AudioNode.channelCount')
   @DocsEditable()
-  int get channelCount => _blink.BlinkAudioNode.channelCount_Getter(this);
+  int get channelCount => _blink.BlinkAudioNode.instance.channelCount_Getter_(this);
 
   @DomName('AudioNode.channelCount')
   @DocsEditable()
-  void set channelCount(int value) => _blink.BlinkAudioNode.channelCount_Setter(this, value);
+  void set channelCount(int value) => _blink.BlinkAudioNode.instance.channelCount_Setter_(this, value);
 
   @DomName('AudioNode.channelCountMode')
   @DocsEditable()
-  String get channelCountMode => _blink.BlinkAudioNode.channelCountMode_Getter(this);
+  String get channelCountMode => _blink.BlinkAudioNode.instance.channelCountMode_Getter_(this);
 
   @DomName('AudioNode.channelCountMode')
   @DocsEditable()
-  void set channelCountMode(String value) => _blink.BlinkAudioNode.channelCountMode_Setter(this, value);
+  void set channelCountMode(String value) => _blink.BlinkAudioNode.instance.channelCountMode_Setter_(this, value);
 
   @DomName('AudioNode.channelInterpretation')
   @DocsEditable()
-  String get channelInterpretation => _blink.BlinkAudioNode.channelInterpretation_Getter(this);
+  String get channelInterpretation => _blink.BlinkAudioNode.instance.channelInterpretation_Getter_(this);
 
   @DomName('AudioNode.channelInterpretation')
   @DocsEditable()
-  void set channelInterpretation(String value) => _blink.BlinkAudioNode.channelInterpretation_Setter(this, value);
+  void set channelInterpretation(String value) => _blink.BlinkAudioNode.instance.channelInterpretation_Setter_(this, value);
 
   @DomName('AudioNode.context')
   @DocsEditable()
-  AudioContext get context => _blink.BlinkAudioNode.context_Getter(this);
+  AudioContext get context => _blink.BlinkAudioNode.instance.context_Getter_(this);
 
   @DomName('AudioNode.numberOfInputs')
   @DocsEditable()
-  int get numberOfInputs => _blink.BlinkAudioNode.numberOfInputs_Getter(this);
+  int get numberOfInputs => _blink.BlinkAudioNode.instance.numberOfInputs_Getter_(this);
 
   @DomName('AudioNode.numberOfOutputs')
   @DocsEditable()
-  int get numberOfOutputs => _blink.BlinkAudioNode.numberOfOutputs_Getter(this);
+  int get numberOfOutputs => _blink.BlinkAudioNode.instance.numberOfOutputs_Getter_(this);
 
   void _connect(destination, int output, [int input]) {
     if ((input is int || input == null) && (output is int || output == null) && (destination is AudioNode || destination == null)) {
-      _blink.BlinkAudioNode.connect_Callback_3(this, destination, output, input);
+      _blink.BlinkAudioNode.instance.connect_Callback_3_(this, destination, output, input);
       return;
     }
     if ((output is int || output == null) && (destination is AudioParam || destination == null) && input == null) {
-      _blink.BlinkAudioNode.connect_Callback_2(this, destination, output);
+      _blink.BlinkAudioNode.instance.connect_Callback_2_(this, destination, output);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -552,7 +552,7 @@
 
   @DomName('AudioNode.disconnect')
   @DocsEditable()
-  void disconnect(int output) => _blink.BlinkAudioNode.disconnect_Callback_1(this, output);
+  void disconnect(int output) => _blink.BlinkAudioNode.instance.disconnect_Callback_1_(this, output);
 
   @DomName('AudioNode.connect')
   void connectNode(AudioNode destination, [int output = 0, int input = 0]) =>
@@ -579,39 +579,39 @@
 
   @DomName('AudioParam.defaultValue')
   @DocsEditable()
-  double get defaultValue => _blink.BlinkAudioParam.defaultValue_Getter(this);
+  double get defaultValue => _blink.BlinkAudioParam.instance.defaultValue_Getter_(this);
 
   @DomName('AudioParam.value')
   @DocsEditable()
-  num get value => _blink.BlinkAudioParam.value_Getter(this);
+  num get value => _blink.BlinkAudioParam.instance.value_Getter_(this);
 
   @DomName('AudioParam.value')
   @DocsEditable()
-  void set value(num value) => _blink.BlinkAudioParam.value_Setter(this, value);
+  void set value(num value) => _blink.BlinkAudioParam.instance.value_Setter_(this, value);
 
   @DomName('AudioParam.cancelScheduledValues')
   @DocsEditable()
-  void cancelScheduledValues(num startTime) => _blink.BlinkAudioParam.cancelScheduledValues_Callback_1(this, startTime);
+  void cancelScheduledValues(num startTime) => _blink.BlinkAudioParam.instance.cancelScheduledValues_Callback_1_(this, startTime);
 
   @DomName('AudioParam.exponentialRampToValueAtTime')
   @DocsEditable()
-  void exponentialRampToValueAtTime(num value, num time) => _blink.BlinkAudioParam.exponentialRampToValueAtTime_Callback_2(this, value, time);
+  void exponentialRampToValueAtTime(num value, num time) => _blink.BlinkAudioParam.instance.exponentialRampToValueAtTime_Callback_2_(this, value, time);
 
   @DomName('AudioParam.linearRampToValueAtTime')
   @DocsEditable()
-  void linearRampToValueAtTime(num value, num time) => _blink.BlinkAudioParam.linearRampToValueAtTime_Callback_2(this, value, time);
+  void linearRampToValueAtTime(num value, num time) => _blink.BlinkAudioParam.instance.linearRampToValueAtTime_Callback_2_(this, value, time);
 
   @DomName('AudioParam.setTargetAtTime')
   @DocsEditable()
-  void setTargetAtTime(num target, num time, num timeConstant) => _blink.BlinkAudioParam.setTargetAtTime_Callback_3(this, target, time, timeConstant);
+  void setTargetAtTime(num target, num time, num timeConstant) => _blink.BlinkAudioParam.instance.setTargetAtTime_Callback_3_(this, target, time, timeConstant);
 
   @DomName('AudioParam.setValueAtTime')
   @DocsEditable()
-  void setValueAtTime(num value, num time) => _blink.BlinkAudioParam.setValueAtTime_Callback_2(this, value, time);
+  void setValueAtTime(num value, num time) => _blink.BlinkAudioParam.instance.setValueAtTime_Callback_2_(this, value, time);
 
   @DomName('AudioParam.setValueCurveAtTime')
   @DocsEditable()
-  void setValueCurveAtTime(Float32List values, num time, num duration) => _blink.BlinkAudioParam.setValueCurveAtTime_Callback_3(this, values, time, duration);
+  void setValueCurveAtTime(Float32List values, num time, num duration) => _blink.BlinkAudioParam.instance.setValueCurveAtTime_Callback_3_(this, values, time, duration);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -631,16 +631,16 @@
 
   @DomName('AudioProcessingEvent.inputBuffer')
   @DocsEditable()
-  AudioBuffer get inputBuffer => _blink.BlinkAudioProcessingEvent.inputBuffer_Getter(this);
+  AudioBuffer get inputBuffer => _blink.BlinkAudioProcessingEvent.instance.inputBuffer_Getter_(this);
 
   @DomName('AudioProcessingEvent.outputBuffer')
   @DocsEditable()
-  AudioBuffer get outputBuffer => _blink.BlinkAudioProcessingEvent.outputBuffer_Getter(this);
+  AudioBuffer get outputBuffer => _blink.BlinkAudioProcessingEvent.instance.outputBuffer_Getter_(this);
 
   @DomName('AudioProcessingEvent.playbackTime')
   @DocsEditable()
   @Experimental() // untriaged
-  double get playbackTime => _blink.BlinkAudioProcessingEvent.playbackTime_Getter(this);
+  double get playbackTime => _blink.BlinkAudioProcessingEvent.instance.playbackTime_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -676,31 +676,31 @@
 
   @DomName('BiquadFilterNode.Q')
   @DocsEditable()
-  AudioParam get Q => _blink.BlinkBiquadFilterNode.Q_Getter(this);
+  AudioParam get Q => _blink.BlinkBiquadFilterNode.instance.Q_Getter_(this);
 
   @DomName('BiquadFilterNode.detune')
   @DocsEditable()
-  AudioParam get detune => _blink.BlinkBiquadFilterNode.detune_Getter(this);
+  AudioParam get detune => _blink.BlinkBiquadFilterNode.instance.detune_Getter_(this);
 
   @DomName('BiquadFilterNode.frequency')
   @DocsEditable()
-  AudioParam get frequency => _blink.BlinkBiquadFilterNode.frequency_Getter(this);
+  AudioParam get frequency => _blink.BlinkBiquadFilterNode.instance.frequency_Getter_(this);
 
   @DomName('BiquadFilterNode.gain')
   @DocsEditable()
-  AudioParam get gain => _blink.BlinkBiquadFilterNode.gain_Getter(this);
+  AudioParam get gain => _blink.BlinkBiquadFilterNode.instance.gain_Getter_(this);
 
   @DomName('BiquadFilterNode.type')
   @DocsEditable()
-  String get type => _blink.BlinkBiquadFilterNode.type_Getter(this);
+  String get type => _blink.BlinkBiquadFilterNode.instance.type_Getter_(this);
 
   @DomName('BiquadFilterNode.type')
   @DocsEditable()
-  void set type(String value) => _blink.BlinkBiquadFilterNode.type_Setter(this, value);
+  void set type(String value) => _blink.BlinkBiquadFilterNode.instance.type_Setter_(this, value);
 
   @DomName('BiquadFilterNode.getFrequencyResponse')
   @DocsEditable()
-  void getFrequencyResponse(Float32List frequencyHz, Float32List magResponse, Float32List phaseResponse) => _blink.BlinkBiquadFilterNode.getFrequencyResponse_Callback_3(this, frequencyHz, magResponse, phaseResponse);
+  void getFrequencyResponse(Float32List frequencyHz, Float32List magResponse, Float32List phaseResponse) => _blink.BlinkBiquadFilterNode.instance.getFrequencyResponse_Callback_3_(this, frequencyHz, magResponse, phaseResponse);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -752,19 +752,19 @@
 
   @DomName('ConvolverNode.buffer')
   @DocsEditable()
-  AudioBuffer get buffer => _blink.BlinkConvolverNode.buffer_Getter(this);
+  AudioBuffer get buffer => _blink.BlinkConvolverNode.instance.buffer_Getter_(this);
 
   @DomName('ConvolverNode.buffer')
   @DocsEditable()
-  void set buffer(AudioBuffer value) => _blink.BlinkConvolverNode.buffer_Setter(this, value);
+  void set buffer(AudioBuffer value) => _blink.BlinkConvolverNode.instance.buffer_Setter_(this, value);
 
   @DomName('ConvolverNode.normalize')
   @DocsEditable()
-  bool get normalize => _blink.BlinkConvolverNode.normalize_Getter(this);
+  bool get normalize => _blink.BlinkConvolverNode.instance.normalize_Getter_(this);
 
   @DomName('ConvolverNode.normalize')
   @DocsEditable()
-  void set normalize(bool value) => _blink.BlinkConvolverNode.normalize_Setter(this, value);
+  void set normalize(bool value) => _blink.BlinkConvolverNode.instance.normalize_Setter_(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -784,7 +784,7 @@
 
   @DomName('DelayNode.delayTime')
   @DocsEditable()
-  AudioParam get delayTime => _blink.BlinkDelayNode.delayTime_Getter(this);
+  AudioParam get delayTime => _blink.BlinkDelayNode.instance.delayTime_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -804,27 +804,27 @@
 
   @DomName('DynamicsCompressorNode.attack')
   @DocsEditable()
-  AudioParam get attack => _blink.BlinkDynamicsCompressorNode.attack_Getter(this);
+  AudioParam get attack => _blink.BlinkDynamicsCompressorNode.instance.attack_Getter_(this);
 
   @DomName('DynamicsCompressorNode.knee')
   @DocsEditable()
-  AudioParam get knee => _blink.BlinkDynamicsCompressorNode.knee_Getter(this);
+  AudioParam get knee => _blink.BlinkDynamicsCompressorNode.instance.knee_Getter_(this);
 
   @DomName('DynamicsCompressorNode.ratio')
   @DocsEditable()
-  AudioParam get ratio => _blink.BlinkDynamicsCompressorNode.ratio_Getter(this);
+  AudioParam get ratio => _blink.BlinkDynamicsCompressorNode.instance.ratio_Getter_(this);
 
   @DomName('DynamicsCompressorNode.reduction')
   @DocsEditable()
-  AudioParam get reduction => _blink.BlinkDynamicsCompressorNode.reduction_Getter(this);
+  AudioParam get reduction => _blink.BlinkDynamicsCompressorNode.instance.reduction_Getter_(this);
 
   @DomName('DynamicsCompressorNode.release')
   @DocsEditable()
-  AudioParam get release => _blink.BlinkDynamicsCompressorNode.release_Getter(this);
+  AudioParam get release => _blink.BlinkDynamicsCompressorNode.instance.release_Getter_(this);
 
   @DomName('DynamicsCompressorNode.threshold')
   @DocsEditable()
-  AudioParam get threshold => _blink.BlinkDynamicsCompressorNode.threshold_Getter(this);
+  AudioParam get threshold => _blink.BlinkDynamicsCompressorNode.instance.threshold_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -844,7 +844,7 @@
 
   @DomName('GainNode.gain')
   @DocsEditable()
-  AudioParam get gain => _blink.BlinkGainNode.gain_Getter(this);
+  AudioParam get gain => _blink.BlinkGainNode.instance.gain_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -865,7 +865,7 @@
   @DomName('MediaElementAudioSourceNode.mediaElement')
   @DocsEditable()
   @Experimental() // non-standard
-  MediaElement get mediaElement => _blink.BlinkMediaElementAudioSourceNode.mediaElement_Getter(this);
+  MediaElement get mediaElement => _blink.BlinkMediaElementAudioSourceNode.instance.mediaElement_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -885,7 +885,7 @@
 
   @DomName('MediaStreamAudioDestinationNode.stream')
   @DocsEditable()
-  MediaStream get stream => _blink.BlinkMediaStreamAudioDestinationNode.stream_Getter(this);
+  MediaStream get stream => _blink.BlinkMediaStreamAudioDestinationNode.instance.stream_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -905,7 +905,7 @@
 
   @DomName('MediaStreamAudioSourceNode.mediaStream')
   @DocsEditable()
-  MediaStream get mediaStream => _blink.BlinkMediaStreamAudioSourceNode.mediaStream_Getter(this);
+  MediaStream get mediaStream => _blink.BlinkMediaStreamAudioSourceNode.instance.mediaStream_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -925,7 +925,7 @@
 
   @DomName('OfflineAudioCompletionEvent.renderedBuffer')
   @DocsEditable()
-  AudioBuffer get renderedBuffer => _blink.BlinkOfflineAudioCompletionEvent.renderedBuffer_Getter(this);
+  AudioBuffer get renderedBuffer => _blink.BlinkOfflineAudioCompletionEvent.instance.renderedBuffer_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -946,7 +946,7 @@
   @DomName('OfflineAudioContext.OfflineAudioContext')
   @DocsEditable()
   factory OfflineAudioContext(int numberOfChannels, int numberOfFrames, num sampleRate) {
-    return _blink.BlinkOfflineAudioContext.constructorCallback_3(numberOfChannels, numberOfFrames, sampleRate);
+    return _blink.BlinkOfflineAudioContext.instance.constructorCallback_3_(numberOfChannels, numberOfFrames, sampleRate);
   }
 
 }
@@ -978,48 +978,48 @@
 
   @DomName('OscillatorNode.detune')
   @DocsEditable()
-  AudioParam get detune => _blink.BlinkOscillatorNode.detune_Getter(this);
+  AudioParam get detune => _blink.BlinkOscillatorNode.instance.detune_Getter_(this);
 
   @DomName('OscillatorNode.frequency')
   @DocsEditable()
-  AudioParam get frequency => _blink.BlinkOscillatorNode.frequency_Getter(this);
+  AudioParam get frequency => _blink.BlinkOscillatorNode.instance.frequency_Getter_(this);
 
   @DomName('OscillatorNode.type')
   @DocsEditable()
-  String get type => _blink.BlinkOscillatorNode.type_Getter(this);
+  String get type => _blink.BlinkOscillatorNode.instance.type_Getter_(this);
 
   @DomName('OscillatorNode.type')
   @DocsEditable()
-  void set type(String value) => _blink.BlinkOscillatorNode.type_Setter(this, value);
+  void set type(String value) => _blink.BlinkOscillatorNode.instance.type_Setter_(this, value);
 
   @DomName('OscillatorNode.noteOff')
   @DocsEditable()
-  void noteOff(num when) => _blink.BlinkOscillatorNode.noteOff_Callback_1(this, when);
+  void noteOff(num when) => _blink.BlinkOscillatorNode.instance.noteOff_Callback_1_(this, when);
 
   @DomName('OscillatorNode.noteOn')
   @DocsEditable()
-  void noteOn(num when) => _blink.BlinkOscillatorNode.noteOn_Callback_1(this, when);
+  void noteOn(num when) => _blink.BlinkOscillatorNode.instance.noteOn_Callback_1_(this, when);
 
   @DomName('OscillatorNode.setPeriodicWave')
   @DocsEditable()
   @Experimental() // untriaged
-  void setPeriodicWave(PeriodicWave periodicWave) => _blink.BlinkOscillatorNode.setPeriodicWave_Callback_1(this, periodicWave);
+  void setPeriodicWave(PeriodicWave periodicWave) => _blink.BlinkOscillatorNode.instance.setPeriodicWave_Callback_1_(this, periodicWave);
 
   void start([num when]) {
     if (when != null) {
-      _blink.BlinkOscillatorNode.start_Callback_1(this, when);
+      _blink.BlinkOscillatorNode.instance.start_Callback_1_(this, when);
       return;
     }
-    _blink.BlinkOscillatorNode.start_Callback(this);
+    _blink.BlinkOscillatorNode.instance.start_Callback_0_(this);
     return;
   }
 
   void stop([num when]) {
     if (when != null) {
-      _blink.BlinkOscillatorNode.stop_Callback_1(this, when);
+      _blink.BlinkOscillatorNode.instance.stop_Callback_1_(this, when);
       return;
     }
-    _blink.BlinkOscillatorNode.stop_Callback(this);
+    _blink.BlinkOscillatorNode.instance.stop_Callback_0_(this);
     return;
   }
 
@@ -1047,79 +1047,79 @@
 
   @DomName('PannerNode.coneInnerAngle')
   @DocsEditable()
-  num get coneInnerAngle => _blink.BlinkPannerNode.coneInnerAngle_Getter(this);
+  num get coneInnerAngle => _blink.BlinkPannerNode.instance.coneInnerAngle_Getter_(this);
 
   @DomName('PannerNode.coneInnerAngle')
   @DocsEditable()
-  void set coneInnerAngle(num value) => _blink.BlinkPannerNode.coneInnerAngle_Setter(this, value);
+  void set coneInnerAngle(num value) => _blink.BlinkPannerNode.instance.coneInnerAngle_Setter_(this, value);
 
   @DomName('PannerNode.coneOuterAngle')
   @DocsEditable()
-  num get coneOuterAngle => _blink.BlinkPannerNode.coneOuterAngle_Getter(this);
+  num get coneOuterAngle => _blink.BlinkPannerNode.instance.coneOuterAngle_Getter_(this);
 
   @DomName('PannerNode.coneOuterAngle')
   @DocsEditable()
-  void set coneOuterAngle(num value) => _blink.BlinkPannerNode.coneOuterAngle_Setter(this, value);
+  void set coneOuterAngle(num value) => _blink.BlinkPannerNode.instance.coneOuterAngle_Setter_(this, value);
 
   @DomName('PannerNode.coneOuterGain')
   @DocsEditable()
-  num get coneOuterGain => _blink.BlinkPannerNode.coneOuterGain_Getter(this);
+  num get coneOuterGain => _blink.BlinkPannerNode.instance.coneOuterGain_Getter_(this);
 
   @DomName('PannerNode.coneOuterGain')
   @DocsEditable()
-  void set coneOuterGain(num value) => _blink.BlinkPannerNode.coneOuterGain_Setter(this, value);
+  void set coneOuterGain(num value) => _blink.BlinkPannerNode.instance.coneOuterGain_Setter_(this, value);
 
   @DomName('PannerNode.distanceModel')
   @DocsEditable()
-  String get distanceModel => _blink.BlinkPannerNode.distanceModel_Getter(this);
+  String get distanceModel => _blink.BlinkPannerNode.instance.distanceModel_Getter_(this);
 
   @DomName('PannerNode.distanceModel')
   @DocsEditable()
-  void set distanceModel(String value) => _blink.BlinkPannerNode.distanceModel_Setter(this, value);
+  void set distanceModel(String value) => _blink.BlinkPannerNode.instance.distanceModel_Setter_(this, value);
 
   @DomName('PannerNode.maxDistance')
   @DocsEditable()
-  num get maxDistance => _blink.BlinkPannerNode.maxDistance_Getter(this);
+  num get maxDistance => _blink.BlinkPannerNode.instance.maxDistance_Getter_(this);
 
   @DomName('PannerNode.maxDistance')
   @DocsEditable()
-  void set maxDistance(num value) => _blink.BlinkPannerNode.maxDistance_Setter(this, value);
+  void set maxDistance(num value) => _blink.BlinkPannerNode.instance.maxDistance_Setter_(this, value);
 
   @DomName('PannerNode.panningModel')
   @DocsEditable()
-  String get panningModel => _blink.BlinkPannerNode.panningModel_Getter(this);
+  String get panningModel => _blink.BlinkPannerNode.instance.panningModel_Getter_(this);
 
   @DomName('PannerNode.panningModel')
   @DocsEditable()
-  void set panningModel(String value) => _blink.BlinkPannerNode.panningModel_Setter(this, value);
+  void set panningModel(String value) => _blink.BlinkPannerNode.instance.panningModel_Setter_(this, value);
 
   @DomName('PannerNode.refDistance')
   @DocsEditable()
-  num get refDistance => _blink.BlinkPannerNode.refDistance_Getter(this);
+  num get refDistance => _blink.BlinkPannerNode.instance.refDistance_Getter_(this);
 
   @DomName('PannerNode.refDistance')
   @DocsEditable()
-  void set refDistance(num value) => _blink.BlinkPannerNode.refDistance_Setter(this, value);
+  void set refDistance(num value) => _blink.BlinkPannerNode.instance.refDistance_Setter_(this, value);
 
   @DomName('PannerNode.rolloffFactor')
   @DocsEditable()
-  num get rolloffFactor => _blink.BlinkPannerNode.rolloffFactor_Getter(this);
+  num get rolloffFactor => _blink.BlinkPannerNode.instance.rolloffFactor_Getter_(this);
 
   @DomName('PannerNode.rolloffFactor')
   @DocsEditable()
-  void set rolloffFactor(num value) => _blink.BlinkPannerNode.rolloffFactor_Setter(this, value);
+  void set rolloffFactor(num value) => _blink.BlinkPannerNode.instance.rolloffFactor_Setter_(this, value);
 
   @DomName('PannerNode.setOrientation')
   @DocsEditable()
-  void setOrientation(num x, num y, num z) => _blink.BlinkPannerNode.setOrientation_Callback_3(this, x, y, z);
+  void setOrientation(num x, num y, num z) => _blink.BlinkPannerNode.instance.setOrientation_Callback_3_(this, x, y, z);
 
   @DomName('PannerNode.setPosition')
   @DocsEditable()
-  void setPosition(num x, num y, num z) => _blink.BlinkPannerNode.setPosition_Callback_3(this, x, y, z);
+  void setPosition(num x, num y, num z) => _blink.BlinkPannerNode.instance.setPosition_Callback_3_(this, x, y, z);
 
   @DomName('PannerNode.setVelocity')
   @DocsEditable()
-  void setVelocity(num x, num y, num z) => _blink.BlinkPannerNode.setVelocity_Callback_3(this, x, y, z);
+  void setVelocity(num x, num y, num z) => _blink.BlinkPannerNode.instance.setVelocity_Callback_3_(this, x, y, z);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1154,12 +1154,12 @@
 
   @DomName('ScriptProcessorNode.bufferSize')
   @DocsEditable()
-  int get bufferSize => _blink.BlinkScriptProcessorNode.bufferSize_Getter(this);
+  int get bufferSize => _blink.BlinkScriptProcessorNode.instance.bufferSize_Getter_(this);
 
   @DomName('ScriptProcessorNode.setEventListener')
   @DocsEditable()
   @Experimental() // untriaged
-  void setEventListener(EventListener eventListener) => _blink.BlinkScriptProcessorNode.setEventListener_Callback_1(this, eventListener);
+  void setEventListener(EventListener eventListener) => _blink.BlinkScriptProcessorNode.instance.setEventListener_Callback_1_(this, eventListener);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1179,18 +1179,18 @@
 
   @DomName('WaveShaperNode.curve')
   @DocsEditable()
-  Float32List get curve => _blink.BlinkWaveShaperNode.curve_Getter(this);
+  Float32List get curve => _blink.BlinkWaveShaperNode.instance.curve_Getter_(this);
 
   @DomName('WaveShaperNode.curve')
   @DocsEditable()
-  void set curve(Float32List value) => _blink.BlinkWaveShaperNode.curve_Setter(this, value);
+  void set curve(Float32List value) => _blink.BlinkWaveShaperNode.instance.curve_Setter_(this, value);
 
   @DomName('WaveShaperNode.oversample')
   @DocsEditable()
-  String get oversample => _blink.BlinkWaveShaperNode.oversample_Getter(this);
+  String get oversample => _blink.BlinkWaveShaperNode.instance.oversample_Getter_(this);
 
   @DomName('WaveShaperNode.oversample')
   @DocsEditable()
-  void set oversample(String value) => _blink.BlinkWaveShaperNode.oversample_Setter(this, value);
+  void set oversample(String value) => _blink.BlinkWaveShaperNode.instance.oversample_Setter_(this, value);
 
 }
diff --git a/sdk/lib/web_gl/dartium/web_gl_dartium.dart b/sdk/lib/web_gl/dartium/web_gl_dartium.dart
index ec946e4..7b9d549 100644
--- a/sdk/lib/web_gl/dartium/web_gl_dartium.dart
+++ b/sdk/lib/web_gl/dartium/web_gl_dartium.dart
@@ -371,15 +371,15 @@
 
   @DomName('WebGLActiveInfo.name')
   @DocsEditable()
-  String get name => _blink.BlinkWebGLActiveInfo.name_Getter(this);
+  String get name => _blink.BlinkWebGLActiveInfo.instance.name_Getter_(this);
 
   @DomName('WebGLActiveInfo.size')
   @DocsEditable()
-  int get size => _blink.BlinkWebGLActiveInfo.size_Getter(this);
+  int get size => _blink.BlinkWebGLActiveInfo.instance.size_Getter_(this);
 
   @DomName('WebGLActiveInfo.type')
   @DocsEditable()
-  int get type => _blink.BlinkWebGLActiveInfo.type_Getter(this);
+  int get type => _blink.BlinkWebGLActiveInfo.instance.type_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -404,17 +404,17 @@
   @DomName('ANGLEInstancedArrays.drawArraysInstancedANGLE')
   @DocsEditable()
   @Experimental() // untriaged
-  void drawArraysInstancedAngle(int mode, int first, int count, int primcount) => _blink.BlinkANGLEInstancedArrays.drawArraysInstancedANGLE_Callback_4(this, mode, first, count, primcount);
+  void drawArraysInstancedAngle(int mode, int first, int count, int primcount) => _blink.BlinkANGLEInstancedArrays.instance.drawArraysInstancedANGLE_Callback_4_(this, mode, first, count, primcount);
 
   @DomName('ANGLEInstancedArrays.drawElementsInstancedANGLE')
   @DocsEditable()
   @Experimental() // untriaged
-  void drawElementsInstancedAngle(int mode, int count, int type, int offset, int primcount) => _blink.BlinkANGLEInstancedArrays.drawElementsInstancedANGLE_Callback_5(this, mode, count, type, offset, primcount);
+  void drawElementsInstancedAngle(int mode, int count, int type, int offset, int primcount) => _blink.BlinkANGLEInstancedArrays.instance.drawElementsInstancedANGLE_Callback_5_(this, mode, count, type, offset, primcount);
 
   @DomName('ANGLEInstancedArrays.vertexAttribDivisorANGLE')
   @DocsEditable()
   @Experimental() // untriaged
-  void vertexAttribDivisorAngle(int index, int divisor) => _blink.BlinkANGLEInstancedArrays.vertexAttribDivisorANGLE_Callback_2(this, index, divisor);
+  void vertexAttribDivisorAngle(int index, int divisor) => _blink.BlinkANGLEInstancedArrays.instance.vertexAttribDivisorANGLE_Callback_2_(this, index, divisor);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -582,61 +582,61 @@
 
   @DomName('WebGLContextAttributes.alpha')
   @DocsEditable()
-  bool get alpha => _blink.BlinkWebGLContextAttributes.alpha_Getter(this);
+  bool get alpha => _blink.BlinkWebGLContextAttributes.instance.alpha_Getter_(this);
 
   @DomName('WebGLContextAttributes.alpha')
   @DocsEditable()
-  void set alpha(bool value) => _blink.BlinkWebGLContextAttributes.alpha_Setter(this, value);
+  void set alpha(bool value) => _blink.BlinkWebGLContextAttributes.instance.alpha_Setter_(this, value);
 
   @DomName('WebGLContextAttributes.antialias')
   @DocsEditable()
-  bool get antialias => _blink.BlinkWebGLContextAttributes.antialias_Getter(this);
+  bool get antialias => _blink.BlinkWebGLContextAttributes.instance.antialias_Getter_(this);
 
   @DomName('WebGLContextAttributes.antialias')
   @DocsEditable()
-  void set antialias(bool value) => _blink.BlinkWebGLContextAttributes.antialias_Setter(this, value);
+  void set antialias(bool value) => _blink.BlinkWebGLContextAttributes.instance.antialias_Setter_(this, value);
 
   @DomName('WebGLContextAttributes.depth')
   @DocsEditable()
-  bool get depth => _blink.BlinkWebGLContextAttributes.depth_Getter(this);
+  bool get depth => _blink.BlinkWebGLContextAttributes.instance.depth_Getter_(this);
 
   @DomName('WebGLContextAttributes.depth')
   @DocsEditable()
-  void set depth(bool value) => _blink.BlinkWebGLContextAttributes.depth_Setter(this, value);
+  void set depth(bool value) => _blink.BlinkWebGLContextAttributes.instance.depth_Setter_(this, value);
 
   @DomName('WebGLContextAttributes.failIfMajorPerformanceCaveat')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get failIfMajorPerformanceCaveat => _blink.BlinkWebGLContextAttributes.failIfMajorPerformanceCaveat_Getter(this);
+  bool get failIfMajorPerformanceCaveat => _blink.BlinkWebGLContextAttributes.instance.failIfMajorPerformanceCaveat_Getter_(this);
 
   @DomName('WebGLContextAttributes.failIfMajorPerformanceCaveat')
   @DocsEditable()
   @Experimental() // untriaged
-  void set failIfMajorPerformanceCaveat(bool value) => _blink.BlinkWebGLContextAttributes.failIfMajorPerformanceCaveat_Setter(this, value);
+  void set failIfMajorPerformanceCaveat(bool value) => _blink.BlinkWebGLContextAttributes.instance.failIfMajorPerformanceCaveat_Setter_(this, value);
 
   @DomName('WebGLContextAttributes.premultipliedAlpha')
   @DocsEditable()
-  bool get premultipliedAlpha => _blink.BlinkWebGLContextAttributes.premultipliedAlpha_Getter(this);
+  bool get premultipliedAlpha => _blink.BlinkWebGLContextAttributes.instance.premultipliedAlpha_Getter_(this);
 
   @DomName('WebGLContextAttributes.premultipliedAlpha')
   @DocsEditable()
-  void set premultipliedAlpha(bool value) => _blink.BlinkWebGLContextAttributes.premultipliedAlpha_Setter(this, value);
+  void set premultipliedAlpha(bool value) => _blink.BlinkWebGLContextAttributes.instance.premultipliedAlpha_Setter_(this, value);
 
   @DomName('WebGLContextAttributes.preserveDrawingBuffer')
   @DocsEditable()
-  bool get preserveDrawingBuffer => _blink.BlinkWebGLContextAttributes.preserveDrawingBuffer_Getter(this);
+  bool get preserveDrawingBuffer => _blink.BlinkWebGLContextAttributes.instance.preserveDrawingBuffer_Getter_(this);
 
   @DomName('WebGLContextAttributes.preserveDrawingBuffer')
   @DocsEditable()
-  void set preserveDrawingBuffer(bool value) => _blink.BlinkWebGLContextAttributes.preserveDrawingBuffer_Setter(this, value);
+  void set preserveDrawingBuffer(bool value) => _blink.BlinkWebGLContextAttributes.instance.preserveDrawingBuffer_Setter_(this, value);
 
   @DomName('WebGLContextAttributes.stencil')
   @DocsEditable()
-  bool get stencil => _blink.BlinkWebGLContextAttributes.stencil_Getter(this);
+  bool get stencil => _blink.BlinkWebGLContextAttributes.instance.stencil_Getter_(this);
 
   @DomName('WebGLContextAttributes.stencil')
   @DocsEditable()
-  void set stencil(bool value) => _blink.BlinkWebGLContextAttributes.stencil_Setter(this, value);
+  void set stencil(bool value) => _blink.BlinkWebGLContextAttributes.instance.stencil_Setter_(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -655,7 +655,7 @@
 
   @DomName('WebGLContextEvent.statusMessage')
   @DocsEditable()
-  String get statusMessage => _blink.BlinkWebGLContextEvent.statusMessage_Getter(this);
+  String get statusMessage => _blink.BlinkWebGLContextEvent.instance.statusMessage_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -699,7 +699,7 @@
 
   @DomName('WebGLDebugShaders.getTranslatedShaderSource')
   @DocsEditable()
-  String getTranslatedShaderSource(Shader shader) => _blink.BlinkWebGLDebugShaders.getTranslatedShaderSource_Callback_1(this, shader);
+  String getTranslatedShaderSource(Shader shader) => _blink.BlinkWebGLDebugShaders.instance.getTranslatedShaderSource_Callback_1_(this, shader);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -875,7 +875,7 @@
 
   @DomName('WebGLDrawBuffers.drawBuffersWEBGL')
   @DocsEditable()
-  void drawBuffersWebgl(List<int> buffers) => _blink.BlinkWebGLDrawBuffers.drawBuffersWEBGL_Callback_1(this, buffers);
+  void drawBuffersWebgl(List<int> buffers) => _blink.BlinkWebGLDrawBuffers.instance.drawBuffersWEBGL_Callback_1_(this, buffers);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -990,11 +990,11 @@
 
   @DomName('WebGLLoseContext.loseContext')
   @DocsEditable()
-  void loseContext() => _blink.BlinkWebGLLoseContext.loseContext_Callback(this);
+  void loseContext() => _blink.BlinkWebGLLoseContext.instance.loseContext_Callback_0_(this);
 
   @DomName('WebGLLoseContext.restoreContext')
   @DocsEditable()
-  void restoreContext() => _blink.BlinkWebGLLoseContext.restoreContext_Callback(this);
+  void restoreContext() => _blink.BlinkWebGLLoseContext.instance.restoreContext_Callback_0_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1122,19 +1122,19 @@
 
   @DomName('OESVertexArrayObject.bindVertexArrayOES')
   @DocsEditable()
-  void bindVertexArray(VertexArrayObject arrayObject) => _blink.BlinkOESVertexArrayObject.bindVertexArrayOES_Callback_1(this, arrayObject);
+  void bindVertexArray(VertexArrayObject arrayObject) => _blink.BlinkOESVertexArrayObject.instance.bindVertexArrayOES_Callback_1_(this, arrayObject);
 
   @DomName('OESVertexArrayObject.createVertexArrayOES')
   @DocsEditable()
-  VertexArrayObject createVertexArray() => _blink.BlinkOESVertexArrayObject.createVertexArrayOES_Callback(this);
+  VertexArrayObject createVertexArray() => _blink.BlinkOESVertexArrayObject.instance.createVertexArrayOES_Callback_0_(this);
 
   @DomName('OESVertexArrayObject.deleteVertexArrayOES')
   @DocsEditable()
-  void deleteVertexArray(VertexArrayObject arrayObject) => _blink.BlinkOESVertexArrayObject.deleteVertexArrayOES_Callback_1(this, arrayObject);
+  void deleteVertexArray(VertexArrayObject arrayObject) => _blink.BlinkOESVertexArrayObject.instance.deleteVertexArrayOES_Callback_1_(this, arrayObject);
 
   @DomName('OESVertexArrayObject.isVertexArrayOES')
   @DocsEditable()
-  bool isVertexArray(VertexArrayObject arrayObject) => _blink.BlinkOESVertexArrayObject.isVertexArrayOES_Callback_1(this, arrayObject);
+  bool isVertexArray(VertexArrayObject arrayObject) => _blink.BlinkOESVertexArrayObject.instance.isVertexArrayOES_Callback_1_(this, arrayObject);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2377,79 +2377,79 @@
   @DomName('WebGLRenderingContext.canvas')
   @DocsEditable()
   @Experimental() // untriaged
-  CanvasElement get canvas => _blink.BlinkWebGLRenderingContext.canvas_Getter(this);
+  CanvasElement get canvas => _blink.BlinkWebGLRenderingContext.instance.canvas_Getter_(this);
 
   @DomName('WebGLRenderingContext.drawingBufferHeight')
   @DocsEditable()
-  int get drawingBufferHeight => _blink.BlinkWebGLRenderingContext.drawingBufferHeight_Getter(this);
+  int get drawingBufferHeight => _blink.BlinkWebGLRenderingContext.instance.drawingBufferHeight_Getter_(this);
 
   @DomName('WebGLRenderingContext.drawingBufferWidth')
   @DocsEditable()
-  int get drawingBufferWidth => _blink.BlinkWebGLRenderingContext.drawingBufferWidth_Getter(this);
+  int get drawingBufferWidth => _blink.BlinkWebGLRenderingContext.instance.drawingBufferWidth_Getter_(this);
 
   @DomName('WebGLRenderingContext.activeTexture')
   @DocsEditable()
-  void activeTexture(int texture) => _blink.BlinkWebGLRenderingContext.activeTexture_Callback_1(this, texture);
+  void activeTexture(int texture) => _blink.BlinkWebGLRenderingContext.instance.activeTexture_Callback_1_(this, texture);
 
   @DomName('WebGLRenderingContext.attachShader')
   @DocsEditable()
-  void attachShader(Program program, Shader shader) => _blink.BlinkWebGLRenderingContext.attachShader_Callback_2(this, program, shader);
+  void attachShader(Program program, Shader shader) => _blink.BlinkWebGLRenderingContext.instance.attachShader_Callback_2_(this, program, shader);
 
   @DomName('WebGLRenderingContext.bindAttribLocation')
   @DocsEditable()
-  void bindAttribLocation(Program program, int index, String name) => _blink.BlinkWebGLRenderingContext.bindAttribLocation_Callback_3(this, program, index, name);
+  void bindAttribLocation(Program program, int index, String name) => _blink.BlinkWebGLRenderingContext.instance.bindAttribLocation_Callback_3_(this, program, index, name);
 
   @DomName('WebGLRenderingContext.bindBuffer')
   @DocsEditable()
-  void bindBuffer(int target, Buffer buffer) => _blink.BlinkWebGLRenderingContext.bindBuffer_Callback_2(this, target, buffer);
+  void bindBuffer(int target, Buffer buffer) => _blink.BlinkWebGLRenderingContext.instance.bindBuffer_Callback_2_(this, target, buffer);
 
   @DomName('WebGLRenderingContext.bindFramebuffer')
   @DocsEditable()
-  void bindFramebuffer(int target, Framebuffer framebuffer) => _blink.BlinkWebGLRenderingContext.bindFramebuffer_Callback_2(this, target, framebuffer);
+  void bindFramebuffer(int target, Framebuffer framebuffer) => _blink.BlinkWebGLRenderingContext.instance.bindFramebuffer_Callback_2_(this, target, framebuffer);
 
   @DomName('WebGLRenderingContext.bindRenderbuffer')
   @DocsEditable()
-  void bindRenderbuffer(int target, Renderbuffer renderbuffer) => _blink.BlinkWebGLRenderingContext.bindRenderbuffer_Callback_2(this, target, renderbuffer);
+  void bindRenderbuffer(int target, Renderbuffer renderbuffer) => _blink.BlinkWebGLRenderingContext.instance.bindRenderbuffer_Callback_2_(this, target, renderbuffer);
 
   @DomName('WebGLRenderingContext.bindTexture')
   @DocsEditable()
-  void bindTexture(int target, Texture texture) => _blink.BlinkWebGLRenderingContext.bindTexture_Callback_2(this, target, texture);
+  void bindTexture(int target, Texture texture) => _blink.BlinkWebGLRenderingContext.instance.bindTexture_Callback_2_(this, target, texture);
 
   @DomName('WebGLRenderingContext.blendColor')
   @DocsEditable()
-  void blendColor(num red, num green, num blue, num alpha) => _blink.BlinkWebGLRenderingContext.blendColor_Callback_4(this, red, green, blue, alpha);
+  void blendColor(num red, num green, num blue, num alpha) => _blink.BlinkWebGLRenderingContext.instance.blendColor_Callback_4_(this, red, green, blue, alpha);
 
   @DomName('WebGLRenderingContext.blendEquation')
   @DocsEditable()
-  void blendEquation(int mode) => _blink.BlinkWebGLRenderingContext.blendEquation_Callback_1(this, mode);
+  void blendEquation(int mode) => _blink.BlinkWebGLRenderingContext.instance.blendEquation_Callback_1_(this, mode);
 
   @DomName('WebGLRenderingContext.blendEquationSeparate')
   @DocsEditable()
-  void blendEquationSeparate(int modeRGB, int modeAlpha) => _blink.BlinkWebGLRenderingContext.blendEquationSeparate_Callback_2(this, modeRGB, modeAlpha);
+  void blendEquationSeparate(int modeRGB, int modeAlpha) => _blink.BlinkWebGLRenderingContext.instance.blendEquationSeparate_Callback_2_(this, modeRGB, modeAlpha);
 
   @DomName('WebGLRenderingContext.blendFunc')
   @DocsEditable()
-  void blendFunc(int sfactor, int dfactor) => _blink.BlinkWebGLRenderingContext.blendFunc_Callback_2(this, sfactor, dfactor);
+  void blendFunc(int sfactor, int dfactor) => _blink.BlinkWebGLRenderingContext.instance.blendFunc_Callback_2_(this, sfactor, dfactor);
 
   @DomName('WebGLRenderingContext.blendFuncSeparate')
   @DocsEditable()
-  void blendFuncSeparate(int srcRGB, int dstRGB, int srcAlpha, int dstAlpha) => _blink.BlinkWebGLRenderingContext.blendFuncSeparate_Callback_4(this, srcRGB, dstRGB, srcAlpha, dstAlpha);
+  void blendFuncSeparate(int srcRGB, int dstRGB, int srcAlpha, int dstAlpha) => _blink.BlinkWebGLRenderingContext.instance.blendFuncSeparate_Callback_4_(this, srcRGB, dstRGB, srcAlpha, dstAlpha);
 
   @DomName('WebGLRenderingContext.bufferByteData')
   @DocsEditable()
-  void bufferByteData(int target, ByteBuffer data, int usage) => _blink.BlinkWebGLRenderingContext.bufferData_Callback_3(this, target, data, usage);
+  void bufferByteData(int target, ByteBuffer data, int usage) => _blink.BlinkWebGLRenderingContext.instance.bufferData_Callback_3_(this, target, data, usage);
 
   void bufferData(int target, data_OR_size, int usage) {
     if ((usage is int) && (data_OR_size is int) && (target is int)) {
-      _blink.BlinkWebGLRenderingContext.bufferData_Callback_3(this, target, data_OR_size, usage);
+      _blink.BlinkWebGLRenderingContext.instance.bufferData_Callback_3_(this, target, data_OR_size, usage);
       return;
     }
     if ((usage is int) && (data_OR_size is TypedData) && (target is int)) {
-      _blink.BlinkWebGLRenderingContext.bufferData_Callback_3(this, target, data_OR_size, usage);
+      _blink.BlinkWebGLRenderingContext.instance.bufferData_Callback_3_(this, target, data_OR_size, usage);
       return;
     }
     if ((usage is int) && (data_OR_size is ByteBuffer || data_OR_size == null) && (target is int)) {
-      _blink.BlinkWebGLRenderingContext.bufferData_Callback_3(this, target, data_OR_size, usage);
+      _blink.BlinkWebGLRenderingContext.instance.bufferData_Callback_3_(this, target, data_OR_size, usage);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -2457,19 +2457,19 @@
 
   @DomName('WebGLRenderingContext.bufferDataTyped')
   @DocsEditable()
-  void bufferDataTyped(int target, TypedData data, int usage) => _blink.BlinkWebGLRenderingContext.bufferData_Callback_3(this, target, data, usage);
+  void bufferDataTyped(int target, TypedData data, int usage) => _blink.BlinkWebGLRenderingContext.instance.bufferData_Callback_3_(this, target, data, usage);
 
   @DomName('WebGLRenderingContext.bufferSubByteData')
   @DocsEditable()
-  void bufferSubByteData(int target, int offset, ByteBuffer data) => _blink.BlinkWebGLRenderingContext.bufferSubData_Callback_3(this, target, offset, data);
+  void bufferSubByteData(int target, int offset, ByteBuffer data) => _blink.BlinkWebGLRenderingContext.instance.bufferSubData_Callback_3_(this, target, offset, data);
 
   void bufferSubData(int target, int offset, data) {
     if ((data is TypedData) && (offset is int) && (target is int)) {
-      _blink.BlinkWebGLRenderingContext.bufferSubData_Callback_3(this, target, offset, data);
+      _blink.BlinkWebGLRenderingContext.instance.bufferSubData_Callback_3_(this, target, offset, data);
       return;
     }
     if ((data is ByteBuffer || data == null) && (offset is int) && (target is int)) {
-      _blink.BlinkWebGLRenderingContext.bufferSubData_Callback_3(this, target, offset, data);
+      _blink.BlinkWebGLRenderingContext.instance.bufferSubData_Callback_3_(this, target, offset, data);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -2477,375 +2477,375 @@
 
   @DomName('WebGLRenderingContext.bufferSubDataTyped')
   @DocsEditable()
-  void bufferSubDataTyped(int target, int offset, TypedData data) => _blink.BlinkWebGLRenderingContext.bufferSubData_Callback_3(this, target, offset, data);
+  void bufferSubDataTyped(int target, int offset, TypedData data) => _blink.BlinkWebGLRenderingContext.instance.bufferSubData_Callback_3_(this, target, offset, data);
 
   @DomName('WebGLRenderingContext.checkFramebufferStatus')
   @DocsEditable()
-  int checkFramebufferStatus(int target) => _blink.BlinkWebGLRenderingContext.checkFramebufferStatus_Callback_1(this, target);
+  int checkFramebufferStatus(int target) => _blink.BlinkWebGLRenderingContext.instance.checkFramebufferStatus_Callback_1_(this, target);
 
   @DomName('WebGLRenderingContext.clear')
   @DocsEditable()
-  void clear(int mask) => _blink.BlinkWebGLRenderingContext.clear_Callback_1(this, mask);
+  void clear(int mask) => _blink.BlinkWebGLRenderingContext.instance.clear_Callback_1_(this, mask);
 
   @DomName('WebGLRenderingContext.clearColor')
   @DocsEditable()
-  void clearColor(num red, num green, num blue, num alpha) => _blink.BlinkWebGLRenderingContext.clearColor_Callback_4(this, red, green, blue, alpha);
+  void clearColor(num red, num green, num blue, num alpha) => _blink.BlinkWebGLRenderingContext.instance.clearColor_Callback_4_(this, red, green, blue, alpha);
 
   @DomName('WebGLRenderingContext.clearDepth')
   @DocsEditable()
-  void clearDepth(num depth) => _blink.BlinkWebGLRenderingContext.clearDepth_Callback_1(this, depth);
+  void clearDepth(num depth) => _blink.BlinkWebGLRenderingContext.instance.clearDepth_Callback_1_(this, depth);
 
   @DomName('WebGLRenderingContext.clearStencil')
   @DocsEditable()
-  void clearStencil(int s) => _blink.BlinkWebGLRenderingContext.clearStencil_Callback_1(this, s);
+  void clearStencil(int s) => _blink.BlinkWebGLRenderingContext.instance.clearStencil_Callback_1_(this, s);
 
   @DomName('WebGLRenderingContext.colorMask')
   @DocsEditable()
-  void colorMask(bool red, bool green, bool blue, bool alpha) => _blink.BlinkWebGLRenderingContext.colorMask_Callback_4(this, red, green, blue, alpha);
+  void colorMask(bool red, bool green, bool blue, bool alpha) => _blink.BlinkWebGLRenderingContext.instance.colorMask_Callback_4_(this, red, green, blue, alpha);
 
   @DomName('WebGLRenderingContext.compileShader')
   @DocsEditable()
-  void compileShader(Shader shader) => _blink.BlinkWebGLRenderingContext.compileShader_Callback_1(this, shader);
+  void compileShader(Shader shader) => _blink.BlinkWebGLRenderingContext.instance.compileShader_Callback_1_(this, shader);
 
   @DomName('WebGLRenderingContext.compressedTexImage2D')
   @DocsEditable()
-  void compressedTexImage2D(int target, int level, int internalformat, int width, int height, int border, TypedData data) => _blink.BlinkWebGLRenderingContext.compressedTexImage2D_Callback_7(this, target, level, internalformat, width, height, border, data);
+  void compressedTexImage2D(int target, int level, int internalformat, int width, int height, int border, TypedData data) => _blink.BlinkWebGLRenderingContext.instance.compressedTexImage2D_Callback_7_(this, target, level, internalformat, width, height, border, data);
 
   @DomName('WebGLRenderingContext.compressedTexSubImage2D')
   @DocsEditable()
-  void compressedTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, TypedData data) => _blink.BlinkWebGLRenderingContext.compressedTexSubImage2D_Callback_8(this, target, level, xoffset, yoffset, width, height, format, data);
+  void compressedTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, TypedData data) => _blink.BlinkWebGLRenderingContext.instance.compressedTexSubImage2D_Callback_8_(this, target, level, xoffset, yoffset, width, height, format, data);
 
   @DomName('WebGLRenderingContext.copyTexImage2D')
   @DocsEditable()
-  void copyTexImage2D(int target, int level, int internalformat, int x, int y, int width, int height, int border) => _blink.BlinkWebGLRenderingContext.copyTexImage2D_Callback_8(this, target, level, internalformat, x, y, width, height, border);
+  void copyTexImage2D(int target, int level, int internalformat, int x, int y, int width, int height, int border) => _blink.BlinkWebGLRenderingContext.instance.copyTexImage2D_Callback_8_(this, target, level, internalformat, x, y, width, height, border);
 
   @DomName('WebGLRenderingContext.copyTexSubImage2D')
   @DocsEditable()
-  void copyTexSubImage2D(int target, int level, int xoffset, int yoffset, int x, int y, int width, int height) => _blink.BlinkWebGLRenderingContext.copyTexSubImage2D_Callback_8(this, target, level, xoffset, yoffset, x, y, width, height);
+  void copyTexSubImage2D(int target, int level, int xoffset, int yoffset, int x, int y, int width, int height) => _blink.BlinkWebGLRenderingContext.instance.copyTexSubImage2D_Callback_8_(this, target, level, xoffset, yoffset, x, y, width, height);
 
   @DomName('WebGLRenderingContext.createBuffer')
   @DocsEditable()
-  Buffer createBuffer() => _blink.BlinkWebGLRenderingContext.createBuffer_Callback(this);
+  Buffer createBuffer() => _blink.BlinkWebGLRenderingContext.instance.createBuffer_Callback_0_(this);
 
   @DomName('WebGLRenderingContext.createFramebuffer')
   @DocsEditable()
-  Framebuffer createFramebuffer() => _blink.BlinkWebGLRenderingContext.createFramebuffer_Callback(this);
+  Framebuffer createFramebuffer() => _blink.BlinkWebGLRenderingContext.instance.createFramebuffer_Callback_0_(this);
 
   @DomName('WebGLRenderingContext.createProgram')
   @DocsEditable()
-  Program createProgram() => _blink.BlinkWebGLRenderingContext.createProgram_Callback(this);
+  Program createProgram() => _blink.BlinkWebGLRenderingContext.instance.createProgram_Callback_0_(this);
 
   @DomName('WebGLRenderingContext.createRenderbuffer')
   @DocsEditable()
-  Renderbuffer createRenderbuffer() => _blink.BlinkWebGLRenderingContext.createRenderbuffer_Callback(this);
+  Renderbuffer createRenderbuffer() => _blink.BlinkWebGLRenderingContext.instance.createRenderbuffer_Callback_0_(this);
 
   @DomName('WebGLRenderingContext.createShader')
   @DocsEditable()
-  Shader createShader(int type) => _blink.BlinkWebGLRenderingContext.createShader_Callback_1(this, type);
+  Shader createShader(int type) => _blink.BlinkWebGLRenderingContext.instance.createShader_Callback_1_(this, type);
 
   @DomName('WebGLRenderingContext.createTexture')
   @DocsEditable()
-  Texture createTexture() => _blink.BlinkWebGLRenderingContext.createTexture_Callback(this);
+  Texture createTexture() => _blink.BlinkWebGLRenderingContext.instance.createTexture_Callback_0_(this);
 
   @DomName('WebGLRenderingContext.cullFace')
   @DocsEditable()
-  void cullFace(int mode) => _blink.BlinkWebGLRenderingContext.cullFace_Callback_1(this, mode);
+  void cullFace(int mode) => _blink.BlinkWebGLRenderingContext.instance.cullFace_Callback_1_(this, mode);
 
   @DomName('WebGLRenderingContext.deleteBuffer')
   @DocsEditable()
-  void deleteBuffer(Buffer buffer) => _blink.BlinkWebGLRenderingContext.deleteBuffer_Callback_1(this, buffer);
+  void deleteBuffer(Buffer buffer) => _blink.BlinkWebGLRenderingContext.instance.deleteBuffer_Callback_1_(this, buffer);
 
   @DomName('WebGLRenderingContext.deleteFramebuffer')
   @DocsEditable()
-  void deleteFramebuffer(Framebuffer framebuffer) => _blink.BlinkWebGLRenderingContext.deleteFramebuffer_Callback_1(this, framebuffer);
+  void deleteFramebuffer(Framebuffer framebuffer) => _blink.BlinkWebGLRenderingContext.instance.deleteFramebuffer_Callback_1_(this, framebuffer);
 
   @DomName('WebGLRenderingContext.deleteProgram')
   @DocsEditable()
-  void deleteProgram(Program program) => _blink.BlinkWebGLRenderingContext.deleteProgram_Callback_1(this, program);
+  void deleteProgram(Program program) => _blink.BlinkWebGLRenderingContext.instance.deleteProgram_Callback_1_(this, program);
 
   @DomName('WebGLRenderingContext.deleteRenderbuffer')
   @DocsEditable()
-  void deleteRenderbuffer(Renderbuffer renderbuffer) => _blink.BlinkWebGLRenderingContext.deleteRenderbuffer_Callback_1(this, renderbuffer);
+  void deleteRenderbuffer(Renderbuffer renderbuffer) => _blink.BlinkWebGLRenderingContext.instance.deleteRenderbuffer_Callback_1_(this, renderbuffer);
 
   @DomName('WebGLRenderingContext.deleteShader')
   @DocsEditable()
-  void deleteShader(Shader shader) => _blink.BlinkWebGLRenderingContext.deleteShader_Callback_1(this, shader);
+  void deleteShader(Shader shader) => _blink.BlinkWebGLRenderingContext.instance.deleteShader_Callback_1_(this, shader);
 
   @DomName('WebGLRenderingContext.deleteTexture')
   @DocsEditable()
-  void deleteTexture(Texture texture) => _blink.BlinkWebGLRenderingContext.deleteTexture_Callback_1(this, texture);
+  void deleteTexture(Texture texture) => _blink.BlinkWebGLRenderingContext.instance.deleteTexture_Callback_1_(this, texture);
 
   @DomName('WebGLRenderingContext.depthFunc')
   @DocsEditable()
-  void depthFunc(int func) => _blink.BlinkWebGLRenderingContext.depthFunc_Callback_1(this, func);
+  void depthFunc(int func) => _blink.BlinkWebGLRenderingContext.instance.depthFunc_Callback_1_(this, func);
 
   @DomName('WebGLRenderingContext.depthMask')
   @DocsEditable()
-  void depthMask(bool flag) => _blink.BlinkWebGLRenderingContext.depthMask_Callback_1(this, flag);
+  void depthMask(bool flag) => _blink.BlinkWebGLRenderingContext.instance.depthMask_Callback_1_(this, flag);
 
   @DomName('WebGLRenderingContext.depthRange')
   @DocsEditable()
-  void depthRange(num zNear, num zFar) => _blink.BlinkWebGLRenderingContext.depthRange_Callback_2(this, zNear, zFar);
+  void depthRange(num zNear, num zFar) => _blink.BlinkWebGLRenderingContext.instance.depthRange_Callback_2_(this, zNear, zFar);
 
   @DomName('WebGLRenderingContext.detachShader')
   @DocsEditable()
-  void detachShader(Program program, Shader shader) => _blink.BlinkWebGLRenderingContext.detachShader_Callback_2(this, program, shader);
+  void detachShader(Program program, Shader shader) => _blink.BlinkWebGLRenderingContext.instance.detachShader_Callback_2_(this, program, shader);
 
   @DomName('WebGLRenderingContext.disable')
   @DocsEditable()
-  void disable(int cap) => _blink.BlinkWebGLRenderingContext.disable_Callback_1(this, cap);
+  void disable(int cap) => _blink.BlinkWebGLRenderingContext.instance.disable_Callback_1_(this, cap);
 
   @DomName('WebGLRenderingContext.disableVertexAttribArray')
   @DocsEditable()
-  void disableVertexAttribArray(int index) => _blink.BlinkWebGLRenderingContext.disableVertexAttribArray_Callback_1(this, index);
+  void disableVertexAttribArray(int index) => _blink.BlinkWebGLRenderingContext.instance.disableVertexAttribArray_Callback_1_(this, index);
 
   @DomName('WebGLRenderingContext.drawArrays')
   @DocsEditable()
-  void drawArrays(int mode, int first, int count) => _blink.BlinkWebGLRenderingContext.drawArrays_Callback_3(this, mode, first, count);
+  void drawArrays(int mode, int first, int count) => _blink.BlinkWebGLRenderingContext.instance.drawArrays_Callback_3_(this, mode, first, count);
 
   @DomName('WebGLRenderingContext.drawElements')
   @DocsEditable()
-  void drawElements(int mode, int count, int type, int offset) => _blink.BlinkWebGLRenderingContext.drawElements_Callback_4(this, mode, count, type, offset);
+  void drawElements(int mode, int count, int type, int offset) => _blink.BlinkWebGLRenderingContext.instance.drawElements_Callback_4_(this, mode, count, type, offset);
 
   @DomName('WebGLRenderingContext.enable')
   @DocsEditable()
-  void enable(int cap) => _blink.BlinkWebGLRenderingContext.enable_Callback_1(this, cap);
+  void enable(int cap) => _blink.BlinkWebGLRenderingContext.instance.enable_Callback_1_(this, cap);
 
   @DomName('WebGLRenderingContext.enableVertexAttribArray')
   @DocsEditable()
-  void enableVertexAttribArray(int index) => _blink.BlinkWebGLRenderingContext.enableVertexAttribArray_Callback_1(this, index);
+  void enableVertexAttribArray(int index) => _blink.BlinkWebGLRenderingContext.instance.enableVertexAttribArray_Callback_1_(this, index);
 
   @DomName('WebGLRenderingContext.finish')
   @DocsEditable()
-  void finish() => _blink.BlinkWebGLRenderingContext.finish_Callback(this);
+  void finish() => _blink.BlinkWebGLRenderingContext.instance.finish_Callback_0_(this);
 
   @DomName('WebGLRenderingContext.flush')
   @DocsEditable()
-  void flush() => _blink.BlinkWebGLRenderingContext.flush_Callback(this);
+  void flush() => _blink.BlinkWebGLRenderingContext.instance.flush_Callback_0_(this);
 
   @DomName('WebGLRenderingContext.framebufferRenderbuffer')
   @DocsEditable()
-  void framebufferRenderbuffer(int target, int attachment, int renderbuffertarget, Renderbuffer renderbuffer) => _blink.BlinkWebGLRenderingContext.framebufferRenderbuffer_Callback_4(this, target, attachment, renderbuffertarget, renderbuffer);
+  void framebufferRenderbuffer(int target, int attachment, int renderbuffertarget, Renderbuffer renderbuffer) => _blink.BlinkWebGLRenderingContext.instance.framebufferRenderbuffer_Callback_4_(this, target, attachment, renderbuffertarget, renderbuffer);
 
   @DomName('WebGLRenderingContext.framebufferTexture2D')
   @DocsEditable()
-  void framebufferTexture2D(int target, int attachment, int textarget, Texture texture, int level) => _blink.BlinkWebGLRenderingContext.framebufferTexture2D_Callback_5(this, target, attachment, textarget, texture, level);
+  void framebufferTexture2D(int target, int attachment, int textarget, Texture texture, int level) => _blink.BlinkWebGLRenderingContext.instance.framebufferTexture2D_Callback_5_(this, target, attachment, textarget, texture, level);
 
   @DomName('WebGLRenderingContext.frontFace')
   @DocsEditable()
-  void frontFace(int mode) => _blink.BlinkWebGLRenderingContext.frontFace_Callback_1(this, mode);
+  void frontFace(int mode) => _blink.BlinkWebGLRenderingContext.instance.frontFace_Callback_1_(this, mode);
 
   @DomName('WebGLRenderingContext.generateMipmap')
   @DocsEditable()
-  void generateMipmap(int target) => _blink.BlinkWebGLRenderingContext.generateMipmap_Callback_1(this, target);
+  void generateMipmap(int target) => _blink.BlinkWebGLRenderingContext.instance.generateMipmap_Callback_1_(this, target);
 
   @DomName('WebGLRenderingContext.getActiveAttrib')
   @DocsEditable()
-  ActiveInfo getActiveAttrib(Program program, int index) => _blink.BlinkWebGLRenderingContext.getActiveAttrib_Callback_2(this, program, index);
+  ActiveInfo getActiveAttrib(Program program, int index) => _blink.BlinkWebGLRenderingContext.instance.getActiveAttrib_Callback_2_(this, program, index);
 
   @DomName('WebGLRenderingContext.getActiveUniform')
   @DocsEditable()
-  ActiveInfo getActiveUniform(Program program, int index) => _blink.BlinkWebGLRenderingContext.getActiveUniform_Callback_2(this, program, index);
+  ActiveInfo getActiveUniform(Program program, int index) => _blink.BlinkWebGLRenderingContext.instance.getActiveUniform_Callback_2_(this, program, index);
 
   @DomName('WebGLRenderingContext.getAttachedShaders')
   @DocsEditable()
-  List<Shader> getAttachedShaders(Program program) => _blink.BlinkWebGLRenderingContext.getAttachedShaders_Callback_1(this, program);
+  List<Shader> getAttachedShaders(Program program) => _blink.BlinkWebGLRenderingContext.instance.getAttachedShaders_Callback_1_(this, program);
 
   @DomName('WebGLRenderingContext.getAttribLocation')
   @DocsEditable()
-  int getAttribLocation(Program program, String name) => _blink.BlinkWebGLRenderingContext.getAttribLocation_Callback_2(this, program, name);
+  int getAttribLocation(Program program, String name) => _blink.BlinkWebGLRenderingContext.instance.getAttribLocation_Callback_2_(this, program, name);
 
   @DomName('WebGLRenderingContext.getBufferParameter')
   @DocsEditable()
-  Object getBufferParameter(int target, int pname) => _blink.BlinkWebGLRenderingContext.getBufferParameter_Callback_2(this, target, pname);
+  Object getBufferParameter(int target, int pname) => _blink.BlinkWebGLRenderingContext.instance.getBufferParameter_Callback_2_(this, target, pname);
 
   @DomName('WebGLRenderingContext.getContextAttributes')
   @DocsEditable()
-  ContextAttributes getContextAttributes() => _blink.BlinkWebGLRenderingContext.getContextAttributes_Callback(this);
+  ContextAttributes getContextAttributes() => _blink.BlinkWebGLRenderingContext.instance.getContextAttributes_Callback_0_(this);
 
   @DomName('WebGLRenderingContext.getError')
   @DocsEditable()
-  int getError() => _blink.BlinkWebGLRenderingContext.getError_Callback(this);
+  int getError() => _blink.BlinkWebGLRenderingContext.instance.getError_Callback_0_(this);
 
   @DomName('WebGLRenderingContext.getExtension')
   @DocsEditable()
-  Object getExtension(String name) => _blink.BlinkWebGLRenderingContext.getExtension_Callback_1(this, name);
+  Object getExtension(String name) => _blink.BlinkWebGLRenderingContext.instance.getExtension_Callback_1_(this, name);
 
   @DomName('WebGLRenderingContext.getFramebufferAttachmentParameter')
   @DocsEditable()
-  Object getFramebufferAttachmentParameter(int target, int attachment, int pname) => _blink.BlinkWebGLRenderingContext.getFramebufferAttachmentParameter_Callback_3(this, target, attachment, pname);
+  Object getFramebufferAttachmentParameter(int target, int attachment, int pname) => _blink.BlinkWebGLRenderingContext.instance.getFramebufferAttachmentParameter_Callback_3_(this, target, attachment, pname);
 
   @DomName('WebGLRenderingContext.getParameter')
   @DocsEditable()
-  Object getParameter(int pname) => _blink.BlinkWebGLRenderingContext.getParameter_Callback_1(this, pname);
+  Object getParameter(int pname) => _blink.BlinkWebGLRenderingContext.instance.getParameter_Callback_1_(this, pname);
 
   @DomName('WebGLRenderingContext.getProgramInfoLog')
   @DocsEditable()
-  String getProgramInfoLog(Program program) => _blink.BlinkWebGLRenderingContext.getProgramInfoLog_Callback_1(this, program);
+  String getProgramInfoLog(Program program) => _blink.BlinkWebGLRenderingContext.instance.getProgramInfoLog_Callback_1_(this, program);
 
   @DomName('WebGLRenderingContext.getProgramParameter')
   @DocsEditable()
-  Object getProgramParameter(Program program, int pname) => _blink.BlinkWebGLRenderingContext.getProgramParameter_Callback_2(this, program, pname);
+  Object getProgramParameter(Program program, int pname) => _blink.BlinkWebGLRenderingContext.instance.getProgramParameter_Callback_2_(this, program, pname);
 
   @DomName('WebGLRenderingContext.getRenderbufferParameter')
   @DocsEditable()
-  Object getRenderbufferParameter(int target, int pname) => _blink.BlinkWebGLRenderingContext.getRenderbufferParameter_Callback_2(this, target, pname);
+  Object getRenderbufferParameter(int target, int pname) => _blink.BlinkWebGLRenderingContext.instance.getRenderbufferParameter_Callback_2_(this, target, pname);
 
   @DomName('WebGLRenderingContext.getShaderInfoLog')
   @DocsEditable()
-  String getShaderInfoLog(Shader shader) => _blink.BlinkWebGLRenderingContext.getShaderInfoLog_Callback_1(this, shader);
+  String getShaderInfoLog(Shader shader) => _blink.BlinkWebGLRenderingContext.instance.getShaderInfoLog_Callback_1_(this, shader);
 
   @DomName('WebGLRenderingContext.getShaderParameter')
   @DocsEditable()
-  Object getShaderParameter(Shader shader, int pname) => _blink.BlinkWebGLRenderingContext.getShaderParameter_Callback_2(this, shader, pname);
+  Object getShaderParameter(Shader shader, int pname) => _blink.BlinkWebGLRenderingContext.instance.getShaderParameter_Callback_2_(this, shader, pname);
 
   @DomName('WebGLRenderingContext.getShaderPrecisionFormat')
   @DocsEditable()
-  ShaderPrecisionFormat getShaderPrecisionFormat(int shadertype, int precisiontype) => _blink.BlinkWebGLRenderingContext.getShaderPrecisionFormat_Callback_2(this, shadertype, precisiontype);
+  ShaderPrecisionFormat getShaderPrecisionFormat(int shadertype, int precisiontype) => _blink.BlinkWebGLRenderingContext.instance.getShaderPrecisionFormat_Callback_2_(this, shadertype, precisiontype);
 
   @DomName('WebGLRenderingContext.getShaderSource')
   @DocsEditable()
-  String getShaderSource(Shader shader) => _blink.BlinkWebGLRenderingContext.getShaderSource_Callback_1(this, shader);
+  String getShaderSource(Shader shader) => _blink.BlinkWebGLRenderingContext.instance.getShaderSource_Callback_1_(this, shader);
 
   @DomName('WebGLRenderingContext.getSupportedExtensions')
   @DocsEditable()
-  List<String> getSupportedExtensions() => _blink.BlinkWebGLRenderingContext.getSupportedExtensions_Callback(this);
+  List<String> getSupportedExtensions() => _blink.BlinkWebGLRenderingContext.instance.getSupportedExtensions_Callback_0_(this);
 
   @DomName('WebGLRenderingContext.getTexParameter')
   @DocsEditable()
-  Object getTexParameter(int target, int pname) => _blink.BlinkWebGLRenderingContext.getTexParameter_Callback_2(this, target, pname);
+  Object getTexParameter(int target, int pname) => _blink.BlinkWebGLRenderingContext.instance.getTexParameter_Callback_2_(this, target, pname);
 
   @DomName('WebGLRenderingContext.getUniform')
   @DocsEditable()
-  Object getUniform(Program program, UniformLocation location) => _blink.BlinkWebGLRenderingContext.getUniform_Callback_2(this, program, location);
+  Object getUniform(Program program, UniformLocation location) => _blink.BlinkWebGLRenderingContext.instance.getUniform_Callback_2_(this, program, location);
 
   @DomName('WebGLRenderingContext.getUniformLocation')
   @DocsEditable()
-  UniformLocation getUniformLocation(Program program, String name) => _blink.BlinkWebGLRenderingContext.getUniformLocation_Callback_2(this, program, name);
+  UniformLocation getUniformLocation(Program program, String name) => _blink.BlinkWebGLRenderingContext.instance.getUniformLocation_Callback_2_(this, program, name);
 
   @DomName('WebGLRenderingContext.getVertexAttrib')
   @DocsEditable()
-  Object getVertexAttrib(int index, int pname) => _blink.BlinkWebGLRenderingContext.getVertexAttrib_Callback_2(this, index, pname);
+  Object getVertexAttrib(int index, int pname) => _blink.BlinkWebGLRenderingContext.instance.getVertexAttrib_Callback_2_(this, index, pname);
 
   @DomName('WebGLRenderingContext.getVertexAttribOffset')
   @DocsEditable()
-  int getVertexAttribOffset(int index, int pname) => _blink.BlinkWebGLRenderingContext.getVertexAttribOffset_Callback_2(this, index, pname);
+  int getVertexAttribOffset(int index, int pname) => _blink.BlinkWebGLRenderingContext.instance.getVertexAttribOffset_Callback_2_(this, index, pname);
 
   @DomName('WebGLRenderingContext.hint')
   @DocsEditable()
-  void hint(int target, int mode) => _blink.BlinkWebGLRenderingContext.hint_Callback_2(this, target, mode);
+  void hint(int target, int mode) => _blink.BlinkWebGLRenderingContext.instance.hint_Callback_2_(this, target, mode);
 
   @DomName('WebGLRenderingContext.isBuffer')
   @DocsEditable()
-  bool isBuffer(Buffer buffer) => _blink.BlinkWebGLRenderingContext.isBuffer_Callback_1(this, buffer);
+  bool isBuffer(Buffer buffer) => _blink.BlinkWebGLRenderingContext.instance.isBuffer_Callback_1_(this, buffer);
 
   @DomName('WebGLRenderingContext.isContextLost')
   @DocsEditable()
-  bool isContextLost() => _blink.BlinkWebGLRenderingContext.isContextLost_Callback(this);
+  bool isContextLost() => _blink.BlinkWebGLRenderingContext.instance.isContextLost_Callback_0_(this);
 
   @DomName('WebGLRenderingContext.isEnabled')
   @DocsEditable()
-  bool isEnabled(int cap) => _blink.BlinkWebGLRenderingContext.isEnabled_Callback_1(this, cap);
+  bool isEnabled(int cap) => _blink.BlinkWebGLRenderingContext.instance.isEnabled_Callback_1_(this, cap);
 
   @DomName('WebGLRenderingContext.isFramebuffer')
   @DocsEditable()
-  bool isFramebuffer(Framebuffer framebuffer) => _blink.BlinkWebGLRenderingContext.isFramebuffer_Callback_1(this, framebuffer);
+  bool isFramebuffer(Framebuffer framebuffer) => _blink.BlinkWebGLRenderingContext.instance.isFramebuffer_Callback_1_(this, framebuffer);
 
   @DomName('WebGLRenderingContext.isProgram')
   @DocsEditable()
-  bool isProgram(Program program) => _blink.BlinkWebGLRenderingContext.isProgram_Callback_1(this, program);
+  bool isProgram(Program program) => _blink.BlinkWebGLRenderingContext.instance.isProgram_Callback_1_(this, program);
 
   @DomName('WebGLRenderingContext.isRenderbuffer')
   @DocsEditable()
-  bool isRenderbuffer(Renderbuffer renderbuffer) => _blink.BlinkWebGLRenderingContext.isRenderbuffer_Callback_1(this, renderbuffer);
+  bool isRenderbuffer(Renderbuffer renderbuffer) => _blink.BlinkWebGLRenderingContext.instance.isRenderbuffer_Callback_1_(this, renderbuffer);
 
   @DomName('WebGLRenderingContext.isShader')
   @DocsEditable()
-  bool isShader(Shader shader) => _blink.BlinkWebGLRenderingContext.isShader_Callback_1(this, shader);
+  bool isShader(Shader shader) => _blink.BlinkWebGLRenderingContext.instance.isShader_Callback_1_(this, shader);
 
   @DomName('WebGLRenderingContext.isTexture')
   @DocsEditable()
-  bool isTexture(Texture texture) => _blink.BlinkWebGLRenderingContext.isTexture_Callback_1(this, texture);
+  bool isTexture(Texture texture) => _blink.BlinkWebGLRenderingContext.instance.isTexture_Callback_1_(this, texture);
 
   @DomName('WebGLRenderingContext.lineWidth')
   @DocsEditable()
-  void lineWidth(num width) => _blink.BlinkWebGLRenderingContext.lineWidth_Callback_1(this, width);
+  void lineWidth(num width) => _blink.BlinkWebGLRenderingContext.instance.lineWidth_Callback_1_(this, width);
 
   @DomName('WebGLRenderingContext.linkProgram')
   @DocsEditable()
-  void linkProgram(Program program) => _blink.BlinkWebGLRenderingContext.linkProgram_Callback_1(this, program);
+  void linkProgram(Program program) => _blink.BlinkWebGLRenderingContext.instance.linkProgram_Callback_1_(this, program);
 
   @DomName('WebGLRenderingContext.pixelStorei')
   @DocsEditable()
-  void pixelStorei(int pname, int param) => _blink.BlinkWebGLRenderingContext.pixelStorei_Callback_2(this, pname, param);
+  void pixelStorei(int pname, int param) => _blink.BlinkWebGLRenderingContext.instance.pixelStorei_Callback_2_(this, pname, param);
 
   @DomName('WebGLRenderingContext.polygonOffset')
   @DocsEditable()
-  void polygonOffset(num factor, num units) => _blink.BlinkWebGLRenderingContext.polygonOffset_Callback_2(this, factor, units);
+  void polygonOffset(num factor, num units) => _blink.BlinkWebGLRenderingContext.instance.polygonOffset_Callback_2_(this, factor, units);
 
   @DomName('WebGLRenderingContext.readPixels')
   @DocsEditable()
-  void readPixels(int x, int y, int width, int height, int format, int type, TypedData pixels) => _blink.BlinkWebGLRenderingContext.readPixels_Callback_7(this, x, y, width, height, format, type, pixels);
+  void readPixels(int x, int y, int width, int height, int format, int type, TypedData pixels) => _blink.BlinkWebGLRenderingContext.instance.readPixels_Callback_7_(this, x, y, width, height, format, type, pixels);
 
   @DomName('WebGLRenderingContext.renderbufferStorage')
   @DocsEditable()
-  void renderbufferStorage(int target, int internalformat, int width, int height) => _blink.BlinkWebGLRenderingContext.renderbufferStorage_Callback_4(this, target, internalformat, width, height);
+  void renderbufferStorage(int target, int internalformat, int width, int height) => _blink.BlinkWebGLRenderingContext.instance.renderbufferStorage_Callback_4_(this, target, internalformat, width, height);
 
   @DomName('WebGLRenderingContext.sampleCoverage')
   @DocsEditable()
-  void sampleCoverage(num value, bool invert) => _blink.BlinkWebGLRenderingContext.sampleCoverage_Callback_2(this, value, invert);
+  void sampleCoverage(num value, bool invert) => _blink.BlinkWebGLRenderingContext.instance.sampleCoverage_Callback_2_(this, value, invert);
 
   @DomName('WebGLRenderingContext.scissor')
   @DocsEditable()
-  void scissor(int x, int y, int width, int height) => _blink.BlinkWebGLRenderingContext.scissor_Callback_4(this, x, y, width, height);
+  void scissor(int x, int y, int width, int height) => _blink.BlinkWebGLRenderingContext.instance.scissor_Callback_4_(this, x, y, width, height);
 
   @DomName('WebGLRenderingContext.shaderSource')
   @DocsEditable()
-  void shaderSource(Shader shader, String string) => _blink.BlinkWebGLRenderingContext.shaderSource_Callback_2(this, shader, string);
+  void shaderSource(Shader shader, String string) => _blink.BlinkWebGLRenderingContext.instance.shaderSource_Callback_2_(this, shader, string);
 
   @DomName('WebGLRenderingContext.stencilFunc')
   @DocsEditable()
-  void stencilFunc(int func, int ref, int mask) => _blink.BlinkWebGLRenderingContext.stencilFunc_Callback_3(this, func, ref, mask);
+  void stencilFunc(int func, int ref, int mask) => _blink.BlinkWebGLRenderingContext.instance.stencilFunc_Callback_3_(this, func, ref, mask);
 
   @DomName('WebGLRenderingContext.stencilFuncSeparate')
   @DocsEditable()
-  void stencilFuncSeparate(int face, int func, int ref, int mask) => _blink.BlinkWebGLRenderingContext.stencilFuncSeparate_Callback_4(this, face, func, ref, mask);
+  void stencilFuncSeparate(int face, int func, int ref, int mask) => _blink.BlinkWebGLRenderingContext.instance.stencilFuncSeparate_Callback_4_(this, face, func, ref, mask);
 
   @DomName('WebGLRenderingContext.stencilMask')
   @DocsEditable()
-  void stencilMask(int mask) => _blink.BlinkWebGLRenderingContext.stencilMask_Callback_1(this, mask);
+  void stencilMask(int mask) => _blink.BlinkWebGLRenderingContext.instance.stencilMask_Callback_1_(this, mask);
 
   @DomName('WebGLRenderingContext.stencilMaskSeparate')
   @DocsEditable()
-  void stencilMaskSeparate(int face, int mask) => _blink.BlinkWebGLRenderingContext.stencilMaskSeparate_Callback_2(this, face, mask);
+  void stencilMaskSeparate(int face, int mask) => _blink.BlinkWebGLRenderingContext.instance.stencilMaskSeparate_Callback_2_(this, face, mask);
 
   @DomName('WebGLRenderingContext.stencilOp')
   @DocsEditable()
-  void stencilOp(int fail, int zfail, int zpass) => _blink.BlinkWebGLRenderingContext.stencilOp_Callback_3(this, fail, zfail, zpass);
+  void stencilOp(int fail, int zfail, int zpass) => _blink.BlinkWebGLRenderingContext.instance.stencilOp_Callback_3_(this, fail, zfail, zpass);
 
   @DomName('WebGLRenderingContext.stencilOpSeparate')
   @DocsEditable()
-  void stencilOpSeparate(int face, int fail, int zfail, int zpass) => _blink.BlinkWebGLRenderingContext.stencilOpSeparate_Callback_4(this, face, fail, zfail, zpass);
+  void stencilOpSeparate(int face, int fail, int zfail, int zpass) => _blink.BlinkWebGLRenderingContext.instance.stencilOpSeparate_Callback_4_(this, face, fail, zfail, zpass);
 
   void texImage2D(int target, int level, int internalformat, int format_OR_width, int height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, [int format, int type, TypedData pixels]) {
     if ((pixels is TypedData || pixels == null) && (type is int) && (format is int) && (border_OR_canvas_OR_image_OR_pixels_OR_video is int) && (height_OR_type is int) && (format_OR_width is int) && (internalformat is int) && (level is int) && (target is int)) {
-      _blink.BlinkWebGLRenderingContext.texImage2D_Callback_9(this, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels);
+      _blink.BlinkWebGLRenderingContext.instance.texImage2D_Callback_9_(this, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels);
       return;
     }
     if ((border_OR_canvas_OR_image_OR_pixels_OR_video is ImageData || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && (height_OR_type is int) && (format_OR_width is int) && (internalformat is int) && (level is int) && (target is int) && format == null && type == null && pixels == null) {
-      _blink.BlinkWebGLRenderingContext.texImage2D_Callback_6(this, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
+      _blink.BlinkWebGLRenderingContext.instance.texImage2D_Callback_6_(this, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
       return;
     }
     if ((border_OR_canvas_OR_image_OR_pixels_OR_video is ImageElement) && (height_OR_type is int) && (format_OR_width is int) && (internalformat is int) && (level is int) && (target is int) && format == null && type == null && pixels == null) {
-      _blink.BlinkWebGLRenderingContext.texImage2D_Callback_6(this, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
+      _blink.BlinkWebGLRenderingContext.instance.texImage2D_Callback_6_(this, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
       return;
     }
     if ((border_OR_canvas_OR_image_OR_pixels_OR_video is CanvasElement) && (height_OR_type is int) && (format_OR_width is int) && (internalformat is int) && (level is int) && (target is int) && format == null && type == null && pixels == null) {
-      _blink.BlinkWebGLRenderingContext.texImage2D_Callback_6(this, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
+      _blink.BlinkWebGLRenderingContext.instance.texImage2D_Callback_6_(this, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
       return;
     }
     if ((border_OR_canvas_OR_image_OR_pixels_OR_video is VideoElement) && (height_OR_type is int) && (format_OR_width is int) && (internalformat is int) && (level is int) && (target is int) && format == null && type == null && pixels == null) {
-      _blink.BlinkWebGLRenderingContext.texImage2D_Callback_6(this, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
+      _blink.BlinkWebGLRenderingContext.instance.texImage2D_Callback_6_(this, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -2853,47 +2853,47 @@
 
   @DomName('WebGLRenderingContext.texImage2DCanvas')
   @DocsEditable()
-  void texImage2DCanvas(int target, int level, int internalformat, int format, int type, CanvasElement canvas) => _blink.BlinkWebGLRenderingContext.texImage2D_Callback_6(this, target, level, internalformat, format, type, canvas);
+  void texImage2DCanvas(int target, int level, int internalformat, int format, int type, CanvasElement canvas) => _blink.BlinkWebGLRenderingContext.instance.texImage2D_Callback_6_(this, target, level, internalformat, format, type, canvas);
 
   @DomName('WebGLRenderingContext.texImage2DImage')
   @DocsEditable()
-  void texImage2DImage(int target, int level, int internalformat, int format, int type, ImageElement image) => _blink.BlinkWebGLRenderingContext.texImage2D_Callback_6(this, target, level, internalformat, format, type, image);
+  void texImage2DImage(int target, int level, int internalformat, int format, int type, ImageElement image) => _blink.BlinkWebGLRenderingContext.instance.texImage2D_Callback_6_(this, target, level, internalformat, format, type, image);
 
   @DomName('WebGLRenderingContext.texImage2DImageData')
   @DocsEditable()
-  void texImage2DImageData(int target, int level, int internalformat, int format, int type, ImageData pixels) => _blink.BlinkWebGLRenderingContext.texImage2D_Callback_6(this, target, level, internalformat, format, type, pixels);
+  void texImage2DImageData(int target, int level, int internalformat, int format, int type, ImageData pixels) => _blink.BlinkWebGLRenderingContext.instance.texImage2D_Callback_6_(this, target, level, internalformat, format, type, pixels);
 
   @DomName('WebGLRenderingContext.texImage2DVideo')
   @DocsEditable()
-  void texImage2DVideo(int target, int level, int internalformat, int format, int type, VideoElement video) => _blink.BlinkWebGLRenderingContext.texImage2D_Callback_6(this, target, level, internalformat, format, type, video);
+  void texImage2DVideo(int target, int level, int internalformat, int format, int type, VideoElement video) => _blink.BlinkWebGLRenderingContext.instance.texImage2D_Callback_6_(this, target, level, internalformat, format, type, video);
 
   @DomName('WebGLRenderingContext.texParameterf')
   @DocsEditable()
-  void texParameterf(int target, int pname, num param) => _blink.BlinkWebGLRenderingContext.texParameterf_Callback_3(this, target, pname, param);
+  void texParameterf(int target, int pname, num param) => _blink.BlinkWebGLRenderingContext.instance.texParameterf_Callback_3_(this, target, pname, param);
 
   @DomName('WebGLRenderingContext.texParameteri')
   @DocsEditable()
-  void texParameteri(int target, int pname, int param) => _blink.BlinkWebGLRenderingContext.texParameteri_Callback_3(this, target, pname, param);
+  void texParameteri(int target, int pname, int param) => _blink.BlinkWebGLRenderingContext.instance.texParameteri_Callback_3_(this, target, pname, param);
 
   void texSubImage2D(int target, int level, int xoffset, int yoffset, int format_OR_width, int height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, [int type, TypedData pixels]) {
     if ((pixels is TypedData || pixels == null) && (type is int) && (canvas_OR_format_OR_image_OR_pixels_OR_video is int) && (height_OR_type is int) && (format_OR_width is int) && (yoffset is int) && (xoffset is int) && (level is int) && (target is int)) {
-      _blink.BlinkWebGLRenderingContext.texSubImage2D_Callback_9(this, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels);
+      _blink.BlinkWebGLRenderingContext.instance.texSubImage2D_Callback_9_(this, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels);
       return;
     }
     if ((canvas_OR_format_OR_image_OR_pixels_OR_video is ImageData || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && (height_OR_type is int) && (format_OR_width is int) && (yoffset is int) && (xoffset is int) && (level is int) && (target is int) && type == null && pixels == null) {
-      _blink.BlinkWebGLRenderingContext.texSubImage2D_Callback_7(this, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
+      _blink.BlinkWebGLRenderingContext.instance.texSubImage2D_Callback_7_(this, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
       return;
     }
     if ((canvas_OR_format_OR_image_OR_pixels_OR_video is ImageElement) && (height_OR_type is int) && (format_OR_width is int) && (yoffset is int) && (xoffset is int) && (level is int) && (target is int) && type == null && pixels == null) {
-      _blink.BlinkWebGLRenderingContext.texSubImage2D_Callback_7(this, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
+      _blink.BlinkWebGLRenderingContext.instance.texSubImage2D_Callback_7_(this, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
       return;
     }
     if ((canvas_OR_format_OR_image_OR_pixels_OR_video is CanvasElement) && (height_OR_type is int) && (format_OR_width is int) && (yoffset is int) && (xoffset is int) && (level is int) && (target is int) && type == null && pixels == null) {
-      _blink.BlinkWebGLRenderingContext.texSubImage2D_Callback_7(this, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
+      _blink.BlinkWebGLRenderingContext.instance.texSubImage2D_Callback_7_(this, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
       return;
     }
     if ((canvas_OR_format_OR_image_OR_pixels_OR_video is VideoElement) && (height_OR_type is int) && (format_OR_width is int) && (yoffset is int) && (xoffset is int) && (level is int) && (target is int) && type == null && pixels == null) {
-      _blink.BlinkWebGLRenderingContext.texSubImage2D_Callback_7(this, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
+      _blink.BlinkWebGLRenderingContext.instance.texSubImage2D_Callback_7_(this, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -2901,143 +2901,143 @@
 
   @DomName('WebGLRenderingContext.texSubImage2DCanvas')
   @DocsEditable()
-  void texSubImage2DCanvas(int target, int level, int xoffset, int yoffset, int format, int type, CanvasElement canvas) => _blink.BlinkWebGLRenderingContext.texSubImage2D_Callback_7(this, target, level, xoffset, yoffset, format, type, canvas);
+  void texSubImage2DCanvas(int target, int level, int xoffset, int yoffset, int format, int type, CanvasElement canvas) => _blink.BlinkWebGLRenderingContext.instance.texSubImage2D_Callback_7_(this, target, level, xoffset, yoffset, format, type, canvas);
 
   @DomName('WebGLRenderingContext.texSubImage2DImage')
   @DocsEditable()
-  void texSubImage2DImage(int target, int level, int xoffset, int yoffset, int format, int type, ImageElement image) => _blink.BlinkWebGLRenderingContext.texSubImage2D_Callback_7(this, target, level, xoffset, yoffset, format, type, image);
+  void texSubImage2DImage(int target, int level, int xoffset, int yoffset, int format, int type, ImageElement image) => _blink.BlinkWebGLRenderingContext.instance.texSubImage2D_Callback_7_(this, target, level, xoffset, yoffset, format, type, image);
 
   @DomName('WebGLRenderingContext.texSubImage2DImageData')
   @DocsEditable()
-  void texSubImage2DImageData(int target, int level, int xoffset, int yoffset, int format, int type, ImageData pixels) => _blink.BlinkWebGLRenderingContext.texSubImage2D_Callback_7(this, target, level, xoffset, yoffset, format, type, pixels);
+  void texSubImage2DImageData(int target, int level, int xoffset, int yoffset, int format, int type, ImageData pixels) => _blink.BlinkWebGLRenderingContext.instance.texSubImage2D_Callback_7_(this, target, level, xoffset, yoffset, format, type, pixels);
 
   @DomName('WebGLRenderingContext.texSubImage2DVideo')
   @DocsEditable()
-  void texSubImage2DVideo(int target, int level, int xoffset, int yoffset, int format, int type, VideoElement video) => _blink.BlinkWebGLRenderingContext.texSubImage2D_Callback_7(this, target, level, xoffset, yoffset, format, type, video);
+  void texSubImage2DVideo(int target, int level, int xoffset, int yoffset, int format, int type, VideoElement video) => _blink.BlinkWebGLRenderingContext.instance.texSubImage2D_Callback_7_(this, target, level, xoffset, yoffset, format, type, video);
 
   @DomName('WebGLRenderingContext.uniform1f')
   @DocsEditable()
-  void uniform1f(UniformLocation location, num x) => _blink.BlinkWebGLRenderingContext.uniform1f_Callback_2(this, location, x);
+  void uniform1f(UniformLocation location, num x) => _blink.BlinkWebGLRenderingContext.instance.uniform1f_Callback_2_(this, location, x);
 
   @DomName('WebGLRenderingContext.uniform1fv')
   @DocsEditable()
-  void uniform1fv(UniformLocation location, Float32List v) => _blink.BlinkWebGLRenderingContext.uniform1fv_Callback_2(this, location, v);
+  void uniform1fv(UniformLocation location, Float32List v) => _blink.BlinkWebGLRenderingContext.instance.uniform1fv_Callback_2_(this, location, v);
 
   @DomName('WebGLRenderingContext.uniform1i')
   @DocsEditable()
-  void uniform1i(UniformLocation location, int x) => _blink.BlinkWebGLRenderingContext.uniform1i_Callback_2(this, location, x);
+  void uniform1i(UniformLocation location, int x) => _blink.BlinkWebGLRenderingContext.instance.uniform1i_Callback_2_(this, location, x);
 
   @DomName('WebGLRenderingContext.uniform1iv')
   @DocsEditable()
-  void uniform1iv(UniformLocation location, Int32List v) => _blink.BlinkWebGLRenderingContext.uniform1iv_Callback_2(this, location, v);
+  void uniform1iv(UniformLocation location, Int32List v) => _blink.BlinkWebGLRenderingContext.instance.uniform1iv_Callback_2_(this, location, v);
 
   @DomName('WebGLRenderingContext.uniform2f')
   @DocsEditable()
-  void uniform2f(UniformLocation location, num x, num y) => _blink.BlinkWebGLRenderingContext.uniform2f_Callback_3(this, location, x, y);
+  void uniform2f(UniformLocation location, num x, num y) => _blink.BlinkWebGLRenderingContext.instance.uniform2f_Callback_3_(this, location, x, y);
 
   @DomName('WebGLRenderingContext.uniform2fv')
   @DocsEditable()
-  void uniform2fv(UniformLocation location, Float32List v) => _blink.BlinkWebGLRenderingContext.uniform2fv_Callback_2(this, location, v);
+  void uniform2fv(UniformLocation location, Float32List v) => _blink.BlinkWebGLRenderingContext.instance.uniform2fv_Callback_2_(this, location, v);
 
   @DomName('WebGLRenderingContext.uniform2i')
   @DocsEditable()
-  void uniform2i(UniformLocation location, int x, int y) => _blink.BlinkWebGLRenderingContext.uniform2i_Callback_3(this, location, x, y);
+  void uniform2i(UniformLocation location, int x, int y) => _blink.BlinkWebGLRenderingContext.instance.uniform2i_Callback_3_(this, location, x, y);
 
   @DomName('WebGLRenderingContext.uniform2iv')
   @DocsEditable()
-  void uniform2iv(UniformLocation location, Int32List v) => _blink.BlinkWebGLRenderingContext.uniform2iv_Callback_2(this, location, v);
+  void uniform2iv(UniformLocation location, Int32List v) => _blink.BlinkWebGLRenderingContext.instance.uniform2iv_Callback_2_(this, location, v);
 
   @DomName('WebGLRenderingContext.uniform3f')
   @DocsEditable()
-  void uniform3f(UniformLocation location, num x, num y, num z) => _blink.BlinkWebGLRenderingContext.uniform3f_Callback_4(this, location, x, y, z);
+  void uniform3f(UniformLocation location, num x, num y, num z) => _blink.BlinkWebGLRenderingContext.instance.uniform3f_Callback_4_(this, location, x, y, z);
 
   @DomName('WebGLRenderingContext.uniform3fv')
   @DocsEditable()
-  void uniform3fv(UniformLocation location, Float32List v) => _blink.BlinkWebGLRenderingContext.uniform3fv_Callback_2(this, location, v);
+  void uniform3fv(UniformLocation location, Float32List v) => _blink.BlinkWebGLRenderingContext.instance.uniform3fv_Callback_2_(this, location, v);
 
   @DomName('WebGLRenderingContext.uniform3i')
   @DocsEditable()
-  void uniform3i(UniformLocation location, int x, int y, int z) => _blink.BlinkWebGLRenderingContext.uniform3i_Callback_4(this, location, x, y, z);
+  void uniform3i(UniformLocation location, int x, int y, int z) => _blink.BlinkWebGLRenderingContext.instance.uniform3i_Callback_4_(this, location, x, y, z);
 
   @DomName('WebGLRenderingContext.uniform3iv')
   @DocsEditable()
-  void uniform3iv(UniformLocation location, Int32List v) => _blink.BlinkWebGLRenderingContext.uniform3iv_Callback_2(this, location, v);
+  void uniform3iv(UniformLocation location, Int32List v) => _blink.BlinkWebGLRenderingContext.instance.uniform3iv_Callback_2_(this, location, v);
 
   @DomName('WebGLRenderingContext.uniform4f')
   @DocsEditable()
-  void uniform4f(UniformLocation location, num x, num y, num z, num w) => _blink.BlinkWebGLRenderingContext.uniform4f_Callback_5(this, location, x, y, z, w);
+  void uniform4f(UniformLocation location, num x, num y, num z, num w) => _blink.BlinkWebGLRenderingContext.instance.uniform4f_Callback_5_(this, location, x, y, z, w);
 
   @DomName('WebGLRenderingContext.uniform4fv')
   @DocsEditable()
-  void uniform4fv(UniformLocation location, Float32List v) => _blink.BlinkWebGLRenderingContext.uniform4fv_Callback_2(this, location, v);
+  void uniform4fv(UniformLocation location, Float32List v) => _blink.BlinkWebGLRenderingContext.instance.uniform4fv_Callback_2_(this, location, v);
 
   @DomName('WebGLRenderingContext.uniform4i')
   @DocsEditable()
-  void uniform4i(UniformLocation location, int x, int y, int z, int w) => _blink.BlinkWebGLRenderingContext.uniform4i_Callback_5(this, location, x, y, z, w);
+  void uniform4i(UniformLocation location, int x, int y, int z, int w) => _blink.BlinkWebGLRenderingContext.instance.uniform4i_Callback_5_(this, location, x, y, z, w);
 
   @DomName('WebGLRenderingContext.uniform4iv')
   @DocsEditable()
-  void uniform4iv(UniformLocation location, Int32List v) => _blink.BlinkWebGLRenderingContext.uniform4iv_Callback_2(this, location, v);
+  void uniform4iv(UniformLocation location, Int32List v) => _blink.BlinkWebGLRenderingContext.instance.uniform4iv_Callback_2_(this, location, v);
 
   @DomName('WebGLRenderingContext.uniformMatrix2fv')
   @DocsEditable()
-  void uniformMatrix2fv(UniformLocation location, bool transpose, Float32List array) => _blink.BlinkWebGLRenderingContext.uniformMatrix2fv_Callback_3(this, location, transpose, array);
+  void uniformMatrix2fv(UniformLocation location, bool transpose, Float32List array) => _blink.BlinkWebGLRenderingContext.instance.uniformMatrix2fv_Callback_3_(this, location, transpose, array);
 
   @DomName('WebGLRenderingContext.uniformMatrix3fv')
   @DocsEditable()
-  void uniformMatrix3fv(UniformLocation location, bool transpose, Float32List array) => _blink.BlinkWebGLRenderingContext.uniformMatrix3fv_Callback_3(this, location, transpose, array);
+  void uniformMatrix3fv(UniformLocation location, bool transpose, Float32List array) => _blink.BlinkWebGLRenderingContext.instance.uniformMatrix3fv_Callback_3_(this, location, transpose, array);
 
   @DomName('WebGLRenderingContext.uniformMatrix4fv')
   @DocsEditable()
-  void uniformMatrix4fv(UniformLocation location, bool transpose, Float32List array) => _blink.BlinkWebGLRenderingContext.uniformMatrix4fv_Callback_3(this, location, transpose, array);
+  void uniformMatrix4fv(UniformLocation location, bool transpose, Float32List array) => _blink.BlinkWebGLRenderingContext.instance.uniformMatrix4fv_Callback_3_(this, location, transpose, array);
 
   @DomName('WebGLRenderingContext.useProgram')
   @DocsEditable()
-  void useProgram(Program program) => _blink.BlinkWebGLRenderingContext.useProgram_Callback_1(this, program);
+  void useProgram(Program program) => _blink.BlinkWebGLRenderingContext.instance.useProgram_Callback_1_(this, program);
 
   @DomName('WebGLRenderingContext.validateProgram')
   @DocsEditable()
-  void validateProgram(Program program) => _blink.BlinkWebGLRenderingContext.validateProgram_Callback_1(this, program);
+  void validateProgram(Program program) => _blink.BlinkWebGLRenderingContext.instance.validateProgram_Callback_1_(this, program);
 
   @DomName('WebGLRenderingContext.vertexAttrib1f')
   @DocsEditable()
-  void vertexAttrib1f(int indx, num x) => _blink.BlinkWebGLRenderingContext.vertexAttrib1f_Callback_2(this, indx, x);
+  void vertexAttrib1f(int indx, num x) => _blink.BlinkWebGLRenderingContext.instance.vertexAttrib1f_Callback_2_(this, indx, x);
 
   @DomName('WebGLRenderingContext.vertexAttrib1fv')
   @DocsEditable()
-  void vertexAttrib1fv(int indx, Float32List values) => _blink.BlinkWebGLRenderingContext.vertexAttrib1fv_Callback_2(this, indx, values);
+  void vertexAttrib1fv(int indx, Float32List values) => _blink.BlinkWebGLRenderingContext.instance.vertexAttrib1fv_Callback_2_(this, indx, values);
 
   @DomName('WebGLRenderingContext.vertexAttrib2f')
   @DocsEditable()
-  void vertexAttrib2f(int indx, num x, num y) => _blink.BlinkWebGLRenderingContext.vertexAttrib2f_Callback_3(this, indx, x, y);
+  void vertexAttrib2f(int indx, num x, num y) => _blink.BlinkWebGLRenderingContext.instance.vertexAttrib2f_Callback_3_(this, indx, x, y);
 
   @DomName('WebGLRenderingContext.vertexAttrib2fv')
   @DocsEditable()
-  void vertexAttrib2fv(int indx, Float32List values) => _blink.BlinkWebGLRenderingContext.vertexAttrib2fv_Callback_2(this, indx, values);
+  void vertexAttrib2fv(int indx, Float32List values) => _blink.BlinkWebGLRenderingContext.instance.vertexAttrib2fv_Callback_2_(this, indx, values);
 
   @DomName('WebGLRenderingContext.vertexAttrib3f')
   @DocsEditable()
-  void vertexAttrib3f(int indx, num x, num y, num z) => _blink.BlinkWebGLRenderingContext.vertexAttrib3f_Callback_4(this, indx, x, y, z);
+  void vertexAttrib3f(int indx, num x, num y, num z) => _blink.BlinkWebGLRenderingContext.instance.vertexAttrib3f_Callback_4_(this, indx, x, y, z);
 
   @DomName('WebGLRenderingContext.vertexAttrib3fv')
   @DocsEditable()
-  void vertexAttrib3fv(int indx, Float32List values) => _blink.BlinkWebGLRenderingContext.vertexAttrib3fv_Callback_2(this, indx, values);
+  void vertexAttrib3fv(int indx, Float32List values) => _blink.BlinkWebGLRenderingContext.instance.vertexAttrib3fv_Callback_2_(this, indx, values);
 
   @DomName('WebGLRenderingContext.vertexAttrib4f')
   @DocsEditable()
-  void vertexAttrib4f(int indx, num x, num y, num z, num w) => _blink.BlinkWebGLRenderingContext.vertexAttrib4f_Callback_5(this, indx, x, y, z, w);
+  void vertexAttrib4f(int indx, num x, num y, num z, num w) => _blink.BlinkWebGLRenderingContext.instance.vertexAttrib4f_Callback_5_(this, indx, x, y, z, w);
 
   @DomName('WebGLRenderingContext.vertexAttrib4fv')
   @DocsEditable()
-  void vertexAttrib4fv(int indx, Float32List values) => _blink.BlinkWebGLRenderingContext.vertexAttrib4fv_Callback_2(this, indx, values);
+  void vertexAttrib4fv(int indx, Float32List values) => _blink.BlinkWebGLRenderingContext.instance.vertexAttrib4fv_Callback_2_(this, indx, values);
 
   @DomName('WebGLRenderingContext.vertexAttribPointer')
   @DocsEditable()
-  void vertexAttribPointer(int indx, int size, int type, bool normalized, int stride, int offset) => _blink.BlinkWebGLRenderingContext.vertexAttribPointer_Callback_6(this, indx, size, type, normalized, stride, offset);
+  void vertexAttribPointer(int indx, int size, int type, bool normalized, int stride, int offset) => _blink.BlinkWebGLRenderingContext.instance.vertexAttribPointer_Callback_6_(this, indx, size, type, normalized, stride, offset);
 
   @DomName('WebGLRenderingContext.viewport')
   @DocsEditable()
-  void viewport(int x, int y, int width, int height) => _blink.BlinkWebGLRenderingContext.viewport_Callback_4(this, x, y, width, height);
+  void viewport(int x, int y, int width, int height) => _blink.BlinkWebGLRenderingContext.instance.viewport_Callback_4_(this, x, y, width, height);
 
 
   /**
@@ -3129,15 +3129,15 @@
 
   @DomName('WebGLShaderPrecisionFormat.precision')
   @DocsEditable()
-  int get precision => _blink.BlinkWebGLShaderPrecisionFormat.precision_Getter(this);
+  int get precision => _blink.BlinkWebGLShaderPrecisionFormat.instance.precision_Getter_(this);
 
   @DomName('WebGLShaderPrecisionFormat.rangeMax')
   @DocsEditable()
-  int get rangeMax => _blink.BlinkWebGLShaderPrecisionFormat.rangeMax_Getter(this);
+  int get rangeMax => _blink.BlinkWebGLShaderPrecisionFormat.instance.rangeMax_Getter_(this);
 
   @DomName('WebGLShaderPrecisionFormat.rangeMin')
   @DocsEditable()
-  int get rangeMin => _blink.BlinkWebGLShaderPrecisionFormat.rangeMin_Getter(this);
+  int get rangeMin => _blink.BlinkWebGLShaderPrecisionFormat.instance.rangeMin_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
diff --git a/sdk/lib/web_sql/dartium/web_sql_dartium.dart b/sdk/lib/web_sql/dartium/web_sql_dartium.dart
index 2494889..e976cde 100644
--- a/sdk/lib/web_sql/dartium/web_sql_dartium.dart
+++ b/sdk/lib/web_sql/dartium/web_sql_dartium.dart
@@ -101,48 +101,48 @@
 
   @DomName('Database.version')
   @DocsEditable()
-  String get version => _blink.BlinkDatabase.version_Getter(this);
+  String get version => _blink.BlinkDatabase.instance.version_Getter_(this);
 
   void changeVersion(String oldVersion, String newVersion, [SqlTransactionCallback callback, SqlTransactionErrorCallback errorCallback, VoidCallback successCallback]) {
     if (successCallback != null) {
-      _blink.BlinkDatabase.changeVersion_Callback_5(this, oldVersion, newVersion, callback, errorCallback, successCallback);
+      _blink.BlinkDatabase.instance.changeVersion_Callback_5_(this, oldVersion, newVersion, callback, errorCallback, successCallback);
       return;
     }
     if (errorCallback != null) {
-      _blink.BlinkDatabase.changeVersion_Callback_4(this, oldVersion, newVersion, callback, errorCallback);
+      _blink.BlinkDatabase.instance.changeVersion_Callback_4_(this, oldVersion, newVersion, callback, errorCallback);
       return;
     }
     if (callback != null) {
-      _blink.BlinkDatabase.changeVersion_Callback_3(this, oldVersion, newVersion, callback);
+      _blink.BlinkDatabase.instance.changeVersion_Callback_3_(this, oldVersion, newVersion, callback);
       return;
     }
-    _blink.BlinkDatabase.changeVersion_Callback_2(this, oldVersion, newVersion);
+    _blink.BlinkDatabase.instance.changeVersion_Callback_2_(this, oldVersion, newVersion);
     return;
   }
 
   void readTransaction(SqlTransactionCallback callback, [SqlTransactionErrorCallback errorCallback, VoidCallback successCallback]) {
     if (successCallback != null) {
-      _blink.BlinkDatabase.readTransaction_Callback_3(this, callback, errorCallback, successCallback);
+      _blink.BlinkDatabase.instance.readTransaction_Callback_3_(this, callback, errorCallback, successCallback);
       return;
     }
     if (errorCallback != null) {
-      _blink.BlinkDatabase.readTransaction_Callback_2(this, callback, errorCallback);
+      _blink.BlinkDatabase.instance.readTransaction_Callback_2_(this, callback, errorCallback);
       return;
     }
-    _blink.BlinkDatabase.readTransaction_Callback_1(this, callback);
+    _blink.BlinkDatabase.instance.readTransaction_Callback_1_(this, callback);
     return;
   }
 
   void transaction(SqlTransactionCallback callback, [SqlTransactionErrorCallback errorCallback, VoidCallback successCallback]) {
     if (successCallback != null) {
-      _blink.BlinkDatabase.transaction_Callback_3(this, callback, errorCallback, successCallback);
+      _blink.BlinkDatabase.instance.transaction_Callback_3_(this, callback, errorCallback, successCallback);
       return;
     }
     if (errorCallback != null) {
-      _blink.BlinkDatabase.transaction_Callback_2(this, callback, errorCallback);
+      _blink.BlinkDatabase.instance.transaction_Callback_2_(this, callback, errorCallback);
       return;
     }
-    _blink.BlinkDatabase.transaction_Callback_1(this, callback);
+    _blink.BlinkDatabase.instance.transaction_Callback_1_(this, callback);
     return;
   }
 
@@ -196,11 +196,11 @@
 
   @DomName('SQLError.code')
   @DocsEditable()
-  int get code => _blink.BlinkSQLError.code_Getter(this);
+  int get code => _blink.BlinkSQLError.instance.code_Getter_(this);
 
   @DomName('SQLError.message')
   @DocsEditable()
-  String get message => _blink.BlinkSQLError.message_Getter(this);
+  String get message => _blink.BlinkSQLError.instance.message_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -220,15 +220,15 @@
 
   @DomName('SQLResultSet.insertId')
   @DocsEditable()
-  int get insertId => _blink.BlinkSQLResultSet.insertId_Getter(this);
+  int get insertId => _blink.BlinkSQLResultSet.instance.insertId_Getter_(this);
 
   @DomName('SQLResultSet.rows')
   @DocsEditable()
-  SqlResultSetRowList get rows => _blink.BlinkSQLResultSet.rows_Getter(this);
+  SqlResultSetRowList get rows => _blink.BlinkSQLResultSet.instance.rows_Getter_(this);
 
   @DomName('SQLResultSet.rowsAffected')
   @DocsEditable()
-  int get rowsAffected => _blink.BlinkSQLResultSet.rowsAffected_Getter(this);
+  int get rowsAffected => _blink.BlinkSQLResultSet.instance.rowsAffected_Getter_(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -248,15 +248,15 @@
 
   @DomName('SQLResultSetRowList.length')
   @DocsEditable()
-  int get length => _blink.BlinkSQLResultSetRowList.length_Getter(this);
+  int get length => _blink.BlinkSQLResultSetRowList.instance.length_Getter_(this);
 
   Map operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _blink.BlinkSQLResultSetRowList.item_Callback_1(this, index);
+    return _blink.BlinkSQLResultSetRowList.instance.item_Callback_1_(this, index);
   }
 
-  Map _nativeIndexedGetter(int index) => _blink.BlinkSQLResultSetRowList.item_Callback_1(this, index);
+  Map _nativeIndexedGetter(int index) => _blink.BlinkSQLResultSetRowList.instance.item_Callback_1_(this, index);
 
   void operator[]=(int index, Map value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -298,7 +298,7 @@
 
   @DomName('SQLResultSetRowList.item')
   @DocsEditable()
-  Map item(int index) => _blink.BlinkSQLResultSetRowList.item_Callback_1(this, index);
+  Map item(int index) => _blink.BlinkSQLResultSetRowList.instance.item_Callback_1_(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -321,7 +321,7 @@
 
   @DomName('SQLTransaction.executeSql')
   @DocsEditable()
-  void executeSql(String sqlStatement, List<Object> arguments, [SqlStatementCallback callback, SqlStatementErrorCallback errorCallback]) => _blink.BlinkSQLTransaction.executeSql_Callback_4(this, sqlStatement, arguments, callback, errorCallback);
+  void executeSql(String sqlStatement, List<Object> arguments, [SqlStatementCallback callback, SqlStatementErrorCallback errorCallback]) => _blink.BlinkSQLTransaction.instance.executeSql_Callback_4_(this, sqlStatement, arguments, callback, errorCallback);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
diff --git a/tests/co19/co19-dart2js.status b/tests/co19/co19-dart2js.status
index e385acc..fcc4f77 100644
--- a/tests/co19/co19-dart2js.status
+++ b/tests/co19/co19-dart2js.status
@@ -453,8 +453,6 @@
 LibTest/core/DateTime/DateTime_A01_t03: fail # co19-roll r546: Please triage this failure
 LibTest/core/DateTime/parse_A03_t01: fail # co19-roll r546: Please triage this failure
 LibTest/core/Duration/operator_div_A01_t01: fail # co19-roll r546: Please triage this failure
-LibTest/core/Match/pattern_A01_t01: fail # co19-roll r559: Please triage this failure
-LibTest/core/RegExp/allMatches_A01_t01: fail # co19-roll r559: Please triage this failure
 LibTest/isolate/IsolateStream/any_A02_t01: fail # co19-roll r546: Please triage this failure
 LibTest/isolate/IsolateStream/contains_A02_t01: fail # co19-roll r546: Please triage this failure
 LibTest/typed_data/Float32List/Float32List.view_A05_t01: RuntimeError # co19-roll r559: Please triage this failure
diff --git a/tests/co19/co19-dartium.status b/tests/co19/co19-dartium.status
index f0b2ae2..2da9167 100644
--- a/tests/co19/co19-dartium.status
+++ b/tests/co19/co19-dartium.status
@@ -687,7 +687,7 @@
 LayoutTests/fast/events/document-elementFromPoint_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/events/event-creation_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/events/event-listener-html-non-html-confusion_t01: RuntimeError # co19-roll r786: Please triage this failure.
-LayoutTests/fast/events/initkeyboardevent-crash_t01: RuntimeError # co19-roll r786: Please triage this failure.
+LayoutTests/fast/events/initkeyboardevent-crash_t01: RuntimeError, Timeout # co19-roll r786: Please triage this failure.
 LayoutTests/fast/events/input-focus-no-duplicate-events_t01: Pass, RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/events/invalid-003_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/events/invalid-004_t01: RuntimeError # co19-roll r786: Please triage this failure.
diff --git a/tests/compiler/dart2js/backend_dart/end2end_test.dart b/tests/compiler/dart2js/backend_dart/end2end_test.dart
new file mode 100644
index 0000000..1808d6b
--- /dev/null
+++ b/tests/compiler/dart2js/backend_dart/end2end_test.dart
@@ -0,0 +1,32 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// End-to-end test of the dart2dart compiler.
+library dart_backend.end2end_test;
+
+import 'package:async_helper/async_helper.dart';
+import 'package:compiler/implementation/dart2jslib.dart';
+import 'package:compiler/implementation/dart_backend/dart_backend.dart';
+import 'package:expect/expect.dart';
+
+import '../../../../pkg/analyzer2dart/test/test_helper.dart' hide TestSpec;
+import '../../../../pkg/analyzer2dart/test/end2end_data.dart';
+
+import 'test_helper.dart';
+
+main() {
+  performTests(TEST_DATA, asyncTester, (TestSpec result) {
+    asyncTest(() => compilerFor(result.input).then((Compiler compiler) {
+      String expectedOutput = result.output.trim();
+      compiler.phase = Compiler.PHASE_COMPILING;
+      DartBackend backend = compiler.backend;
+      backend.assembleProgram();
+      String output = compiler.assembledCode.trim();
+      Expect.equals(expectedOutput, output,
+          '\nInput:\n${result.input}\n'
+          'Expected:\n$expectedOutput\n'
+          'Actual:\n$output\n');
+    }));
+  });
+}
\ No newline at end of file
diff --git a/tests/compiler/dart2js/backend_dart/sexpr2_test.dart b/tests/compiler/dart2js/backend_dart/sexpr2_test.dart
new file mode 100644
index 0000000..835dd89
--- /dev/null
+++ b/tests/compiler/dart2js/backend_dart/sexpr2_test.dart
@@ -0,0 +1,29 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// Unittest test of the CPS ir generated by the dart2dart compiler.
+library dart_backend.sexpr2_test;
+
+import 'package:compiler/implementation/dart2jslib.dart';
+import 'package:compiler/implementation/cps_ir/cps_ir_nodes_sexpr.dart';
+import 'package:expect/expect.dart';
+
+import '../../../../pkg/analyzer2dart/test/test_helper.dart';
+import '../../../../pkg/analyzer2dart/test/sexpr_data.dart';
+
+import 'test_helper.dart';
+
+main() {
+  performTests(TEST_DATA, asyncTester, (TestSpec result) {
+    return compilerFor(result.input).then((Compiler compiler) {
+      String expectedOutput = result.output.trim();
+      String output = compiler.irBuilder.getIr(compiler.mainFunction)
+          .accept(new SExpressionStringifier()).trim();
+      Expect.equals(expectedOutput, output,
+          '\nInput:\n${result.input}\n'
+          'Expected:\n$expectedOutput\n'
+          'Actual:\n$output\n');
+    });
+  });
+}
\ No newline at end of file
diff --git a/tests/compiler/dart2js/backend_dart/sexpr_test.dart b/tests/compiler/dart2js/backend_dart/sexpr_test.dart
index 9ed629c..2539d7b 100644
--- a/tests/compiler/dart2js/backend_dart/sexpr_test.dart
+++ b/tests/compiler/dart2js/backend_dart/sexpr_test.dart
@@ -2,14 +2,19 @@
 // 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 '../compiler_helper.dart';
-import 'sexpr_unstringifier.dart';
+library dart_backend.sexpr_test;
+
 import 'dart:async';
-import "package:async_helper/async_helper.dart";
-import "package:expect/expect.dart";
+
+import 'package:async_helper/async_helper.dart';
 import 'package:compiler/implementation/dart2jslib.dart';
 import 'package:compiler/implementation/cps_ir/cps_ir_nodes.dart';
 import 'package:compiler/implementation/cps_ir/cps_ir_nodes_sexpr.dart';
+import 'package:expect/expect.dart';
+
+import '../compiler_helper.dart' hide compilerFor;
+import 'sexpr_unstringifier.dart';
+import 'test_helper.dart';
 
 const String CODE = """
 class Foo {
@@ -23,7 +28,7 @@
     Foo.x = 2;
   }
   foo() =>  this.y + super.foo();
-} 
+}
 
 class FooBar<T> {
   bool foobar() => T is int;
@@ -83,26 +88,7 @@
 /// Compiles the given dart code (which must include a 'main' function) and
 /// returns a list of all generated CPS IR definitions.
 Future<List<FunctionDefinition>> compile(String code) {
-  MockCompiler compiler = new MockCompiler.internal(
-      emitJavaScript: false,
-      enableMinification: false);
-
-  return compiler.init().then((_) {
-    compiler.parseScript(code);
-
-    Element element = compiler.mainApp.find('main');
-    if (element == null) return null;
-
-    compiler.mainFunction = element;
-    compiler.phase = Compiler.PHASE_RESOLVING;
-    compiler.backend.enqueueHelpers(compiler.enqueuer.resolution,
-                                    compiler.globalDependencies);
-    compiler.processQueue(compiler.enqueuer.resolution, element);
-    compiler.world.populate();
-    compiler.backend.onResolutionComplete();
-
-    compiler.irBuilder.buildNodes(useNewBackend: true);
-
+  return compilerFor(code).then((Compiler compiler) {
     return compiler.enqueuer.resolution.resolvedElements
               .where(shouldOutput)
               .map(compiler.irBuilder.getIr)
diff --git a/tests/compiler/dart2js/backend_dart/test_helper.dart b/tests/compiler/dart2js/backend_dart/test_helper.dart
new file mode 100644
index 0000000..a5d5b20
--- /dev/null
+++ b/tests/compiler/dart2js/backend_dart/test_helper.dart
@@ -0,0 +1,43 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library dart_backend.test_helper;
+
+import 'dart:async';
+import 'package:async_helper/async_helper.dart';
+import 'package:compiler/implementation/dart2jslib.dart';
+import '../../../../pkg/analyzer2dart/test/test_helper.dart';
+import '../compiler_helper.dart';
+
+/// Compiles the given dart code (which must include a 'main' function) and
+/// returns the compiler.
+Future<Compiler> compilerFor(String code) {
+  MockCompiler compiler = new MockCompiler.internal(
+      emitJavaScript: false,
+      enableMinification: false);
+  compiler.diagnosticHandler = createHandler(compiler, code);
+  return compiler.init().then((_) {
+    compiler.parseScript(code);
+
+    Element element = compiler.mainApp.find('main');
+    if (element == null) return null;
+
+    compiler.mainFunction = element;
+    compiler.phase = Compiler.PHASE_RESOLVING;
+    compiler.backend.enqueueHelpers(compiler.enqueuer.resolution,
+                                    compiler.globalDependencies);
+    compiler.processQueue(compiler.enqueuer.resolution, element);
+    compiler.world.populate();
+    compiler.backend.onResolutionComplete();
+
+    compiler.irBuilder.buildNodes(useNewBackend: true);
+
+    return compiler;
+  });
+}
+
+/// Test group using async_helper.
+asyncTester(Group group, RunTest runTest) {
+  asyncTest(() => Future.forEach(group.results, runTest));
+}
diff --git a/tests/compiler/dart2js/constant_folding_codeUnitAt_test.dart b/tests/compiler/dart2js/constant_folding_codeUnitAt_test.dart
new file mode 100644
index 0000000..1238724
--- /dev/null
+++ b/tests/compiler/dart2js/constant_folding_codeUnitAt_test.dart
@@ -0,0 +1,45 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+// Test constant folding on numbers.
+
+import 'dart:async';
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
+import 'compiler_helper.dart';
+
+const String TEST_1 = """
+foo() {
+  var a = 'Hello';
+  var b = 0;
+  return a.codeUnitAt(b);
+}
+""";
+
+// No folding of index type error.
+const String TEST_2 = """
+foo() {
+  var a = 'Hello';
+  var b = 1.5;
+  return a.codeUnitAt(b);
+}
+""";
+
+// No folding of index range error.
+const String TEST_3 = """
+foo() {
+  var a = 'Hello';
+  var b = 55;
+  return a.codeUnitAt(b);
+}
+""";
+
+main() {
+  asyncTest(() => Future.wait([
+    compileAndMatch(TEST_1, 'foo', new RegExp(r'return 72')),
+    compileAndDoNotMatch(TEST_1, 'foo', new RegExp(r'Hello')),
+
+    compileAndMatch(TEST_2, 'foo', new RegExp(r'Hello')),
+    compileAndMatch(TEST_3, 'foo', new RegExp(r'Hello')),
+  ]));
+}
diff --git a/tests/compiler/dart2js/mock_libraries.dart b/tests/compiler/dart2js/mock_libraries.dart
index 734db25..5f5cc74 100644
--- a/tests/compiler/dart2js/mock_libraries.dart
+++ b/tests/compiler/dart2js/mock_libraries.dart
@@ -22,11 +22,18 @@
 
 const Map<String, String> DEFAULT_CORE_LIBRARY = const <String, String>{
   'bool': 'class bool {}',
+  'Comparator': 'abstract class Comparator<T> {}',
   'DateTime': r'''
       class DateTime {
         DateTime(year);
         DateTime.utc(year);
       }''',
+      'Deprecated': r'''
+      class Deprecated extends Object {
+        final String expires;
+        const Deprecated(this.expires);
+      }''',
+  'deprecated': 'const Object deprecated = const Deprecated("next release");',
   'double': r'''
       abstract class double extends num {
         static var NAN = 0;
@@ -332,6 +339,7 @@
         operator[](index) {}
         toString() {}
         operator+(other) => this;
+        codeUnitAt(index) => 42;
       }''',
   'JSUInt31': 'class JSUInt31 extends JSUInt32 {}',
   'JSUInt32': 'class JSUInt32 extends JSPositiveInt {}',
@@ -354,4 +362,3 @@
   'MirrorSystem': 'class MirrorSystem {}',
   'MirrorsUsed': 'class MirrorsUsed {}',
 };
-
diff --git a/tests/corelib/corelib.status b/tests/corelib/corelib.status
index e3e092e..831c989 100644
--- a/tests/corelib/corelib.status
+++ b/tests/corelib/corelib.status
@@ -6,6 +6,8 @@
 bool_from_environment2_test: Skip
 bool_from_environment_default_value_test: Skip
 bool_from_environment_test: Skip
+from_environment_const_type_test: Skip
+from_environment_const_type_undefined_test: Skip
 int_from_environment2_test: Skip
 int_from_environment3_test: Skip
 int_from_environment_default_value_test: Skip
@@ -19,6 +21,8 @@
 bool_from_environment2_test: Skip
 bool_from_environment_default_value_test: Skip
 bool_from_environment_test: Skip
+from_environment_const_type_test: Skip
+from_environment_const_type_undefined_test: Skip
 int_from_environment2_test: Skip
 int_from_environment3_test: Skip
 int_from_environment_default_value_test: Skip
@@ -120,8 +124,10 @@
 
 [ $compiler == dart2js && ($runtime == firefox || $runtime == safari || $runtime == chrome || $runtime == drt) ]
 
-[ $compiler == dart2js && ($runtime == safari || $runtime == safarimobilesim) ]
+[ $compiler == dart2js && (($runtime == safari && $builder_tag == mac10_7) || $runtime == safarimobilesim) ]
+list_test/01: Fail # Safari bug: Array(-2) seen as dead code.
 string_trimlr_test/none: Fail
+string_split_test: RuntimeError # Issue 21431
 
 [ $compiler == dart2js && $runtime == ie10 ]
 string_case_test/01: Fail, OK  # Bug in IE.
@@ -137,6 +143,7 @@
 [ $compiler == dart2dart ]
 compare_to2_test: Fail # inherited from VM
 unicode_test: Fail # inherited from VM
+string_split_test: RuntimeError # Issue 21441.
 
 [ $compiler == dart2dart && $minified ]
 error_stack_trace1_test: Fail # Fails in minified mode, test depends on method names.
@@ -146,6 +153,41 @@
 list_insert_test: Fail, OK # Test contains errors but doesn’t mark them as expected
 list_removeat_test: Fail, OK # Test contains errors but doesn’t mark them as expected
 
+# Issue 16391. These tests are supposed to produce a compile time
+# error in checked mode, but they don't:
+[ $compiler == dartanalyzer && $checked ]
+from_environment_const_type_test/02: MissingCompileTimeError # Issue 16391
+from_environment_const_type_test/03: MissingCompileTimeError # Issue 16391
+from_environment_const_type_test/04: MissingCompileTimeError # Issue 16391
+from_environment_const_type_test/06: MissingCompileTimeError # Issue 16391
+from_environment_const_type_test/07: MissingCompileTimeError # Issue 16391
+from_environment_const_type_test/08: MissingCompileTimeError # Issue 16391
+from_environment_const_type_test/09: MissingCompileTimeError # Issue 16391
+from_environment_const_type_test/11: MissingCompileTimeError # Issue 16391
+from_environment_const_type_test/12: MissingCompileTimeError # Issue 16391
+from_environment_const_type_test/13: MissingCompileTimeError # Issue 16391
+from_environment_const_type_test/14: MissingCompileTimeError # Issue 16391
+from_environment_const_type_test/16: MissingCompileTimeError # Issue 16391
+from_environment_const_type_undefined_test/02: MissingCompileTimeError # Issue 16391
+from_environment_const_type_undefined_test/03: MissingCompileTimeError # Issue 16391
+from_environment_const_type_undefined_test/04: MissingCompileTimeError # Issue 16391
+from_environment_const_type_undefined_test/06: MissingCompileTimeError # Issue 16391
+from_environment_const_type_undefined_test/07: MissingCompileTimeError # Issue 16391
+from_environment_const_type_undefined_test/08: MissingCompileTimeError # Issue 16391
+
+# Analyzer's implementation of fromEnvironment assumes that undefined
+# environment variables have an unspecified value (rather than being
+# null) because it is expected that the user will supply a value when
+# the code is run.  This means that it produces slightly different
+# error messages than the VM and Dart2js.
+[ $compiler == dart2analyzer && $checked ]
+from_environment_const_type_undefined_test/09: CompileTimeError
+from_environment_const_type_undefined_test/11: CompileTimeError
+from_environment_const_type_undefined_test/12: CompileTimeError
+from_environment_const_type_undefined_test/13: CompileTimeError
+from_environment_const_type_undefined_test/14: CompileTimeError
+from_environment_const_type_undefined_test/16: CompileTimeError
+
 [ $compiler == dart2analyzer ]
 int_parse_radix_test: fail
 list_insert_test: fail
@@ -170,13 +212,9 @@
 num_clamp_test: StaticWarning, OK # Test generates errors on purpose.
 string_test: StaticWarning, OK # Test generates error on purpose.
 
-[ $compiler == dart2js && ($runtime == safari || $runtime == safarimobilesim) ]
-list_test/01: Fail # Safari bug: Array(-2) seen as dead code.
-
 [ $runtime == ie10 ]
 num_parse_test: RuntimeError  # Issue 15316
 num_parse_test/01: RuntimeError  # Issue 15316
 
 [ $system == windows && $arch == x64 ]
 stopwatch_test: Skip  # Flaky test due to expected performance behaviour.
-
diff --git a/tests/corelib/from_environment_const_type_test.dart b/tests/corelib/from_environment_const_type_test.dart
new file mode 100644
index 0000000..bb011ff
--- /dev/null
+++ b/tests/corelib/from_environment_const_type_test.dart
@@ -0,0 +1,43 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+// SharedOptions=-Da=true -Db=false -Dc=3 -Dd=STRING
+
+import "package:expect/expect.dart";
+
+class Foo {}
+
+const
+    bool   /// 01: ok
+    int    /// 02: static type warning, checked mode compile-time error
+    String /// 03: static type warning, checked mode compile-time error
+    Foo    /// 04: static type warning, checked mode compile-time error
+    a = const bool.fromEnvironment('a');
+
+const
+    bool   /// 05: ok
+    int    /// 06: static type warning, checked mode compile-time error
+    String /// 07: static type warning, checked mode compile-time error
+    Foo    /// 08: static type warning, checked mode compile-time error
+    b = const bool.fromEnvironment('b');
+
+const
+    bool   /// 09: static type warning, checked mode compile-time error
+    int    /// 10: ok
+    String /// 11: static type warning, checked mode compile-time error
+    Foo    /// 12: static type warning, checked mode compile-time error
+    c = const int.fromEnvironment('c');
+
+const
+    bool   /// 13: static type warning, checked mode compile-time error
+    int    /// 14: static type warning, checked mode compile-time error
+    String /// 15: ok
+    Foo    /// 16: static type warning, checked mode compile-time error
+    d = const String.fromEnvironment('d');
+
+main() {
+  Expect.equals(a, true);
+  Expect.equals(b, false);
+  Expect.equals(c, 3);
+  Expect.equals(d, 'STRING');
+}
diff --git a/tests/corelib/from_environment_const_type_undefined_test.dart b/tests/corelib/from_environment_const_type_undefined_test.dart
new file mode 100644
index 0000000..dd89c83
--- /dev/null
+++ b/tests/corelib/from_environment_const_type_undefined_test.dart
@@ -0,0 +1,42 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+class Foo {}
+
+const
+    bool   /// 01: ok
+    int    /// 02: static type warning, checked mode compile-time error
+    String /// 03: static type warning, checked mode compile-time error
+    Foo    /// 04: static type warning, checked mode compile-time error
+    a = const bool.fromEnvironment('a');
+
+const
+    bool   /// 05: ok
+    int    /// 06: static type warning, checked mode compile-time error
+    String /// 07: static type warning, checked mode compile-time error
+    Foo    /// 08: static type warning, checked mode compile-time error
+    b = const bool.fromEnvironment('b');
+
+const
+    bool   /// 09: static type warning
+    int    /// 10: ok
+    String /// 11: static type warning
+    Foo    /// 12: static type warning
+    c = const int.fromEnvironment('c');
+
+const
+    bool   /// 13: static type warning
+    int    /// 14: static type warning
+    String /// 15: ok
+    Foo    /// 16: static type warning
+    d = const String.fromEnvironment('d');
+
+main() {
+  Expect.equals(a, false);
+  Expect.equals(b, false);
+  Expect.equals(c, null);
+  Expect.equals(d, null);
+}
diff --git a/tests/corelib/string_split_reg_exp_test.dart b/tests/corelib/string_split_reg_exp_test.dart
deleted file mode 100644
index f742128..0000000
--- a/tests/corelib/string_split_reg_exp_test.dart
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import "package:expect/expect.dart";
-
-main() {
-  var list = "a b c".split(new RegExp(" "));
-  Expect.equals(3, list.length);
-  Expect.equals("a", list[0]);
-  Expect.equals("b", list[1]);
-  Expect.equals("c", list[2]);
-
-  list = "adbdc".split(new RegExp("[dz]"));
-  Expect.equals(3, list.length);
-  Expect.equals("a", list[0]);
-  Expect.equals("b", list[1]);
-  Expect.equals("c", list[2]);
-
-  list = "addbddc".split(new RegExp("dd"));
-  Expect.equals(3, list.length);
-  Expect.equals("a", list[0]);
-  Expect.equals("b", list[1]);
-  Expect.equals("c", list[2]);
-
-  list = "abc".split(new RegExp(r"b$"));
-  Expect.equals(1, list.length);
-  Expect.equals("abc", list[0]);
-
-  list = "abc".split(new RegExp(""));
-  Expect.equals(3, list.length);
-  Expect.equals("a", list[0]);
-  Expect.equals("b", list[1]);
-  Expect.equals("c", list[2]);
-
-  list = "   ".split(new RegExp("[ ]"));
-  Expect.equals(4, list.length);
-  Expect.equals("", list[0]);
-  Expect.equals("", list[1]);
-  Expect.equals("", list[2]);
-  Expect.equals("", list[3]);
-
-  list = "aaa".split(new RegExp(r"a$"));
-  Expect.equals(2, list.length);
-  Expect.equals("aa", list[0]);
-  Expect.equals("", list[1]);
-}
diff --git a/tests/corelib/string_split_test.dart b/tests/corelib/string_split_test.dart
index 9eee525..3f63ed1 100644
--- a/tests/corelib/string_split_test.dart
+++ b/tests/corelib/string_split_test.dart
@@ -4,45 +4,133 @@
 
 import "package:expect/expect.dart";
 
-class StringSplitTest {
-  static testMain() {
-    var list = "a b c".split(" ");
-    Expect.equals(3, list.length);
-    Expect.equals("a", list[0]);
-    Expect.equals("b", list[1]);
-    Expect.equals("c", list[2]);
-
-    list = "adbdc".split("d");
-    Expect.equals(3, list.length);
-    Expect.equals("a", list[0]);
-    Expect.equals("b", list[1]);
-    Expect.equals("c", list[2]);
-
-    list = "addbddc".split("dd");
-    Expect.equals(3, list.length);
-    Expect.equals("a", list[0]);
-    Expect.equals("b", list[1]);
-    Expect.equals("c", list[2]);
-
-    list = "abc".split(" ");
-    Expect.equals(1, list.length);
-    Expect.equals("abc", list[0]);
-
-    list = "abc".split("");
-    Expect.equals(3, list.length);
-    Expect.equals("a", list[0]);
-    Expect.equals("b", list[1]);
-    Expect.equals("c", list[2]);
-
-    list = "   ".split(" ");
-    Expect.equals(4, list.length);
-    Expect.equals("", list[0]);
-    Expect.equals("", list[1]);
-    Expect.equals("", list[2]);
-    Expect.equals("", list[3]);
-  }
+main() {
+  testSplitString();
+  testSplitRegExp();
+  testSplitPattern();
 }
 
-main() {
-  StringSplitTest.testMain();
+
+testSplit(List expect, String string, Pattern pattern) {
+  String patternString;
+  if (pattern is String) {
+    patternString = '"$pattern"';
+  } else if (pattern is RegExp) {
+    patternString = "/${pattern.pattern}/";
+  } else {
+    patternString = pattern.toString();
+  }
+  Expect.listEquals(expect, string.split(pattern),
+                    '"$string".split($patternString)');
+}
+
+/** String patterns. */
+void testSplitString() {
+  // Normal match.
+  testSplit(["a", "b", "c"], "a b c", " ");
+  testSplit(["a", "b", "c"], "adbdc", "d");
+  testSplit(["a", "b", "c"], "addbddc", "dd");
+  // No match.
+  testSplit(["abc"], "abc", " ");
+  testSplit(["a"], "a", "b");
+  testSplit([""], "", "b");
+  // Empty match matches everywhere except start/end.
+  testSplit(["a", "b", "c"], "abc", "");
+  // All empty parts.
+  testSplit(["", "", "", "", ""], "aaaa", "a");
+  testSplit(["", "", "", "", ""], "    ", " ");
+  testSplit(["", ""], "a", "a");
+  // No overlapping matches. Match as early as possible.
+  testSplit(["", "", "", "a"], "aaaaaaa", "aa");
+  // Cannot split the empty string.
+  testSplit([], "", "");  // Match.
+  testSplit([""], "", "a");  // No match.
+}
+
+/** RegExp patterns. */
+void testSplitRegExp() {
+  testSplitWithRegExp((s) => new RegExp(s));
+}
+
+/** Non-String, non-RegExp patterns. */
+void testSplitPattern() {
+  testSplitWithRegExp((s) => new RegExpWrap(s));
+}
+
+void testSplitWithRegExp(makePattern) {
+  testSplit(["a", "b", "c"], "a b c", makePattern(r" "));
+
+  testSplit(["a", "b", "c"], "adbdc", makePattern(r"[dz]"));
+
+  testSplit(["a", "b", "c"], "addbddc", makePattern(r"dd"));
+
+  testSplit(["abc"], "abc", makePattern(r"b$"));
+
+  testSplit(["a", "b", "c"], "abc", makePattern(r""));
+
+  testSplit(["", "", "", ""], "   ", makePattern(r"[ ]"));
+
+  // Non-zero-length match at end.
+  testSplit(["aa", ""], "aaa", makePattern(r"a$"));
+
+  // Zero-length match at end.
+  testSplit(["aaa"], "aaa", makePattern(r"$"));
+
+  // Non-zero-length match at start.
+  testSplit(["", "aa"], "aaa", makePattern(r"^a"));
+
+  // Zero-length match at start.
+  testSplit(["aaa"], "aaa", makePattern(r"^"));
+
+  // Picks first match, not longest or shortest.
+  testSplit(["", "", "", "a"], "aaaaaaa", makePattern(r"aa|aaa"));
+
+  testSplit(["", "", "", "a"], "aaaaaaa", makePattern(r"aa|"));
+
+  testSplit(["", "", "a"], "aaaaaaa", makePattern(r"aaa|aa"));
+
+  // Zero-width match depending on the following.
+  testSplit(["a", "bc"], "abc", makePattern(r"(?=[ab])"));
+
+  testSplit(["a", "b", "c"], "abc", makePattern(r"(?!^)"));
+
+  // Cannot split empty string.
+  testSplit([], "", makePattern(r""));
+
+  testSplit([], "", makePattern(r"(?:)"));
+
+  testSplit([], "", makePattern(r"$|(?=.)"));
+
+  testSplit([""], "", makePattern(r"a"));
+
+  // Can split singleton string if it matches.
+  testSplit(["", ""], "a", makePattern(r"a"));
+
+  testSplit(["a"], "a", makePattern(r"b"));
+
+  // Do not include captures.
+  testSplit(["a", "", "a"], "abba", makePattern(r"(b)"));
+
+  testSplit(["a", "a"], "abba", makePattern(r"(bb)"));
+
+  testSplit(["a", "a"], "abba", makePattern(r"(b*)"));
+
+  testSplit(["a", "a"], "aa", makePattern(r"(b*)"));
+
+  // But captures are still there, and do work with backreferences.
+  testSplit(["a", "cba"], "abcba", makePattern(r"([bc])(?=.*\1)"));
+}
+
+// A Pattern implementation with the same capabilities as a RegExp, but not
+// directly recognizable as a RegExp.
+class RegExpWrap implements Pattern {
+  final regexp;
+  RegExpWrap(String source) : regexp = new RegExp(source);
+  Iterable<Match> allMatches(String string, [int start = 0]) =>
+      regexp.allMatches(string, start);
+
+  Match matchAsPrefix(String string, [int start = 0]) =>
+      regexp.matchAsPrefix(string, start);
+
+  String toString() => "Wrap(/${regexp.pattern}/)";
 }
diff --git a/tests/html/html.status b/tests/html/html.status
index 0f65c7f..8fadbe3 100644
--- a/tests/html/html.status
+++ b/tests/html/html.status
@@ -234,9 +234,7 @@
 element_types_test/supported_content: Fail
 element_types_test/supported_datalist: Fail
 element_types_test/supported_shadow: Fail
-element_types_test/supported_template: Fail
 fileapi_test/supported: Fail
-indexeddb_1_test/supported: Fail
 indexeddb_1_test/supportsDatabaseNames: Fail
 media_stream_test/supported_MediaStreamEvent: Fail
 media_stream_test/supported_MediaStreamTrackEvent: Fail
@@ -245,6 +243,10 @@
 rtc_test/supported: Fail
 shadow_dom_test/supported: Fail
 speechrecognition_test/supported: Fail
+
+[ ($runtime == safari && $builder_tag == mac10_7) || $runtime == safarimobilesim ]
+indexeddb_1_test/supported: Fail
+element_types_test/supported_template: Fail
 xhr_test/json: Fail # Safari doesn't support JSON response type
 
 [ $runtime == safari ]
@@ -255,6 +257,15 @@
 input_element_test/supported_datetime-local: Fail
 touchevent_test/supported: Fail
 
+[ $runtime == safari && $builder_tag == mac10_8 ]
+element_test/_ElementList: RuntimeError # Issue 21434
+indexeddb_1_test/functional: RuntimeError # Issue 21433
+indexeddb_2_test: RuntimeError # Issue 21433
+indexeddb_4_test: RuntimeError # Issue 21433
+indexeddb_5_test: RuntimeError # Issue 21433
+wheelevent_test: RuntimeError # Issue 21434
+js_test: RuntimeError # Issue 21434
+
 [ $runtime == opera ]
 blob_constructor_test: Fail
 canvas_test: Fail
diff --git a/tests/language/await_for_test.dart b/tests/language/await_for_test.dart
new file mode 100644
index 0000000..fbf504b
--- /dev/null
+++ b/tests/language/await_for_test.dart
@@ -0,0 +1,97 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+// VMOptions=--enable_async
+
+import "dart:async";
+import "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+
+class Trace {
+  String trace = "";
+  record(x) {
+    trace += x.toString();
+  }
+  toString() => trace;
+}
+
+
+Stream makeMeAStream() {
+  return timedCounter(5);
+}
+
+Trace t1 = new Trace();
+
+consumeOne() async {
+  // Equivalent to await for (x in makeMeAStream()) { ... }
+  var s = makeMeAStream();
+  var it = new StreamIterator(s);
+  while (await it.moveNext()) {
+    var x = it.current;
+    t1.record(x);
+  }
+  t1.record("X");
+}
+
+Trace t2 = new Trace();
+
+consumeTwo() async {
+  await for (var x in makeMeAStream()) {
+    t2.record(x);
+  }
+  t2.record("X");
+}
+
+main() {
+  var f1 = consumeOne();
+  t1.record("T1:");
+
+  var f2 = consumeTwo();
+  t2.record("T2:");
+
+  asyncStart();
+  Future.wait([f1, f2]).then((_) {
+    print("Trace 1: $t1");
+    print("Trace 2: $t2");
+    Expect.equals("T1:12345X", t1.toString());
+    Expect.equals("T2:12345X", t2.toString());
+    asyncEnd();
+  });
+}
+
+
+// Create a stream that produces numbers [1, 2, ... maxCount]
+Stream timedCounter(int maxCount) {
+  StreamController controller;
+  Timer timer;
+  int counter = 0;
+
+  void tick(_) {
+    counter++;
+    controller.add(counter); // Ask stream to send counter values as event.
+    if (counter >= maxCount) {
+      timer.cancel();
+      controller.close();    // Ask stream to shut down and tell listeners.
+    }
+  }
+
+  void startTimer() {
+    timer = new Timer.periodic(const Duration(milliseconds: 10), tick);
+  }
+
+  void stopTimer() {
+    if (timer != null) {
+      timer.cancel();
+      timer = null;
+    }
+  }
+
+  controller = new StreamController(
+      onListen: startTimer,
+      onPause: stopTimer,
+      onResume: startTimer,
+      onCancel: stopTimer);
+
+  return controller.stream;
+}
diff --git a/tests/language/compile_time_constant_c_test.dart b/tests/language/compile_time_constant_c_test.dart
index e55e0c7..089da3d 100644
--- a/tests/language/compile_time_constant_c_test.dart
+++ b/tests/language/compile_time_constant_c_test.dart
@@ -2,16 +2,24 @@
 // 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.
 
-const m1 = const {
+const m0 = const {
   499: 400 + 99
 };
+const m1 = const {
+  "foo" + "bar": 42            /// 01: compile-time error
+};
 const m2 = const {
-  "foo" + "bar": 42 /// 01: compile-time error
+  "foo" * 4: 42                /// 02: compile-time error
+};
+const m3 = const {
+  "foo".codeUnitAt(0): 42      /// 03: compile-time error
 };
 
 use(x) => x;
 
 main() {
+  use(m0);
   use(m1);
   use(m2);
+  use(m3);
 }
diff --git a/tests/language/language.status b/tests/language/language.status
index 1b4afdf..5df118e 100644
--- a/tests/language/language.status
+++ b/tests/language/language.status
@@ -26,6 +26,7 @@
 async_test/*: Skip
 async_control_structures_test: Skip
 await_test: Skip
+await_for_test: Skip
 await_future_test: Skip
 await_nonfuture_test: Skip
 await_exceptions_test: Skip
@@ -37,6 +38,7 @@
 async_test/*: Skip
 async_control_structures_test: Skip
 await_test: Skip
+await_for_test: Skip
 await_future_test: Skip
 await_nonfuture_test: Skip
 await_exceptions_test: Skip
diff --git a/tests/lib/convert/json_chunk_test.dart b/tests/lib/convert/json_chunk_test.dart
new file mode 100644
index 0000000..28e9297
--- /dev/null
+++ b/tests/lib/convert/json_chunk_test.dart
@@ -0,0 +1,173 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library json_test;
+
+import "package:expect/expect.dart";
+import "dart:convert";
+
+bool badFormat(e) => e is FormatException;
+
+jsonTest(testName, expect, action(sink)) {
+  var sink = new ChunkedConversionSink.withCallback((values) {
+    var value = values[0];
+    Expect.equals(expect, value, "$testName:$value");
+  });
+  var decoderSink = JSON.decoder.startChunkedConversion(sink);
+  action(decoderSink);
+}
+
+jsonThrowsTest(testName, action(sink)) {
+  var sink = new ChunkedConversionSink.withCallback((values) {
+    Expect.fail("Should have thrown: $testName");
+  });
+  var decoderSink = JSON.decoder.startChunkedConversion(sink);
+  Expect.throws(() { action(decoderSink); }, (e) => e is FormatException,
+                testName);
+}
+
+main() {
+  testNumbers();
+  testStrings();
+  testKeywords();
+}
+
+void testStrings() {
+  var s = r'"abc\f\n\r\t\b\"\/\\\u0001\u9999\uffff"';
+  var expected = "abc\f\n\r\t\b\"\/\\\u0001\u9999\uffff";
+  for (var i = 1; i < s.length - 1; i++) {
+    var s1 = s.substring(0, i);
+    var s2 = s.substring(i);
+    jsonTest("$s1|$s2", expected, (sink) {
+      sink.add(s1);
+      sink.add(s2);
+      sink.close();
+    });
+    jsonTest("$s1|$s2", expected, (sink) {
+      sink.addSlice(s, 0, i, false);
+      sink.addSlice(s, i, s.length, true);
+    });
+    for (var j = i; j < s.length - 1; j++) {
+      var s2a = s.substring(i, j);
+      var s2b = s.substring(j);
+      jsonTest("$s1|$s2a|$s2b", expected, (sink) {
+        sink.add(s1);
+        sink.add(s2a);
+        sink.add(s2b);
+        sink.close();
+      });
+    }
+  }
+}
+
+void testNumbers() {
+  void testNumber(number) {
+    var expected = num.parse(number);
+    for (int i = 1; i < number.length - 1; i++) {
+      var p1 = number.substring(0, i);
+      var p2 = number.substring(i);
+      jsonTest("$p1|$p2", expected, (sink) {
+        sink.add(p1);
+        sink.add(p2);
+        sink.close();
+      });
+
+      jsonTest("$p1|$p2/slice", expected, (sink) {
+        sink.addSlice(number, 0, i, false);
+        sink.addSlice(number, i, number.length, true);
+      });
+
+      for (int j = i; j < number.length - 1; j++) {
+        var p2a = number.substring(i, j);
+        var p2b = number.substring(j);
+        jsonTest("$p1|$p2a|$p2b", expected, (sink) {
+          sink.add(p1);
+          sink.add(p2a);
+          sink.add(p2b);
+          sink.close();
+        });
+      }
+    }
+  }
+  for (var sign in ["-", ""]) {
+    for (var intPart in ["0", "1", "99"]) {
+      for (var decimalPoint in [".", ""]) {
+        for (var decimals in decimalPoint.isEmpty ? [""] : ["0", "99"]) {
+          for (var e in ["e", "e-", "e+", ""]) {
+            for (var exp in e.isEmpty ? [""] : ["0", "2", "22", "34"]) {
+              testNumber("$sign$intPart$decimalPoint$decimals$e$exp");
+            }
+          }
+        }
+      }
+    }
+  }
+
+  void negativeTest(number) {
+    for (int i = 1; i < number.length - 1; i++) {
+      var p1 = number.substring(0, i);
+      var p2 = number.substring(i);
+      jsonThrowsTest("$p1|$p2", (sink) {
+        sink.add(p1);
+        sink.add(p2);
+        sink.close();
+      });
+
+      jsonThrowsTest("$p1|$p2/slice", (sink) {
+        sink.addSlice(number, 0, i, false);
+        sink.addSlice(number, i, number.length, true);
+      });
+
+      for (int j = i; j < number.length - 1; j++) {
+        var p2a = number.substring(i, j);
+        var p2b = number.substring(j);
+        jsonThrowsTest("$p1|$p2a|$p2b", (sink) {
+          sink.add(p1);
+          sink.add(p2a);
+          sink.add(p2b);
+          sink.close();
+        });
+      }
+    }
+  }
+
+  negativeTest("+1e");
+  negativeTest("-00");
+  negativeTest("01");
+  negativeTest(".1");
+  negativeTest("0.");
+  negativeTest("0.e1");
+  negativeTest("1e");
+  negativeTest("1e+");
+  negativeTest("1e-");
+}
+
+void testKeywords() {
+  for (var expected in [null, true, false]) {
+    var s = "$expected";
+    for (int i = 1; i < s.length - 1; i++) {
+      var s1 = s.substring(0, i);
+      var s2 = s.substring(i);
+      jsonTest("$s1|$s2", expected, (sink) {
+        sink.add(s1);
+        sink.add(s2);
+        sink.close();
+      });
+      jsonTest("$s1|$s2", expected, (sink) {
+        sink.addSlice(s, 0, i, false);
+        sink.addSlice(s, i, s.length, true);
+      });
+      for (var j = i; j < s.length - 1; j++) {
+        var s2a = s.substring(i, j);
+        var s2b = s.substring(j);
+        jsonTest("$s1|$s2a|$s2b", expected, (sink) {
+          sink.add(s1);
+          sink.add(s2a);
+          sink.add(s2b);
+          sink.close();
+        });
+      }
+    }
+  }
+}
diff --git a/tests/lib/convert/json_test.dart b/tests/lib/convert/json_test.dart
index 0cf3048..cfed8d9 100644
--- a/tests/lib/convert/json_test.dart
+++ b/tests/lib/convert/json_test.dart
@@ -27,22 +27,52 @@
     } else if (expected is num) {
       Expect.equals(expected is int, actual is int, "$path: same number type");
       Expect.isTrue(expected.compareTo(actual) == 0,
-                    "$path: $expected vs. $actual");
+                    "$path: Expected: $expected, was: $actual");
     } else {
       // String, bool, null.
       Expect.equals(expected, actual, path);
     }
   }
   for (var reviver in [null, (k, v) => v]) {
-    var name = (reviver == null) ? "" : "reviver:";
-    var value = JSON.decode(json, reviver: reviver);
-    compare(expected, value, "$name$value");
-    value = JSON.decode(" $json ", reviver: reviver);
-    compare(expected, value, "$name-$value-");
-    value = JSON.decode("[$json]", reviver: reviver);
-    compare([expected], value, "$name[$value]");
-    value = JSON.decode('{"x":$json}', reviver: reviver);
-    compare({"x":expected}, value, "$name{x:$value}");
+    for (var split in [0, 1, 2, 3]) {
+      var name = (reviver == null) ? "" : "reviver:";
+      var sink = new ChunkedConversionSink.withCallback((values) {
+        var value = values[0];
+        compare(expected, value, "$name$value");
+      });
+      var decoderSink = JSON.decoder.startChunkedConversion(sink);
+      switch (split) {
+        case 0:
+          // Split after first char.
+          decoderSink.add(json.substring(0, 1));
+          decoderSink.add(json.substring(1));
+          decoderSink.close();
+          break;
+        case 1:
+          // Split before last char.
+          int length = json.length;
+          decoderSink.add(json.substring(0, length - 1));
+          decoderSink.add(json.substring(length - 1));
+          decoderSink.close();
+          break;
+        case 2:
+          // Split in middle.
+          int half = json.length ~/ 2;
+          decoderSink.add(json.substring(0, half));
+          decoderSink.add(json.substring(half));
+          decoderSink.close();
+          break;
+        case 3:
+          // Split in three chunks.
+          int length = json.length;
+          int third = length ~/ 3;
+          decoderSink.add(json.substring(0, third));
+          decoderSink.add(json.substring(third, 2 * third));
+          decoderSink.add(json.substring(2 * third));
+          decoderSink.close();
+          break;
+      }
+    }
   }
 }
 
@@ -81,9 +111,11 @@
     for (var sign in signList) {
       for (var fraction in fractionList) {
         for (var exp in exponentList) {
-          var literal = "$sign$integer$fraction$exp";
-          var expectedValue = num.parse(literal);
-          testJson(literal, expectedValue);
+          for (var ws in ["", " ", "\t"]) {
+            var literal = "$ws$sign$integer$fraction$exp$ws";
+            var expectedValue = num.parse(literal);
+            testJson(literal, expectedValue);
+          }
         }
       }
     }
diff --git a/tests/lib/convert/json_utf8_chunk_test.dart b/tests/lib/convert/json_utf8_chunk_test.dart
new file mode 100644
index 0000000..efa8593
--- /dev/null
+++ b/tests/lib/convert/json_utf8_chunk_test.dart
@@ -0,0 +1,450 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test;
+
+import "package:expect/expect.dart";
+import "dart:convert";
+import "unicode_tests.dart" show UNICODE_TESTS;
+
+bool badFormat(e) => e is FormatException;
+
+main() {
+  testNumbers();
+  testStrings();
+  testKeywords();
+  testAll();
+  testMalformed();
+  testUnicodeTests();
+}
+
+// Create an UTF-8 sink from a chunked JSON decoder, then let [action]
+// put data into it, and check that what comes out is equal to [expect].
+void jsonTest(testName, expect, action(sink), [bool allowMalformed = false]) {
+  jsonParse(testName, (value) {
+    Expect.equals(expect, value, "$testName:$value");
+  }, action, allowMalformed);
+}
+
+void jsonParse(testName, check, action, [bool allowMalformed = false]) {
+  var sink = new ChunkedConversionSink.withCallback((values) {
+    var value = values[0];
+    check(value);
+  });
+  var decoderSink = JSON.decoder.startChunkedConversion(sink)
+                                .asUtf8Sink(allowMalformed);
+  try {
+    action(decoderSink);
+  } on FormatException catch (e, s) {
+    print("Source: ${e.source} @ ${e.offset}");
+    Expect.fail("Unexpected throw($testName): $e\n$s");
+  }
+}
+
+void testStrings() {
+  // String literal containing characters, all escape types,
+  // and a number of UTF-8 encoded characters.
+  var s = r'"abc\f\ndef\r\t\b\"\/\\\u0001\u9999\uffff'
+           '\x7f\xc2\x80\xdf\xbf\xe0\xa0\x80\xef\xbf\xbf'
+           '\xf0\x90\x80\x80\xf4\x8f\xbf\xbf"';  // UTF-8.
+  var expected = "abc\f\ndef\r\t\b\"\/\\\u0001\u9999\uffff"
+                 "\x7f\x80\u07ff\u0800\uffff"
+                 "\u{10000}\u{10ffff}";
+  for (var i = 1; i < s.length - 1; i++) {
+    var s1 = s.substring(0, i);
+    var s2 = s.substring(i);
+    jsonTest("$s1|$s2-$i", expected, (sink) {
+      sink.add(s1.codeUnits);
+      sink.add(s2.codeUnits);
+      sink.close();
+    });
+    jsonTest("$s1|$s2-$i-slice", expected, (sink) {
+      sink.addSlice(s.codeUnits, 0, i, false);
+      sink.addSlice(s.codeUnits, i, s.length, true);
+    });
+    for (var j = i; j < s.length - 1; j++) {
+      var s2a = s.substring(i, j);
+      var s2b = s.substring(j);
+      jsonTest("$s1|$s2a|$s2b-$i-$j", expected, (sink) {
+        sink.add(s1.codeUnits);
+        sink.add(s2a.codeUnits);
+        sink.add(s2b.codeUnits);
+        sink.close();
+      });
+    }
+  }
+}
+
+void testNumbers() {
+  for (var number in ["-0.12e-12", "-34.12E+12", "0.0e0", "9.9E9", "0", "9"
+                      "1234.56789123456701418035663664340972900390625",
+                      "1.2345678912345671e-14",
+                      "99999999999999999999"]) {
+    var expected = num.parse(number);
+    for (int i = 1; i < number.length - 1; i++) {
+      var p1 = number.substring(0, i);
+      var p2 = number.substring(i);
+      jsonTest("$p1|$p2", expected, (sink) {
+        sink.add(p1.codeUnits);
+        sink.add(p2.codeUnits);
+        sink.close();
+      });
+
+      jsonTest("$p1|$p2/slice", expected, (sink) {
+        sink.addSlice(number.codeUnits, 0, i, false);
+        sink.addSlice(number.codeUnits, i, number.length, true);
+      });
+
+      for (int j = i; j < number.length - 1; j++) {
+        var p2a = number.substring(i, j);
+        var p2b = number.substring(j);
+        jsonTest("$p1|$p2a|$p2b", expected, (sink) {
+          sink.add(p1.codeUnits);
+          sink.add(p2a.codeUnits);
+          sink.add(p2b.codeUnits);
+          sink.close();
+        });
+      }
+    }
+  }
+}
+
+// Test that `null`, `true`, and `false` keywords are decoded correctly.
+void testKeywords() {
+  for (var expected in [null, true, false]) {
+    var s = "$expected";
+    for (int i = 1; i < s.length - 1; i++) {
+      var s1 = s.substring(0, i);
+      var s2 = s.substring(i);
+      jsonTest("$s1|$s2", expected, (sink) {
+        sink.add(s1.codeUnits);
+        sink.add(s2.codeUnits);
+        sink.close();
+      });
+      jsonTest("$s1|$s2", expected, (sink) {
+        sink.addSlice(s.codeUnits, 0, i, false);
+        sink.addSlice(s.codeUnits, i, s.length, true);
+      });
+      for (var j = i; j < s.length - 1; j++) {
+        var s2a = s.substring(i, j);
+        var s2b = s.substring(j);
+        jsonTest("$s1|$s2a|$s2b", expected, (sink) {
+          sink.add(s1.codeUnits);
+          sink.add(s2a.codeUnits);
+          sink.add(s2b.codeUnits);
+          sink.close();
+        });
+      }
+    }
+  }
+}
+
+// Tests combinations of numbers, strings and keywords.
+void testAll() {
+  var s = r'{"":[true,false,42, -33e-3,null,"\u0080"], "z": 0}';
+  bool check(o) {
+    if (o is Map) {
+      Expect.equals(2, o.length);
+      Expect.equals(0, o["z"]);
+      var v = o[""];
+      if (v is List) {
+        Expect.listEquals([true, false, 42, -33e-3, null, "\u0080"], v);
+      } else {
+        Expect.fail("Expected list, found ${v.runtimeType}");
+      }
+    } else {
+      Expect.fail("Expected map, found ${o.runtimeType}");
+    }
+  }
+  for (var i = 1; i < s.length - 1; i++) {
+  var s1 = s.substring(0, i);
+  var s2 = s.substring(i);
+  jsonParse("$s1|$s2-$i", check, (sink) {
+    sink.add(s1.codeUnits);
+    sink.add(s2.codeUnits);
+    sink.close();
+  });
+  jsonParse("$s1|$s2-$i-slice", check, (sink) {
+    sink.addSlice(s.codeUnits, 0, i, false);
+    sink.addSlice(s.codeUnits, i, s.length, true);
+  });
+  for (var j = i; j < s.length - 1; j++) {
+    var s2a = s.substring(i, j);
+    var s2b = s.substring(j);
+    jsonParse("$s1|$s2a|$s2b-$i-$j", check, (sink) {
+      sink.add(s1.codeUnits);
+      sink.add(s2a.codeUnits);
+      sink.add(s2b.codeUnits);
+      sink.close();
+    });
+  }
+}
+
+}
+
+// Check that [codes] decode to [expect] when allowing malformed UTF-8,
+// and throws otherwise.
+void jsonMalformedTest(name, expect, codes) {
+  // Helper method.
+  void test(name, expect, action(sink)) {
+    var tag = "Malform:$name-$expect";
+    {  // Allowing malformed, expect [expect]
+      var sink = new ChunkedConversionSink.withCallback((values) {
+        var value = values[0];
+        Expect.equals(expect, value, tag);
+      });
+      var decoderSink = JSON.decoder.startChunkedConversion(sink)
+                                    .asUtf8Sink(true);
+      try {
+        action(decoderSink);
+      } catch (e, s) {
+        Expect.fail("Unexpected throw ($tag): $e\n$s");
+      }
+    }
+    {  // Not allowing malformed, expect throw.
+      var sink = new ChunkedConversionSink.withCallback((values) {
+        Expect.fail(tag);
+      });
+      var decoderSink = JSON.decoder.startChunkedConversion(sink)
+                                    .asUtf8Sink(false);
+      Expect.throws(() { action(decoderSink); }, null, tag);
+    }
+  }
+
+  // Test all two and three part slices.
+  for (int i = 1; i < codes.length - 1; i++) {
+    test("$name:$i", expect, (sink) {
+      sink.add(codes.sublist(0, i));
+      sink.add(codes.sublist(i));
+      sink.close();
+    });
+    test("$name:$i-slice", expect, (sink) {
+      sink.addSlice(codes, 0, i, false);
+      sink.addSlice(codes, i, codes.length, true);
+    });
+    for (int j = i; j < codes.length - 1; j++) {
+      test("$name:$i|$j", expect, (sink) {
+        sink.add(codes.sublist(0, i));
+        sink.add(codes.sublist(i, j));
+        sink.add(codes.sublist(j));
+        sink.close();
+      });
+    }
+  }
+}
+
+// Test that `codeString.codeUnits` fails to parse as UTF-8 JSON,
+// even with decoder not throwing on malformed encodings.
+void jsonThrows(String name, String codeString) {
+  testJsonThrows(tag, action) {
+    // Not allowing malformed, expect throw.
+    var sink = new ChunkedConversionSink.withCallback((values) {
+      Expect.fail(tag);
+    });
+    var decoderSink = JSON.decoder.startChunkedConversion(sink)
+                                  .asUtf8Sink(true);
+    Expect.throws(() { action(decoderSink); }, null, tag);
+  }
+
+  var codes = codeString.codeUnits;
+  for (int i = 1; i < codes.length - 1; i++) {
+    testJsonThrows("$name:$i", (sink) {
+      sink.add(codes.sublist(0, i));
+      sink.add(codes.sublist(i));
+      sink.close();
+    });
+    testJsonThrows("$name:$i-slice", (sink) {
+      sink.addSlice(codes, 0, i, false);
+      sink.addSlice(codes, i, codes.length, true);
+    });
+    for (int j = i; j < codes.length - 1; j++) {
+      testJsonThrows("$name:$i|$j", (sink) {
+        sink.add(codes.sublist(0, i));
+        sink.add(codes.sublist(i, j));
+        sink.add(codes.sublist(j));
+        sink.close();
+      });
+    }
+  }
+}
+
+// Malformed UTF-8 encodings.
+void testMalformed() {
+  // Overlong encodings.
+  jsonMalformedTest("overlong-0-2", "@\uFFFD@",
+                    [0x22, 0x40, 0xc0, 0x80, 0x40, 0x22]);
+  jsonMalformedTest("overlong-0-3", "@\uFFFD@",
+                    [0x22, 0x40, 0xe0, 0x80, 0x80, 0x40, 0x22]);
+  jsonMalformedTest("overlong-0-4", "@\uFFFD@",
+                    [0x22, 0x40, 0xf0, 0x80, 0x80, 0x80, 0x40, 0x22]);
+
+  jsonMalformedTest("overlong-7f-2", "@\uFFFD@",
+                    [0x22, 0x40, 0xc1, 0xbf, 0x40, 0x22]);
+  jsonMalformedTest("overlong-7f-3", "@\uFFFD@",
+                    [0x22, 0x40, 0xe0, 0x81, 0xbf, 0x40, 0x22]);
+  jsonMalformedTest("overlong-7f-4", "@\uFFFD@",
+                    [0x22, 0x40, 0xf0, 0x80, 0x81, 0xbf, 0x40, 0x22]);
+
+  jsonMalformedTest("overlong-80-3", "@\uFFFD@",
+                    [0x22, 0x40, 0xe0, 0x82, 0x80, 0x40, 0x22]);
+  jsonMalformedTest("overlong-80-4", "@\uFFFD@",
+                    [0x22, 0x40, 0xf0, 0x80, 0x82, 0x80, 0x40, 0x22]);
+
+  jsonMalformedTest("overlong-7ff-3", "@\uFFFD@",
+                    [0x22, 0x40, 0xe0, 0x9f, 0xbf, 0x40, 0x22]);
+  jsonMalformedTest("overlong-7ff-4", "@\uFFFD@",
+                    [0x22, 0x40, 0xf0, 0x80, 0x9f, 0xbf, 0x40, 0x22]);
+
+  jsonMalformedTest("overlong-800-4", "@\uFFFD@",
+                    [0x22, 0x40, 0xf0, 0x80, 0xa0, 0x80, 0x40, 0x22]);
+  jsonMalformedTest("overlong-ffff-4", "@\uFFFD@",
+                    [0x22, 0x40, 0xf0, 0x8f, 0xbf, 0xbf, 0x40, 0x22]);
+
+  // Unterminated multibyte sequences.
+  jsonMalformedTest("unterminated-2-normal", "@\uFFFD@",
+                    [0x22, 0x40, 0xc0, 0x40, 0x22]);
+
+  jsonMalformedTest("unterminated-3-normal", "@\uFFFD@",
+                    [0x22, 0x40, 0xe0, 0x80, 0x40, 0x22]);
+
+  jsonMalformedTest("unterminated-4-normal", "@\uFFFD@",
+                    [0x22, 0x40, 0xf0, 0x80, 0x80, 0x40, 0x22]);
+
+  jsonMalformedTest("unterminated-2-multi", "@\uFFFD\x80@",
+                    [0x22, 0x40, 0xc0, 0xc2, 0x80, 0x40, 0x22]);
+
+  jsonMalformedTest("unterminated-3-multi", "@\uFFFD\x80@",
+                    [0x22, 0x40, 0xe0, 0x80, 0xc2, 0x80, 0x40, 0x22]);
+
+  jsonMalformedTest("unterminated-4-multi", "@\uFFFD\x80@",
+                    [0x22, 0x40, 0xf0, 0x80, 0x80, 0xc2, 0x80, 0x40, 0x22]);
+
+  jsonMalformedTest("unterminated-2-escape", "@\uFFFD\n@",
+                    [0x22, 0x40, 0xc0, 0x5c, 0x6e, 0x40, 0x22]);
+
+  jsonMalformedTest("unterminated-3-escape", "@\uFFFD\n@",
+                    [0x22, 0x40, 0xe0, 0x80, 0x5c, 0x6e, 0x40, 0x22]);
+
+  jsonMalformedTest("unterminated-4-escape", "@\uFFFD\n@",
+                    [0x22, 0x40, 0xf0, 0x80, 0x80, 0x5c, 0x6e, 0x40, 0x22]);
+
+  jsonMalformedTest("unterminated-2-end", "@\uFFFD",
+                    [0x22, 0x40, 0xc0, 0x22]);
+
+  jsonMalformedTest("unterminated-3-end", "@\uFFFD",
+                    [0x22, 0x40, 0xe0, 0x80, 0x22]);
+
+  jsonMalformedTest("unterminated-4-end", "@\uFFFD",
+                    [0x22, 0x40, 0xf0, 0x80, 0x80, 0x22]);
+
+  // Unexpected continuation byte
+  // - after a normal character.
+  jsonMalformedTest("continuation-normal", "@\uFFFD@",
+                    [0x22, 0x40, 0x80, 0x40, 0x22]);
+
+  // - after a valid continuation byte.
+  jsonMalformedTest("continuation-continuation-2", "@\x80\uFFFD@",
+                    [0x22, 0x40, 0xc2, 0x80, 0x80, 0x40, 0x22]);
+  jsonMalformedTest("continuation-continuation-3", "@\u0800\uFFFD@",
+                    [0x22, 0x40, 0xe0, 0xa0, 0x80, 0x80, 0x40, 0x22]);
+  jsonMalformedTest("continuation-continuation-4", "@\u{10000}\uFFFD@",
+                    [0x22, 0x40, 0xf0, 0x90, 0x80, 0x80, 0x80, 0x40, 0x22]);
+
+  // - after another invalid continuation byte
+  jsonMalformedTest("continuation-twice", "@\uFFFD\uFFFD\uFFFD@",
+                    [0x22, 0x40, 0x80, 0x80, 0x80, 0x40, 0x22]);
+  // - at start.
+  jsonMalformedTest("continuation-start", "\uFFFD@",
+                    [0x22, 0x80, 0x40, 0x22]);
+
+  // Unexpected leading byte where continuation byte expected.
+  jsonMalformedTest("leading-2", "@\uFFFD\x80@",
+                    [0x22, 0x40, 0xc0, 0xc2, 0x80, 0x40, 0x22]);
+  jsonMalformedTest("leading-3-1", "@\uFFFD\x80@",
+                    [0x22, 0x40, 0xe0, 0xc2, 0x80, 0x40, 0x22]);
+  jsonMalformedTest("leading-3-2", "@\uFFFD\x80@",
+                    [0x22, 0x40, 0xe0, 0x80, 0xc2, 0x80, 0x40, 0x22]);
+  jsonMalformedTest("leading-4-1", "@\uFFFD\x80@",
+                    [0x22, 0x40, 0xf0, 0xc2, 0x80, 0x40, 0x22]);
+  jsonMalformedTest("leading-4-2", "@\uFFFD\x80@",
+                    [0x22, 0x40, 0xf0, 0x80, 0xc2, 0x80, 0x40, 0x22]);
+  jsonMalformedTest("leading-4-3", "@\uFFFD\x80@",
+                    [0x22, 0x40, 0xf0, 0x80, 0x80, 0xc2, 0x80, 0x40, 0x22]);
+
+  // Overlong encodings of ASCII outside of strings always fail.
+  // Use Latin-1 strings as argument since most chars are correct,
+  // pass string.codeUnits to decoder as UTF-8.
+  jsonThrows("number-1", "\xc0\xab0.0e-0");  // '-' is 0x2b => \xc0\xab
+  jsonThrows("number-2", "-\xc0\xb0.0e-0");  // '0' is 0x30 => \xc0\xb0
+  jsonThrows("number-3", "-0\xc0\xae0e-0");  // '.' is 0x2e => \xc0\xae
+  jsonThrows("number-4", "-0.\xc0\xb0e-0");
+  jsonThrows("number-5", "-0.0\xc1\xa5-0");  // 'e' is 0x65 => \xc1\xa5
+  jsonThrows("number-6", "-0.0e\xc0\xab0");
+  jsonThrows("number-7", "-0.0e-\xc0\xb0");
+
+  jsonThrows("true-1", "\xc1\xb4rue");  // 't' is 0x74
+  jsonThrows("true-2", "t\xc1\xb2ue");  // 'r' is 0x72
+  jsonThrows("true-3", "tr\xc1\xb5e");  // 'u' is 0x75
+  jsonThrows("true-4", "tru\xc1\xa5");  // 'e' is 0x65
+
+  jsonThrows("false-1", "\xc1\xa6alse");  // 'f' is 0x66
+  jsonThrows("false-2", "f\xc1\xa1lse");  // 'a' is 0x61
+  jsonThrows("false-3", "fa\xc1\xacse");  // 'l' is 0x6c
+  jsonThrows("false-4", "fal\xc1\xb3e");  // 's' is 0x73
+  jsonThrows("false-5", "fals\xc1\xa5");  // 'e' is 0x65
+
+  jsonThrows("null-1", "\xc1\xaeull");  // 'n' is 0x6e
+  jsonThrows("null-2", "n\xc1\xb5ll");  // 'u' is 0x75
+  jsonThrows("null-3", "nu\xc1\xacl");  // 'l' is 0x6c
+  jsonThrows("null-4", "nul\xc1\xac");  // 'l' is 0x6c
+
+  jsonThrows("array-1", "\xc1\x9b0,0]");  // '[' is 0x5b
+  jsonThrows("array-2", "[0,0\xc1\x9d");  // ']' is 0x5d
+  jsonThrows("array-2", "[0\xc0\xac0]");  // ',' is 0x2c
+
+  jsonThrows("object-1", '\xc1\xbb"x":0}');  // '{' is 0x7b
+  jsonThrows("object-2", '{"x":0\xc1\xbd');  // '}' is 0x7d
+  jsonThrows("object-2", '{"x\xc0\xba0}');  // ':' is 0x3a
+
+  jsonThrows("string-1", '\xc0\xa2x"');  // '"' is 0x22
+  jsonThrows("string-1", '"x\xc0\xa2');  // Unterminated string.
+
+  jsonThrows("whitespace-1", "\xc0\xa01");  // ' ' is 0x20
+}
+
+void testUnicodeTests() {
+  for (var pair in UNICODE_TESTS) {
+    var bytes = pair[0];
+    var string = pair[1];
+    int step = 1;
+    if (bytes.length > 100) step = bytes.length ~/ 13;
+    for (int i = 1; i < bytes.length - 1; i += step) {
+      jsonTest("$string:$i", string, (sink) {
+        sink.add([0x22]);  // Double-quote.
+        sink.add(bytes.sublist(0, i));
+        sink.add(bytes.sublist(i));
+        sink.add([0x22]);
+        sink.close();
+      });
+      jsonTest("$string:$i-slice", string, (sink) {
+        sink.addSlice([0x22], 0, 1, false);
+        sink.addSlice(bytes, 0, i, false);
+        sink.addSlice(bytes, i, bytes.length, false);
+        sink.addSlice([0x22], 0, 1, true);
+      });
+      int skip = 1;
+      if (bytes.length > 25) skip = bytes.length ~/ 17;
+      for (int j = i; j < bytes.length - 1; j += skip) {
+        jsonTest("$string:$i|$j", string, (sink) {
+          sink.add([0x22]);
+          sink.add(bytes.sublist(0, i));
+          sink.add(bytes.sublist(i, j));
+          sink.add(bytes.sublist(j));
+          sink.add([0x22]);
+          sink.close();
+        });
+      }
+    }
+  }
+}
diff --git a/tests/lib/convert/unicode_tests.dart b/tests/lib/convert/unicode_tests.dart
index 47bd510..a750016 100644
--- a/tests/lib/convert/unicode_tests.dart
+++ b/tests/lib/convert/unicode_tests.dart
@@ -88,7 +88,7 @@
   assert(2 == BEE_STRING.length);
   var tests = [];
   tests.addAll(_TEST_PAIRS);
-  tests.addAll(_TEST_PAIRS.expand((test) {
+  tests.addAll(_TEST_PAIRS.map((test) {
     var bytes = test[0];
     var string = test[1];
     var longBytes = [];
@@ -97,7 +97,7 @@
       longBytes.addAll(bytes);
       longString += string;
     }
-    return [test, [longBytes, longString]];
+    return [longBytes, longString];
   }));
   return tests;
 }
diff --git a/tests/lib/lib.status b/tests/lib/lib.status
index 12b7bf0..97c7512 100644
--- a/tests/lib/lib.status
+++ b/tests/lib/lib.status
@@ -100,14 +100,20 @@
 mirrors/mirrors_reader_test: Slow, RuntimeError # Issue 16589
 
 [ $runtime == safari || $runtime == safarimobilesim ]
-typed_data/setRange_2_test: Fail # Safari doesn't fully implement spec for TypedArray.set
-typed_data/setRange_3_test: Fail # Safari doesn't fully implement spec for TypedArray.set
-typed_data/setRange_4_test: Fail # Safari doesn't fully implement spec for TypedArray.set
 typed_data/int32x4_test: Fail, Pass # Safari has an optimization bug (nightlies are already fine).
 typed_data/float32x4_test: Fail, Pass # Safari has an optimization bug (nightlies are already fine).
 mirrors/null_test: Fail # http://dartbug.com/16831
 convert/json_test: Fail # https://bugs.webkit.org/show_bug.cgi?id=134920
 
+[ ($runtime == safari && $builder_tag == mac10_7)|| $runtime == safarimobilesim ]
+typed_data/setRange_2_test: Fail # Safari doesn't fully implement spec for TypedArray.set
+typed_data/setRange_3_test: Fail # Safari doesn't fully implement spec for TypedArray.set
+typed_data/setRange_4_test: Fail # Safari doesn't fully implement spec for TypedArray.set
+
+
+[ $runtime == safari && $builder_tag == mac10_8 ]
+mirrors/generics_test/none: RuntimeError # Issue 21427
+
 [ $compiler == dart2js && $runtime == chromeOnAndroid ]
 typed_data/setRange_2_test: RuntimeError # TODO(dart2js-team): Please triage this failure.
 typed_data/setRange_3_test: RuntimeError # TODO(dart2js-team): Please triage this failure.
diff --git a/tests/standalone/io/server_socket_reference_issue21383_and_issue21384_test.dart b/tests/standalone/io/server_socket_reference_issue21383_and_issue21384_test.dart
new file mode 100644
index 0000000..95e0363
--- /dev/null
+++ b/tests/standalone/io/server_socket_reference_issue21383_and_issue21384_test.dart
@@ -0,0 +1,73 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+import 'dart:io';
+
+import 'package:async_helper/async_helper.dart';
+
+
+testBothListen() {
+  asyncStart();
+  ServerSocket.bind('127.0.0.1', 0).then((mainServer) {
+    mainServer.reference.create().then((refServer) {
+      refServer.listen((_) {});
+      mainServer.listen((_) {});
+      Timer.run(() {
+        mainServer.close();
+        refServer.close();
+        asyncEnd();
+      });
+    });
+  });
+}
+
+testRefServerListen() {
+  asyncStart();
+  ServerSocket.bind('127.0.0.1', 0).then((mainServer) {
+    mainServer.reference.create().then((refServer) {
+      refServer.listen((_) {});
+      Timer.run(() {
+        mainServer.close();
+        refServer.close();
+        asyncEnd();
+      });
+    });
+  });
+}
+
+testMainServerListen() {
+  asyncStart();
+  ServerSocket.bind('127.0.0.1', 0).then((mainServer) {
+    mainServer.reference.create().then((refServer) {
+      mainServer.listen((_) {});
+      Timer.run(() {
+        mainServer.close();
+        refServer.close();
+        asyncEnd();
+      });
+    });
+  });
+}
+
+testNoneListen() {
+  asyncStart();
+  ServerSocket.bind('127.0.0.1', 0).then((mainServer) {
+    mainServer.reference.create().then((refServer) {
+      Timer.run(() {
+        mainServer.close();
+        refServer.close();
+        asyncEnd();
+      });
+    });
+  });
+}
+
+main() {
+  testNoneListen();
+  testMainServerListen();
+  testRefServerListen();
+  testBothListen();
+}
+
diff --git a/tests/standalone/standalone.status b/tests/standalone/standalone.status
index 6e16f0d..d51d56e 100644
--- a/tests/standalone/standalone.status
+++ b/tests/standalone/standalone.status
@@ -156,3 +156,7 @@
 
 [ $system == windows ]
 io/skipping_dart2js_compilations_test: Fail # Issue 19551.
+
+[ $system != linux ]
+io/server_socket_reference_issue21383_and_issue21384_test: Skip # Not supported on other platforms so far
+
diff --git a/tools/VERSION b/tools/VERSION
index d4dc650..6f49db1 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 1
 MINOR 8
 PATCH 0
-PRERELEASE 1
-PRERELEASE_PATCH 1
+PRERELEASE 2
+PRERELEASE_PATCH 0
diff --git a/tools/bots/compiler.py b/tools/bots/compiler.py
index 05b178b..246e87f 100644
--- a/tools/bots/compiler.py
+++ b/tools/bots/compiler.py
@@ -139,6 +139,7 @@
 
   # We have both 10.8 and 10.7 bots, functionality is the same.
   if system == 'mac10.8' or system == 'mac10.7':
+    builder_tag = system.replace('.', '_')
     system = 'mac'
 
   if (system == 'windows' and platform.system() != 'Windows') or (
@@ -348,6 +349,8 @@
   if build_info.minified: test_flags += ['--minified']
   if build_info.host_checked: test_flags += ['--host-checked']
   if build_info.batch: test_flags += ['--dart2js-batch']
+  if build_info.builder_tag: test_flags += ['--builder-tag=' +
+                                             build_info.builder_tag]
 
   if build_info.dart2js_full:
     compiler = build_info.compiler
diff --git a/tools/dom/dom.json b/tools/dom/dom.json
index 7be54d7..31cc95b 100644
--- a/tools/dom/dom.json
+++ b/tools/dom/dom.json
@@ -7668,6 +7668,9 @@
         "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#navigatorstorageutils",
         "support_level": "experimental"
       },
+      "hardwareConcurrency": {
+        "support_level": "untriaged"
+      },
       "isProtocolHandlerRegistered": {
         "support_level": "untriaged"
       },
diff --git a/tools/dom/scripts/dartdomgenerator.py b/tools/dom/scripts/dartdomgenerator.py
index cc0d07c..a3fcece 100755
--- a/tools/dom/scripts/dartdomgenerator.py
+++ b/tools/dom/scripts/dartdomgenerator.py
@@ -50,8 +50,7 @@
 from systemhtml import DartLibraryEmitter, Dart2JSBackend,\
                        HtmlDartInterfaceGenerator, DartLibrary, DartLibraries,\
                        HTML_LIBRARY_NAMES
-from systemnative import CPPLibraryEmitter, DartiumBackend, \
-                         GetNativeLibraryEmitter
+from systemnative import CPPLibraryEmitter, DartiumBackend
 from templateloader import TemplateLoader
 
 sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..'))
@@ -167,13 +166,8 @@
     cpp_output_dir = os.path.join(dartium_output_dir, 'cpp')
     cpp_library_emitter = CPPLibraryEmitter(emitters, cpp_output_dir)
     dart_output_dir = os.path.join(dartium_output_dir, 'dart')
-    native_library_emitter = \
-        GetNativeLibraryEmitter(emitters, template_loader,
-                                dartium_output_dir, dart_output_dir,
-                                auxiliary_dir)
     backend_factory = lambda interface:\
-        DartiumBackend(interface, native_library_emitter,
-                       cpp_library_emitter, backend_options)
+        DartiumBackend(interface, cpp_library_emitter, backend_options)
     dart_libraries = DartLibraries(
         HTML_LIBRARY_NAMES, template_loader, 'dartium', dartium_output_dir)
 
@@ -292,9 +286,6 @@
       GenerateSingleFile(
           os.path.join(dartium_output_dir, '%s_dartium.dart' % library_name),
           os.path.join('..', '..', '..', 'sdk', 'lib', library_name, 'dartium'))
-    GenerateSingleFile(
-        os.path.join(dartium_output_dir, '_blink_dartium.dart'),
-        os.path.join('..', '..', '..', 'sdk', 'lib', '_blink', 'dartium'))
 
   print '\nGenerating single file %s seconds' % round(time.time() - file_generation_start_time, 2)
 
diff --git a/tools/dom/scripts/generator.py b/tools/dom/scripts/generator.py
index 37117e7..48bb24a 100644
--- a/tools/dom/scripts/generator.py
+++ b/tools/dom/scripts/generator.py
@@ -17,15 +17,28 @@
 _pure_interfaces = monitored.Set('generator._pure_interfaces', [
     # TODO(sra): DOMStringMap should be a class implementing Map<String,String>.
     'DOMStringMap',
+    'AbstractWorker',
     'CanvasPathMethods',
     'ChildNode',
+    'DocumentAnimation',
+    'DocumentFontFaceSet',
+    'DocumentFullscreen',
+    'DocumentXPathEvaluator',
+    'ElementAnimation',
+    'ElementFullscreen',
     'EventListener',
     'GlobalEventHandlers',
+    'ImageBitmapFactories',
     'MediaQueryListListener',
+    'MouseEventHitRegion',
     'MutationCallback',
+    'NavigatorCPU',
+    'NavigatorEvents',
     'NavigatorID',
+    'NavigatorLanguage',
     'NavigatorOnLine',
     'ParentNode',
+    'SVGDocument',
     'SVGExternalResourcesRequired',
     'SVGFilterPrimitiveStandardAttributes',
     'SVGFitToViewBox',
@@ -38,6 +51,8 @@
     'WebGLRenderingContextBase',
     'WindowBase64',
     'WindowEventHandlers',
+    'WindowImageBitmapFactories',
+    'WindowPagePopup',
     'WindowTimers',
     ])
 
diff --git a/tools/dom/scripts/systemnative.py b/tools/dom/scripts/systemnative.py
index 84bfa75..432d68d 100644
--- a/tools/dom/scripts/systemnative.py
+++ b/tools/dom/scripts/systemnative.py
@@ -13,40 +13,6 @@
 from idlnode import IDLArgument, IDLAttribute, IDLEnum, IDLMember
 from systemhtml import js_support_checks, GetCallbackInfo, HTML_LIBRARY_NAMES
 
-# This is an ugly hack to get things working on the M35 roll.  Once we
-# generate dart:blink from the new scripts, this shouldn't be needed.
-_cpp_resolver_string_map = {
-    # These custom constructors all resolve to a common entry, so choosing any
-    # of the generated strings works.
-    'ConsoleBase_assertCondition_Callback_boolean_object':
-        'ConsoleBase_assert_Callback_boolean_object',
-    'FormData_constructorCallback':
-        'FormData_constructorCallback_HTMLFormElement',
-    # This callback name just gets generated sligtly different and we don't
-    # want to bother fixing it.
-    'ScriptProcessorNode__setEventListener_Callback':
-        'ScriptProcessorNode_setEventListener_Callback',
-    # We don't know how to get GLenum to show up as the correct type in this
-    # script and don't want to bother fixing it the right way.
-    'WebGLDrawBuffers_drawBuffersWEBGL_Callback_sequence<GLenum>' :
-        'WebGLDrawBuffers_drawBuffersWEBGL_Callback_sequence<unsigned long>',
-    # Blink 36 fixes.
-    'CanvasRenderingContext2D_setLineDash_Callback_sequence<float>' :
-        'CanvasRenderingContext2D_setLineDash_Callback_sequence<unrestricted float>',
-
-    # SVGGraphicsElement is base class.
-    'SVGUseElement_hasExtension_Callback_DOMString' :
-        'SVGGraphicsElement_hasExtension_Callback_DOMString',
-    'SVGUseElement_systemLanguage_Getter' :
-        'SVGGraphicsElement_systemLanguage_Getter',
-    'SVGUseElement_requiredFeatures_Getter' :
-        'SVGGraphicsElement_requiredFeatures_Getter',
-    'SVGUseElement_requiredExtensions_Getter' :
-        'SVGGraphicsElement_requiredExtensions_Getter',
-
-    'Gamepad_buttons_Getter' : 'WebKitGamepad_buttons_Getter',
-}
-
 # TODO(vsm): This logic needs to pulled from the source IDL.  These tables are
 # an ugly workaround.
 _cpp_callback_map = {
@@ -170,18 +136,6 @@
   ('DOMURL', '_createObjectURL_3Callback'): 'URLMediaStream',
 }
 
-_blink_1916_rename_map = {
-  'NavigatorID': 'Navigator',
-  'CanvasRenderingContext' : 'CanvasRenderingContext2D',
-  'Clipboard': 'DataTransfer',
-  'Player': 'AnimationPlayer',
-  'Algorithm': 'KeyAlgorithm',
-  'any': 'ScriptValue',
-  'URLUtils': 'URL',
-  'URLUtilsReadOnly': 'WorkerLocation',
-  'Path': 'Path2D'
-}
-
 _cpp_partial_map = {}
 
 _cpp_no_auto_scope_list = set([
@@ -364,8 +318,6 @@
     t = TypeIdToBlinkName(arr_match, database)
     return "%s[]" % t
 
-  if interface_id in _blink_1916_rename_map:
-    interface_id = _blink_1916_rename_map[interface_id]
   return interface_id
 
 def _GetCPPTypeName(interface_name, callback_name, cpp_name):
@@ -409,42 +361,21 @@
 
   return _type_encoding_map.get(t) or t
 
-# FIXME(leafp) This should really go elsewhere.  I think the right thing
-# to do is to add support in the DartLibraries objects in systemhtml
-# for emitting top level code in libraries.  This can then just be a
-# normal use of that kind of object
-def GetNativeLibraryEmitter(emitters, template_loader, 
-                            dartium_output_dir, dart_output_dir,
-                            auxiliary_dir):
-    def massage_path(path):
-        # The most robust way to emit path separators is to use / always.
-        return path.replace('\\', '/')
-    template = template_loader.Load('_blink_dartium.darttemplate')
-    dart_path = os.path.join(dartium_output_dir, '_blink_dartium.dart')
-    library_emitter = emitters.FileEmitter(dart_path)
-    auxiliary_dir = os.path.relpath(auxiliary_dir, dartium_output_dir)
-    emitter = \
-        library_emitter.Emit(template,
-                             AUXILIARY_DIR=massage_path(auxiliary_dir))
-    return emitter
-
 class DartiumBackend(HtmlDartGenerator):
   """Generates Dart implementation for one DOM IDL interface."""
 
-  def __init__(self, interface, native_library_emitter,
+  def __init__(self, interface, 
                cpp_library_emitter, options):
     super(DartiumBackend, self).__init__(interface, options, True)
 
     self._interface = interface
     self._cpp_library_emitter = cpp_library_emitter
-    self._native_library_emitter = native_library_emitter
     self._database = options.database
     self._template_loader = options.templates
     self._type_registry = options.type_registry
     self._interface_type_info = self._type_registry.TypeInfo(self._interface.id)
     self._metadata = options.metadata
     # These get initialized by StartInterface
-    self._blink_entries = None
     self._cpp_header_emitter = None
     self._cpp_impl_emitter = None
     self._members_emitter = None
@@ -452,7 +383,6 @@
     self._cpp_impl_includes = None
     self._cpp_definitions_emitter = None
     self._cpp_resolver_emitter = None
-    self._native_class_emitter = None
 
   def ImplementsMergedMembers(self):
     # We could not add merged functions to implementation class because
@@ -611,7 +541,7 @@
         return "$" + s
       return s
 
-    if count:
+    if count is not None:
       arity = str(count)
       dart_name = mkPublic("_".join([tag, arity]))
     else:
@@ -628,9 +558,10 @@
       return "_".join(fields)
 
   def DeriveQualifiedBlinkName(self, interface_name, name):
-      return DeriveQualifiedName(
-          "_blink", DeriveQualifiedName(DeriveBlinkClassName(interface_name),
-                                        name))
+      blinkClass = DeriveQualifiedName(
+        "_blink", DeriveBlinkClassName(interface_name))
+      blinkInstance = DeriveQualifiedName(blinkClass, "instance")
+      return DeriveQualifiedName(blinkInstance, name + "_")
 
   def NativeSpec(self):
     return ''
@@ -681,21 +612,6 @@
         '    WebCore::DartArrayBufferViewInternal::constructWebGLArray<Dart$(INTERFACE_NAME)>(args);\n'
         '}\n',
         INTERFACE_NAME=self._interface.id);
-    self._native_class_emitter = self._native_library_emitter.Emit(
-      '\n'
-      'class $INTERFACE_NAME {'
-      '$!METHODS'
-      '}\n',
-      INTERFACE_NAME=DeriveBlinkClassName(self._interface.id))
-    # TODO(vsm): Should we check for collisions between EventConstructors and others?
-    # Should we unify at some point?
-    if 'EventConstructor' in self._interface.ext_attrs:
-        self._native_class_emitter.Emit(
-            '\n'
-            '  static constructorCallback(type, options) native "$(INTERFACE_NAME)_constructorCallback";\n',
-            INTERFACE_NAME=self._interface.id
-            )
-    self._blink_entries = set()
 
   def _EmitConstructorInfrastructure(self,
       constructor_info, cpp_prefix, cpp_suffix, factory_method_name,
@@ -715,17 +631,6 @@
 
     dart_native_name, constructor_callback_id = \
         self.DeriveNativeEntry(cpp_suffix, 'Constructor', argument_count)
-    if constructor_callback_id in _cpp_resolver_string_map:
-        constructor_callback_id = \
-            _cpp_resolver_string_map[constructor_callback_id]
-    if dart_native_name not in self._blink_entries:
-      self._blink_entries.add(dart_native_name)
-      self._native_class_emitter.Emit(
-        '\n'
-        '  static $FACTORY_METHOD_NAME($PARAMETERS) native "$ID";\n',
-        FACTORY_METHOD_NAME=dart_native_name,
-        PARAMETERS=parameters,
-        ID=constructor_callback_id)
 
     # Then we emit the impedance matching wrapper to call out to the
     # toplevel wrapper
@@ -1016,7 +921,7 @@
     native_entry = \
         self.DeriveNativeEntry(attr.id, 'Getter', None)
     cpp_callback_name = self._GenerateNativeBinding(attr.id, 1,
-        dart_declaration, False, return_type, parameters,
+        dart_declaration, attr.is_static, return_type, parameters,
         native_suffix, is_custom, auto_scope_setup, native_entry=native_entry)
     if is_custom:
       return
@@ -1071,7 +976,7 @@
     native_entry = \
         self.DeriveNativeEntry(attr.id, 'Setter', None)
     cpp_callback_name = self._GenerateNativeBinding(attr.id, 2,
-        dart_declaration, False, return_type, parameters,
+        dart_declaration, attr.is_static, return_type, parameters,
         native_suffix, is_custom, auto_scope_setup, native_entry=native_entry)
     if is_custom:
       return
@@ -1133,9 +1038,6 @@
       # Calls to this are emitted elsewhere,
       dart_native_name, resolver_string = \
           self.DeriveNativeEntry("item", 'Method', 1)
-      if resolver_string in _cpp_resolver_string_map:
-          resolver_string = \
-              _cpp_resolver_string_map[resolver_string]
 
       # Emit the method which calls the toplevel function, along with
       # the [] operator.
@@ -1714,30 +1616,26 @@
     else:
         formals = ", ".join(parameters)
         actuals = ", ".join(parameters)
-    if native_binding in _cpp_resolver_string_map:
-        native_binding = \
-            _cpp_resolver_string_map[native_binding]
-    if dart_native_name not in self._blink_entries:
-      self._blink_entries.add(dart_native_name)
-      self._native_class_emitter.Emit(
-        '\n'
-        '  static $DART_NAME($FORMALS) native "$NATIVE_BINDING";\n',
-        DART_NAME=dart_native_name,
-        FORMALS=formals,
-        NATIVE_BINDING=native_binding)
 
     if not emit_to_native:
         caller_emitter = self._members_emitter
         full_dart_name = \
             self.DeriveQualifiedBlinkName(self._interface.id,
                                           dart_native_name)
-        caller_emitter.Emit(
-            '\n'
-            '  $METADATA$DART_DECLARATION => $DART_NAME($ACTUALS);\n',
-            METADATA=metadata,
-            DART_DECLARATION=dart_declaration,
-            DART_NAME=full_dart_name,
-            ACTUALS=actuals)
+        if IsPureInterface(self._interface.id):
+            caller_emitter.Emit(
+                '\n'
+                '  $METADATA$DART_DECLARATION;\n',
+                METADATA=metadata,
+                DART_DECLARATION=dart_declaration)
+        else:
+            caller_emitter.Emit(
+                '\n'
+                '  $METADATA$DART_DECLARATION => $DART_NAME($ACTUALS);\n',
+                METADATA=metadata,
+                DART_DECLARATION=dart_declaration,
+                DART_NAME=full_dart_name,
+                ACTUALS=actuals)
     cpp_callback_name = '%s%s' % (idl_name, native_suffix)
 
     self._cpp_resolver_emitter.Emit(
diff --git a/tools/dom/src/blink_native_DOMImplementation.dart b/tools/dom/src/blink_native_DOMImplementation.dart
deleted file mode 100644
index bc274e4..0000000
--- a/tools/dom/src/blink_native_DOMImplementation.dart
+++ /dev/null
@@ -1,68 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of _blink;
-
-// _Utils native entry points
-class Blink_Utils {
-  static window() native "Utils_window";
-
-  static forwardingPrint(message) native "Utils_forwardingPrint";
-
-  static spawnDomUri(uri) native "Utils_spawnDomUri";
-
-  static register(document, tag, customType, extendsTagName) native "Utils_register";
-
-  static createElement(document, tagName) native "Utils_createElement";
-
-  static initializeCustomElement(element) native "Utils_initializeCustomElement";
-
-  static changeElementWrapper(element, type) native "Utils_changeElementWrapper";
-}
-
-class Blink_DOMWindowCrossFrame {
-  // FIXME: Return to using explicit cross frame entry points after roll to M35
-  static get_history(_DOMWindowCrossFrame) native "Window_history_cross_frame_Getter";
-
-  static get_location(_DOMWindowCrossFrame) native "Window_location_cross_frame_Getter";
-
-  static get_closed(_DOMWindowCrossFrame) native "Window_closed_Getter";
-
-  static get_opener(_DOMWindowCrossFrame) native "Window_opener_Getter";
-
-  static get_parent(_DOMWindowCrossFrame) native "Window_parent_Getter";
-
-  static get_top(_DOMWindowCrossFrame) native "Window_top_Getter";
-
-  static close(_DOMWindowCrossFrame) native "Window_close_Callback";
-
-  static postMessage(_DOMWindowCrossFrame, message, targetOrigin, [messagePorts]) native "Window_postMessage_Callback";
-}
-
-class Blink_HistoryCrossFrame {
-  // _HistoryCrossFrame native entry points
-  static back(_HistoryCrossFrame) native "History_back_Callback";
-
-  static forward(_HistoryCrossFrame) native "History_forward_Callback";
-
-  static go(_HistoryCrossFrame, distance) native "History_go_Callback";
-}
-
-class Blink_LocationCrossFrame {
-  // _LocationCrossFrame native entry points
-  static set_href(_LocationCrossFrame, h) native "Location_href_Setter";
-}
-
-class Blink_DOMStringMap {
-  // _DOMStringMap native entry  points
-  static containsKey(_DOMStringMap, key) native "DOMStringMap_containsKey_Callback";
-
-  static item(_DOMStringMap, key) native "DOMStringMap_item_Callback";
-
-  static setItem(_DOMStringMap, key, value) native "DOMStringMap_setItem_Callback";
-
-  static remove(_DOMStringMap, key) native "DOMStringMap_remove_Callback";
-
-  static get_keys(_DOMStringMap) native "DOMStringMap_getKeys_Callback";
-}
\ No newline at end of file
diff --git a/tools/dom/src/html_native_DOMImplementation.dart b/tools/dom/src/html_native_DOMImplementation.dart
deleted file mode 100644
index fe47388..0000000
--- a/tools/dom/src/html_native_DOMImplementation.dart
+++ /dev/null
@@ -1,1004 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of html;
-
-class _Property {
-  _Property(this.name) :
-      _hasValue = false,
-      writable = false,
-      isMethod = false,
-      isOwn = true,
-      wasThrown = false;
-
-  bool get hasValue => _hasValue;
-  get value => _value;
-  set value(v) {
-    _value = v;
-    _hasValue = true;
-  }
-
-  final String name;
-  Function setter;
-  Function getter;
-  var _value;
-  bool _hasValue;
-  bool writable;
-  bool isMethod;
-  bool isOwn;
-  bool wasThrown;
-}
-
-class _ConsoleVariables {
-  Map<String, Object> _data = new Map<String, Object>();
-
-  /**
-   * Forward member accesses to the backing JavaScript object.
-   */
-  noSuchMethod(Invocation invocation) {
-    String member = MirrorSystem.getName(invocation.memberName);
-    if (invocation.isGetter) {
-      return _data[member];
-    } else if (invocation.isSetter) {
-      assert(member.endsWith('='));
-      member = member.substring(0, member.length - 1);
-      _data[member] = invocation.positionalArguments[0];
-    } else {
-      return Function.apply(_data[member], invocation.positionalArguments,
-          invocation.namedArguments);
-    }
-  }
-
-  void clear() => _data.clear();
-
-  /**
-   * List all variables currently defined.
-   */
-  List variables() => _data.keys.toList();
-
-  void setVariable(String name, value) {
-    _data[name] = value;
-  }
-}
-
-/**
- * Base class for invocation trampolines used to closurize methods, getters
- * and setters.
- */
-abstract class _Trampoline implements Function {
-  final ObjectMirror _receiver;
-  final MethodMirror _methodMirror;
-  final Symbol _selector;
-
-  _Trampoline(this._receiver, this._methodMirror, this._selector);
-}
-
-class _MethodTrampoline extends _Trampoline {
-  _MethodTrampoline(ObjectMirror receiver, MethodMirror methodMirror,
-      Symbol selector) :
-      super(receiver, methodMirror, selector);
-
-  noSuchMethod(Invocation msg) {
-    if (msg.memberName != #call) return super.noSuchMethod(msg);
-    return _receiver.invoke(_selector,
-                            msg.positionalArguments,
-                            msg.namedArguments).reflectee;
-  }
-}
-
-/**
- * Invocation trampoline class used to closurize getters.
- */
-class _GetterTrampoline extends _Trampoline {
-  _GetterTrampoline(ObjectMirror receiver, MethodMirror methodMirror,
-      Symbol selector) :
-      super(receiver, methodMirror, selector);
-
-  call() => _receiver.getField(_selector).reflectee;
-}
-
-/**
- * Invocation trampoline class used to closurize setters.
- */
-class _SetterTrampoline extends _Trampoline {
-  _SetterTrampoline(ObjectMirror receiver, MethodMirror methodMirror,
-      Symbol selector) :
-      super(receiver, methodMirror, selector);
-
-  call(value) {
-    _receiver.setField(_selector, value);
-  }
-}
-
-class _Utils {
-  static double dateTimeToDouble(DateTime dateTime) =>
-      dateTime.millisecondsSinceEpoch.toDouble();
-  static DateTime doubleToDateTime(double dateTime) {
-    try {
-      return new DateTime.fromMillisecondsSinceEpoch(dateTime.toInt());
-    } catch(_) {
-      // TODO(antonnm): treat exceptions properly in bindings and
-      // find out how to treat NaNs.
-      return null;
-    }
-  }
-
-  static List convertToList(List list) {
-    // FIXME: [possible optimization]: do not copy the array if Dart_IsArray is fine w/ it.
-    final length = list.length;
-    List result = new List(length);
-    result.setRange(0, length, list);
-    return result;
-  }
-
-  static List convertMapToList(Map map) {
-    List result = [];
-    map.forEach((k, v) => result.addAll([k, v]));
-    return result;
-  }
-
-  static int convertCanvasElementGetContextMap(Map map) {
-    int result = 0;
-    if (map['alpha'] == true) result |= 0x01;
-    if (map['depth'] == true) result |= 0x02;
-    if (map['stencil'] == true) result |= 0x4;
-    if (map['antialias'] == true) result |= 0x08;
-    if (map['premultipliedAlpha'] == true) result |= 0x10;
-    if (map['preserveDrawingBuffer'] == true) result |= 0x20;
-
-    return result;
-  }
-
-  static void populateMap(Map result, List list) {
-    for (int i = 0; i < list.length; i += 2) {
-      result[list[i]] = list[i + 1];
-    }
-  }
-
-  static bool isMap(obj) => obj is Map;
-
-  static List toListIfIterable(obj) => obj is Iterable ? obj.toList() : null;
-
-  static Map createMap() => {};
-
-  static parseJson(String jsonSource) => const JsonDecoder().convert(jsonSource);
-
-  static makeUnimplementedError(String fileName, int lineNo) {
-    return new UnsupportedError('[info: $fileName:$lineNo]');
-  }
-
-  static bool isTypeSubclassOf(Type type, Type other) {
-    if (type == other) {
-      return true;
-    }
-    var superclass = reflectClass(type).superclass;
-    if (superclass != null) {
-      return isTypeSubclassOf(superclass.reflectedType, other);
-    }
-    return false;
-  }
-
-  static Element getAndValidateNativeType(Type type, String tagName) {
-    var element = new Element.tag(tagName);
-    if (!isTypeSubclassOf(type, element.runtimeType)) {
-      return null;
-    }
-    return element;
-  }
-
-  static window() => _blink.Blink_Utils.window();
-  static forwardingPrint(String message) => _blink.Blink_Utils.forwardingPrint(message);
-  // TODO(vsm): Make this API compatible with spawnUri.  It should also
-  // return a Future<Isolate>.
-  static spawnDomUri(String uri) => _blink.Blink_Utils.spawnDomUri(uri);
-
-  // The following methods were added for debugger integration to make working
-  // with the Dart C mirrors API simpler.
-  // TODO(jacobr): consider moving them to a separate library.
-  // If Dart supported dynamic code injection, we would only inject this code
-  // when the debugger is invoked.
-
-  /**
-   * Strips the private secret prefix from member names of the form
-   * someName@hash.
-   */
-  static String stripMemberName(String name) {
-    int endIndex = name.indexOf('@');
-    return endIndex > 0 ? name.substring(0, endIndex) : name;
-  }
-
-  /**
-   * Takes a list containing variable names and corresponding values and
-   * returns a map from normalized names to values. Variable names are assumed
-   * to have list offsets 2*n values at offset 2*n+1. This method is required
-   * because Dart_GetLocalVariables returns a list instead of an object that
-   * can be queried to lookup names and values.
-   */
-  static Map<String, dynamic> createLocalVariablesMap(List localVariables) {
-    var map = {};
-    for (int i = 0; i < localVariables.length; i+=2) {
-      map[stripMemberName(localVariables[i])] = localVariables[i+1];
-    }
-    return map;
-  }
-
-  static _ConsoleVariables _consoleTempVariables = new _ConsoleVariables();
-
-  /**
-   * Takes an [expression] and a list of [local] variable and returns an
-   * expression for a closure with a body matching the original expression
-   * where locals are passed in as arguments. Returns a list containing the
-   * String expression for the closure and the list of arguments that should
-   * be passed to it. The expression should then be evaluated using
-   * Dart_EvaluateExpr which will generate a closure that should be invoked
-   * with the list of arguments passed to this method.
-   *
-   * For example:
-   * <code>
-   * _consoleTempVariables = {'a' : someValue, 'b': someOtherValue}
-   * wrapExpressionAsClosure("foo + bar + a", ["bar", 40, "foo", 2], true)
-   * </code>
-   * will return:
-   * <code>
-   * ["""(final $consoleVariables, final bar, final foo, final a, final b) =>
-   * (foo + bar + a
-   * )""",
-   * [_consoleTempVariables, 40, 2, someValue, someOtherValue]]
-   * </code>
-   */
-  static List wrapExpressionAsClosure(String expression, List locals,
-      bool includeCommandLineAPI) {
-    var args = {};
-    var sb = new StringBuffer("(");
-    addArg(arg, value) {
-      arg = stripMemberName(arg);
-      if (args.containsKey(arg)) return;
-      // We ignore arguments with the name 'this' rather than throwing an
-      // exception because Dart_GetLocalVariables includes 'this' and it
-      // is more convenient to filter it out here than from C++ code.
-      // 'this' needs to be handled by calling Dart_EvaluateExpr with
-      // 'this' as the target rather than by passing it as an argument.
-      if (arg == 'this') return;
-      if (args.isNotEmpty) {
-        sb.write(", ");
-      }
-      sb.write("final $arg");
-      args[arg] = value;
-    }
-
-    if (includeCommandLineAPI) {
-      addArg("\$consoleVariables", _consoleTempVariables);
-
-      // FIXME: use a real Dart tokenizer. The following regular expressions
-      // only allow setting variables at the immediate start of the expression
-      // to limit the number of edge cases we have to handle.
-
-      // Match expressions that start with "var x"
-      final _VARIABLE_DECLARATION = new RegExp("^(\\s*)var\\s+(\\w+)");
-      // Match expressions that start with "someExistingConsoleVar ="
-      final _SET_VARIABLE = new RegExp("^(\\s*)(\\w+)(\\s*=)");
-      // Match trailing semicolons.
-      final _ENDING_SEMICOLONS = new RegExp("(;\\s*)*\$");
-      expression = expression.replaceAllMapped(_VARIABLE_DECLARATION,
-          (match) {
-            var variableName = match[2];
-            // Set the console variable if it isn't already set.
-            if (!_consoleTempVariables._data.containsKey(variableName)) {
-              _consoleTempVariables._data[variableName] = null;
-            }
-            return "${match[1]}\$consoleVariables.${variableName}";
-          });
-
-      expression = expression.replaceAllMapped(_SET_VARIABLE,
-          (match) {
-            var variableName = match[2];
-            // Only rewrite if the name matches an existing console variable.
-            if (_consoleTempVariables._data.containsKey(variableName)) {
-              return "${match[1]}\$consoleVariables.${variableName}${match[3]}";
-            } else {
-              return match[0];
-            }
-          });
-
-      // We only allow dart expressions not Dart statements. Silently remove
-      // trailing semicolons the user might have added by accident to reduce the
-      // number of spurious compile errors.
-      expression = expression.replaceFirst(_ENDING_SEMICOLONS, "");
-    }
-
-    if (locals != null) {
-      for (int i = 0; i < locals.length; i+= 2) {
-        addArg(locals[i], locals[i+1]);
-      }
-    }
-    // Inject all the already defined console variables.
-    _consoleTempVariables._data.forEach(addArg);
-
-    // TODO(jacobr): remove the parentheses around the expresson once
-    // dartbug.com/13723 is fixed. Currently we wrap expression in parentheses
-    // to ensure only valid Dart expressions are allowed. Otherwise the DartVM
-    // quietly ignores trailing Dart statements resulting in user confusion
-    // when part of an invalid expression they entered is ignored.
-    sb..write(') => (\n$expression\n)');
-    return [sb.toString(), args.values.toList(growable: false)];
-  }
-
-  static String _getShortSymbolName(Symbol symbol,
-                                    DeclarationMirror declaration) {
-    var name = MirrorSystem.getName(symbol);
-    if (declaration is MethodMirror) {
-      if (declaration.isSetter && name[name.length-1] == "=") {
-        return name.substring(0, name.length-1);
-      }
-      if (declaration.isConstructor) {
-        return name.substring(name.indexOf('.') + 1);
-      }
-    }
-    return name;
-  }
-
-  /**
-   * Returns a list of completions to use if the receiver is o.
-   */
-  static List<String> getCompletions(o) {
-    MirrorSystem system = currentMirrorSystem();
-    var completions = new Set<String>();
-    addAll(Map<Symbol, dynamic> map, bool isStatic) {
-      map.forEach((symbol, mirror) {
-        if (mirror.isStatic == isStatic && !mirror.isPrivate) {
-          var name = MirrorSystem.getName(symbol);
-          if (mirror is MethodMirror && mirror.isSetter)
-            name = name.substring(0, name.length - 1);
-          completions.add(name);
-        }
-      });
-    }
-
-    addForClass(ClassMirror mirror, bool isStatic) {
-      if (mirror == null)
-        return;
-      addAll(mirror.declarations, isStatic);
-      if (mirror.superclass != null)
-        addForClass(mirror.superclass, isStatic);
-      for (var interface in mirror.superinterfaces) {
-        addForClass(interface, isStatic);
-      }
-    }
-
-    if (o is Type) {
-      addForClass(reflectClass(o), true);
-    } else {
-      addForClass(reflect(o).type, false);
-    }
-    return completions.toList(growable: false);
-  }
-
-  /**
-   * Adds all candidate String completitions from [declarations] to [output]
-   * filtering based on [staticContext] and [includePrivate].
-   */
-  static void _getCompletionsHelper(ClassMirror classMirror,
-      bool staticContext, LibraryMirror libraryMirror, Set<String> output) {
-    bool includePrivate = libraryMirror == classMirror.owner;
-    classMirror.declarations.forEach((symbol, declaration) {
-      if (!includePrivate && declaration.isPrivate) return;
-      if (declaration is VariableMirror) {
-        if (staticContext != declaration.isStatic) return;
-      } else if (declaration is MethodMirror) {
-        if (declaration.isOperator) return;
-        if (declaration.isConstructor) {
-          if (!staticContext) return;
-          var name = MirrorSystem.getName(declaration.constructorName);
-          if (name.isNotEmpty) output.add(name);
-          return;
-        }
-        if (staticContext != declaration.isStatic) return;
-      } else if (declaration is TypeMirror) {
-        return;
-      }
-      output.add(_getShortSymbolName(symbol, declaration));
-    });
-
-    if (!staticContext) {
-      for (var interface in classMirror.superinterfaces) {
-        _getCompletionsHelper(interface, staticContext,
-            libraryMirror, output);
-      }
-      if (classMirror.superclass != null) {
-        _getCompletionsHelper(classMirror.superclass, staticContext,
-            libraryMirror, output);
-      }
-    }
-  }
-
-  static void _getLibraryCompletionsHelper(
-      LibraryMirror library, bool includePrivate, Set<String> output) {
-    library.declarations.forEach((symbol, declaration) {
-      if (!includePrivate && declaration.isPrivate) return;
-      output.add(_getShortSymbolName(symbol, declaration));
-    });
-  }
-
-  static LibraryMirror getLibraryMirror(String url) =>
-      currentMirrorSystem().libraries[Uri.parse(url)];
-
-  /**
-   * Get code completions for [o] only showing privates from [libraryUrl].
-   */
-  static List<String> getObjectCompletions(o, String libraryUrl) {
-    var classMirror;
-    bool staticContext;
-    if (o is Type) {
-      classMirror = reflectClass(o);
-      staticContext = true;
-    } else {
-      classMirror = reflect(o).type;
-      staticContext = false;
-    }
-    var names = new Set<String>();
-    getClassCompletions(classMirror, names, staticContext, libraryUrl);
-    return names.toList()..sort();
-  }
-
-  static void getClassCompletions(ClassMirror classMirror, Set<String> names,
-      bool staticContext, String libraryUrl) {
-    LibraryMirror libraryMirror = getLibraryMirror(libraryUrl);
-    _getCompletionsHelper(classMirror, staticContext, libraryMirror, names);
-  }
-
-  static List<String> getLibraryCompletions(String url) {
-    var names = new Set<String>();
-    _getLibraryCompletionsHelper(getLibraryMirror(url), true, names);
-    return names.toList();
-  }
-
-  /**
-   * Get valid code completitions from within a library and all libraries
-   * imported by that library.
-   */
-  static List<String> getLibraryCompletionsIncludingImports(String url) {
-    var names = new Set<String>();
-    var libraryMirror = getLibraryMirror(url);
-    _getLibraryCompletionsHelper(libraryMirror, true, names);
-    for (var dependency in libraryMirror.libraryDependencies) {
-      if (dependency.isImport) {
-        if (dependency.prefix == null) {
-          _getLibraryCompletionsHelper(dependency.targetLibrary, false, names);
-        } else {
-          names.add(MirrorSystem.getName(dependency.prefix));
-        }
-      }
-    }
-    return names.toList();
-  }
-
-  static final SIDE_EFFECT_FREE_LIBRARIES = new Set<String>()
-      ..add('dart:html')
-      ..add('dart:indexed_db')
-      ..add('dart:svg')
-      ..add('dart:typed_data')
-      ..add('dart:web_audio')
-      ..add('dart:web_gl')
-      ..add('dart:web_sql');
-
-  static LibraryMirror _getLibrary(MethodMirror methodMirror) {
-    var owner = methodMirror.owner;
-    if (owner is ClassMirror) {
-      return owner;
-    } else if (owner is LibraryMirror) {
-      return owner;
-    }
-    return null;
-  }
-
-  /**
-   * For parity with the JavaScript debugger, we treat some getters as if
-   * they are fields so that users can see their values immediately.
-   * This matches JavaScript's behavior for getters on DOM objects.
-   * In the future we should consider adding an annotation to tag getters
-   * in user libraries as side effect free.
-   */
-  static bool _isSideEffectFreeGetter(MethodMirror methodMirror,
-      LibraryMirror libraryMirror) {
-    // This matches JavaScript behavior. We should consider displaying
-    // getters for all dart platform libraries rather than just the DOM
-    // libraries.
-    return libraryMirror.uri.scheme == 'dart' &&
-        SIDE_EFFECT_FREE_LIBRARIES.contains(libraryMirror.uri.toString());
-  }
-  
-  /**
-   * Whether we should treat a property as a field for the purposes of the
-   * debugger.
-   */
-  static bool treatPropertyAsField(MethodMirror methodMirror,
-      LibraryMirror libraryMirror) {
-    return (methodMirror.isGetter || methodMirror.isSetter) &&
-          (methodMirror.isSynthetic ||
-              _isSideEffectFreeGetter(methodMirror,libraryMirror));
-  }
-
-  // TODO(jacobr): generate more concise function descriptions instead of
-  // dumping the entire function source.
-  static String describeFunction(function) {
-    if (function is _Trampoline) return function._methodMirror.source;
-    try {
-      var mirror = reflect(function);
-      return mirror.function.source;
-    } catch (e) {
-      return function.toString();
-    }
-  }
-
-  static List getInvocationTrampolineDetails(_Trampoline method) {
-    var loc = method._methodMirror.location;
-    return [loc.line, loc.column, loc.sourceUri.toString(),
-        MirrorSystem.getName(method._selector)];
-  }
-
-  static List getLibraryProperties(String libraryUrl, bool ownProperties,
-      bool accessorPropertiesOnly) {
-    var properties = new Map<String, _Property>();
-    var libraryMirror = getLibraryMirror(libraryUrl);
-    _addInstanceMirrors(libraryMirror, libraryMirror,
-        libraryMirror.declarations,
-        ownProperties, accessorPropertiesOnly, false, false,
-        properties);
-    if (!accessorPropertiesOnly) {
-      // We need to add class properties for all classes in the library.
-      libraryMirror.declarations.forEach((symbol, declarationMirror) {
-        if (declarationMirror is ClassMirror) {
-          var name = MirrorSystem.getName(symbol);
-          if (declarationMirror.hasReflectedType
-              && !properties.containsKey(name)) {
-            properties[name] = new _Property(name)
-                ..value = declarationMirror.reflectedType;
-          }
-        }
-      });
-    }
-    return packageProperties(properties);
-  }
-
-  static List getObjectProperties(o, bool ownProperties,
-      bool accessorPropertiesOnly) {
-    var properties = new Map<String, _Property>();
-    var names = new Set<String>();
-    var objectMirror = reflect(o);
-    var classMirror = objectMirror.type;
-    _addInstanceMirrors(objectMirror, classMirror.owner,
-        classMirror.instanceMembers,
-        ownProperties, accessorPropertiesOnly, false, true,
-        properties);
-    return packageProperties(properties);
-  }
-
-  static List getObjectClassProperties(o, bool ownProperties,
-      bool accessorPropertiesOnly) {
-    var properties = new Map<String, _Property>();
-    var objectMirror = reflect(o);
-    var classMirror = objectMirror.type;
-    _addInstanceMirrors(objectMirror, classMirror.owner,
-        classMirror.instanceMembers,
-        ownProperties, accessorPropertiesOnly, true, false,
-        properties);
-    _addStatics(classMirror, properties, accessorPropertiesOnly);
-    return packageProperties(properties);
-  }
-
-  static List getClassProperties(Type t, bool ownProperties,
-      bool accessorPropertiesOnly) {
-    var properties = new Map<String, _Property>();
-    var classMirror = reflectClass(t);
-    _addStatics(classMirror, properties, accessorPropertiesOnly);
-    return packageProperties(properties);
-  }
-
-  static void _addStatics(ClassMirror classMirror,
-                          Map<String, _Property> properties,
-                          bool accessorPropertiesOnly) {
-    var libraryMirror = classMirror.owner;
-    classMirror.declarations.forEach((symbol, declaration) {
-      var name = _getShortSymbolName(symbol, declaration);
-      if (name.isEmpty) return;
-      if (declaration is VariableMirror) {
-        if (accessorPropertiesOnly) return;
-        if (!declaration.isStatic) return;
-        properties.putIfAbsent(name, () => new _Property(name))
-            ..value = classMirror.getField(symbol).reflectee
-            ..writable = !declaration.isFinal && !declaration.isConst;
-      } else if (declaration is MethodMirror) {
-        MethodMirror methodMirror = declaration;
-        // FIXMEDART: should we display constructors?
-        if (methodMirror.isConstructor) return;
-        if (!methodMirror.isStatic) return;
-        if (accessorPropertiesOnly) {
-          if (methodMirror.isRegularMethod ||
-              treatPropertyAsField(methodMirror, libraryMirror)) {
-            return;
-          }
-        } else if (!methodMirror.isRegularMethod &&
-            !treatPropertyAsField(methodMirror, libraryMirror)) {
-          return;
-        }
-        var property = properties.putIfAbsent(name, () => new _Property(name));
-        _fillMethodMirrorProperty(libraryMirror, classMirror, methodMirror,
-            symbol, accessorPropertiesOnly, property);
-      }
-    });
-  }
-
-  static void _fillMethodMirrorProperty(LibraryMirror libraryMirror,
-        methodOwner, MethodMirror methodMirror, Symbol symbol,
-        bool accessorPropertiesOnly, _Property property) {
-    if (methodMirror.isRegularMethod) {
-      property
-          ..value = new _MethodTrampoline(methodOwner, methodMirror, symbol)
-          ..isMethod = true;
-    } else if (methodMirror.isGetter) {
-      if (treatPropertyAsField(methodMirror, libraryMirror)) {
-        try {
-          property.value = methodOwner.getField(symbol).reflectee;
-        } catch (e) {
-          property
-              ..wasThrown = true
-              ..value = e;
-        }
-      } else if (accessorPropertiesOnly) {
-        property.getter = new _GetterTrampoline(methodOwner,
-            methodMirror, symbol);
-      }
-    } else if (methodMirror.isSetter) {
-      if (accessorPropertiesOnly &&
-          !treatPropertyAsField(methodMirror, libraryMirror)) {
-        property.setter = new _SetterTrampoline(methodOwner,
-            methodMirror, MirrorSystem.getSymbol(property.name, libraryMirror));
-      }
-      property.writable = true;
-    }
-  }
-
-  /**
-   * Helper method that handles collecting up properties from classes
-   * or libraries using the filters [ownProperties], [accessorPropertiesOnly],
-   * [hideFields], and [hideMethods] to determine which properties are
-   * collected. [accessorPropertiesOnly] specifies whether all properties
-   * should be returned or just accessors. [hideFields] specifies whether
-   * fields should be hidden. hideMethods specifies whether methods should be
-   * shown or hidden. [ownProperties] is not currently used but is part of the
-   * Blink devtools API for enumerating properties.
-   */
-  static void _addInstanceMirrors(
-      ObjectMirror objectMirror,
-      LibraryMirror libraryMirror,
-      Map<Symbol, Mirror> declarations,
-      bool ownProperties, bool accessorPropertiesOnly,
-      bool hideFields, bool hideMethods,
-      Map<String, _Property> properties) {
-    declarations.forEach((symbol, declaration) {
-      if (declaration is TypedefMirror || declaration is ClassMirror) return;
-      var name = _getShortSymbolName(symbol, declaration);
-      if (name.isEmpty) return;
-      bool isField = declaration is VariableMirror ||
-          (declaration is MethodMirror &&
-              treatPropertyAsField(declaration, libraryMirror));
-      if ((isField && hideFields) || (hideMethods && !isField)) return;
-      if (accessorPropertiesOnly) {
-        if (declaration is VariableMirror || declaration.isRegularMethod ||
-            isField) {
-          return;
-        }
-      } else if (declaration is MethodMirror &&
-          (declaration.isGetter || declaration.isSetter) &&
-          !treatPropertyAsField(declaration, libraryMirror)) {
-        return;
-      }
-      var property = properties.putIfAbsent(name, () => new _Property(name));
-      if (declaration is VariableMirror) {
-        property
-            ..value = objectMirror.getField(symbol).reflectee
-            ..writable = !declaration.isFinal && !declaration.isConst;
-        return;
-      }
-      _fillMethodMirrorProperty(libraryMirror, objectMirror, declaration,
-          symbol, accessorPropertiesOnly, property);
-    });
-  }
-
-  /**
-   * Flatten down the properties data structure into a List that is easy to
-   * access from native code.
-   */
-  static List packageProperties(Map<String, _Property> properties) {
-    var ret = [];
-    for (var property in properties.values) {
-      ret.addAll([property.name,
-                  property.setter,
-                  property.getter,
-                  property.value,
-                  property.hasValue,
-                  property.writable,
-                  property.isMethod,
-                  property.isOwn,
-                  property.wasThrown]);
-    }
-    return ret;
-  }
-  
-  /**
-   * Get a property, returning null if the property does not exist.
-   * For private property names, we attempt to resolve the property in the
-   * context of each library that the property name could be associated with.
-   */
-  static getObjectPropertySafe(o, String propertyName) {
-    var objectMirror = reflect(o);
-    var classMirror = objectMirror.type;
-    if (propertyName.startsWith("_")) {
-      var attemptedLibraries = new Set<LibraryMirror>(); 
-      while (classMirror != null) {
-        LibraryMirror library = classMirror.owner;
-        if (!attemptedLibraries.contains(library)) {
-          try {
-            return objectMirror.getField(
-                MirrorSystem.getSymbol(propertyName, library)).reflectee;
-          } catch (e) { }
-          attemptedLibraries.add(library);
-        }
-        classMirror = classMirror.superclass;
-      }
-      return null;     
-    }
-    try {
-      return objectMirror.getField(
-          MirrorSystem.getSymbol(propertyName)).reflectee;
-    } catch (e) {
-      return null;
-    }
-  }
-
-  /**
-   * Helper to wrap the inspect method on InjectedScriptHost to provide the
-   * inspect method required for the 
-   */
-  static List consoleApi(host) {
-    return [
-        "inspect",
-        (o) {
-          host.inspect(o, null);
-          return o;
-        },
-        "dir",
-        window().console.dir,
-        "dirxml",
-        window().console.dirxml
-        // FIXME: add copy method.
-        ];
-  }
-
-  static List getMapKeyList(Map map) => map.keys.toList();
-
-  static bool isNoSuchMethodError(obj) => obj is NoSuchMethodError;
-
-  static void register(Document document, String tag, Type type,
-      String extendsTagName) {
-    var nativeClass = _validateCustomType(type);
-
-    if (extendsTagName == null) {
-      if (nativeClass.reflectedType != HtmlElement) {
-        throw new UnsupportedError('Class must provide extendsTag if base '
-            'native class is not HTMLElement');
-      }
-    }
-
-    _register(document, tag, type, extendsTagName);
-  }
-
-  static void _register(Document document, String tag, Type customType,
-    String extendsTagName) => _blink.Blink_Utils.register(document, tag, customType, extendsTagName);
-
-  static Element createElement(Document document, String tagName) =>
-    _blink.Blink_Utils.createElement(document, tagName);
-
-  static void initializeCustomElement(HtmlElement element) =>
-    _blink.Blink_Utils.initializeCustomElement(element);
-
-  static Element changeElementWrapper(HtmlElement element, Type type) =>
-    _blink.Blink_Utils.changeElementWrapper(element, type);
-}
-
-class _DOMWindowCrossFrame extends NativeFieldWrapperClass2 implements
-    WindowBase {
-  _DOMWindowCrossFrame.internal();
-
-  // Fields.
-  HistoryBase get history => _blink.Blink_DOMWindowCrossFrame.get_history(this);
-  LocationBase get location => _blink.Blink_DOMWindowCrossFrame.get_location(this);
-  bool get closed => _blink.Blink_DOMWindowCrossFrame.get_closed(this);
-  WindowBase get opener => _blink.Blink_DOMWindowCrossFrame.get_opener(this);
-  WindowBase get parent => _blink.Blink_DOMWindowCrossFrame.get_parent(this);
-  WindowBase get top => _blink.Blink_DOMWindowCrossFrame.get_top(this);
-
-  // Methods.
-  void close() => _blink.Blink_DOMWindowCrossFrame.close(this);
-  void postMessage(/*SerializedScriptValue*/ message, String targetOrigin, [List messagePorts]) =>
-    _blink.Blink_DOMWindowCrossFrame.postMessage(this, message, targetOrigin, messagePorts);
-
-  // Implementation support.
-  String get typeName => "Window";
-
-  // TODO(efortuna): Remove this method. dartbug.com/16814
-  Events get on => throw new UnsupportedError(
-    'You can only attach EventListeners to your own window.');
-  // TODO(efortuna): Remove this method. dartbug.com/16814
-  void _addEventListener([String type, EventListener listener, bool useCapture])
-      => throw new UnsupportedError(
-    'You can only attach EventListeners to your own window.');
-  // TODO(efortuna): Remove this method. dartbug.com/16814
-  void addEventListener(String type, EventListener listener, [bool useCapture])
-      => throw new UnsupportedError(
-    'You can only attach EventListeners to your own window.');
-  // TODO(efortuna): Remove this method. dartbug.com/16814
-  bool dispatchEvent(Event event) => throw new UnsupportedError(
-    'You can only attach EventListeners to your own window.');
-  // TODO(efortuna): Remove this method. dartbug.com/16814
-  void _removeEventListener([String type, EventListener listener,
-      bool useCapture]) => throw new UnsupportedError(
-    'You can only attach EventListeners to your own window.');
-  // TODO(efortuna): Remove this method. dartbug.com/16814
-  void removeEventListener(String type, EventListener listener,
-      [bool useCapture]) => throw new UnsupportedError(
-    'You can only attach EventListeners to your own window.');
-}
-
-class _HistoryCrossFrame extends NativeFieldWrapperClass2 implements HistoryBase {
-  _HistoryCrossFrame.internal();
-
-  // Methods.
-  void back() => _blink.Blink_HistoryCrossFrame.back(this);
-  void forward() => _blink.Blink_HistoryCrossFrame.forward(this);
-  void go(int distance) => _blink.Blink_HistoryCrossFrame.go(this, distance);
-
-  // Implementation support.
-  String get typeName => "History";
-}
-
-class _LocationCrossFrame extends NativeFieldWrapperClass2 implements LocationBase {
-  _LocationCrossFrame.internal();
-
-  // Fields.
-  void set href(String h) => _blink.Blink_LocationCrossFrame.set_href(this, h);
-
-  // Implementation support.
-  String get typeName => "Location";
-}
-
-class _DOMStringMap extends NativeFieldWrapperClass2 implements Map<String, String> {
-  _DOMStringMap.internal();
-
-  bool containsValue(String value) => Maps.containsValue(this, value);
-  bool containsKey(String key) => _blink.Blink_DOMStringMap.containsKey(this, key);
-  String operator [](String key) => _blink.Blink_DOMStringMap.item(this, key);
-  void operator []=(String key, String value) => _blink.Blink_DOMStringMap.setItem(this, key, value);
-  String putIfAbsent(String key, String ifAbsent()) => Maps.putIfAbsent(this, key, ifAbsent);
-  String remove(String key) => _blink.Blink_DOMStringMap.remove(this, key);
-  void clear() => Maps.clear(this);
-  void forEach(void f(String key, String value)) => Maps.forEach(this, f);
-  Iterable<String> get keys => _blink.Blink_DOMStringMap.get_keys(this);
-  Iterable<String> get values => Maps.getValues(this);
-  int get length => Maps.length(this);
-  bool get isEmpty => Maps.isEmpty(this);
-  bool get isNotEmpty => Maps.isNotEmpty(this);
-  void addAll(Map<String, String> other) {
-    other.forEach((key, value) => this[key] = value);
-  }
-}
-
-final _printClosure = (s) => window.console.log(s);
-final _pureIsolatePrintClosure = (s) {
-  throw new UnimplementedError("Printing from a background isolate "
-                               "is not supported in the browser");
-};
-
-final _forwardingPrintClosure = _Utils.forwardingPrint;
-
-final _uriBaseClosure = () => Uri.parse(window.location.href);
-
-final _pureIsolateUriBaseClosure = () {
-  throw new UnimplementedError("Uri.base on a background isolate "
-                               "is not supported in the browser");
-};
-
-class _Timer implements Timer {
-  static const int _STATE_TIMEOUT = 0;
-  static const int _STATE_INTERVAL = 1;
-  int _state;
-
-  _Timer(int milliSeconds, void callback(Timer timer), bool repeating) {
-    if (repeating) {
-      _state = (window._setInterval(() {
-        callback(this);
-      }, milliSeconds) << 1) | _STATE_INTERVAL;
-    } else {
-      _state = (window._setTimeout(() {
-        _state = null;
-        callback(this);
-      }, milliSeconds) << 1) | _STATE_TIMEOUT;
-    }
-  }
-
-  void cancel() {
-    if (_state == null) return;
-    int id = _state >> 1;
-    if ((_state & 1) == _STATE_TIMEOUT) {
-      window._clearTimeout(id);
-    } else {
-      window._clearInterval(id);
-    }
-    _state = null;
-  }
-
-  bool get isActive => _state != null;
-}
-
-get _timerFactoryClosure =>
-    (int milliSeconds, void callback(Timer timer), bool repeating) {
-  return new _Timer(milliSeconds, callback, repeating);
-};
-
-get _pureIsolateTimerFactoryClosure =>
-    ((int milliSeconds, void callback(Timer time), bool repeating) =>
-  throw new UnimplementedError("Timers on background isolates "
-                               "are not supported in the browser"));
-
-class _ScheduleImmediateHelper {
-  MutationObserver _observer;
-  final DivElement _div = new DivElement();
-  Function _callback;
-
-  _ScheduleImmediateHelper() {
-    // Run in the root-zone as the DOM callback would otherwise execute in the
-    // current zone.
-    Zone.ROOT.run(() {
-      // Mutation events get fired as soon as the current event stack is unwound
-      // so we just make a dummy event and listen for that.
-      _observer = new MutationObserver(_handleMutation);
-      _observer.observe(_div, attributes: true);
-    });
-  }
-
-  void _schedule(callback) {
-    if (_callback != null) {
-      throw new StateError(
-          'Only one immediate callback can be scheduled at once');
-    }
-    _callback = callback;
-    // Toggle it to trigger the mutation event.
-    _div.hidden = !_div.hidden;
-  }
-
-  _handleMutation(List<MutationRecord> mutations, MutationObserver observer) {
-    var tmp = _callback;
-    _callback = null;
-    tmp();
-  }
-}
-
-final _ScheduleImmediateHelper _scheduleImmediateHelper =
-    new _ScheduleImmediateHelper();
-
-get _scheduleImmediateClosure => (void callback()) {
-  _scheduleImmediateHelper._schedule(callback);
-};
-
-get _pureIsolateScheduleImmediateClosure => ((void callback()) =>
-  throw new UnimplementedError("scheduleMicrotask in background isolates "
-                               "are not supported in the browser"));
-
-void _initializeCustomElement(Element e) {
-  _Utils.initializeCustomElement(e);
-}
-
-// Class for unsupported native browser 'DOM' objects.
-class _UnsupportedBrowserObject extends NativeFieldWrapperClass2 {
-}
diff --git a/tools/dom/src/native_DOMImplementation.dart b/tools/dom/src/native_DOMImplementation.dart
index d8d603b..fe47388 100644
--- a/tools/dom/src/native_DOMImplementation.dart
+++ b/tools/dom/src/native_DOMImplementation.dart
@@ -4,6 +4,32 @@
 
 part of html;
 
+class _Property {
+  _Property(this.name) :
+      _hasValue = false,
+      writable = false,
+      isMethod = false,
+      isOwn = true,
+      wasThrown = false;
+
+  bool get hasValue => _hasValue;
+  get value => _value;
+  set value(v) {
+    _value = v;
+    _hasValue = true;
+  }
+
+  final String name;
+  Function setter;
+  Function getter;
+  var _value;
+  bool _hasValue;
+  bool writable;
+  bool isMethod;
+  bool isOwn;
+  bool wasThrown;
+}
+
 class _ConsoleVariables {
   Map<String, Object> _data = new Map<String, Object>();
 
@@ -19,7 +45,8 @@
       member = member.substring(0, member.length - 1);
       _data[member] = invocation.positionalArguments[0];
     } else {
-      return Function.apply(_data[member], invocation.positionalArguments, invocation.namedArguments);
+      return Function.apply(_data[member], invocation.positionalArguments,
+          invocation.namedArguments);
     }
   }
 
@@ -28,7 +55,60 @@
   /**
    * List all variables currently defined.
    */
-  List variables() => _data.keys.toList(growable: false);
+  List variables() => _data.keys.toList();
+
+  void setVariable(String name, value) {
+    _data[name] = value;
+  }
+}
+
+/**
+ * Base class for invocation trampolines used to closurize methods, getters
+ * and setters.
+ */
+abstract class _Trampoline implements Function {
+  final ObjectMirror _receiver;
+  final MethodMirror _methodMirror;
+  final Symbol _selector;
+
+  _Trampoline(this._receiver, this._methodMirror, this._selector);
+}
+
+class _MethodTrampoline extends _Trampoline {
+  _MethodTrampoline(ObjectMirror receiver, MethodMirror methodMirror,
+      Symbol selector) :
+      super(receiver, methodMirror, selector);
+
+  noSuchMethod(Invocation msg) {
+    if (msg.memberName != #call) return super.noSuchMethod(msg);
+    return _receiver.invoke(_selector,
+                            msg.positionalArguments,
+                            msg.namedArguments).reflectee;
+  }
+}
+
+/**
+ * Invocation trampoline class used to closurize getters.
+ */
+class _GetterTrampoline extends _Trampoline {
+  _GetterTrampoline(ObjectMirror receiver, MethodMirror methodMirror,
+      Symbol selector) :
+      super(receiver, methodMirror, selector);
+
+  call() => _receiver.getField(_selector).reflectee;
+}
+
+/**
+ * Invocation trampoline class used to closurize setters.
+ */
+class _SetterTrampoline extends _Trampoline {
+  _SetterTrampoline(ObjectMirror receiver, MethodMirror methodMirror,
+      Symbol selector) :
+      super(receiver, methodMirror, selector);
+
+  call(value) {
+    _receiver.setField(_selector, value);
+  }
 }
 
 class _Utils {
@@ -82,6 +162,8 @@
 
   static Map createMap() => {};
 
+  static parseJson(String jsonSource) => const JsonDecoder().convert(jsonSource);
+
   static makeUnimplementedError(String fileName, int lineNo) {
     return new UnsupportedError('[info: $fileName:$lineNo]');
   }
@@ -105,11 +187,11 @@
     return element;
   }
 
-  static window() native "Utils_window";
-  static forwardingPrint(String message) native "Utils_forwardingPrint";
+  static window() => _blink.Blink_Utils.window();
+  static forwardingPrint(String message) => _blink.Blink_Utils.forwardingPrint(message);
   // TODO(vsm): Make this API compatible with spawnUri.  It should also
   // return a Future<Isolate>.
-  static spawnDomUri(String uri) native "Utils_spawnDomUri";
+  static spawnDomUri(String uri) => _blink.Blink_Utils.spawnDomUri(uri);
 
   // The following methods were added for debugger integration to make working
   // with the Dart C mirrors API simpler.
@@ -144,17 +226,6 @@
   static _ConsoleVariables _consoleTempVariables = new _ConsoleVariables();
 
   /**
-   * Header passed in from the Dartium Developer Tools when an expression is
-   * evaluated in the console as opposed to the watch window or another context
-   * that does not expect REPL support.
-   */
-  static const _CONSOLE_API_SUPPORT_HEADER =
-      'with ((console && console._commandLineAPI) || { __proto__: null }) {\n';
-  static bool expectsConsoleApi(String expression) {
-    return expression.indexOf(_CONSOLE_API_SUPPORT_HEADER) == 0;;
-  }
-
-  /**
    * Takes an [expression] and a list of [local] variable and returns an
    * expression for a closure with a body matching the original expression
    * where locals are passed in as arguments. Returns a list containing the
@@ -166,8 +237,7 @@
    * For example:
    * <code>
    * _consoleTempVariables = {'a' : someValue, 'b': someOtherValue}
-   * wrapExpressionAsClosure("${_CONSOLE_API_SUPPORT_HEADER}foo + bar + a",
-   *                         ["bar", 40, "foo", 2])
+   * wrapExpressionAsClosure("foo + bar + a", ["bar", 40, "foo", 2], true)
    * </code>
    * will return:
    * <code>
@@ -177,9 +247,8 @@
    * [_consoleTempVariables, 40, 2, someValue, someOtherValue]]
    * </code>
    */
-  static List wrapExpressionAsClosure(String expression, List locals) {
-    // FIXME: dartbug.com/10434 find a less fragile way to determine whether
-    // we need to strip off console API support added by InjectedScript.
+  static List wrapExpressionAsClosure(String expression, List locals,
+      bool includeCommandLineAPI) {
     var args = {};
     var sb = new StringBuffer("(");
     addArg(arg, value) {
@@ -198,10 +267,7 @@
       args[arg] = value;
     }
 
-    if (expectsConsoleApi(expression)) {
-      expression = expression.substring(expression.indexOf('\n') + 1);
-      expression = expression.substring(0, expression.lastIndexOf('\n'));
-
+    if (includeCommandLineAPI) {
       addArg("\$consoleVariables", _consoleTempVariables);
 
       // FIXME: use a real Dart tokenizer. The following regular expressions
@@ -258,13 +324,19 @@
     return [sb.toString(), args.values.toList(growable: false)];
   }
 
-  /**
-   * TODO(jacobr): this is a big hack to get around the fact that we are still
-   * passing some JS expression to the evaluate method even when in a Dart
-   * context.
-   */
-  static bool isJsExpression(String expression) =>
-    expression.startsWith("(function getCompletions");
+  static String _getShortSymbolName(Symbol symbol,
+                                    DeclarationMirror declaration) {
+    var name = MirrorSystem.getName(symbol);
+    if (declaration is MethodMirror) {
+      if (declaration.isSetter && name[name.length-1] == "=") {
+        return name.substring(0, name.length-1);
+      }
+      if (declaration.isConstructor) {
+        return name.substring(name.indexOf('.') + 1);
+      }
+    }
+    return name;
+  }
 
   /**
    * Returns a list of completions to use if the receiver is o.
@@ -303,97 +375,409 @@
   }
 
   /**
-   * Convenience helper to get the keys of a [Map] as a [List].
+   * Adds all candidate String completitions from [declarations] to [output]
+   * filtering based on [staticContext] and [includePrivate].
    */
-  static List getMapKeyList(Map map) => map.keys.toList();
-
- /**
-   * Returns the keys of an arbitrary Dart Map encoded as unique Strings.
-   * Keys that are strings are left unchanged except that the prefix ":" is
-   * added to disambiguate keys from other Dart members.
-   * Keys that are not strings have # followed by the index of the key in the map
-   * prepended to disambuguate. This scheme is simplistic but easy to encode and
-   * decode. The use case for this method is displaying all map keys in a human
-   * readable way in debugging tools.
-   */
-  static List<String> getEncodedMapKeyList(dynamic obj) {
-    if (obj is! Map) return null;
-
-    var ret = new List<String>();
-    int i = 0;
-    return obj.keys.map((key) {
-      var encodedKey;
-      if (key is String) {
-        encodedKey = ':$key';
-      } else {
-        // If the key isn't a string, return a guaranteed unique for this map
-        // string representation of the key that is still somewhat human
-        // readable.
-        encodedKey = '#${i}:$key';
+  static void _getCompletionsHelper(ClassMirror classMirror,
+      bool staticContext, LibraryMirror libraryMirror, Set<String> output) {
+    bool includePrivate = libraryMirror == classMirror.owner;
+    classMirror.declarations.forEach((symbol, declaration) {
+      if (!includePrivate && declaration.isPrivate) return;
+      if (declaration is VariableMirror) {
+        if (staticContext != declaration.isStatic) return;
+      } else if (declaration is MethodMirror) {
+        if (declaration.isOperator) return;
+        if (declaration.isConstructor) {
+          if (!staticContext) return;
+          var name = MirrorSystem.getName(declaration.constructorName);
+          if (name.isNotEmpty) output.add(name);
+          return;
+        }
+        if (staticContext != declaration.isStatic) return;
+      } else if (declaration is TypeMirror) {
+        return;
       }
-      i++;
-      return encodedKey;
-    }).toList(growable: false);
+      output.add(_getShortSymbolName(symbol, declaration));
+    });
+
+    if (!staticContext) {
+      for (var interface in classMirror.superinterfaces) {
+        _getCompletionsHelper(interface, staticContext,
+            libraryMirror, output);
+      }
+      if (classMirror.superclass != null) {
+        _getCompletionsHelper(classMirror.superclass, staticContext,
+            libraryMirror, output);
+      }
+    }
   }
 
-  static final RegExp _NON_STRING_KEY_REGEXP = new RegExp("^#(\\d+):(.+)\$");
+  static void _getLibraryCompletionsHelper(
+      LibraryMirror library, bool includePrivate, Set<String> output) {
+    library.declarations.forEach((symbol, declaration) {
+      if (!includePrivate && declaration.isPrivate) return;
+      output.add(_getShortSymbolName(symbol, declaration));
+    });
+  }
 
-  static _decodeKey(Map map, String key) {
-    // The key is a regular old String.
-    if (key.startsWith(':')) return key.substring(1);
+  static LibraryMirror getLibraryMirror(String url) =>
+      currentMirrorSystem().libraries[Uri.parse(url)];
 
-    var match = _NON_STRING_KEY_REGEXP.firstMatch(key);
-    if (match != null) {
-      int index = int.parse(match.group(1));
-      var iter = map.keys.skip(index);
-      if (iter.isNotEmpty) {
-        var ret = iter.first;
-        // Validate that the toString representation of the key matches what we
-        // expect. FIXME: throw an error if it does not.
-        assert(match.group(2) == '$ret');
-        return ret;
+  /**
+   * Get code completions for [o] only showing privates from [libraryUrl].
+   */
+  static List<String> getObjectCompletions(o, String libraryUrl) {
+    var classMirror;
+    bool staticContext;
+    if (o is Type) {
+      classMirror = reflectClass(o);
+      staticContext = true;
+    } else {
+      classMirror = reflect(o).type;
+      staticContext = false;
+    }
+    var names = new Set<String>();
+    getClassCompletions(classMirror, names, staticContext, libraryUrl);
+    return names.toList()..sort();
+  }
+
+  static void getClassCompletions(ClassMirror classMirror, Set<String> names,
+      bool staticContext, String libraryUrl) {
+    LibraryMirror libraryMirror = getLibraryMirror(libraryUrl);
+    _getCompletionsHelper(classMirror, staticContext, libraryMirror, names);
+  }
+
+  static List<String> getLibraryCompletions(String url) {
+    var names = new Set<String>();
+    _getLibraryCompletionsHelper(getLibraryMirror(url), true, names);
+    return names.toList();
+  }
+
+  /**
+   * Get valid code completitions from within a library and all libraries
+   * imported by that library.
+   */
+  static List<String> getLibraryCompletionsIncludingImports(String url) {
+    var names = new Set<String>();
+    var libraryMirror = getLibraryMirror(url);
+    _getLibraryCompletionsHelper(libraryMirror, true, names);
+    for (var dependency in libraryMirror.libraryDependencies) {
+      if (dependency.isImport) {
+        if (dependency.prefix == null) {
+          _getLibraryCompletionsHelper(dependency.targetLibrary, false, names);
+        } else {
+          names.add(MirrorSystem.getName(dependency.prefix));
+        }
       }
     }
+    return names.toList();
+  }
+
+  static final SIDE_EFFECT_FREE_LIBRARIES = new Set<String>()
+      ..add('dart:html')
+      ..add('dart:indexed_db')
+      ..add('dart:svg')
+      ..add('dart:typed_data')
+      ..add('dart:web_audio')
+      ..add('dart:web_gl')
+      ..add('dart:web_sql');
+
+  static LibraryMirror _getLibrary(MethodMirror methodMirror) {
+    var owner = methodMirror.owner;
+    if (owner is ClassMirror) {
+      return owner;
+    } else if (owner is LibraryMirror) {
+      return owner;
+    }
     return null;
   }
 
   /**
-   * Converts keys encoded with [getEncodedMapKeyList] to their actual keys.
+   * For parity with the JavaScript debugger, we treat some getters as if
+   * they are fields so that users can see their values immediately.
+   * This matches JavaScript's behavior for getters on DOM objects.
+   * In the future we should consider adding an annotation to tag getters
+   * in user libraries as side effect free.
    */
-  static lookupValueForEncodedMapKey(Map obj, String key) => obj[_decodeKey(obj, key)];
-
+  static bool _isSideEffectFreeGetter(MethodMirror methodMirror,
+      LibraryMirror libraryMirror) {
+    // This matches JavaScript behavior. We should consider displaying
+    // getters for all dart platform libraries rather than just the DOM
+    // libraries.
+    return libraryMirror.uri.scheme == 'dart' &&
+        SIDE_EFFECT_FREE_LIBRARIES.contains(libraryMirror.uri.toString());
+  }
+  
   /**
-   * Builds a constructor name with the form expected by the C Dart mirrors API.
+   * Whether we should treat a property as a field for the purposes of the
+   * debugger.
    */
-  static String buildConstructorName(String className, String constructorName) => '$className.$constructorName';
+  static bool treatPropertyAsField(MethodMirror methodMirror,
+      LibraryMirror libraryMirror) {
+    return (methodMirror.isGetter || methodMirror.isSetter) &&
+          (methodMirror.isSynthetic ||
+              _isSideEffectFreeGetter(methodMirror,libraryMirror));
+  }
 
-  /**
-   * Strips the class name from an expression of the form "className.someName".
-   */
-  static String stripClassName(String str, String className) {
-    if (str.length > className.length + 1 &&
-        str.startsWith(className) && str[className.length] == '.') {
-      return str.substring(className.length + 1);
-    } else {
-      return str;
+  // TODO(jacobr): generate more concise function descriptions instead of
+  // dumping the entire function source.
+  static String describeFunction(function) {
+    if (function is _Trampoline) return function._methodMirror.source;
+    try {
+      var mirror = reflect(function);
+      return mirror.function.source;
+    } catch (e) {
+      return function.toString();
+    }
+  }
+
+  static List getInvocationTrampolineDetails(_Trampoline method) {
+    var loc = method._methodMirror.location;
+    return [loc.line, loc.column, loc.sourceUri.toString(),
+        MirrorSystem.getName(method._selector)];
+  }
+
+  static List getLibraryProperties(String libraryUrl, bool ownProperties,
+      bool accessorPropertiesOnly) {
+    var properties = new Map<String, _Property>();
+    var libraryMirror = getLibraryMirror(libraryUrl);
+    _addInstanceMirrors(libraryMirror, libraryMirror,
+        libraryMirror.declarations,
+        ownProperties, accessorPropertiesOnly, false, false,
+        properties);
+    if (!accessorPropertiesOnly) {
+      // We need to add class properties for all classes in the library.
+      libraryMirror.declarations.forEach((symbol, declarationMirror) {
+        if (declarationMirror is ClassMirror) {
+          var name = MirrorSystem.getName(symbol);
+          if (declarationMirror.hasReflectedType
+              && !properties.containsKey(name)) {
+            properties[name] = new _Property(name)
+                ..value = declarationMirror.reflectedType;
+          }
+        }
+      });
+    }
+    return packageProperties(properties);
+  }
+
+  static List getObjectProperties(o, bool ownProperties,
+      bool accessorPropertiesOnly) {
+    var properties = new Map<String, _Property>();
+    var names = new Set<String>();
+    var objectMirror = reflect(o);
+    var classMirror = objectMirror.type;
+    _addInstanceMirrors(objectMirror, classMirror.owner,
+        classMirror.instanceMembers,
+        ownProperties, accessorPropertiesOnly, false, true,
+        properties);
+    return packageProperties(properties);
+  }
+
+  static List getObjectClassProperties(o, bool ownProperties,
+      bool accessorPropertiesOnly) {
+    var properties = new Map<String, _Property>();
+    var objectMirror = reflect(o);
+    var classMirror = objectMirror.type;
+    _addInstanceMirrors(objectMirror, classMirror.owner,
+        classMirror.instanceMembers,
+        ownProperties, accessorPropertiesOnly, true, false,
+        properties);
+    _addStatics(classMirror, properties, accessorPropertiesOnly);
+    return packageProperties(properties);
+  }
+
+  static List getClassProperties(Type t, bool ownProperties,
+      bool accessorPropertiesOnly) {
+    var properties = new Map<String, _Property>();
+    var classMirror = reflectClass(t);
+    _addStatics(classMirror, properties, accessorPropertiesOnly);
+    return packageProperties(properties);
+  }
+
+  static void _addStatics(ClassMirror classMirror,
+                          Map<String, _Property> properties,
+                          bool accessorPropertiesOnly) {
+    var libraryMirror = classMirror.owner;
+    classMirror.declarations.forEach((symbol, declaration) {
+      var name = _getShortSymbolName(symbol, declaration);
+      if (name.isEmpty) return;
+      if (declaration is VariableMirror) {
+        if (accessorPropertiesOnly) return;
+        if (!declaration.isStatic) return;
+        properties.putIfAbsent(name, () => new _Property(name))
+            ..value = classMirror.getField(symbol).reflectee
+            ..writable = !declaration.isFinal && !declaration.isConst;
+      } else if (declaration is MethodMirror) {
+        MethodMirror methodMirror = declaration;
+        // FIXMEDART: should we display constructors?
+        if (methodMirror.isConstructor) return;
+        if (!methodMirror.isStatic) return;
+        if (accessorPropertiesOnly) {
+          if (methodMirror.isRegularMethod ||
+              treatPropertyAsField(methodMirror, libraryMirror)) {
+            return;
+          }
+        } else if (!methodMirror.isRegularMethod &&
+            !treatPropertyAsField(methodMirror, libraryMirror)) {
+          return;
+        }
+        var property = properties.putIfAbsent(name, () => new _Property(name));
+        _fillMethodMirrorProperty(libraryMirror, classMirror, methodMirror,
+            symbol, accessorPropertiesOnly, property);
+      }
+    });
+  }
+
+  static void _fillMethodMirrorProperty(LibraryMirror libraryMirror,
+        methodOwner, MethodMirror methodMirror, Symbol symbol,
+        bool accessorPropertiesOnly, _Property property) {
+    if (methodMirror.isRegularMethod) {
+      property
+          ..value = new _MethodTrampoline(methodOwner, methodMirror, symbol)
+          ..isMethod = true;
+    } else if (methodMirror.isGetter) {
+      if (treatPropertyAsField(methodMirror, libraryMirror)) {
+        try {
+          property.value = methodOwner.getField(symbol).reflectee;
+        } catch (e) {
+          property
+              ..wasThrown = true
+              ..value = e;
+        }
+      } else if (accessorPropertiesOnly) {
+        property.getter = new _GetterTrampoline(methodOwner,
+            methodMirror, symbol);
+      }
+    } else if (methodMirror.isSetter) {
+      if (accessorPropertiesOnly &&
+          !treatPropertyAsField(methodMirror, libraryMirror)) {
+        property.setter = new _SetterTrampoline(methodOwner,
+            methodMirror, MirrorSystem.getSymbol(property.name, libraryMirror));
+      }
+      property.writable = true;
     }
   }
 
   /**
-   * Removes the trailing dot from an expression ending in a dot.
-   * This method is used as Library prefixes include a trailing dot when using
-   * the C Dart debugger API.
+   * Helper method that handles collecting up properties from classes
+   * or libraries using the filters [ownProperties], [accessorPropertiesOnly],
+   * [hideFields], and [hideMethods] to determine which properties are
+   * collected. [accessorPropertiesOnly] specifies whether all properties
+   * should be returned or just accessors. [hideFields] specifies whether
+   * fields should be hidden. hideMethods specifies whether methods should be
+   * shown or hidden. [ownProperties] is not currently used but is part of the
+   * Blink devtools API for enumerating properties.
    */
-  static String stripTrailingDot(String str) =>
-    (str != null && str[str.length - 1] == '.') ? str.substring(0, str.length - 1) : str;
-
-  static String addTrailingDot(String str) => '${str}.';
-
-  static String demangle(String str) {
-    var atPos = str.indexOf('@');
-    return atPos == -1 ? str : str.substring(0, atPos);
+  static void _addInstanceMirrors(
+      ObjectMirror objectMirror,
+      LibraryMirror libraryMirror,
+      Map<Symbol, Mirror> declarations,
+      bool ownProperties, bool accessorPropertiesOnly,
+      bool hideFields, bool hideMethods,
+      Map<String, _Property> properties) {
+    declarations.forEach((symbol, declaration) {
+      if (declaration is TypedefMirror || declaration is ClassMirror) return;
+      var name = _getShortSymbolName(symbol, declaration);
+      if (name.isEmpty) return;
+      bool isField = declaration is VariableMirror ||
+          (declaration is MethodMirror &&
+              treatPropertyAsField(declaration, libraryMirror));
+      if ((isField && hideFields) || (hideMethods && !isField)) return;
+      if (accessorPropertiesOnly) {
+        if (declaration is VariableMirror || declaration.isRegularMethod ||
+            isField) {
+          return;
+        }
+      } else if (declaration is MethodMirror &&
+          (declaration.isGetter || declaration.isSetter) &&
+          !treatPropertyAsField(declaration, libraryMirror)) {
+        return;
+      }
+      var property = properties.putIfAbsent(name, () => new _Property(name));
+      if (declaration is VariableMirror) {
+        property
+            ..value = objectMirror.getField(symbol).reflectee
+            ..writable = !declaration.isFinal && !declaration.isConst;
+        return;
+      }
+      _fillMethodMirrorProperty(libraryMirror, objectMirror, declaration,
+          symbol, accessorPropertiesOnly, property);
+    });
   }
 
+  /**
+   * Flatten down the properties data structure into a List that is easy to
+   * access from native code.
+   */
+  static List packageProperties(Map<String, _Property> properties) {
+    var ret = [];
+    for (var property in properties.values) {
+      ret.addAll([property.name,
+                  property.setter,
+                  property.getter,
+                  property.value,
+                  property.hasValue,
+                  property.writable,
+                  property.isMethod,
+                  property.isOwn,
+                  property.wasThrown]);
+    }
+    return ret;
+  }
+  
+  /**
+   * Get a property, returning null if the property does not exist.
+   * For private property names, we attempt to resolve the property in the
+   * context of each library that the property name could be associated with.
+   */
+  static getObjectPropertySafe(o, String propertyName) {
+    var objectMirror = reflect(o);
+    var classMirror = objectMirror.type;
+    if (propertyName.startsWith("_")) {
+      var attemptedLibraries = new Set<LibraryMirror>(); 
+      while (classMirror != null) {
+        LibraryMirror library = classMirror.owner;
+        if (!attemptedLibraries.contains(library)) {
+          try {
+            return objectMirror.getField(
+                MirrorSystem.getSymbol(propertyName, library)).reflectee;
+          } catch (e) { }
+          attemptedLibraries.add(library);
+        }
+        classMirror = classMirror.superclass;
+      }
+      return null;     
+    }
+    try {
+      return objectMirror.getField(
+          MirrorSystem.getSymbol(propertyName)).reflectee;
+    } catch (e) {
+      return null;
+    }
+  }
+
+  /**
+   * Helper to wrap the inspect method on InjectedScriptHost to provide the
+   * inspect method required for the 
+   */
+  static List consoleApi(host) {
+    return [
+        "inspect",
+        (o) {
+          host.inspect(o, null);
+          return o;
+        },
+        "dir",
+        window().console.dir,
+        "dirxml",
+        window().console.dirxml
+        // FIXME: add copy method.
+        ];
+  }
+
+  static List getMapKeyList(Map map) => map.keys.toList();
+
   static bool isNoSuchMethodError(obj) => obj is NoSuchMethodError;
 
   static void register(Document document, String tag, Type type,
@@ -411,13 +795,16 @@
   }
 
   static void _register(Document document, String tag, Type customType,
-      String extendsTagName) native "Utils_register";
+    String extendsTagName) => _blink.Blink_Utils.register(document, tag, customType, extendsTagName);
 
-  static Element createElement(Document document, String tagName) native "Utils_createElement";
+  static Element createElement(Document document, String tagName) =>
+    _blink.Blink_Utils.createElement(document, tagName);
 
-  static void initializeCustomElement(HtmlElement element) native "Utils_initializeCustomElement";
+  static void initializeCustomElement(HtmlElement element) =>
+    _blink.Blink_Utils.initializeCustomElement(element);
 
-  static Element changeElementWrapper(HtmlElement element, Type type) native "Utils_changeElementWrapper";
+  static Element changeElementWrapper(HtmlElement element, Type type) =>
+    _blink.Blink_Utils.changeElementWrapper(element, type);
 }
 
 class _DOMWindowCrossFrame extends NativeFieldWrapperClass2 implements
@@ -425,17 +812,17 @@
   _DOMWindowCrossFrame.internal();
 
   // Fields.
-  HistoryBase get history native "Window_history_cross_frame_Getter";
-  LocationBase get location native "Window_location_cross_frame_Getter";
-  bool get closed native "Window_closed_Getter";
-  int get length native "Window_length_Getter";
-  WindowBase get opener native "Window_opener_Getter";
-  WindowBase get parent native "Window_parent_Getter";
-  WindowBase get top native "Window_top_Getter";
+  HistoryBase get history => _blink.Blink_DOMWindowCrossFrame.get_history(this);
+  LocationBase get location => _blink.Blink_DOMWindowCrossFrame.get_location(this);
+  bool get closed => _blink.Blink_DOMWindowCrossFrame.get_closed(this);
+  WindowBase get opener => _blink.Blink_DOMWindowCrossFrame.get_opener(this);
+  WindowBase get parent => _blink.Blink_DOMWindowCrossFrame.get_parent(this);
+  WindowBase get top => _blink.Blink_DOMWindowCrossFrame.get_top(this);
 
   // Methods.
-  void close() native "Window_close_Callback";
-  void postMessage(/*SerializedScriptValue*/ message, String targetOrigin, [List messagePorts]) native "Window_postMessage_Callback";
+  void close() => _blink.Blink_DOMWindowCrossFrame.close(this);
+  void postMessage(/*SerializedScriptValue*/ message, String targetOrigin, [List messagePorts]) =>
+    _blink.Blink_DOMWindowCrossFrame.postMessage(this, message, targetOrigin, messagePorts);
 
   // Implementation support.
   String get typeName => "Window";
@@ -444,6 +831,10 @@
   Events get on => throw new UnsupportedError(
     'You can only attach EventListeners to your own window.');
   // TODO(efortuna): Remove this method. dartbug.com/16814
+  void _addEventListener([String type, EventListener listener, bool useCapture])
+      => throw new UnsupportedError(
+    'You can only attach EventListeners to your own window.');
+  // TODO(efortuna): Remove this method. dartbug.com/16814
   void addEventListener(String type, EventListener listener, [bool useCapture])
       => throw new UnsupportedError(
     'You can only attach EventListeners to your own window.');
@@ -451,6 +842,10 @@
   bool dispatchEvent(Event event) => throw new UnsupportedError(
     'You can only attach EventListeners to your own window.');
   // TODO(efortuna): Remove this method. dartbug.com/16814
+  void _removeEventListener([String type, EventListener listener,
+      bool useCapture]) => throw new UnsupportedError(
+    'You can only attach EventListeners to your own window.');
+  // TODO(efortuna): Remove this method. dartbug.com/16814
   void removeEventListener(String type, EventListener listener,
       [bool useCapture]) => throw new UnsupportedError(
     'You can only attach EventListeners to your own window.');
@@ -460,9 +855,9 @@
   _HistoryCrossFrame.internal();
 
   // Methods.
-  void back() native "History_back_Callback";
-  void forward() native "History_forward_Callback";
-  void go(int distance) native "History_go_Callback";
+  void back() => _blink.Blink_HistoryCrossFrame.back(this);
+  void forward() => _blink.Blink_HistoryCrossFrame.forward(this);
+  void go(int distance) => _blink.Blink_HistoryCrossFrame.go(this, distance);
 
   // Implementation support.
   String get typeName => "History";
@@ -472,7 +867,7 @@
   _LocationCrossFrame.internal();
 
   // Fields.
-  void set href(String) native "Location_href_Setter";
+  void set href(String h) => _blink.Blink_LocationCrossFrame.set_href(this, h);
 
   // Implementation support.
   String get typeName => "Location";
@@ -482,14 +877,14 @@
   _DOMStringMap.internal();
 
   bool containsValue(String value) => Maps.containsValue(this, value);
-  bool containsKey(String key) native "DOMStringMap_containsKey_Callback";
-  String operator [](String key) native "DOMStringMap_item_Callback";
-  void operator []=(String key, String value) native "DOMStringMap_setItem_Callback";
+  bool containsKey(String key) => _blink.Blink_DOMStringMap.containsKey(this, key);
+  String operator [](String key) => _blink.Blink_DOMStringMap.item(this, key);
+  void operator []=(String key, String value) => _blink.Blink_DOMStringMap.setItem(this, key, value);
   String putIfAbsent(String key, String ifAbsent()) => Maps.putIfAbsent(this, key, ifAbsent);
-  String remove(String key) native "DOMStringMap_remove_Callback";
+  String remove(String key) => _blink.Blink_DOMStringMap.remove(this, key);
   void clear() => Maps.clear(this);
   void forEach(void f(String key, String value)) => Maps.forEach(this, f);
-  Iterable<String> get keys native "DOMStringMap_getKeys_Callback";
+  Iterable<String> get keys => _blink.Blink_DOMStringMap.get_keys(this);
   Iterable<String> get values => Maps.getValues(this);
   int get length => Maps.length(this);
   bool get isEmpty => Maps.isEmpty(this);
@@ -603,3 +998,7 @@
 void _initializeCustomElement(Element e) {
   _Utils.initializeCustomElement(e);
 }
+
+// Class for unsupported native browser 'DOM' objects.
+class _UnsupportedBrowserObject extends NativeFieldWrapperClass2 {
+}
diff --git a/tools/dom/templates/html/dartium/_blink_dartium.darttemplate b/tools/dom/templates/html/dartium/_blink_dartium.darttemplate
deleted file mode 100644
index eb09773..0000000
--- a/tools/dom/templates/html/dartium/_blink_dartium.darttemplate
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// DO NOT EDIT
-// Auto-generated dart:_blink library.
-
-/**
- * This library provides entry points to the native Blink code which backs
- * up the dart:html library.
- */
-library dart.dom._blink;
-
-part '$AUXILIARY_DIR/blink_native_DOMImplementation.dart';
-
-$!GENERATED_DART_FILES
-
diff --git a/tools/dom/templates/html/dartium/html_dartium.darttemplate b/tools/dom/templates/html/dartium/html_dartium.darttemplate
index e368fe1..348057d 100644
--- a/tools/dom/templates/html/dartium/html_dartium.darttemplate
+++ b/tools/dom/templates/html/dartium/html_dartium.darttemplate
@@ -89,7 +89,7 @@
 part '$AUXILIARY_DIR/dartium_WrappedEvent.dart';
 part '$AUXILIARY_DIR/shared_html.dart';
 
-part '$AUXILIARY_DIR/html_native_DOMImplementation.dart';
+part '$AUXILIARY_DIR/native_DOMImplementation.dart';
 
 Window _window;
 
diff --git a/tools/dom/templates/html/impl/impl_AbstractWorker.darttemplate b/tools/dom/templates/html/impl/impl_AbstractWorker.darttemplate
index d019184..8bb0f41 100644
--- a/tools/dom/templates/html/impl/impl_AbstractWorker.darttemplate
+++ b/tools/dom/templates/html/impl/impl_AbstractWorker.darttemplate
@@ -5,5 +5,5 @@
 part of $LIBRARYNAME;
 
 @DocsEditable()
-$(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)abstract class $CLASSNAME$EXTENDS$MIXINS implements EventTarget {
+$(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$MIXINS implements EventTarget {
 $!MEMBERS}
diff --git a/tools/dom/templates/html/impl/impl_WheelEvent.darttemplate b/tools/dom/templates/html/impl/impl_WheelEvent.darttemplate
index a78dca8..307d6b3 100644
--- a/tools/dom/templates/html/impl/impl_WheelEvent.darttemplate
+++ b/tools/dom/templates/html/impl/impl_WheelEvent.darttemplate
@@ -95,7 +95,7 @@
       'metaKey': metaKey,
       'relatedTarget': relatedTarget,
     };
-    return _blink.BlinkWheelEvent.constructorCallback(type, options);
+    return _blink.BlinkWheelEvent.constructorCallback_2(type, options);
 $endif
   }
 
diff --git a/tools/testing/dart/status_expression.dart b/tools/testing/dart/status_expression.dart
index 96396ea..5cd0a34 100644
--- a/tools/testing/dart/status_expression.dart
+++ b/tools/testing/dart/status_expression.dart
@@ -298,8 +298,8 @@
       return value;
     }
 
-    // The only atomic booleans are of the form $variable == value or the
-    // form $variable.
+    // The only atomic booleans are of the form $variable == value or
+    // of the form $variable.
     if (scanner.current != Token.DOLLAR_SYMBOL) {
       throw new FormatException(
           "Expected \$ in expression, got ${scanner.current}");
@@ -317,7 +317,7 @@
       scanner.advance();
       if (!new RegExp(r"^\w+$").hasMatch(scanner.current)) {
         throw new FormatException(
-            "Expected identifier in expression, got ${scanner.current}");
+            "Expected value in expression, got ${scanner.current}");
       }
       TermConstant right = new TermConstant(scanner.current);
       scanner.advance();
